From 98711f498046941c7bc824e45ef4f3b76a038ed1 Mon Sep 17 00:00:00 2001 From: Mu Daosheng Date: Tue, 6 May 2014 19:51:52 +0800 Subject: [PATCH] support tga format texture --- build/three.js | 473 ++++++++++++++++++++++++++++- build/three.min.js | 421 ++++++++++++------------- examples/textures/crate_color8.tga | Bin 0 -> 66348 bytes examples/textures/crate_grey8.tga | Bin 0 -> 65580 bytes src/extras/ImageUtils.js | 448 +++++++++++++++++++++++++++ src/renderers/WebGLRenderer.js | 6 +- src/textures/TGATexture.js | 19 ++ utils/build/includes/common.json | 1 + utils/build/includes/webgl.json | 1 + 9 files changed, 1160 insertions(+), 209 deletions(-) create mode 100644 examples/textures/crate_color8.tga create mode 100644 examples/textures/crate_grey8.tga create mode 100644 src/textures/TGATexture.js diff --git a/build/three.js b/build/three.js index 44516f12d0..1a2addeea1 100644 --- a/build/three.js +++ b/build/three.js @@ -14275,6 +14275,25 @@ THREE.CompressedTexture.prototype.clone = function () { }; +/** + * @author Daosheng Mu / https://github.com/DaoshengMu/ + */ + +THREE.TGATexture = function ( format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy ) { + + THREE.Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); +}; + +THREE.TGATexture.prototype = Object.create( THREE.Texture.prototype ); + +THREE.TGATexture.prototype.clone = function() { + + var texture = new THREE.TGATexture(); + + THREE.Texture.prototype.clone.all( this. texture ); + + return texture; +}; /** * @author alteredq / http://alteredqualia.com/ */ @@ -25157,7 +25176,11 @@ THREE.WebGLRenderer = function ( parameters ) { } - } else { // regular Texture (image, video, canvas) + } else if ( texture instanceof THREE.TGATexture ) { + var tgaImg = texture.image; + _gl.texImage2D( _gl.TEXTURE_2D, 0, glFormat, tgaImg.width, tgaImg.height, 0, glFormat, glType, tgaImg.data ); + + } else { // regular Texture (image, video, canvas) // use manually created mipmaps if available // if there are no manual mipmaps @@ -26660,6 +26683,7 @@ THREE.GeometryUtils = { /** * @author alteredq / http://alteredqualia.com/ * @author mrdoob / http://mrdoob.com/ + * @author Daosheng Mu / https://github.com/DaoshengMu/ */ THREE.ImageUtils = { @@ -26889,6 +26913,453 @@ THREE.ImageUtils = { return texture; }, + + + // reference from vthibault, https://github.com/vthibault/roBrowser/blob/master/src/Loaders/Targa.js + decodeTGA: function ( arrayBuffer ) { + + // TGA Constants + var TGA_TYPE_NO_DATA = 0, + TGA_TYPE_INDEXED = 1, + TGA_TYPE_RGB = 2, + TGA_TYPE_GREY = 3, + TGA_TYPE_RLE_INDEXED = 9, + TGA_TYPE_RLE_RGB = 10, + TGA_TYPE_RLE_GREY = 11, + + TGA_ORIGIN_MASK = 0x30, + TGA_ORIGIN_SHIFT = 0x04, + TGA_ORIGIN_BL = 0x00, + TGA_ORIGIN_BR = 0x01, + TGA_ORIGIN_UL = 0x02, + TGA_ORIGIN_UR = 0x03; + + + if ( arrayBuffer.length < 19 ) + console.error( 'ImageUtils::decodeTGA()- Not enough data to contain header.' ); + + var content = new Uint8Array( arrayBuffer ), + offset = 0, + header = { + id_length: content[ offset++ ], + colormap_type: content[ offset++ ], + image_type: content[offset++], + colormap_index: content[offset++] | content[offset++] << 8, + colormap_length: content[offset++] | content[offset++] << 8, + colormap_size: content[offset++], + + origin: [ + content[offset++] | content[offset++] << 8, + content[offset++] | content[offset++] << 8 + ], + width: content[offset++] | content[offset++] << 8, + height: content[offset++] | content[offset++] << 8, + pixel_size: content[offset++], + flags: content[offset++] + }; + + function tgaCheckHeader( header ) { + switch( header.image_type ) { + // Check indexed type + case TGA_TYPE_INDEXED: + case TGA_TYPE_RLE_INDEXED: + if ( header.colormap_length > 256 || header.colormap_size !== 24 || header.colormap_type !== 1) { + console.error('Targa::tgaCheckHeader() - Invalid type colormap data for indexed type'); + } + break; + + // Check colormap type + case TGA_TYPE_RGB: + case TGA_TYPE_GREY: + case TGA_TYPE_RLE_RGB: + case TGA_TYPE_RLE_GREY: + if (header.colormap_type) { + console.error('ImageUtils::tgaCheckHeader() - Invalid type colormap data for colormap type'); + } + break; + + // What the need of a file without data ? + case TGA_TYPE_NO_DATA: + console.error('ImageUtils::tgaCheckHeader() - No data'); + + // Invalid type ? + default: + console.error('ImageUtils::tgaCheckHeader() - Invalid type " '+ header.image_type + '"'); + } + + // Check image width and height + if ( header.width <= 0 || header.height <=0 ) { + console.error( 'ImageUtils::tgaCheckHeader() - Invalid image size' ); + } + + // Check image pixel size + if (header.pixel_size !== 8 && + header.pixel_size !== 16 && + header.pixel_size !== 24 && + header.pixel_size !== 32) { + console.error('ImageUtils::tgaCheckHeader() - Invalid pixel size "' + header.pixel_size + '"'); + } + } + + // Check tga if it is valid format + tgaCheckHeader( header ); + + if ( header.id_length + offset > arrayBuffer.length ) { + console.error('ImageUtils::load() - No data'); + } + + // Skip the needn't data + offset += header.id_length; + + // Get targa information about RLE compression and palette + var use_rle = false, + use_pal = false, + use_grey = false; + + switch ( header.image_type ) { + case TGA_TYPE_RLE_INDEXED: + use_rle = true; + use_pal = true; + break; + + case TGA_TYPE_INDEXED: + use_pal = true; + break; + + case TGA_TYPE_RLE_RGB: + use_rle = true; + break; + + case TGA_TYPE_RGB: + break; + + case TGA_TYPE_RLE_GREY: + use_rle = true; + use_grey = true; + break; + + case TGA_TYPE_GREY: + use_grey = true; + break; + } + + // Parse tga image buffer + function tgaParse( use_rle, use_pal, header, offset, data ) { + + var pixel_data, + pixel_size, + pixel_total, + palettes; + + pixel_size = header.pixel_size >> 3; + pixel_total = header.width * header.height * pixel_size; + + // Read palettes + if ( use_pal ) { + palettes = data.subarray( offset, offset += header.colormap_length * 3 ); + } + + // Read RLE + if ( use_rle ) { + pixel_data = new Uint8Array(pixel_total); + + var c, count, i; + var shift = 0; + var pixels = new Uint8Array(pixel_size); + + while (shift < pixel_total) { + c = data[offset++]; + count = (c & 0x7f) + 1; + + // RLE pixels. + if (c & 0x80) { + // Bind pixel tmp array + for (i = 0; i < pixel_size; ++i) { + pixels[i] = data[offset++]; + } + + // Copy pixel array + for (i = 0; i < count; ++i) { + pixel_data.set(pixels, shift + i * pixel_size); + } + + shift += pixel_size * count; + } + + // Raw pixels. + else { + count *= pixel_size; + for (i = 0; i < count; ++i) { + pixel_data[shift + i] = data[offset++]; + } + shift += count; + } + } + } + // RAW Pixels + else { + pixel_data = data.subarray( + offset, offset += (use_pal ? header.width * header.height : pixel_total) + ); + } + + return { + pixel_data: pixel_data, + palettes: palettes + }; + } + + function tgaGetImageData8bits(imageData, y_start, y_step, y_end, x_start, x_step, x_end + , image, palettes ) { + var colormap = palettes; + var color, i = 0, x, y; + var width = header.width; + + for (y = y_start; y !== y_end; y += y_step) { + for (x = x_start; x !== x_end; x += x_step, i++) { + color = image[i]; + imageData[(x + width * y) * 4 + 3] = 255; + imageData[(x + width * y) * 4 + 2] = colormap[(color * 3) + 0]; + imageData[(x + width * y) * 4 + 1] = colormap[(color * 3) + 1]; + imageData[(x + width * y) * 4 + 0] = colormap[(color * 3) + 2]; + } + } + + return imageData; + }; + + function tgaGetImageData16bits(imageData, y_start, y_step, y_end, x_start, x_step, x_end + , image) { + var color, i = 0, x, y; + var width = header.width; + + for (y = y_start; y !== y_end; y += y_step) { + for (x = x_start; x !== x_end; x += x_step, i += 2) { + color = image[i + 0] + (image[i + 1] << 8); // Inversed ? + imageData[(x + width * y) * 4 + 0] = (color & 0x7C00) >> 7; + imageData[(x + width * y) * 4 + 1] = (color & 0x03E0) >> 2; + imageData[(x + width * y) * 4 + 2] = (color & 0x001F) >> 3; + imageData[(x + width * y) * 4 + 3] = (color & 0x8000) ? 0 : 255; + } + } + + return imageData; + }; + + function tgaGetImageData24bits(imageData, y_start, y_step, y_end, x_start, x_step, x_end, image) { + var i = 0, x, y; + var width = header.width; + + for (y = y_start; y !== y_end; y += y_step) { + for (x = x_start; x !== x_end; x += x_step, i += 3) { + imageData[(x + width * y) * 4 + 3] = 255; + imageData[(x + width * y) * 4 + 2] = image[i + 0]; + imageData[(x + width * y) * 4 + 1] = image[i + 1]; + imageData[(x + width * y) * 4 + 0] = image[i + 2]; + } + } + + return imageData; + }; + + function tgaGetImageData32bits(imageData, y_start, y_step, y_end, x_start, x_step, x_end, image) { + var i = 0, x, y; + var width = header.width; + + for (y = y_start; y !== y_end; y += y_step) { + for (x = x_start; x !== x_end; x += x_step, i += 4) { + imageData[(x + width * y) * 4 + 2] = image[i + 0]; + imageData[(x + width * y) * 4 + 1] = image[i + 1]; + imageData[(x + width * y) * 4 + 0] = image[i + 2]; + imageData[(x + width * y) * 4 + 3] = image[i + 3]; + } + } + + return imageData; + }; + + function tgaGetImageDataGrey8bits( imageData, y_start, y_step, y_end, x_start, x_step, x_end, image ) { + var color, i = 0, x, y; + var width = header.width; + + for (y = y_start; y !== y_end; y += y_step) { + for (x = x_start; x !== x_end; x += x_step, i++) { + color = image[i]; + imageData[(x + width * y) * 4 + 0] = color; + imageData[(x + width * y) * 4 + 1] = color; + imageData[(x + width * y) * 4 + 2] = color; + imageData[(x + width * y) * 4 + 3] = 255; + } + } + + return imageData; + }; + + function tgaGetImageDataGrey16bits(imageData, y_start, y_step, y_end, x_start, x_step, x_end, image) { + var i = 0, x, y; + var width = header.width; + + for (y = y_start; y !== y_end; y += y_step) { + for (x = x_start; x !== x_end; x += x_step, i += 2) { + imageData[(x + width * y) * 4 + 0] = image[i + 0]; + imageData[(x + width * y) * 4 + 1] = image[i + 0]; + imageData[(x + width * y) * 4 + 2] = image[i + 0]; + imageData[(x + width * y) * 4 + 3] = image[i + 1]; + } + } + + return imageData; + }; + + function getTgaRGBA( width, height, image, palette ) { + var x_start, + y_start, + x_step, + y_step, + x_end, + y_end, + data = new Uint8Array(width * height * 4); + + switch( (header.flags & TGA_ORIGIN_MASK) >> TGA_ORIGIN_SHIFT ) { + default: + case TGA_ORIGIN_UL: + x_start = 0; + x_step = 1; + x_end = width; + y_start = 0; + y_step = 1; + y_end = height; + break; + + case TGA_ORIGIN_BL: + x_start = 0; + x_step = 1; + x_end = width; + y_start = height - 1; + y_step = -1; + y_end = -1; + break; + + case TGA_ORIGIN_UR: + x_start = width - 1; + x_step = -1; + x_end = -1; + y_start = 0; + y_step = 1; + y_end = height; + break; + + case TGA_ORIGIN_BR: + x_start = width - 1; + x_step = -1; + x_end = -1; + y_start = height - 1; + y_step = -1; + y_end = -1; + break; + } + + + if ( use_grey ) { + + switch( header.pixel_size ) + { + case 8: + tgaGetImageDataGrey8bits( data, y_start, y_step, y_end, x_start, x_step, x_end, image ); + break; + case 16: + tgaGetImageDataGrey16bits( data, y_start, y_step, y_end, x_start, x_step, x_end, image ); + break; + default: + console.error( 'ImageUtils::getTgaRGBA() - not support this format' ); + break; + } + + } + else { + + switch( header.pixel_size ) + { + case 8: + tgaGetImageData8bits( data, y_start, y_step, y_end, x_start, x_step, x_end, image, palette ); + break; + + case 16: + tgaGetImageData16bits( data, y_start, y_step, y_end, x_start, x_step, x_end, image ); + break; + + case 24: + tgaGetImageData24bits( data, y_start, y_step, y_end, x_start, x_step, x_end, image ); + break; + + case 32: + tgaGetImageData32bits( data, y_start, y_step, y_end, x_start, x_step, x_end, image ); + break; + + default: + console.error( 'ImageUtils::getTgaRGBA() - not support this format' ); + break; + } + } + // Load image data according to specific method + // var func = 'tgaGetImageData' + (use_grey ? 'Grey' : '') + (header.pixel_size) + 'bits'; + //func(data, y_start, y_step, y_end, x_start, x_step, x_end, width, image, palette ); + return data; + } + + var result = tgaParse( use_rle, use_pal, header, offset, content ); + var rgbaData = getTgaRGBA( header.width, header.height, result.pixel_data, result.palettes ); + + + return { + width: header.width, + height: header.height, + data: rgbaData + }; + }, + + loadTGATexture: function ( url, mapping, onLoad, onError ) { + + var texture = new THREE.TGATexture(); + { + var request = new XMLHttpRequest(); + + request.open( 'GET', url, true ); + request.responseType = "arraybuffer"; + request.onload = function() { + if ( this.status === 200 ) { + var imageData = THREE.ImageUtils.decodeTGA( this.response ); + + if ( imageData ) { + texture.image = imageData; + texture.sourceFile = url; + texture.needsUpdate = true; + + return texture; + } + + } + }; + + request.addEventListener( 'load', function ( event ) { + + if ( onLoad ) onLoad( texture ); + + }, false ); + + request.addEventListener( 'error', function ( event ) { + + if ( onError ) onError( event ); + + }, false ); + + request.send(null); + } + + texture.sourceFile = url; + + return texture; + }, loadDDSTexture: function ( url, mapping, onLoad, onError ) { diff --git a/build/three.min.js b/build/three.min.js index 259e746484..23cd637597 100644 --- a/build/three.min.js +++ b/build/three.min.js @@ -62,9 +62,9 @@ Math.floor(this.z);this.w=0>this.w?Math.ceil(this.w):Math.floor(this.w);return t setLength:function(a){var b=this.length();0!==b&&a!==b&&this.multiplyScalar(a/b);return this},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b;return this},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z&&a.w===this.w},fromArray:function(a){this.x=a[0];this.y=a[1];this.z=a[2];this.w=a[3];return this},toArray:function(){return[this.x,this.y,this.z,this.w]},clone:function(){return new THREE.Vector4(this.x,this.y,this.z, this.w)}};THREE.Euler=function(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._order=d||THREE.Euler.DefaultOrder};THREE.Euler.RotationOrders="XYZ YZX ZXY XZY YXZ ZYX".split(" ");THREE.Euler.DefaultOrder="XYZ"; THREE.Euler.prototype={constructor:THREE.Euler,_x:0,_y:0,_z:0,_order:THREE.Euler.DefaultOrder,get x(){return this._x},set x(a){this._x=a;this.onChangeCallback()},get y(){return this._y},set y(a){this._y=a;this.onChangeCallback()},get z(){return this._z},set z(a){this._z=a;this.onChangeCallback()},get order(){return this._order},set order(a){this._order=a;this.onChangeCallback()},set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._order=d||this._order;this.onChangeCallback();return this},copy:function(a){this._x= -a._x;this._y=a._y;this._z=a._z;this._order=a._order;this.onChangeCallback();return this},setFromRotationMatrix:function(a,b){var c=THREE.Math.clamp,d=a.elements,e=d[0],f=d[4],g=d[8],h=d[1],k=d[5],l=d[9],p=d[2],q=d[6],d=d[10];b=b||this._order;"XYZ"===b?(this._y=Math.asin(c(g,-1,1)),0.99999>Math.abs(g)?(this._x=Math.atan2(-l,d),this._z=Math.atan2(-f,e)):(this._x=Math.atan2(q,k),this._z=0)):"YXZ"===b?(this._x=Math.asin(-c(l,-1,1)),0.99999>Math.abs(l)?(this._y=Math.atan2(g,d),this._z=Math.atan2(h,k)): -(this._y=Math.atan2(-p,e),this._z=0)):"ZXY"===b?(this._x=Math.asin(c(q,-1,1)),0.99999>Math.abs(q)?(this._y=Math.atan2(-p,d),this._z=Math.atan2(-f,k)):(this._y=0,this._z=Math.atan2(h,e))):"ZYX"===b?(this._y=Math.asin(-c(p,-1,1)),0.99999>Math.abs(p)?(this._x=Math.atan2(q,d),this._z=Math.atan2(h,e)):(this._x=0,this._z=Math.atan2(-f,k))):"YZX"===b?(this._z=Math.asin(c(h,-1,1)),0.99999>Math.abs(h)?(this._x=Math.atan2(-l,k),this._y=Math.atan2(-p,e)):(this._x=0,this._y=Math.atan2(g,d))):"XZY"===b?(this._z= -Math.asin(-c(f,-1,1)),0.99999>Math.abs(f)?(this._x=Math.atan2(q,k),this._y=Math.atan2(g,e)):(this._x=Math.atan2(-l,d),this._y=0)):console.warn("WARNING: Euler.setFromRotationMatrix() given unsupported order: "+b);this._order=b;this.onChangeCallback();return this},setFromQuaternion:function(a,b,c){var d=THREE.Math.clamp,e=a.x*a.x,f=a.y*a.y,g=a.z*a.z,h=a.w*a.w;b=b||this._order;"XYZ"===b?(this._x=Math.atan2(2*(a.x*a.w-a.y*a.z),h-e-f+g),this._y=Math.asin(d(2*(a.x*a.z+a.y*a.w),-1,1)),this._z=Math.atan2(2* +a._x;this._y=a._y;this._z=a._z;this._order=a._order;this.onChangeCallback();return this},setFromRotationMatrix:function(a,b){var c=THREE.Math.clamp,d=a.elements,e=d[0],f=d[4],g=d[8],h=d[1],k=d[5],l=d[9],p=d[2],s=d[6],d=d[10];b=b||this._order;"XYZ"===b?(this._y=Math.asin(c(g,-1,1)),0.99999>Math.abs(g)?(this._x=Math.atan2(-l,d),this._z=Math.atan2(-f,e)):(this._x=Math.atan2(s,k),this._z=0)):"YXZ"===b?(this._x=Math.asin(-c(l,-1,1)),0.99999>Math.abs(l)?(this._y=Math.atan2(g,d),this._z=Math.atan2(h,k)): +(this._y=Math.atan2(-p,e),this._z=0)):"ZXY"===b?(this._x=Math.asin(c(s,-1,1)),0.99999>Math.abs(s)?(this._y=Math.atan2(-p,d),this._z=Math.atan2(-f,k)):(this._y=0,this._z=Math.atan2(h,e))):"ZYX"===b?(this._y=Math.asin(-c(p,-1,1)),0.99999>Math.abs(p)?(this._x=Math.atan2(s,d),this._z=Math.atan2(h,e)):(this._x=0,this._z=Math.atan2(-f,k))):"YZX"===b?(this._z=Math.asin(c(h,-1,1)),0.99999>Math.abs(h)?(this._x=Math.atan2(-l,k),this._y=Math.atan2(-p,e)):(this._x=0,this._y=Math.atan2(g,d))):"XZY"===b?(this._z= +Math.asin(-c(f,-1,1)),0.99999>Math.abs(f)?(this._x=Math.atan2(s,k),this._y=Math.atan2(g,e)):(this._x=Math.atan2(-l,d),this._y=0)):console.warn("WARNING: Euler.setFromRotationMatrix() given unsupported order: "+b);this._order=b;this.onChangeCallback();return this},setFromQuaternion:function(a,b,c){var d=THREE.Math.clamp,e=a.x*a.x,f=a.y*a.y,g=a.z*a.z,h=a.w*a.w;b=b||this._order;"XYZ"===b?(this._x=Math.atan2(2*(a.x*a.w-a.y*a.z),h-e-f+g),this._y=Math.asin(d(2*(a.x*a.z+a.y*a.w),-1,1)),this._z=Math.atan2(2* (a.z*a.w-a.x*a.y),h+e-f-g)):"YXZ"===b?(this._x=Math.asin(d(2*(a.x*a.w-a.y*a.z),-1,1)),this._y=Math.atan2(2*(a.x*a.z+a.y*a.w),h-e-f+g),this._z=Math.atan2(2*(a.x*a.y+a.z*a.w),h-e+f-g)):"ZXY"===b?(this._x=Math.asin(d(2*(a.x*a.w+a.y*a.z),-1,1)),this._y=Math.atan2(2*(a.y*a.w-a.z*a.x),h-e-f+g),this._z=Math.atan2(2*(a.z*a.w-a.x*a.y),h-e+f-g)):"ZYX"===b?(this._x=Math.atan2(2*(a.x*a.w+a.z*a.y),h-e-f+g),this._y=Math.asin(d(2*(a.y*a.w-a.x*a.z),-1,1)),this._z=Math.atan2(2*(a.x*a.y+a.z*a.w),h+e-f-g)):"YZX"=== b?(this._x=Math.atan2(2*(a.x*a.w-a.z*a.y),h-e+f-g),this._y=Math.atan2(2*(a.y*a.w-a.x*a.z),h+e-f-g),this._z=Math.asin(d(2*(a.x*a.y+a.z*a.w),-1,1))):"XZY"===b?(this._x=Math.atan2(2*(a.x*a.w+a.y*a.z),h-e+f-g),this._y=Math.atan2(2*(a.x*a.z+a.y*a.w),h+e-f-g),this._z=Math.asin(d(2*(a.z*a.w-a.x*a.y),-1,1))):console.warn("WARNING: Euler.setFromQuaternion() given unsupported order: "+b);this._order=b;if(!1!==c)this.onChangeCallback();return this},reorder:function(){var a=new THREE.Quaternion;return function(b){a.setFromEuler(this); this.setFromQuaternion(a,b)}}(),equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._order===this._order},fromArray:function(a){this._x=a[0];this._y=a[1];this._z=a[2];void 0!==a[3]&&(this._order=a[3]);this.onChangeCallback();return this},toArray:function(){return[this._x,this._y,this._z,this._order]},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){},clone:function(){return new THREE.Euler(this._x,this._y,this._z,this._order)}};THREE.Line3=function(a,b){this.start=void 0!==a?a:new THREE.Vector3;this.end=void 0!==b?b:new THREE.Vector3}; @@ -89,22 +89,22 @@ multiplyVector3Array:function(a){console.warn("DEPRECATED: Matrix3's .multiplyVe a;b[6]*=a;b[1]*=a;b[4]*=a;b[7]*=a;b[2]*=a;b[5]*=a;b[8]*=a;return this},determinant:function(){var a=this.elements,b=a[0],c=a[1],d=a[2],e=a[3],f=a[4],g=a[5],h=a[6],k=a[7],a=a[8];return b*f*a-b*g*k-c*e*a+c*g*h+d*e*k-d*f*h},getInverse:function(a,b){var c=a.elements,d=this.elements;d[0]=c[10]*c[5]-c[6]*c[9];d[1]=-c[10]*c[1]+c[2]*c[9];d[2]=c[6]*c[1]-c[2]*c[5];d[3]=-c[10]*c[4]+c[6]*c[8];d[4]=c[10]*c[0]-c[2]*c[8];d[5]=-c[6]*c[0]+c[2]*c[4];d[6]=c[9]*c[4]-c[5]*c[8];d[7]=-c[9]*c[0]+c[1]*c[8];d[8]=c[5]*c[0]- c[1]*c[4];c=c[0]*d[0]+c[1]*d[3]+c[2]*d[6];if(0===c){if(b)throw Error("Matrix3.getInverse(): can't invert matrix, determinant is 0");console.warn("Matrix3.getInverse(): can't invert matrix, determinant is 0");this.identity();return this}this.multiplyScalar(1/c);return this},transpose:function(){var a,b=this.elements;a=b[1];b[1]=b[3];b[3]=a;a=b[2];b[2]=b[6];b[6]=a;a=b[5];b[5]=b[7];b[7]=a;return this},flattenToArrayOffset:function(a,b){var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3]; a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];return a},getNormalMatrix:function(a){this.getInverse(a).transpose();return this},transposeIntoArray:function(a){var b=this.elements;a[0]=b[0];a[1]=b[3];a[2]=b[6];a[3]=b[1];a[4]=b[4];a[5]=b[7];a[6]=b[2];a[7]=b[5];a[8]=b[8];return this},fromArray:function(a){this.elements.set(a);return this},toArray:function(){var a=this.elements;return[a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]]},clone:function(){var a=this.elements;return new THREE.Matrix3(a[0], -a[3],a[6],a[1],a[4],a[7],a[2],a[5],a[8])}};THREE.Matrix4=function(a,b,c,d,e,f,g,h,k,l,p,q,r,s,t,n){var v=this.elements=new Float32Array(16);v[0]=void 0!==a?a:1;v[4]=b||0;v[8]=c||0;v[12]=d||0;v[1]=e||0;v[5]=void 0!==f?f:1;v[9]=g||0;v[13]=h||0;v[2]=k||0;v[6]=l||0;v[10]=void 0!==p?p:1;v[14]=q||0;v[3]=r||0;v[7]=s||0;v[11]=t||0;v[15]=void 0!==n?n:1}; -THREE.Matrix4.prototype={constructor:THREE.Matrix4,set:function(a,b,c,d,e,f,g,h,k,l,p,q,r,s,t,n){var v=this.elements;v[0]=a;v[4]=b;v[8]=c;v[12]=d;v[1]=e;v[5]=f;v[9]=g;v[13]=h;v[2]=k;v[6]=l;v[10]=p;v[14]=q;v[3]=r;v[7]=s;v[11]=t;v[15]=n;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},copy:function(a){this.elements.set(a.elements);return this},extractPosition:function(a){console.warn("DEPRECATED: Matrix4's .extractPosition() has been renamed to .copyPosition()."); +a[3],a[6],a[1],a[4],a[7],a[2],a[5],a[8])}};THREE.Matrix4=function(a,b,c,d,e,f,g,h,k,l,p,s,r,u,q,n){var t=this.elements=new Float32Array(16);t[0]=void 0!==a?a:1;t[4]=b||0;t[8]=c||0;t[12]=d||0;t[1]=e||0;t[5]=void 0!==f?f:1;t[9]=g||0;t[13]=h||0;t[2]=k||0;t[6]=l||0;t[10]=void 0!==p?p:1;t[14]=s||0;t[3]=r||0;t[7]=u||0;t[11]=q||0;t[15]=void 0!==n?n:1}; +THREE.Matrix4.prototype={constructor:THREE.Matrix4,set:function(a,b,c,d,e,f,g,h,k,l,p,s,r,u,q,n){var t=this.elements;t[0]=a;t[4]=b;t[8]=c;t[12]=d;t[1]=e;t[5]=f;t[9]=g;t[13]=h;t[2]=k;t[6]=l;t[10]=p;t[14]=s;t[3]=r;t[7]=u;t[11]=q;t[15]=n;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},copy:function(a){this.elements.set(a.elements);return this},extractPosition:function(a){console.warn("DEPRECATED: Matrix4's .extractPosition() has been renamed to .copyPosition()."); return this.copyPosition(a)},copyPosition:function(a){var b=this.elements;a=a.elements;b[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractRotation:function(){var a=new THREE.Vector3;return function(b){var c=this.elements;b=b.elements;var d=1/a.set(b[0],b[1],b[2]).length(),e=1/a.set(b[4],b[5],b[6]).length(),f=1/a.set(b[8],b[9],b[10]).length();c[0]=b[0]*d;c[1]=b[1]*d;c[2]=b[2]*d;c[4]=b[4]*e;c[5]=b[5]*e;c[6]=b[6]*e;c[8]=b[8]*f;c[9]=b[9]*f;c[10]=b[10]*f;return this}}(),makeRotationFromEuler:function(a){!1=== a instanceof THREE.Euler&&console.error("ERROR: Matrix's .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order. Please update your code.");var b=this.elements,c=a.x,d=a.y,e=a.z,f=Math.cos(c),c=Math.sin(c),g=Math.cos(d),d=Math.sin(d),h=Math.cos(e),e=Math.sin(e);if("XYZ"===a.order){a=f*h;var k=f*e,l=c*h,p=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=k+l*d;b[5]=a-p*d;b[9]=-c*g;b[2]=p-a*d;b[6]=l+k*d;b[10]=f*g}else"YXZ"===a.order?(a=g*h,k=g*e,l=d*h,p=d*e,b[0]=a+p*c,b[4]=l*c-k,b[8]= f*d,b[1]=f*e,b[5]=f*h,b[9]=-c,b[2]=k*c-l,b[6]=p+a*c,b[10]=f*g):"ZXY"===a.order?(a=g*h,k=g*e,l=d*h,p=d*e,b[0]=a-p*c,b[4]=-f*e,b[8]=l+k*c,b[1]=k+l*c,b[5]=f*h,b[9]=p-a*c,b[2]=-f*d,b[6]=c,b[10]=f*g):"ZYX"===a.order?(a=f*h,k=f*e,l=c*h,p=c*e,b[0]=g*h,b[4]=l*d-k,b[8]=a*d+p,b[1]=g*e,b[5]=p*d+a,b[9]=k*d-l,b[2]=-d,b[6]=c*g,b[10]=f*g):"YZX"===a.order?(a=f*g,k=f*d,l=c*g,p=c*d,b[0]=g*h,b[4]=p-a*e,b[8]=l*e+k,b[1]=e,b[5]=f*h,b[9]=-c*h,b[2]=-d*h,b[6]=k*e+l,b[10]=a-p*e):"XZY"===a.order&&(a=f*g,k=f*d,l=c*g,p=c*d,b[0]= g*h,b[4]=-e,b[8]=d*h,b[1]=a*e+p,b[5]=f*h,b[9]=k*e-l,b[2]=l*e-k,b[6]=c*h,b[10]=p*e+a);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},setRotationFromQuaternion:function(a){console.warn("DEPRECATED: Matrix4's .setRotationFromQuaternion() has been deprecated in favor of makeRotationFromQuaternion. Please update your code.");return this.makeRotationFromQuaternion(a)},makeRotationFromQuaternion:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=a.w,g=c+c,h=d+d,k=e+e;a=c*g;var l=c* h,c=c*k,p=d*h,d=d*k,e=e*k,g=f*g,h=f*h,f=f*k;b[0]=1-(p+e);b[4]=l-f;b[8]=c+h;b[1]=l+f;b[5]=1-(a+e);b[9]=d-g;b[2]=c-h;b[6]=d+g;b[10]=1-(a+p);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},lookAt:function(){var a=new THREE.Vector3,b=new THREE.Vector3,c=new THREE.Vector3;return function(d,e,f){var g=this.elements;c.subVectors(d,e).normalize();0===c.length()&&(c.z=1);a.crossVectors(f,c).normalize();0===a.length()&&(c.x+=1E-4,a.crossVectors(f,c).normalize());b.crossVectors(c,a);g[0]= -a.x;g[4]=b.x;g[8]=c.x;g[1]=a.y;g[5]=b.y;g[9]=c.y;g[2]=a.z;g[6]=b.z;g[10]=c.z;return this}}(),multiply:function(a,b){return void 0!==b?(console.warn("DEPRECATED: Matrix4's .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(a,b)):this.multiplyMatrices(this,a)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements,e=this.elements,f=c[0],g=c[4],h=c[8],k=c[12],l=c[1],p=c[5],q=c[9],r=c[13],s=c[2],t=c[6],n=c[10],v=c[14],w=c[3],u=c[7],x=c[11], -c=c[15],F=d[0],C=d[4],D=d[8],z=d[12],G=d[1],I=d[5],B=d[9],y=d[13],A=d[2],O=d[6],L=d[10],M=d[14],K=d[3],H=d[7],Q=d[11],d=d[15];e[0]=f*F+g*G+h*A+k*K;e[4]=f*C+g*I+h*O+k*H;e[8]=f*D+g*B+h*L+k*Q;e[12]=f*z+g*y+h*M+k*d;e[1]=l*F+p*G+q*A+r*K;e[5]=l*C+p*I+q*O+r*H;e[9]=l*D+p*B+q*L+r*Q;e[13]=l*z+p*y+q*M+r*d;e[2]=s*F+t*G+n*A+v*K;e[6]=s*C+t*I+n*O+v*H;e[10]=s*D+t*B+n*L+v*Q;e[14]=s*z+t*y+n*M+v*d;e[3]=w*F+u*G+x*A+c*K;e[7]=w*C+u*I+x*O+c*H;e[11]=w*D+u*B+x*L+c*Q;e[15]=w*z+u*y+x*M+c*d;return this},multiplyToArray:function(a, +a.x;g[4]=b.x;g[8]=c.x;g[1]=a.y;g[5]=b.y;g[9]=c.y;g[2]=a.z;g[6]=b.z;g[10]=c.z;return this}}(),multiply:function(a,b){return void 0!==b?(console.warn("DEPRECATED: Matrix4's .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(a,b)):this.multiplyMatrices(this,a)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements,e=this.elements,f=c[0],g=c[4],h=c[8],k=c[12],l=c[1],p=c[5],s=c[9],r=c[13],u=c[2],q=c[6],n=c[10],t=c[14],w=c[3],v=c[7],x=c[11], +c=c[15],F=d[0],C=d[4],D=d[8],z=d[12],G=d[1],I=d[5],B=d[9],y=d[13],A=d[2],O=d[6],L=d[10],M=d[14],K=d[3],H=d[7],Q=d[11],d=d[15];e[0]=f*F+g*G+h*A+k*K;e[4]=f*C+g*I+h*O+k*H;e[8]=f*D+g*B+h*L+k*Q;e[12]=f*z+g*y+h*M+k*d;e[1]=l*F+p*G+s*A+r*K;e[5]=l*C+p*I+s*O+r*H;e[9]=l*D+p*B+s*L+r*Q;e[13]=l*z+p*y+s*M+r*d;e[2]=u*F+q*G+n*A+t*K;e[6]=u*C+q*I+n*O+t*H;e[10]=u*D+q*B+n*L+t*Q;e[14]=u*z+q*y+n*M+t*d;e[3]=w*F+v*G+x*A+c*K;e[7]=w*C+v*I+x*O+c*H;e[11]=w*D+v*B+x*L+c*Q;e[15]=w*z+v*y+x*M+c*d;return this},multiplyToArray:function(a, b,c){var d=this.elements;this.multiplyMatrices(a,b);c[0]=d[0];c[1]=d[1];c[2]=d[2];c[3]=d[3];c[4]=d[4];c[5]=d[5];c[6]=d[6];c[7]=d[7];c[8]=d[8];c[9]=d[9];c[10]=d[10];c[11]=d[11];c[12]=d[12];c[13]=d[13];c[14]=d[14];c[15]=d[15];return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[4]*=a;b[8]*=a;b[12]*=a;b[1]*=a;b[5]*=a;b[9]*=a;b[13]*=a;b[2]*=a;b[6]*=a;b[10]*=a;b[14]*=a;b[3]*=a;b[7]*=a;b[11]*=a;b[15]*=a;return this},multiplyVector3:function(a){console.warn("DEPRECATED: Matrix4's .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead."); return a.applyProjection(this)},multiplyVector4:function(a){console.warn("DEPRECATED: Matrix4's .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},multiplyVector3Array:function(a){console.warn("DEPRECATED: Matrix4's .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.");return this.applyToVector3Array(a)},applyToVector3Array:function(){var a=new THREE.Vector3;return function(b,c,d){void 0===c&&(c=0); void 0===d&&(d=b.length);for(var e=0;ed?c.copy(this.origin):c.copy(this.direction).multiplyScalar(d).add(this.origin)},distanceToPoint:function(){var a=new THREE.Vector3;return function(b){var c=a.subVectors(b,this.origin).dot(this.direction);if(0>c)return this.origin.distanceTo(b);a.copy(this.direction).multiplyScalar(c).add(this.origin);return a.distanceTo(b)}}(),distanceSqToSegment:function(a,b,c,d){var e=a.clone().add(b).multiplyScalar(0.5),f=b.clone().sub(a).normalize(),g=0.5*a.distanceTo(b), -h=this.origin.clone().sub(e);a=-this.direction.dot(f);b=h.dot(this.direction);var k=-h.dot(f),l=h.lengthSq(),p=Math.abs(1-a*a),q,r;0<=p?(h=a*k-b,q=a*b-k,r=g*p,0<=h?q>=-r?q<=r?(g=1/p,h*=g,q*=g,a=h*(h+a*q+2*b)+q*(a*h+q+2*k)+l):(q=g,h=Math.max(0,-(a*q+b)),a=-h*h+q*(q+2*k)+l):(q=-g,h=Math.max(0,-(a*q+b)),a=-h*h+q*(q+2*k)+l):q<=-r?(h=Math.max(0,-(-a*g+b)),q=0a.normal.dot(this.direction)*b?!0:!1},distanceToPlane:function(a){var b=a.normal.dot(this.direction);if(0==b)return 0==a.distanceToPoint(this.origin)? +h=this.origin.clone().sub(e);a=-this.direction.dot(f);b=h.dot(this.direction);var k=-h.dot(f),l=h.lengthSq(),p=Math.abs(1-a*a),s,r;0<=p?(h=a*k-b,s=a*b-k,r=g*p,0<=h?s>=-r?s<=r?(g=1/p,h*=g,s*=g,a=h*(h+a*s+2*b)+s*(a*h+s+2*k)+l):(s=g,h=Math.max(0,-(a*s+b)),a=-h*h+s*(s+2*k)+l):(s=-g,h=Math.max(0,-(a*s+b)),a=-h*h+s*(s+2*k)+l):s<=-r?(h=Math.max(0,-(-a*g+b)),s=0a.normal.dot(this.direction)*b?!0:!1},distanceToPlane:function(a){var b=a.normal.dot(this.direction);if(0==b)return 0==a.distanceToPoint(this.origin)? 0:null;a=-(this.origin.dot(a.normal)+a.constant)/b;return 0<=a?a:null},intersectPlane:function(a,b){var c=this.distanceToPlane(a);return null===c?null:this.at(c,b)},isIntersectionBox:function(){var a=new THREE.Vector3;return function(b){return null!==this.intersectBox(b,a)}}(),intersectBox:function(a,b){var c,d,e,f,g;d=1/this.direction.x;f=1/this.direction.y;g=1/this.direction.z;var h=this.origin;0<=d?(c=(a.min.x-h.x)*d,d*=a.max.x-h.x):(c=(a.max.x-h.x)*d,d*=a.min.x-h.x);0<=f?(e=(a.min.y-h.y)*f,f*= a.max.y-h.y):(e=(a.max.y-h.y)*f,f*=a.min.y-h.y);if(c>f||e>d)return null;if(e>c||c!==c)c=e;if(fg||e>d)return null;if(e>c||c!==c)c=e;if(gd?null:this.at(0<=c?c:d,b)},intersectTriangle:function(){var a=new THREE.Vector3,b=new THREE.Vector3,c=new THREE.Vector3,d=new THREE.Vector3;return function(e,f,g,h,k){b.subVectors(f,e);c.subVectors(g,e);d.crossVectors(b,c);f=this.direction.dot(d);if(0< f){if(h)return null;h=1}else if(0>f)h=-1,f=-f;else return null;a.subVectors(this.origin,e);e=h*this.direction.dot(c.crossVectors(a,c));if(0>e)return null;g=h*this.direction.dot(b.cross(a));if(0>g||e+g>f)return null;e=-h*a.dot(d);return 0>e?null:this.at(e/f,k)}}(),applyMatrix4:function(a){this.direction.add(this.origin).applyMatrix4(a);this.origin.applyMatrix4(a);this.direction.sub(this.origin);this.direction.normalize();return this},equals:function(a){return a.origin.equals(this.origin)&&a.direction.equals(this.direction)}, @@ -123,8 +123,8 @@ clone:function(){return(new THREE.Ray).copy(this)}};THREE.Sphere=function(a,b){t THREE.Sphere.prototype={constructor:THREE.Sphere,set:function(a,b){this.center.copy(a);this.radius=b;return this},setFromPoints:function(){var a=new THREE.Box3;return function(b,c){var d=this.center;void 0!==c?d.copy(c):a.setFromPoints(b).center(d);for(var e=0,f=0,g=b.length;f=this.radius},containsPoint:function(a){return a.distanceToSquared(this.center)<= this.radius*this.radius},distanceToPoint:function(a){return a.distanceTo(this.center)-this.radius},intersectsSphere:function(a){var b=this.radius+a.radius;return a.center.distanceToSquared(this.center)<=b*b},clampPoint:function(a,b){var c=this.center.distanceToSquared(a),d=b||new THREE.Vector3;d.copy(a);c>this.radius*this.radius&&(d.sub(this.center).normalize(),d.multiplyScalar(this.radius).add(this.center));return d},getBoundingBox:function(a){a=a||new THREE.Box3;a.set(this.center,this.center);a.expandByScalar(this.radius); return a},applyMatrix4:function(a){this.center.applyMatrix4(a);this.radius*=a.getMaxScaleOnAxis();return this},translate:function(a){this.center.add(a);return this},equals:function(a){return a.center.equals(this.center)&&a.radius===this.radius},clone:function(){return(new THREE.Sphere).copy(this)}};THREE.Frustum=function(a,b,c,d,e,f){this.planes=[void 0!==a?a:new THREE.Plane,void 0!==b?b:new THREE.Plane,void 0!==c?c:new THREE.Plane,void 0!==d?d:new THREE.Plane,void 0!==e?e:new THREE.Plane,void 0!==f?f:new THREE.Plane]}; -THREE.Frustum.prototype={constructor:THREE.Frustum,set:function(a,b,c,d,e,f){var g=this.planes;g[0].copy(a);g[1].copy(b);g[2].copy(c);g[3].copy(d);g[4].copy(e);g[5].copy(f);return this},copy:function(a){for(var b=this.planes,c=0;6>c;c++)b[c].copy(a.planes[c]);return this},setFromMatrix:function(a){var b=this.planes,c=a.elements;a=c[0];var d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],k=c[6],l=c[7],p=c[8],q=c[9],r=c[10],s=c[11],t=c[12],n=c[13],v=c[14],c=c[15];b[0].setComponents(f-a,l-g,s-p,c-t).normalize();b[1].setComponents(f+ -a,l+g,s+p,c+t).normalize();b[2].setComponents(f+d,l+h,s+q,c+n).normalize();b[3].setComponents(f-d,l-h,s-q,c-n).normalize();b[4].setComponents(f-e,l-k,s-r,c-v).normalize();b[5].setComponents(f+e,l+k,s+r,c+v).normalize();return this},intersectsObject:function(){var a=new THREE.Sphere;return function(b){var c=b.geometry;null===c.boundingSphere&&c.computeBoundingSphere();a.copy(c.boundingSphere);a.applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSphere:function(a){var b=this.planes, +THREE.Frustum.prototype={constructor:THREE.Frustum,set:function(a,b,c,d,e,f){var g=this.planes;g[0].copy(a);g[1].copy(b);g[2].copy(c);g[3].copy(d);g[4].copy(e);g[5].copy(f);return this},copy:function(a){for(var b=this.planes,c=0;6>c;c++)b[c].copy(a.planes[c]);return this},setFromMatrix:function(a){var b=this.planes,c=a.elements;a=c[0];var d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],k=c[6],l=c[7],p=c[8],s=c[9],r=c[10],u=c[11],q=c[12],n=c[13],t=c[14],c=c[15];b[0].setComponents(f-a,l-g,u-p,c-q).normalize();b[1].setComponents(f+ +a,l+g,u+p,c+q).normalize();b[2].setComponents(f+d,l+h,u+s,c+n).normalize();b[3].setComponents(f-d,l-h,u-s,c-n).normalize();b[4].setComponents(f-e,l-k,u-r,c-t).normalize();b[5].setComponents(f+e,l+k,u+r,c+t).normalize();return this},intersectsObject:function(){var a=new THREE.Sphere;return function(b){var c=b.geometry;null===c.boundingSphere&&c.computeBoundingSphere();a.copy(c.boundingSphere);a.applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSphere:function(a){var b=this.planes, c=a.center;a=-a.radius;for(var d=0;6>d;d++)if(b[d].distanceToPoint(c)e;e++){var f=d[e];a.x=0g&&0>f)return!1}return!0}}(), containsPoint:function(a){for(var b=this.planes,c=0;6>c;c++)if(0>b[c].distanceToPoint(a))return!1;return!0},clone:function(){return(new THREE.Frustum).copy(this)}};THREE.Plane=function(a,b){this.normal=void 0!==a?a:new THREE.Vector3(1,0,0);this.constant=void 0!==b?b:0}; THREE.Plane.prototype={constructor:THREE.Plane,set:function(a,b){this.normal.copy(a);this.constant=b;return this},setComponents:function(a,b,c,d){this.normal.set(a,b,c);this.constant=d;return this},setFromNormalAndCoplanarPoint:function(a,b){this.normal.copy(a);this.constant=-b.dot(this.normal);return this},setFromCoplanarPoints:function(){var a=new THREE.Vector3,b=new THREE.Vector3;return function(c,d,e){d=a.subVectors(e,d).cross(b.subVectors(c,d)).normalize();this.setFromNormalAndCoplanarPoint(d, @@ -133,8 +133,8 @@ b){var c=this.distanceToPoint(a);return(b||new THREE.Vector3).copy(this.normal). coplanarPoint:function(a){return(a||new THREE.Vector3).copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(){var a=new THREE.Vector3,b=new THREE.Vector3,c=new THREE.Matrix3;return function(d,e){var f=e||c.getNormalMatrix(d),f=a.copy(this.normal).applyMatrix3(f),g=this.coplanarPoint(b);g.applyMatrix4(d);this.setFromNormalAndCoplanarPoint(f,g);return this}}(),translate:function(a){this.constant-=a.dot(this.normal);return this},equals:function(a){return a.normal.equals(this.normal)&& a.constant==this.constant},clone:function(){return(new THREE.Plane).copy(this)}};THREE.Math={generateUUID:function(){var a="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),b=Array(36),c=0,d;return function(){for(var e=0;36>e;e++)8==e||13==e||18==e||23==e?b[e]="-":14==e?b[e]="4":(2>=c&&(c=33554432+16777216*Math.random()|0),d=c&15,c>>=4,b[e]=a[19==e?d&3|8:d]);return b.join("")}}(),clamp:function(a,b,c){return ac?c:a},clampBottom:function(a,b){return a=c)return 1;a=(a-b)/(c-b);return a*a*(3-2*a)},smootherstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*a*(a*(6*a-15)+10)},random16:function(){return(65280*Math.random()+255*Math.random())/65535},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(0.5-Math.random())},sign:function(a){return 0>a?-1:0this.points.length-2?this.points.length-1:f+1;c[3]=f>this.points.length-3?this.points.length-1: -f+2;l=this.points[c[0]];p=this.points[c[1]];q=this.points[c[2]];r=this.points[c[3]];h=g*g;k=g*h;d.x=b(l.x,p.x,q.x,r.x,g,h,k);d.y=b(l.y,p.y,q.y,r.y,g,h,k);d.z=b(l.z,p.z,q.z,r.z,g,h,k);return d};this.getControlPointsArray=function(){var a,b,c=this.points.length,d=[];for(a=0;athis.points.length-2?this.points.length-1:f+1;c[3]=f>this.points.length-3?this.points.length-1: +f+2;l=this.points[c[0]];p=this.points[c[1]];s=this.points[c[2]];r=this.points[c[3]];h=g*g;k=g*h;d.x=b(l.x,p.x,s.x,r.x,g,h,k);d.y=b(l.y,p.y,s.y,r.y,g,h,k);d.z=b(l.z,p.z,s.z,r.z,g,h,k);return d};this.getControlPointsArray=function(){var a,b,c=this.points.length,d=[];for(a=0;af.scale.x)return s;s.push({distance:t,point:f.position,face:null,object:f})}else if(f instanceof -a.PointCloud)for(var n=f.geometry.vertices,v=0;vt&&s.push({distance:t,index:v,face:null,object:f});else if(f instanceof a.LOD)d.setFromMatrixPosition(f.matrixWorld),t=p.ray.origin.distanceTo(d),l(f.getObjectForDistance(t),p,s);else if(f instanceof a.Mesh){v=f.geometry;null===v.boundingSphere&&v.computeBoundingSphere();b.copy(v.boundingSphere);b.applyMatrix4(f.matrixWorld);if(!1===p.ray.isIntersectionSphere(b))return s; -e.getInverse(f.matrixWorld);c.copy(p.ray).applyMatrix4(e);if(null!==v.boundingBox&&!1===c.isIntersectionBox(v.boundingBox))return s;if(v instanceof a.BufferGeometry){var w=f.material;if(void 0===w)return s;var u=v.attributes,x,F,C=p.precision;if(void 0!==u.index){var n=u.index.array,D=u.position.array,z=v.offsets;0===z.length&&(z=[{start:0,count:D.length,index:0}]);for(var G=0,I=z.length;Gp.far||s.push({distance:t,point:A,indices:[u,x,F],face:null,faceIndex:null,object:f}))}}}else for(D=u.position.array,v=0,y=u.position.array.length;vp.far||s.push({distance:t,point:A,indices:[u,x,F],face:null,faceIndex:null,object:f}))}else if(v instanceof a.Geometry)for(D=f.material instanceof a.MeshFaceMaterial,z=!0===D?f.material.materials:null,C=p.precision,n=v.vertices,G=0,I=v.faces.length;Gp.far||s.push({distance:t,point:A,face:B,faceIndex:G,object:f}))}}else if(f instanceof a.Line){C=p.linePrecision;w=C*C;v=f.geometry;null===v.boundingSphere&&v.computeBoundingSphere();b.copy(v.boundingSphere);b.applyMatrix4(f.matrixWorld);if(!1===p.ray.isIntersectionSphere(b))return s;e.getInverse(f.matrixWorld);c.copy(p.ray).applyMatrix4(e); -if(v instanceof a.Geometry)for(n=v.vertices,C=n.length,u=new a.Vector3,x=new a.Vector3,F=f.type===a.LineStrip?1:2,v=0;vw||(t=c.origin.distanceTo(x),tp.far||s.push({distance:t,point:u.clone().applyMatrix4(f.matrixWorld),face:null,faceIndex:null,object:f}))}},p=function(a,b,c){a=a.getDescendants();for(var d=0,e=a.length;df.scale.x)return u;u.push({distance:q,point:f.position,face:null,object:f})}else if(f instanceof +a.PointCloud)for(var n=f.geometry.vertices,t=0;tq&&u.push({distance:q,index:t,face:null,object:f});else if(f instanceof a.LOD)d.setFromMatrixPosition(f.matrixWorld),q=p.ray.origin.distanceTo(d),l(f.getObjectForDistance(q),p,u);else if(f instanceof a.Mesh){t=f.geometry;null===t.boundingSphere&&t.computeBoundingSphere();b.copy(t.boundingSphere);b.applyMatrix4(f.matrixWorld);if(!1===p.ray.isIntersectionSphere(b))return u; +e.getInverse(f.matrixWorld);c.copy(p.ray).applyMatrix4(e);if(null!==t.boundingBox&&!1===c.isIntersectionBox(t.boundingBox))return u;if(t instanceof a.BufferGeometry){var w=f.material;if(void 0===w)return u;var v=t.attributes,x,F,C=p.precision;if(void 0!==v.index){var n=v.index.array,D=v.position.array,z=t.offsets;0===z.length&&(z=[{start:0,count:D.length,index:0}]);for(var G=0,I=z.length;Gp.far||u.push({distance:q,point:A,indices:[v,x,F],face:null,faceIndex:null,object:f}))}}}else for(D=v.position.array,t=0,y=v.position.array.length;tp.far||u.push({distance:q,point:A,indices:[v,x,F],face:null,faceIndex:null,object:f}))}else if(t instanceof a.Geometry)for(D=f.material instanceof a.MeshFaceMaterial,z=!0===D?f.material.materials:null,C=p.precision,n=t.vertices,G=0,I=t.faces.length;Gp.far||u.push({distance:q,point:A,face:B,faceIndex:G,object:f}))}}else if(f instanceof a.Line){C=p.linePrecision;w=C*C;t=f.geometry;null===t.boundingSphere&&t.computeBoundingSphere();b.copy(t.boundingSphere);b.applyMatrix4(f.matrixWorld);if(!1===p.ray.isIntersectionSphere(b))return u;e.getInverse(f.matrixWorld);c.copy(p.ray).applyMatrix4(e); +if(t instanceof a.Geometry)for(n=t.vertices,C=n.length,v=new a.Vector3,x=new a.Vector3,F=f.type===a.LineStrip?1:2,t=0;tw||(q=c.origin.distanceTo(x),qp.far||u.push({distance:q,point:v.clone().applyMatrix4(f.matrixWorld),face:null,faceIndex:null,object:f}))}},p=function(a,b,c){a=a.getDescendants();for(var d=0,e=a.length;de&&0>f||0>g&& -0>h)return!1;0>e?c=Math.max(c,e/(e-f)):0>f&&(d=Math.min(d,e/(e-f)));0>g?c=Math.max(c,g/(g-h)):0>h&&(d=Math.min(d,g/(g-h)));if(de&&0>f||0>g&& +0>h)return!1;0>e?c=Math.max(c,e/(e-f)):0>f&&(d=Math.min(d,e/(e-f)));0>g?c=Math.max(c,g/(g-h)):0>h&&(d=Math.min(d,g/(g-h)));if(d=c.x&&-1<=c.y&&1>=c.y&&-1<=c.z&&1>=c.z},p=function(a,b,c){if(!0===a.visible||!0===b.visible||!0===c.visible)return!0;H[0]=a.positionScreen; H[1]=b.positionScreen;H[2]=c.positionScreen;return M.isIntersectionBox(K.setFromPoints(H))},r=function(a,b,c){return 0>(c.positionScreen.x-a.positionScreen.x)*(b.positionScreen.y-a.positionScreen.y)-(c.positionScreen.y-a.positionScreen.y)*(b.positionScreen.x-a.positionScreen.x)};return{setObject:function(a){f=a;g=f.material;h.getNormalMatrix(f.matrixWorld);d.length=0;e.length=0},projectVertex:k,checkTriangleVisibility:p,checkBackfaceCulling:r,pushVertex:function(b,c,d){l=a();l.position.set(b,c,d); -k(l)},pushNormal:function(a,b,c){d.push(a,b,c)},pushUv:function(a,b){e.push(a,b)},pushLine:function(a,b){var d=q[a],e=q[b];w=c();w.id=f.id;w.v1.copy(d);w.v2.copy(e);w.z=(d.positionScreen.z+e.positionScreen.z)/2;w.material=f.material;I.elements.push(w)},pushTriangle:function(a,c,k){var l=q[a],n=q[c],t=q[k];if(!1!==p(l,n,t)&&(g.side===THREE.DoubleSide||!0===r(l,n,t))){s=b();s.id=f.id;s.v1.copy(l);s.v2.copy(n);s.v3.copy(t);s.z=(l.positionScreen.z+n.positionScreen.z+t.positionScreen.z)/3;for(l=0;3>l;l++)n= -3*arguments[l],t=s.vertexNormalsModel[l],t.set(d[n],d[n+1],d[n+2]),t.applyMatrix3(h).normalize(),n=2*arguments[l],s.uvs[l].set(e[n],e[n+1]);s.vertexNormalsLength=3;s.material=f.material;I.elements.push(s)}}}};this.projectScene=function(f,h,k,l){var r,n,v,x,F,K,H,M;D=u=t=0;I.elements.length=0;!0===f.autoUpdate&&f.updateMatrixWorld();void 0===h.parent&&h.updateMatrixWorld();Q.copy(h.matrixWorldInverse.getInverse(h.matrixWorld));Y.multiplyMatrices(h.projectionMatrix,Q);R.setFromMatrix(Y);g=0;I.objects.length= +k(l)},pushNormal:function(a,b,c){d.push(a,b,c)},pushUv:function(a,b){e.push(a,b)},pushLine:function(a,b){var d=s[a],e=s[b];w=c();w.id=f.id;w.v1.copy(d);w.v2.copy(e);w.z=(d.positionScreen.z+e.positionScreen.z)/2;w.material=f.material;I.elements.push(w)},pushTriangle:function(a,c,k){var l=s[a],q=s[c],n=s[k];if(!1!==p(l,q,n)&&(g.side===THREE.DoubleSide||!0===r(l,q,n))){u=b();u.id=f.id;u.v1.copy(l);u.v2.copy(q);u.v3.copy(n);u.z=(l.positionScreen.z+q.positionScreen.z+n.positionScreen.z)/3;for(l=0;3>l;l++)q= +3*arguments[l],n=u.vertexNormalsModel[l],n.set(d[q],d[q+1],d[q+2]),n.applyMatrix3(h).normalize(),q=2*arguments[l],u.uvs[l].set(e[q],e[q+1]);u.vertexNormalsLength=3;u.material=f.material;I.elements.push(u)}}}};this.projectScene=function(f,h,k,l){var r,n,t,x,F,K,H,M;D=v=q=0;I.elements.length=0;!0===f.autoUpdate&&f.updateMatrixWorld();void 0===h.parent&&h.updateMatrixWorld();Q.copy(h.matrixWorldInverse.getInverse(h.matrixWorld));Y.multiplyMatrices(h.projectionMatrix,Q);R.setFromMatrix(Y);g=0;I.objects.length= 0;I.lights.length=0;V(f);!0===k&&I.objects.sort(d);f=0;for(k=I.objects.length;fF;F++)s.uvs[F].copy(ya[F]);s.color=v.color;s.material= -ma;s.z=(ia.positionScreen.z+Z.positionScreen.z+qa.positionScreen.z)/3;I.elements.push(s)}}}}}else if(r instanceof THREE.Line)if(n instanceof THREE.BufferGeometry){if(K=n.attributes,void 0!==K.position){H=K.position.array;n=0;for(x=H.length;nF;F++)u.uvs[F].copy(ya[F]);u.color=t.color;u.material= +ma;u.z=(ia.positionScreen.z+Z.positionScreen.z+qa.positionScreen.z)/3;I.elements.push(u)}}}}}else if(r instanceof THREE.Line)if(n instanceof THREE.BufferGeometry){if(K=n.attributes,void 0!==K.position){H=K.position.array;n=0;for(x=H.length;n=L.z&&(D===G?(x=new THREE.RenderableSprite,z.push(x),G++,D++,C=x):C=z[D++],C.id=r.id,C.x=L.x*n,C.y=L.y*n,C.z=L.z,C.object=r,C.rotation=r.rotation,C.scale.x=r.scale.x*Math.abs(C.x-(L.x+h.projectionMatrix.elements[0])/(L.w+h.projectionMatrix.elements[12])),C.scale.y=r.scale.y*Math.abs(C.y-(L.y+h.projectionMatrix.elements[5])/ (L.w+h.projectionMatrix.elements[13])),C.material=r.material,I.elements.push(C)));!0===l&&I.elements.sort(d);return I}};THREE.Face3=function(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];this.color=e instanceof THREE.Color?e:new THREE.Color;this.vertexColors=e instanceof Array?e:[];this.vertexTangents=[];this.materialIndex=void 0!==f?f:0}; THREE.Face3.prototype={constructor:THREE.Face3,clone:function(){var a=new THREE.Face3(this.a,this.b,this.c);a.normal.copy(this.normal);a.color.copy(this.color);a.materialIndex=this.materialIndex;var b,c;b=0;for(c=this.vertexNormals.length;bb.max.x&&(b.max.x=e);fb.max.y&&(b.max.y=f);gb.max.z&&(b.max.z=g)}}if(void 0===a||0===a.length)this.boundingBox.min.set(0,0,0),this.boundingBox.max.set(0,0,0);(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.')},computeBoundingSphere:function(){var a=new THREE.Box3,b=new THREE.Vector3;return function(){null=== this.boundingSphere&&(this.boundingSphere=new THREE.Sphere);var c=this.attributes.position.array;if(c){a.makeEmpty();for(var d=this.boundingSphere.center,e=0,f=c.length;eGa?-1:1;h[4*a]=wa.x;h[4*a+1]=wa.y;h[4*a+2]=wa.z;h[4*a+3]=Ia}if(void 0===this.attributes.index||void 0===this.attributes.position||void 0===this.attributes.normal||void 0===this.attributes.uv)console.warn("Missing required attributes (index, position, normal or uv) in BufferGeometry.computeTangents()");else{var c=this.attributes.index.array,d=this.attributes.position.array,e=this.attributes.normal.array,f=this.attributes.uv.array,g=d.length/3;void 0===this.attributes.tangent&&(this.attributes.tangent= -{itemSize:4,array:new Float32Array(4*g)});for(var h=this.attributes.tangent.array,k=[],l=[],p=0;pn;n++)t=a[3*c+n],-1==r[t]?(q[2*n]=t,q[2*n+1]=-1,p++):r[t]k.index+b)for(k={start:f,count:0,index:g},h.push(k),p=0;6>p;p+=2)n=q[p+1],-1p;p+=2)t=q[p],n=q[p+1],-1===n&&(n=g++),r[t]=n,s[n]=t,e[f++]=n-k.index,k.count++}this.reorderBuffers(e,s,g);return this.offsets=h},merge:function(){console.log("BufferGeometry.merge(): TODO")},normalizeNormals:function(){for(var a=this.attributes.normal.array, +{itemSize:4,array:new Float32Array(4*g)});for(var h=this.attributes.tangent.array,k=[],l=[],p=0;pn;n++)q=a[3*c+n],-1==r[q]?(s[2*n]=q,s[2*n+1]=-1,p++):r[q]k.index+b)for(k={start:f,count:0,index:g},h.push(k),p=0;6>p;p+=2)n=s[p+1],-1p;p+=2)q=s[p],n=s[p+1],-1===n&&(n=g++),r[q]=n,u[n]=q,e[f++]=n-k.index,k.count++}this.reorderBuffers(e,u,g);return this.offsets=h},merge:function(){console.log("BufferGeometry.merge(): TODO")},normalizeNormals:function(){for(var a=this.attributes.normal.array, b,c,d,e=0,f=a.length;ed?-1:1,e.vertexTangents[c]=new THREE.Vector4(F.x,F.y,F.z,d);this.hasTangents=!0},computeLineDistances:function(){for(var a=0,b=this.vertices,c=0,d=b.length;cd?-1:1,e.vertexTangents[c]=new THREE.Vector4(F.x,F.y,F.z,d);this.hasTangents=!0},computeLineDistances:function(){for(var a=0,b=this.vertices,c=0,d=b.length;cd;d++)if(e[d]==e[(d+1)%3]){a.push(f);break}for(f=a.length-1;0<=f;f--)for(e=a[f],this.faces.splice(e,1),c=0,g=this.faceVertexUvs.length;cc&&(h[f].counter+=1,g=h[f].hash+"_"+h[f].counter,g in this.geometryGroups||(this.geometryGroups[g]={faces3:[],materialIndex:f,vertices:0,numMorphTargets:k,numMorphNormals:l})),this.geometryGroups[g].faces3.push(d), this.geometryGroups[g].vertices+=3;this.geometryGroupsList=[];for(var p in this.geometryGroups)this.geometryGroups[p].id=a++,this.geometryGroupsList.push(this.geometryGroups[p])}}(),clone:function(){for(var a=new THREE.Geometry,b=this.vertices,c=0,d=b.length;ca.opacity)h.transparent=a.transparent;void 0!==a.depthTest&&(h.depthTest=a.depthTest);void 0!==a.depthWrite&&(h.depthWrite=a.depthWrite);void 0!==a.visible&&(h.visible=a.visible);void 0!==a.flipSided&&(h.side=THREE.BackSide);void 0!==a.doubleSided&&(h.side=THREE.DoubleSide);void 0!==a.wireframe&& (h.wireframe=a.wireframe);void 0!==a.vertexColors&&("face"===a.vertexColors?h.vertexColors=THREE.FaceColors:a.vertexColors&&(h.vertexColors=THREE.VertexColors));a.colorDiffuse?h.color=e(a.colorDiffuse):a.DbgColor&&(h.color=a.DbgColor);a.colorSpecular&&(h.specular=e(a.colorSpecular));a.colorAmbient&&(h.ambient=e(a.colorAmbient));a.colorEmissive&&(h.emissive=e(a.colorEmissive));a.transparency&&(h.opacity=a.transparency);a.specularCoef&&(h.shininess=a.specularCoef);a.mapDiffuse&&b&&d(h,"map",a.mapDiffuse, a.mapDiffuseRepeat,a.mapDiffuseOffset,a.mapDiffuseWrap,a.mapDiffuseAnisotropy);a.mapLight&&b&&d(h,"lightMap",a.mapLight,a.mapLightRepeat,a.mapLightOffset,a.mapLightWrap,a.mapLightAnisotropy);a.mapBump&&b&&d(h,"bumpMap",a.mapBump,a.mapBumpRepeat,a.mapBumpOffset,a.mapBumpWrap,a.mapBumpAnisotropy);a.mapNormal&&b&&d(h,"normalMap",a.mapNormal,a.mapNormalRepeat,a.mapNormalOffset,a.mapNormalWrap,a.mapNormalAnisotropy);a.mapSpecular&&b&&d(h,"specularMap",a.mapSpecular,a.mapSpecularRepeat,a.mapSpecularOffset, @@ -245,12 +245,12 @@ THREE.ImageLoader.prototype={constructor:THREE.ImageLoader,load:function(a,b,c,d a}};THREE.JSONLoader=function(a){THREE.Loader.call(this,a);this.withCredentials=!1};THREE.JSONLoader.prototype=Object.create(THREE.Loader.prototype);THREE.JSONLoader.prototype.load=function(a,b,c){c=c&&"string"===typeof c?c:this.extractUrlBase(a);this.onLoadStart();this.loadAjaxJSON(this,a,b,c)}; THREE.JSONLoader.prototype.loadAjaxJSON=function(a,b,c,d,e){var f=new XMLHttpRequest,g=0;f.onreadystatechange=function(){if(f.readyState===f.DONE)if(200===f.status||0===f.status){if(f.responseText){var h=JSON.parse(f.responseText);if(void 0!==h.metadata&&"scene"===h.metadata.type){console.error('THREE.JSONLoader: "'+b+'" seems to be a Scene. Use THREE.SceneLoader instead.');return}h=a.parse(h,d);c(h.geometry,h.materials)}else console.error('THREE.JSONLoader: "'+b+'" seems to be unreachable or the file is empty.'); a.onLoadComplete()}else console.error("THREE.JSONLoader: Couldn't load \""+b+'" ('+f.status+")");else f.readyState===f.LOADING?e&&(0===g&&(g=f.getResponseHeader("Content-Length")),e({total:g,loaded:f.responseText.length})):f.readyState===f.HEADERS_RECEIVED&&void 0!==e&&(g=f.getResponseHeader("Content-Length"))};f.open("GET",b,!0);f.withCredentials=this.withCredentials;f.send(null)}; -THREE.JSONLoader.prototype.parse=function(a,b){var c=new THREE.Geometry,d=void 0!==a.scale?1/a.scale:1;(function(b){var d,g,h,k,l,p,q,r,s,t,n,v,w,u=a.faces;p=a.vertices;var x=a.normals,F=a.colors,C=0;if(void 0!==a.uvs){for(d=0;dg;g++)r=u[k++],w=v[2*r],r=v[2*r+1],w=new THREE.Vector2(w,r),2!==g&&c.faceVertexUvs[d][h].push(w),0!==g&&c.faceVertexUvs[d][h+1].push(w);q&&(q=3*u[k++],s.normal.set(x[q++],x[q++],x[q]),n.normal.copy(s.normal));if(t)for(d=0;4>d;d++)q=3*u[k++],t=new THREE.Vector3(x[q++], -x[q++],x[q]),2!==d&&s.vertexNormals.push(t),0!==d&&n.vertexNormals.push(t);p&&(p=u[k++],p=F[p],s.color.setHex(p),n.color.setHex(p));if(b)for(d=0;4>d;d++)p=u[k++],p=F[p],2!==d&&s.vertexColors.push(new THREE.Color(p)),0!==d&&n.vertexColors.push(new THREE.Color(p));c.faces.push(s);c.faces.push(n)}else{s=new THREE.Face3;s.a=u[k++];s.b=u[k++];s.c=u[k++];h&&(h=u[k++],s.materialIndex=h);h=c.faces.length;if(d)for(d=0;dg;g++)r=u[k++],w=v[2*r],r=v[2*r+1], -w=new THREE.Vector2(w,r),c.faceVertexUvs[d][h].push(w);q&&(q=3*u[k++],s.normal.set(x[q++],x[q++],x[q]));if(t)for(d=0;3>d;d++)q=3*u[k++],t=new THREE.Vector3(x[q++],x[q++],x[q]),s.vertexNormals.push(t);p&&(p=u[k++],s.color.setHex(F[p]));if(b)for(d=0;3>d;d++)p=u[k++],s.vertexColors.push(new THREE.Color(F[p]));c.faces.push(s)}})(d);(function(){var b=void 0!==a.influencesPerVertex?a.influencesPerVertex:2;if(a.skinWeights)for(var d=0,g=a.skinWeights.length;dg;g++)r=v[k++],w=t[2*r],r=t[2*r+1],w=new THREE.Vector2(w,r),2!==g&&c.faceVertexUvs[d][h].push(w),0!==g&&c.faceVertexUvs[d][h+1].push(w);s&&(s=3*v[k++],u.normal.set(x[s++],x[s++],x[s]),n.normal.copy(u.normal));if(q)for(d=0;4>d;d++)s=3*v[k++],q=new THREE.Vector3(x[s++], +x[s++],x[s]),2!==d&&u.vertexNormals.push(q),0!==d&&n.vertexNormals.push(q);p&&(p=v[k++],p=F[p],u.color.setHex(p),n.color.setHex(p));if(b)for(d=0;4>d;d++)p=v[k++],p=F[p],2!==d&&u.vertexColors.push(new THREE.Color(p)),0!==d&&n.vertexColors.push(new THREE.Color(p));c.faces.push(u);c.faces.push(n)}else{u=new THREE.Face3;u.a=v[k++];u.b=v[k++];u.c=v[k++];h&&(h=v[k++],u.materialIndex=h);h=c.faces.length;if(d)for(d=0;dg;g++)r=v[k++],w=t[2*r],r=t[2*r+1], +w=new THREE.Vector2(w,r),c.faceVertexUvs[d][h].push(w);s&&(s=3*v[k++],u.normal.set(x[s++],x[s++],x[s]));if(q)for(d=0;3>d;d++)s=3*v[k++],q=new THREE.Vector3(x[s++],x[s++],x[s]),u.vertexNormals.push(q);p&&(p=v[k++],u.color.setHex(F[p]));if(b)for(d=0;3>d;d++)p=v[k++],u.vertexColors.push(new THREE.Color(F[p]));c.faces.push(u)}})(d);(function(){var b=void 0!==a.influencesPerVertex?a.influencesPerVertex:2;if(a.skinWeights)for(var d=0,g=a.skinWeights.length;dA&&B.clearRect(Z.min.x|0,Z.min.y|0,Z.max.x-Z.min.x|0,Z.max.y-Z.min.y|0),0R.positionScreen.z|| +function(a,b){y.set(a);A=void 0!==b?b:1;Z.min.set(-G,-I);Z.max.set(G,I)};this.setClearColorHex=function(a,b){console.warn("DEPRECATED: .setClearColorHex() is being removed. Use .setClearColor() instead.");this.setClearColor(a,b)};this.getMaxAnisotropy=function(){return 0};this.clear=function(){!1===Z.empty()&&(Z.intersect(ya),Z.expandByScalar(2),1>A&&B.clearRect(Z.min.x|0,Z.min.y|0,Z.max.x-Z.min.x|0,Z.max.y-Z.min.y|0),0R.positionScreen.z|| 1E.positionScreen.z||1da.positionScreen.z||1=O||(O*=L.intensity,M.add(Ea.multiplyScalar(O)))):L instanceof THREE.PointLight&&(Q=Da.setFromMatrixPosition(L.matrixWorld),O=m.dot(Da.subVectors(Q,D).normalize()),0>=O||(O*=0==L.distance? 1:1-Math.min(D.distanceTo(Q)/L.distance,1),0!=O&&(O*=L.intensity,M.add(Ea.multiplyScalar(O)))));fa.multiply(za).add(Ia);!0===y.wireframe?b(fa,y.wireframeLinewidth,y.wireframeLinecap,y.wireframeLinejoin):c(fa)}else y instanceof THREE.MeshBasicMaterial||y instanceof THREE.MeshLambertMaterial||y instanceof THREE.MeshPhongMaterial?null!==y.map?y.map.mapping instanceof THREE.UVMapping&&(ha=H.uvs,f(V,X,P,ga,wa,Ha,ha[0].x,ha[0].y,ha[1].x,ha[1].y,ha[2].x,ha[2].y,y.map)):null!==y.envMap?y.envMap.mapping instanceof THREE.SphericalReflectionMapping?(ja.copy(H.vertexNormalsModel[0]).applyMatrix3(ra),Oa=0.5*ja.x+0.5,Ra=0.5*ja.y+0.5,ja.copy(H.vertexNormalsModel[1]).applyMatrix3(ra),Sa=0.5*ja.x+0.5,Fa=0.5*ja.y+0.5,ja.copy(H.vertexNormalsModel[2]).applyMatrix3(ra),ia=0.5*ja.x+0.5,ma=0.5*ja.y+0.5,f(V,X,P,ga,wa,Ha,Oa,Ra,Sa,Fa,ia,ma,y.envMap)):y.envMap.mapping instanceof THREE.SphericalRefractionMapping&&(ja.copy(H.vertexNormalsModel[0]).applyMatrix3(ra),Oa=-0.5*ja.x+0.5,Ra=-0.5*ja.y+0.5,ja.copy(H.vertexNormalsModel[1]).applyMatrix3(ra), @@ -379,25 +379,25 @@ THREE.ShaderChunk.logdepthbuf_vertex,"}"].join("\n"),fragmentShader:["uniform sa THREE.ShaderChunk.logdepthbuf_fragment,"\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tgl_FragData[ 0 ] = pack_depth( gl_FragDepthEXT );\n\t#else\n\t\tgl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );\n\t#endif\n}"].join("\n")}};THREE.WebGLRenderer=function(a){function b(a,b){var c=a.vertices.length,d=b.material;if(d.attributes){void 0===a.__webglCustomAttributesList&&(a.__webglCustomAttributesList=[]);for(var e in d.attributes){var f=d.attributes[e];if(!f.__webglInitialized||f.createUniqueBuffers){f.__webglInitialized=!0;var g=1;"v2"===f.type?g=2:"v3"===f.type?g=3:"v4"===f.type?g=4:"c"===f.type&&(g=3);f.size=g;f.array=new Float32Array(c*g);f.buffer=m.createBuffer();f.buffer.belongsToAttribute=e;f.needsUpdate=!0}a.__webglCustomAttributesList.push(f)}}} function c(a,b){var c=b.geometry,g=a.faces3,h=3*g.length,k=1*g.length,l=3*g.length,g=d(b,a),p=f(g),n=e(g),r=g.vertexColors?g.vertexColors:!1;a.__vertexArray=new Float32Array(3*h);n&&(a.__normalArray=new Float32Array(3*h));c.hasTangents&&(a.__tangentArray=new Float32Array(4*h));r&&(a.__colorArray=new Float32Array(3*h));p&&(0n;n++)P.autoScaleCubemaps&&!f?(r=l,u=n,v=c.image[n],x=dc,v.width<=x&&v.height<=x||(F=Math.max(v.width,v.height),w=Math.floor(v.width*x/F),x=Math.floor(v.height*x/F),F=document.createElement("canvas"),F.width=w,F.height=x,F.getContext("2d").drawImage(v,0,0,v.width,v.height,0,0,w,x),v=F),r[u]=v):l[n]=c.image[n];n=l[0];r=THREE.Math.isPowerOfTwo(n.width)&&THREE.Math.isPowerOfTwo(n.height);u=M(c.format);v=M(c.type);A(m.TEXTURE_CUBE_MAP,c,r); -for(n=0;6>n;n++)if(f)for(x=l[n].mipmaps,F=0,y=x.length;Fn;n++)P.autoScaleCubemaps&&!f?(r=l,t=n,v=c.image[n],x=dc,v.width<=x&&v.height<=x||(F=Math.max(v.width,v.height),w=Math.floor(v.width*x/F),x=Math.floor(v.height*x/F),F=document.createElement("canvas"),F.width=w,F.height=x,F.getContext("2d").drawImage(v,0,0,v.width,v.height,0,0,w,x),v=F),r[t]=v):l[n]=c.image[n];n=l[0];r=THREE.Math.isPowerOfTwo(n.width)&&THREE.Math.isPowerOfTwo(n.height);t=M(c.format);v=M(c.type);A(m.TEXTURE_CUBE_MAP,c,r); +for(n=0;6>n;n++)if(f)for(x=l[n].mipmaps,F=0,y=x.length;F=Cb&&console.warn("WebGLRenderer: trying to use "+a+" texture units while this GPU supports only "+Cb);Ea+=1;return a}function G(a,b,c,d){a[b]=c.r*c.r*d;a[b+1]=c.g*c.g*d;a[b+2]=c.b*c.b*d}function I(a,b,c,d){a[b]=c.r*d;a[b+1]=c.g*d;a[b+2]=c.b*d}function B(a){a!==ua&&(m.lineWidth(a),ua=a)}function y(a,b,c){ya!==a&&(a?m.enable(m.POLYGON_OFFSET_FILL):m.disable(m.POLYGON_OFFSET_FILL),ya=a);!a||Z===b&&qa===c||(m.polygonOffset(b,c),Z=b,qa=c)}function A(a, b,c){c?(m.texParameteri(a,m.TEXTURE_WRAP_S,M(b.wrapS)),m.texParameteri(a,m.TEXTURE_WRAP_T,M(b.wrapT)),m.texParameteri(a,m.TEXTURE_MAG_FILTER,M(b.magFilter)),m.texParameteri(a,m.TEXTURE_MIN_FILTER,M(b.minFilter))):(m.texParameteri(a,m.TEXTURE_WRAP_S,m.CLAMP_TO_EDGE),m.texParameteri(a,m.TEXTURE_WRAP_T,m.CLAMP_TO_EDGE),m.texParameteri(a,m.TEXTURE_MAG_FILTER,L(b.magFilter)),m.texParameteri(a,m.TEXTURE_MIN_FILTER,L(b.minFilter)));db&&b.type!==THREE.FloatType&&(1d.numSupportedMorphTargets?(n.sort(q),n.length=d.numSupportedMorphTargets):n.length> -d.numSupportedMorphNormals?n.sort(q):0===n.length&&n.push([0,0]);for(p=0;pd.numSupportedMorphTargets?(n.sort(s),n.length=d.numSupportedMorphTargets):n.length> +d.numSupportedMorphNormals?n.sort(s):0===n.length&&n.push([0,0]);for(p=0;pf;f++){a.__webglFramebuffer[f]=m.createFramebuffer();a.__webglRenderbuffer[f]=m.createRenderbuffer();m.texImage2D(m.TEXTURE_CUBE_MAP_POSITIVE_X+f,0,d,a.width,a.height,0,d,e,null);var g=a,h=m.TEXTURE_CUBE_MAP_POSITIVE_X+f;m.bindFramebuffer(m.FRAMEBUFFER,a.__webglFramebuffer[f]);m.framebufferTexture2D(m.FRAMEBUFFER,m.COLOR_ATTACHMENT0,h,g.__webglTexture,0);O(a.__webglRenderbuffer[f],a)}c&&m.generateMipmap(m.TEXTURE_CUBE_MAP)}else a.__webglFramebuffer=m.createFramebuffer(), -a.__webglRenderbuffer=a.shareDepthFrom?a.shareDepthFrom.__webglRenderbuffer:m.createRenderbuffer(),m.bindTexture(m.TEXTURE_2D,a.__webglTexture),A(m.TEXTURE_2D,a,c),m.texImage2D(m.TEXTURE_2D,0,d,a.width,a.height,0,d,e,null),d=m.TEXTURE_2D,m.bindFramebuffer(m.FRAMEBUFFER,a.__webglFramebuffer),m.framebufferTexture2D(m.FRAMEBUFFER,m.COLOR_ATTACHMENT0,d,a.__webglTexture,0),a.shareDepthFrom?a.depthBuffer&&!a.stencilBuffer?m.framebufferRenderbuffer(m.FRAMEBUFFER,m.DEPTH_ATTACHMENT,m.RENDERBUFFER,a.__webglRenderbuffer): -a.depthBuffer&&a.stencilBuffer&&m.framebufferRenderbuffer(m.FRAMEBUFFER,m.DEPTH_STENCIL_ATTACHMENT,m.RENDERBUFFER,a.__webglRenderbuffer):O(a.__webglRenderbuffer,a),c&&m.generateMipmap(m.TEXTURE_2D);b?m.bindTexture(m.TEXTURE_CUBE_MAP,null):m.bindTexture(m.TEXTURE_2D,null);m.bindRenderbuffer(m.RENDERBUFFER,null);m.bindFramebuffer(m.FRAMEBUFFER,null)}a?(b=b?a.__webglFramebuffer[a.activeCubeFace]:a.__webglFramebuffer,c=a.width,a=a.height,e=d=0):(b=null,c=Da,a=Ja,d=Ca,e=va);b!==Ha&&(m.bindFramebuffer(m.FRAMEBUFFER, -b),m.viewport(d,e,c,a),Ha=b);ja=c;ra=a};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)};THREE.WebGLRenderTarget=function(a,b,c){this.width=a;this.height=b;c=c||{};this.wrapS=void 0!==c.wrapS?c.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=void 0!==c.wrapT?c.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=void 0!==c.magFilter?c.magFilter:THREE.LinearFilter;this.minFilter=void 0!==c.minFilter?c.minFilter:THREE.LinearMipMapLinearFilter;this.anisotropy=void 0!==c.anisotropy?c.anisotropy:1;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.format=void 0!==c.format?c.format: +0,k=g.length;hf;f++){a.__webglFramebuffer[f]=m.createFramebuffer();a.__webglRenderbuffer[f]=m.createRenderbuffer();m.texImage2D(m.TEXTURE_CUBE_MAP_POSITIVE_X+f,0,d,a.width,a.height,0,d,e,null);var g=a,h=m.TEXTURE_CUBE_MAP_POSITIVE_X+f;m.bindFramebuffer(m.FRAMEBUFFER,a.__webglFramebuffer[f]);m.framebufferTexture2D(m.FRAMEBUFFER,m.COLOR_ATTACHMENT0,h,g.__webglTexture, +0);O(a.__webglRenderbuffer[f],a)}c&&m.generateMipmap(m.TEXTURE_CUBE_MAP)}else a.__webglFramebuffer=m.createFramebuffer(),a.__webglRenderbuffer=a.shareDepthFrom?a.shareDepthFrom.__webglRenderbuffer:m.createRenderbuffer(),m.bindTexture(m.TEXTURE_2D,a.__webglTexture),A(m.TEXTURE_2D,a,c),m.texImage2D(m.TEXTURE_2D,0,d,a.width,a.height,0,d,e,null),d=m.TEXTURE_2D,m.bindFramebuffer(m.FRAMEBUFFER,a.__webglFramebuffer),m.framebufferTexture2D(m.FRAMEBUFFER,m.COLOR_ATTACHMENT0,d,a.__webglTexture,0),a.shareDepthFrom? +a.depthBuffer&&!a.stencilBuffer?m.framebufferRenderbuffer(m.FRAMEBUFFER,m.DEPTH_ATTACHMENT,m.RENDERBUFFER,a.__webglRenderbuffer):a.depthBuffer&&a.stencilBuffer&&m.framebufferRenderbuffer(m.FRAMEBUFFER,m.DEPTH_STENCIL_ATTACHMENT,m.RENDERBUFFER,a.__webglRenderbuffer):O(a.__webglRenderbuffer,a),c&&m.generateMipmap(m.TEXTURE_2D);b?m.bindTexture(m.TEXTURE_CUBE_MAP,null):m.bindTexture(m.TEXTURE_2D,null);m.bindRenderbuffer(m.RENDERBUFFER,null);m.bindFramebuffer(m.FRAMEBUFFER,null)}a?(b=b?a.__webglFramebuffer[a.activeCubeFace]: +a.__webglFramebuffer,c=a.width,a=a.height,e=d=0):(b=null,c=Da,a=Ja,d=Ca,e=va);b!==Ha&&(m.bindFramebuffer(m.FRAMEBUFFER,b),m.viewport(d,e,c,a),Ha=b);ja=c;ra=a};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)};THREE.WebGLRenderTarget=function(a,b,c){this.width=a;this.height=b;c=c||{};this.wrapS=void 0!==c.wrapS?c.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=void 0!==c.wrapT?c.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=void 0!==c.magFilter?c.magFilter:THREE.LinearFilter;this.minFilter=void 0!==c.minFilter?c.minFilter:THREE.LinearMipMapLinearFilter;this.anisotropy=void 0!==c.anisotropy?c.anisotropy:1;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.format=void 0!==c.format?c.format: THREE.RGBAFormat;this.type=void 0!==c.type?c.type:THREE.UnsignedByteType;this.depthBuffer=void 0!==c.depthBuffer?c.depthBuffer:!0;this.stencilBuffer=void 0!==c.stencilBuffer?c.stencilBuffer:!0;this.generateMipmaps=!0;this.shareDepthFrom=null}; THREE.WebGLRenderTarget.prototype={constructor:THREE.WebGLRenderTarget,setSize:function(a,b){this.width=a;this.height=b},clone:function(){var a=new THREE.WebGLRenderTarget(this.width,this.height);a.wrapS=this.wrapS;a.wrapT=this.wrapT;a.magFilter=this.magFilter;a.minFilter=this.minFilter;a.anisotropy=this.anisotropy;a.offset.copy(this.offset);a.repeat.copy(this.repeat);a.format=this.format;a.type=this.type;a.depthBuffer=this.depthBuffer;a.stencilBuffer=this.stencilBuffer;a.generateMipmaps=this.generateMipmaps; -a.shareDepthFrom=this.shareDepthFrom;return a},dispose:function(){this.dispatchEvent({type:"dispose"})}};THREE.EventDispatcher.prototype.apply(THREE.WebGLRenderTarget.prototype);THREE.WebGLRenderTargetCube=function(a,b,c){THREE.WebGLRenderTarget.call(this,a,b,c);this.activeCubeFace=0};THREE.WebGLRenderTargetCube.prototype=Object.create(THREE.WebGLRenderTarget.prototype);THREE.WebGLProgram=function(){var a=0;return function(b,c,d,e){var f=b.context,g=d.fragmentShader,h=d.vertexShader,k=d.uniforms,l=d.attributes,p=d.defines,q=d.index0AttributeName;void 0===q&&!0===e.morphTargets&&(q="position");var r="SHADOWMAP_TYPE_BASIC";e.shadowMapType===THREE.PCFShadowMap?r="SHADOWMAP_TYPE_PCF":e.shadowMapType===THREE.PCFSoftShadowMap&&(r="SHADOWMAP_TYPE_PCF_SOFT");var s,t;s=[];for(var n in p)t=p[n],!1!==t&&(t="#define "+n+" "+t,s.push(t));s=s.join("\n");p=f.createProgram();d instanceof -THREE.RawShaderMaterial?b=d="":(d=["precision "+e.precision+" float;","precision "+e.precision+" int;",s,e.supportsVertexTextures?"#define VERTEX_TEXTURES":"",b.gammaInput?"#define GAMMA_INPUT":"",b.gammaOutput?"#define GAMMA_OUTPUT":"","#define MAX_DIR_LIGHTS "+e.maxDirLights,"#define MAX_POINT_LIGHTS "+e.maxPointLights,"#define MAX_SPOT_LIGHTS "+e.maxSpotLights,"#define MAX_HEMI_LIGHTS "+e.maxHemiLights,"#define MAX_SHADOWS "+e.maxShadows,"#define MAX_BONES "+e.maxBones,e.map?"#define USE_MAP": +a.shareDepthFrom=this.shareDepthFrom;return a},dispose:function(){this.dispatchEvent({type:"dispose"})}};THREE.EventDispatcher.prototype.apply(THREE.WebGLRenderTarget.prototype);THREE.WebGLRenderTargetCube=function(a,b,c){THREE.WebGLRenderTarget.call(this,a,b,c);this.activeCubeFace=0};THREE.WebGLRenderTargetCube.prototype=Object.create(THREE.WebGLRenderTarget.prototype);THREE.WebGLProgram=function(){var a=0;return function(b,c,d,e){var f=b.context,g=d.fragmentShader,h=d.vertexShader,k=d.uniforms,l=d.attributes,p=d.defines,s=d.index0AttributeName;void 0===s&&!0===e.morphTargets&&(s="position");var r="SHADOWMAP_TYPE_BASIC";e.shadowMapType===THREE.PCFShadowMap?r="SHADOWMAP_TYPE_PCF":e.shadowMapType===THREE.PCFSoftShadowMap&&(r="SHADOWMAP_TYPE_PCF_SOFT");var u,q;u=[];for(var n in p)q=p[n],!1!==q&&(q="#define "+n+" "+q,u.push(q));u=u.join("\n");p=f.createProgram();d instanceof +THREE.RawShaderMaterial?b=d="":(d=["precision "+e.precision+" float;","precision "+e.precision+" int;",u,e.supportsVertexTextures?"#define VERTEX_TEXTURES":"",b.gammaInput?"#define GAMMA_INPUT":"",b.gammaOutput?"#define GAMMA_OUTPUT":"","#define MAX_DIR_LIGHTS "+e.maxDirLights,"#define MAX_POINT_LIGHTS "+e.maxPointLights,"#define MAX_SPOT_LIGHTS "+e.maxSpotLights,"#define MAX_HEMI_LIGHTS "+e.maxHemiLights,"#define MAX_SHADOWS "+e.maxShadows,"#define MAX_BONES "+e.maxBones,e.map?"#define USE_MAP": "",e.envMap?"#define USE_ENVMAP":"",e.lightMap?"#define USE_LIGHTMAP":"",e.bumpMap?"#define USE_BUMPMAP":"",e.normalMap?"#define USE_NORMALMAP":"",e.specularMap?"#define USE_SPECULARMAP":"",e.vertexColors?"#define USE_COLOR":"",e.skinning?"#define USE_SKINNING":"",e.useVertexTexture?"#define BONE_TEXTURE":"",e.morphTargets?"#define USE_MORPHTARGETS":"",e.morphNormals?"#define USE_MORPHNORMALS":"",e.wrapAround?"#define WRAP_AROUND":"",e.doubleSided?"#define DOUBLE_SIDED":"",e.flipSided?"#define FLIP_SIDED": "",e.shadowMapEnabled?"#define USE_SHADOWMAP":"",e.shadowMapEnabled?"#define "+r:"",e.shadowMapDebug?"#define SHADOWMAP_DEBUG":"",e.shadowMapCascade?"#define SHADOWMAP_CASCADE":"",e.sizeAttenuation?"#define USE_SIZEATTENUATION":"",e.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"","uniform mat4 modelMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec2 uv;\nattribute vec2 uv2;\n#ifdef USE_COLOR\n\tattribute vec3 color;\n#endif\n#ifdef USE_MORPHTARGETS\n\tattribute vec3 morphTarget0;\n\tattribute vec3 morphTarget1;\n\tattribute vec3 morphTarget2;\n\tattribute vec3 morphTarget3;\n\t#ifdef USE_MORPHNORMALS\n\t\tattribute vec3 morphNormal0;\n\t\tattribute vec3 morphNormal1;\n\t\tattribute vec3 morphNormal2;\n\t\tattribute vec3 morphNormal3;\n\t#else\n\t\tattribute vec3 morphTarget4;\n\t\tattribute vec3 morphTarget5;\n\t\tattribute vec3 morphTarget6;\n\t\tattribute vec3 morphTarget7;\n\t#endif\n#endif\n#ifdef USE_SKINNING\n\tattribute vec4 skinIndex;\n\tattribute vec4 skinWeight;\n#endif\n"].join("\n"), -b=["precision "+e.precision+" float;","precision "+e.precision+" int;",e.bumpMap||e.normalMap?"#extension GL_OES_standard_derivatives : enable":"",s,"#define MAX_DIR_LIGHTS "+e.maxDirLights,"#define MAX_POINT_LIGHTS "+e.maxPointLights,"#define MAX_SPOT_LIGHTS "+e.maxSpotLights,"#define MAX_HEMI_LIGHTS "+e.maxHemiLights,"#define MAX_SHADOWS "+e.maxShadows,e.alphaTest?"#define ALPHATEST "+e.alphaTest:"",b.gammaInput?"#define GAMMA_INPUT":"",b.gammaOutput?"#define GAMMA_OUTPUT":"",e.useFog&&e.fog?"#define USE_FOG": +b=["precision "+e.precision+" float;","precision "+e.precision+" int;",e.bumpMap||e.normalMap?"#extension GL_OES_standard_derivatives : enable":"",u,"#define MAX_DIR_LIGHTS "+e.maxDirLights,"#define MAX_POINT_LIGHTS "+e.maxPointLights,"#define MAX_SPOT_LIGHTS "+e.maxSpotLights,"#define MAX_HEMI_LIGHTS "+e.maxHemiLights,"#define MAX_SHADOWS "+e.maxShadows,e.alphaTest?"#define ALPHATEST "+e.alphaTest:"",b.gammaInput?"#define GAMMA_INPUT":"",b.gammaOutput?"#define GAMMA_OUTPUT":"",e.useFog&&e.fog?"#define USE_FOG": "",e.useFog&&e.fogExp?"#define FOG_EXP2":"",e.map?"#define USE_MAP":"",e.envMap?"#define USE_ENVMAP":"",e.lightMap?"#define USE_LIGHTMAP":"",e.bumpMap?"#define USE_BUMPMAP":"",e.normalMap?"#define USE_NORMALMAP":"",e.specularMap?"#define USE_SPECULARMAP":"",e.vertexColors?"#define USE_COLOR":"",e.metal?"#define METAL":"",e.wrapAround?"#define WRAP_AROUND":"",e.doubleSided?"#define DOUBLE_SIDED":"",e.flipSided?"#define FLIP_SIDED":"",e.shadowMapEnabled?"#define USE_SHADOWMAP":"",e.shadowMapEnabled? -"#define "+r:"",e.shadowMapDebug?"#define SHADOWMAP_DEBUG":"",e.shadowMapCascade?"#define SHADOWMAP_CASCADE":"",e.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"","uniform mat4 viewMatrix;\nuniform vec3 cameraPosition;\n"].join("\n"));h=new THREE.WebGLShader(f,f.VERTEX_SHADER,d+h);g=new THREE.WebGLShader(f,f.FRAGMENT_SHADER,b+g);f.attachShader(p,h);f.attachShader(p,g);void 0!==q&&f.bindAttribLocation(p,0,q);f.linkProgram(p);!1===f.getProgramParameter(p,f.LINK_STATUS)&&(console.error("Could not initialise shader"), -console.error("gl.VALIDATE_STATUS",f.getProgramParameter(p,f.VALIDATE_STATUS)),console.error("gl.getError()",f.getError()));""!==f.getProgramInfoLog(p)&&console.error("gl.getProgramInfoLog()",f.getProgramInfoLog(p));f.deleteShader(h);f.deleteShader(g);q="viewMatrix modelViewMatrix projectionMatrix normalMatrix modelMatrix cameraPosition morphTargetInfluences".split(" ");e.useVertexTexture?(q.push("boneTexture"),q.push("boneTextureWidth"),q.push("boneTextureHeight")):q.push("boneGlobalMatrices");e.logarithmicDepthBuffer&& -q.push("logDepthBufFC");for(var v in k)q.push(v);k=q;v={};q=0;for(b=k.length;qa?b(c,e-1):l[e]a?b(c,e-1):l[e]>8&255,l>>16&255,l>>24&255)),e}e.mipmapCount=1;k[2]&131072&&!1!==b&&(e.mipmapCount=Math.max(1,k[7]));e.isCubemap=k[28]&512?!0:!1;e.width=k[4];e.height=k[3];for(var k=k[1]+4,g=e.width,h=e.height,l=e.isCubemap?6:1,q=0;qq-1?0:q-1,s=q+1>e-1?e-1:q+1,t=0>p-1?0:p-1,n=p+1>d-1?d-1:p+1,v=[],w=[0,0,h[4*(q*d+p)]/255*b];v.push([-1,0,h[4*(q*d+t)]/255*b]);v.push([-1,-1,h[4*(r*d+t)]/255*b]);v.push([0,-1,h[4*(r*d+p)]/255*b]);v.push([1,-1,h[4*(r*d+n)]/255*b]);v.push([1,0,h[4*(q*d+n)]/255*b]);v.push([1,1,h[4*(s*d+n)]/255*b]);v.push([0,1,h[4*(s*d+p)]/255*b]);v.push([-1,1,h[4*(s*d+t)]/255*b]);r=[];t=v.length;for(s=0;s +a.length&&console.error("ImageUtils::decodeTGA()- Not enough data to contain header.");var b=new Uint8Array(a),c=0,d={id_length:b[c++],colormap_type:b[c++],image_type:b[c++],colormap_index:b[c++]|b[c++]<<8,colormap_length:b[c++]|b[c++]<<8,colormap_size:b[c++],origin:[b[c++]|b[c++]<<8,b[c++]|b[c++]<<8],width:b[c++]|b[c++]<<8,height:b[c++]|b[c++]<<8,pixel_size:b[c++],flags:b[c++]};(function(a){switch(a.image_type){case 1:case 9:(256=a.width||0>=a.height)&&console.error("ImageUtils::tgaCheckHeader() - Invalid image size");8!==a.pixel_size&&16!==a.pixel_size&&24!==a.pixel_size&&32!==a.pixel_size&&console.error('ImageUtils::tgaCheckHeader() - Invalid pixel size "'+ +a.pixel_size+'"')})(d);d.id_length+c>a.length&&console.error("ImageUtils::load() - No data");var c=c+d.id_length,e=a=!1,f=!1;switch(d.image_type){case 9:e=a=!0;break;case 1:e=!0;break;case 10:a=!0;break;case 11:f=a=!0;break;case 3:f=!0}b=function(a,b,c,d,e){var f,r,u;f=c.pixel_size>>3;r=c.width*c.height*f;b&&(u=e.subarray(d,d+=3*c.colormap_length));if(a){a=new Uint8Array(r);var q;c=0;for(var n=new Uint8Array(f);c>4){default:case 2:p=0;s=1;u=a;a=0;r=1;q=b;break;case 0:p=0;s=1;u=a;a=b-1;q=r=-1;break;case 3:p=a-1;u=s=-1;a=0;r=1;q=b;break;case 1:p=a-1,u=s=-1,a=b-1,q=r=-1}if(f)switch(d.pixel_size){case 8:e=r;b=q;q=0;var t,w;r=d.width;for(w=a;w!==b;w+=e)for(t=p;t!==u;t+=s,q++)a=c[q],n[4* +(t+r*w)+0]=a,n[4*(t+r*w)+1]=a,n[4*(t+r*w)+2]=a,n[4*(t+r*w)+3]=255;break;case 16:e=r;b=q;q=0;r=d.width;for(t=a;t!==b;t+=e)for(a=p;a!==u;a+=s,q+=2)n[4*(a+r*t)+0]=c[q+0],n[4*(a+r*t)+1]=c[q+0],n[4*(a+r*t)+2]=c[q+0],n[4*(a+r*t)+3]=c[q+1];break;default:console.error("ImageUtils::getTgaRGBA() - not support this format")}else switch(d.pixel_size){case 8:b=r;r=0;var v;t=d.width;for(v=a;v!==q;v+=b)for(w=p;w!==u;w+=s,r++)a=c[r],n[4*(w+t*v)+3]=255,n[4*(w+t*v)+2]=e[3*a+0],n[4*(w+t*v)+1]=e[3*a+1],n[4*(w+t*v)+0]= +e[3*a+2];break;case 16:e=r;b=q;q=0;r=d.width;for(w=a;w!==b;w+=e)for(t=p;t!==u;t+=s,q+=2)a=c[q+0]+(c[q+1]<<8),n[4*(t+r*w)+0]=(a&31744)>>7,n[4*(t+r*w)+1]=(a&992)>>2,n[4*(t+r*w)+2]=(a&31)>>3,n[4*(t+r*w)+3]=a&32768?0:255;break;case 24:e=r;b=q;q=0;r=d.width;for(t=a;t!==b;t+=e)for(a=p;a!==u;a+=s,q+=3)n[4*(a+r*t)+3]=255,n[4*(a+r*t)+2]=c[q+0],n[4*(a+r*t)+1]=c[q+1],n[4*(a+r*t)+0]=c[q+2];break;case 32:e=r;b=q;q=0;r=d.width;for(t=a;t!==b;t+=e)for(a=p;a!==u;a+=s,q+=4)n[4*(a+r*t)+2]=c[q+0],n[4*(a+r*t)+1]=c[q+ +1],n[4*(a+r*t)+0]=c[q+2],n[4*(a+r*t)+3]=c[q+3];break;default:console.error("ImageUtils::getTgaRGBA() - not support this format")}return n}(d.width,d.height,b.pixel_data,b.palettes);return{width:d.width,height:d.height,data:b}},loadTGATexture:function(a,b,c,d){var e=new THREE.TGATexture;b=new XMLHttpRequest;b.open("GET",a,!0);b.responseType="arraybuffer";b.onload=function(){if(200===this.status){var b=THREE.ImageUtils.decodeTGA(this.response);if(b)return e.image=b,e.sourceFile=a,e.needsUpdate=!0,e}}; +b.addEventListener("load",function(a){c&&c(e)},!1);b.addEventListener("error",function(a){d&&d(a)},!1);b.send(null);e.sourceFile=a;return e},loadDDSTexture:function(a,b,c,d){var e=[];e.loadCount=0;var f=new THREE.CompressedTexture;f.image=e;void 0!==b&&(f.mapping=b);f.flipY=!1;f.generateMipmaps=!1;var g=new XMLHttpRequest;g.onload=function(){var a=THREE.ImageUtils.parseDDS(g.response,!0);if(a.isCubemap)for(var b=a.mipmaps.length/a.mipmapCount,d=0;d>8&255,l>>16&255,l>>24&255)),e}e.mipmapCount=1;k[2]&131072&&!1!==b&&(e.mipmapCount=Math.max(1,k[7]));e.isCubemap=k[28]&512?!0:!1;e.width=k[4]; +e.height=k[3];for(var k=k[1]+4,g=e.width,h=e.height,l=e.isCubemap?6:1,s=0;ss-1?0:s-1,u=s+1>e-1?e-1:s+1,q=0>p-1?0:p-1,n=p+1>d-1?d-1:p+1,t=[],w=[0,0,h[4*(s*d+p)]/255*b];t.push([-1,0,h[4*(s*d+q)]/255*b]);t.push([-1,-1,h[4*(r*d+q)]/255*b]);t.push([0,-1,h[4*(r*d+p)]/255*b]);t.push([1,-1,h[4*(r*d+n)]/255*b]);t.push([1,0,h[4*(s*d+n)]/255*b]);t.push([1,1,h[4*(u*d+n)]/255*b]);t.push([0,1,h[4*(u*d+p)]/255* +b]);t.push([-1,1,h[4*(u*d+q)]/255*b]);r=[];q=t.length;for(u=0;ue)return null;var f=[],g=[],h=[],k,l,p;if(0=q--){console.log("Warning, unable to triangulate polygon!");break}k=l;e<=k&&(k=0);l=k+1;e<=l&&(l=0);p=l+1;e<=p&&(p=0);var r;a:{var s=r=void 0,t=void 0,n=void 0,v=void 0,w=void 0,u=void 0,x=void 0,F= -void 0,s=a[g[k]].x,t=a[g[k]].y,n=a[g[l]].x,v=a[g[l]].y,w=a[g[p]].x,u=a[g[p]].y;if(1E-10>(n-s)*(u-t)-(v-t)*(w-s))r=!1;else{var C=void 0,D=void 0,z=void 0,G=void 0,I=void 0,B=void 0,y=void 0,A=void 0,O=void 0,L=void 0,O=A=y=F=x=void 0,C=w-n,D=u-v,z=s-w,G=t-u,I=n-s,B=v-t;for(r=0;re)return null;var f=[],g=[],h=[],k,l,p;if(0=s--){console.log("Warning, unable to triangulate polygon!");break}k=l;e<=k&&(k=0);l=k+1;e<=l&&(l=0);p=l+1;e<=p&&(p=0);var r;a:{var u=r=void 0,q=void 0,n=void 0,t=void 0,w=void 0,v=void 0,x=void 0,F= +void 0,u=a[g[k]].x,q=a[g[k]].y,n=a[g[l]].x,t=a[g[l]].y,w=a[g[p]].x,v=a[g[p]].y;if(1E-10>(n-u)*(v-q)-(t-q)*(w-u))r=!1;else{var C=void 0,D=void 0,z=void 0,G=void 0,I=void 0,B=void 0,y=void 0,A=void 0,O=void 0,L=void 0,O=A=y=F=x=void 0,C=w-n,D=v-t,z=u-w,G=q-v,I=n-u,B=t-q;for(r=0;rk)g=d+1;else if(0b&&(b=0);1=b)return b=c[a]-b,a=this.curves[a],b=1-b/a.getLength(),a.getPointAt(b);a++}return null};THREE.CurvePath.prototype.getLength=function(){var a=this.getCurveLengths();return a[a.length-1]}; THREE.CurvePath.prototype.getCurveLengths=function(){if(this.cacheLengths&&this.cacheLengths.length==this.curves.length)return this.cacheLengths;var a=[],b=0,c,d=this.curves.length;for(c=0;cb?b=h.x:h.xc?c=h.y:h.yd?d=h.z:h.zb?b=h.x:h.xc?c=h.y:h.yd?d=h.z:h.zMath.abs(d.x-c[0].x)&&1E-10>Math.abs(d.y-c[0].y)&&c.splice(c.length-1,1);b&&c.push(c[0]);return c}; +THREE.Path.prototype.getPoints=function(a,b){if(this.useSpacedPoints)return console.log("tata"),this.getSpacedPoints(a,b);a=a||12;var c=[],d,e,f,g,h,k,l,p,s,r,u,q,n;d=0;for(e=this.actions.length;dMath.abs(d.x-c[0].x)&&1E-10>Math.abs(d.y-c[0].y)&&c.splice(c.length-1,1);b&&c.push(c[0]);return c}; THREE.Path.prototype.toShapes=function(a,b){function c(a){for(var b=[],c=0,d=a.length;cl&&(g=b[f],k=-k,h=b[e],l=-l),!(a.yh.y))if(a.y==g.y){if(a.x==g.x)return!0}else{e=l*(a.x-g.x)-k*(a.y-g.y);if(0==e)return!0;0>e||(d=!d)}}else if(a.y==g.y&&(h.x<=a.x&&a.x<=g.x||g.x<=a.x&&a.x<= h.x))return!0}return d}var e=function(a){var b,c,d,e,f=[],g=new THREE.Path;b=0;for(c=a.length;bG||G>z)return[];k=l*p-k*q;if(0>k||k>z)return[]}else{if(0d?[]:k==d?f?[]:[g]:a<=d?[g,h]: +THREE.Shape.Utils={triangulateShape:function(a,b){function c(a,b,c){return a.x!=b.x?a.xG||G>z)return[];k=l*p-k*s;if(0>k||k>z)return[]}else{if(0d?[]:k==d?f?[]:[g]:a<=d?[g,h]: [g,l]}function e(a,b,c,d){var e=b.x-a.x,f=b.y-a.y;b=c.x-a.x;c=c.y-a.y;var g=d.x-a.x;d=d.y-a.y;a=e*c-f*b;e=e*d-f*g;return 1E-10f&&(f=d);var g=a+1;g>d&&(g=0);d=e(h[a],h[f],h[g],k[b]);if(!d)return!1; -d=k.length-1;f=b-1;0>f&&(f=d);g=b+1;g>d&&(g=0);return(d=e(k[b],k[f],k[g],h[a]))?!0:!1}function f(a,b){var c,e;for(c=0;cL){console.log("Infinite Loop! Holes left:"+ -l.length+", Probably Hole outside Shape!");break}for(q=B;qh;h++)l=k[h].x+":"+k[h].y, -l=p[l],void 0!==l&&(k[h]=l);return q.concat()},isClockWise:function(a){return 0>THREE.FontUtils.Triangulate.area(a)},b2p0:function(a,b){var c=1-a;return c*c*b},b2p1:function(a,b){return 2*(1-a)*a*b},b2p2:function(a,b){return a*a*b},b2:function(a,b,c,d){return this.b2p0(a,b)+this.b2p1(a,c)+this.b2p2(a,d)},b3p0:function(a,b){var c=1-a;return c*c*c*b},b3p1:function(a,b){var c=1-a;return 3*c*c*a*b},b3p2:function(a,b){return 3*(1-a)*a*a*b},b3p3:function(a,b){return a*a*a*b},b3:function(a,b,c,d,e){return this.b3p0(a, +d=k.length-1;f=b-1;0>f&&(f=d);g=b+1;g>d&&(g=0);return(d=e(k[b],k[f],k[g],h[a]))?!0:!1}function f(a,b){var c,e;for(c=0;cL){console.log("Infinite Loop! Holes left:"+ +l.length+", Probably Hole outside Shape!");break}for(s=B;sh;h++)l=k[h].x+":"+k[h].y, +l=p[l],void 0!==l&&(k[h]=l);return s.concat()},isClockWise:function(a){return 0>THREE.FontUtils.Triangulate.area(a)},b2p0:function(a,b){var c=1-a;return c*c*b},b2p1:function(a,b){return 2*(1-a)*a*b},b2p2:function(a,b){return a*a*b},b2:function(a,b,c,d){return this.b2p0(a,b)+this.b2p1(a,c)+this.b2p2(a,d)},b3p0:function(a,b){var c=1-a;return c*c*c*b},b3p1:function(a,b){var c=1-a;return 3*c*c*a*b},b3p2:function(a,b){return 3*(1-a)*a*a*b},b3p3:function(a,b){return a*a*a*b},b3:function(a,b,c,d,e){return this.b3p0(a, b)+this.b3p1(a,c)+this.b3p2(a,d)+this.b3p3(a,e)}};THREE.LineCurve=function(a,b){this.v1=a;this.v2=b};THREE.LineCurve.prototype=Object.create(THREE.Curve.prototype);THREE.LineCurve.prototype.getPoint=function(a){var b=this.v2.clone().sub(this.v1);b.multiplyScalar(a).add(this.v1);return b};THREE.LineCurve.prototype.getPointAt=function(a){return this.getPoint(a)};THREE.LineCurve.prototype.getTangent=function(a){return this.v2.clone().sub(this.v1).normalize()};THREE.QuadraticBezierCurve=function(a,b,c){this.v0=a;this.v1=b;this.v2=c};THREE.QuadraticBezierCurve.prototype=Object.create(THREE.Curve.prototype);THREE.QuadraticBezierCurve.prototype.getPoint=function(a){var b;b=THREE.Shape.Utils.b2(a,this.v0.x,this.v1.x,this.v2.x);a=THREE.Shape.Utils.b2(a,this.v0.y,this.v1.y,this.v2.y);return new THREE.Vector2(b,a)}; THREE.QuadraticBezierCurve.prototype.getTangent=function(a){var b;b=THREE.Curve.Utils.tangentQuadraticBezier(a,this.v0.x,this.v1.x,this.v2.x);a=THREE.Curve.Utils.tangentQuadraticBezier(a,this.v0.y,this.v1.y,this.v2.y);b=new THREE.Vector2(b,a);b.normalize();return b};THREE.CubicBezierCurve=function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d};THREE.CubicBezierCurve.prototype=Object.create(THREE.Curve.prototype);THREE.CubicBezierCurve.prototype.getPoint=function(a){var b;b=THREE.Shape.Utils.b3(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);a=THREE.Shape.Utils.b3(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);return new THREE.Vector2(b,a)}; THREE.CubicBezierCurve.prototype.getTangent=function(a){var b;b=THREE.Curve.Utils.tangentCubicBezier(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);a=THREE.Curve.Utils.tangentCubicBezier(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);b=new THREE.Vector2(b,a);b.normalize();return b};THREE.SplineCurve=function(a){this.points=void 0==a?[]:a};THREE.SplineCurve.prototype=Object.create(THREE.Curve.prototype);THREE.SplineCurve.prototype.getPoint=function(a){var b=new THREE.Vector2,c=[],d=this.points,e;e=(d.length-1)*a;a=Math.floor(e);e-=a;c[0]=0==a?a:a-1;c[1]=a;c[2]=a>d.length-2?d.length-1:a+1;c[3]=a>d.length-3?d.length-1:a+2;b.x=THREE.Curve.Utils.interpolate(d[c[0]].x,d[c[1]].x,d[c[2]].x,d[c[3]].x,e);b.y=THREE.Curve.Utils.interpolate(d[c[0]].y,d[c[1]].y,d[c[2]].y,d[c[3]].y,e);return b};THREE.EllipseCurve=function(a,b,c,d,e,f,g){this.aX=a;this.aY=b;this.xRadius=c;this.yRadius=d;this.aStartAngle=e;this.aEndAngle=f;this.aClockwise=g};THREE.EllipseCurve.prototype=Object.create(THREE.Curve.prototype); @@ -581,12 +588,12 @@ d[c[1]].z,d[c[2]].z,d[c[3]].z,e);return b});THREE.AnimationHandler={LINEAR:0,CAT THREE.Animation.prototype.stop=function(){this.isPlaying=!1;THREE.AnimationHandler.stop(this)}; THREE.Animation.prototype.reset=function(){for(var a=0,b=this.hierarchy.length;ad;d++){for(var e=this.keyTypes[d],f=this.data.hierarchy[a].keys[0],g=this.getNextKeyWith(e,a,1);g.timef.index;)f=g,g=this.getNextKeyWith(e,a,g.index+1);c.prevKey[e]=f;c.nextKey[e]=g}}}; -THREE.Animation.prototype.update=function(){var a=[],b=new THREE.Vector3,c=new THREE.Vector3,d=new THREE.Quaternion,e=function(a,b){var c=[],d=[],e,q,r,s,t,n;e=(a.length-1)*b;q=Math.floor(e);e-=q;c[0]=0===q?q:q-1;c[1]=q;c[2]=q>a.length-2?q:q+1;c[3]=q>a.length-3?q:q+2;q=a[c[0]];s=a[c[1]];t=a[c[2]];n=a[c[3]];c=e*e;r=e*c;d[0]=f(q[0],s[0],t[0],n[0],e,c,r);d[1]=f(q[1],s[1],t[1],n[1],e,c,r);d[2]=f(q[2],s[2],t[2],n[2],e,c,r);return d},f=function(a,b,c,d,e,f,r){a=0.5*(c-a);d=0.5*(d-b);return(2*(b-c)+a+d)* -r+(-3*(b-c)-2*a-d)*f+a*e+b};return function(f){if(!1!==this.isPlaying&&(this.currentTime+=f*this.timeScale,0!==this.weight)){var h;f=this.data.length;if(!0===this.loop&&this.currentTime>f)this.currentTime%=f,this.reset();else if(!1===this.loop&&this.currentTime>f){this.stop();return}f=0;for(var k=this.hierarchy.length;fq;q++){h=this.keyTypes[q];var r=p.prevKey[h],s=p.nextKey[h];if(s.time<=this.currentTime){r=this.data.hierarchy[f].keys[0]; -for(s=this.getNextKeyWith(h,f,1);s.timer.index;)r=s,s=this.getNextKeyWith(h,f,s.index+1);p.prevKey[h]=r;p.nextKey[h]=s}l.matrixAutoUpdate=!0;l.matrixWorldNeedsUpdate=!0;var t=(this.currentTime-r.time)/(s.time-r.time),n=r[h],v=s[h];0>t&&(t=0);1a.length-2?s:s+1;c[3]=s>a.length-3?s:s+2;s=a[c[0]];u=a[c[1]];q=a[c[2]];n=a[c[3]];c=e*e;r=e*c;d[0]=f(s[0],u[0],q[0],n[0],e,c,r);d[1]=f(s[1],u[1],q[1],n[1],e,c,r);d[2]=f(s[2],u[2],q[2],n[2],e,c,r);return d},f=function(a,b,c,d,e,f,r){a=0.5*(c-a);d=0.5*(d-b);return(2*(b-c)+a+d)* +r+(-3*(b-c)-2*a-d)*f+a*e+b};return function(f){if(!1!==this.isPlaying&&(this.currentTime+=f*this.timeScale,0!==this.weight)){var h;f=this.data.length;if(!0===this.loop&&this.currentTime>f)this.currentTime%=f,this.reset();else if(!1===this.loop&&this.currentTime>f){this.stop();return}f=0;for(var k=this.hierarchy.length;fs;s++){h=this.keyTypes[s];var r=p.prevKey[h],u=p.nextKey[h];if(u.time<=this.currentTime){r=this.data.hierarchy[f].keys[0]; +for(u=this.getNextKeyWith(h,f,1);u.timer.index;)r=u,u=this.getNextKeyWith(h,f,u.index+1);p.prevKey[h]=r;p.nextKey[h]=u}l.matrixAutoUpdate=!0;l.matrixWorldNeedsUpdate=!0;var q=(this.currentTime-r.time)/(u.time-r.time),n=r[h],t=u[h];0>q&&(q=0);1=e)return new THREE.Vector2(c,a);e=Math.sqrt(e/2)}else a=!1,1E-10e?-1E-10>g&& -(a=!0):d(f)==d(h)&&(a=!0),a?(c=-f,a=e,e=Math.sqrt(k)):(c=e,a=f,e=Math.sqrt(k/2));return new THREE.Vector2(c/e,a/e)}function e(c,d){var e,f;for(E=c.length;0<=--E;){e=E;f=E-1;0>f&&(f=c.length-1);for(var g=0,h=s+2*p,g=0;gMath.abs(c-k)?[new THREE.Vector2(b,1-e),new THREE.Vector2(d,1-f),new THREE.Vector2(l,1-g),new THREE.Vector2(q,1-a)]:[new THREE.Vector2(c,1-e),new THREE.Vector2(k,1-f),new THREE.Vector2(p,1-g),new THREE.Vector2(r,1-a)]}};THREE.ExtrudeGeometry.__v1=new THREE.Vector2;THREE.ExtrudeGeometry.__v2=new THREE.Vector2;THREE.ExtrudeGeometry.__v3=new THREE.Vector2;THREE.ExtrudeGeometry.__v4=new THREE.Vector2; +(a=!0):d(f)==d(h)&&(a=!0),a?(c=-f,a=e,e=Math.sqrt(k)):(c=e,a=f,e=Math.sqrt(k/2));return new THREE.Vector2(c/e,a/e)}function e(c,d){var e,f;for(E=c.length;0<=--E;){e=E;f=E-1;0>f&&(f=c.length-1);for(var g=0,h=u+2*p,g=0;gMath.abs(c-k)?[new THREE.Vector2(b,1-e),new THREE.Vector2(d,1-f),new THREE.Vector2(l,1-g),new THREE.Vector2(s,1-a)]:[new THREE.Vector2(c,1-e),new THREE.Vector2(k,1-f),new THREE.Vector2(p,1-g),new THREE.Vector2(r,1-a)]}};THREE.ExtrudeGeometry.__v1=new THREE.Vector2;THREE.ExtrudeGeometry.__v2=new THREE.Vector2;THREE.ExtrudeGeometry.__v3=new THREE.Vector2;THREE.ExtrudeGeometry.__v4=new THREE.Vector2; THREE.ExtrudeGeometry.__v5=new THREE.Vector2;THREE.ExtrudeGeometry.__v6=new THREE.Vector2;THREE.ShapeGeometry=function(a,b){THREE.Geometry.call(this);!1===a instanceof Array&&(a=[a]);this.shapebb=a[a.length-1].getBoundingBox();this.addShapeList(a,b);this.computeFaceNormals()};THREE.ShapeGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.ShapeGeometry.prototype.addShapeList=function(a,b){for(var c=0,d=a.length;cc&&1===a.x&&(a=new THREE.Vector2(a.x-1,a.y));0===b.x&&0===b.z&&(a=new THREE.Vector2(c/2/ -Math.PI+0.5,a.y));return a.clone()}THREE.Geometry.call(this);c=c||1;d=d||0;for(var k=this,l=0,p=a.length;ls&&(0.2>d&&(b[0].x+=1),0.2>a&&(b[1].x+=1),0.2>q&&(b[2].x+=1));l=0;for(p=this.vertices.length;lc&&1===a.x&&(a=new THREE.Vector2(a.x-1,a.y));0===b.x&&0===b.z&&(a=new THREE.Vector2(c/2/ +Math.PI+0.5,a.y));return a.clone()}THREE.Geometry.call(this);c=c||1;d=d||0;for(var k=this,l=0,p=a.length;lu&&(0.2>d&&(b[0].x+=1),0.2>a&&(b[1].x+=1),0.2>s&&(b[2].x+=1));l=0;for(p=this.vertices.length;lc.y?this.quaternion.set(1,0,0,0):(a.set(c.z,0,-c.x).normalize(),b=Math.acos(c.y),this.quaternion.setFromAxisAngle(a,b))}}(); THREE.ArrowHelper.prototype.setLength=function(a,b,c){void 0===b&&(b=0.2*a);void 0===c&&(c=0.2*b);this.line.scale.set(1,a,1);this.line.updateMatrix();this.cone.scale.set(c,b,c);this.cone.position.y=a;this.cone.updateMatrix()};THREE.ArrowHelper.prototype.setColor=function(a){this.line.material.color.set(a);this.cone.material.color.set(a)};THREE.BoxHelper=function(a){var b=[new THREE.Vector3(1,1,1),new THREE.Vector3(-1,1,1),new THREE.Vector3(-1,-1,1),new THREE.Vector3(1,-1,1),new THREE.Vector3(1,1,-1),new THREE.Vector3(-1,1,-1),new THREE.Vector3(-1,-1,-1),new THREE.Vector3(1,-1,-1)];this.vertices=b;var c=new THREE.Geometry;c.vertices.push(b[0],b[1],b[1],b[2],b[2],b[3],b[3],b[0],b[4],b[5],b[5],b[6],b[6],b[7],b[7],b[4],b[0],b[4],b[1],b[5],b[2],b[6],b[3],b[7]);THREE.Line.call(this,c,new THREE.LineBasicMaterial({color:16776960}),THREE.LinePieces); @@ -654,7 +661,7 @@ THREE.CameraHelper.prototype.update=function(){var a=new THREE.Vector3,b=new THR 1.1,-1);d("u2",-0.7,1.1,-1);d("u3",0,2,-1);d("cf1",-1,0,1);d("cf2",1,0,1);d("cf3",0,-1,1);d("cf4",0,1,1);d("cn1",-1,0,-1);d("cn2",1,0,-1);d("cn3",0,-1,-1);d("cn4",0,1,-1);this.geometry.verticesNeedUpdate=!0}}();THREE.DirectionalLightHelper=function(a,b){THREE.Object3D.call(this);this.light=a;this.light.updateMatrixWorld();this.matrixWorld=a.matrixWorld;this.matrixAutoUpdate=!1;b=b||1;var c=new THREE.Geometry;c.vertices.push(new THREE.Vector3(-b,b,0),new THREE.Vector3(b,b,0),new THREE.Vector3(b,-b,0),new THREE.Vector3(-b,-b,0),new THREE.Vector3(-b,b,0));var d=new THREE.LineBasicMaterial({fog:!1});d.color.copy(this.light.color).multiplyScalar(this.light.intensity);this.lightPlane=new THREE.Line(c,d);this.add(this.lightPlane); c=new THREE.Geometry;c.vertices.push(new THREE.Vector3,new THREE.Vector3);d=new THREE.LineBasicMaterial({fog:!1});d.color.copy(this.light.color).multiplyScalar(this.light.intensity);this.targetLine=new THREE.Line(c,d);this.add(this.targetLine);this.update()};THREE.DirectionalLightHelper.prototype=Object.create(THREE.Object3D.prototype); THREE.DirectionalLightHelper.prototype.dispose=function(){this.lightPlane.geometry.dispose();this.lightPlane.material.dispose();this.targetLine.geometry.dispose();this.targetLine.material.dispose()}; -THREE.DirectionalLightHelper.prototype.update=function(){var a=new THREE.Vector3,b=new THREE.Vector3,c=new THREE.Vector3;return function(){a.setFromMatrixPosition(this.light.matrixWorld);b.setFromMatrixPosition(this.light.target.matrixWorld);c.subVectors(b,a);this.lightPlane.lookAt(c);this.lightPlane.material.color.copy(this.light.color).multiplyScalar(this.light.intensity);this.targetLine.geometry.vertices[1].copy(c);this.targetLine.geometry.verticesNeedUpdate=!0;this.targetLine.material.color.copy(this.lightPlane.material.color)}}();THREE.EdgesHelper=function(a,b){var c=void 0!==b?b:16777215,d=[0,0],e={},f=function(a,b){return a-b},g=["a","b","c"],h=new THREE.BufferGeometry,k=a.geometry.clone();k.mergeVertices();k.computeFaceNormals();for(var l=k.vertices,k=k.faces,p=0,q=0,r=k.length;qt;t++){d[0]=s[g[t]];d[1]=s[g[(t+1)%3]];d.sort(f);var n=d.toString();void 0===e[n]?(e[n]={vert1:d[0],vert2:d[1],face1:q,face2:void 0},p++):e[n].face2=q}h.addAttribute("position",new THREE.Float32Attribute(6*p,3));d=h.attributes.position.array; +THREE.DirectionalLightHelper.prototype.update=function(){var a=new THREE.Vector3,b=new THREE.Vector3,c=new THREE.Vector3;return function(){a.setFromMatrixPosition(this.light.matrixWorld);b.setFromMatrixPosition(this.light.target.matrixWorld);c.subVectors(b,a);this.lightPlane.lookAt(c);this.lightPlane.material.color.copy(this.light.color).multiplyScalar(this.light.intensity);this.targetLine.geometry.vertices[1].copy(c);this.targetLine.geometry.verticesNeedUpdate=!0;this.targetLine.material.color.copy(this.lightPlane.material.color)}}();THREE.EdgesHelper=function(a,b){var c=void 0!==b?b:16777215,d=[0,0],e={},f=function(a,b){return a-b},g=["a","b","c"],h=new THREE.BufferGeometry,k=a.geometry.clone();k.mergeVertices();k.computeFaceNormals();for(var l=k.vertices,k=k.faces,p=0,s=0,r=k.length;sq;q++){d[0]=u[g[q]];d[1]=u[g[(q+1)%3]];d.sort(f);var n=d.toString();void 0===e[n]?(e[n]={vert1:d[0],vert2:d[1],face1:s,face2:void 0},p++):e[n].face2=s}h.addAttribute("position",new THREE.Float32Attribute(6*p,3));d=h.attributes.position.array; f=0;for(n in e)if(g=e[n],void 0===g.face2||0.9999>k[g.face1].normal.dot(k[g.face2].normal))p=l[g.vert1],d[f++]=p.x,d[f++]=p.y,d[f++]=p.z,p=l[g.vert2],d[f++]=p.x,d[f++]=p.y,d[f++]=p.z;THREE.Line.call(this,h,new THREE.LineBasicMaterial({color:c}),THREE.LinePieces);this.matrixAutoUpdate=!1;this.matrixWorld=a.matrixWorld};THREE.EdgesHelper.prototype=Object.create(THREE.Line.prototype);THREE.FaceNormalsHelper=function(a,b,c,d){this.object=a;this.size=void 0!==b?b:1;a=void 0!==c?c:16776960;d=void 0!==d?d:1;b=new THREE.Geometry;c=0;for(var e=this.object.geometry.faces.length;cb;b++)a.faces[b].color=this.colors[4>b?0:1];b=new THREE.MeshBasicMaterial({vertexColors:THREE.FaceColors,wireframe:!0});this.lightSphere=new THREE.Mesh(a,b);this.add(this.lightSphere); @@ -664,13 +671,13 @@ THREE.PointLightHelper.prototype.update=function(){this.material.color.copy(this THREE.SkeletonHelper.prototype=Object.create(THREE.Line.prototype);THREE.SkeletonHelper.prototype.update=function(){for(var a=this.geometry,b=0,c=0;cn;n++){d[0]=t[g[n]];d[1]=t[g[(n+1)%3]];d.sort(f);var v=d.toString();void 0===e[v]&&(q[2*p]=d[0],q[2*p+1]=d[1],e[v]=!0,p++)}h.addAttribute("position",new THREE.Float32Attribute(6*p,3));d= -h.attributes.position.array;r=0;for(s=p;rn;n++)p=k[q[2*r+n]],g=6*r+3*n,d[g+0]=p.x,d[g+1]=p.y,d[g+2]=p.z}else if(a.geometry instanceof THREE.BufferGeometry&&void 0!==a.geometry.attributes.index){for(var k=a.geometry.attributes.position.array,s=a.geometry.attributes.index.array,l=a.geometry.offsets,p=0,q=new Uint32Array(2*s.length),t=0,w=l.length;tn;n++)d[0]=g+s[r+n],d[1]=g+s[r+(n+1)%3],d.sort(f),v=d.toString(), -void 0===e[v]&&(q[2*p]=d[0],q[2*p+1]=d[1],e[v]=!0,p++);h.addAttribute("position",new THREE.Float32Attribute(6*p,3));d=h.attributes.position.array;r=0;for(s=p;rn;n++)g=6*r+3*n,p=3*q[2*r+n],d[g+0]=k[p],d[g+1]=k[p+1],d[g+2]=k[p+2]}else if(a.geometry instanceof THREE.BufferGeometry)for(k=a.geometry.attributes.position.array,p=k.length/3,q=p/3,h.addAttribute("position",new THREE.Float32Attribute(6*p,3)),d=h.attributes.position.array,r=0,s=q;rn;n++)g=18*r+6*n,q=9*r+3*n, -d[g+0]=k[q],d[g+1]=k[q+1],d[g+2]=k[q+2],p=9*r+(n+1)%3*3,d[g+3]=k[p],d[g+4]=k[p+1],d[g+5]=k[p+2];THREE.Line.call(this,h,new THREE.LineBasicMaterial({color:c}),THREE.LinePieces);this.matrixAutoUpdate=!1;this.matrixWorld=a.matrixWorld};THREE.WireframeHelper.prototype=Object.create(THREE.Line.prototype);THREE.ImmediateRenderObject=function(){THREE.Object3D.call(this);this.render=function(a){}};THREE.ImmediateRenderObject.prototype=Object.create(THREE.Object3D.prototype);THREE.LensFlare=function(a,b,c,d,e){THREE.Object3D.call(this);this.lensFlares=[];this.positionScreen=new THREE.Vector3;this.customUpdateCallback=void 0;void 0!==a&&this.add(a,b,c,d,e)};THREE.LensFlare.prototype=Object.create(THREE.Object3D.prototype); +THREE.VertexTangentsHelper.prototype.update=function(a){var b=new THREE.Vector3;return function(a){a=["a","b","c","d"];this.object.updateMatrixWorld(!0);for(var d=this.geometry.vertices,e=this.object.geometry.vertices,f=this.object.geometry.faces,g=this.object.matrixWorld,h=0,k=0,l=f.length;kn;n++){d[0]=q[g[n]];d[1]=q[g[(n+1)%3]];d.sort(f);var t=d.toString();void 0===e[t]&&(s[2*p]=d[0],s[2*p+1]=d[1],e[t]=!0,p++)}h.addAttribute("position",new THREE.Float32Attribute(6*p,3));d= +h.attributes.position.array;r=0;for(u=p;rn;n++)p=k[s[2*r+n]],g=6*r+3*n,d[g+0]=p.x,d[g+1]=p.y,d[g+2]=p.z}else if(a.geometry instanceof THREE.BufferGeometry&&void 0!==a.geometry.attributes.index){for(var k=a.geometry.attributes.position.array,u=a.geometry.attributes.index.array,l=a.geometry.offsets,p=0,s=new Uint32Array(2*u.length),q=0,w=l.length;qn;n++)d[0]=g+u[r+n],d[1]=g+u[r+(n+1)%3],d.sort(f),t=d.toString(), +void 0===e[t]&&(s[2*p]=d[0],s[2*p+1]=d[1],e[t]=!0,p++);h.addAttribute("position",new THREE.Float32Attribute(6*p,3));d=h.attributes.position.array;r=0;for(u=p;rn;n++)g=6*r+3*n,p=3*s[2*r+n],d[g+0]=k[p],d[g+1]=k[p+1],d[g+2]=k[p+2]}else if(a.geometry instanceof THREE.BufferGeometry)for(k=a.geometry.attributes.position.array,p=k.length/3,s=p/3,h.addAttribute("position",new THREE.Float32Attribute(6*p,3)),d=h.attributes.position.array,r=0,u=s;rn;n++)g=18*r+6*n,s=9*r+3*n, +d[g+0]=k[s],d[g+1]=k[s+1],d[g+2]=k[s+2],p=9*r+(n+1)%3*3,d[g+3]=k[p],d[g+4]=k[p+1],d[g+5]=k[p+2];THREE.Line.call(this,h,new THREE.LineBasicMaterial({color:c}),THREE.LinePieces);this.matrixAutoUpdate=!1;this.matrixWorld=a.matrixWorld};THREE.WireframeHelper.prototype=Object.create(THREE.Line.prototype);THREE.ImmediateRenderObject=function(){THREE.Object3D.call(this);this.render=function(a){}};THREE.ImmediateRenderObject.prototype=Object.create(THREE.Object3D.prototype);THREE.LensFlare=function(a,b,c,d,e){THREE.Object3D.call(this);this.lensFlares=[];this.positionScreen=new THREE.Vector3;this.customUpdateCallback=void 0;void 0!==a&&this.add(a,b,c,d,e)};THREE.LensFlare.prototype=Object.create(THREE.Object3D.prototype); THREE.LensFlare.prototype.add=function(a,b,c,d,e,f){void 0===b&&(b=-1);void 0===c&&(c=0);void 0===f&&(f=1);void 0===e&&(e=new THREE.Color(16777215));void 0===d&&(d=THREE.NormalBlending);c=Math.min(c,Math.max(0,c));this.lensFlares.push({texture:a,size:b,distance:c,x:0,y:0,z:0,scale:1,rotation:1,opacity:f,color:e,blending:d})}; THREE.LensFlare.prototype.updateLensFlares=function(){var a,b=this.lensFlares.length,c,d=2*-this.positionScreen.x,e=2*-this.positionScreen.y;for(a=0;ad.duration||0>d.time)d.direction*=-1,d.time>d.duration&&(d.time=d.duration,d.directionBackwards=!0),0>d.time&&(d.time=0,d.directionBackwards=!1)}else d.time%=d.duration,0>d.time&&(d.time+=d.duration);var f=d.startFrame+THREE.Math.clamp(Math.floor(d.time/e),0,d.length-1),g=d.weight; -f!==d.currentFrame&&(this.morphTargetInfluences[d.lastFrame]=0,this.morphTargetInfluences[d.currentFrame]=1*g,this.morphTargetInfluences[f]=0,d.lastFrame=d.currentFrame,d.currentFrame=f);e=d.time%e/e;d.directionBackwards&&(e=1-e);this.morphTargetInfluences[d.currentFrame]=e*g;this.morphTargetInfluences[d.lastFrame]=(1-e)*g}}};THREE.LensFlarePlugin=function(){function a(a,c){var d=b.createProgram(),e=b.createShader(b.FRAGMENT_SHADER),f=b.createShader(b.VERTEX_SHADER),g="precision "+c+" float;\n";b.shaderSource(e,g+a.fragmentShader);b.shaderSource(f,g+a.vertexShader);b.compileShader(e);b.compileShader(f);b.attachShader(d,e);b.attachShader(d,f);b.linkProgram(d);return d}var b,c,d,e,f,g,h,k,l,p,q,r,s;this.init=function(t){b=t.context;c=t;d=t.getPrecision();e=new Float32Array(16);f=new Uint16Array(6);t=0;e[t++]=-1;e[t++]=-1; -e[t++]=0;e[t++]=0;e[t++]=1;e[t++]=-1;e[t++]=1;e[t++]=0;e[t++]=1;e[t++]=1;e[t++]=1;e[t++]=1;e[t++]=-1;e[t++]=1;e[t++]=0;e[t++]=1;t=0;f[t++]=0;f[t++]=1;f[t++]=2;f[t++]=0;f[t++]=2;f[t++]=3;g=b.createBuffer();h=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,g);b.bufferData(b.ARRAY_BUFFER,e,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,h);b.bufferData(b.ELEMENT_ARRAY_BUFFER,f,b.STATIC_DRAW);k=b.createTexture();l=b.createTexture();b.bindTexture(b.TEXTURE_2D,k);b.texImage2D(b.TEXTURE_2D,0,b.RGB,16,16, +f!==d.currentFrame&&(this.morphTargetInfluences[d.lastFrame]=0,this.morphTargetInfluences[d.currentFrame]=1*g,this.morphTargetInfluences[f]=0,d.lastFrame=d.currentFrame,d.currentFrame=f);e=d.time%e/e;d.directionBackwards&&(e=1-e);this.morphTargetInfluences[d.currentFrame]=e*g;this.morphTargetInfluences[d.lastFrame]=(1-e)*g}}};THREE.LensFlarePlugin=function(){function a(a,c){var d=b.createProgram(),e=b.createShader(b.FRAGMENT_SHADER),f=b.createShader(b.VERTEX_SHADER),g="precision "+c+" float;\n";b.shaderSource(e,g+a.fragmentShader);b.shaderSource(f,g+a.vertexShader);b.compileShader(e);b.compileShader(f);b.attachShader(d,e);b.attachShader(d,f);b.linkProgram(d);return d}var b,c,d,e,f,g,h,k,l,p,s,r,u;this.init=function(q){b=q.context;c=q;d=q.getPrecision();e=new Float32Array(16);f=new Uint16Array(6);q=0;e[q++]=-1;e[q++]=-1; +e[q++]=0;e[q++]=0;e[q++]=1;e[q++]=-1;e[q++]=1;e[q++]=0;e[q++]=1;e[q++]=1;e[q++]=1;e[q++]=1;e[q++]=-1;e[q++]=1;e[q++]=0;e[q++]=1;q=0;f[q++]=0;f[q++]=1;f[q++]=2;f[q++]=0;f[q++]=2;f[q++]=3;g=b.createBuffer();h=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,g);b.bufferData(b.ARRAY_BUFFER,e,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,h);b.bufferData(b.ELEMENT_ARRAY_BUFFER,f,b.STATIC_DRAW);k=b.createTexture();l=b.createTexture();b.bindTexture(b.TEXTURE_2D,k);b.texImage2D(b.TEXTURE_2D,0,b.RGB,16,16, 0,b.RGB,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);b.bindTexture(b.TEXTURE_2D,l);b.texImage2D(b.TEXTURE_2D,0,b.RGBA,16,16,0,b.RGBA,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE); -b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);0>=b.getParameter(b.MAX_VERTEX_TEXTURE_IMAGE_UNITS)?(p=!1,q=a(THREE.ShaderFlares.lensFlare,d)):(p=!0,q=a(THREE.ShaderFlares.lensFlareVertexTexture,d));r={};s={};r.vertex=b.getAttribLocation(q,"position");r.uv=b.getAttribLocation(q,"uv");s.renderType=b.getUniformLocation(q,"renderType");s.map=b.getUniformLocation(q,"map");s.occlusionMap=b.getUniformLocation(q,"occlusionMap");s.opacity= -b.getUniformLocation(q,"opacity");s.color=b.getUniformLocation(q,"color");s.scale=b.getUniformLocation(q,"scale");s.rotation=b.getUniformLocation(q,"rotation");s.screenPosition=b.getUniformLocation(q,"screenPosition")};this.render=function(a,d,e,f){a=a.__webglFlares;var u=a.length;if(u){var x=new THREE.Vector3,F=f/e,C=0.5*e,D=0.5*f,z=16/f,G=new THREE.Vector2(z*F,z),I=new THREE.Vector3(1,1,0),B=new THREE.Vector2(1,1),y=s,z=r;b.useProgram(q);b.enableVertexAttribArray(r.vertex);b.enableVertexAttribArray(r.uv); -b.uniform1i(y.occlusionMap,0);b.uniform1i(y.map,1);b.bindBuffer(b.ARRAY_BUFFER,g);b.vertexAttribPointer(z.vertex,2,b.FLOAT,!1,16,0);b.vertexAttribPointer(z.uv,2,b.FLOAT,!1,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,h);b.disable(b.CULL_FACE);b.depthMask(!1);var A,O,L,M,K;for(A=0;A=b.getParameter(b.MAX_VERTEX_TEXTURE_IMAGE_UNITS)?(p=!1,s=a(THREE.ShaderFlares.lensFlare,d)):(p=!0,s=a(THREE.ShaderFlares.lensFlareVertexTexture,d));r={};u={};r.vertex=b.getAttribLocation(s,"position");r.uv=b.getAttribLocation(s,"uv");u.renderType=b.getUniformLocation(s,"renderType");u.map=b.getUniformLocation(s,"map");u.occlusionMap=b.getUniformLocation(s,"occlusionMap");u.opacity= +b.getUniformLocation(s,"opacity");u.color=b.getUniformLocation(s,"color");u.scale=b.getUniformLocation(s,"scale");u.rotation=b.getUniformLocation(s,"rotation");u.screenPosition=b.getUniformLocation(s,"screenPosition")};this.render=function(a,d,e,f){a=a.__webglFlares;var v=a.length;if(v){var x=new THREE.Vector3,F=f/e,C=0.5*e,D=0.5*f,z=16/f,G=new THREE.Vector2(z*F,z),I=new THREE.Vector3(1,1,0),B=new THREE.Vector2(1,1),y=u,z=r;b.useProgram(s);b.enableVertexAttribArray(r.vertex);b.enableVertexAttribArray(r.uv); +b.uniform1i(y.occlusionMap,0);b.uniform1i(y.map,1);b.bindBuffer(b.ARRAY_BUFFER,g);b.vertexAttribPointer(z.vertex,2,b.FLOAT,!1,16,0);b.vertexAttribPointer(z.uv,2,b.FLOAT,!1,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,h);b.disable(b.CULL_FACE);b.depthMask(!1);var A,O,L,M,K;for(A=0;AF;F++)G[F]=new THREE.Vector3,u[F]=new THREE.Vector3;G=C.shadowCascadeNearZ[x];C=C.shadowCascadeFarZ[x];u[0].set(-1,-1,G);u[1].set(1,-1,G);u[2].set(-1, -1,G);u[3].set(1,1,G);u[4].set(-1,-1,C);u[5].set(1,-1,C);u[6].set(-1,1,C);u[7].set(1,1,C);z.originalCamera=r;u=new THREE.Gyroscope;u.position.copy(n.shadowCascadeOffset);u.add(z);u.add(z.target);r.add(u);n.shadowCascadeArray[w]=z;console.log("Created virtualLight",z)}x=n;G=w;C=x.shadowCascadeArray[G];C.position.copy(x.position);C.target.position.copy(x.target.position);C.lookAt(C.target);C.shadowCameraVisible=x.shadowCameraVisible;C.shadowDarkness=x.shadowDarkness;C.shadowBias=x.shadowCascadeBias[G]; -u=x.shadowCascadeNearZ[G];x=x.shadowCascadeFarZ[G];C=C.pointsFrustum;C[0].z=u;C[1].z=u;C[2].z=u;C[3].z=u;C[4].z=x;C[5].z=x;C[6].z=x;C[7].z=x;D[v]=z;v++}else D[v]=n,v++;s=0;for(t=D.length;sx;x++)G=C[x],G.copy(u[x]),THREE.ShadowMapPlugin.__projector.unprojectVector(G,w),G.applyMatrix4(v.matrixWorldInverse),G.xl.x&&(l.x=G.x),G.yl.y&&(l.y=G.y),G.zl.z&&(l.z=G.z);v.left=k.x;v.right=l.x;v.top=l.y;v.bottom=k.y;v.updateProjectionMatrix()}v=n.shadowMap;u=n.shadowMatrix;w=n.shadowCamera;w.position.setFromMatrixPosition(n.matrixWorld);p.setFromMatrixPosition(n.target.matrixWorld);w.lookAt(p);w.updateMatrixWorld();w.matrixWorldInverse.getInverse(w.matrixWorld);n.cameraHelper&&(n.cameraHelper.visible=n.shadowCameraVisible);n.shadowCameraVisible&&n.cameraHelper.update();u.set(0.5,0,0,0.5,0,0.5,0,0.5, -0,0,0.5,0.5,0,0,0,1);u.multiply(w.projectionMatrix);u.multiply(w.matrixWorldInverse);h.multiplyMatrices(w.projectionMatrix,w.matrixWorldInverse);g.setFromMatrix(h);b.setRenderTarget(v);b.clear();C=q.__webglObjects;n=0;for(v=C.length;n 0 ) {\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\nfloat fogFactor = 0.0;\nif ( fogType == 1 ) {\nfogFactor = smoothstep( fogNear, fogFar, depth );\n} else {\nconst float LOG2 = 1.442695;\nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n}\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n}\n}"].join("\n")); -u.compileShader(y);u.compileShader(A);u.attachShader(w,y);u.attachShader(w,A);u.linkProgram(w);I=w;n=u.getAttribLocation(I,"position");v=u.getAttribLocation(I,"uv");a=u.getUniformLocation(I,"uvOffset");b=u.getUniformLocation(I,"uvScale");c=u.getUniformLocation(I,"rotation");d=u.getUniformLocation(I,"scale");e=u.getUniformLocation(I,"color");f=u.getUniformLocation(I,"map");g=u.getUniformLocation(I,"opacity");h=u.getUniformLocation(I,"modelViewMatrix");k=u.getUniformLocation(I,"projectionMatrix");l= -u.getUniformLocation(I,"fogType");p=u.getUniformLocation(I,"fogDensity");q=u.getUniformLocation(I,"fogNear");r=u.getUniformLocation(I,"fogFar");s=u.getUniformLocation(I,"fogColor");t=u.getUniformLocation(I,"alphaTest");w=document.createElement("canvas");w.width=8;w.height=8;y=w.getContext("2d");y.fillStyle="#ffffff";y.fillRect(0,0,w.width,w.height);F=new THREE.Texture(w);F.needsUpdate=!0};this.render=function(B,y,A,C){A=B.__webglSprites;if(C=A.length){u.useProgram(I);u.enableVertexAttribArray(n); -u.enableVertexAttribArray(v);u.disable(u.CULL_FACE);u.enable(u.BLEND);u.bindBuffer(u.ARRAY_BUFFER,z);u.vertexAttribPointer(n,2,u.FLOAT,!1,16,0);u.vertexAttribPointer(v,2,u.FLOAT,!1,16,8);u.bindBuffer(u.ELEMENT_ARRAY_BUFFER,G);u.uniformMatrix4fv(k,!1,y.projectionMatrix.elements);u.activeTexture(u.TEXTURE0);u.uniform1i(f,0);var D=0,M=0,K=B.fog;K?(u.uniform3f(s,K.color.r,K.color.g,K.color.b),K instanceof THREE.Fog?(u.uniform1f(q,K.near),u.uniform1f(r,K.far),u.uniform1i(l,1),M=D=1):K instanceof THREE.FogExp2&& -(u.uniform1f(p,K.density),u.uniform1i(l,2),M=D=2)):(u.uniform1i(l,0),M=D=0);for(var H,Q=[],K=0;KF;F++)G[F]=new THREE.Vector3,v[F]=new THREE.Vector3;G=C.shadowCascadeNearZ[x];C=C.shadowCascadeFarZ[x];v[0].set(-1,-1,G);v[1].set(1,-1,G);v[2].set(-1, +1,G);v[3].set(1,1,G);v[4].set(-1,-1,C);v[5].set(1,-1,C);v[6].set(-1,1,C);v[7].set(1,1,C);z.originalCamera=r;v=new THREE.Gyroscope;v.position.copy(n.shadowCascadeOffset);v.add(z);v.add(z.target);r.add(v);n.shadowCascadeArray[w]=z;console.log("Created virtualLight",z)}x=n;G=w;C=x.shadowCascadeArray[G];C.position.copy(x.position);C.target.position.copy(x.target.position);C.lookAt(C.target);C.shadowCameraVisible=x.shadowCameraVisible;C.shadowDarkness=x.shadowDarkness;C.shadowBias=x.shadowCascadeBias[G]; +v=x.shadowCascadeNearZ[G];x=x.shadowCascadeFarZ[G];C=C.pointsFrustum;C[0].z=v;C[1].z=v;C[2].z=v;C[3].z=v;C[4].z=x;C[5].z=x;C[6].z=x;C[7].z=x;D[t]=z;t++}else D[t]=n,t++;u=0;for(q=D.length;ux;x++)G=C[x],G.copy(v[x]),THREE.ShadowMapPlugin.__projector.unprojectVector(G,w),G.applyMatrix4(t.matrixWorldInverse),G.xl.x&&(l.x=G.x),G.yl.y&&(l.y=G.y),G.zl.z&&(l.z=G.z);t.left=k.x;t.right=l.x;t.top=l.y;t.bottom=k.y;t.updateProjectionMatrix()}t=n.shadowMap;v=n.shadowMatrix;w=n.shadowCamera;w.position.setFromMatrixPosition(n.matrixWorld);p.setFromMatrixPosition(n.target.matrixWorld);w.lookAt(p);w.updateMatrixWorld();w.matrixWorldInverse.getInverse(w.matrixWorld);n.cameraHelper&&(n.cameraHelper.visible=n.shadowCameraVisible);n.shadowCameraVisible&&n.cameraHelper.update();v.set(0.5,0,0,0.5,0,0.5,0,0.5, +0,0,0.5,0.5,0,0,0,1);v.multiply(w.projectionMatrix);v.multiply(w.matrixWorldInverse);h.multiplyMatrices(w.projectionMatrix,w.matrixWorldInverse);g.setFromMatrix(h);b.setRenderTarget(t);b.clear();C=s.__webglObjects;n=0;for(t=C.length;n 0 ) {\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\nfloat fogFactor = 0.0;\nif ( fogType == 1 ) {\nfogFactor = smoothstep( fogNear, fogFar, depth );\n} else {\nconst float LOG2 = 1.442695;\nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n}\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n}\n}"].join("\n")); +v.compileShader(y);v.compileShader(A);v.attachShader(w,y);v.attachShader(w,A);v.linkProgram(w);I=w;n=v.getAttribLocation(I,"position");t=v.getAttribLocation(I,"uv");a=v.getUniformLocation(I,"uvOffset");b=v.getUniformLocation(I,"uvScale");c=v.getUniformLocation(I,"rotation");d=v.getUniformLocation(I,"scale");e=v.getUniformLocation(I,"color");f=v.getUniformLocation(I,"map");g=v.getUniformLocation(I,"opacity");h=v.getUniformLocation(I,"modelViewMatrix");k=v.getUniformLocation(I,"projectionMatrix");l= +v.getUniformLocation(I,"fogType");p=v.getUniformLocation(I,"fogDensity");s=v.getUniformLocation(I,"fogNear");r=v.getUniformLocation(I,"fogFar");u=v.getUniformLocation(I,"fogColor");q=v.getUniformLocation(I,"alphaTest");w=document.createElement("canvas");w.width=8;w.height=8;y=w.getContext("2d");y.fillStyle="#ffffff";y.fillRect(0,0,w.width,w.height);F=new THREE.Texture(w);F.needsUpdate=!0};this.render=function(B,y,A,C){A=B.__webglSprites;if(C=A.length){v.useProgram(I);v.enableVertexAttribArray(n); +v.enableVertexAttribArray(t);v.disable(v.CULL_FACE);v.enable(v.BLEND);v.bindBuffer(v.ARRAY_BUFFER,z);v.vertexAttribPointer(n,2,v.FLOAT,!1,16,0);v.vertexAttribPointer(t,2,v.FLOAT,!1,16,8);v.bindBuffer(v.ELEMENT_ARRAY_BUFFER,G);v.uniformMatrix4fv(k,!1,y.projectionMatrix.elements);v.activeTexture(v.TEXTURE0);v.uniform1i(f,0);var D=0,M=0,K=B.fog;K?(v.uniform3f(u,K.color.r,K.color.g,K.color.b),K instanceof THREE.Fog?(v.uniform1f(s,K.near),v.uniform1f(r,K.far),v.uniform1i(l,1),M=D=1):K instanceof THREE.FogExp2&& +(v.uniform1f(p,K.density),v.uniform1i(l,2),M=D=2)):(v.uniform1i(l,0),M=D=0);for(var H,Q=[],K=0;Kf_Fk#FoaK;&08%77sJu_m=@WP%0v>Q0z`|k# zDOxa41r%IT54FY~dYAg)56A(|eCIpoJ@5N|eBb-u|GxLV@BME058l1+{U7+idmp{; zujk*My!7)Q{jaN&|MQidiM4BkN#`yuYVFbJNv>9Uyr=>I&*sFPbPjEIXxTXXOI72Hkh3G&P%U6&%bg! zsRX}&;SayBJpX4GzLAjs==(qU!@qbreClt%o%l)M#QE?kF_8GN|GPhW?oa>bYk> z-~8_Rr(gJ+=T83UYbSs7&G^};UpV`pqmzFSIs1vzxsQGO(!)>vx6j1WpMN2RVm})7 zE1qx3zx&5OqJrnY^sT=}&x#-Q|NTSXe&u7&zB=^u^v9kThyLjN$G&#%p{IW|`lY`n zK0h_|+0+Znp9lUzc<%c@^s_&F?&J@@_Px{Jc;WQZ%uCeU;e}Ief#-uedw=q0Uwl6KN&Lgle)Id( zGcSJWj}!kXbn1)W{?lWDKmB6(yZ(oC|A&X3dFew>y?E%WCqMXA?(_cW=f4s8%(LJ5+}FP2d;0k2 zo_+qwXP*Du)6e_9f{%XXk3Rj>A0GYkb02%^_=mq7C4c`9pZe05Kl!B}_$`?QPna>U{rN8jeBfmRx_zNHX)E7Q+=D=S#~*#<(6IZ^BZpir*GC_6jSvTj-}=z-@JBv;;NXFe92ol0haURP z4}SQAzx9Ft@asbleegGa>w~{F^qar-{`bGXKiJ)W>-Bg0@HS}ezrWS$!N;vuzrWkt zg9isY?>z|L+8+#h{njmb@IE}axBnyXS*z9R!N2$3;4APQ@bkUa{=40N@BU!#{(H{= z5AD7?fd6*y_wVmt{K4+v{{EHk!^PmO1&{T5aPj@8fQ!L(2-)qh+wE?>Tuua~X0e0?py*12q~U0zwu|9yV5+9}_=vE?+Ja!sG8@s(uqrO&c^tSIhTfMD@ldoENqgAihH*3z#Mz`K+ZPwP-@|*Q~zICnnt5$0* z|92~ueD!Ln^!7jgYqwf$tn@ZF%e7M5UfpUp8qKb~-EZ{D4a2sK>c89VPTy%a`mK$! zQLfipvq{`n0K1LxKUg+8t{}x&9n@| zuub@5l&w<3G42$9_H(1SW0zKqJFA!1jB?pDR%%Vxwo@jteM4HuU6}p%dnhf z_@G8!Rc=C7_9*Yifcwp!Y}e)aGEZtbf5_04j#ay7rcZrH`mYH7XhIGYXoI^5$` z!>+=eZCtFaHoBd8+wQMg=7w>z)_|)UjhboPbncq)74vfU7pq3Iv2)F=H;fx*tH0gv zL437eb?tt~?m0!vxVB<6Ov7kdwzg_n&9>R8wu5oSi5OlytrC6jK=!< z=GDC6SobzojJ4IZ)sAhf8n0h!7?%ylSy^9i+bzdzw#$}LgB!Y1HcCZ%d%Jz_-;E91 zf<@VB+-Nt75PTCt*)%rIPP+$j*tKfD-dMX<%|lvUyqsTIzrK0(YW~v7nz6ci>FSPc zH#PfhBfrx%OPhbYzJ7JZD0a&2ca59XMzhs`Fj~e&*Q~>G*@jUv)^0Snw>#ZZx4E{~ zyOdvB>(uLOwVDB`-tTv6&0ck**eveWAP4PQt<`Wgiq*}$Ra>vsYejpj>cB;ccW#^J z4YRyq7#kZ#ZPhT$i?wF{k^`|?R(b7`wR*K|uiR`@mr85x)lI8d$~jfDXlzuQhH2Jo ztKH_R)84)J;9b+|wyJj1wr&`An>UKi_8rJVr`mCfcGvt>yJ+oJ*R8esrAzBqH!neg ztzEiwscc-mbams>8<+EMT-v%>-zhm4tM(nUVQju-ue5$uvg&KQHhg-+sFmTSHd{Nt zGM!?vTzvhaX{^@D@QPvi^RRxGFT;zj)oi1-vf6FKMrp(HJ63b&-FC5R7Y%rEwPJI5 zqt?1vtCvmN-l^W(hP>=K4ddSaGS;n)My=7lv1(M|)3RNKJ+f+CUMpX#!w!YN`OBA$ za__nUPx!X6Vi>FS{j6CnnGoTxwjbDS(|pjqz5DN0!`OAYMeE&d+iBR{2fGb;Iaaf1 zbT(GkT5r4os}Hs04JZW0%Ei{^)%B|JhGAT`*NfF&v29eUh3>t|+Irb;S|#gJ@m{mt zG@Cu6*lkh9-SS&VwWmxN-)za$5MZ+lC#_~1Ty>%nMYP8{XU2fdG->TUSr_(fQ z&F#+Jcj3C7Qan7fGvB_O--63FH|^4P=Z4XFu>CW$c*icmqQmm68gKl=O{ivY zL#zL=3^@zo8`q3_zfrSy?lhcQYj?HWY<1f0*434AuC_G4bg|jmSYB!0v3C|<`{#TA z%j>UguWTshYsPDHKQk`gxm>(>@wM}>yG`dq zJ@dA?T{Ro+;(XEgnF-a}w2Q_0zbO7}JG*-E_5bqv>ldGX`n7-2mK$ZGUN-LD)xP<< zQ?J?1&Hi@2Z5M5`UN^K2b9-as{^0%|w9Xz>MaRjddxKW4p_FW^RMIPoeWhZjtE#2X z%xCqir0X;0z*aLE$x_vfo>6C{Ikqsb&&vf-PvlfJo3L-$>io2BntHB~&1BT9p0o8_ z#azr}?SfX2djlt(%bH>?r|N2DR?S?{3#y>2S;>Syg0yw(Mn=gL?0NfD6P{PK)lS+J z=Vw*8IQ*Qg^c_W-6DozpoUT~#W9lpV44Z}LpI0;U@WKW+PMYegwluG2B(ost8NH%b zGB%__yU*eA%mP-6+so$Tvpa~MV%5M3hr`c08FxrC&~vZf%;$X24D znpXW<+1a?+={?x074Nl8`)0#7?(No^0G>6(yA!2F^*MD zSxjrPkk)mc4>$wcI~%*=G2wf7ofQOznPQO;dL?X<89L;*uQ>uE$+|epWrVpjdoxzy z^bscXN`#(M#d+&L?wL$1$mmj172&2Wh8UD)P)0@b3^PA12+IT0oxzE$Kg6ozx*lU? zN#!6D%vu$?#JvZ*yW2PK0&cQlA42V0t=cyMKkkD|$F?m+vmySRPhVJ$+TL7T(&XGZ znOkJp83E73g_X=Lh@Zs@yj1r1_(@O9#U(;4`HII+%;Avga&BdDA}p{PmK0tH;aG$> zIYCndhMQM?IB556T8POg6w5IfoxmtW%T&RoA{yCiHey1OE~VKEXG9+7LItl% zG9h*hD}wlH<@fe7*c+i`ftQ$&O3u4@x9E4xB#uZiB#EKe;-KJ~Mb+{W)xNXSy1kE%hD zK!}N;N3z?U%bdMW@)V~RLeWsVaJijA7YG@@Mg`UN zCAol2MwJ!Bd1ff@);k#jp2kli+7Expm}~q6gvo>lAJAyT5|wvUB#|McA`CAyI2K4E zHORyy9B>QMBNPe!AuJH`h>kE9Wh36On?@l5BW@&1NFL;>Ty}<#PV=0~yv)A9kcFs1 zaR?n|p9n5dp>Mam0FGa5IE}+!s!GV&fxN?*-QC8j)rAbO?5tkV2Fr7DGNmk0jgd+` zB~Rwg=Eg0rEUPF^t2B1rG!Kdb!ic0#!1^QD|DhuRk|iU=lAC59GT%{Y4zX^PUg$`iYh;Bw6A%~q?ws!&vXmKPK5Bga;^SDP$?hf6GBvoq(kV`0nR-Ya;Y?t@IgMD^h5lxk4^|Q_QxK2 zMHoNAFw$5CIst$j0+Z$HrCXBk(n%QjBA9Mf~6))D->W~4wLUvLhFJfEuaI$ri_f`sBe$&KwdZ9+Uv!woDX(IfGbF zz%3D>faIP)=tZPbA44J^QPf!ceU02?#}JT9izS6Yu&7u%k`ECV_~USG~3Nz?G4OE z#TqOL3&Ers_byR6pN3vuNLr(&SDDbg5hjE}_CJ}f3sYnygkigR1LzbHgZ714#Cz3o z7eADFCxaLgk?O-Nl3k34#&p^pLa!pmA7(vx*dAp0FeSM}c)%SFxY>gUu|pWrM;KikDjC#Rx+&nD;%Iki9c3^p{~T_MY&2=tE=z#YPZA2~g-zL`1$L z40&o`9*`0VE|zdhA9xkh-Vno4uY|INUbnM-*J}5#)gRb*VE}9zR;{+&tljKfzP!_G z6fLK}x7VvQ2IfL8$)Eo2XwH}M=qPn1xj-!jm5Cho`5@ixe$I0tj5se`I)VIXen_DG zm^wL5lL~eTzg~C~+92$XgbPp&$$Driq(eCr>F39pGbA3h2NfKm6@sH_?DkV+$W0;c zASN-AT(7tTLgCqIKOszE%+fjU9F6BB8SxCmGZY_Zqgu$?%OZx4z%$TpqVTXdgyj*= zqp}o}A(-zVe+1%J{S1ep7=C#EIEH0{YQma@#`ezLPO-bY31gXkvwL&v*$!+;riZ?6IPOwJ|632}6ZDLgKFUrtY^k6K}6YLSUBu%xhmsW}0MWRAuH!IBq- z5_mi?&cO@PXhI#DzNH^w$pA#d(y~iHj7QjqHFI95M`yg_$Ql%2+Y4@n!eb;&yII1E zU|PU}3K;=H;!xIw)CJ5nhdi!iXm2S%3oaL zP6QA`M2BN^%q_S>V&R&~l4CP|6m~BnEfy5x)9m1^3%4Xpgr?~uAwnTf$ykeD8Bx3rVy5J*S%e*LEcbUUdlSgWZU^X2pt&k` zy;QgIt$!?(cN?vSRo@%z6|5y)UglFtEy*8MQZE*c-h1df)_>!sA>E7zQ6{td@$z1 zK2K;IDei!4n)YHA&|;Q2iL-qjFjEM5*dYZ)_^=|&w1PPfDLygHm~5_ZM^MB)!&4rL z-k-^6%FT}nI2P7j65uJ%Ks^B2#4$eUkY`eI^L|?7RnE-TYt=^4Z1#I^tQp37vAegT zRobi9t5*4X<1$cs&#eJb*tm8La6sQK>6W;ZN>3((+*{|N|0hdYMLryud!@OG+ z5alOeE^)yi=EqEo4XH?lf#dPPJdr>Fzu-}caaC~hF(isJl9}z4ZJ>*q{Z_S{w;Rpf z`@8$RT^Xo&!2hjQzPEPWu(oclm0N>B!!B*4a=dy@JUm%S+Q&*sGhO0%F&mC|239n; zz@<_GPq9OyKjH~NuR*ge09yVrmJr^YcSRtoY2*jXN8#sK7mCcXzPQ#}wLs3R<_e;mi$6em2yyn2{ZGD0>3_1?N+b)f%U0}Y|q zzrVX@TCK*~u|Cods zcg)37W2}!7pbH8qicMdTQQ;7lfM38te=6YSU30@6!vX{Iu~GmB=nE*NhIOgX?*!q; z3t=4fBi%0zAvf$cfFc+CwEu+g8!rze7eHTH@yqTp5fexsQBwuUoNqTPH_DxxeaE6M~l2zF~b11CN^)n2tKMT!pkrXjIr_YZpLUw#WqzP3LI0+)RiT0!E#+(4v6m_Yg1I89`{*!K!0GFM>!t8O_) zvFP*x@HKY3#s8R0h%=}rm(XdsK|f)AfkvxG&5 zNG3)m6;2lmZ#oE%VVwckKdJ*pMC3_|W?3NBpb(z;^|`^HL)u7gHZ?gVGDipv~N`4*?knCAecGa!Wd#D=)h19{RgsxQzQ#lhgN_Il|?YO#rTYD z7B-5l8|7wqx7EB3dQcs7O2;wnzLR^ZTCUb>ARy*9OE>L~)c|U2XR84<02o2VTu|0i zRw}&^T+%Q!eXHL{E~l4MOMFU0QGr{A+Y52%9-fRrO(U}ZBzrg)&FV;F6&}DBX4x=} zMJWDsz!l&!eVGg}Argwa8`6J2ejMiEBjK$Bf=32^)nNh>a7Q{i^?ZbP>r8ee7Zfn? zq*&z_S@V{O&UnrU2_^!Y1I;mrP(7ZhDff&Exe|ec*}(heu?j0+?X>c+)YZ$^oSJ#F+S=+iJHNcw1wNo*7fQM1 z1*MeMs*IMR#7VI-C?}VI&OXQRir||FS>zGH4}2`mK=t?d-GytqM|>Eiq~RQ+CjDU? zV~#@)R#@*C>vaR4)t@E(H~`R91oVtY@Sy-y2n@9A3CS-<6Qfe_9zGKzblWa>;| zROWc-AOT*9<$RTX&IhRvyN?WduXt779p)wZ^})oU$l<3avXzIWfum=!6zWoDg~Wyk7vJDb%;)o66?6k!+GX4eKvtmjmg zt2z5cn=j>(3ZLYJq}^{p{Wo|m&GP~!g-wFvFddop00YX7ofrZB2dOTvJpEWMIUmG0 z=I0ZPkC_X?5FZ?-QSP1DkpRPb3(troY7)%O^o zifJ#~T8rOUPbbriGO4{6|H5)gOU9!zmc=ARx86C;^)Co7CxDiZy;t3ZGWGe8(!!*abU1Jn*f-Le1 zFN|r^QlZlS)s0%Gd1JR)YgXT0Yuz_rnO74r6BITxv+~(hJD)e+hF-Y3ar^G}?X5N_ z)J3QPAc~Y)nv*ImrJ@R-W?pXe`)Mn!@k^;>GEFgzHN*gNWo4kZVMb?31@xg)9?Yqa zElsF=DCxz?<2(-Nn5P8vSQP1dD)1wT5$Pxgl@E`=9iV3-V_tSFN1Tp=!Z@&a%zDjW z7XL|j5=K3N$8ny)!Wd?BWCqPWJ4e5jjpa!eBU=%{<209TEfLrpT z=ZBzgl4&3&ApZ-Ep4I8t?RVFV)=JzHjbx%he z$+J2E@kd!E=*Lo2AhkezL?aK=!3^+sFyD-DH0z=K7zIXXdN#tkSt>g;HC{--e1pAe zIEM?&g$Xf2GO7^80^lhs!pK3Lg`XD$-Wv-8;YiMU(-_vDaI1iYfRbn2`|-Q{AiTg( z%^rj~3dZgu;uX;}TP>@W+t}*2YR+4=wO-#8Dzj|BROi$C_uwbz8)Y!}*jLvRmuymiAD zV9)4W1-*P6=H$pU=cQyGDO4;8H2!J5uX}|gv=xFMM)QH32gYZ&`=o#rfe6vAz>9+{ z5lR5t9zx8)P>5z|o)*+8(==L5qwRoEs=2joTbmGnVTuc6(|X9{biJV2J-cB$^>xd* z*}Z7=DkfN{?%a6*;$Yu&l!n&w$>$dNbIz^3^R4~WPp8i*L0+^7@q#pZfrXkZ;6Q@P z>}A~-aM-60t4YN>fsev$!%mPoW__U50B{@3#Jngx!jOrP0L_s2kQWtvoM-y+IYP!6 z8hEN$I5w>^HqD*pg2<;UXk2E{xiLl*7*N0la4DWlzyc$;jurz1$>1TDdtOut8oR<@ z9sm#aLSTPJ#)SX$IKZzMHd)hb0PfrAUh6p>6P!D1EfALFnAa3GXe*|xrm5Mx|5k0} z8^(6WUUvEref!@3b#JG=15mIhIq6C!xJGSY19iBL$Ffh16XVBon7GY9c!ysYN(GX!?IRC0OZAUeU2D&v

#xbYqV$M#QlJ5j zQi1||z*Fcij;daU)(`V9r5G0bVpyP5LZv|!1$xNyUj3seG6D?wga<$!aD|z;$`mMp zp7%}>Tkmu*Dao8*q6=z_KEkQWVSqb6cAOFPpc2sc^dJi*F5q^%Nbnpaq0q}nR(OR6 zC4oefz<&w=HvQ0!9@0b5lY}FlT%u5DG+O0GW35%q|KFf{m0OPN$O@yfIZ|iAelaiE z^A~g7i+AtX?RI;6r@Phe7AnPd<4)zy)?lyo_CR|}hnjbDub=F%pNI63|@oNs5t4#SLBnM*kM9KLwoL{(bYi5=_oV`#qXh z;$yPkg*_<1LH@HCxBvmr5QwZ${oFA%VP^C7e06hmZ8vZ9$}4YxEmpO2D)WkHj-*d$ z+=48cTyH7Y+p%jUr{C<>%A3o@_SWs@ojZozfeaWd**TpDzf9{~y`%vIPA#Q^a|_mp zzyxDSF6onbHYiis!Q5CHW1oKXTvCfN0Q;cwu^!;_PeI@J9)SF(S(g`BTgkp8Ok?ueq@yz5jgxB&z3L@g@S#-Me6!`9YQnwHX{ zTE;#a_r1&nh3JzipcFtTdoNQ8>{!{G=9fUW!4z0LSdU0zAhsg>G30WL?T2N zc7sBMGQbhe_-00AU`6b`$`P!yoKQiFQ4<7Ve>Phi=rr^Fv!5D;HP2` zKQQ;M@F?Xgkc|EcouH=10^lDqQ9zOyE<1K$3l?>@f27!5&RD)7!(-~sR5$mWvZn!UMkxyd*f!S zr#hJ&`g0XL9Vt#u3s@cRsdXN@)(Anl#bzqNl^yxS~-57I8*EA9dz(5vVzSpS!d z#(6`79&qlcnpz5`usFe|eMxyzQ_^5~X!E_%F?7J9f(hc>` zH9^rH#-+l_M_|v=v`uhRaukoq?f_};6+F~5n-DS|F;8CzhUXcTR77AKBRopuxhZXs zg-y+2o^_FgN#sa2gwn|nSOvgI;9*_Be;x?MP{=pNL9#)~jlsWHV)F&Vx%;3A{HI~V z0MsbA_EbmDdcd`Z)hi4Gl~AC2U_5hHUtRC)l(xW|Yj4~4w#+T?#X;&o6Bqz5-fKbr zm#W%2)W5UJr|0Cwph`~)yc#`wPG-afRO+8YX)4a}zV+ymZ=d%7CIn+HFs=ec>~>`a zv!Dv@E5R4``5yuhDk`{qQ}Q^5K?aXPeuTmj3!XYcpAZ4odi7x#0lb)ryHm6R^HG7~ zBRpV)kkJ ztMbd%<@%O#L(L&oUG%EVDez$lj9^X2(sq9_d#BiHwznS??i6p^_WDZ0v4633v(bln z*xG9h`e&+*|F8dP-bqbk&N0#HWY(9G&x*WGFZK1f3~r6|$E$y-2QeRY%a5vnfa&Nd z7a4L51AcJ{p0Ecn^Zxo1@2&q(gqChEH8qp^v#enWh6Bn4+uuSu$ z=+jtzV0tl5DnKsdA(PNSY5;W@KrkqxH1ZF}2a~S-HK+U$JTmK|DHdwLD<>BVwX$Qh zYrVY|_{HA_xBHg3E9>Emu7|;G0Q?L~b2g0X_Q1^i3+RE+2ySnKPZYkh+GusFTkt=0 zfj-2qfsI!yo!64-qoOD#(~+bsE`eo65f$AB^%-hklu3W06Thr@Gp5N=wiGZ2P(w)1Q!E?kSBmL@2H881Olu`&Ie#>&Z5G|H27e!4l zLC6d$ULP;WLdt^(b4Ufy4BY3bo)cdA98~yMt6fj3*<5N^n3+KzEvad z^zD4jxw;8cj@$=hrKzUGEO0ks=r|)5WY!D%T*kb(YWF}5b&AWy>g$G8X?M%5ywlh> z3BgFXAOAx6{LXnUfq;ic+@th<2Ds^P2GlOzClJ$~{q>)hSrzb40z4O|q=~FA_pl-X!wn)! z3Wl6n&|evxRFyD|Twuil>lh?EaNlGC;vd_O-vu@pxU(k^aSDWp*zkBjo!0Go9uR=h zeUQ(;v3dE8eBBgxr5*n7)pm6jUkmr|NHo>F{;Nh$^LrxooSuTN^APXgG-=}*>@`cbSVAD;$j?i=T! zC3z7Z0{$0No{$@wBB1|q5_TTK#a5(_$0`Y(J*kBTPa6h6cpU|T+D>GTUUn@4Y zETg~Hs;!lrHLzjzLJ84U!BrfJAgKO2R4)eEgPb}i&HZG>hGRi@Z{OLuzPbJuIAx8C z;HTZ~H_>4CX#0 zLdEj|kQQkT%?@l}6(Rm0kcI_t00Gb8LJ5FY`;G1h`QqS$3vPrPkNN!shawij+E<8V@K!n2XCgSY1$tWZjG_%PmRq)J@On9w9E}V73qz4q^%s?e12Ec0|45+C(5g!b z;JCmi6e2F{>pL_FSb)+7whwa?yapf&>tq6)m$ciR_COnei2V@%JhTK*CgF}86kRZ8 zk_46@{(Q}J?0UP^+NvAnO{WF?57@I!R!vJfmC#hLNo3GrZ13d+$;-`J>dH^AZrt4H zG;eQj7u)6aUK>sb*jxX&4(ceJy=!b33w$b`(xYc|FG|B+C~2Cn>Vf#5)S`T9J!zab z&Q3!7xhSs!N<~kw0Sf;H;2#2}LQsYo57a|~aRumE55mWNnnwnuurRPCWKZuaN-rPx ziC`5`M?iN000APi@4fYp98M%zP}BWX2A~A!Jfld1cYc^Eut|EBv&l*n^zArJJ$`Z&GrzvS{w#PFVdbIzGi03f()yzy@H44sA|QGpez0CniBxuE z?r=m5PqGTArW^86n=LpR0`3T%pFbBeqpFr>P9D-dAzyZIPDy_xGEqnt za>c&{F3bW&q*$%qSa-InMW_7lj_tsqSU6HzT~F=D4?0lLol;WqR%$s_LdHN#=FX;4 z<@06DID2;CY%&MX&?^SK9>E=^p#ICymVgLzv0$NvJAnL5f&wQft&Qj)Bb$3RLso#` z1_I5?$C)^@FzjPwm;rs9d^8sUe*Douo^u*Rp3r-s5_uwROqok(ede$c@;c-5#ywn0t(1=3( zFIq39&Q)PVg8VN{f_WmPj>f~-BaksnqzB*%3z3*5lyRVFNx;9{=`jTDanh@Lx&8Pl zx)A1Rom7KZWa5H3OoM!U@)%}hf!oJ_qd`!=Xr4eoAqY@NWFO@JG&BNeC!jC93~kTv z^1uezKTv_E(LrGO%tF6yK+@a0S6ijlbuhjb)Qk}F%?1)dPLHyp5IphtD-;R-#H^4Z zz^505qM1AY)5gU$1F!>}t}@zJx2*NeykposP)7Q_N={XDiJ3rz%j0Dd2PMtfKRyH>RtcGYU2$!;OsyL03>KzAjg}B<#Z6obNsnh+DI>) zgZO`3No(hgwDFpeOoC%(A$o>C8V@jN!Y$ML^WVq>_yQQ0M!^jkhRFHjp144sV*n|! zuF9TG@bdwVmPjQWkr`f60T_a#i;2d-$mPxLS))GxgdYh6atkhjL}4f-6q_CUgL^hu$Tpr5%^s4 zTK zFw;T{#Grp30A|?(A~SNm3Ukv*lHgR;nz3vLeDBu4xn6QsaZe_M%ZEYCV?Rz_&rUTMR@y?w#%mZ6c1I(Od@;ZPt z*^I(Ou)MAru>a4uQd$b)*EXUlEqE-QJR=`H2J|P-+Ac-95q31#w|dZ zOTh^kS{;r<$s0qN!5ndNzy4#|g{CPw=BE!ORJo8TuHL8@dc|ITtx>J4b$X^+kyFtB zInUfgJj^Ar@-h3+QI|RRJ#U2&hnIsMM(5xhmQ!4Wtz%y{R<|wVzpmSNx;^Xe?c4vl z3{1FVRcygx!3@=V2~?qdQ2_k&XB#OkZD^b4jbtz#KPI2sU;on}MC~8q$qfob8j=lI z8$kXb(J*ZE_|X)2;zOf~H$j5_2eu9HL&B~OxIqG+xWG^{#{?o^f=G+u!XS6l%Xv>C znm~YWfieV!;|K=q7=dEvBWDJS2c#o@H=IRsAr%NwHbjW(R6&Jb4FD5Oqt&WzHXE(Y zer3KQsW>Y}$;B{pTws~Rs0m!WJvi$sk<{TiAGj~!@E&Iu{`X(hI`@8F{8`a%ziqx% zd~kRB!O!p5MsEkyQO8y*qLNG7yjES;00J3<+>5aO=S#2EwNf;dVtnbOtc*tVD8$cl z;D0s=fu9g3z%l}^rhTspR!8_0j)Gy#%etVy5gOElfZ~EFk@ZHv95xON9TK8USQowK zKto>9D*=TB=Rc4{K@B_zqc96>dKfS<=ugo0{4UbZAXkn6o){luXA;@jd>Kyv7zXtJ zODlO}Z9o5I9nDU}y)4U2a16K^Y>Ic424_)~7!A*nE(NPTl`#Q2X>eG;EbKJvYj&r& zbNkM9*aB^<*xB2=@8oQ8R>^@W&Vu06DPv$HtLK)^mb4bce})fE%8IN+<8qWvc~d^R zFu3AL2cjI8l;IcyI|{Dg$jqaB3jEKbprN5`Kl>;si7-IJ(Uo!5;}f_j4#vSqA7z*` zbHjkoJpmDe#n}yg(LL*(bTRHDG&%_`c}M^x!TA@6p8(c}cFn;dH5@o}LOYS2u`j|e z9x#gieEB*!KC3NTHC25)!|+})91kgBnLAc^^o++GobzT!B7An#MKcPXj$Scmbme^Q z=GM*KjfPRZvC}Y$KP?+hyIR~Tfl0=)Gr7eD>#SB;*A{^D94tlOhW&47b}k+_DPYMj=7SK8nb%2xCoZ28iXwg3oVV0_vJcSz}c>$Or6 zc;S?;rRJi(920xV3vwXTKVll=c*3J#<|sd$MglW+2&evN97Rv!G}iltQ7;>c#&j2p zVjK|xG|mJ;0EQu8;tU7=*&IbH%q(zTG)}}+Mng&H`=GeJNA|d;`Vc=39Yn03ap`af zC*((d1TS~~b$7Sc-?|RJwxMN9W>_7r>P9)gYjm2eE9G@-Ckhc>U$ttZflOO=W4M?C<0Qo{BcPo4F zWGpg7hGHxn$B{-^|42*~va_J&7B}v+;McLN!|!P*_iZW1&7mnghxsHpjb@W<)C6Zb z@KZsJz+`SH7(u#M^$8m+ohevZd(N)jFpV7i(ihYDh26QgZmt_Y)z? z&3mf1gHAX4m-W?G^?mRA{Cd+0VbE}UUm^_10oeuo0l$8lkRaf3f~h2nu0~TQfQ-QA zt->?77+=K20#2D{Vl+atZ(6*;)j%+GiO$8 z_Xt5W&7(K&r@!3#40%58$2A@THcAb1LLtV_Ld|1eRhZh?6r69UMD48@;Kr;HUT~PJ z=Dm*Qnt%Cqh`_dc+Zlzm18f2KMc(xNbA10S zlMx^}VLHjMYMYvE+WXs|Za037SfJ-t-#T%Jokz_VhZ}Bdh*GfK>RAS^y*cED|0Yd-%w}RL zaW{rXLn`pfF*6kFmnXF7U7R1CD5Hj;4<&_?8WZ?wCC>okQ?Ov~`cxK{-g{R#Wz8+W7T zIZ?p=OX2s|aY!wjimf{K&mZg~F~;3Ha}R9DqefdzU_+4Bz&7P}PFE`xeb;;cyXb$q zzZm3JZ-`E=*t+Fii#pW6vtrIW|6!+$Le|Dj#nMK&pztbqZd5X;*rv^ISz|Lxm>h)l zL?%Y8h!H49Qw$*g2?=z!0R3Pm${I|8T_zdeimFIKD=q$ozf5HRz7)yfX zE8zN-JynZFQymX^sPZoB*oLv)-0p9^cCEvMmJNo`ZtoxAQgP7@!5CR-=g!D?cnp@2s3kfe(1BUxe5s z0ehVmy@2cx%|7|Ze{8-Q3{Q3*>^x{}Y(oEOs+3R?#E{4prTM zJ_Qv!uLjt4hL%1tC5NrmoZ_D$<7Wt!Y{Pxg?II(mQQvKC?DajZ=$EZlYqjUCzgsct z+w<7}v}6he>(=86B*R5nzbwn1{%@+nMpF_m(wVpsmIYqYsHhUCF=U=G-?@+TC%A;F zn1c#BSWc!AsxO1}GeHq1IwlVME5LdWPa(p~*m;JEb7Y3`uRu)!|B+|a zDgbL>2~iMlNu?Fd!CU*NdDMCH5CKM;4?jC?-!tKj)1?`b5pIIQ%_=DuUOjsZNq}$h za@og8A*Q5|TqTAtWDx~n&0I6rf3epZ?(Mc3j{$}bH(P^F!#M<>vIATkF=eeSW84bk zB;3aOe`sA3Y;_KYq9qv0yegzuWftG}l$K{R0(fm9s(x1$gpwR$7GfGj@|5%r^wH^H zl_z1W;FA~1$*Uq{b5H;PA!kIGy1o7(jgymALyTllB6}qU{CnEle^~Na=-;ywABx`o z6B9vYLJH3C=Txz5wx4#}NZmO-eY*X$<9zmiy>6Q|iQ!9W*hI`rqLE;MgZkMr>R+}s zVFXbFsT5s;$;o7BnFFy&m7^;eNAZlvZiWC)3Ke)mgrTOG@N!3OC8LMc+np# z5&r0mKZGk&3YMUu<*cf`S+5^7|9<}riAcY0{5$C1v=)8}MF+I1lL;O=p~%78NfqzE z;9M+UTnpebX8HV$)P-)y*>jqb*0&c?sr?Rd8U zP~ox5e7%0W|He;bvyiTLj7i|UfxE?ObO3Cnn@l0`{C0fGw zZ^H~XGZ~W-Y|_7YF-r-77&FaMAtR;-4dCPE^&CnGRsd&Mj>8)0@n0F=Vj{(zk1+4F z$3p0RDRKesApeBw``BM%eY{vRoyN9xaP;csS>v;fU;h&QU+119up(L@ii9FpR2V%p zdOHb!{YPxaS0RjVQ>#phTktKFV77&@$Gs?-yl5d`mr1 zFlshEVqma~e4YWI&&J#Uwjrz^oq#75LJ`DXcZ}=KSi4~Y%h19tpB@*!pB1>7Rlj&o zOlcRi5J>-VEj10@0|CWsKD2h8pUy(p8wI$nhRo>9WqZ69gbtr&VX6@As0bSbaV3(N zP!SN|k1*$4@Sn&c^2IXf0o8LeB%2IOaqZ}|KrYd^0mcqGHz0T=h8GdIk|p@JCbw{>ytyh;1I1k|&kg|z^y6Q!wpWM({i8o1bL-~!obfV1$2f1$ z4h^0-HNovCFla zk2VmW)$cT#ZKpoiJ$rHZ)pqmb#oiulQ{&P7QELnM=k9##YyJz>(CWOtsvGfK^+HIRQqEk;T-aRm}WiYT#b$W3s@ zD};cTLSRS%q`AndQ3(8~2}wc}4@sVDj?1VBNI&vV0`QQ27*Y^4LzvKiHo6DL&12{v zJ=1>!G;5pUg@wWgY(~spH1lMM>|coDe1-=je|MrrPOJ%6Xd)o4`ADc^dmA z>?CWorrLe5H*g=eyNJ+)pb}|ryB+UBXy6QJopw4!^gqUSQ8wr1y0;n?{iC|Bic=N+ zyUuu(eq4lF022TC+d?jfXce6l^*AgvHP6t8_a9a=$irf&|I4vRf{h|qCK6;hQf1X3 z&VPiF5Cw)K8D@#fbASi@9@W84M|~mY8%_8NASC`)8ucGJ^X`H_pGZw7S4`WpcL1_F zbzR`tjh#XJUMB)&vNDYdn)R*B5zALb?|J_GnrZ^BhdQks;bTKB z#0~Siz;9?>ktLm9P0K$sa_O8d*tDodB_=D83;4d<)9DYW#KaoG$EX@X-{Fyvu;h!O z8&OI1yft>t!}}y95CB1G!A1C@7?7VxRLTT`0Z5{7KPED)pOy%J@O|IMV486Lt<>z@ zr^9Cb`1#0v{P0P=IT)ayp|VMwGAR@j7af7D`rXMS_P;G?`F}QHgmCIXVh~y|d_&XAG)60e|8S-kn7%zG*8d;MWJ-En`i|0N4up6Q>3>RBu*gMo(GQx}J z6O&bcESpThZ5l-Xbe>Ut5Wta9(1ikMQPxLYf%pBVzVj6Gj_03F&hYP~Bq~I6h*XNr zFqu0`wJI`h_cl7uP9HYv^@ok!)AlkJ0@>tDdIlVf!_YcuUrI*t{z(cY5!xho6R%^) zpK#tHIhFC*fL|hPw(zAxA`NfJUiqg7Xnhdyy0wAZaL_=S++h=4apUQiNLaP7eu!lC z$HrXiRu}L8XkMMib?~RoxJ9q3G6+L6XZ@*>%jGuVBS_1n$&fX|^jA;aD9t2DY9*LR z5Eet0_z5;po1poOz-1&tA3I^}`wToK_%@?_j7^FlJCQEH2Z9vyF6xH~oNE(2G;!p@ zJ0JT5o}Ml(Rc+W`-3QJ~eE;=_5V!mR_`e_G8WyY1v%a#xnipJ>V{rbGrU!lak`g76 zR*tJYwc;;Ln85#`kIfP*6!YT{ z&c6i}mAyj5(x`uN>)!+a1DS}zEkNS2NZez9l1za6T%dj$3No2@SH=$fbrg|Rpsri+ z-Scw`Q$!W|?}OeDB97;88r!XUqjBirzX90DL^!t>(!MrJw;`8|C8aU)=Acio{Ii}0 zB^=DFJ}O%(opXRjM;P_imvFpr66@4zKmVa!+k4fkR31FocJ~L)-h+*!7sKw}Xb;@r zz#UXT2RN-l>sGIFd+v0uxGF;t=H-VxhH*rf>vZdTtsGiK-OMG6al@nhu>bIPiX?N@J(b`fZMI(jzhy4x-E{~bR<_%fD%N#rh=0=wkDm*%3{mv(d^ znT^$a3KdhM1jE(NGvIiA)hTE!lc^&5j}imm&|0w{**hIiBhz^J8KP%9pvddZ&Y`n5 z`~n#gy;19lZn&#@JvV6O3O&7O$n%vSw8rkW)|^~4b6ekUe9tI)q=6w^HyKU6q)pg9 z`?QT92}VlRK;T6*BF*XNmcf+a#$%y_*XPF7Der95W4P~}3&>SLh!TWvB9RJF^uK%; z`*#ixl9Dtgl2Ck5(Qs3Kd&a3AJvx51*LXg7>6{>#=HK-9k&6h4{tly-_DBgcKnAS)>Nr(|b`e+Px3`OTBTG?_|*49x2^f%o9dw}$y z0W@Ou7OvMG?%gR3OCH>+b<0+Nc|*OdBlZ z>?!i*%LYQiFjQY<}P{lKa2FVzB&%}^`! z^y3@8MKRs>FQt(hGA<-$;y06q&!lla#;Bi_@o-rU9s*nk_yNAG`9ua3>JG)wz$ z>y3xMZ#;3Ie)jN}^6vrzKlnhaOJasjBu&3g09PTFMAsQ0T>SWG_jJ@4b^8a6 zLA&IHP-)W|O;ppqm8D?&?WL;=SU+AFIvqEmQX>=^)CvRnT*oB!5%j6m+juMxD}do_TC_Sv@c;6ZQvdfbEL%;*@6K^lC3yeiAB>#cG7 zd)Ay#ROQNi{fFIo^oqvnPj0Nqv-#&0CH60iGP_5_2}I(x$(S{=PcHm(X*UP=qiVA!+iT#IJz= zDy6*7kOh87fGHuDa0n1!YQoefxLPmY~oV`FO<(+)<~ zKyN*lg;s7|xUC~w7WySKhx%8y=2qv?C2rI!Mlt6=CrVlqChFfBlTjra2O4~mwJ;#K z82(R~(3okgKfgAv#VJo4{p6m5Lk z+TD2#jmYU*y{G4%c>6CmMDTx?Rt5d9ReklN`aItMjrDD;Usuv%`aY?N@GnzbrVObp z`k&z1MPA_%qPc{CC(vifBJjg?w52jG{sM#plRCwUKgJ6hSP5oB0c0JljLm6YgY5;E z7PB(37}XF&q;YKrLbeB=?d%L5Iyd3~F(yKV;?NN=xH*Fv;=O;#PArcR z)T%*HNJ%p>bK*my{Ntd+OK$t&M&maR9`1~G5c&IRw|81Kwe*#^NGtIOy6ZI}Wk=l$ zv%pW&Gq#UT_I#`sM*cubTstQyP+vft&P3Q!Zfu5`R3rqv4yLP&dM^rU=vR;I&F#Z( z{nG~x;B1542M-);bECQ6eE0_8;_Kb#Ce&f7t{2+I9P}%ew|>2TYZJB4)B5&yU7s_R ztdz2#GD_6v1maJ~Qdnic4rGF)u9E?BBLwgRg;1KnWfMt8nGzul;B zH$IYUiY)Rt8G_h<5I>$>GLaD{&=lb`N_%n7IH(A=94wCQ*c9G{GFWo1=F?J;08Pi( z_+l~>3M^$NfRA3{J^>`e>Ky2`1+OqrOC=lm4tD>r`w;oJ!~U!0-fMjS>{Y~XBgQNg z#ltOw`$jG)@LyyXTv%xNS&3#rO22QM_X3RIBN7rRO1(C&y?ZkqAyHqkG(*+ae9(`Z zc3tmmyC=PkJ!A|uoWXxaxaP?anfJ#XNJJnNHM>ZS&~ui&I<8-{Zm$;fqIs)6-|%?C zr-rN=qN=4V(wf5kj$~Axg+4wnhNNUh;$znc4RD_UQJk6t{*w47Y?hE{2*%q!^ndIf zsAtJ#0^(ovir{a9A83p(ltB269gw0QWB@EIIsKgtFcx*pV0qPqeyww6R}Expa-4Q4 zLF6XQINu2^BhS~yudn$gxi&N@JV*%o$IiR>l{iKU3h$=~H8oy4uQ9w|&+_?*=r^He zPoN)meqo%ryGIVXfaWvgZ1oR29e2NZG#uJbfQq&ulxvx*PzGCg|5xX9S)5zrp%*LZ7Hp3<@bU-N% z_!o`qiH$HbB@Z79u`A$$I3a^b@zT@>N$kH_?GJX&Y)nfS^J>PbaHWTs9Gc{+Te(kuf*KFJ+f*0DpDfN+}_ZT$m7MkZ~It*8)7Bo>0>YAWPEJ z&S?pW)4-4aciX_jH=L74>yP$u67KCCY&~oKZoT;#U}3k_$2lL?JY4bu3fy^g*rfSq1$D zVnuVCx2)US8&4Y*BZn~ns$}NO@8bPkh9Wfr*g{kg0Yw>Nl)cbqGEw|EB%BHG|Dm%1 z5))yf=38Pi3o&tUI;;Tn68X}*?Qv})V@4(bWh@43p+!bnV2jI3HMiA;b>Z{l*NFMw z?K@3)eKnCO<-wyRuBQ;QL^|~Qe8T4-zePP4iq!&)mQL_wDq2SVM2HV+J|2>rvTuAB z7XgnJL<5NjOR^7qb5yK}EAHygaps}=X*Smzm><&JIqde2o16V-U-Vyl>Duj<_4WGw z;03ZW`k&2P_1gnTiYf-H2#Q>2r;Y2t-^_?uqT>(Ingu=) zrlw}&p>-Rdl(Veum-~gJ$;ur5B`JX13vZ>UuGuCBf&Dih^S@6(^t>aCB&Wj zk*_1B3KL>V5<)a-W+zZ=G3@#sNQ{j?L!j*N@Atp@9VWDF^}BDrIvFHe{u*Yg?`z_$;J3V9+W0J;kgC@BJ^)B{r+!J4yvixQplok?}iY$R2$ZtNE^Yu@?U5|6V5OEW)aA zAtJz3y#W6Pa!8O-j{`PJ>CAcXEsRow!`wEF=AQckBpXH=VgLKB=Gh4ZC!OZeHgZ)* z{f-5R2>9VuWI6)@!uek}cD?Uk%}J7s+Yx^e{wX`9m*`of{**o1ZQ=c@B_zYpk?>)>%fx91g};}F`=i>q}^c)%OBgevkT?7 z+dS+Jo5*-{&m0s$bdqChz|qs^R{*rg@SH+_{!wy~x7!Q1u{AQ1!t zeb)gO0{x36@M*=U zu=CrKgJ!>voUex?+q4#u&5|oIiFgX_0}M7AOT60|t7+u$lcl$jug9hUsV$-gjA|f< zm^?+@d=L4$A|t;8aRit(s=!UGT=3q1VsTkfS2UxE89c9spC93Ow1Fp|?}2e>K09b^ zV{lvFZJX=k7GYxlL5R(7&O<(7JOuzYWvMxJt~+ba0bha?r%XfbDJmddvQXmQ4YX)N z_P`nhe*D3HD>db13XxpcI%gvGFPh=;_9BK9X&=x>+5QreSm}F=GHub?48H`j6(48w zMRTWqe`j<6OBW!jQ^#D>BOaoXiZINic3w^RY??s-Q_O17Nl@o7WJW}IFC@f}h0Kua zXWj??bp!aCHYtRrQH7_2NNBw%!D&Qml*BE;w60bEL-Sd4z2ok^+1-QN(Cv@h#tzQD zh6|Zk&&7O=HiayytR^&yn;&(dlWA-l6}lzBJ=c@VMseI(;+MqhU^|PDr=bi6@xqwQ zWfd6+tQ4;OUCo!9q^CJ1!bNLuYY5p*WP$gJB1j{&GnoJ4hc1v{Oj<*zh>3^~1{Sxr zeb^g*`lQz%?KK{tLEnCj^G}2JENdc#CKWW!BVpXVLZE(J3si%bSX8~p^iIVBNsU07 zwgb8v78D`_{PT}MguuBBZDcscmmt%{0gU`HWT^;TX|(@25;QwU2pc~>#@woryVKr& z+;pF~E-JwTr!(%PYATB_9d03`wE-U?j5E0ouz}mVvzq=3@QcuEq=lPFNv83lAnf7> zW}Og%3Oj@nG)`+16g`zd;lr{fr1B{KuauDi!6I!r1KHrX_ANkP#FhI<{jSkU=3|bz zE1GTlh5J?gxAlY3(ZTS@b@$IYrUO=4P$VgoO9har%ZA!;(OTn=NR!NloIe&y0VYCC zF5vR#VZ3^bPacr^+8^9MQh1U?b`y@BkOWO4J{`Cfph=I28L>a!Yo0u6HebFPw)UPK zA~E53i1BUxgRk7-9;Bi@=mV@(@E@jy?yqa02g3g6dc}&7?#YYuzZiFz@>2P_4s#v! z8F#X@8B4RC2w24zDo#0nXA##Kz#~L@CSMAcr0J-La+%a-kb=j~5bZCKqgR3?rphkH zT0Vy{#8j~a|KE$9-`3ktFn(#Yw}0Fmp0-Uxzs3qhfeXcH^8Ps~7V1uZJYkKi8Es9E%&erpTUF`fp`-|7`&krQqKwM7+>(`&+8EikT*XOoYy@w#&y^Zsq zD(g3Ma|Kzz91=VNjlh^3q#dYi2F;ptS|dm@4O`nyE-%u2ei|$#+U06;8VN$s?Lz-hjnkZ&a0R9(aD~3(&)Gco^W#5!$8fEfgl}KMlsZdM*{!DL+~h~O1hg@p`UlB z3_(SQtbi8c1@u2+mIKQhm1n?^6Ucx3QD!ogETIY%`Di8&YZww<$>j`1Ech(+Kh8Vi z%}jt7CGEo&nnqhB4Ml0&!%z2{`v*ul>on_|&EZ+wv?VWSS4AO}4GBp`xzO_8`y<@{ z=%m+t);TE?!q6R(D?^NaeXXQpnTS(xPM>|F#81);A;Z+2lpNn;Fu{A21tB8Od8Q42 zeqTeL)~4HNAD<16U-q5X7`NnZ{=NYV$pE~7Go<6NtV4j(?Znb2n z1;G!O4C$6Wr-CI;Eu~~gB>_oYLA^b5>FfPZ(xDV29;lC{DKJr(vm+4^I3UBN3nuzE zdjk6(6+}&vTu3IJ_pe%t;#hBf`|{=fo8bTziu>m9t25U&kt&5*Q!Jg#ra45lT)oeJ z=)-&!aNC&-;rL~^m{PWh|Kpw$-Pc`bf zt*_T_3z~@YK{g>C;bm4u)CY1D8On&2qbgzlVJ(m4W3_ngKS;9@mjr_egaGVG>01`? zPw*2nEOG;RO>}&=-%XO1s5;j1Z-*~;`uo6t_mO;ha0>S#8ho)-kXZB@3LBMkqO<`0 zj2Y5GYrz#j=;0Y}RKp_R|Jx-&L6|MFI&GZ)2?%yG8T@NZysQTAqW;4e6c*`|d7^~+ zoq#P20N`r-s5ksiUXI+T|9I!9^*8mp+dkPm0Wr|WcsRF%5E-aM(Eod4DMN0h9}D{R z3iNTRs(AT&kPP$64U@g2<{$!%6=qoS9@g(DmuP5KLNM->0Nh2yB+XAz_n{M0&ROr= z8#@!`3=j~(tpm(~ampnUwE>(@aZI*BgcGEu zqR;jEzrdQWc1{vOL=lv-Na3I0Whf1Qd_nmW)NkL&vk`>Ou|hH%RUuqQdOxiO877GX z2>CQt(5}^#dmqPyW4H2yVE)xpCMw=>fz?scXjXnZ!~Uo4WSFY zn0X2KO8{(Ak*Cw9HN*&Ger_RC|0yS0(C07WUMX2pD(MKzB%i=J*(RsZ9hHi{98nEdZlo`2j;KqxkIr2xh|@|?{{)_ zvgNJcd;Q@X(sgO+hLtmODID-Da;D(&HU7|Mu3;h$Y8RA-K^TBw1xEn!?9CkJPCN$x z;{-LVpI1w|i0EWUsIY#mWA)vGBedqD=FZOWRkJ<<9) z434h6WikQ$6BMl05=+m-K{zITCWG})B&jULE0B%h5aNPD7;c4`SXEgRXX|>tg`h6q%w1Z@3-aF4e(n6 zZwfm4A=T>#VV>2!N9`|xj$lhayY(MC2o0BLR3%EN70AFx!|_az&x?f+7czaw#|r}3 zpec*d#d64|ij06dM`8x+hZYIs1TgVzA;5pF&b|^|49+Yuq8?3^Fn`Nr??yFT zIgkF;=le&PQM$JW;%(Eh>l@CK?d|PNR0J5hIqJ5oF1~+x8~Ui0QQXQ6a=j^ItP7eV z%R-?pTaXPG%;J5-y|Q6I72ZXs{=tof_!K5c6cR!7g>tUrdxLp&Rk;|<_8A;12i(w;FDYmoSB#ZLRpB_ z#xxbpw*vQM{w5_QG5b#e1{%sk|K<3&)Ky9-hw?o0Z8HNSz8FFNd`bIpv6Q?7{f*BA zexay1;(zzQxubpb!~Ok!+l6G>`C{#H-F5+qHC=DY1Z-11&nk^PMJS|lo!lU7j_=2j zOkp5P2?1-So~~jX8H__0C2s;4|1;_DT=p6*6J@%<5*;6=gKH=1o0UJxhu9^tUNdze__#KlyX+>m}!Zj{St2q*}%R-!i zf0?QU!T+8|yt$SU$ps#h6nOBT6q_VbphBOaL~#EXg-i|{HG1y1KV+yy5}A#%nY>mV z-}f2GyB85)r#Pifvv~qC*j*nUG&h?k_HeJ+_1-wP}17C7$J+I!ctRi4YoT}v@`zj4m??unqG{GGCXm#hM+lV{EVP6en&%Z6kGMFAIJ$}Jx)iJ{7)}? z>-X~S0UtA@9c7hF{3fH{fwaavaG#(gbL#HvH?Q{o-v;*JaM?CPB{5z4Ni@k{gUa9z znJ=)cGp_g@KPk@O6rsg}=og`NL9jCvXKajInwQ4T)NF);frX_cF@&kBS)Up4A}E!7 zQAu3G`h8lu=EG0OT9R4q*hO#FYP)&jwwf&r-Q0gv?>~9mJaF0v4`G`+?R1eOgZ=Ne zz=&@fx5k#I4pQ++z(uzu6yd5fXhoS4^vi16h)Uzm>@`G@OXvqFIV>k~Nup99rbIS# zk(GG(qi|p2+PY+gBFnsVlQvmV7j?J4^W+GJ;9xX7>p$;r0|UjKILYU;Y>s}PjY?`* zB!xl(>$m88KHM2lPyvVi0RE34{HR*UNHXuk%P)?tuzZ7NGZ^lWWyv+}HV=JL6h*X@ zgcZF(mBB021jtf4^&I(FzYG`{ z??3uKOD*UXm}x8C;E}w#iZ>ytNIxhTQBf#Ip?}2rr_(S#M?rf^A3~S4&Vr@}IfqA% z{@0ukc#^qfhxzIZDW$L(bwc{ZlUFP1FZ#v)6#y2oPX^mqm5~m{BHmsTRW| zqBRcweQhEK{43;8YbBK{BS2M^6|?Q`w3>TIzyJN4!D$~y@Zs5EwORxG1tXGol7ef( z`VGt{hJMxQboA~I(2>#C#yVE^-!3Kq5t`3kc)az(a8|HyQYzpCzmc!Wl~o1 zkR?d=_@hZn66h+waBbQ1>4|2+cH1lSNRn%=KH0#{Kicb5`YuM0Z@@o^8_|0J@J|om z7^|TF=_u-~RmA!cG7JT=r5js%OAzyGKT7G)h>cC-#@t*&f;X5|FQyeplc0b><~kdN zZVKzK21N)}L1t9jYoe)ZVmqs>Vva|D1TMZk+H(=??d+WPO(dV?m(WUp|H~+)c#=*O z6H~y?g>pb+Rsyu;GlloriD&2Gr!qnomAi9I_vR}^Vc&~Nx+JhVsTr{XsRZJSQ6K~o z@F079E71NV8`mTS6hxHG%39WTtlB64(;o67Fk`|!z)ygNV2DEzf9xH4>Dq%)XA6#5 z>G34?UsrQwbj5f8`ueKZAU4dFbVo*NjBqcG`NYEY+&qFw1ksDeP%vrD%gw5$l1R_+ z`2QLtzoC4}%ywF)0+oxd<;1pQ4RPln%l8c8hyKA6R6tcsaFH}ty1`urzr|+nOeIzJ z2gsKJnZbt~U%VP9@d^`kroa&{rc4iO)k8S{DLDg6B&Lz2lu1k{kda$Ol?hSCn3|YW z9slrxsR_|4Mt&=7h>v50^!?hh>AH{Fo1Z@XY~-BuoxKw{#vI(khb?6Bw{QraVicRv z^Aa@29b7NQ90pTv*Vk894HvQXMysI2&C7DsxDNbb_9yZ@TLw5WTMi4zM2#6gK;19U zQC`9n<#Elga984NO|@GUwT8J>OUNa)>`}YfJUB!C?{OcG;U)S%6Y}>GGA>y7JHY>f zQ69*UX?1E9^f9Pr)<|+i zF9<$okN@^ND1}MPsw*sHF#}Ifna68+vu$?%b)$aT9iks}4m$@Jtm5pAM)=cS*E#%h z-0u%61F7ZlzpBirI%x6jhTf^jgNoIvSgM90#9U5e^>HhiOM3{hqzFcsUx2`=9M?#T zNwb+U5B&o8FQ|rOOtxq#ASJbmmPQ@w;JY9G)_Uh>2_WyJEmG|a*rSKP^hj-oey4&~i z)kmYoz^tplzu8<2Ist^#G>q*EAX0n?EwH1`50G@u&W~HdN9hWW^kJb0{9g$nA@(|i z&RM86CGY)rVEGI!%{jv2KrU3Z#Z^h>A@9TskLn%t@(t)om9{Xi1&RZ%-}$|C+9!H-=7806O{{hSRrne&)=m> zOjMmq6h!nRbEyA(QWZXD=(!iN6k@x}#A7^YTXI_~`e^U)1W}637nrw!d;qJ)l&b7wfWr=|+00F$X0kHl`9Y{Hb&>Q(UW#q8_**V!@E4Og1%QUM8F$6De zhLD;db6=l-j$cjst=wtK?DA4g`B<0Kj9s-4zp8`%ga7@v-9i1ZdFEPcB^myAAyfKJ zHVbYqk7*_h-ha#AqM!zOE35gIQVJDxgRBu0Qz9e5BRPxyKb;iBG)hp7E?qXE$efdguijeS7%4*Mu_cvos4~^4b7^_X zOp^ssQoQ{SC=8*qhjGmC%$8@%@{GZ_X06#AA8s{9r-SDQ2gAL+Q{ex&8W|&%<#0*^ z;)3c>&Lf|~_B(Mt=}Z(Lbcig4f^Hy%laNhtg5p>IHP#=^r$rJIp#h%7ZS``BM4yGt zpIa!hH0mGo9BUM?ew{LDR!iRz2wNra!-H@%JC(!Hv;N@ZB{)HhnQ%@HFl3^;-9I^a zI)X+9jk0(C%dA}4#$3*wc|b$m7S`W3)U0xwW<7qWm7AM0{>uzTIbJLw!lrg(HEid| zoUn+D2=u4YbVRw?57oLXTg|P^&Io)#yS>3#+s67WTg_L&?(yPOHY-Mf zC@mQr{5jPNRb*8=KE}eXYoVAE%$DI1fhU2zF3Nuk{c^sbkb)LpN~@G3{Ol%e2veE_ z)jsO~8|eSu!ponsgc7}!%4&da7*kFv$X8vcYBmyhKSOlb%d?(sci>2Bjxmk7JHm<3LA8+<^3czJ`I7FNd z?9=_;xM!{_PQBZJG8pUMYIW-atY1J;APB1QV7#U0>T~n!auF$uw5kK*Qc1@5I1+>$ z8T$P%F-?R@r6YC#FdA+A)k?mmlvZsAan^N+QBZ0g9yQ$o&Og(PR`Xz$;iAkYk;8={ ztn9a4%x|e7!F+v^uLWk9r4TfD2>}!X^FjJ{TG0O%`CE$gGe#<69IgN^fpZoGnDb3225p?&`OYr();@*{B59bnjpe$!}Mo zPUczl9Pn?rlQ00s2^xx2sLmRBe2RF(_J(_po)1r6b@k}9^ zi}8VvP4;~MOYm>(UAh*MYJ?s#uVDS~nzKmc$?7*G1O0ahBQF5Yip%M>pd;j@sb$EI zIaNc87{Ad*{_ZlK!?I$KNPjCJTxRjF)(J%?){|yfLcYdf^U>jxF8aV%7&MDyMf5^= z30^kGdx!m#FTszuJJl^r;=}hpw*_RxYYw}*EC{Qh1dQGoREYuM7zzNx`p!BmoQU}4 zVPMQfRHlOYe;SpbB0+dWYdS*qu=|iznlDb;OhVpOeFpSnIvxa z^X8*Hya)Tob$9&wwC`G--NE+L9VAFLDwxi>rT3tnRuChiZ}moZI``G;iCtC4G{)(5X?%*S}M?%E-8=GmeOvY>>o9UhlA6T-Ip)%+2Q?HYALi3 z9BV|u-Q^POg=I;=`eDTer|E7}AE4JkA|M*%MMb2mipQnFriADR8{b^><=K|=;^?arod255 z%3@K>D0Bv&Dw7Xsoa_Vt7gb{gY`%04atbqor-2c287R(#C+~rh9k&_L@Zt0=>sjqP z9VMzxq5lCzqOmEN0)L=UOLL5{tVua!6M$bx;S9c9PzguWh=N=lyE2?2EB(Xa$)W4j zfG2(MLth}8xP4RyJ~|w~KJ2^Q0m{F@FYx^%w*W4woRx-S24GlsJZR0;y@aLW{I+~u z&@t;e71ZADC+4mwk(S>a^N3PP!8$rs%iK@bmL%Z(-ullV|9G^24EXUy^W}>Z-2Wvv zE2vT)gMVhoB%c5XfcnWDOKHsJOVomFmFW2IG0EcP|3x7a7)79>`&*S!A1Wp&PRZ1> ze@*mp#825d;PB{w3qqW1!+)UR+*?L>h1Xxe&_bXm(R?}FiIy%(@b9=1>Y&w?z2jF% z)9bm-dj0fp(BACyhX-wY|E$>`zjjAh|DcQe-;+pmxAm=}{*i1nX4mz>xQA%zx>1>z z^@jW%^$zA@^1jt`eON~G5zjx0(*Sc2h0+vgsPr1@a8p*-T<7@s`JU5h{(rz;@XGCZ z`;UWBF5}jWV@Mhw6RylkT+rM9nadfz_MTv4|E*LE-#-F1JxEUvD6)$DIeq9N|!thEYEGdh#{%6SN!SFm*J1^7%PG}{PT!9D2o3I+w^!LC`qdyd|{~&wh zIq3(_a`=}mCNAX}gO?c|`SSuS$`0o4Zwf#a{i`RmXw<7oQ{xw+UcM6hQAuP zhbQ2FBwNL&oB~+MgU@v_S`%J9r+b2gYqYtg;0_ zq-NksK6tX?+O5hvcl{-ZlIta)Q@ zJC{rAq>0g@oX-LdllW&Vn6IJ2k&_}=ji_ikv!=xsOsRzLf2XzEI7aT}UjO-^+v$w@ zy0(m_qD+JOL3P7NF=9dGi2k@tNf&u(k;vFVgIt)7Lk)mABD_S%x=$72<5mW_xhk8j zN=702oRulk4J6kn?KU3dvadC+PL@0`r>2p54C)<0ys3a4F+t#gGQs!Xz5&sdsypp_ z6&R-5xcN_@$=GV#2RjALGz0_ zoki8c#R@c(5SUU7%NXu|s)WFK*dpMbg3VT_q5dI*l5$yvojw;GL!X6yo=;nV&#pUh zos2#P6Pd#(7$%Rp0qa-zY8AQ>3m6tBCGXi#jI`E|^f(2c<* zOXkzu+X@2zh{ckxJia%vi2f~Q5>`c-EvxK;HUs?II^4ytM5-|8l;p`Y|sj2oI!XiGo~W7YspiI@TU;++!#&-aLaYz1KYKFN^RY zu`2D2@rIZ+#9_#^*ZS;;obRp)Tu zIl+)IB&ylKX9wM3eR#I#p<^hE(GQPKQ3#+Et|MC-)vh6|!XJR|fBq?8VZh_YhS5W) z7@*I$y-^51RiRw_awQ1Y1nU1#qqPJNNnybfwEK|cHBe?Yx6isw0MXC(-yCQX{AS`J zq<>5*3l||KZ1VC1*6)egSseM0!2;;u)}j$)tZ4;8RlYeR)8iI4bqPtXfMg((N{e*v zF%?$n0$|Uk_-ect)z~A~M9CvJX0@iWNNk(;u8j$%3@HHZpmqflMVtAZuoSgNV zZeuV62KJ)gJjU67FvQ$ZOzOq-Wt;)ML9ew93pH};;mm`;VaWyQSvrC3qG9zR0?TO8Ig@q-~$dCf)ZO=k@$t0U2}|1 z(^ErW#L~e@?V#K3yN3sReN@6I4!`~ckR-F&H7Y97wdGahtMAqyY&`YOKNNu*M)&(> zK?o(!Ed+SqvpUph@X+ ziGhMTAy5fSRl@!we+6?$=$SxDnXu>unq5hvp`dQ6qy$yD3jad^s#&jc)R`2bOhuM_ z5{{|(k~C$ib;BLEC&g?r%PExz$BHx;PyiL?QTtj^{Q?Vosg2o%k}#ukxS36}T?H}+ zk>ttQ|4-EW#guVLsLOB8~myw%oFQtg2r@>$scNf((|I~J^T{nOrLxjQa$+7HrmM!I`JqqE#%RdsG zWZBt*yDnusp8r<0_jtF_-oF_BHuwr~FU2?OUv?IB0bz5NJc_sw%@vIa;8jz0Tv^Oc zWs7gL(72O26Om^l^fro1lXGGJKPRfFZFJduH#|u+Fwt+Xe;R9#%;e?A8%Bwb^fB zcE)NvM7c)wjc$C`Hm zI^jtx@V(l>FzkwUdI$8ufvY!E$2}g0a{*RPhY-jhvE*hRm)Znp*56$wHP9NBBg*QP z)oWGB+j^QnCnW}=>;w+MPt4qcL9g=^DVRI#D*E=EA6JrEWHCDvCu;i&G`$G~DHHfR zV_biEqJ`8a_K|o=pPtUjOqbslxc>L9eVEqcDJ-naA9rYeO|-5qX{7%u-o#Fx_a{yB zLPmz_wIuLrp4TSK@7)Dg=}(!7MflgAkOSbHmE-9J;O8`)sGKUCq`qcm3#+l#T z3;yir(cYhZ`srR!tM#}8dc(uo))rb(_uKU|8bTn`+-+Lx*49-mzcD2MLXs{CN>RTB ze^<<}{7J&Qx}#$tcqm4Of^7TV+1~Dv`^EF~C+@F?_}_Y6Td&WxBl^4nUJ`8@LFygdWc=m5 zQDpzOqj#@Zf|0dQ>{0%{qt0x-bvrFy?T}#~C%@23r359kxGyhZ=-XEG`esmf2Beal zBGLjcO+0Jwlb}KD9;^4y`(fOc?^m`OJ647K9?{- z~dj#1SrM z@XrS?@K44#4^O9!smG6;IkDJvEu#E4lMCdpZKs!1O{Ccdl;A4qi^SN?n{q0di)gcGSAWF0S%}S1|3wp6C&2$JSA=w4&#Kix*WfmHb0dbZl zB=I)>JZmv6NUMpmWY?1E+m1Ffd^cm)y_4Sl(O&25;>nW^n6~?@U#TVnx;FX}`#*y5 z>FW#356R!1DlTyUGxeR?zCvP4De{(s6DAA);PQ3yVX6sJsx73$=B}Kh%VB+|MQxyWHvyI=tU)sG;Oq$?Qxx z_=oEg($DkaL)j6{B}-U~OIb5PC5TFELx^4B{+~*7g<$HUHx|UZ=}ak8HN2{2ciXs= z4}!LLRR8SLew~n}_8v(k9k0i0aM%gjhg)>T$JB#dco@TMmgf4-RdS{y%kSPrjG-mu z#+mg7N^iozOPK|pzI+`h>LgV)mCOB#)5JjF0* z+Iw9EBSW({g6FE3x|`togT|AxDz_L^QHS^YDys9X>$;Z6=Bs+7@J7p;u*|p&EL_Jw z>OpgUU)D0Ms|q4?iL94Zl(j4K)zCkD1%Ca!_;XAfMPyfM8~|&ilzB+blI{Fyn^YDS z<)V}X8t{Dh{Ik71@3hOgl~TCZ4g7}V4yk|Lc2n)p4yswZ>(*80s+W+i-IWSas_q2$ zKi38LK_g*0-$(goPL1X$06V?CgW&7Vc!b*CyCjws#QWXsFs#6)Ub zSF*FxV!p9#Hllev1hHX4+xA)~-PSIo#_^tG-T&nA=*3Xc>N9pqQI({S&A(HeU&?u#AL> zhHe}E$@bf5%H++AaaBf{Cay-e@mYYgFUN~ll9##uZ)3TJZop_zpUxK*As?wi?9f_< z_1|`bU;STCySwM!=`(NGX$1r^Uo<-y$J*f@&}9!8j(fm$nGCwtZj&mg@q?$iilkn1 z(uIVWm)@1embQ^llaiNP3*x%$tfq%4^p8RB(}y+xpnu`+?d~3&cSil2+U9Ig(;3!A zwh*uQ}B3hbRjq?76ebm5xtD>5je-;K4 z7OgiMnW$S-W}Hc9WY1(jMJzZ;`k6d@Ot1RUz@58n5*-Y~`$q7hbjgl^jCt$Zkv7PW2UAuij*4T&xcip4LjH2ZTtV))Vrwy)dQjq} zVqwCO1&5xAJy9Q9%;EmNzHMXJnzm+=w;7r)ugc5`#A0M=2L9#u%oO*(g7mm@iQZ6L zj$t=hmh5c(;r{;=@SN9cN9|U#d(j)T4|YGP)s7B=J%|fX(hE5u+=(8EbGAAZ4X-qwa($LI|{N4IF#F2 zw6$|0yywJ1`oqFfH29pH6;4Fi$vg19a-^M`kT?M!lcTr9+$5l33HrZSvFK6ZpY*1z#Ht{Zy0&V; z6j@%lxnQK6ccq8)47c~qy@T@x@4ebE=r#v~Gsgwj>-CRZhf)}@EPQRsf8???z)7`S zrIte_p9{%CYov`yAN=68$H!|;<%9RkwrJ^fLGwk^_BuhWf8f=g(gtk1r}y1aH>+T3 z!C7@IT~9-ofV%UH~sJm75)rt-EiFVsR8qYKzWdN@2j+ znDD9N^2NfN8xI9b%g$(5o|11bqjy9RP9_BZo6i#Mz zDMVX}n5Y$kU7gEt_6+TTy}dcC504%_I`aIsi(itWJqQ}l-Nxy8zc>DWha;YX3d)G^ z?SHbHbNL9?opthtAPFZ6`Wk$$t@lmH>cKU$ov5fN$QzP=m+N0cZrlhiPC$XVy+^%3 zMAo^PHRg=fSbjN?jefZNAzh8u$aq(qSxDcUkd3&Ox-+*>dee#&XW13RLrk9N@A2H( zC<4}`EY}~aRPF}zAMiE0Ib}p!uNxCuJS(-d$cD7Af>HB*0UZ#^;%Z!j9LW7Y0d`ng zF>n8U0Zt>{0R@VP4YUBeMbQo()K7zEv(?0^(GQM07>CYW_Yj!Yp#3R#!0Yh~I>J5c zfcD2IT>me&Om}@P1wbN4#KsRl9%H25vSzK`wY698Ir;j6*$^w+nC_lDYP+3p;QzHB z?X{ou0$G&bekhq&jMe2tT3$#jzNe`%ss7@@W!Tq>@)mUYyTXU*OU`$8BIQ_l!pLvG zwepTMwh5Xx7<=I?D9<#6q?Rfcrc>K_MX@G}%)gwsOk{6?v>;`scx$dAi&$RTh>K;; z6$yp+-z1=x+#(E!Mg5Ypm1Q)*CVU0$CNOvMM~oI$z3$%x&v@qj;R%lQz1nW4(HcT9 z9+JOKU%UZRaF@HF_NTS>I?nlZ^=iG4yH?Tl9P4+|mNjp6b9(PuBaIENk<&MwZg2NE zXny&xU+wkw9yRZC{!tV}Z5Gz%rR%Y|g+y%i3a?PpdttwAObXd_bfFwKmhUJN$e{1w ztDm+7^Y_vHk3EjUru-fPfV4U5G4x%&V|^#>sDjE^l>TvJQj25--n&c{^aYVAm?a2S zgzLW&OWmM8{9X#(75$kN-hXL(<*E^rQq~oiGQh|-cgBa?f5SnYoj!Qnaqtegy#qof z+Wp|Op67!We$9D!WT6ZIoyPU25z<~;yXKg=98Gf8&s>ru=1T8}7J6c{F>5!{HvFsZ z9un}{!NuPF;QsFYBlyQkaoN2ki!%MhIRyZqL$$CVFN9!h>8H@A&nvp6?$}^q|vsdfjIG z5#7M^Z(eqe2ZR0ytmv>esx%mm;}&A=B(1LJ{;*|Ty@ga-dOWrjsZz*U!&}yns(=R7 zr_uw*33~p;@ay4Gzqbbo@X;RruOf&LQ=h0V#iBo560WR9ZvX+PzwqBA_(jgn#Jsq% zm;wCrJ7fz@DvB?BIFX5~@Znd9wV7X2q_i{Jm{zs-wyo)elTF&BS#kaiChjJ(v$T$L z68_4p_`a4+EtRKdgIRegYNIcm$}$b-+A#~iLnJJdgF=4#z~Gr>XF zR43$|$NC{I#Y{=TO^NvqpDw$lH4|?vDB3*wiE=zel1Ii^jnZ7S@RDFCh-MPA=9HYC z`w{*YWOBasXI;F5q&A-q+rer3_?aIZe0ucczPtP6{@%%}F+EXIym|P8wdVSPslHc3 z71VTbQIGlYEXB+Z*K4nTXsz+#2FrGRyYuy@pB#PV_AVZAzIuHB(Z$d<1wBwRj;k}cCFXBUzpXT+RoXI)9E2H+y9qeeRFj5IJo~W zJ{fi$vz~sK@sKw1w)@GP^j2OHRxZ~+_r62@dt)Uw=SA#Tq`8yl7isM!+=}LLt6P)tB*mOV{qc!4XfqW|N<)N5vH~_qJyV(I4r(%5Hm&`~CeRs|Xee_Y|GW@aVYB7O0&XD9}QJT@B z777r)=)~@*s{(umaYm%{Yee8VMRk2+>M(kPaEDn9j5mV$F&OkrQI0$TiOCwR*Bkd)rvSLPn1x3E>r(p(k=@(mg7s_#D`I% z^ky|)0{@Tm*=|Q;m&3qWh6iGe8@|{SQ2^6}kbmS#v2Z zi8L5V*cB0t+=0X}4pPZjVng--C=uaAvO+nfPZm@0Urx(uA*PRi0e7wlNvvwzTQ@61 z-h*H6`}Kx<(5W4}r;T>l9i@pEAQECU%1Ma1h?}p3notS?u0P<6()uqNNXNj4pzv?q z!h?zN?W^F=;Xjkw*KReaf1RRpgA|g>-l_;BF>&vAcMwp9>;DfG(&wa^j7%fcQ78R{ zGyyI0PNpPWGbH%Cx+ye_sgfNl%YWb_4@y}|JZCB-c?swrUe^=ZY{IyklO&FSKVm-k z5u4y@nm(fhtOfnwGC|En#fcS&_s%%V#Ezh$Cn5sSNM43-drP?@78#<1p@o0;r=50# z<)RVYZPwa5r@fx*wa(gpKtB|!CgXA9TpCP+8H)2sR1R1_i6Z(|=pN}KJrpL|i6+r8=QpS%S787?XCSfyFVB-p(## z^f=Te{0RQ^vL+oy=9J*gvVf@1nvFJ;I96DL{3-+e$2N2Sl!8Y_GUwG~QcWwXh@en` zrJXBX+9$@?ud&jcp@ zkN$q^lSe(m&j-KR`}IlJFWQnLdy|LPKTz;FUZ0{&nVZ{2|4x>u3HdrRW34#SR9#T+ zrK8)qxyGHDmc;z0Bo`k*LwSA)yQmk({A}v)3c&SvuCocMcku{fnG#g*;4UC9jw zZ8!s_hA1gXDjm4ChUrNUiH^t^s_r^}R|LNOP5(+9T%^ZXD zJK4D^I5zpM2l%hNaLSx{`$p$d`De4Z;dooOZSBrwr5>?vaQ%}!A<{dDzom-&cAfp-es5_7W1Yb9nAur+ zx*XlStlhqrG@u#E@c)Cvj7U?w4(1(!km5ub!cA&v0xy1^y3YQek|#7nixj0h(M?0I z2D*tTYS#;ze*esExx2Lkulp1?b?_8vJdZ%w4`^72TRis_>YvwmxzEFS;`@9P-dnqHGU=GjFl;QE>^K;KB!^@ zGqU)?C5`l*4@zL%XRvj4+&miU@BPcU!W7sxowiF>`wo)^8p;r;bCz2ywN8Mqxb;gr{oE?s1=F}7AbeDk?V>2 z_$HvAX}6e?A4ckv+lV4X(YQMq(4Z*3r5OK!^QBgWn;=z1OfCKb{vTh$MGmuVHPyQ8 zas3&eNOuz?y3Au+o?tSDLogjL&8KzEg8xZo%Z#kq$u!4-qM}545mFqMzwe-~<1jFu z(Wa#TF_~Ew7NXjQ0K}ob?L4Rjy`yKrr=Nn5IQp#i=cj)A{NLFOED#Or$lL-7l8a36VIc@GNfta%^Uc3 z%HzxTCX9`+g(f6#DzTfJLe+R+OGihp_ix$*;G*ZjSKWVcQ2X?#bzW~X)*ghjv34&! z5L*Z9?%1&$wX#NYgz<356rmGD{ntfON8$AHWl($c31I-kU}alKK-dy-kx|5M2$6g& zzH&JjezMyn1R>%0A$R z$l3U}ox}pCqq;zki#LHjrIPDuF61M$Kd9AVylZA!ZR!M|k-2ty}3y%3_o zRD4|7DzELVHQOJvcGnE9TD@CV&FhB5g~8eWE5={7+JAk26hI4DZjc|3eo(cOrMV0x zk1!d$P@)U0Ux}*Bzo`S_rNy`F#i$pHv8VBBc>!3kr0H0}#MD-_8%6YQ3rvm;)m~5y z_$Aw^cs8YbDQ>FdJyn^?CwLYzg~&#Z@r=y*5X+GezC-4K`rLG~mqvt*%8}WJlbCSD z(l}vEDmS?PVtnz&vTzg7KP-_4TmLlZ{p~p-*^9HY;EZ;byVni&d=A5Zb2bdm0>e(b z=?1&u^|#k6>rI+N2iIH}dYI>S8e#tn_DTB%t2+DaM*q+TtEd2_+$bcfT6HS!I7WkXiOTX{B{b76L`r(WKA$_Eyhana+&_cc1hkSnrX$nnzv{C`MdJ6O$tS( z#3WH9JN0!-oDrmSUBex@@E|Asy#tgYOrU zHv|%=GjR1w<9X+jl0}gP&x}oQ>?|x+$nIwjAS)Az8Pw zG!0-nF2L`~5wIivZ0V=s%<6R^xnj(SizsIdC2z4=U z-PY5K*H%S~`KL3l@vam9PJQE2M!zk_$s6ikk9tBftNpb6qr2mJNw#l<{*P47nXM*P z^;lJkr$G7oAf0qF zwmmg?gXdqKFs1|~{N-_hzKbGHOWNE&;webqp-%#!j59~Q{$K37otJH1VrRhof=}DE z)BP_G-NAXI+wVZtL?_qmjT?2mGC9`2+oSz4vKo2qxriyDvGm~}4TIiI$YF{W>NF|ougm=Q}k_+N%xgsz@O z1nA8Mu_aw{ls{2&B$$wFyylF&crI#ZihQaB5D_hErsTgMNu4+iOIm`j565#0X>dGy<3gi`Z4S8w^5XIk4Hzr-V+z- zSeG~w-A1A9r#566ajH6!rVKgJg4R4awc+PW-+^DSdR0+>a>rJYEK63 z26OQsxZir&?w$|N_POi>nxf2yyC|w{sRBZ2XjMLbo!fDLaftT6b?$XM{|N|^FWnRW zh}zlIEIW&KhV_>>El5~W+%9ata8mGGN`z}F5$1y$bK7d2y$vYchjUJx^@jm@2zVQ+ z*!TmaSEhs_68)>8h5Bds+)**AXJynFkhxY9vzw4mWFe{{mzI{O4{c6%*?3?S(H<&k z&71PUs+y2Jr)eSLAGc`0*f;5l3y3n}X)Gl8dnXpjX)4)9xmyDlec<{>bi$8^p?}(Gjt1DL$Gw)PmvgwrPzkUHt}z~V1NvX>HngGc@cwS&aj$a%f!4OHO|GJ% z7Nn9{sDT&ESPFdWoDH`N{WCuSZCrf2r8{=Co2~F3)+5^I^{j!s^_t)j*zu;17@Yb) zCredR*JqupKJ}j#Enx*#6ogGeB2iAs|9wWelJVyiIT`vR$mNvc4QDA&o`GOgC;W+E z)}rAtLrEOIAMQ=s8}hUrqb05e{=iQSn9`3YEhd=1LuklZZ^TCfR9q_l^cE=wKE>66!b`FovNBzLG^@r*5y8Zzc zJvxop6e3ol_1cL_v~QF*i(X{WGL^+@blXvuM}loE&e@k7)-Tzl#=>Y+>u>l8V>RV~ zB@{iosKpW+#qoRtQwZiY*xE2PHGd;Wo}B&;Orm!y=L?LXmED+RfmG;H-5L@ z+<$p?dJNrRf1ewGxUq&*;ra*b)IZlkfSm961OJ=h{^|K|_iFq7zB?ENzHJwt+BP0K zHAfs9(88-3J?_I7(NaWkhzkg|Ocmmoq_p(JP;clE5m~+l%CNEaeRF>Wh z-rP>zr4=%3Ll8qBm7XkML@W?8LC9V{tE{X{*b{Fn5e>*p)?z+Zf9VB{-R4=)JMVX4 ziFfbs_WkoP*``ZfL()vEYc>MQ9pRGeTst)1cUulw1iyXx)!Ff=w>M;R3UbA>>-v^v zeM}gIl>UH0iM_U@M|$JdRV!7YogtLySD409Nh|sKa&NgI{3KfW_d55tHz@Adyly;9 z|C0S*Ns58Q`hDw;oX|7DXd5#n$Ylm3jL2^1qnN=G(nnnRc|DVx>%M5^X&wB4rRsh(2gAklBA5xkr>f&_XoSD>UB&IaZ3B}2`rAYB3A(mYqe`IW1|H-4? zqfb6N@9ld&=0WP=Fm9qXY_yvJw)xk*-2E=sf4zxg)AX`a_4)5+zPqwivTOk>YJvu zlwX0)dq;W4d(&aFj934_&>4J=?KIt?3>!abL(vpfbY^B+pM2|f#8}G+%j@I3ZdX6v z?YG^7i?3(|cNhk>g66<$H;nTN1pgmk06ojQRUwcMi1%~ zw^d2W+Tx8!If>}DQd+v2ty*`9V%Pl9riA3jM%}FCm$o6R!!2x(alwnleFNy1BkSk+JqTOJ9KPakHWeRr-LyiCootQV$-FW@5!?^{$b(c@h#b~ zJ@Zfd9#ZMy;Iw<<9uJ;0n}fY()Ajf93qI++U^?1sv{8xD12|~>z^wq@|(doBDIXMl!H7Q$%7%#bLmto!D&eBjsk1R zLK$370&z}gy1K*+VVQdb8l#fY;fILP6?%op;)pa`l2nx0F!tXz_dVF-^clpl4Z}$7H_oRbLbUXyCOTs`W)olG?yJGu8?^oUSUNHI%ch3F2 z|6|y-Y)1_-%ZTW26URrLfJ^JraNM|hC?t;4A1F?RJ>3d#gFsse03I%+b-{n}fJ#>@ zt}q0cEynAizO9m%ui~bImT!sm*N$YaX7!8+7Sq^F>QO7FaX8E+y7P4m!mZcc5-msJ zp_j}{s~qc;rOvD!Rn*zdgse#Q@>p4k3LBZoTrn0|O~rCnM0l6j!M_KCJ13F|KmLVK zELJsd>%Z&_oU^^oOYg~vODW)Xd$2Tumwp%B3n% zMhECWhb6;K6UbMonFSTS1fK*KhV>uLyYkYpo>cW6600r65f58=(HC-|Ep`!qZ(7#n z;>`u!#vNHk-7MOLrIfPcWQ);PmC91`wXrPG8*ze(k${UiDXw6r(xb*z zyBL%DrCc!M{8c!m$Lqg?nhBi z7M;$L3`3M5`hu7AVw%SEPXbiEGbY(Ft7qfOGRNL@Qgl+$^kOz~nFx3(nV77Ptfjlz zYQ_fX<#jMkpY6NP&jyF5y<^~(-G6<$->hME?)YI_825ZTB=z-MU0FvxLTG%Q0r|!VL3a?!)&U$pw0a;`4m6h zzl97TTieN1=F8-})>|<#{8X)DzM7oENAz zBs0FD==VJ9!Ey8SnH!wC&E3wUHrE~VK&930os%*#2uoq6gN6FfppKWU7aaQa zR%>|CCI75|r*3P9c{yMmU3Vc$e1C*KP0=C&$5-zC)ykI0grw1!=}D3$WwMKn&%M~D z7P)ab?%}bR*jdEl#z{D3IHjbMdJ4bN<2-4kEut_ag_O&Lr4__RT#dKBuhH^ueclHI zVEoTs>$a)}5WBr-C;2cTYqRLj=|y$M>CJ?$8}Xac3Ro3ATMy+)i_v*=nHj=7`lKCM zN?UJigCoS%7+iE(1n984xxczN?-N4obvpa~&R{?A0m-ljpds#{BN`5#ce;K0KLnMZ zo*ocR)3Wsso;qfEO9dqbW!(;8!$08upO>;?J0m%cq@|oKsUkQJt;8^&gTt@?*m=>) z-cusg^g>Ips*xSSR%nWADH%F}qioUNZ}Dj`-lBi55`o8|s>=%+R$|2Zb+BkB zt{cnK80_y(*-QlhlM#=-Q@LGHopNQ|C~)q{TZ#Nr3X9w3wKc6gPli~^n^lYj#lv_3 zEt5|dLR6g{&l5cHp>UTQp4&yyo{e*xb7o16X-fp2tE#xA5albT<}G2#N+wdy=N6%z zIxT|;5gWyNW2$6cCXgKqoRG)zeksPh2I4Mnbxj`gr+nx^!5@n7VvtHDT zwn!MQuqB!(L}F%Ea?F&VRZ6Cl-`3r6Lx=icD5(_sf`X|eb&MjqK<95(mKSV$V%R~@&-qTY_S=6&d^7C>J6Gr(4^N$P}*1BP)6B&|^t}4qJD;3X$`yYM! z?>xcH^El-NX!=iZS_vS;WuRPFqaKHAfGNAj?E;uQ$*K=XgN%WUjuJW>-xVG;q_^Vi<_;c>I)`e(tQ*?fgy$Ui(H>%RF-quua+&D!}0UXMtbU}DxA1%dn2 zJJ@6W4;c|uY<27E4z-WV7U-HKb2Q$`sandgZ~ybKEm&))X3}<)*swsHgHVo?PD0PD zxcRQMy`(>wGG>76)J;Y@JFH)^b@w+0}oR5 zh+GE0$fKpItvDk(x?D*qX)f!kPyaiin9ycKB1Ww&Ea8}vloGR2iY=M@|Mg#x*d{x`y@J2d*iEw`Yf9<|noq*gwf}BP``@TuFQec?&WauW)uxJ5oj;V&|QoNW^cJ z)w{(45E2I~og&@Vk|tdj)(_PZIS70NQQVT$Iw5V*{ME}6gz+3Bhw&{_jus|#<-2+D zUaE*|&hQxPAO8w*Bwei?%rkAW2dRS3kOu^(Cj%S<<1rCbdqKDNoTG8|c>lQb%Ja89 zvu19ktz?BhQ8Uz!nI`LRT$K$~DXO}i=J&RAD@ms~)-5pKRrCe**R4fl@y0SeRyb2q z#7yHcUCn0LJ=sIKettg3`c)vQ>$-V6FXd&xrD-NV@7T0BI!V zJP3x33a6p|m%$DOa?XB#xp#8xdS}O{!?OUa==k-k-oX?1aPN3{T7Ud)2S|R>Z(yr z(t=CTXlLjOL9{Xcn7~U2>m2+L&oVNXV)+?8dKn2~i3xIT{Jy!c4E4M;oygvhGIng! zuKM+_8Hn=6Z=sO%@k{ycleXK3FHF)cbKmjn@vC;T;kLV{7o$e4;h%M01ufKdp<|+g zcGzQ~TesR6Xqca*bS?Lh_Q4HHER#Z~8ZjVxGeerhQCtz^@5X@TKM;zZNIjET*^*2q zn#&Ay*IR3v8LnT=rMF4=WcRi-%n!Gf^rl!`Eu#^RvHq&F+Fec9TaKOG($K0!os{z) zwD|O@2|>>1`p+<4CjNO@BIiQEZ6Qr7m!s1BU6otH8DFy&5-{%6$#e)Dw`VpL$GO*a zk#}{wL$CYWbLw30@$sPB-~Sr8Vzb-vUUCCKTRd}v&a1xf4tvLgS3#rhSX(=lbWN?S z`zETP{MLGS|NE&e0ePQU!0`ClVdsoG=wPoi2;IZ4z{8hx1~af05>XTr1j~zoF3oLtn0DCB;g8B+~$iiZj^gPZdbnk!@y~s{Q)8pc zQwehYJ2?}WO%`_}M?llbI$Zy`SP%vpEq)ZKe_oB~aFG)kCk54qhLwb2fr*D*xlO|` z*Le+9Q_$~eNlV3)ifS^EbKWg0Opx9)ON$!(05f$@6Sewn=PKRzEkK&8b4@lyX)PpZ zf4lyYOscW8NCBOe7*3Gp7ajt6Q!8BmeD)s;rAz3hm?_>|uzx?3eIRFUI<4A&)_(Hj zsOgT54_$I@2ah}bL6~}mda%(W{Q?Qy;fad`#^DYb!2jp$4^#!^aK+j|I$9RPxiR;D z&aBMaY*^sYfR0H(B8_Zhl#iAZC>FdIRr)kbccLq;oMfmfKe)arY14YS@&Q_-JdxKa zDW#fP@*_28N!nULlxoqZ6hvMQ|AXScXcz+WM%B6PF<8k#i74e-DLleq(@^96@v#)y z0Av8bG8@JdNpO_KpUtPxOjs%DeeVAyoK-V==-SN+tJ36>rmvtz+SztKJ`DPv*FHSn zp)b-W}cHP?fq3uYY?!ZgzPOwhVU*%UnYzXM^Ss=MmKm*Ppkn zRGC=|>xVf73DUNs)7_MyUr#CUVYU;QV(iXkv7VHfovQd=K;ci>hAZvxly_dYl7(c! z&?)kBJlT{_>sxQPl)PzQHH#VeOpXzGN=*}RXHW{5in)<{`ko9en?gXA!s{P_Y7LV@ z#9_lLS7LsUNhH9?SgAt3GQLIJu`$Ic7IJAs)=&+SK%AA!_sYBfu<>#~=(POcF>gQj zvCp{sB%n3Y?wp=*C_L%V_dE;v$Eaz;{5R{Ng>YVV3Ey6~Xae1~-tUe5HMMcIjF^S? z5YGlSXNTv1@ID^ij56JLQC*g92+G?`_1V<9JdrYlv&dbm`~e5XeCI`wlZ1kuPby~8 z<$(ZDQ;SmK=nnl)Im`JOZ7*l~U};D2w$)9L;++2^`)vrvs=Vfp-K8kacdDOk+F1V< z5R(xz$@gS>Bx&gu@Bf%QqfBW;fZinkDElTT74kQ4gmU@a|1EgVaLj+a2UEXs{hLVz{wF;DDOe|llvK?Ru%dB% zHn%Q2Tt+9c1&nNGRM#2w&xPN#urj5 z8BeLWK2w5$oM-(xV@{f}%^Bq*B_@dzavWZRvS8fRouFZLAjkKH=;XWJ*TE=c{Sm?K z9tKV5TF<(B&CwU?5A-l>r`$#d9BY&MhXs8iD~Acy8HM|wY0&Qf`Q*#q?xE{G4~_?C&%5V`z30#QSk4Cf z?ynzrPr+=R_6CjT7er!gvgL`6NWW57*Gr^st(Lg{EeSzD#a>my+k){Js0y9?K9M8p zXJtD0wKsVKTIytmYSoCWq7_!P6*+P=QK0;}X zZ!Kh^*|efYkS$FMCTJp>%W0vwndimEYwkZE93QtkJKs(Lo;~+R;e_;%EOy?1Cr{`S zfIq?uh5xx~sJOc9Oo|eQXH~L5dU5?*tCDe*o?wwpL0h*Us)Pe75pOxC#3?%bU$-WW z>pxkZS>zNXKveOldU1@MueL>pI%sgjw3Fv$2+BD*f5t|pZ9Rq&B`j5pkIZeekT zi4r0;*^Wha-qcn!5pAYy7g5D_2jk=Yi$SmHjwyx-yKAO%0);&t({fRdoc_8M*%a>l z?8veuF}35X^a{%4HzAr+EIY-4xZuEkFPWzHOC3|PL>dwO0pE%9+xE8E z5QxS@Cuk^YnvYUV+b|_9@-LwlV~miYYo&`71j@pqo=b9wwp2w3#y_N&gx2hXWleJy zgv|x1m@$?R%5x4R{hF_u?=s)K)xZ6U_aD?vvo}ZfAaeL&!R!9e(L9 z<4CQ#WcY_#%hC?%f0&M>I!ps7Dm+Fj6{%8DtcuZ)N{;rBd{tkp*H@h_vz>0#x6HC^ z>1H1DurAdC_V^f)T2lH48_ig#A*e9_G6zeJP{Wet`3 zCi1dv-SaVpjV~^$)zfEP*XV{sn zoWMLT9X8CeHGJ)>hNC)$<5Zo7Tx)IHMZ0RqLHTxB-Yl;^e?tG$Kp%IbmEAV&hsL&y z;Igii{jT2Ls%>8>kZxZ^oC=1^mefGux{AS z)`me=sKytz-7#+)1Xl+6=NcX9hOuQAWjuF=S$4`d?Dp9DiG0(sxZE37SCoAj8ACX& zHd-5vz#Afiych-lD}?vQXZwfk(FFj#X9JJGnG>JcU}reIVDoWthqr^@)ucXs?%rPZo8y5xJ5{T8q4r`>YT_v_BK)2f#Z z{-8}s?zG3`^3+=;K7HrGQ)j!yG0iA?RdZ+C?^K;C@8@m9z`OS;+kF?XQMJBpS07gI zHd;O+Zz45V|HYv-@?0Me`S5f^N2tC3l}C<6`&Ib!2lcRZgv#FN1=Wt->3Y>+0F=P%Y!3;}Lr1~FQQ3g+_V}~iRzHl_gV<3I z$nOZqwcz)Bz^xFgpx5*~C@y{%1`{%DFjoA+C+786^i-t}7^#e49t#-3k& z*7ZF8J^Ww3S*z+nJ|i)?$0Zw%pRr~%e*75q0kJ-Ho_c$KnueCe{u1;;<=B{ z0)Nna(#Pq9@UM*q(rX-_jK(j?A3F_xJM8!S7_8wfF(5%bKVoYDix>{h391}EC!G#i z*=X2etUl}pcx?D|M*;Ye7XQkEP*XBdMtV64NAF#drC!l~4*4vgi};5829oS<2Y4B@ zbvm#71-+2pGvd$kJ%_KmueyAJ|9beW#h1cw)ExnS_Xpp8Z^qT=_4q;vKnuUk@Og*t z&*vM2KTz22;4k9W{5V~|6aL&sa`p@VMc+U!oTyN21gBhR;XmUw`>k zd*35tfd3isX@#=c5e@Rus}Y^@(W_VCcNty0di4$b>CyScML0begv$KS{|7=HWL{<}ZQ^$mZ)7s7w|Z~58&|L=Ga{#-P?FJ2AZ=6>_E zJ#2sDKJmNmpmDZ)&d`tgFNB~H0DxBV>>J(>XD|PD5bXa=w?8;P??1md-9IIxkBzkb za(D`U%|11pOSw?pH%7g5BVdm+*fBQI#H^J7}F?b_ME#n60y zj-cu6%K;F~XH>A=W|OR5o)r(|?Fh&Ae!np!GL77{4!Mb4lz#zN;IxS+o>-}XWpyvQ zes{n7|Fv{>D~=mM6y6s~9wM-TB_VR8^lk#{@#=Cxmt_&Z21rFfwavqff0q z7U4cmk()vT%A9+vQ!oU$QN;z>Rh82a1Flk3;lV1X@+Anf9<}ynQLXem$os2wXKx2^ zh9aSzz)ZF-urqpX^cQZN2WOYDUSTz}NuX|_+RyVbsaP=+O5`Ge&~k334WOOO^r?=W zQ16)MNK>YI4+=n6XDd}XxNYgeQ->iQ3^bTkB;~@1LbV@G7nV-cRfIAyz+|(vY`YF~ z8usI%J+@ICuCu!1q^;F54BIFMn#QkIkr#{{S9oPSg^{1*<%+&+5$Q5cxQ=5e;CT^X3ooO9 z#!h6kd3(?X=j{!fH2nA4jRMt-s?VTKXXZc}P@s9<6mIG7Pl!ESI%|{TLq<>FSPp@y z57hrqN))|H&9O7#NWXwJrJDwF)4}J) zMg~xkx6*IeS~Oq?K?2gdvB;x`@XCW0WZ8Pc&=XJcSFUm2G`^ymA;pzq>_$8ho3RZ@ zhn!#pV@lB+&XF=*Un{^~Ir*O`*NG5*VC>~`G<%%;{HQJ_FO+SO;0c%f`s=$~d+3)P zHL@W>-5b!g`B0mS0%hX9!QahN3$e=9SxSLj#4X>B`Xy|tFnH%_kBp0n679KAEC5Oz zOb(;5zZ7DfsVMOdTD$(*%Pj1s`!srNcPc>p$u=i=?x@HsQKo1CfLS3sVVyQ&qEWFI zh1Cdz?2NcGiIBcxCa@bb>?a-CNCH#WYY3vXT^N+)?w^w^7VZYIic7M&O%H)@7B>v?&p`W z7QcuoL3Wg1$<{NQtHRBYr^=a5fB)|JbN`hT3$bus?5yYiEY;-o_c)O;v*~X?zUSdQ zbt5*L4RM;bu6YfZ!TYnDnQqAE^NsQrn_le~YIu}tx)GC`Z~1}dur#xJdE<&2g{`G2 epZx#%?32%*e(~(nXCHs`&X?~$`|#kXTT#jaTvz9g>To6P68;16>hW0*vYy@7AS&s~4{e2}|=pJe0k|9|~~ zN8l&m_Y>UbU)Qn3SLW*Lzh2?Nx<*LzkWV+4Q~q`Oe7LlU*TO{#lC)p_w%nOgLes!#J*mAKJfp( z@&E7r-&`j?-}hAvp8hYN-}?IbE6LBd4v(hNLV|@S&2rgnrI;uP=}h8lB9Y+|Qie@Ay&XEHglSgTZIsZx|>0cG=oSj>t@Ov=TIEK3L@A(zZ2GAS;@ z<+*e!k%AX1UMG^7teDFr;wg?zq%s`J38=_s`D~u&Qkg_H$>#Zrh=gnwu|hh@vSLxM z6^c0--4>*5T*#&6L|(}Ah~-6i>P$M$-(05?`Amryioy-gCayU)9b*gmVm_ONC*#;0 zo96g*24yqxRF2E$ulS-Uih1suji)ksE`zvqI+K%%8FEeoSl>g@TyN7lk6?iXvYW9*XGx{{EqnXJKdfY&^#0ZZkQd zB&1QQ7|Rv849lnUESpTm;yE7W_;{9&=iz}wp3f%YxmZGE8%P$5s8~W-3FVQ}Zi_NM z5%TF}%JVTvK!s9@&!AlPb4|q*mqPFe zlH+Nqm`=ywu+qg0Vy|yvi8NQ_Q*l0)9bUl1;!mvOK)Kj0kIluxiLimTvR1Tx`IWNK!+- z=J~YB7m6qrM=0NsB={bL8T+M_%4O1Q8kWJ93US24alr|pqL@kF+$7^D&WU2;9u7VU zA)e)n5bAKLvgt$)qCI!bm*AE8ESup9IfzIh3x~(&cs9quljOKGLK&2YWkXo;QmKR* zS+3aNV68$vFE#{8&hv6AovR{|6Z7!qMGl^%l+UG$2xWN*cAjHn$*)&Ph{NWlc_C9w zLC|sW&nV<_Nfsgjc0drWbCMut?;G%p_eCU%jYcD1gpDZNKgdYCPo=Uk#5Hm}hccyn znU~olyjk&@N10-}$mi3rsa!0HxLhuuYc)_w%6`6MR477>er{IdbDc$Amg4`)Gh8Xl z3F+7so6GUJ61=%=jw=_=# zFUhdvEZk7|ACl!#K5<)ucqVwOSxPk2Pd4XBoYNtg6j?Ye4k6g zok!_-F_&Nku3S#X;1IcFNstl}5)1WWF~^tSU$V%Tic*P%FLF9{&GLMPOTxCLDxOcK5sP3YsF-OKvO)?;NI-cO!A539h|&_u6nH&X z%ArI_K#f~5dkYIFwv~qlTv@pYLC(vWB*)#rs&nj3HkX5Y30E)onGq5>0U{y|sUa1E zqB}L>F@fO|HB)+Ux^aR6UQ9@l&Y%0w{1J_zgx!G56)wnf~VHv5LOiinm zd6j=aSWqyJlNfcCMiXO6tRlV@<20kuFI4VCMH8@O;I@44RpIqjTvKaCp2<9-<^yl2 z%AJ8KhEh`sxKM-ZpU<*cl#gW-DK3_V zqm1fG<*wOOkfPxr$*^`)Q7ol9kS(!iU|YZM5p2nhxKak=5hw6X-B85F?LcX&*yj6u zA4M1fBDjMsxNS4MZP`J&rpp@UJ!ygiwYP0Zq1yE%-0bHW6e80@&cMK930da7Aq*-_ z$d^K%%cl~Fuc<5~48*50d@*^=bD!rA>;Fu59MT^$Ovx^fglZXA?c0&8W3g2mBF|`P z;|948)ccrB2iB}M>j(WuXS5oey90Z$t?dn}1YY~h$I4cBW@};}H%-Hx*j^Lq-3L{- zup-;`ievaqV{*4gGe@%(&$4{K>r!jh4$z?%1tBkRmT%}vx8cJ92DY#_tM!GA{g0jTn(fBx>qT5N*bb0Q;8NwOwMgw;RI71lnEe8*$^9 zJ;x*djs~mKkQ#e*Y0~esaKl}!C)?EYk-F**Hu40|%?qXenD(&W6kVoCPs{gauxt@; z=65Oiscqky!Ku3qoFNG$rv7Jxj*X{?I`2w13cJ&0q_`4PvSd8L7h(X1uVeW{EXU;_ zA7qm}TjMzBQn&=HzbPX|7~!>rs#|uChPr8pZS3O(ZuR%(sY!i4i7uo|&9`&3rMoa9 z7dPCIvl~%Z|JMD?@GZ`)Q^?>EM-55FughxB=4&8XiWVr(#&Q18-qc22mnY4^N5kE8#@ zqXV1j6=BS9}xD=mAL%+ioI0RTB1K_)qPNPz(n9nl| z7c1}xi&aMG*5@X!F4KQ6J2oB_T$vyr>l$_T_q$ChS$pryqVPbYCmMyXlXK`&av1E% zFExTUR!CxMyap6g0&jHwymBd?kH!XBo%-$5^DD%E(7)&>g%W4tP1mzyL}wR5os)Di z_ViqkxeuyD1E=Y?U3YXSPg^^O(r@m1HE|~`+-CIMkLAgt; zWaeyIOzpqa(?WfnZo`XVJW<=|(w?5n9;TP- zY3u$ICGpmw?h#*H%Zq{+Iy&8LR|GENaipJKe{eVa8uA^zJB^3)CwCj1!nfW>bnaio zOZO0+Z)Nr}H>lxsbcp}xd)ezxXPf25Uj%-Ca&O!*c(>dwt>8I0L^Im|<(#^+w`O!1 zET49R;giPH;2w?oTM~}{vu!zjfA6)=;?WuXPkeodC7lF-PC zS%`o{St?YSx+#u)+NJvvc=<$spWD%p^ptq^Q*bKDvnPfV} z*ID*2R|zDP5mRsC`KDn~w983e;E@REIewj z@zZ(mQA^gSf1n5aPmk(v{yriRKF+>BP(Pe`d-8*4Bzv|q&fP7EPP5g?`$?(yLEfCR z@!q9$RL-EcOJ9$Ce|+~{Tkq~{bL#I##15AOV}0*JefhB=n^Cxr{&=30L$Vt_ zMF)+%_5Zt)QQ%QR?K9l+gS+4EX7VBU-i?-_-#?HSo+*%7q+Oh7OO8*^hv2lM&QEe6 z)Ht_~E30g^!i&`<#EryFV@n!_L2ci+M>~7yPV0g2rAmE!3a=2IF6DoAKZt&E_Dyf+ z*WO0~4W|tH6NkP-#)17m)CnPU0@=hvmCQ{H+9inp5)ebFcgY3L8qz!U)= zmA$%313uHmq3L#Cs($&e#zx0IycGhicjr%i@4F87ch~5XKzAb2zqqfhkHI2bJvs1( z)acUuXvLJB_qw9Sn;YrpKK1u~Ot-YLCQsx3`iTk*R6b%IN4v%IA&QRPWkdD83W!RDHKZ*;2zkC1hnpj zEc2Hb!zsw>TJ?=OQKkxQ;f}m44KP;hZO7Rth{^2q7JYO>GPW+gv+>cVK@>ewN?Y5D z@^PP3P6Uc$_v}%F&S-SdAt6L95)D>_l7AqkvR(Q1W&9HEY4~(9E-UK4Pkv0I@yR*{ z-HL#{!}EPeXQw+_9}{!fqV~wQ=gwTaA60$v3X%DAN%V_%fvk)FxwS5XgYGXJ?dSp= z`Hd-m7-KISICT7h`+Krq8ICp-d7iz=ji8CK0I7TW+o$z6pJmW{q^k7f{LrzvfGOrC=+>7SxkgS?I| zEx7+fx`Al+Y3t%0R(k_K4-Up+Yx}{BP{hMTrwSf+jk%Trx}vK@9Gjz16-+8id_qQ9>~ae62c#7u3H{3pa2|aIe(pDGeY)? z`BE0DvR<}3Zr!!Ft&UX*MDwAJ0Kwx8hW=ow>d%dxEZ1 zvS0R&5Z=zWsWFnf`k^zlOsdWGMtHZbTp|0rvm98Iyu(G3UIBrOsqZ|I!kZFA-jR`h z0qWJB#)IPp2PfO1hJD|!RCB2v+%NwqWS_@kj~eYAe`{?iLbPm!^I`eE+2(O$3A z4sbgm_Ct649U?x$t=qgqk!+r?wsiVF+P*!e)dGQ)9T!cHpFWZTD?3jq?qzT z{Tbc6A1ykyXDwZiG~zf^TbkHMo*3h2bb7kCcl+J;vnSi`j)QM~NO$tt06ev4n!g~L zoKa}}vF{ltJKUOf(*g20o67)WavgsVOC>26|0355taJ;!7s|-FV%`J-AEgC>Wv+l& zRD^D|gL}idQ*J~3A0oA&|28Z5-566C-F58N+;yV<|LH>g3&KfA_5JSEh@#P(k*PsU zxU_rNS^)r~?X%wRuYBKqa~3PO4*YdtXKnh>H%^}Dc>Rf$&du$R^fix`j~1z=4A``l z2T(yh7{1j~9xnCO_$k6qc4aMf@0hgq!#+0q(0sf%34S|J8WMl(&M?K$aQu}~-v@LR zT6=tXYFa0ILQUWRkd%b5XLBGDpk4jv~F~X*6L-|iWZTvb1s7*q{m9Bav2{S+N8v?ph4M8gGmrQ zI-4IupgCx8%QQB|)}#L0C)(Stq5uD`JDZ-4_0#hcz zbDT4<8CFe-ajW$*Y5}fvx6s)i>3a~qx_xQ{GzgrJ2d2B%p4=xpa(2{QKKqq-$1Ypd z3h+BXc7Vp1;5fuze@(<;2haluQpHa$TNFQ~H=N%lj@Aj{CUSqHv=I{WXxts|p=Z3$@IWo;{!tC-yr@yals?q};4}LY6?ykGFsXY$2m)eFb+qh(+R&|W2rcXI0 z=T3HUK@%#NBo~9&kgVoN`pn%*#Op_j#E{PDrn9L20; zI7*(0G6LBDA_GRGufyl9>qY%BB*M{uH~!K)n51)ZgKtl#)*##%J7OBZ1gH6OIs-Bh zYy+E1aKQJbQXKa+ch7^akh{-j(_%jUsjTJ_Nl<+u0zg<0^gB^2xu~N`16+lCLeeqb z73-)|HB7+t)Il`VL!aQ^eE=HA@kxUF@BG@%j6>JeMhmh6)a-3XHsEkNf1@*z!3Pfx z-a8sch~X32M^Qg?yluA(1+Q1G#|q9S@b2~+ZBTs?Y2EU#3K@Ne_1o%NbIURG7`|8o z&wg=2jY7|HvYx4DKn0HIAp9jUy@MOMr$qn&0lU;y))Tv?qjDa)-h4WK4FYAh2%H}W zq7MQoL~=kh1JSrxK*DW`Pv${KVq>Wc<5SOw0c`PwV3|8@`G1M?k5s$ zkFb8o)^HK}R&s+gjR6$}{Zrx%vH&V@=+3OaVJjB1Mw|!gdFWo>m zZ2KYbvD*=if_-?Z2=dZxQ3LejLI*%Z4-aGvbC|eyp4&=(XMYoKA3OrHck8d zX6?3J;|v9dj_JYpOZTlC+9x`W!n1Ge7RKVJwRBVvSOJ7L_*(c{yhn+zsD=uL1ezWv zgPUvBRobvO$`#t(`GL7uzA* zX?yPh`}aILRe=9%p4WQoAEK+y$zmMZgVEA&%>8G7{v)DdvToScEE0@rMAxIdkH_OXkB|4$@y97@Kn!E=$%H8L@TYocK#YE_V> zGyw|Vt(eH?il7sG1+fw|P{;va5(UJA7RA~H5xdxL^;B3t6oYa{b%zt3=-me0_C}F^ zzn}Dhed(Q*n-*}HkSTwlkvy5W3*viyy3}UgH+}tM^jc;b(PreGx`*z58LdtPcA*tU z2O9F1)>^V;hTplaRh!hp-pY5VX*a0m`(zk8Ykkg>GNW$nokrZr=;e5~Y`Uk5cBIhl zbw}rDcG?&lWvQsC?A~e#Aa?wl-wG#c_2c(f#z>+Ito+ zj}t>t7{Mm)2FT3*CJN5J|4;xUi(A2?5%#}YH!dA z(Ke&J2NopOkcJ<`qp!e1t8E?fe?mw?VY{l7*aoyf*OG+>-l%LeDiu(sB=Gr21+I_= zM&t?%8z2j(At*o=U^ZZ-3*;8GUk9`@ixTm&Z5A%;k1~~wNUzR|bhnDEm z|G~x+NhSt3p~~3>RhqOkx!X$Id~suDPgXS(n~R25x4f3#PLzw{0pLTgvpj@H4+134jrw72^EiYmVQqVJk#{izb6o6K_MfwEVi z?WsRHO>RBV7WZq)woh z{0xF<6xmU~*@Nh2!7{)lLFY={zzSo?DtDcggyk7>6s4^4381#QtSA&y@dh|DKvai5 z8O&zPHR7~PoelNYo!thOu+4s+{sV4nbGs|Nn=Rv|<@!6TPgaB7-Ia8LhIgs_0QO|< z5+Da1&pjx_U7BypXR0vw;|&dt{$X%hMWa{p$C_4_&c5|q16bTz1U%Jb20Dk&N6w=& zr=bE!Quk^5**E)s)5nZLJo|M32TVakxm#Th{^G-P!fx{tk++%4sBfOTnu0X9xP*_P zKO^G>^1#ZI;WO89A;E!n20S4w2+R6-gRDX%j1`QK%3p(<2&GFmNxlRI9mszPFl@2l z02JZ|hZ7UAR~@tyDW>-Yt7=uPKWH5dv%hf1I?8^3Yjg;JEtR=D-ESr<<%eeJP}s?W zcnhCuKw3h9iWZpBMl0$a-B;%@`o1`Xn>Cf8y}x@`_IeLf6yv>-*^>Rjplg9bu*C!N zSF3w4cfQwL->pF3ngag@x`DMlTahw9Mb6~X8xY<8lddjd2l(H~csu?6*`9Xj#1BnE zLd{JGN|09 z#A3aGidlg#0M^UKSc7jpkbApM6;k)^q$bzKX+h5C-s=zB>-ghBipk9v-{8eeK~gb9dGvj;`t55Rb~cexz=C@2O;x91PvD5N$Qb+pU9J-vI6`y(iyN z=GscRQs$m=4p+z1+W|ZWE+l&WyRO-q4NAg+_LvIb2s#R(9Q{)Xpe9+ny*MaW0Q=`N z8IjGQn{+yxXE~kKH6MH8LH2N8Q4L;gNbv^vlRzPlfBFI9BeJ$WH#Jk}PqT?ZN-{R4WkT_j`EFC1_q+O8}ezwSo*YwKteaU|~) z_ihHY&~}&lz?{iN|ws5?W&W}+}{x|bob7d^q}sqe?k05?s-Ee z2jk5?Oi$h}qHyyq=<%1mjrYzaxn%^F4ZH9k_b$jBT}M9n)2=(*_MViWPDSR9&TJnT zjvalMUMsyYr1CVdp*4G7ogmpV(x0G6k)1mX-%%8dL7F3NPpZM{i_iom*rEhh#dsot zk*)-1 z$%D47w$rWq<^4$qf{ec^Y>5I$yFl-Hy>H$_zquKZ4lsN=l?ix+{vz%BpeA_aOn%kg z(DIRtw5jFWGx7!vFzqtc4=r z>wCwanDb!^WGeiv95Z+KyU^CY*WJ6p$o3Ixu;gj{W-`jJk^g-f&hYATd-Ass3QyKdx#OX)g(dbz$bmUH2?!8GV(>xo`9$s-2!VJ(X44EiD5l#b6>30xi#yeM zhnTL7m#)$8+IWv*_z8y|X)mhK|BUSE-VPl%8m^wf#Sneof91{HMf=ek1_E<-UH}T_ z-<_U5At(K`I`Ci0`(4|!t=btqw&sEAHxHUQns=x6cT5^Rm8sGNv|P4#KD?ugcyPgM z;m%fO6r7&+-W%|rf6m4<2*247Y&60i5p$ITw2T!mN|0t(Qkp8>cx}o3A@wV5u zo0D!^ADJ@L?>5EHL*HIXlj_p9$#>%wDzLK(@tM%$xyCf!;Pm#3AFb1pk_#YIS~)L! z`V)EAj^w4n)MhiobDGAx;+o#Jxlw-fZL%h#A@mGdUt!8SduDrn_ZWOsPRjqK2U{D^ zutCQsavaksgMWhPNyt{)UMjmMYMlXry9x;2U^P#1*ZExPHp9u;l$LIa6gb{Z)9<;C zZ;kpwdyK*SDSCY$&IjSX1IOKhrptt+#dBF`*f z@Xdu6IXtxLJcDZB>yO7lFTDYuDEuTC=i<3kE)AR*AImT?6>PjJw2v;{nx^UEscV>3 z_mdFTlo0Z>t*<9O{u?{5&WShqp`1R;@NDTpw@=~zH{OC>a0LI-{u!#6eI%>G<;is> ztE07F(OMF^M#C~K^Hp7GfhW=OsnrF)iLs>iu4UDj+s)FpjJ~<27xdA52XYCD{C)r# z6)-Wxzj=C^(J(mS=%O6MEqMb|$fH`w1MDpoIf&sbr{tl_(PI{h5bkuPtxwHh>UYb! zy9Rx$h8iND05z1$m2P?J`|~dxJWEk01i3r|s+x)UH8jU0VCk z^H&Y8soT~7$i803t%l-1H6sMha7;VU@YZP>GOHW zbk9#fg#rYkm);@Vj(>zJ+)_a21O!lwe=Qa@L4GJ^QTMu6Ua7j)G`3KV7Q|3gVCp~D zFIFbSZ0U340tm4(LMfEHErNE;CBP-cT$PI~s%F~NPJQ#((ZX_XXLiIXZmBI>>8YSk zYG7%^FTAU42_F8nz0mFO$%c}&p^FcR!JzU4Cm(uqatIG_Ya?`eo_RyM^PkB}`KqSa z#+@?@cHPOu@Z?Cj*v3obFQS(|*c#ycz4^@UwyZS;!E|tpPN0N+va2?n|MM{b{*#WM zPTQ@&d$*tZgePZn-ang^0Bm1X0Q1+Snm7U~(d)K$NkW)ooPi{7iagZe{#f+q48WOp|9 z+?-@xb!qp9yXF?wAB^CXpxgaZW|V(Uz#ZXly+ic6JNSoy$_KL67n4&T{3|u4tPB-w z&YUHlEeBwtv);|=mJl-f9VqbwW&~&TWLtM6+P$I!n7}AKg-_2bP=Uhe8x0u!4Mf)? zI1iT~1k&x~aI)L?68P@m1`DMabbb}YRbl}5f`Q35?{ITAqs{(SvE|68JR{)Mrq`Ofa_&pw4N?8AVx~1jAfNqc8nGOJ2jiJBTy;@A`3>$GI&tdrP z(CNYX{u~TiQUT_SVD2h&UCG|VjDnD@dR*Wc1xui?xbqo7#A!O?G#{|;_n5CZy>0fjz_N-?DPO2dXC+WIyb zJ5HeeaORr{nJj6OGywk=M!z|ay0YCq)7qZr|vfGo* zPZxn3^``WBxQCX!#^8(LFV2gn*=q!~e{k^wWxt!vrWWl&6x=g>b1T)RQS+>=$gpqQ zt@mLcBor$;;I*==GyIY`u3h(@;a(pGuW*e{$A>+5P~h0Xgu$r514WlD#MaO5c}54X z7h+%uh+N2KSs49GWnr3)V}bv%0)jlS)XKX-y}3r08vTv%Uqs7TI}M=;4*No?kc6~< zlVkHDkb-~&Q<4NoD3(cN3MJX@3_J3qudD$^;1Jd8%iLaM>dX2Bq;j{^E_QoLXCh8) z`~v#N+FR|&{|)%(()Sji4Ey^v;GfZX6*cyhOha|AgHl*wc!Tn7P?YxiWNFR-Q=f=G z8u<~~;^pW0-%h^`To=^za92B9duVUIQx*OSp{oD~8iRiU`*(tWEPgq=C{pMpYGH7G z=E3EY1PZjAhvBgti~4f^Zv*Ik@v^)&z;2EA_h3>fFd`UcqdGEg8&ac@2E>#EVIco6 zgB(ETTv6cQ3dGq=Q8GJ2rl|M%zldn?d;s15nwKMY?tk^FZ$TKS#HVAb7}86K>cz3xsrHNMTvpyz3znmUAx z$qJJ@DlvuK#?|4{HO0tDK|9*%~-{3G;r=mD3Gz7?my zkN|E%ak+ndA{Lq;5HVsQ)i> zP`@Jk0%F&>eDy@OA00@F59ThBB^7_EfVmn*SyN`Ns_t^_uE zhyWPc16(CUhB;f?U>AeAr@E>EPvqu0?OqPfKM#u^x_1G_zdO^>(OtXa3&j5^pwWmx zaDqB}oPb0=+Y+Dl>_{f|8_e7uNB6-K41MUqvNxMK7$V1pjxuyRc7vcV<@MTeJz)2s z%Rjs4Con@2lk}mQ!1{NsEA7|d6dg}=argraarPtq7%TUv29t9fSKzM8#akAnojy9GY%R?4L{7;xsG0$efI zyr6W;=rGbh#E}$PuPq75!AS|1(u_be3&{$H7MlZZ^h&iT z+uU`%VZS%?o$rOkxAy{LgyoC|O*+XzFObOG zDP_S|y1r$LZkw&E;)7ZQ|8y3lH8_2ow|sTDYy=Mgh-dDz9r>%bDs%VjuQvAd0O}d- zUZTayUas89YU=L5^?ZTh%uo9>KpZk$J^A1q!<#X&7eHfoHCKcDSlxt^!4tHO^gKCu zuX`ZHf^DROnHDVZ1oY28El|}DfQio!&^JB4UL4#M?gbv&+Kj+(w+M(2Fn%|Ysqbpu z;P<}cdqC0{FY!O+DtT6J9%mxrm7kczh zeSi?1^CXJ!k0JdI`1iBEK7Qu^Mf65n&)abr{b6IhT+2zBY&nrjATgZ-sW*Y}t!_g7 zcYbfU!@zMD+Q0LEY~K(w-4rg}ALaSpheky1aJf5}w1jC^=|(7F5&U5ZA(i=jt}7Vc zE%27$VY3y7_^;O`tb%{OmoZgbQuFQ7aE^z8-o|kLk3fX2ttr&+$^}EP1@r-?WXL7- zy~%Xfv7sk^(Kdru(El#j+YlFS_38u?xZCn~y5p~=^FD#Lpv;KdwX=St(S=?d@Rj<& zaDcJQ+Je`ZED!h0-LKB}=|s2Q8*Lt+Kt;WDakq>=KNkM6@yP1MHEF5(l+MoC{rMp3lO4sJb01AmhAvJbjr27f2 zunTPZEQ+2%f4U5!r?*4s(>L(~lUR#Cy!%150WO~mj5Gn)<%g_yPEQzcR^y1ShDAr^cpt_Kz?_ z_DI2B2Bvv~sr<5G^a)s>=neRvEm{3BQb*MW-^hT~O^BiVEqq1*AbEV-RKnWGUUz51 zK%2p|Uit6+-x1T^R8Lb|dU=bWA!G`?7t*C%CYC7*dcFubAeTa5k`eft zcn5Y_^;S}qs#|BOlY*(5MKxP51{M_XI_~K6iSB~c6NGDs|37p{ZlHBSn@SFy?X0Vx zOnnAi|Ko3t4gSC10uA_>dx-A9y7+x_Gg@>u!$> zn(k~0&eNm7D4z7^kP82UIujUw0LQ=Hs_?zor)wOBw~IMW&LqHvR0T*N)xaYXuND+B z-BD3hmFud?ls4H;-9>E<-@5k0(p2hZV-kv^@nB>7YnUH?Z;{1tu-AycwSQo0je38O z4h%U>hU9@LvGU8t3nmj8#u>)W`&2inKL-JL0Ul!TLLf%mMVjA$ycrRDf_)XJKM+>@ zEs#CYW2QC0z)`p$_zDEl3+$16>q`+C4m7{27`wIuD!gT@;;*I{S_uYeQVYdJO{c#3;ZBLrp5yIQqtC z3hT#4m60I+LB3S;YB6l7ZX1^^%^p7VfTdK2aQ@(O_vgN|F^IbkcAybCkNahP7Vb%F z2b?0KEysN_+zKBs<7d1+H`;4DH;8wFeXyI~Ab;#OdRQHS-^W+hvZKw`pPjTtTdx2V z&V!h80mbDfV1e1|=SUHO`AR&x1Gg8%e~yI@eUO9#$6oVoJD3<({($* z-;C&p|2d`TBU%z|0)cvW?@OXkZvumOT}r0eySyZTe3*pK!zjV$vj|sLJbdy6u8Ux& zs;d~*4@>|U#&fDN?7-|OQsveJyyT(1@q2LocYok*G{fLo91#n&la=4vt@YiM4*T2E zw8h8^;*cSgk8VKj-}_qcANH<6tRLE&v2x}x-%K{zPWGUE(3@L4>OC%e*nk1;9VrQ3 zotX455oOFjr~BsYv|P1oSpj zb_;dY&8X~y6ljX8B2%rq8V1808Q3F;|G%|%bgC_g=EG=GeF@Xvzkz$zJo-HfVl<DLMdK8E^B4=vWpy?}Y8_pc8T$iw`Q^!Z6Sz@|Y*Ex_;$bHxL!$jItLTLu0B z&cEvBVj4;y# zzB(Y0{Nk*}mCXx=`LFdP@ZP)s0I7-=7$E{0L;>vfO;M=U4Rq6W>9f8Y9A88K)k?PB z9A|n4I&8If&)t(vPfm9r)nX}7ztZeAdz-h2TYu5eSfk6mlT<4_H$?+jD63W;x{<| za0imgN~8KJ(g74}@6KYd^-rBM-n7>uBdizNzDeYrZD=do38At$^qUS0FntDBd8~JI zo$!qsPpi}5bbo1uM-z0dD$l^3&E&3Ae3|7cAZ8jB7@E0yAQ1pt1%6+g8fFzv0=2I2;B&S3ncLUfEWngTI7h-a?`oMq2 ze-78%In26p&_`|yS#ou#VsHaneRor3$}mp3cKWurT}{=Op6+Pgl!AYqMqa4=6d7d* zu7>Rz+_fvJ_MbF&Jtg6YoXv}L_YcrgwKHW;s7d? zuV0+iv75k0QUq#<0zcrO6@3Ga4tsI9{!)u)u4O#`vBB9UZ8chu3`-jMsOty)-=^iS zCc0xq_w(+PW;;5G*XoXeWFcVxYUfycE8$e^LIu4QW|Nt?zfU}Wu{F195X{m4+W9(e zo{~NZ(q}A`bN6w)*zrFdRDj-|dE-0>!{9kp;^)}f!-5Dul*SXRS4VXDy!;lu53pV6 zqsk3yL4L?$P0ml~<)9(A z_F8-r?SZOgfwAnxk4|j-yLl{3wjC!Kp~Ex%E=*UJ@e}T62OaXjTK2I&Q+phgd{6um z7<_E`kIQKmL^}f4A>RLgw{pXucNTgV@BOdtZ!06)G|=2(=Lgn<*ePJ&L+5qKSr?7z7eE zG?ImDoPwCzIdzqLb8%9+=;Uhi%Qk;qH}ftt)6oAV8fj^~!uJO276}gf8?AYPF`@T* zsJ@7%qhgb?-2ULT7b^dU$#wjVih56rm1)+SE$-c?%_E2tsjwmL0QDo6LT)r1n7Avg zwY8eAm#cKL7iazDHX8qhpMSSh)93ZzIZMS?tgH6c8PT0am0`|t3ywfUx~WOfzmcjJ zpfiHjDoJLJ9a|6iKc*6u({1W^;rI3qd$RA0X0!GRLnw^-Qjr=#N8WMD=z~@&40CeH zV)3t+*(Makz?)$gKvx*^nadV`U6b=e-qX1Lgb`U9>mSceH#EI~{wHkN(+MQLJ2EFv zvZko~-X%DLWm2ePKH3;A%)!^CF+=?)|2~ZE=VkEV#~Hr_?j&vGxX^{2!nc!|E6gRV z{poWwewAla_eT``Rms_3#(MNUcH`YoaW6ls{@$?|4%9drCCvMyI?W2V5CE5NsDW>x z1d0wPQb|6{`jlTm*!sW96H?C0X|I_p^AWAGNk16@_4&#zhV zqUvmk2Ko;qs>5KQPz0YRU+3$!e!-<&o$I3#;JX^cLcG7Ax*?S#GtLMM0^SD+><1{P z2JFtfu_nFmB*V}@$4nywV)`zcBwyM;@NaBWf3-+sG2>SDhi0z59XgihqiJY0R;D*u zrym~RJM|xYRQtbBzi)jt-orBZnu@<5O`c}nsMl#+UDe-S9-kjwme|^jaFYj>2{vn0 zbY_t`UJ+-jB>6vm3-6D^{@&ihPDG~<_Ts50VD`S@v*u@u^Rgg>ptU>9$KI>1LK~;@S_hDdwBi}&X^C?CpznXkRFDi zJ!t-8R9Qus?uYOWk-DE z5hR1t>3W+)xPDC0N$@kAZMM(GU+@htvcZ(&(D?ws>>Tp-QWzqirJYsju_73qtktbROiOJVh8_$#Csp zjA5kkzpkO&34dH_wXT&bnQ;{|)F`#yLPMxaC&LDZ`b8Kw&~xS^D$>#5H(YK)zY^A+ zI+2X}1M4To`}gsl34(qG=!Eb8haY%bI3=HifPBXOv9s-&J+U@xI1)_L3DPW{e^aNE z`OD|z7nRdesCk}oVt7uaKdq0h|Lm+<3=Tb*;hg7>s!ScYLg*Pf6xxbtUVDi$+;Li> zd@b%bcc_2t&hK(+Z2nbAAA@CTal6mpvHYWmGHNnY#9VQNUJwi4e4$(~RVg@WjxNvM zLRoiFI7mctr|na!Law`4GS%;M`WUAnRwgXr=WeTw>t{Ed=GvmyNk}AmI24ZPCzH4z z#*vyp#+{??vD61I?Ep;=W|wWicHK2^lEfmxM9P?h zp%3prde+_xSvt$Hu#BeOdWVzY)^`)p7q?jd0V7Gx#V82^Id(?|RR4!jhxf4FXTg7$ zaDO*y@XxUyZe|2(Trys*sP%F0QR7GK>>Q0uijign1P~1I6(uxVx+?3>E93j zd`9HZt|wnM!qN$%AEvNJ-y%3@36;sxuyU1{=V{r5L!e$^ignxo*alDQ^aTonTc+^t zT^ZL;P$S6|O{4m9QD%5qZgj=|oadg#or_M5F((ulC1=ZwrxwyB*MEb$xs2>BEXJ)hKMNGDmKV1eGetuSDYUYjC2PkkBmuE=D9r6#O$|3gU1ShNri#99ra8+gcTRUN#FmSvXjoP_;rf?xdPp` z_p_TVlo-CGtl!s}*P~_>zXpesg?O z08fU=OC=c$JDDq6Gx1m|Sxr@VegB*|9vA4=x(Lr!8@RK z(!#%s+tbLgeoVi1cFW;(qPzMQ_0x|)+}k5BS;2K`kAtPR-+XvcBX|E}v-qo#Yi84d z^Y4ifXW6~2j-^rq{&ZuM5u$6CS#3G7_E&T(-CCuI`z z+u1CogG9A|de6*D=-k_*djotQ>S;r^1K-c^ZLS@72`z|SQaf;V+j#LWoF85SXYt}d z6ZdHRTZTO?iZr={^{gjW*gp5Yn2Z7*^#yxqee7p? ztS67rti6vWgZmc_RDwz1;QjxpIGjt-vJ6J($>j-rGbJ>{Dn*#b^R;rLa`yJ^Va9mb ztq_SqN$lo%V!hS6vaPp2RB`hm2I?ZC?vSJLY%l3wvCAb>nCVno1C5 zSpWLsivywia%=`BcKw?ivw}=SaSed80*hvom5h+XnZ4;{AZXE>4FE)OE(| z%?=Lbv@@WX^Najx{o?!`ptE$XewHuxsGS&$OgOjuT_z3-*IUw*zByDRdhvF^`?OJ=WZmLe1y zBj!gCEBd~(Nk{2)BBTCL12N!fzR_#~DF6mDh_BEHlna2#l*?ySyKt6!3yBDJLB7Zm z#?4d1{>81-)#MiD7sX}O&}DX5d8mH?Clopw-VV715kHcb=Du-U*{YjBpSGglbJR=6 zBl1f~tQ~edA3FHkey+XwiM8=|xd~pW?`jYOq6FcanNG4eRQ`qj%dc4dwlPQ$&6GV< zG^5RPV?edf;rY6#o#VwnIlxd)ie@u2#{P=m4fNqJMjv$c!g%BnoG(#JjkNE?+i{y@ zHEX{@Z_`ek>1XR9HPqiQ9rLEETToG918Cq3P&gd^0nyGwBgUW}r~$0~2B>hV%<1Ju zpONz|+s*eyA`K|4f5l~6GsLbs@#^FeGw^}@7^y#F-3^UZ9;6Lpl1-#dFoSM|{fYB`{ zm~!Bu9LARDd!cnponK#_;{DGs`-Y^-arOV?M`Hok@A|!C3X7r{39kxNamgxn+dqOK zHr`&k9<64MivBf$r_9g@p*tkPu6hPVH9D&BPgB(Kbsf@Du#exqc?-umS1cKfk*~OJ z(V%%#XFim21t{}W zntQ(Iqrb?_pYd}mao~O9G7{)36g!`HYWfhz!C>TBj8R<1>9VpBoG{_ z8_(n4GJ6YxOYk?97GX%t0ND+?HMSR#xuLJlX|{IBvs6BJbaF~@#j;S9^Ov}O8FQdp z8vKu9!VYX%FnNQ1D7qIsPDl9q?TO;5(4gIb52W~#7kBp3&xkw)Jy68f;%Fz>bK5pV zDc5^UhnhG1F$}lNXC*csW*O{$!i$?sqrop7^PkjsHOz4c?-U9M^i@*HM3a(&e(}6` zd|Eq&wXt5Ps8r@J+=zr}XT0a7ZRHPn)yMVYl?lgl4l1=2&i=Uq`l$Z77YeJNS~yaz zV|HhuSx*w9XOf#DV^v|U2LKvH6?(w1SJs(JEV0Z*?p+Rj@nW~k*YjhS!iJCI5bD3` zBV!C?QESQcq$KBSU7q!3Z7tH#iXz)K^!=i%*s+@GKSDfz=pXD)s_~=mPd$8yhyLio zHz!Kk4?^adUz(%mWDx9yA47;_XRq)FW*f2}ILgGatgMG$;sG*RbUdp-p6226rjD;J z%k*iLz=#A9E}1NZkGqB&3Yh@^W;^GYBpAA_@2dTxgsUe-N_;oK(QCaWaGqGl{F5JK zuwz&wTj|k7a$kd?p1ry1;M2dZ0|<|EChm2;aQ)_O`RuY)?6Rk>Tklhvh9?dEVn(@I zzpFLms)a5Ac-a`2aMn-^xm^|YeP`gPsJYeHNEf{nhofZvsCcP135K5NqkouUQt~M6 z#UO2G1DJu+hiSCC*^aYx5d0)L{v{w7t2@36n}`)rKkfr-R%l!cSI5PZbNHX&euNDW zfZOg=~ zYhK1;GPcI;gjnz|$5@L~Y-{#%+y32Aoaqxj;Nad~`BT}4{{z@b9UFfi?#;iE7}jf8 zLwEdkm;o{LeE2?`UL22My9E+VT9GufdT#YFxxyF^Q%lUg@&)>c;X1)28O5-z2H{lv z5C}=-y9s@kX9?Sh%lzedsqU;pW}gkWQ;=2>TNCSI!eftvW3jJi}~<^vyI zY?RSd!(A@aYuwc(M79;`wubrmDP2D$5+gP=TjxkO*N)mQ>ECv{24c*t~i1};mKnIJy*2u@H4$zBu6BGM)$6hW2aox@_8_!q1kuQo7aL@W?uC5`D{K9ST z)4wbJi;x4Tl|WFqF$PQSWeB*;)^PM<1-NzuRFqFa#=pP{aNOa@_;GHA%KTvz#_e>{ zTou1t;D?Ou#y*@~?mhAu{DFzp{$;DFHMU}J@!+d&j(dVwHB-Pf3aoqaW{uGhJoFSi zQrOFD6kt+CnCIwf2ZY_)+jno@G)m_j)M4T+=~uc2=GXM$`fssv;_P$9TwgP!&nkDu zlzt{zC)WcH1LZ9g?_*FxBh!zPjJ493PiHG*iSv2-WZIALT>JAjj(wpD#*UqGm>pmU zuriZ!6x>+}^i=*r3atIJb{gphg)hj5Wckk zHhrn&6hO5;1=RjtocikhsxRz4;0dRrCzM=iW0qrn;5P-DMIR+rLYQx=im68{4@pHC z`#>XKIi`@5P-1W>Dgm+lE{C%w%@;|xOKe(1e__YEJgUL+tRyq?b&a{MsXC)*mQ#7+ zw#?!CT|&5N&hD+BD2lKejW>#A?+@I7n=R%`OY|+4LUeDs%)U3p;3!&pb7^{??WFq` z^hZCAZqX9*ZrwHa+Q-2l5>>T5-42^qBtvS+WTqkv*Hl;xfnl%N#!>hVB8$7&Gm?=n$?!6U398Ty`#M zFvn2&_qB5IBu|$RrGfD=AdSu8JG*)@+Sw20IGn}<>mDm zZuLQMhn`@w@+ODWh67KZg)*3iev38WnU~oaW7d=_9w>SlJ^>#=PT8__h&RJpa~3sLA1ea_+c?n_tbBE=JU?Ccw~>0 z<_nH&(+3F@d~hs|nn+7Hy?76MCw+NDalE%uUBeEhyI~@DkDU#4a2b=6Q}$P~EM|^0 zlxClYDfQO`$M2;7Vh^HJ{E}my9cTO^j+N2GN!Z>mGSx@qniMD3=!dh^Nwd*JY|hmM z(iARBwMMB4sU)=bxPCx1TiqNJvNnIG@mQ1m z%amEf-7hEKn7OiVZ7>o`O?>}}9|oqCjMn5A3undZA-KoN31lcS{%Yprl))CJS@oa~q8{n~?F?8^gb2`s>&{iJ1=$NmYzFIcPk4WYL?1oaPG~AX zKy7$)<$tdP_iOT~CU7R?D7Xv#$R9ogEAB6IHUv6n8+}%0W8bv3KPx%r=a_wXK`TSr zGMN-8eP0$N@LkH7*jyke=#YH@Yd=0&fC*e*%4Xr@ne`GX96PgD3j7xFSGHt!0U6Jn zWU>-IM{4G5$*Tj&jj+!_rHWpQ5fC4i6)t$Szqu=mF;VK83|O)Uu70DA6phj~h&yMc zY934>U^KuTpcuZ3{`NEG0z(b;Pt{}wc^1#V>nXOPnUyiWU~^UW!BoRJ1VU;e%|39} zYO<#?FmF%-iK`*_nNQ)ynf8y1cr+!Qqmuoe=p~JaYv|j*MY_)UoE`B77MKnPCqBWXq*E( zTf`@DQl@Vy5&E|$W}sUNq*07pldqUsy(`ZJ-{=k~1D@Gjg+)6wM*YVQ)?_wT_*InA zN#GlE$AyvTh)U<-D0KB?mQnv7IN9Du-BoV*&`l!af{k$IEq|tC| z?64ua-bVVK>+MaixA&Y`Z?wXP`UCTpg~BXajRwmje+A}wBpzW#TrN~gM<)=RluM|$ zA(t+cX-GuSzhei+L>CFxe}=!}@%%*`h&3{xHHn~q)0h%9vVuEXU5WS+_%wK?vbAPC z2}^seqd)Z3Pgc_r3`ETT&5aCrS>l52vXfX-GBJpC=l2D<0sU7V z6?y59?F0>P@rc3!D4dS`)?=_3|A5+Jq``Cgv+_orO7W+d-$Sn%fMV&YAl1jp_sVMk znmqXj{6(V;76Xv!CgCI4OWbbxZ6+*x9ARmpbb4JrMw}XgzKSQnEFT|CL+>v^SI)hG znX-iIqqel|Oq6cRt*LYuaH$$y2U$=gZrNy-V29$|Mt|MrVAvo^ul{#il)L$bV=hnp|*jC(|)it8J~O{Z~$ znN^uN0Rp>lS*lZ~4Gu)#U<4!4Y(9A==p6<gI|_hPXwQZmC^VCA{14ktiXT#(AKSam_M?weFPPqw^->XQ;7RVy zIaSV;r;Oy|^KW%)U5dTpYgeS}UTf`J`^tom4)aCmHO96%)wK}tcS{UrHhM9(xQy`r z^T(~1O|+Te;N$z;D_YeciwVIa@jzR?U*P=8{8M${Hf)3X%|yz*JPH((t28c)ZyAOG z(+EmtAPtVnECn`zqL@FkaPPeRPt7 z_WP^59~;IH8u*Kyvf0%fd4P;r7r~ITc?;SGYyafPGPiXJC`sTzM(1zaKn?&SI&;$ zpU>+JIK{;l)4hgA06w`ZnlUPDw>7-9l|dKZ#|<%u{k~>*;r|M7hY^zl+JWfZN4-bt zm`Rfag-F^TxmIYq513M-T*jm)kQ;&Eu7`g0X8^! zkF<}|w?(MJqN!^LUbu=Pq$PNdl}GpAbWTe7AKYu>FGGF0f5;M-1P~igPA9`bIZmKI z{qKRj1G#9hfW%&Gfa?paQy;`F`@<;q!A}qU-KLX+PQMliv{XPAH`RHGkIevC5oeaT;h#O|YD@qlopF#-~8NifW8P+GrJ&o}>r{r{lC+ta^{`wXEw$w+`0J#4E49`s!lQ^%M8 zr8<8@6oLj*_td~{vz=i;wOOQAhHa^mtGI<8cv@7khUbmw!vgj0AQr2FKLimX!Z_(7 z)e=My$Ka9ZUa?nKObbZ0K5bDN)Pk4~t6jq)hNx)zM1oKbLQGqKT#NqTV=uw;pN3y1 zK`)3b#n^xe35~XqK9E@dtbXTEzcpU){;zF|=tdEeNou^L6@{YTF(>Z}@8I3W;qToU z7~c)f2wh}NdEs<8c7bYHb-W?^pFQv^+xznWs{pHhA18Ox0@93@O`=8g-GY9h{NFP( z8-u{(_~yE;rV7$o9lgFcDK1I*7;*uu~NWUClCBIypA%R&R%8`vp})zj(;1_Os;uvqS51;qL9 z8d!>czN=AVTzS}nK28+XTOM11E;`DL^Y0`VBG6@j;3qeq8}BLgQ{)47Q?0X=WhAR=m zbh)k^eObsIpBJlnK&0Riyn<8~ zx2wnxOD=8GpYZ&3v`2W6@6s*EL=x5|$UpG2kv2xxCvCqk-+hb+nem9i?*^0E3B>!} z4zO`3*#4yciR(`VkobLNKnBd3+c3+CfcL*qsx+8V6(*o!1;Lkj03JCXic&1OmOD-y za4MoZar&?_X0?udXn>d3?%2wXMcCK$? zGleYC!Tfzs5Z*{Pc;}E&TRbVfe+NOxC0#=A_3Esw0L2O07!p7+`705s%i{X`B{(J? z$}ar~{fY)vCWd7QG$e*Jqg~FO=zikE01B=#|GpY5q1nRO1xLdz3_z~uJxpR~%hTb{ z#vb~)Ey4BM_=c?3Go7}eBC>jA8eF?Gl;%j?Lmx+~+Bg22a z$T15vgV+3DTmbkoVoQwJ@Wa7e*#xs!F2MD_OygnfD3Fa|5puWo6Wj{w&bKggjQcFE zpMxc#(J9;t=VxW`LywPOo5g1U*@6CkRKP1xrVT)!W++9WfA9MVoP4?%J-B0{OkHIkGs;F~*odx}Kk5-IW8HS|#wFI9&5;l+l}p%tj;n%!qK zTIbb1C%1un^`F4JJ#2L1`{FWlCTlC}Pq&allgM35>&^VmfQcZHF#l`qi3+G5yp4m~ zr%udG0g~n6SAmKBB>(290*(n&g#Mow)JO{Y&>DL%VxV@I09SY5zijAK@c5qyUf|tL z;PyBAG|bDiLYyN~Tx^8tWU)3#NJ6ts_)fgC2mIQlox{s@XKDwOx#+=A>OpqDV-lt7pKLy zKq%0Mudj*U9_IlxME_SM#1(i*<(Mv`aTN5DmlNp!y)NYTgIl>vt8Go@ZaV!n{LY5D z0&@Su4E~?5zA+(zVW;#DSa-acFy4kEd$@CSG~{yJzmz_LKyFfB02O$lxVCQbh059a zyZRLc`72X}kr&rbXfaeQPw6k+VJNx@u*>#5xX!g==G)L^egJPy#@1usL6U-l`6oKb z30BKPeff}tW7)<85cTlF`{OQ%r9|ruG(Zj!%LV$sCUAWCgNJIW;fkFW%cr)rVO$?2)^wb! zz&_s%cptGFVroqFVATfj&Gf;DGe(%7a(f-oh$+S>f`c9aJF{;37{(MEP$@UgPT!w_ z1cDW*&}(p+0f_lsIQ2sihRwuq7U2IJh-0zg?7FC~?7?@GUiU%J15V5jfdF>l-!doP zz@;>Tr4yn@HrcA{P#w>}gC+-mC-))_#Ba96SsjOJmrfW4zznElfe!(J=}-?B8bC0= zD_1ZXshl(@K(}Sur7Ci{pO-QJMC=^t-rmAa*>8*lx_v9Hu?XpS923dabC+p^_#IG{ zyd?`XoHk7x^Jt~G?uP}ER1f@n-HjGWbLA`d^ZtU|`3PD)FIEoO$P9unjthwXIzKuS znp~z@uzjtk&JrqvyJXb&eJa;}29L|KUk^>VzPU4<%>nET#hL$*NV1Wm0KAW3U;$U! z%8N&)+ z;ISYs{P6tC2%j{rc`HY2y2wj32)iw}V$0YD`AAVVHu)fp`L&)aTln~37#ICmd(vjZ zS=s^x!1C^Y2gnirDD2lr)%-+f4}xR#BcO?It=nSZx`JXHDS!~Go)xZ9nvrYztK$xR zHynFwU3@Z=L4Stpr^B250=u5xLm$?I|6>b3YA@q~@`sn-%+dHwL+@S$lih!8j|L97 zZ7ahc7&B1^uMYf4B!~Uog;t?67TIbG=6HmL!ZC(DutX6oh?Oc%2CxcTo}_u=(}*m1WTU- z&ctRl*L@}?|Aa$K(!t=3Yg9UYECNM{ZYw~LA}!Pk}Ik zzLfjvz&4uEnc7j|x$I3XQK2gU_#7eb`2-j^*p%`oM<;~h63YsdaRgPbX>R&EPY5Pg zIR>uO*f(B`-U9-Vp1>TsAN#Fc8^pS$g72@rArIpPq6+*W@FYlxOx*Ozh*is0^|jp0 z^*0=NC5F}62x9}x^d`;S7K>0qGQ~5X#IOrs2L_9*0QN$82&C| z5R`|tYYmzaMLgUGmv)f;sr8|sgnqzW+LCQg#x7(Kqmd6TYB2f4ERjUi9%WRn_u``e zl~Hk96-NR9sv_oJ6)ZcLMqd@*A#xr|@Y&HB61f9g3G^|{Wr3xn#XFQ|w4mySc z*EZ%_NC2;vBv7Y{MffEtj6|FH=4A;6Lh8^QKbU6n`T8Y~A~+vifgfHGT{MHJZn0nK zBYd~Tk; z0{c-zJE96|$I&_FUpSFBfo?d){>LSX>)1%63mz1b8DFRTY=Qnw059Ft_~AG9x;S|F zo!Y`D-u=??F=<5vPOi1p#^F{HF@myplrfia8bK0^ZH;s@fPbpL!)vqVOeK=Mv12Mk zu9Qm(i=#lXiGvWlf`^hALkJoPGzARxAz%VMpQDjer71QyG*NAz z0OpL8c--=nJifu>0@nY;LbzH8mehlyJX#-@U3YPjYmOz%bXqTI`Gu3F!)Q`E~!;aHm3h?OxkJxV(E4&Pn zTnY1G?EDx6wNQ-0+zotkQbdj|>I)qRV)1+IurEJq}M-w83 z@DFxpeFNfbW#o&$V^$%>AZcX1*k6xD9sZEc)-utbBz~vTwy=6y)gef36spjC^SX*m z7l6Hy17E;6Ivh#95n}##uc&j_B&6A)e{SDE_{i@aiBw}*U% z73_N}ofxn%CIkY!M`bsc5NC~Z=DOX;S-a{jz%Pap-UKTj2!LS&Vrg-TqYp~mY7reM z%tpWuK^OL-1kpG?f&6K?0>`Z0_=@LGL|4G6s0LwVoxKG0u9`%SV%48edGCea+B{IK`+hFkx-sFbA*Pp8G!>qzFK8#^eKhz&&4UuVpQQA zM#=+=AB*5IqS*Kg!jJL%vAytpz)G)~I>++G8eie7ePmyJ&{jP11InhS%f1j9rX@Vt z8e(_5E1di7aOD_CQO5aS89mPZme`2K7fFz+Qa zf`)M5eTBaqGPuNq))M5B9tZSeZ|uPAg{3xs@$TJmqj(K5z)238B#dE3P``O==sWL2 z^T`;Q;5Skk^`{?Fdw^GAPz=(-)&^3?QN~U`=|Ne@~qWGOi|AtNTZqJ zJ0KjO{`sYFgAEN=6^S!&rP^VevwAcsG}+VIb?poU4h)8H6h6av7!kZou>g?}&H=SN z%ZTWI0}cg}+EpEc@#_{aI`|MMOh>^zhOte_Q3G|{a(GP8WDCyp420N4FCjyyHI2jj zPr>q;Nqx$e@|xKp602)Yqu0XQmODQ^JA(7=8uW^zA_H($&$NdRs4Zg!k8XVDy71Rg zVH>Hnl|8`AcK>d&rFIrLyAO(w{l3|0p1s9ha|-`E7Jmk}zDT!K4gPlkGX9^p1-Cg!*ep zUZsh$*%rU~-EZc^M5{EkOw|A5sg0}~u#qD50|!M$sDenM%yeG|!V~_~f2chJ>@0nW z^-q{i#Ay?QYcjg%lpFOzBY%Eb&NmT644DkVI3URfm!gE>U@m{$xbEWoXCl9iFoy+z zzihQiwJuNvA{ldNb+pFFXCJs0uXW)kATsD+iL|0V-fXyW(zgr+`ychJ1S#>)=IpgG z6s#L1K7|C+D0U@54VWweG$ zNM=EoOd2YK5K&9e54Z+`h+2FfZN|B*F8CEQW1kws$Du75&@VMIJ$g{ge8!Y~zvJ@e zz;-ARN6t%#GXXJ0^;>CRGEFzdQ3umK$Jz{s<{BL(i65cA-}&AFtD4#)Th^SAY)Ng0 z!ft>9XY7TRehdBbsIMe;Z!V3c4TVoWgf8*g#Xj_fs$z2bvn}E}% z3izraed zXW+>EWDxjMHsEqU4VAIv3LAz@#&bV*CDT_Bq!5q6H~%`~hYMO2pHyE*k5OB-(P-k* zszDnqIHR%L{qM5}jz155NdEMMMsp5m!D8;sak-GYgje)16u9n|<#M}4U9klN;}P2< zV;j+%IZCnMAH#G6REIzoa9Za!=2IsPeMgs|e{5!I@L*2pZ)zRj&{_MAo7feOLf9|* zkjH4oy~nLU&IirWIMk6~Y$Y}liNo=eN-X5FclK0ZB>eAg4~e!UOX-~sA)Y^*P1(?a zex>;d`CCiZ8VV@F8>-s}BrTL&TLY_c3IC+}s;Oh2cGyJ0+`w=HAJ$)+`O3K5jI;os zz}J8N_U!x=cHFn<51o|rCkR`>xdd?O!bR?qYbfZ9)}aiROD$wGGWmXG7Jr{yP;vs*6eQMcaTK}8FJP!gng9dMAFF_#m#siRiZ=qjS z4h>Nmam3vZwB{-yA3Sl>q3PJ>Bluh@OtLU^soL1nJX=(roHiIs>Jv5Xt$OVu^Z`Za zBhQXc=`y4-r=_z~tb~=)<;fe6WsgsDU@LHStbY00H7T{g-)~)_FJ$#sfGopMmMakp zJe4l#Yu(niO%4n57wwM&yWH``U&sfF5w?>0)RtEavx815K1IA?FeuO%e;;2Ty$1ym z&%epgkMvaX{QmsDKXo6RXPNVU6y9L|=F1V2=}by8?gOqLUUT2OUk(8a<)z=~Y_2U_ z9o_YDdrJZ3hloY2h9W_UI7hy#^eW&!2x|Ay)cwBYhSFUlRY=;HvQIkr8fUQKR!S%U zk1-d5V-!QrG1{6X?3I z)PHM$kAAOj?bnLuMqa$5>`>RbznFGw=FID1z@v;|}dZ;K7J zk_kR2Y#T0H6r$1k?4Xe zuj*FVT?y`bFbE{y>n9IXPC;!P&2EVfSEnCMl)2}&=Z?ODAmNM6(>d_tj!^spAcBmY zb1+HJ6)6EqiO~f5(>e6#iZoUTU|Py@z1~7PXN6qc5?3WHomBAOvKACmt*+c{@jKKo z=6I3z{G9rk~vHL)z+ z^}B0(F?FZjcfqi6{o=|SiIX{9a1j%~`{n{s+MO2p}3TSf{l{Fm- z;Rcy>N~l|5g8tjmFeX07p|aLO9E%=v<=&EwNkUnHE7ZZ0kj|0x;5F ztv`#g2A%-@6Z)Oh0TB=dvaDE9M^V6b2DXzryKI~tpOxMpRVd&JPO$!yrl*;*h2$hO zco2Y*5m$RHv`GEtbu;HkgXLz^t7V9ECWD9j8@ zu&8G?=K!TNNh7jh#+?Zxp_wESocPiGDl}1XAkL$7a)EdcS}hI-qT!+j8UO$@^&&-A zF#k5jqtux(-~3Kme!dB&(ub*%%tAX5QT?$x&W8$GyoSL-#G4j;&)78G6z5#c>f7_A z3jYBPFt)&n0bYL_p@lHZu3X`%yi&Ki$Km>M4q|z%#Wmzn7E26se3q|Np-niiHVQ|j zgL@dIaSd&fE{?$X%QdM;MAf@>t3mR)OQ5A0z9nmu*td?z@5VwwE?5(>hQ9e&WKlipaF2GAdJA0=(# z2<*rmphiyyF2A`+ZIWIF;$~=rZ)&pwQ|2$;7EX^)lD+#rMIO#e3O_>Lm==5 zj8UXDVKjmx@KsGO8?@abHG`J%{L3;6)E=IHP5T?Kq$KG76kaLhu=sIh&*Y4) z2fS(yX;Vc|wRpha9|rN4=Wp{^2{3;2Y`T~b71QB={|$_i9S>B)@6QBcZV|h%6aHj|4~W%6YGJ3{z>2A7`KII1MR=L z;G#=lD0u&|@YQhAKEB8cKtV$X-_x7Y!t72AV4yJ1MO5X;5%K&m*hE+rpTGjtPLwEM z)5$1VdD2qq{HNd<$X^g}#JICL%{1oJP)<>q2mP51k4|8KA1rQ+v26=oP>Ot4Maz76 zH|&FSMB#p*8<4BabyuL#5J5v8eV_&wz&z;GM^wIAJi}m!!Pk#^_!5l5(p3xO$x@e8 zaMsiK#t>toT)x!h>mYD+jceB(lSghjd>-u?^kHT`{|oEyUPAxZ@1+RnShUH~V09Ji zAN-%S1OE+DMA%=-Cj~+Tai|EPdYgjp;jG=*lH9bA6E?>0$X7}4n_E8VM{}qFkR#$4 z$e-Vf_8fc`1r`Bs*fF~O^|`ObkHzOHn&P&u2f}ML*ZGRn_y~=MN3xu8$m;4Vx@UuW zhVDHwTyvF~>8m32PeKc(m@3j04w{Tgt&Ilxp*?wCdS7iGT0&@)B4psAR;_78ByQS# zeaH;Ex%{O8I$m*Dmt4qdZYKOEG(iGFtYd1(3TSQQEkE(@qU|iEPoS*-OM?MyG0oJ;q5-!Nl>Vv@l$WME7QiJbHybb!VNi!N0SNQx*IZDb3tU4b3!=Ejw`P>fVEyMw zjc>>exz;Cq{v)k9oEO(t6jmWIu{q_?5d99m%inFs7^`aQ$y)dT*XpL+_gyX(=H1n1jOQN?U5E5( z8a+7_KEP6(6i?5v;30JEZ-630fjYt`t8~cb8et!3E4|4H9SYn2 z2|~s&CU2rYdsy-FIR2nJb~qLvMnm|U2&HDqIPddx*Jj}l!1pg-fhr666oA8*A;rT2 z@`w6j{dC3NbNdaym5}4(QyC^o3l4-M+9n-H^6EHdmaeho;D0Wmgd_&*i>3tnPcRt* zBtD8fNB@cI4@qoz2o;A6b^=jcdyVj>l=M?k{nOS$%pVmGFjJg>$3{wz5rSUd%tc}k zST|^W1>ffHK0r0L!hFPX=MP_`L_$uo5*ctX1S9mhveUsBg)yz+#wn1d0l|Ftgp->eCS;cMOU1k;Ac`LEHlv7gZH zrhCk%;`-skxbf5|nh2B*WSSUYKH~ES{Qn%oHiSFY!ERT?#+X~Sf3#-_=z@^9JkAYV z|8MXoEJg1&Ny$qm(N}IK1xqNkrQgBnLu$*RKRoKfUM_L5^F%Gl<5wg$lG{Ulf~=R~ zZ;gKpJY!%HYMl&>g}=WI&?+^_T39RTYTV3Gb8HK~%Il8NYNEG?utBIHkj#F5!k`)` z6md`~T);nih~2~|0Fq3#)NM&T+lD3#d_9K2deG{(f!V})@PX?Ovg!Y2JUjb{g|7nq zW8vPLPbx{5WhaKR=vPgp0p=yNSA`Oc?*#;0Qitm&T)>U=k1BKw0RlH>foJbwkaHx$0MQ zC=Xqw6^(o=M9w9q)h^Dy^qN3F+RRmuU8tj!AN4JPAAs*#?kLd4|PWas=Twj=&fIpW*ta^b+eIINI^lUoR3@?d{7)}xnvbM3K-Vm##?#C!b*7*g}B9)auynP&SN9Tt#p+D9$q65gLK z4vAuVqGae^uc?i(z6Za$GV!O_DvgEX0)5$G;F~WL%gw`F9R8%@Me(T4R%i^Yu|xj< zJiS|U;^>;T8LV^~8?&?639tl60wW8ABoHDI$m|3pHpW>=*|lmp?VifYK5(8)eEqHH z6)}A}9Wh7qm*-M-#8hR4=i4sIr?sd_UE0;0idx+vCX@C>a zC6-+858v+J?W6Orx#K!oyneJNkN#5jM76R(Clv_6KoSUe=bxN#kpkG0OH~qS+h}a_ z2>VR-_wZ6yzkUf^_Z>mXPi>Fp>1{N4FFw1AeK+`Fe0%Z01TKFMng3ibKaGw1nKrhV zKUNvUy%#qN(*#Z;{;c+Sf6mQ)cQU}?y$E?VKbY_OzjdbGA^)atmI3;FxaaC&Eg9XD{sk6Dm&Ah2O9HplJK4v($H5A(1eThI34d3%2oYf%-sgsuiHZ_K7< zGJh?yJM49INB*fB=m(gGX`#Z~)tPpt8rc+oo#L1njht4i zL%T;m$CQ{X;gez8QxFBSpn#79Gl^q|zBp=KnL%bztNeBRm$XG7EGmU&SA#L!@4T%6 zA$dPSr)RkEcZ2@zVk54rhULub(_Tkr6=$DhpL@5T#Ow$4S;KYFw1_&bkUsE;%hdkUTf>sk3@Fb>vPGVJfjFBE4p=&$S1biTynSGSF;7DKQ^ zHdiE=Gr~&?`D}{U6%U3ar}F1X;yxV ze;$nUTX(;ncrWAjTkG&?&UE>QwBMuubROS!=-(UTg=GdvM^U_NNGI1`tL{DS&9MzL zWXt>GskepNv{0t%gFcwA{G<6apnJ}~Ioxll{|;N?Htu?%{TO~47$ZyU3X+T{Hkt&d zBX!^@e}23UhJoxg z)s<%o9RH)+uHwkYft5+dTd53EJozlGxFRHu+deMP@$@*yzqD9P{uIux-dtoG-b-ja zx9$dSNB!Yld?DcewZHu%L|>=|oj}4DZFBkUDmuLX6s;HXlkEu&6a2$h@7||DPFFUV|_e^XS$%e(FIMJ{ZH;`EI(^jW%Y7x}&;gvp$$FV>OngV6qZt&DuRR?%)uA z?x|Nr>c7V2DSa;%6@}7*>wopE4B)SVaTyc-Uj%AxV@47f$~j%JH;tg%^%BeWfMC@HccmVSg}htq<<_h;`Ood7~rG|DV8iT&U4VjQ!p(N8{J8^0#GR???V? zI8{%DqiW*~2_^3k0(YN=n``Z7T|F2*_o(6@YP@>x(!8;+g5FAc^CpCNO&6}WtA);& z)o&61C~Ay_rZ=A&$8~SK>n_xhY8c7BRwl|CiDNt&bV4ghIH8W{qdNwB~_ z2sVdoDO#X>vnG8OzhnvTX$9WQ_otg#?8+WJdCPuju8Y7ECF|jQYc|9p5oQf&r7=;` zu4^)b7G_A#>daw?8jc2EdJoI~ClCM6iTZ+;*c&|$dbe1|foLCn{W+jPeeZGgmFxdI zmTTw+%m<8b{hmW~TMc4|S<K7qj;x_5o-LDux=iTXbniS24LU>uAA#J z7H!tkI!ec&e6Qr39pOzS4yLF&KRL@ zwtnrI##Hql-TwV3*pC?o{7hcZ+zyw0|JCix2u52T>pxm72Ek@9T0Bo4>0iP=Vh|BzUqA#?6x>en zcusMRc;j7X-yWm+sXA9+gi6SC>3-x-D=8UWqzJX+yui-59EC1s@KW;pYsdu)y43{M<@s$i*(hvUcOxP04&Ri0yc=vMZw_Exq*IRf}nIf5cOcyeeF>-^`y2j>C9s z5Hy|HbPPmywH^B&@4vIw4|N}ooj;`6;<;iJpl{zO}|2ZfP`B3|rrt&k&YIBxJkH34-2n`AmMpzv(mXe^TeBwI5@= zC4;>Ys*9mIs@8Kikv!~5&gY7>DjAQ94HksRI0&(VH2~4r-%`07IoB1iO{B_m4T{9L z=xcKkH&y`7#*OLP7+hOFzq4{H#V)SQ5)CW5s)9y7K`v1$NtvQjjte8_`rRg7N(Cmu zmD=papSsI~aMAhM-iM>nTfY~&{@~$7{;qApSMzaT_Z5o|?h4)iDEm_r*SvfDSyL{_kCsZW%=RJ#S4s8!pLPlji%#TJq^k<;6J>kB(Q7c`BlwV4leg#>4rxB>|;9vM!V>vB9jav1Mp5;h0C0Pbl5 z&HCPSCtLtk{1$%dzYmay1@7$;FEEvxdUTte--DnR7v9W;w46Dnb`an5po;pv?)OeT zY?`BI^RW`U`n|XK(pAhmclc)RJ_FOU86Eo@>5KU~-$wZj1FyI84KG4lMlDDCfx*=; zaQ1XlQyZ;BHBnHNJhO^2q6mt1lwwH&2x$c{8X|NJ<5-HIJrpvEUzYuP7Zj~8LK0qe zjXr!XGF_X$7{XG|ZELnTF~nhq1gmHVgw`nXUWh2IQbK^N6KCXSJxb@@jwtm$(bXu% z^*i%5?QBDrD~;}Ch>>;~!F784)hC$Y0^MNDZW+;j29xFYuyz0xI3!SH=XLUZ_y z^_ikQHB(FH<4z{x{H7Gt8kp`RC0EIQg#QZwKTo^Oow|RodpD1|Ki`bq-Da^f?Y&n$ z)4sN!9~|e8K)vsTpT<9=|EeBq`}(`yum3Uo;zjvH`!>pkjT+Q{6T_7`>vdmdje%n~ z*&>u;5*+{0T410wc@3-wo=S7R=-dT$_7z))_ung^7N69c@v`&7QAUggj6i+#dhd7` z$sf^+2t?BtLbgoFlei>rP?VL7ScEB3IVXRezPOmuMWt3w$pcmbrCIM^P!pcjnq;cV}ldNotBhNDVIXwBKr{#rc$^r!~e7yPH3YIc?0{;yX}7R7z}x5 zo~ge__`vaDSG&{aedlNO-6FjiF?gu|uiyv%kI`VS4|Wy{I71DfF$<^pUt`G%E$#h= z{xSMHXv~rYH8eDs_;|$Cgw5lsb~oG4hSZ1uHbZwcl~%XB|HkU=roH!O+T#?t)pXRN zKhQv+g+4w3txNvPI|NNKhoKm35%QS$2l_YhW>F?%0>c1804>+=FD0GpuOaq{(U;bm zn_6nFrN($Do)nS!KN&4Zz;m*ADqagM<(f*XZTA+sIojB}`O|!PzeWEW?3Knz?JM#H z;Kv6MB#s-r*55yEJ9oyedMy4&xU%E2jsDBt*xtZn{R?el(=eX*Md#Kq-@t^#N`IKo zBlMU{A2r=-wCzQ{WBzEz@+gk))hA=yVUi2c@^*lJGk=9b zCE5xhQ<1>-=a4H&=O53q!bKu^8pAS?I<1Qg$8ig3Ij5|byZ)DwwsFx7dDQ2QSL^!C zgsUZ}3TRLjQ5{Hl&Q1}UAUF`&I4bmi$i3d^y74YA9uEFu{pcTti_ol|<-gm{;b8Rq zAl~WAiTx)2-((BD*-k$E^gh9VBO4Q9Z646~j-_A4Z#{pCq`a+i+^`qDRVZPOp}psH^Jb-U^vtpon~>vwngd03ATvBI?G zvVd8>$e5OvO;R{5=CLg+m!)JelL94_C>IGBEohpYa%hH`{UuC&XhJo=5L2}QsO@IT zuO#MLUwJZ88|kVVjnq#epP#1{>AV60E77}AgKLAQ_ilUGe) zV;yOc8yu_uZ}G@o;)%rRsIzTMG~9Wew;qBg=^=~meW&(c=DHmiWGJxzEB!G6UREdZ z*k#ANp#4exqrdJ-N7s3Z^b?PW2g9}H-OfgLP94Cn>~cjDb<>~phA zCoX~f8Pg?-;}p8DQeM7Ph(buK&Fc1AZ9VCC;pgp=P*nnV4)bbU{Mmd6ha_-hU-a;k z{#O0(%a`zJIFTOLhmp_oujvL2!!7z_qO9okudB`PTQ=$I;>gR-8Y(4|6-*%*3qt-z`AO{kx<1jJT%t zr}*Eg_tE=IlEQ!X7tLWTUmsliq!EwQe(@!cWo&#M zOeXsq*I(GXqj={7S#V-9S&nol^c_TBzo#zt^+)fQQTWt;alOTt>zH=sU4v_(NB!ZH znLuQfFDoSOC6w!8L6NUp6@gk9xf~iPuD^>IM%O>*o5R0I%BfhBxUIh4L`)t3+%<4( z2~$O?UM5dyekGG1rA)bn12~ncDPn-nd`yyH7%smCcVL9ZUkS$gSL?70$cBR+^3t`# z`oF~QiziR49Ldte|CFrf+4>x;k=Yf0&C}{#h~qB|8eC(uvY(2v^gBpZuN_bygjmAV_1w-xP#Ijg*~a=t1_ zfa$rFN*5pV$ltGZGOZ>3YTTHJ&n8&qPqWX%Kl)yH`%Cpg{IB){$(sAE{N8<&AdCL2 z{8|6$DlPBVL9gbQC$*Shwp#GPnKJ=kMeTwFAJ?x+3^YtJ8RP zOSx+rf%1i%&C>-*TMRIONSvVLC3EukT3Q%EgNVt{GoD6c4?s!~vQP*0+N9fg}gh=w`%qnhRTq0Qay?m%GAO!KAs&(u-< z(~RJZfJuy4wyRn=ZiAL#*B``Cy6dXlJA{}se{?sYzAGI%`oU0oo@F0&FJzOo=q|>q ziMHzCCop3|f3*vJ2EubJyLC5wl>>*gQrOr2?Hd2G-q~>KOf~<>OPCQpso1hA3fI2G zwkQ|%u7&c2l>YD`x-n`g2a0UB*@qz`S0r7#jFp*<88>dK+>J3G*E~NlCASRl4WZ|$ z^F+2F734G^C`5q)oQcpFF2JoXyFb|C1xuCuRO1lblDXG-^1oI`FZE+(r+>xUYY@kW z{wrVCJ!U&oyI<4)!7%tZL*Gq+)o2V< zzcGCd2;3!41&l|>=)M*Y!?_zik>I#SFdrL}xz=+B9jUI*D)|T=aLNT&gi1!DdOv4R z94Tbd39zCW?h6>QIW+zpf3zd66k@qybAV^IROp`jI@SwcaCOMX=xM0`&(T^`&aMiV zsbr<4fGewk2pif?uyx;C5z?%2BL6VIhQs;&LVW*pXt%!0=o{;grs1oA@pSb0GOg(2 zc7(6Tf69m2%S`OtZFSeTCacjMd~{|=R;3R_n~D(INURLls@3g@NXIM<6rfgeRZJ!cmX0p#2o_XQi>QC)o~qKw$&n29m_K-B3H5mg^6V zcO0PEpCUlu^4aP zC{sRf;TOD{$6Fop_2jvED|v5Mp>sVxH2kgDe=ZK0|FqnmM*KqZN0TYjo%y)cjW2zd ze2(^e_3KqkolmASvo{-f`mf4r?@xK4eeYAC9#}Ra{pbF71ZJLcH+t|klWzTI=_ox8 zytnITfAvJZi68vaWe{gLz1wr@&yG#_uuvulC0L^^05Xm=?3X7>mq1gRPz*8!vN)lvUdSY3jE_F+|MWel7;Y_qu zqth?v6*<-HsM0d0HZ7r%O>+B7wEgiDh=g_`H|iOShMoT@^5U`x(RuFpiv|8Y?T33< z>gw;N{#iN}N3-geIh4hLG1YqiQS;`phM}N!`o+0AYQwd7zv2n;z8JyOtGT~leMSGe zTii}{ zVza?dQ#X%2&pEVU;0T6}C`u9k5{p-g}b5>Uru?IlYv#m!OC*Mak*y)6@J>T97@mv!CCZ*4^V)!oQ7w zrmj9m`p*Y_v=+aat?;eEd|QVsxQ#Wemf@NQBYWq&+kA-cST-0UTDm#-rAmLZe(>(8 z`8NKf^~cS^eATw@!(=#L!LRKxlY(!zg_Pwf3m`(XcH8+=xD#I{-a&h3NW81Z0_U01 z;n*FyU;B_GL{%IyxvUh@WdH(KFzoTrvOA)f!8Vq8Wk;J5OZ|2tF zr`I=_7=m`^RiHu9`@_~ZG1chFa1(~|6jMunhyN$<4YLXVlgyUqfvK*>)_w?n^O!p7`|122(z`ngepO@7=IhX0`SWmh z=rLq&^sXAfKUHR>)&l*0=YARwyHV z^zsDl#&Z`LvPCe^GcPUXOMna*YhOgOv0RE_2|U$qIVLqFtLD%gK^{YIz}FJ4F46x> zF;B~#G5_Z&AhS@oZG;=iVp-GI6tUg)vA@5ceHBgzyEW-!pp$B}{4D2-MhmF@Cg8sB ze)U`Me;i#N=(i5hp6a`}Lh~wGkKRc0bt>_7N~7@ zSpPVu_dQiL0k;NrdveTh{e#WU__6fDL*s<@W54emz4`ub1bL_%_S!w(gQxj?Tmmjj z<&tJX9uq`nI3 z7%SLxt{&0{bGcU6OpbL+-C1q;C5;)}a6_DV#$t7C*>C+V&w}4QVv+Ox0sBKNN1?&- zf3}WJUmE=xCv4O`KGk3S^(JV=Hu|eQG>@a{{c<=D2fg4HmWZZ|$*enPr9b65rmoV& z81h<(CPTQUcnc&DkQ6F{Qi(~L%DPveIaFGLQL!=4(NCiPm1ftEys0d-v^XmtPp0a> z=hxQsaMh1GxIKF^6n*BS>-)XczZ%-O#@{ zCb4wmzP8i0>&0|xzNO>sCyHUmdufi|o2J|UqE6n=w_$O)Z$*7SJ=VB(J3alAqpt_* zbN->@&J|J!{noVUAi8Lr6oco`8&}OCfGE}Xe)Hk)&9{VU`oOvZ_}n`4WtMd*G~PO+ zcKhw(rML3JZz_Q05&HE9=}*+M%3tK`C3X#)~veK0(4FjaBxS+5#i*B=S8ZU-d0 z(_LP}@A4b(E{Xv^c=os9YSw-Zmg`>7=8pMyvmq4Y=ZwP6v2Y5>LV;C31a6&g6hTiNSR6n4pC8_=Wo<*_+t4GihWe^BawbL~w#~qLlP0SAcJYIf*?rev*TDnp ze}}${?Y<1n?O{shQ=dKwfHJp7hV3#}$(-eRiT&jrE9T@(E{Ufdxj-_aYNC@XaQsyg zCCAi4N=k2P3BOkAqMHDoP(2Jf z)1ON3X*tjdtv>dPx1l_8#>251c(JRt-gce7U1RRM6^;XEDoj_A+i0vlWF0kL`UNMZ zKGkV@JzWJpEEN?Mv3DeEWVYDk;kP-9z-`FZ*!Z(PDYkwUUg-aJekwn1M_cqo{l=T? ztYKP*_aNRN5D;WIq$Sd8h)Oqca(Yp@sK8ADn*hl{Os9xpm6Ii@8o{*UNQD528O?rl z{8^1jsa2M4vf?EpwKJU8*euvOT^8ZLNNwGygldN{KEKIcXg#tvwOR2(3?WAAqkn4J z@j>t1PTJoF;zQ8l7Muhv=Ic`1?S<+V{zO2W;eKHZB`9=02`1`;+Lz+u{rI3xddM=p zqdWm+DoGbt%fm}mNw|1yhIym&MP{ie@*Hu&h#bb~%X1)$gpAMEh+7jH-i^lCmi zqHrHAa6n*r$dcbJODH3-3JJn>=?sw&6G1L}A{je5g`|=f4b@{jTt0`P_F-Ht_X=qL ziwRo$dFfm%B+Hk1641nG+&-##Bu{wtmIeuHc&~OFacQO>g4X(7w2yP$G=utUt?C#m zP`XcB>5k(ck=Cp{jznuJenWbtdnh7369s6be=f$QLvS!gE^}Wpi~P+~3lhp8JebO6 z;4P_-l-{uK-3fY+*10`4#kc%B>7Vw|_-1-j{NtL;RJ>1DJVcanKX!-V`l$b0lGD^u z+I1Wvm2!!sJ*poxg0hq>B@%gXrs-@Uet~@&eUNC>$4w*>Dc1i~U#po&-dH0se!w5R zR!VXzdkKM7)wEV1TaMNBT6z~*2KVuY{_r|U#>qh5E;`x>~=Ai{E#CH0GFK)N!#W9IL`gwSPE9Qe&A?>|8 zQCdJ=wnJThFT4v+O&T80bc;RS57%#M$9+-vvlo3GZu$n>or0fIlQn z5to!0#aR+*z?d+Tp$=es&we;t)Fo5Pmn$dur&CU|d{fJUzs2^QzrgoS^aTtm5X8D- zG{*FbhWNGUG)75~+NN|OktbsI?C(ACxYTrKS$nKY&O9C}`r@7WhT8DH%;s6 zM}Et$M*=`J71f@3SD#aV?6w#@dQXOj9%$mSM6KK_WRax6@bi=V5-Bws4%WeqaeIoEI)q*qJDZ zaL!;6!q&k7l5HPJC292!Yg~V!Ti3G72q2f2@`?OMf-lcc%KUt)LJoLdQAlxC9Y7L( zAKd1xvY8ln@UK8ym?JmXwE)`My-@S)QfHGeO2*=I>rY9NY4wb>{ZKXM;%jaOoLw?q zLL+g+uTAP3X%-NOtpQb=AFHt6a%$9^~yj)HeM10_>q9S!wTfs+Z5x$6BLGu>g z8~Ft@bIK8}12wcgqZ8KsPSu_ZPObN8tN&R$>oDnb+mGf%Tr2N+)DNqA)1OW17=nSw zqyOLd%l-gD;|QHUp}qF3zxBrRN$o+gwzG7+iitQp)LYOtYY!v8^ctThkR(Q{$o5^i*fjIi~RE zX|vjt?P)8d=bL~#?W@VNpmiWH@= zR7exM+AZLitsn{zRhkE90?5hJN~xGGL)^KzBC@MtHJhr1IBRgDS#?6Vzj6Ip|3J@M zp=z7V(HBi)B-oxX7yFyH+JAx#(WdQQ`?lw*p?RpyRvuQDZ4lOtj<>gT*7vFFN0|kP zJZ6eZYlu4_;LaBbxea})5Ueo%cO8n|t&aTH`67OoSS;^q-*ltbrhhs<4sHK#>~0B} zMI$?%{PtqJ{^1_m{mGjA=|M-W=}Ho}$Z13kK+O)$xNsrn3;6eA&S)pbx77`*sdih+I9M;qs(@`?cG7N-7qCY>E zVW{P~L!b?wCdJDfZPfUMqKn=Qwkp}O?XA_cD3 zbkJ?@!p@I;ysJ-4efY&))=34c?FYf6W)Rq|S3P`AHrFq(2bMLOZuJEz9y;`JV{Z84 zS#hh5`~YujbD_EW=GDrc>s!;X7R(UlQ+uX9B1VTFX$FVe4o+!ug&cf&WIdB^_4o&h zyWtGmP0aO)vru!@Bnp`ec5^gFu|(vt^$7{+CS{Rmfv6<}SXV3S*;%3Zn5(G-(6z|p z6xb!^E7xKxk=9g+6k3j7?+(Ux(`nWL+Wbgx{Kaq!8p4+7qw1Plvkbw!6&&5!jg2sW z23E)Aasjx0>fKifNAPO>!5Y+@>+ZFndcsuA9~piC7E^DnjDtp+F_?*M`k^`u^x{dn zMawa)i>p40RlV&jvQO&4v7TC>)`wU1zd5tRx-&U$dk;r{w)ctu+8vGOzmw$Y2S@mz zy>+k0TtEpj7gDNB+7M$wN`VTB2)uG%>gK81C8n|}P4tHv`YRdpE0%KxUMS*xWv6&{9|_R5^dR@{yyV4&dCdE} zW^TvJWd$BI6z}BEG}K*>k+CGj#_qwtb=Grlxt|2E ziB=2Gog#C?`IXv%`2f+I%I0(pzm`tMTTtGlC^0 zq3I-QoiRWqN^{7tuLEugQK2B`%ef336?kf8AyS3GC(a~Z9FoR}hbopSk<`yZ3G zRI68-h6PJUH;84gyeDEBa{OZ)gR9oG32JroTTQCY6Qfyehp~x#M!(ftw{IWl8(z;^ zy8&~~77P#*g!x0ggTKFfLzrW43w9g8o(>(YJ5#pdR(vv{XqV!t-c;9DV$SP3>ayc# z>(agWd_xSa=eGxDDK;~;iQ?5FezHaySiUb@~uq^KbH^4GSa;Yo4QgC3bfR=i6Pi zq}oE9D;D)zpHWfE*iG41c5x4P?9M?YIxzianDYSqrneeQCSq=2n-VUN`a^amJ?r{& zXic0>D<2~W-06+h(+M4LhNrrBKVI0sJm~kU&gQU_&T3QAv+g^#aV^r`DrB;xEtU&P zR>^VQX$jYgJO>q`Cr?=f>5YjTJjV_Hqsp!q)I`2oEW!U!RM?P2w^y4@>qcoBM!7bu z{3DJ&%{Gt1(BdLmlbSMRLL!RKsiB9IWVFPT`_M9v!(Z;91d8v~<&8UICp>FQ*DDDn z2>L$ulR$^}ePZrNx!h=GcPidlccp)rw7lW)cY=0%EEWg0ElfGRkC|1Stj}NlnL{rs z8ymMahN0i}y<60##^?$*$9Q>o(C2r9yN6$@$tuiB?MDL~p-TJrG*cu%hd}#E>-0QH z#FWS*0Oy#J_%DJ0yF_~9=jjN4lTOnANvE=CVWm@{1l^es(7K9BqNy}>HG&O)=Kg;` zub7*#6nW-MQoLFy)wRue--p9*Y^Af}=-N5T<6SY-|c6$x-O_> ztngqPFmkQ#rj83t4TcBd-;LhhM6tokg04GVI*q8Afp`#BL_VRtvmLKae|)NLdxmqw zZ@dU>_ShkX)aY@BU8uWxoT-91^t|>vTSHu}ZFH>c>MA0;y;hQ7!)(NnJI`EPWD-SS zS5aRa9|cpN1YvAsairpzi$V)o*+stC)@`{&chuILrb@9>tLt?q6|1gn%>%e;+<3hF zMTawRrOnd3pgV+eYxzrtf7|xrrF77`Z|XybQKm7Nxz!qPN~uo1We4a{zquJy2t0T7 zrDFm|34^)#WVd&=i17kiCTF*$+f`OPF%*M(*u@GrbZp1W#{AY+Z`lvv1n;JnHC60~ zi5JWtwDqF7+RUVjW-k~U?`n874Y5~6B+K+K@(R=U0GhxXVx#1s~XS9PzC*!s^xv(_TfzF}0*#}0$B?#yQN)VjL8>R9TA46SYc zS9h>e)VQe6$r31mU-GX!eVpG2_tIx$z8Xx8QE!lr(PVAchs-}nQ=+p@Rx>!_!R0@g>S)QO59?FO|y^_$ok^MD#F|EiDvTmwUfD}i!2f21Lxi}7Nc zq{OMHsdZ27cN}phY}6T;?h%`2yO)o-jg8T@e(ip~y$dXND24Oc#@R(lZ`yR@>t}U; zFc|*04!=h;V!nv@QKFY7Hm9;^D6Iis43h&#H(YPM1(XP@XyC5L37)+L_VVA|RZ z>k9+^+;eN-Rd2lUq@w94FFN!Of`LC)tzZhXPhn8jQ}vZ|>rP8|cI%;uKSG;Tk8U0O zA{kYdRlF0{%})bw<*mrKunMuRvT^kG(GG(B5L=wWxOC-hpS;=79&YFI$<2VX{VoUJ zJHhpe`9V=_;qFS%0Z5-`+4K}7B_)@07$-7Pgb-pn82fO-3V?!wJB2M1vvMWMV>kPVW?PjEofhSAM2x`)3Q-mXFd1M1#2p(zV+{0>Ubbjc^ zdSF(J2{(H!Lbcl%41LodOU9xPAWeb-*l$7x;}zaK8tSoLiYYXSXTS;6y4C4*jjNeF zwQz2_=1Lz8f;{_Mtfi2HaTW!NXI&A}cIdCadiNuXoH{Ay>Vre~-EjVQKe(RtuAD1f zE^zJ$JzuUH)o@Js-|8ASgTB{y0hf*gPy9ut#gRFY>Rxp(!%cTC**7BqUjxaO4TZNb&Koo zd49ju^c=J4E4DEn>t+NC_lUAmk7_<9i?$f})s`gBTZX0AS1L)uCT@xaODX*yT|Zh7 z*4g+Wo}Hqyf9U_#IebNe*kXb#$0qu2LAUt&WiuKMNrY&ra=sc*R?58bi9z>2u^J@pYhe-2d%o#>?w5-8gbC9K&6B zFV5G4_t3GBkx8+ow%fwEvtP#%a9n+E*^+dfs$g$`r%SBTIdv`yuM28p24b9!jCjTh zkhs7|CS*Ud{pFs3|4km3rdDgr|7&JmFYEPz(v9x_{7i8++GuIWbFM!T634n4JbZM5 zX6PH=^GcQO(4xIDc^sUm`QvFtfVY}ewIqn#8S-0);I60vjlKb>m0iBIt$J2pdC--e z&iW^fMR!R0L~Yw@qt%#`Q7{`Yf1LwST@+)Q^IIS5A<0Bzo`^x)o%=7hPn+?IJjmI& z7F(*j(D+VZ(HNJ%M@Yd^MdyicT1@8TONIhMlBPgH$WrcKTx3h-%thoLW&r?w25**y zutLK)b0ta5mV`sb5?$O>mN*3%=fq>VsRpmQGYphl#nBAI4plYe`UmK;i2=_x!k)ds z8BwJh9Snww$1?(jPSb{}ZW=uQ=zqJ{I;9Qi6Of8GNFAk#rK7RA3R@h1ZPqY1revyq zLnGtNSH1eiwV09+13%5inhyOxsPxvzbF`W1T48XQJ}-wEB{~2FrV?2r!Ee0>Zk;L`?ycdXE3YO-vdQk&}wQp}Bat;PA4J%K( zLgCp`YOZ3NHLpO$wh>`2 z2RBm|jKFcTG0lE%xuhDC_egexXL_IZ`_Yz7prx!GuK!@P30psGo0;Oezf=F$WTd&1 zzEqNLbCOgjRN|M#GRX?q1(L)Lfx3hukfQyEHk_Tp1sg))62_z;vG-S$8wb^JljwG> z9yIA!(Es!G+5>xIPxa8xN<(9-poWe25A_X-1@Wx58Q2TwFe~|9J1TIeotD@8X4LDb zKePd0aX86{0avEwH@zNEbWc81DTp9cnxTU}QxB0hS`w9iUGk+sZ;eYcUj-GaPEFn) zH{P*hdt36gMke>aNB49(eVCz{XwJMT_y1xU4xWv{VTx^G;=L`XF>W0kBa{L{QslZ{ zR_TkRvsqq*EDE45(`EU*n6DIwVI`OR13ex#1yWHjtI|!gWYqNP4I~{4+fa1;1Fbo$ zGiy;i{8bVpNL77&Nzd2DcILo`X>2FG2j^>WwHg=*74f~?Y}&7CyF84Z^6ZDws(?*F5qKR_G6 zINA*yg9zY_zukh7Y0kRzAKY+oXv5^*lXq|&m_Ny#!LL22U)L26nw*d=?(hXAl4(Hhm+1cMj~>`8!kn0QmQiAvPg%$4;|8WW(6coC(lPIx1A^n^oC@zdY0B zgGAuBv{6Uyi2bwu(q>ODEUTf2mUN_3U~E0*cZvYZb@H+D^1zzI{C_moyPx`;Zg z+PU-y#-6Li+`aqkyqVs!Gq8^S=zF-Zw?}74E3>L}@W~ZW3rD0+kvIjhkjs<57~S~= z0JDX%L;&6i8fZ8;8pjVCmN#4tx@NO$X>jFd9KYSI4dt3UB+!iv!sz;IlY=lrvrT;o=1NmQ%hVExey&L=($n1WdK`;A3n87+}dn=GQIOW(r>&h<@mr>d(CKL8} z)p%0fyJ0erwpIShk>2r9Q#D^&OLIJSOYjA^9k#xs=`GpJ!BCs=+6!j)sL@~`_qD&d zzW&*JR`lPTE`H_UeQ*b_!P&Jt29(bxtq>spsKnFkG~*FUlDQE6=>nux7>fm(g;YtY zVnWax9hyj%^%+p2_lMt_ zPkVQSQr;8$+5U6H8I$^EJsU4|2*P0h@6~*b*p8NEX|wjw7}7_=_+E^Q96xlCf~S#C zG*v9!Sz#7c-o=gKO&#WYOyi6Ii1W&A&z-0QgcPuRh`NvCpxgZ0mv8#iqeTAZw2l3$ z_g}1&A$XpV?ld?|xk9cMPM!;=wq+SXRw+_mnge+V*ug=WNjq8*NUfO2{S#U0%r zezj&-L9*vR6bq%qDT?IX@MnC$;%805>YC%Nd2R-W4EC(%#6yvQ=y+)jj<$afX5JhHwit7FlgAOb)g!W{m+=;<#)@n^Hcdjq zFj1MNTDR{V!#;{YEAJ>en6aUZo6nz@?CA|;Srej`*X`p-5(i>;P{#jh-Q0Ke`nppa zcBElo5$0@knE;T}(W7N`QqYe@f1?&$=@&X~G+0~1!4%M}vIQ9m-?PRjOrK4Llo6_j z)No==w$6ABJ`#^H`d)vxd^V`jH$wzR$Le?U)(p@exoQtf2uS_Q9CN`!g;BUj*cD=* z*m+UR!_$!^24rzuU~Ck@sOyUA*lbOvWA->Ln?cWwuHheMbJF(fde>5T2sE`dTi65& ziv}F;o^j0Ni^o>zOuuZUF$eEWfc{V;@69TCb=FNC{fOZPG}LBnh`SPs|JIFe-WZsY zy*BuC>O<*X>J8O8s-h}Q03wZSYfN!zja8P7Ci$08iy1GuuCI=JHG{f)X^dBFqBU~m zgxEY>Zp^VdoSUXZw)bw>12$&g^2?(gZX$MCsUwrVC|0uZN-CczfRkbx%E8MbTL7A* z_-T^)gm6Wwk|}wrK2YGJ=+yxojHaHB6mlmd+=v5OsJCNi5~?iZph_>lpfCtyc-B@;d7GVX^grN=+j7;fRdx1N7CO0F&5qI>y_RG)^08Vzs8)SR z(Q{+5s_J!@RkAp0}%0W^}R8EuZkg0#^0yR-# zRNF?qDG4`1t0?MqEpd{!bjg<52tBx^(@$3i(NJFK25EVK_jWv4Ei)frSl@GStBP@>s1=h zN~bM3swo;uqa4$kBe}|rfXhZ|>Lp!OdV?x`K)o*2hiWd?B&?AKM`?GpbTG)f$QW>u z4BEvGs)z(K$Wy!xM61EhE9T;-g+ww-=-4T)7uc8CDEUG-r6ZoeQ4SKQS*q${O%&9O zoFkz}V*gv0MQ$aD{(z|Gsb#g7O7NknPSSyyU_H_&sC!hTfJqsVw*D0b;JJh9WoQu2{;W3Qt1_ zIXyisYH_iW$3sr$XNA5Oa;b8v9%ZeiPET_Hmow)C!AE;VDJv+M0%X{DHI>0``Z4a5%il9(-FXhE?qQ}I8XB*V9ih@#f4-(58xmtRnz&BNb!z(g-AI5LU`qW{Xf5~ zSVQN|U&fDcfysv{0Z0|oicq~E)~w1?&&QBC-Jqk;K5+P_A8POp2|7&_BqUN2;D6fT zd|c*Uu`>n)Y2gFSA~+)nUJ|&f&pA)L8q-;(hTIs5;(3z1Fuod36ypNJ1LlSVr!r!X zpYTP_GZHeCM{FvSsd$P%Pm?V5k@hp4W`2yEg)GfD-aUj33sG;9&TERWpL6&v_^;?Ij8^#9$LQ;H+4&>> z?$Zx^SM(*0nEAuWUmu6RDEhXK(T_zx`9J>`{X+ivpU)BJ14SZczVok7mEc$Md-*tj z{W^Y_&lX+Z_{ZoQ`G-G%YV!YomcM=*$HL#3pvQqS7}Z+^El>sOxpL0XkNPiypbC%% zQ3=ruN~g}wAdb;3;*a=BhLSmzWFgI+asKF{B;prmXIxG0Af~BYl}t9lHzf**(**Jh zAy>#&l9ybdawdCz$#hvro=fHUWr3iHxQO8f>=NqCj1XO2M0;uefG?e*NM!?)vKE*vW$1MqJ?=txRH#bj_`X z)2^JoUVfM8~e z1RoU&nS3TvcCmkpGr?xK$x6;s3oP`4Q%Y;&F9A#O_W(pIvw;V zBxSW?Ci+1Vq{#8hfDuk#O1Www&3#s6&|WEY8hHhZDZon6Kk(eD9;iF{j>8qh)0=Vz=l zIDpbQ$iUGOE->RxUZDF(vVD0}-ah zak@g>1B{Cyq|rZRapC$$=a6%j7Cz#aC}t5A3du{FM|h4dxQ`Pwk>IhCQAT)6>k0`P z#_SxM%vMEFn83&icOSea2raw>*ohS=xFVT$xtPC{Scy{H%@UsO)6+EXCWxnbq#V40 zBKZm-U7QnEYMz#Co;OJ4I*08K?<3AdPAd;D7nP?q`qx=qMUd}y_G>(axGonROmWfWU$)O zami-SFQBjInY&extRyq6Icef;nLr_1A^-v@rkDos#*y&R%BF2&H79T!|O1C8dz#-JDHa0IbYi0;lEyN@OZgmbaR~#%1sqo}cq|Yh>Z*IB;Cyt#RU}Ti= ztW+!*IsC8{%KOt(E?^QNaF+WiALr6uaFa*!Fe2x(a)J&>yqwIzkIdwAi(lx25;5BS@Yw4U)s1(l?soaufqfsCNI9wDT2dDNzsZ1ZxB=dQ zBn%vVl~yw~l~9n7l9iNI)D#1rdZ8>Ktfl~5sURgJqzqibZYc-MJOaFuGP1x+q(O^2 zgcN|4xg0-_3b4N6mzS3X4*tpj3maKsE@lZ~6`;L3+QLBp0e8C#sR&4G%SrOfa{^}v ac^IG|Bq-E1%rn^2-%mHf&C|zKj{yKK`LEOf literal 0 HcmV?d00001 diff --git a/src/extras/ImageUtils.js b/src/extras/ImageUtils.js index 9c3089625a..85cafcc7dd 100644 --- a/src/extras/ImageUtils.js +++ b/src/extras/ImageUtils.js @@ -1,6 +1,7 @@ /** * @author alteredq / http://alteredqualia.com/ * @author mrdoob / http://mrdoob.com/ + * @author Daosheng Mu / https://github.com/DaoshengMu/ */ THREE.ImageUtils = { @@ -230,6 +231,453 @@ THREE.ImageUtils = { return texture; }, + + + // reference from vthibault, https://github.com/vthibault/roBrowser/blob/master/src/Loaders/Targa.js + decodeTGA: function ( arrayBuffer ) { + + // TGA Constants + var TGA_TYPE_NO_DATA = 0, + TGA_TYPE_INDEXED = 1, + TGA_TYPE_RGB = 2, + TGA_TYPE_GREY = 3, + TGA_TYPE_RLE_INDEXED = 9, + TGA_TYPE_RLE_RGB = 10, + TGA_TYPE_RLE_GREY = 11, + + TGA_ORIGIN_MASK = 0x30, + TGA_ORIGIN_SHIFT = 0x04, + TGA_ORIGIN_BL = 0x00, + TGA_ORIGIN_BR = 0x01, + TGA_ORIGIN_UL = 0x02, + TGA_ORIGIN_UR = 0x03; + + + if ( arrayBuffer.length < 19 ) + console.error( 'ImageUtils::decodeTGA()- Not enough data to contain header.' ); + + var content = new Uint8Array( arrayBuffer ), + offset = 0, + header = { + id_length: content[ offset++ ], + colormap_type: content[ offset++ ], + image_type: content[offset++], + colormap_index: content[offset++] | content[offset++] << 8, + colormap_length: content[offset++] | content[offset++] << 8, + colormap_size: content[offset++], + + origin: [ + content[offset++] | content[offset++] << 8, + content[offset++] | content[offset++] << 8 + ], + width: content[offset++] | content[offset++] << 8, + height: content[offset++] | content[offset++] << 8, + pixel_size: content[offset++], + flags: content[offset++] + }; + + function tgaCheckHeader( header ) { + switch( header.image_type ) { + // Check indexed type + case TGA_TYPE_INDEXED: + case TGA_TYPE_RLE_INDEXED: + if ( header.colormap_length > 256 || header.colormap_size !== 24 || header.colormap_type !== 1) { + console.error('Targa::tgaCheckHeader() - Invalid type colormap data for indexed type'); + } + break; + + // Check colormap type + case TGA_TYPE_RGB: + case TGA_TYPE_GREY: + case TGA_TYPE_RLE_RGB: + case TGA_TYPE_RLE_GREY: + if (header.colormap_type) { + console.error('ImageUtils::tgaCheckHeader() - Invalid type colormap data for colormap type'); + } + break; + + // What the need of a file without data ? + case TGA_TYPE_NO_DATA: + console.error('ImageUtils::tgaCheckHeader() - No data'); + + // Invalid type ? + default: + console.error('ImageUtils::tgaCheckHeader() - Invalid type " '+ header.image_type + '"'); + } + + // Check image width and height + if ( header.width <= 0 || header.height <=0 ) { + console.error( 'ImageUtils::tgaCheckHeader() - Invalid image size' ); + } + + // Check image pixel size + if (header.pixel_size !== 8 && + header.pixel_size !== 16 && + header.pixel_size !== 24 && + header.pixel_size !== 32) { + console.error('ImageUtils::tgaCheckHeader() - Invalid pixel size "' + header.pixel_size + '"'); + } + } + + // Check tga if it is valid format + tgaCheckHeader( header ); + + if ( header.id_length + offset > arrayBuffer.length ) { + console.error('ImageUtils::load() - No data'); + } + + // Skip the needn't data + offset += header.id_length; + + // Get targa information about RLE compression and palette + var use_rle = false, + use_pal = false, + use_grey = false; + + switch ( header.image_type ) { + case TGA_TYPE_RLE_INDEXED: + use_rle = true; + use_pal = true; + break; + + case TGA_TYPE_INDEXED: + use_pal = true; + break; + + case TGA_TYPE_RLE_RGB: + use_rle = true; + break; + + case TGA_TYPE_RGB: + break; + + case TGA_TYPE_RLE_GREY: + use_rle = true; + use_grey = true; + break; + + case TGA_TYPE_GREY: + use_grey = true; + break; + } + + // Parse tga image buffer + function tgaParse( use_rle, use_pal, header, offset, data ) { + + var pixel_data, + pixel_size, + pixel_total, + palettes; + + pixel_size = header.pixel_size >> 3; + pixel_total = header.width * header.height * pixel_size; + + // Read palettes + if ( use_pal ) { + palettes = data.subarray( offset, offset += header.colormap_length * 3 ); + } + + // Read RLE + if ( use_rle ) { + pixel_data = new Uint8Array(pixel_total); + + var c, count, i; + var shift = 0; + var pixels = new Uint8Array(pixel_size); + + while (shift < pixel_total) { + c = data[offset++]; + count = (c & 0x7f) + 1; + + // RLE pixels. + if (c & 0x80) { + // Bind pixel tmp array + for (i = 0; i < pixel_size; ++i) { + pixels[i] = data[offset++]; + } + + // Copy pixel array + for (i = 0; i < count; ++i) { + pixel_data.set(pixels, shift + i * pixel_size); + } + + shift += pixel_size * count; + } + + // Raw pixels. + else { + count *= pixel_size; + for (i = 0; i < count; ++i) { + pixel_data[shift + i] = data[offset++]; + } + shift += count; + } + } + } + // RAW Pixels + else { + pixel_data = data.subarray( + offset, offset += (use_pal ? header.width * header.height : pixel_total) + ); + } + + return { + pixel_data: pixel_data, + palettes: palettes + }; + } + + function tgaGetImageData8bits(imageData, y_start, y_step, y_end, x_start, x_step, x_end + , image, palettes ) { + var colormap = palettes; + var color, i = 0, x, y; + var width = header.width; + + for (y = y_start; y !== y_end; y += y_step) { + for (x = x_start; x !== x_end; x += x_step, i++) { + color = image[i]; + imageData[(x + width * y) * 4 + 3] = 255; + imageData[(x + width * y) * 4 + 2] = colormap[(color * 3) + 0]; + imageData[(x + width * y) * 4 + 1] = colormap[(color * 3) + 1]; + imageData[(x + width * y) * 4 + 0] = colormap[(color * 3) + 2]; + } + } + + return imageData; + }; + + function tgaGetImageData16bits(imageData, y_start, y_step, y_end, x_start, x_step, x_end + , image) { + var color, i = 0, x, y; + var width = header.width; + + for (y = y_start; y !== y_end; y += y_step) { + for (x = x_start; x !== x_end; x += x_step, i += 2) { + color = image[i + 0] + (image[i + 1] << 8); // Inversed ? + imageData[(x + width * y) * 4 + 0] = (color & 0x7C00) >> 7; + imageData[(x + width * y) * 4 + 1] = (color & 0x03E0) >> 2; + imageData[(x + width * y) * 4 + 2] = (color & 0x001F) >> 3; + imageData[(x + width * y) * 4 + 3] = (color & 0x8000) ? 0 : 255; + } + } + + return imageData; + }; + + function tgaGetImageData24bits(imageData, y_start, y_step, y_end, x_start, x_step, x_end, image) { + var i = 0, x, y; + var width = header.width; + + for (y = y_start; y !== y_end; y += y_step) { + for (x = x_start; x !== x_end; x += x_step, i += 3) { + imageData[(x + width * y) * 4 + 3] = 255; + imageData[(x + width * y) * 4 + 2] = image[i + 0]; + imageData[(x + width * y) * 4 + 1] = image[i + 1]; + imageData[(x + width * y) * 4 + 0] = image[i + 2]; + } + } + + return imageData; + }; + + function tgaGetImageData32bits(imageData, y_start, y_step, y_end, x_start, x_step, x_end, image) { + var i = 0, x, y; + var width = header.width; + + for (y = y_start; y !== y_end; y += y_step) { + for (x = x_start; x !== x_end; x += x_step, i += 4) { + imageData[(x + width * y) * 4 + 2] = image[i + 0]; + imageData[(x + width * y) * 4 + 1] = image[i + 1]; + imageData[(x + width * y) * 4 + 0] = image[i + 2]; + imageData[(x + width * y) * 4 + 3] = image[i + 3]; + } + } + + return imageData; + }; + + function tgaGetImageDataGrey8bits( imageData, y_start, y_step, y_end, x_start, x_step, x_end, image ) { + var color, i = 0, x, y; + var width = header.width; + + for (y = y_start; y !== y_end; y += y_step) { + for (x = x_start; x !== x_end; x += x_step, i++) { + color = image[i]; + imageData[(x + width * y) * 4 + 0] = color; + imageData[(x + width * y) * 4 + 1] = color; + imageData[(x + width * y) * 4 + 2] = color; + imageData[(x + width * y) * 4 + 3] = 255; + } + } + + return imageData; + }; + + function tgaGetImageDataGrey16bits(imageData, y_start, y_step, y_end, x_start, x_step, x_end, image) { + var i = 0, x, y; + var width = header.width; + + for (y = y_start; y !== y_end; y += y_step) { + for (x = x_start; x !== x_end; x += x_step, i += 2) { + imageData[(x + width * y) * 4 + 0] = image[i + 0]; + imageData[(x + width * y) * 4 + 1] = image[i + 0]; + imageData[(x + width * y) * 4 + 2] = image[i + 0]; + imageData[(x + width * y) * 4 + 3] = image[i + 1]; + } + } + + return imageData; + }; + + function getTgaRGBA( width, height, image, palette ) { + var x_start, + y_start, + x_step, + y_step, + x_end, + y_end, + data = new Uint8Array(width * height * 4); + + switch( (header.flags & TGA_ORIGIN_MASK) >> TGA_ORIGIN_SHIFT ) { + default: + case TGA_ORIGIN_UL: + x_start = 0; + x_step = 1; + x_end = width; + y_start = 0; + y_step = 1; + y_end = height; + break; + + case TGA_ORIGIN_BL: + x_start = 0; + x_step = 1; + x_end = width; + y_start = height - 1; + y_step = -1; + y_end = -1; + break; + + case TGA_ORIGIN_UR: + x_start = width - 1; + x_step = -1; + x_end = -1; + y_start = 0; + y_step = 1; + y_end = height; + break; + + case TGA_ORIGIN_BR: + x_start = width - 1; + x_step = -1; + x_end = -1; + y_start = height - 1; + y_step = -1; + y_end = -1; + break; + } + + + if ( use_grey ) { + + switch( header.pixel_size ) + { + case 8: + tgaGetImageDataGrey8bits( data, y_start, y_step, y_end, x_start, x_step, x_end, image ); + break; + case 16: + tgaGetImageDataGrey16bits( data, y_start, y_step, y_end, x_start, x_step, x_end, image ); + break; + default: + console.error( 'ImageUtils::getTgaRGBA() - not support this format' ); + break; + } + + } + else { + + switch( header.pixel_size ) + { + case 8: + tgaGetImageData8bits( data, y_start, y_step, y_end, x_start, x_step, x_end, image, palette ); + break; + + case 16: + tgaGetImageData16bits( data, y_start, y_step, y_end, x_start, x_step, x_end, image ); + break; + + case 24: + tgaGetImageData24bits( data, y_start, y_step, y_end, x_start, x_step, x_end, image ); + break; + + case 32: + tgaGetImageData32bits( data, y_start, y_step, y_end, x_start, x_step, x_end, image ); + break; + + default: + console.error( 'ImageUtils::getTgaRGBA() - not support this format' ); + break; + } + } + // Load image data according to specific method + // var func = 'tgaGetImageData' + (use_grey ? 'Grey' : '') + (header.pixel_size) + 'bits'; + //func(data, y_start, y_step, y_end, x_start, x_step, x_end, width, image, palette ); + return data; + } + + var result = tgaParse( use_rle, use_pal, header, offset, content ); + var rgbaData = getTgaRGBA( header.width, header.height, result.pixel_data, result.palettes ); + + + return { + width: header.width, + height: header.height, + data: rgbaData + }; + }, + + loadTGATexture: function ( url, mapping, onLoad, onError ) { + + var texture = new THREE.TGATexture(); + { + var request = new XMLHttpRequest(); + + request.open( 'GET', url, true ); + request.responseType = "arraybuffer"; + request.onload = function() { + if ( this.status === 200 ) { + var imageData = THREE.ImageUtils.decodeTGA( this.response ); + + if ( imageData ) { + texture.image = imageData; + texture.sourceFile = url; + texture.needsUpdate = true; + + return texture; + } + + } + }; + + request.addEventListener( 'load', function ( event ) { + + if ( onLoad ) onLoad( texture ); + + }, false ); + + request.addEventListener( 'error', function ( event ) { + + if ( onError ) onError( event ); + + }, false ); + + request.send(null); + } + + texture.sourceFile = url; + + return texture; + }, loadDDSTexture: function ( url, mapping, onLoad, onError ) { diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 3b4126f5b8..256e0d27aa 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -5546,7 +5546,11 @@ THREE.WebGLRenderer = function ( parameters ) { } - } else { // regular Texture (image, video, canvas) + } else if ( texture instanceof THREE.TGATexture ) { + var tgaImg = texture.image; + _gl.texImage2D( _gl.TEXTURE_2D, 0, glFormat, tgaImg.width, tgaImg.height, 0, glFormat, glType, tgaImg.data ); + + } else { // regular Texture (image, video, canvas) // use manually created mipmaps if available // if there are no manual mipmaps diff --git a/src/textures/TGATexture.js b/src/textures/TGATexture.js new file mode 100644 index 0000000000..335170d699 --- /dev/null +++ b/src/textures/TGATexture.js @@ -0,0 +1,19 @@ +/** + * @author Daosheng Mu / https://github.com/DaoshengMu/ + */ + +THREE.TGATexture = function ( format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy ) { + + THREE.Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); +}; + +THREE.TGATexture.prototype = Object.create( THREE.Texture.prototype ); + +THREE.TGATexture.prototype.clone = function() { + + var texture = new THREE.TGATexture(); + + THREE.Texture.prototype.clone.all( this. texture ); + + return texture; +}; \ No newline at end of file diff --git a/utils/build/includes/common.json b/utils/build/includes/common.json index 46913ec908..1bf58b18f2 100644 --- a/utils/build/includes/common.json +++ b/utils/build/includes/common.json @@ -64,6 +64,7 @@ "src/materials/SpriteCanvasMaterial.js", "src/textures/Texture.js", "src/textures/CompressedTexture.js", + "src/textures/TGATexture.js", "src/textures/DataTexture.js", "src/objects/PointCloud.js", "src/objects/Line.js", diff --git a/utils/build/includes/webgl.json b/utils/build/includes/webgl.json index 5934d45ab3..fb88e9a7a3 100644 --- a/utils/build/includes/webgl.json +++ b/utils/build/includes/webgl.json @@ -55,6 +55,7 @@ "src/materials/SpriteMaterial.js", "src/textures/Texture.js", "src/textures/CompressedTexture.js", + "src/textures/TGATexture.js", "src/textures/DataTexture.js", "src/objects/PointCloud.js", "src/objects/Line.js", -- GitLab