You can subscribe to this list here.
2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(134) |
Sep
(52) |
Oct
(13) |
Nov
(342) |
Dec
(163) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2003 |
Jan
(44) |
Feb
(62) |
Mar
(158) |
Apr
(38) |
May
(70) |
Jun
(58) |
Jul
(104) |
Aug
(207) |
Sep
(83) |
Oct
(122) |
Nov
(23) |
Dec
(49) |
2004 |
Jan
(119) |
Feb
(132) |
Mar
(192) |
Apr
(140) |
May
(77) |
Jun
(74) |
Jul
(201) |
Aug
(63) |
Sep
(102) |
Oct
(70) |
Nov
(173) |
Dec
(78) |
2005 |
Jan
(174) |
Feb
(197) |
Mar
(105) |
Apr
(59) |
May
(77) |
Jun
(43) |
Jul
(21) |
Aug
(18) |
Sep
(47) |
Oct
(37) |
Nov
(74) |
Dec
(50) |
2006 |
Jan
(44) |
Feb
(19) |
Mar
(32) |
Apr
(24) |
May
(31) |
Jun
(55) |
Jul
(138) |
Aug
(28) |
Sep
(12) |
Oct
(41) |
Nov
(58) |
Dec
(24) |
2007 |
Jan
(28) |
Feb
(14) |
Mar
(10) |
Apr
(68) |
May
(30) |
Jun
(26) |
Jul
(18) |
Aug
(63) |
Sep
(19) |
Oct
(29) |
Nov
(20) |
Dec
(10) |
2008 |
Jan
(38) |
Feb
(7) |
Mar
(37) |
Apr
(120) |
May
(41) |
Jun
(36) |
Jul
(39) |
Aug
(24) |
Sep
(28) |
Oct
(30) |
Nov
(36) |
Dec
(75) |
2009 |
Jan
(46) |
Feb
(22) |
Mar
(50) |
Apr
(70) |
May
(134) |
Jun
(105) |
Jul
(75) |
Aug
(34) |
Sep
(38) |
Oct
(34) |
Nov
(19) |
Dec
(20) |
2010 |
Jan
(11) |
Feb
(20) |
Mar
(65) |
Apr
(83) |
May
(104) |
Jun
(73) |
Jul
(78) |
Aug
(57) |
Sep
(43) |
Oct
(35) |
Nov
(9) |
Dec
(4) |
2011 |
Jan
(21) |
Feb
(11) |
Mar
(18) |
Apr
(10) |
May
(18) |
Jun
(15) |
Jul
(48) |
Aug
(25) |
Sep
(17) |
Oct
(45) |
Nov
(15) |
Dec
(12) |
2012 |
Jan
(21) |
Feb
(9) |
Mar
(12) |
Apr
(9) |
May
(9) |
Jun
(5) |
Jul
(1) |
Aug
(10) |
Sep
(12) |
Oct
(1) |
Nov
(28) |
Dec
(5) |
2013 |
Jan
(4) |
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2014 |
Jan
|
Feb
(1) |
Mar
(1) |
Apr
|
May
(2) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(1) |
Nov
|
Dec
|
2015 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
(2) |
Nov
|
Dec
|
2016 |
Jan
(2) |
Feb
(1) |
Mar
(1) |
Apr
(1) |
May
(2) |
Jun
|
Jul
(1) |
Aug
(2) |
Sep
|
Oct
|
Nov
(1) |
Dec
|
2017 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Elias N. <eli...@us...> - 2002-11-25 13:33:15
|
Update of /cvsroot/java-game-lib/LWJGL/src/native/common In directory sc8-pr-cvs1:/tmp/cvs-serv18214/common Added Files: org_lwjgl_opengl_CoreGL.cpp org_lwjgl_opengl_GL.cpp Log Message: Moved org_lwjgl_opengl_GL.cpp to common (again) --- NEW FILE: org_lwjgl_opengl_CoreGL.cpp --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/common/org_lwjgl_opengl_CoreGL.cpp /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * [...4309 lines suppressed...] */ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_CoreGL_multTransposeMatrixf (JNIEnv *env, jobject obj, jint m) { glMultTransposeMatrixf((float *)m); CHECK_GL_ERROR } /* * Class: org_lwjgl_opengl_CoreGL * Method: sampleCoverage * Signature: (FZ)V */ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_CoreGL_sampleCoverage (JNIEnv *env, jobject obj, jfloat value, jboolean invert) { glSampleCoverage(value, invert); CHECK_GL_ERROR } --- NEW FILE: org_lwjgl_opengl_GL.cpp --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/common/org_lwjgl_opengl_GL.cpp /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * [...4123 lines suppressed...] } /* * Class: org_lwjgl_opengl_GL * Method: checkWGLExtensionsString */ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL_checkWGLExtensionsString(JNIEnv * env, jclass clazz) { #ifdef _WIN32 jfieldID fid_WGL_ARB_extensions_string = env->GetStaticFieldID(clazz, "WGL_ARB_extensions_string", "Z"); jfieldID fid_WGL_EXT_extensions_string = env->GetStaticFieldID(clazz, "WGL_EXT_extensions_string", "Z"); if (wglGetExtensionsStringARB) env->SetStaticBooleanField(clazz, fid_WGL_ARB_extensions_string, JNI_TRUE); if (wglGetExtensionsStringEXT) env->SetStaticBooleanField(clazz, fid_WGL_EXT_extensions_string, JNI_TRUE); #endif } |
From: Elias N. <eli...@us...> - 2002-11-25 13:32:20
|
Update of /cvsroot/java-game-lib/LWJGL/src/native/win32 In directory sc8-pr-cvs1:/tmp/cvs-serv17676/win32 Removed Files: org_lwjgl_opengl_CoreGL.cpp org_lwjgl_opengl_GL.cpp Log Message: Moved org_lwjgl_opengl_GL.cpp to common --- org_lwjgl_opengl_CoreGL.cpp DELETED --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/win32/org_lwjgl_opengl_CoreGL.cpp --- org_lwjgl_opengl_GL.cpp DELETED --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/win32/org_lwjgl_opengl_GL.cpp |
From: Elias N. <eli...@us...> - 2002-11-25 13:32:20
|
Update of /cvsroot/java-game-lib/LWJGL/src/native/linux In directory sc8-pr-cvs1:/tmp/cvs-serv17676/linux Removed Files: org_lwjgl_opengl_CoreGL.cpp org_lwjgl_opengl_GL.cpp Log Message: Moved org_lwjgl_opengl_GL.cpp to common --- org_lwjgl_opengl_CoreGL.cpp DELETED --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/linux/org_lwjgl_opengl_CoreGL.cpp --- org_lwjgl_opengl_GL.cpp DELETED --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/linux/org_lwjgl_opengl_GL.cpp |
Update of /cvsroot/java-game-lib/LWJGL/src/native/common In directory sc8-pr-cvs1:/tmp/cvs-serv9414/common Added Files: MatrixOpCommon.cpp MatrixOpCommon.h org_lwjgl_Math.cpp org_lwjgl_Math_MatrixOpAdd_MatrixOpDirect.cpp org_lwjgl_Math_MatrixOpAdd_MatrixOpSafe.cpp org_lwjgl_Math_MatrixOpCopy_MatrixOpDirect.cpp org_lwjgl_Math_MatrixOpCopy_MatrixOpSafe.cpp org_lwjgl_Math_MatrixOpInvert_MatrixOpDirect.cpp org_lwjgl_Math_MatrixOpInvert_MatrixOpSafe.cpp org_lwjgl_Math_MatrixOpMultiply_MatrixOpDirect.cpp org_lwjgl_Math_MatrixOpMultiply_MatrixOpSafe.cpp org_lwjgl_Math_MatrixOpNegate_MatrixOpDirect.cpp org_lwjgl_Math_MatrixOpNegate_MatrixOpSafe.cpp org_lwjgl_Math_MatrixOpNormalise_MatrixOpDirect.cpp org_lwjgl_Math_MatrixOpNormalise_MatrixOpSafe.cpp org_lwjgl_Math_MatrixOpSubtract_MatrixOpDirect.cpp org_lwjgl_Math_MatrixOpSubtract_MatrixOpSafe.cpp Log Message: Moved Math functions to common --- NEW FILE: MatrixOpCommon.cpp --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/common/MatrixOpCommon.cpp //#include <iostream> #include <jni.h> #include <memory.h> #include "MatrixOpCommon.h" bool Matrix::identicalDataSpaces(Matrix & other) { if (address != other.address) return JNI_FALSE; if (stride != other.stride) return JNI_FALSE; if ((width * height) != (other.width * other.height)) return JNI_FALSE; return JNI_TRUE; } bool Matrix::intersectingDataSpaces(Matrix & other) { char * my_max_address = &address[ stride * elements ]; char * other_max_address = &other.address[ other.stride * other.elements]; if (address >= other.address || address <= other_max_address) return JNI_TRUE; if (other.address >= address || other.address <= my_max_address) return JNI_TRUE; return JNI_FALSE; } void Matrix::transposeMatrix(float * src, float * dst, int src_width, int src_height) { // square matrix transpose if (src_width == src_height) { for (int i = 0; i < src_width; i++) for (int j = 0; j < src_width; j++) dst[i + src_width * j] = src[j + i * src_width]; } // non square matrix transpose else { for (int i = 0; i < src_width; i ++) for (int j = 0; j < src_height; j++) dst[i + src_height * j] = src[j + i * src_height]; } } void Matrix::transposeMatrix(float * mat, int src_width, int src_height) { float temp; // square matrix transpose if (src_width == src_height) { for (int col = 0; col < src_width; col++) { for (int row = col+1; row < src_height; row++) { // swap the two elements temp = mat [col * src_height + row]; mat[col * src_height + row] = mat[row * src_width + col]; mat[row * src_width + col] = temp; } } } // non square matrix transpose else { transposeMatrix(mat, transpose_record, src_width, src_height); memcpy(mat, transpose_record, src_width * src_height * sizeof(float)); } } MatrixSrc::MatrixSrc ( jint addr, jint s, jint w, jint h, jint e, jboolean t): Matrix(addr, s, e), record_offset((char *) addr), record_size (w*h) { if (t) { width = h; height = w; } else { width = w; height = h; } elements = e; record = new float[width * height]; // vectors do not need to be transposed transpose = (t == JNI_TRUE) && (w != 1) && (h != 1); if (transpose && (width != height)) // only need temp storage for transpose if the matrix is not square transpose_record = new float[width*height]; else transpose_record = 0; if (elements == 1) { // fool the nextMatrix function into returning a value elements = 2; nextMatrix(); elements = 1; } } MatrixSrc::~MatrixSrc() { //cout << "MatrixSrc destructor \n"; delete [] record; if (transpose_record != 0) delete [] transpose_record; } float * MatrixSrc::nextMatrix() { if (elements > 1) { //cout << "Elements: " << elements << "\n"; //cout << "Address: " << (unsigned int) (record_offset) << "\n"; // the record is not properly aligned if ((unsigned int) (record_offset) & FLOAT_ALIGNMENT) { // copy the floats into a buffer so that they are aligned // on 4 byte margins (not necessary on intel, but a good thing) memcpy (record, record_offset, record_size * sizeof(float)); if (transpose) transposeMatrix (record, height, width); record_offset = &record_offset[stride]; current_record_ptr = record; } // the record is aligned but it has to be transposed else if (transpose) { transposeMatrix ((float *) (record_offset), record, height, width); record_offset = &record_offset[stride]; current_record_ptr = record; } // nothing has to be done to the record else { // the floats are aligned in memory current_record_ptr = (float *) record_offset; record_offset = &record_offset[stride]; } } return current_record_ptr; } MatrixDst::MatrixDst (jint addr, jint s, jint w, jint h, jint e, jboolean t): Matrix(addr, s, e) { width = w; height = h; record_size = width * height; record = new float[record_size]; // vectors do not need to be transposed transpose = (t) && (w != 1) && (h != 1); if (transpose) transpose_record = new float[width*height]; else transpose_record = 0; data_buffered = JNI_FALSE; record_buffered = JNI_FALSE; record_offset = address - stride; } MatrixDst::~MatrixDst() { //cout << "MatrixDst destructor \n"; delete [] record; if (transpose_record != 0) delete [] transpose_record; // copy back any buffered data if (data_buffered) { char * src = buffer; char * dest = address; for (int i = 0; i < elements; i++) { memcpy(dest, src, record_size * sizeof(float)); src += stride; dest += stride; } delete [] buffer; } } void MatrixDst::configureBuffer(MatrixSrc & a, MatrixSrc & b) { if (!a.intersectingDataSpaces(b)) { // as long as the output only overlays 1 of the sources, and the other // source only has 1 matrix in it, only a record_buffer is required if (a.elements == 1 && identicalDataSpaces(b)) record_buffered = JNI_TRUE; else if (b.elements == 1 && identicalDataSpaces(a)) record_buffered = JNI_TRUE; else // otherwise all of the output has to be buffered createBuffer(); } else createBuffer(); } void MatrixDst::configureBuffer(MatrixSrc & a) { if (identicalDataSpaces(a)) record_buffered = JNI_TRUE; else if (intersectingDataSpaces(a)) createBuffer(); } void MatrixDst::createBuffer() { data_buffered = JNI_TRUE; buffer = new char[ elements * stride ]; record_offset = buffer - stride; } float * MatrixDst::nextMatrix() { record_offset = &record_offset[stride]; int alignment = ((unsigned int)(record_offset)) & FLOAT_ALIGNMENT; if (transpose || record_buffered || alignment) { last_record_in_temp = JNI_TRUE; return record; } else { last_record_in_temp = JNI_FALSE; return (float *) record_offset; } } void MatrixDst::writeComplete() { if (last_record_in_temp) { // 3 reasons why the record would be in temp // // 1. The record is not aligned // 2. The result will need to be transposed // 3. Direct Mode where result would overlay an operand if (((unsigned int)(record_offset)) & FLOAT_ALIGNMENT) { if (transpose) transposeMatrix(record, width, height); memcpy (record, record_offset, record_size * sizeof(jfloat)); } else if (transpose) { transposeMatrix(record, (float *) &record_offset[0], width, height); } else memcpy (record_offset, record, record_size * sizeof(jfloat)); } } /////////////////////////////////////////////////////////////////////////// void subMatrix (const float * src, int side, float * dst , int col_omit, int row_omit) { int index = 0; int src_index = 0; for (int c = 0; c < side; c++) { if (c == col_omit) { src_index += side; continue; } for (int r = 0; r < side; r++) { if (r == row_omit) { src_index++; continue; } dst[index++] = src[src_index++]; } } } float determinant (const float * matrix , int side) { // we are assuming for this case that the data is in column major format float det = 0; if (side == 2) // your basic cross product aka 2x2 determinant det = matrix[0] * matrix[3] - matrix[2] * matrix[1]; else { // create room to store the sub matrix int temp_side = side - 1; // the dimensions of the sub matrix float * temp_matrix = new float[temp_side * temp_side]; // keep the sign (this way we avoid an additional branch in the inner loop) float sign = 1; for (int row = 0; row < side; row++) { // get a sub matrix by eliminating the 0th col and the specified row subMatrix(matrix, side, temp_matrix, 0, row); // add to the determinant sign * [a]i0 * [M]i0 det += sign * matrix[row] * determinant (temp_matrix, temp_side); // alternate the sign sign *= -1; } delete [] temp_matrix; } return det; } --- NEW FILE: MatrixOpCommon.h --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/common/MatrixOpCommon.h /* * Matrix.h * * * Created by tristan on Sat Aug 24 2002. * Copyright (c) 2001 __MyCompanyName__. All rights reserved. * */ //////////////////////////////////////////////////////////////////////////////////////// // Utility Functions //////////////////////////////////////////////////////////////////////////////////////// #define FLOAT_ALIGNMENT 0x00000003 // 23 bit mantisa on a float (we need error for checking if two nums are equal) // for now use error of 1/2^18, this could be refined up to 1/2^22 if needed #define FLOATING_POINT_ERROR (1.0f/262144.0f) // check if two numbers are approximately equal, used when floating point errors // occur. Should NEVER check to see if two floats are identical inline bool approxEqual(float a, float b) { a -= b; a = (a < 0) ? -a: a; return (a < FLOATING_POINT_ERROR); } float determinant (const float * matrix , int side); void subMatrix (const float * src, int side, float * dst , int col_omit, int row_omit); /////////////////////////////////////////////////////////////////////////////////////// // Matrix ////////////////////////////////////////////////////////////////////////////////////// class Matrix { protected: float * transpose_record; // to use while transposing the record public: char * address; // the start of the data jint stride; // the distance between each record jint width, // the width of the matrix height, // the height of the matrix elements; // the number of matricies jboolean transpose; // whether this matrix is or will be transposed Matrix (jint a, jint s, jint e): address((char *)a), stride(s), elements(e) {} bool identicalDataSpaces (Matrix & other); bool intersectingDataSpaces(Matrix & other); void transposeMatrix(float * src, float * dst, int src_width, int src_height); void transposeMatrix(float * mat, int src_width, int src_height); }; /////////////////////////////////////////////////////////////////////////////////////// // Src Matrix ////////////////////////////////////////////////////////////////////////////////////// class MatrixSrc: public Matrix { private: char * record_offset; // the offset of this record in memory float * record; // temporary storage to store a fully aligned and transposed // copy of the record, if the one in memory is not so float * current_record_ptr; // the address of the memory containing the record last // returned by the nextMatrix() function jint record_size; // the total floats in each record public: MatrixSrc ( jint address, jint stride, jint width, jint height, jint elements, jboolean transpose); ~MatrixSrc(); void rewind() { record_offset = address; } float * nextMatrix(); }; /////////////////////////////////////////////////////////////////////////////////////// // Dst Matrix ////////////////////////////////////////////////////////////////////////////////////// class MatrixDst: public Matrix { private: char * record_offset; // the offset of the record in memory jboolean data_buffered; // if all of the data has to be buffered char * buffer; // a buffer used when data_buffered jboolean last_record_in_temp; jboolean record_buffered; // if only a single record is buffered float * record; // to store data if source is unaligned jint record_size; void createBuffer(); public: MatrixDst (jint address, jint stride, jint width, jint height, jint elements, jboolean transpose); ~MatrixDst(); void configureBuffer(MatrixSrc & a, MatrixSrc & b); void configureBuffer(MatrixSrc & a); float * nextMatrix(); void writeComplete(); }; --- NEW FILE: org_lwjgl_Math.cpp --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/common/org_lwjgl_Math.cpp /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * $Id: org_lwjgl_Math.cpp,v 1.1 2002/11/25 13:18:23 elias_naur Exp $ * * maths library. * * @author cix_foo <ci...@us...> * @version $Revision: 1.1 $ */ #ifdef _WIN32 #include <windows.h> #endif //#include "org_lwjgl_Math.h" #include "math.h" --- NEW FILE: org_lwjgl_Math_MatrixOpAdd_MatrixOpDirect.cpp --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/common/org_lwjgl_Math_MatrixOpAdd_MatrixOpDirect.cpp /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * $Id: org_lwjgl_Math_MatrixOpAdd_MatrixOpDirect.cpp,v 1.1 2002/11/25 13:18:23 elias_naur Exp $ * * math library. * * @author cix_foo <ci...@us...> * @version $Revision: 1.1 $ */ #ifdef _WIN32 #include <windows.h> #endif #include "org_lwjgl_Math_MatrixOpAdd_MatrixOpDirect.h" #include "MatrixOpCommon.h" /* * Class: org_lwjgl_Math_MatrixOpAdd_MatrixOpDirect * Method: execute * Signature: (IIIIIZIIIIIZIIZ)V */ JNIEXPORT void JNICALL Java_org_lwjgl_Math_00024MatrixOpAdd_00024MatrixOpDirect_execute ( JNIEnv * env, jobject obj, jint leftSourceAddress, jint leftSourceStride, jint leftElements, jint leftSourceWidth, jint leftSourceHeight, jboolean transposeLeftSource, jint rightSourceAddress, jint rightSourceStride, jint rightElements, jint rightSourceWidth, jint rightSourceHeight, jboolean transposeRightSource, jint destAddress, jint destStride, jboolean transposeDest ) { MatrixSrc left (leftSourceAddress, leftSourceStride, leftSourceWidth, leftSourceHeight, leftElements, transposeLeftSource); MatrixSrc right (rightSourceAddress, leftSourceStride, rightSourceWidth, rightSourceHeight, rightElements, transposeRightSource); MatrixDst dest (destAddress, destStride, left.width, left.height, left.elements * right.elements, transposeDest); dest.configureBuffer(left, right); float * leftMatrix, * rightMatrix, * destMatrix; left.rewind(); for (int i = 0; i < left.elements; i++) { leftMatrix = left.nextMatrix(); right.rewind(); for (int j = 0; j < right.elements; j++) { rightMatrix = right.nextMatrix(); destMatrix = dest.nextMatrix(); int k = dest.width * dest.height; while (k--) destMatrix[k] = leftMatrix[k] + rightMatrix[k]; dest.writeComplete(); } } } --- NEW FILE: org_lwjgl_Math_MatrixOpAdd_MatrixOpSafe.cpp --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/common/org_lwjgl_Math_MatrixOpAdd_MatrixOpSafe.cpp /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * $Id: org_lwjgl_Math_MatrixOpAdd_MatrixOpSafe.cpp,v 1.1 2002/11/25 13:18:23 elias_naur Exp $ * * math library. * * @author cix_foo <ci...@us...> * @version $Revision: 1.1 $ */ #ifdef _WIN32 #include <windows.h> #endif #include "org_lwjgl_Math_MatrixOpAdd_MatrixOpSafe.h" #include "MatrixOpCommon.h" /* * Class: org_lwjgl_Math_MatrixOpAdd_MatrixOpSafe * Method: execute * Signature: (IIIIIZIIIIIZIIZ)V */ JNIEXPORT void JNICALL Java_org_lwjgl_Math_00024MatrixOpAdd_00024MatrixOpSafe_execute ( JNIEnv * env, jobject obj, jint leftSourceAddress, jint leftSourceStride, jint leftElements, jint leftSourceWidth, jint leftSourceHeight, jboolean transposeLeftSource, jint rightSourceAddress, jint rightSourceStride, jint rightElements, jint rightSourceWidth, jint rightSourceHeight, jboolean transposeRightSource, jint destAddress, jint destStride, jboolean transposeDest ) { MatrixSrc left (leftSourceAddress, leftSourceStride, leftSourceWidth, leftSourceHeight, leftElements, transposeLeftSource); MatrixSrc right (rightSourceAddress, leftSourceStride, rightSourceWidth, rightSourceHeight, rightElements, transposeRightSource); MatrixDst dest (destAddress, destStride, left.width, left.height, left.elements * right.elements, transposeDest); float * leftMatrix, * rightMatrix, * destMatrix; left.rewind(); for (int i = 0; i < leftElements; i++) { leftMatrix = left.nextMatrix(); right.rewind(); for (int j = 0; j < rightElements; j++) { rightMatrix = right.nextMatrix(); destMatrix = dest.nextMatrix(); int k = dest.width * dest.height; while (k--) destMatrix[k] = leftMatrix[k] + rightMatrix[k]; dest.writeComplete(); } } } --- NEW FILE: org_lwjgl_Math_MatrixOpCopy_MatrixOpDirect.cpp --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/common/org_lwjgl_Math_MatrixOpCopy_MatrixOpDirect.cpp /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * $Id: org_lwjgl_Math_MatrixOpCopy_MatrixOpDirect.cpp,v 1.1 2002/11/25 13:18:23 elias_naur Exp $ * * math library. * * @author cix_foo <ci...@us...> * @version $Revision: 1.1 $ */ #ifdef _WIN32 #include <windows.h> #endif #include "org_lwjgl_Math_MatrixOpCopy_MatrixOpDirect.h" #include "MatrixOpCommon.h" #include <string.h> /* * Class: org_lwjgl_Math_MatrixOpCopy_MatrixOpDirect * Method: execute * Signature: (IIIIIZIIZ)V */ JNIEXPORT void JNICALL Java_org_lwjgl_Math_00024MatrixOpCopy_00024MatrixOpDirect_execute ( JNIEnv * env, jobject obj, jint sourceAddress, jint sourceStride, jint numElements, jint sourceWidth, jint sourceHeight, jboolean transposeSource, jint destAddress, jint destStride, jboolean transposeDest ) { if (transposeSource == transposeDest) { transposeSource = false; transposeDest = false; } MatrixSrc source (sourceAddress, sourceStride, sourceWidth, sourceHeight, numElements, transposeSource); MatrixDst dest (destAddress, destStride, source.width, source.height, source.elements, transposeDest); dest.configureBuffer(source); float * srcMatrix, * destMatrix; int matrixByteCount = source.width*source.height*sizeof(jfloat); for (int i = 0; i < source.elements; i++) { srcMatrix = source.nextMatrix(); destMatrix = dest.nextMatrix(); // just do a straight memory copy memcpy(destMatrix, srcMatrix, matrixByteCount); dest.writeComplete(); } } --- NEW FILE: org_lwjgl_Math_MatrixOpCopy_MatrixOpSafe.cpp --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/common/org_lwjgl_Math_MatrixOpCopy_MatrixOpSafe.cpp /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * $Id: org_lwjgl_Math_MatrixOpCopy_MatrixOpSafe.cpp,v 1.1 2002/11/25 13:18:23 elias_naur Exp $ * * math library. * * @author cix_foo <ci...@us...> * @version $Revision: 1.1 $ */ #ifdef _WIN32 #include <windows.h> #endif #include <string.h> #include "org_lwjgl_Math_MatrixOpCopy_MatrixOpSafe.h" #include "MatrixOpCommon.h" /* * Class: org_lwjgl_Math_MatrixOpCopy_MatrixOpSafe * Method: execute * Signature: (IIIIIZIIZ)V */ JNIEXPORT void JNICALL Java_org_lwjgl_Math_00024MatrixOpCopy_00024MatrixOpSafe_execute ( JNIEnv * env, jobject obj, jint sourceAddress, jint sourceStride, jint numElements, jint sourceWidth, jint sourceHeight, jboolean transposeSource, jint destAddress, jint destStride, jboolean transposeDest ) { // remove any unnecessary copying if (transposeSource == transposeDest) { transposeSource = false; transposeDest = false; } MatrixSrc source (sourceAddress, sourceStride, sourceWidth, sourceHeight, numElements, transposeSource); MatrixDst dest (destAddress, destStride, source.width, source.height, source.elements, transposeDest); float * srcMatrix, * destMatrix; int matrixByteCount = source.width*source.height*sizeof(jfloat); for (int i = 0; i < source.elements; i++) { srcMatrix = source.nextMatrix(); destMatrix = dest.nextMatrix(); // just do a straight memory copy memcpy(destMatrix, srcMatrix, matrixByteCount); dest.writeComplete(); } } --- NEW FILE: org_lwjgl_Math_MatrixOpInvert_MatrixOpDirect.cpp --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/common/org_lwjgl_Math_MatrixOpInvert_MatrixOpDirect.cpp /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * $Id: org_lwjgl_Math_MatrixOpInvert_MatrixOpDirect.cpp,v 1.1 2002/11/25 13:18:23 elias_naur Exp $ * * math library. * * @author cix_foo <ci...@us...> * @version $Revision: 1.1 $ */ #ifdef _WIN32 #include <windows.h> #endif #include "org_lwjgl_Math_MatrixOpInvert_MatrixOpDirect.h" #include "MatrixOpCommon.h" #ifdef _DEBUG #include <stdio.h> #endif /* * Class: org_lwjgl_Math_MatrixOpInvert_MatrixOpDirect * Method: execute * Signature: (IIIIIZIIZ)V */ JNIEXPORT void JNICALL Java_org_lwjgl_Math_00024MatrixOpInvert_00024MatrixOpDirect_execute ( JNIEnv * env, jobject obj, jint sourceAddress, jint sourceStride, jint numElements, jint sourceWidth, jint sourceHeight, jboolean transposeSource, jint destAddress, jint destStride, jboolean transposeDest ) { static float * temp_matrix = 0; static int temp_matrix_size = 0; if (transposeSource == transposeDest) { transposeSource = JNI_FALSE; transposeDest = JNI_FALSE; } // We are under the assumption that sourceWidth == sourceHeight and the matrix // defined within is invertable MatrixSrc source (sourceAddress, sourceStride, sourceWidth, sourceHeight, numElements, transposeSource); MatrixDst dest (destAddress, destStride, source.width, source.height, source.elements, transposeDest); dest.configureBuffer(source); float * srcMatrix, * destMatrix; int temp_side = source.width-1; if (temp_matrix_size < temp_side) { if (temp_matrix) delete[] temp_matrix; temp_matrix = new float[temp_side * temp_side]; temp_matrix_size = temp_side; } for (int i = 0; i < source.elements; i++) { srcMatrix = source.nextMatrix(); destMatrix = dest .nextMatrix(); // calculate the determinant float det = determinant(srcMatrix, source.width); #ifdef _DEBUG printf("Matrix Determinant: %f\n", det); printf("Matrix Determinant - 1 = %f\n", det -1); #endif float sign; for (int col = 0; col < source.width; col++) { /* Maintain sign: + - + - ... - + - + .. + - + - .. - + - + .. : : : : \ */ sign = (col & 1) ? -1.0f : 1.0f; for (int row = 0; row < source.height; row++) { // get the sub matrix subMatrix(srcMatrix, source.width, temp_matrix, col, row); // transpose the result destMatrix[col + row * source.height] = (sign / det) * determinant(temp_matrix, temp_side); // swap signs sign *= -1.0f; } } dest.writeComplete(); } } --- NEW FILE: org_lwjgl_Math_MatrixOpInvert_MatrixOpSafe.cpp --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/common/org_lwjgl_Math_MatrixOpInvert_MatrixOpSafe.cpp /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * $Id: org_lwjgl_Math_MatrixOpInvert_MatrixOpSafe.cpp,v 1.1 2002/11/25 13:18:23 elias_naur Exp $ * * Win32 math library. * * @author cix_foo <ci...@us...> * @version $Revision: 1.1 $ */ #ifdef _WIN32 #include <windows.h> #endif #include "org_lwjgl_Math_MatrixOpInvert_MatrixOpSafe.h" #include "MatrixOpCommon.h" #ifdef _DEBUG #include <stdio.h> #endif /* * Class: org_lwjgl_Math_MatrixOpInvert_MatrixOpSafe * Method: execute * Signature: (IIIIIZIIZ)V */ JNIEXPORT void JNICALL Java_org_lwjgl_Math_00024MatrixOpInvert_00024MatrixOpSafe_execute ( JNIEnv * env, jobject obj, jint sourceAddress, jint sourceStride, jint numElements, jint sourceWidth, jint sourceHeight, jboolean transposeSource, jint destAddress, jint destStride, jboolean transposeDest ) { static float * temp_matrix = 0; static int temp_matrix_size = 0; if (transposeSource == transposeDest) { transposeSource = JNI_FALSE; transposeDest = JNI_FALSE; } // We are under the assumption that sourceWidth == sourceHeight and the matrix // defined within is invertable MatrixSrc source (sourceAddress, sourceStride, sourceWidth, sourceHeight, numElements, transposeSource); MatrixDst dest (destAddress, destStride, source.width, source.height, source.elements, transposeDest); float * srcMatrix, * destMatrix; int temp_side = source.width-1; if (temp_matrix_size < temp_side) { if (temp_matrix) delete[] temp_matrix; temp_matrix = new float[temp_side * temp_side]; temp_matrix_size = temp_side; } for (int i = 0; i < source.elements; i++) { srcMatrix = source.nextMatrix(); destMatrix = dest.nextMatrix(); // calculate the determinant float det = determinant(srcMatrix, source.width); #ifdef _DEBUG printf("Matrix Determinant: %f\n", det); printf("Matrix Determinant - 1: %f\n", det-1); #endif float sign; for (int col = 0; col < source.width; col++) { /* Maintain sign: + - + - ... - + - + .. + - + - .. - + - + .. : : : : \ */ sign = (col & 1) ? -1.0f : 1.0f; for (int row = 0; row < source.height; row++) { // get the sub matrix subMatrix(srcMatrix, source.width, temp_matrix, col, row); // transpose the result destMatrix[col + row * source.height] = (sign / det) * determinant(temp_matrix, temp_side); // swap signs sign *= -1.0f; } } dest.writeComplete(); } } --- NEW FILE: org_lwjgl_Math_MatrixOpMultiply_MatrixOpDirect.cpp --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/common/org_lwjgl_Math_MatrixOpMultiply_MatrixOpDirect.cpp /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * $Id: org_lwjgl_Math_MatrixOpMultiply_MatrixOpDirect.cpp,v 1.1 2002/11/25 13:18:23 elias_naur Exp $ * * math library. * * @author cix_foo <ci...@us...> * @version $Revision: 1.1 $ */ #ifdef _WIN32 #include <windows.h> #endif #include "org_lwjgl_Math_MatrixOpMultiply_MatrixOpDirect.h" #include "MatrixOpCommon.h" #include <cstring> /* * Class: org_lwjgl_Math_MatrixOpMultiply_MatrixOpDirect * Method: execute * Signature: (IIIIIZIIIIIZIIZ)V */ JNIEXPORT void JNICALL Java_org_lwjgl_Math_00024MatrixOpMultiply_00024MatrixOpDirect_execute ( JNIEnv * env, jobject obj, jint leftSourceAddress, jint leftSourceStride, jint leftElements, jint leftSourceWidth, jint leftSourceHeight, jboolean transposeLeftSource, jint rightSourceAddress, jint rightSourceStride, jint rightElements, jint rightSourceWidth, jint rightSourceHeight, jboolean transposeRightSource, jint destAddress, jint destStride, jboolean transposeDest ) { if (transposeLeftSource && transposeRightSource) { transposeLeftSource = false; transposeRightSource = false; transposeDest = !transposeDest; } MatrixSrc left (leftSourceAddress, leftSourceStride, leftSourceWidth, leftSourceHeight, leftElements, transposeLeftSource); MatrixSrc right (rightSourceAddress, leftSourceStride, rightSourceWidth, rightSourceHeight, rightElements, transposeRightSource); MatrixDst dest (destAddress, destStride, right.width, left.height, left.elements * right.elements, transposeDest); dest.configureBuffer(left, right); float * leftMatrix, * rightMatrix, * destMatrix; // check out discussions envolving ordering left.rewind(); for (int i = 0; i < left.elements; i++) { leftMatrix = left.nextMatrix(); right.rewind(); for (int j = 0; j < right.elements; j++) { rightMatrix = right.nextMatrix(); destMatrix = dest.nextMatrix(); // zero the elements of the destination matrix for (int d = 0; d < dest.width * dest.height; d++) destMatrix[d] = 0; // loop through each column of the right matrix int rightCell = 0; for (int rightCol = 0; rightCol < right.width; rightCol++) { // [RxC] * [RxC] // dest has same height as left // dest has same width as right int leftCell = 0; for (int leftCol = 0; leftCol < left.width; leftCol++) { for (int leftRow = 0; leftRow < left.height; leftRow++) { destMatrix[leftRow] += rightMatrix[rightCell] * leftMatrix[leftCell++]; } rightCell ++ ; } //rightMatrix = &rightMatrix[right.height]; destMatrix = &destMatrix[dest.height]; } dest.writeComplete(); } } } --- NEW FILE: org_lwjgl_Math_MatrixOpMultiply_MatrixOpSafe.cpp --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/common/org_lwjgl_Math_MatrixOpMultiply_MatrixOpSafe.cpp /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * $Id: org_lwjgl_Math_MatrixOpMultiply_MatrixOpSafe.cpp,v 1.1 2002/11/25 13:18:23 elias_naur Exp $ * * Win32 math library. * * @author cix_foo <ci...@us...> * @version $Revision: 1.1 $ */ #ifdef _WIN32 #include <windows.h> #endif #include "org_lwjgl_Math_MatrixOpMultiply_MatrixOpSafe.h" #include "MatrixOpCommon.h" #include <cstring> /* * Class: org_lwjgl_Math_MatrixOpMultiply_MatrixOpSafe * Method: execute * Signature: (IIIIIZIIIIIZIIZ)V */ JNIEXPORT void JNICALL Java_org_lwjgl_Math_00024MatrixOpMultiply_00024MatrixOpSafe_execute ( JNIEnv * env, jobject obj, jint leftSourceAddress, jint leftSourceStride, jint leftElements, jint leftSourceWidth, jint leftSourceHeight, jboolean transposeLeftSource, jint rightSourceAddress, jint rightSourceStride, jint rightElements, jint rightSourceWidth, jint rightSourceHeight, jboolean transposeRightSource, jint destAddress, jint destStride, jboolean transposeDest ) { if (transposeLeftSource && transposeRightSource) { transposeLeftSource = false; transposeRightSource = false; transposeDest = !transposeDest; } MatrixSrc left (leftSourceAddress, leftSourceStride, leftSourceWidth, leftSourceHeight, leftElements, transposeLeftSource); MatrixSrc right (rightSourceAddress, leftSourceStride, rightSourceWidth, rightSourceHeight, rightElements, transposeRightSource); MatrixDst dest (destAddress, destStride, right.width, left.height, left.elements * right.elements, transposeDest); float * leftMatrix, * rightMatrix, * destMatrix; // check out discussions envolving ordering left.rewind(); for (int i = 0; i < left.elements; i++) { leftMatrix = left.nextMatrix(); right.rewind(); for (int j = 0; j < right.elements; j++) { rightMatrix = right.nextMatrix(); destMatrix = dest.nextMatrix(); // zero the elements of the destination matrix for (int d = 0; d < dest.width * dest.height; d++) destMatrix[d] = 0; // loop through each column of the right matrix int rightCell = 0; for (int rightCol = 0; rightCol < right.width; rightCol++) { // [RxC] * [RxC] // dest has same height as left // dest has same width as right int leftCell = 0; for (int leftCol = 0; leftCol < left.width; leftCol++) { for (int leftRow = 0; leftRow < left.height; leftRow++) { destMatrix[leftRow] += rightMatrix[rightCell] * leftMatrix[leftCell++]; } rightCell ++ ; } //rightMatrix = &rightMatrix[right.height]; destMatrix = &destMatrix[dest.height]; } dest.writeComplete(); } } } --- NEW FILE: org_lwjgl_Math_MatrixOpNegate_MatrixOpDirect.cpp --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/common/org_lwjgl_Math_MatrixOpNegate_MatrixOpDirect.cpp /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * $Id: org_lwjgl_Math_MatrixOpNegate_MatrixOpDirect.cpp,v 1.1 2002/11/25 13:18:23 elias_naur Exp $ * * math library. * * @author cix_foo <ci...@us...> * @version $Revision: 1.1 $ */ #ifdef _WIN32 #include <windows.h> #endif #include "org_lwjgl_Math_MatrixOpNegate_MatrixOpDirect.h" #include "MatrixOpCommon.h" /* * Class: org_lwjgl_Math_MatrixOpNegate_MatrixOpDirect * Method: execute * Signature: (IIIIIZIIZ)V */ JNIEXPORT void JNICALL Java_org_lwjgl_Math_00024MatrixOpNegate_00024MatrixOpDirect_execute ( JNIEnv * env, jobject obj, jint sourceAddress, jint sourceStride, jint numElements, jint sourceWidth, jint sourceHeight, jboolean transposeSource, jint destAddress, jint destStride, jboolean transposeDest ) { MatrixSrc source (sourceAddress, sourceStride, sourceWidth, sourceHeight, numElements, transposeSource); MatrixDst dest (destAddress, destStride, source.width, source.height, numElements, transposeDest); dest.configureBuffer(source); int * srcMatrix, * destMatrix; for (int i = 0; i < source.elements; i++) { srcMatrix = (int *) source.nextMatrix(); destMatrix = (int *) dest.nextMatrix(); // we can cheat and use the less expensive xor // to switch the sign bit of the float // single precision format 1 - sign 8 - exponent (excess 127) 23 - mantisa int j = source.width*source.height; while (j--) destMatrix[j] = srcMatrix[j] ^ 0x80000000; dest.writeComplete(); } } --- NEW FILE: org_lwjgl_Math_MatrixOpNegate_MatrixOpSafe.cpp --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/common/org_lwjgl_Math_MatrixOpNegate_MatrixOpSafe.cpp /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * $Id: org_lwjgl_Math_MatrixOpNegate_MatrixOpSafe.cpp,v 1.1 2002/11/25 13:18:23 elias_naur Exp $ * * math library. * * @author cix_foo <ci...@us...> * @version $Revision: 1.1 $ */ #ifdef _WIN32 #include <windows.h> #endif #include "org_lwjgl_Math_MatrixOpNegate_MatrixOpSafe.h" #include "MatrixOpCommon.h" /* * Class: org_lwjgl_Math_MatrixOpNegate_MatrixOpSafe * Method: execute * Signature: (IIIIIZIIZ)V */ JNIEXPORT void JNICALL Java_org_lwjgl_Math_00024MatrixOpNegate_00024MatrixOpSafe_execute ( JNIEnv * env, jobject obj, jint sourceAddress, jint sourceStride, jint numElements, jint sourceWidth, jint sourceHeight, jboolean transposeSource, jint destAddress, jint destStride, jboolean transposeDest ) { MatrixSrc source (sourceAddress, sourceStride, sourceWidth, sourceHeight, numElements, transposeSource); MatrixDst dest (destAddress, destStride, source.width, source.height, numElements, transposeDest); int * srcMatrix, * destMatrix; for (int i = 0; i < source.elements; i++) { srcMatrix = (int *) source.nextMatrix(); destMatrix = (int *) dest.nextMatrix(); // we can cheat and use the less expensive xor // to switch the sign bit of the float // single precision format 1 - sign 8 - exponent (excess 127) 23 - mantisa int j = source.width*source.height; while (j--) destMatrix[j] = srcMatrix[j] ^ 0x80000000; dest.writeComplete(); } } --- NEW FILE: org_lwjgl_Math_MatrixOpNormalise_MatrixOpDirect.cpp --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/common/org_lwjgl_Math_MatrixOpNormalise_MatrixOpDirect.cpp /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * *... [truncated message content] |
Update of /cvsroot/java-game-lib/LWJGL/src/native/linux In directory sc8-pr-cvs1:/tmp/cvs-serv9414/linux Modified Files: Makefile Removed Files: MatrixOpCommon.cpp MatrixOpCommon.h org_lwjgl_Math.cpp org_lwjgl_Math_MatrixOpAdd_MatrixOpDirect.cpp org_lwjgl_Math_MatrixOpAdd_MatrixOpSafe.cpp org_lwjgl_Math_MatrixOpCopy_MatrixOpDirect.cpp org_lwjgl_Math_MatrixOpCopy_MatrixOpSafe.cpp org_lwjgl_Math_MatrixOpInvert_MatrixOpDirect.cpp org_lwjgl_Math_MatrixOpInvert_MatrixOpSafe.cpp org_lwjgl_Math_MatrixOpMultiply_MatrixOpDirect.cpp org_lwjgl_Math_MatrixOpMultiply_MatrixOpSafe.cpp org_lwjgl_Math_MatrixOpNegate_MatrixOpDirect.cpp org_lwjgl_Math_MatrixOpNegate_MatrixOpSafe.cpp org_lwjgl_Math_MatrixOpNormalise_MatrixOpDirect.cpp org_lwjgl_Math_MatrixOpNormalise_MatrixOpSafe.cpp org_lwjgl_Math_MatrixOpSubtract_MatrixOpDirect.cpp org_lwjgl_Math_MatrixOpSubtract_MatrixOpSafe.cpp Log Message: Moved Math functions to common Index: Makefile CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/linux/Makefile =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/native/linux/Makefile,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- Makefile 22 Nov 2002 09:40:18 -0000 1.11 +++ Makefile 25 Nov 2002 13:18:24 -0000 1.12 @@ -43,8 +43,8 @@ G++ = g++ LINK = g++ JAVAHOME=/usr/java/j2sdk1.4.1_01 -LIBCSRC=../common/extgl.c -LIBCPPSRC=$(shell find . -name \*.cpp -print|grep -v CVS) +LIBCSRC=$(shell find ../common -name \*.c -print|grep -v CVS) +LIBCPPSRC=$(shell find . -name \*.cpp -print|grep -v CVS) $(shell find ../common -name \*.cpp -print|grep -v CVS) LIBCPPOBJS=$(LIBCPPSRC:.cpp=.o) LIBCOBJS=$(LIBCSRC:.c=.o) LIBOBJS=$(LIBCOBJS) $(LIBCPPOBJS) @@ -76,5 +76,5 @@ $(LINK) -o $@ $< -L/usr/X11R6/lib -lX11 -lXext -lXxf86vm -lGL -lGLU .PHONY clean: - rm -rf *.o *.so - rm -rf `find ../../ -name \*.class -print` + rm -rf *.so + rm -rf $(LIBOBJS) --- MatrixOpCommon.cpp DELETED --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/linux/MatrixOpCommon.cpp --- MatrixOpCommon.h DELETED --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/linux/MatrixOpCommon.h --- org_lwjgl_Math.cpp DELETED --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/linux/org_lwjgl_Math.cpp --- org_lwjgl_Math_MatrixOpAdd_MatrixOpDirect.cpp DELETED --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/linux/org_lwjgl_Math_MatrixOpAdd_MatrixOpDirect.cpp --- org_lwjgl_Math_MatrixOpAdd_MatrixOpSafe.cpp DELETED --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/linux/org_lwjgl_Math_MatrixOpAdd_MatrixOpSafe.cpp --- org_lwjgl_Math_MatrixOpCopy_MatrixOpDirect.cpp DELETED --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/linux/org_lwjgl_Math_MatrixOpCopy_MatrixOpDirect.cpp --- org_lwjgl_Math_MatrixOpCopy_MatrixOpSafe.cpp DELETED --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/linux/org_lwjgl_Math_MatrixOpCopy_MatrixOpSafe.cpp --- org_lwjgl_Math_MatrixOpInvert_MatrixOpDirect.cpp DELETED --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/linux/org_lwjgl_Math_MatrixOpInvert_MatrixOpDirect.cpp --- org_lwjgl_Math_MatrixOpInvert_MatrixOpSafe.cpp DELETED --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/linux/org_lwjgl_Math_MatrixOpInvert_MatrixOpSafe.cpp --- org_lwjgl_Math_MatrixOpMultiply_MatrixOpDirect.cpp DELETED --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/linux/org_lwjgl_Math_MatrixOpMultiply_MatrixOpDirect.cpp --- org_lwjgl_Math_MatrixOpMultiply_MatrixOpSafe.cpp DELETED --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/linux/org_lwjgl_Math_MatrixOpMultiply_MatrixOpSafe.cpp --- org_lwjgl_Math_MatrixOpNegate_MatrixOpDirect.cpp DELETED --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/linux/org_lwjgl_Math_MatrixOpNegate_MatrixOpDirect.cpp --- org_lwjgl_Math_MatrixOpNegate_MatrixOpSafe.cpp DELETED --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/linux/org_lwjgl_Math_MatrixOpNegate_MatrixOpSafe.cpp --- org_lwjgl_Math_MatrixOpNormalise_MatrixOpDirect.cpp DELETED --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/linux/org_lwjgl_Math_MatrixOpNormalise_MatrixOpDirect.cpp --- org_lwjgl_Math_MatrixOpNormalise_MatrixOpSafe.cpp DELETED --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/linux/org_lwjgl_Math_MatrixOpNormalise_MatrixOpSafe.cpp --- org_lwjgl_Math_MatrixOpSubtract_MatrixOpDirect.cpp DELETED --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/linux/org_lwjgl_Math_MatrixOpSubtract_MatrixOpDirect.cpp --- org_lwjgl_Math_MatrixOpSubtract_MatrixOpSafe.cpp DELETED --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/linux/org_lwjgl_Math_MatrixOpSubtract_MatrixOpSafe.cpp |
From: Luke H. <lh...@us...> - 2002-11-25 06:55:31
|
Update of /cvsroot/java-game-lib/LWJGL In directory sc8-pr-cvs1:/tmp/cvs-serv20474 Modified Files: .cvsignore Log Message: put my cvsignore changes here =) Index: .cvsignore CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/.cvsignore =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/.cvsignore,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- .cvsignore 24 Aug 2002 21:19:06 -0000 1.1 +++ .cvsignore 25 Nov 2002 06:55:28 -0000 1.2 @@ -1 +1 @@ -.classpath +.classpath *.class *.class~ *.java~ .nbattrs \ No newline at end of file |
From: Luke H. <lh...@us...> - 2002-11-25 06:53:15
|
Update of /cvsroot/java-game-lib/LWJGL/examples/nehe/lesson17/data In directory sc8-pr-cvs1:/tmp/cvs-serv18314/lesson17/data Added Files: bumps.png font.png Log Message: up we go =) --- NEW FILE: bumps.png --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/examples/nehe/lesson17/data/bumps.png PNG ¡`Ðò-¦oö5L × Ìv.wö5A8ù=IÁþø?æ øVxb˹<ªgýÀ=-ÐYÅO.j&µ.@) è©HÝqJã-ҽѡ¬]|Vʪ×(ýàV"¡ýbºi Ô8Íd "T| %³1Ï%¿ßJä%JyæÒ¡Ë0hR¾¤òa)PGD)þÝÀmߢÀJäÜÒ À±C:£&?sD*î×amêÎ *Y GX¬ñ@¶ÇUZ¢W ßUØ`ØWî78«Õ"éÝx¼hâý˯ÂJ:òº¨¨ãÁ1uN{+ ×9Ñb¡uV¾¹¿:§ïLÿPX.; Ã@?ÒD¡ÑªVH¬øÿ%ÄS DÕ¤}¥qüÈéÎ+_Û:÷x4·ÂPú Ñ\BôÚX§pÉ-½ÇáFÚtÉ=m9sÂx¨+» þ¹PmÀtP¶ïÛ?+ÿjoOïT<Õ9êN²¶ëºHéÖü°'Üï¼O'-eÐâ,£B5S·7Íñ~v=¯Òªw#ïJôÁÒÑðoô Ká¬B-¡{`qZmÕ¢Öëã¡@±rËùuÄ ¢2£L _`f=Ä ãíåÕ!ø¾ß©R°ÜbÞhBiqNÎXQFTä Ý»Z SòÆç0|C¾Æôª¢Ï ÿà°Lvb jwOfA ¸pÊ!ñÿÿÁ C iø¡¸ ¨Å@ Ë`'¢}ÓvÚJ¢De¡b0®Üø~½&$Ä "i§ïyMúïÞ{ôñMá®ý ~`èMFà=»RÙº/¥ÆÁêOÁÀµò©±ÝÃØtgn;7*Ô ¥YÁªv¨íKJò}pwÁbGLÕû"¬ aåÆ&¥oÁ±i ÛADikųº¿8ªö1a«V(¥Öÿ¶X2mðl[ÛR³}f'ܽÚ*Zu´lã±& #³ªr¼6 ª¢ðwÌÖÍǤ㲠ÓÜùgGOÌ'õCek,¹w ! Ey&x'ä¢À0 £kbY2õúí7PèÉúvÜâáú¾qp=/Â^äbN?ÀþÿzKd-æL>ºÃáÂ7aê½äíÕ»×Á¥Â °nL×4ú&0\]÷z[ 3yiÂȹZ ¦õµú¡nù¶àÒÑØ¾þY|ÆiT6 #ê¨V)wA®üKM\úÀÃÛ¹ëÚ¤ò±TO$å,:;rö*Q &'ËØ¿èôÞýJt.éC$±÷Òµc %uá tv$`9íJµdó^$·yñåÍ0VýjüY^ET¸{ÜdèáHðI¡þ¬Ç ¢[qõÄÖ¢êhICkóç E;Psí>JÝIbDù±q7«¡{úÿK©c`(BìÙ(û\=[2gâaÄ`ïÛßU]¶öªaÃJoç®<ê¢è¡Jd3 ½N1°"ºèù¥0Ú{à7&Y#(Ù²ZBËÓ&ç¯ùÔÁké§8jD9Å(Q'Üý¸!ô,QWT¦óu'±ÖíPI@'!ÄJ°jx)Ø{É' fÎ"!þ @q¹ë4QÔ^?6 Ñ QÐðü+@ F ´!²~ÌxlÖ%Ëwæ{Õ4Z6-ijߦr@Ø`ß¡°Í¸MøÊhGhBÜFZaÞãu!¥Cþ`¿ôøÕað]È áH¥3Ëý^÷²fÁµ Ú¨ä[H\)¹.þ#d×;ZðE|0PÎ¥ñ»ì¦2ßu§êKe?)}I;$à¼8+ý×}\½Á·ÜÚ Âáj~4ÒÕó«ªY$ZÛñ0sÏ.µR)@ù a`hÉxç÷³È3ÓUõró¶èë{S9UiÞlKâRÖFæ£Á¯ÏA°J2<DÓäçÏq«²+BëH@¡±iÞ&Æþ @q¹ì$Q´ªú1/Ð'c\ÈFâÿï\ø(QJÄ%ÃÌô«,?¡««î=GM!Û*GÒ¥@+($m¯k¶^;2¦RºAå3ÝÏ:· »NR/ZTe3Ù6Æ\ãYñO¾ÑÆPKD=Ý RqÑ*³#-#þìÀ|#b³ç7ÇÂØ½|»$#º| zR}¿bkªO46È·§µwÍ]ã÷2wÉLPÚì(N.Rß®»®)@ÆÜ:/`tTÎv!W(ÜQ:oB2ùÒ·R{FɧÂ1KI$ø«ÌV@Ñ[×ÿ0/}|G,v^_tÝ0ùIùÅ·|üª"y;$¦syô©E,Q@E4Tk¨ÅÉþ ÀÙô$a¸Ón»Å5M Gï^ÿ<s1ñ#(Aýh;ã»þ&íL;ïó4C¹ñÎjEÈý×ÍÍ<ñådÜ[\ÙÎ- «ÉFG5¡ö&{ððÀwºû-GÀ¯úè³Ì< ¶g5§^n}ìd Ѭ<Aú'æü éz?UÞÕw$3+KÂ[H<íĻ礣|]}y~â(é\S :[ö^^ç¦ÃHJgÓ4sÞ÷|5_ý}ÔÍ ëePXK!qj×;»5ÝçXî7y#ZÌS©{6É/'³ä³ÜÑ¥DÌM"\Kszøý®à2t!7ÔºQ gÉk.ÿsii ¢ðÍkfl,BAÁ ]þÿÿª¸j±¶´Ò©bg¦Íäq¯gö!nÎÉ÷Å\Ý*Jø ÷÷wó}ýÑc°©Ñ`gÁÝ(s ¶ºº`ºRsì¼_ö@1Q¦Éé¤Àüd]mǵÐÝß)wZ7ÊìYÕ1ïÞêÞbZJ5hù}6ý³GÍ7¾åJþTþì-ìwø´ÅÖ±¦Ð¥ âÆQ9 §Â²$¬¼\«ÑèõÒÜVã6¤CûDùHéG f£ /UQ°A½vPÒ^!.é ±¡3°Ø.uç"ðgÄ´ß¿I«ºë|ÞpÕrÏ ÝXi+ ÜYФiÉá _G稫¿-d6^'>wÚ¤Ù£ßÅV¤ ÊHASÌrw=ðÝÖ´Aá EPQAªRG!ÚÑ£úC½êAð&¢T¤bZI²Ù8ýÃÌ»ó<;`á*¦×LÛDõÃNeYö®4¤l£BF´Á®T¹8Îuy?½%Z¥t.çAS=¹Òæ6%u¿B°*&½ú®Ê>'ÎÛÒuºé<V^ÆÈࣧ?ª r,b¦|(² W~¸oE$]ÂÛO¬û¨P#¨íù¢Ox1ø±¾) [Ah|@aøÓZÎôº?§üdaY[oçnJæÅ©í)¾@cjÑÅÇ!½Løåk.:D3 .ºñ \¹õmõĵ¸´bm j¶¡i.ç6N``63ßó=q{íÌÄ»1²7fMõ+ä¸Üµû £Diʱ»>~Ù¼-Û¿çTØ1çî<O[»fY&V^zO4 ØkLWÚÈ Î5ãdN¢®¨aàû1eòÈhËjÎq`Jdøâ÷¯(O&ýòue!ä ´¼t0S-²£æ>~ìë»Ñè¾?~þÚÝÜN¾_¦OÛæþq8ÎîªÓY^Ãn;«| _GÇ/PSÔ\ÇAð]p¼Y3i]l±3ík!M¿Ht3¬ÀÏi+UY64Vü¦}9 bþVA£Gø ,O%öï·'\ö£+; PsPûòô¾F4ÌéÑ¿Ùdà_9þÊS®¿+~Õ~¦h+ò'\î1¡ÑïÆõ~Ãw]x[}¹Ü6õ§óÒ×¢Þª¶¢sõÂ4òè|-Τ2¾IÂØlSÍj%ÓòT<Yê9;ÅÔ°´üló§óE;Wú©í¹îìÕÙÅÉ ÷/ëÇÕGd*;°¢:äMD §9ÈJ>ÂÛ³m&#wоÐ04µËcã»wí¿ ¤ñ$Á6mÉ+®¿@³Ú«½ç®Ôê®b³Fm@üÙ¶agoë hÕ7eOçpÛ§pÅ;yAòà-¸!ÜôⲬJòc¦Îg!¼1Ñ-©J0&Ry%:»æ®£^Ez_Us °+Àx2_¿ÖpSdUîÅ Pºnªw°2ï2;ìnhKs+Ùµbr<}L³³`Ð>©~[ú"ã|QBÍ©©ÁéP]Qjý«&¹QbEÖÕ^8·Jn¿H ÷ëVÊåtºÕúÉÀ©lKJ¹F´ÇHO Ñn5¤îÎyÅÈ:V; rÙ¼ËóMºÏË82a zÄ¡-m)TH¨-,ذG¯ñHE ^m¡¤/ª´ÏØÜ°÷Æ9sÏHO¼t*ײ®Ç* ßv¦ABÄMX¹Ö/`L|ßÕãÂ0$(Ã80ÓrÛë)OÐäôþ¯§Ù@â$Ë!OÃRÓɧè«z)¦+=IÄørYÂàdîmqgO³áÍÁLÙÝ¢Û/Z7Á7 J,ËÀå½ã».c,;ߪÔ@) @§Z¿b8(c 5úò+¥§âúX¤áÛ/x4¥pÕ^óyÛ{fÉácï;×-´Ð¶yÅÚK]ígýb¬yç» é?Âq½2/ѳjáöLýÀÿ(IÏľ|]P[e¦É#sÚ87´gOç#¦áÝN}$Âö_gqµ¹+²g«^ú3sà å2ϸw¨¤y môß)(ÌÑuìJ Æî ½z.7³H²E¦V>ÓÞ°ÃqL:NN¤ik¼ëog+ø*զͥ»D9¶Ùb 8 X2:nâmCâ!Fz¥j;wøhá¡ãNý¾0xm±oÍÍìpØRËï§mÊ¢aWíÞ 3L|ö&ÜÆ¤yCsøÖ N¨r¥Qü*&ºIuÍe½øÿ_"¥ÖȮ구^<[¸Î¼ÝéP.¿jÎ1w,®¸EI0ݲ4J¨CÂJ¦¬úv § 5vj*-1Ñ&ÕVÄ\%Prµnô9E?bHÈ Õ¯ Ô-<£«0¨ã¸ã ¸&Æãvõßd¡ÇGÀ¯*SS° Ovï xuFÖjh8]fKt§r AiØ.yJ|¾ä"B°Q-¬Ý J=â7P|¡ º ØKNS%;Þ $6®Lª¢´oÍgW ½ÍåÈÅÇs>?'ÉÔ_t`|¬lÁ"!è; \sôdÁÃxOø wcIñ¤é\ã/(ì'I ë9k¢òÉ¡ë7'ÿphv; AíþÖ¨(o1&&ÆÄKÞÜÐ5D´£T*mwgwf]|¹ûfÎù2â8hOÞES²Z¦õ®¬V !AWl@KËØ±`+*T*hÔª¢mÚd2ã1WÛã÷lëáèT)]q$¨%CU>ð{maYz]X+ï åÌ^ û »YræìØ ÿzÚ#}VH$n]ÏHÎÅLaïhS0C¡-È[`ró ÂÒ»}©zFgÍ]zSÈxA8Y×ajRY÷©;ÿ]óÌCþs§D'iMkÚ` q Bµ*ê&ܹ¡°Ì?îÕÀ½¯©;µÉA'è."ÙF?onS¼ÓEµ Pûòå @Ýø×-¨ÙÊo¬{aî1ùp-ê«vq^r6ìÕ¹·Ç½·Ùüé7¤hdÛ_¡J=$=è^ªâÄJ°±Ó ·ôynÍÑfåcýqÝ.9L¨4º§4×Àñ :D1 ê,£¨+ÃJV³5ÙCøIÜE¤(|Zpëâ¼:}Ùw[¦6ÑÔ*XüÍÀæ»ÏTðÞq9¨gãÇñìÒ 0Gyòþô%¨&¤)³0æ4ÍÍ]¤õEÆ5ñ&*¸0(¥,[çZ9î¢ÙQ:úãFÒ=BnæxadEþ²Ýxµ/Ïl¨þ\=6¦¬¶¬ê}û6&Ò/âoJu¯tLÿ @¡Ùó$ax¿nIRIg£$ÊÄÊÞ?Á¶¶@càBãDð±7;³ël»Õf2yß÷- ®pR½M»4ºòLR¿Zo*¡R]m§ |ÄVíü1]¨{IÛ,î k¬t,EøN'í©«Òïtl(MøéhC #³®¸x¡ðT÷¾#Ó£¨8ajÝáÂ2aE®9Grì@2[³´a×â&èQngñ$^xýCÎs¦n½äEh¢½-J 0¬|Èø¯Å æ`´#øä íVÒ·9¶ë'Q¦ßëJdÌs˲v ôó.ð²?OÆ^ÒÃ_n~À`¢ÓÜìòUrDNwø¶ûBã¢,® µÂ"À8ªÝWå.è±_Ùâqo#Hã´ ò¯¬ý¦ ÚµßÉiÃ0L¾àúdèÃ6å7HG[zçjÿkrs[=¤4³xävàßÇÂ× ¸ºÄz¶rÓùÝ å<#ÃÛ¾öåÂJÒ0Ï^gÓ·Ù¤jµwæ}ÿ Ðì~¡(~ÛÛvmM3 Ñ1~ýÿ/j|0Ѩ * ²~x÷ܶ9÷ôüÒ«7D*[Ã09Î]ÒÒw9Ý â .ªµuMÛf?f| ä®cÎö@ÄS`Mf¨oÁvPHÊ¿ aºÇ²äbéä|å)¹MÚjÖô!ÉèLÚgÐ} 6$_S©Ùß/#¿]Ë}ÅF0FNOðéI+>¬«æÑÆóNölñ»®N·t_꺾"m"´+¼¤ñ"лö~ÁÈãóÕÃ$GñÓjCg»D<ó¤f<á!¶H"|«WÖ½ö£©rôI¤sLn¢¨,ÜVÓ,íY/~_ڻʼæÝ¸oZòÛõ±ÒMP$CëÍ¿ DÀu¨zBq&xÎh Õf¶Kû2è¢R_-/o`ÚEöiIo;¶QSMI¡g@7É¿Ëeß+ÓÏ~E\©ÀÀ#/é¯Böºµ~j?? -beÃEefѧ¥#C¦)¨©|²_zG4UÅ õWÉo©ò "=5 ùô2h $Z=26îX^ºLÖcúlÝâ)*ïv~D;bËiƨÚÄVMÐ¥(h3s §§ò÷âTg*+[½ÔgwkÌÛÊ«06ÂR#o£ArÓÏÒÅùÏ]ÿ/c=ï½ë´bÀNþ Ør(:vl'qZ¤fD¥+ÛSp$NÀ ²`´J¦©í±Íø¶dkþÆ3~xrÙê×Ï=h§Á½¹ðK9ÑרôáxKéMíÍßúáqT[ºRð¹|GîQV;{ S:¸:g6KÒµmÿPh-- Ä@xÝ$-¸»õÁ¢à/èüÛ¢WÑ£'±Øµh[ê>²'÷dä{0_.dTTö,®ä¢à»ÚVßU6;îcn7*g"!´µv!^ÜE&¥VB( ã©ÐöÚê·HÒÊCGJÌÁ ¬3ïÀºïgµ/ú8÷GAvâqÆýǶu?÷¾RÍóö[Ôº0óOÚÁXÑÏìGÛ=ííýQó·ZÉâøÜúòET5C 4Íû_ÅSV¤°2û¸NÑàEy¿â¢ü°%e´Zê¦91ªTa¼Õôúc*"¤ãd¸èbæÐP;1ÞÖÉ3ß"u SMYÖVé]ºh<1ú@q àCWþ@±Ùì4ÃpÜNRº® ´/Ð.páÈ$ÞWã@áÑ}°1µË¶©Ã¿/ÇlÿþIlV> ÏB}Lt&nªû=§b®z½xisçúYéãvâ'87¥±EX8x+£rrñß¾\{?sh-kîk~u¿Iãϲ°d¥`y¤ÚèHJúJøé·ÚC`k5&7já²ÎòP´·¸z*aëév¿¬ô`v4N°¢õM¥xän¾º<9º>>f?_Àö.8ÄH=ëøKéD¹¨½+>&oY]-LôP7ÚÉ@TJýýÙIBÉPÑyûaÚP4°ûr©»CR#ÍèÈ;`'w,βiñÚ)v:±id SHé$ZùS×Û¨ø8 N#ÇGS,20Òò¨Nu¯ô¿ þ AóJlçâë{dÊݹ+ÜiÚNFdmß>"=ÚXÞ(¬ DßÇ¿|í¬.q\:ÏÔ¥°z$2H J462;®¡|#/-;Kãb¨À$yq{IëlÍLÜæt pAÑÃ*\ÆjÀ*Æ#¤Û1ì~xFèVQÜ*2ý°<¥nÒLZFêßNÿ ÏýMoÒ6Mmk¥]àNp¥n×gA\Ré¦`¡Ø&Éýsî+Ìç|çÞ>Tañ_g/#~ 6Û]cIP U£9º|B~ nÚgCoKÏ>êð7?"¢-i[ÊÈ.U¾t3Çß<3:û¢·X qq)eñÈ븣N;c[¢¬Wl[ZÿÀ±´4Q¸÷ééI02`Æ QbL1^<Áÿ+xó¨àBP,³t÷tÛíNu*^½W| ¯bÏÂl[ÜX6h^T §"k8ÀdÀ¤]Kö©)´¥e¬0´°xnðÖ+i@ñg#gþ¸`ÓRöU~ÖJ#TñùOw¹j7ûLdBzW8U1-DþßRÈ\ro"ëaPU§©÷"_º4Dáeì¡ÌGÝ =TòRÄÁ<¾:æ<R÷×ùKégO1éAÂHfi]s·¡«À§l®|Ü"ìXÜÅWÀS&ÐÐFÒ¡+5¥°ôÍ.+ðà_ î¬ÉWúj¡ZìCuVFÊ߬ßêöµiç°Ué̩ȲàOÆ#ãQ4*ur:Ëñ¡ÜâÍ>Òº %á*%¨À:sOâZB1(×@"ÐÖª|vÅ*ÇeãÁùU"Ñ£ÈEa¯oÂïQç4U¡Lá þ_ :u~Z@/ÅsûYV -2^ËbÅ\Ì~çðAáO ¿¿Ú£cêb÷ï¼F9ÅPáÝ?88 W¯³$q2Ĩ(.(|<y÷èsù Oä["÷Ag Zâbª×ªäPGÿ`½j´[ºîæ}bº¢-Q(°À÷uÚ§:=8Þ¬ò¶ÊÏC¶q27ÇoN'×½¸{ÿýèòW¢Ü É0ÕÍS!bâÙRºniü#WFhÑ{8sHp½- ÿ èñËa\ФhaQ寽ðݮ«ñËÞl?GWºÖæEHEÌl (δ¦[YUsí2ãPÁÑÀBÐS¿;ì\dGdek£ñNr{ß/¿ Ä V ½ßd9;¡ôBDÂÒ kJÔúa4±6èí.# !ÌÚ5+ôÚ¢þ @Áµì4A{ãG&©¶*R¡©ª # $Î|߯ÏÀp 'À%MZ'ñ²þ bÛ¥n¾8¬ªæ6`ÀTÙÏFZmNMOý2¬¥TÚi!8`¾¬ÃÔç:òçè¿©+h]JôRëI¡q¡ú%HØÊV«Z4`ÞâL©?(6·b ·Óv·^hW.ôÂðÊçÖø<Æ ñM:èM~0ÒL»pä°¦JoHaåxÛ!Q[×Içsë(YÞÖÞÑ]'.ªfíbÅõg[¿§ñE§³¯ª1ö 5¡dÝúf·½Â®LâJÚæY_®ÖëÇ¡öðì(ó¥5%Íä¸iI¿[ÁçÎM c4zY³Ù¾\y¶Çp¦sÄE¦#þF(Þ4fùÜWÛþï~x4Ñ#B½¥++À³~ÃE¼ qKB¥8ÜùC| êÄûýVåmç|A\Ôcl=í0út0 8ÖÀÍ ç¯òvj6ÃîÕ")õ1¿Æ]¡Ë<,˼±9O¾¨Ã0zvö½#f\?¤i¤ |ÒÍT%j«æ-ì8l:¥ r°ÜÁÃO[ç±"É´1JìnÄE[Í[«Ä|R$Køi ôU÷=Æü«ÙÂsD;¹Zª5*YòÞB%wg¬¹vÁäéô(Ü;ó !ÞÙ®:O- Ã5²%íÈ8Ú)±ó9ÍñhS*X-fóD±÷z»ÍNPP9<ÁPÂU}zw£ÉJµdýÿæ¶§±ýªóY¢Àö»T4Pqmí:ÆVwÀDZÓR>nêop )§Ýï8Õl¤Ú/ëfI¢ Kjο¥øìqáOÙâJÑÂ6VÎ9H Á>¸LôË|Ó!¸þ@=4 µ d>]0îwî¹í©q°³6¼0sÆ]Åù61fóé§8LiÍ©ë¢Ðúþ àÜya ùYR3}$,¹RËsäÊjMâ(¸a :GiZÁ[ÎÀA¸álPJA¢Q©ª ù9ÉØÃ̼߼ñÌ{æQ©Ë´8µQTsá¢nÑéw½s5!æõÉå;}m¶ýÐü¾äeãü's/öHMDe'ôÕÍ<}#ÛÕýÕôÄÿ5\'_µõWüÊPä;½¸`x0pêlvþ\öèÐkDØs¹p bÈÁ¸;FikmäKY27GìjżEov ù!-öÇÀGE´Pæ6Äõ.ÀÙļ:W¹8Éfäëaü ø©êµg¥ÕíÆ!\ì½X{1#B$&ÛvÔ°ÇÀ¥w¬ _b³íº2p·7¿¥l¨ð(ç+«µ³û/õ8âòÉ'ɾÚî£1F\'Éët4À0±¦W ÷ζv*`¥{"9jQ½w\xzc4$Ñ(L:s" 9;á8ËôÆt@úë4â°wS^½3·'MÃL®"aX=¿ RÝ'zt<zò4y)s³;DróÖÊP`dØÊ±åòx,kCÅ·(+¢ÿPp-+ Qtf2$4AkAApÓnÄ ]øGþþ¸Ò+¡ µ¶iÓÌ#ñÎÌb{÷Þ3tÝEGbz¤tKDÇÌT,¶[Ë8*y>AÝøO¹ã3`6´Úäó8fNÝþ8ËòbUKÌz@6H%WÜ*|Ïj @?ÌÈ|Øu:kºV¯{Wvâ£ïH¾¦Gúô)ãÖÎ4¸*ø¬Þ¨ö&F£ü3[fg´´:¼zÎè²E/ºÎ§¡Z+ujÕäzÉÓwÆÌ7õGåpºWIxÕèMÙ<ÓL!Ke¬ûuaªü§Õó¡^x'Ô[$}ÔxÂxVíî$ÎôL\mbµ[ç+uHòäËG1rÿppv; Ä@îl·,»! câW¾oìcø d×KÌÓÓ£réìç½ ¬B ùWwÓþ@Á®4CQ87IÓvsÎn²!øø¸¾¿Eð>À¦ 6ÙÜÚզɽñæBÂ9çKrn¼FeèY ²`jë}We±èù òQ´g,Mmt²iùÀz#²àËDò75ærRÜÖs ·ãSCzn̸U¥4P@½<j¿®»É'ã'\ú´þ׳$Ç|t«ÕmÿøÔ®Klß0ÝïÌ/~»`bE5KÌWD¿bÒÝOªÀè$Æf6¯Ô@âL´%sLu8GÎÅ÷QBÙyì¥Î´NYáiÛ\¸ºw÷]x p-ýR¥¦ä HlMLBr\¥b©ÖRÖ-úѸ¶§èõ¬a§8â4$%0ÖU9j4:Ö}TBþ@ÁÙ4Q8dÍ®i-*hA/z!øþOá E@´ÕVkí¦¿'&3ç;äd´¨õñÀ8ÝepIbÜe°cúâüãTjPÕwrO\ ÷[9øº×X¶ý{@mMrÍÂrº"õ!T[¢ñzµbi O£¹r¶M³(é¸îÐÊ££ØoÖv|±Þ¼ è¥VRF81Aÿppö8 Ä@öÄ^/Í ( ¡¡ OÁ8' "¤ABH«¬DÿÍnàç÷ÉöSÇÑ6 äp;89ETÔÂXgaó=WÌYyÌ0gÐâl©vr+ã{¿n8eG¸<8\ ré©w2ùÔg®rî Øw£XÎá'Ù·Ä^«Q!¶2º¢´ÔñÝ`ÑÄ7ÎØ×f4æÕ;NæcMkX B9¢KApÚÅí?î2|ðÛ§ZÉkki¼Á9/å Ë|[ TÃ9+Öø'sÆ÷àSA¢ÝE«r þ(43\§1 ¸®ô²a.ò«º4ì·6,íV#ïa¦Áî0¾* 7QFøäXèÆ°"ÚÂØ[7öUAP%=j'ÙL$<³~ÔÒ)ô0Wý«éi¡Nº¬S¡BÀÄ3nøÿ7nHûB@Ƕn0²6vÌó5(±üñe?Ý'VÐu6s{ÕS¥?Èzb½ÿ$z<?»$ZuqN£ú Ô/±=¬:úR:ÉcA¹&ª²L~*î yeÉêûc }]Eàiám!g(ò&~!Öþ«ûþ @mGG¦¹Ýì0©°å¸6õ'àÛ¾f¡ÇhÃo7Dîïå¸KÇÎô °ÃµlkYÐÊ>Ï^^÷¤ã-MË_Sº+EoßæKÔrÌÏT+EhÏØØ(aºU~ðá©(ïóBc× ýe6ªmZVë¢Ý[m#Îß:BØûhL°6©¶u¦RtTr´k°aulåPéÁè¡´êÌñâ;×Ôà>&È2¢®1]nKÿ<=¿ªågJ3¯/+¢±Ð¥®åÜ6lúóÌ.¨V¸\$h´Ï:ë0ýŶÊúã/,îl¤êÓ]#æÌðeá_×5bö°óV7íFõtn*ÞJý4kp@ôÊ´Ý%à~ròh÷nòè£üðÀGV"6æ%×#ánËð4ÔjZð¹EÒ¼¿r¼Ðô/ ÅQ&R*j.ÀѸGà4H( NL<Åc~sÞ¼÷é×ÌûÙLÊ!óZÔK8Ð1v:SÊv<Àt ;¹ªûkÜ;kmV¤¼;üÓ¥aôlõU¶¨H=Ò÷§Ä»5øC¶ÂÄ(ÓCåì{ñáè #ñ¢hH»ÂþêsG"b,hµ(x.Iöú£¯×õÏÁ»ñVÊHLK ë\óµ\ðû,ûoëÜnúÚ¶úÁØÄ&´Qk^+ ¦D8ó6g¹èQ.+UDuX3+ Û%²98e"8cn]è{SSß)סxÔt½ÐÙ{ó.<¡jµ+?WËc K´iøSWþ8«K]¡Ê¬´UJÖþ @Á¹4CQ4·ÉLÒNl¢ÕR}âÿìGø P°E¼R/í4ÍíÄ3?òµ×æ$áRð½7Ï\Ömþ{ß Õë§ ±\øI$jûÖÃ&ù¤CM® ©! ÐþBZZ¡|Å[Wßi¤»A壮þÖFZÊÒª6Umç6HÇPÎ,gb¢k\¯Þ~\ÝOq-ÂÔ ò7S°íK[@V2'2 p PîeÍ®òÝ]u\;ÌR ¤]@¾ÕpÚÁf£»Ô[ç#õiMYÉýãX2³»¹¤.úH4ä¿PiùòÜgG#m¿bÎ~g nÌlí¦AÜÒ~Dj[Ý´5ª9¼þ¹=ïê¨1vSXf.N×7·ÅÃãnß´ÚbtôÅCq\ÅüÜ+ûéÅ´àÿÔ"âU¿,c¨<^®(Y÷AúQ¤sC¼bÊ1±Ðóv,{ÙáÌÚ¼QOÎORBq©lV°FhPén%¥é_ çíigAYh01<ñ |YV®])1Á$(0\fzÖ¿îôv.ß¶§ m¬hã])goù*ºà¶¿)¢E÷">ktAjcÝ£EüÖŸ޳z"qIå{°kr¦D^h¥1ËÞÈ6¢yÑ«\¥f¢%ExÖäÒH°VïøÓHݪgî\)1ò|Nü@ç6ÿñ@ì¤@,ÝExÛ-ç>|$p»Ys.3uqCNúeû;?U[CÃès©ÑV®ºå}~xiÁbjÌi¢eOê]*F}×aå.t?¾Õ*åbKXÐM8ù4}ÿK,ð&×AÞ7íɱIPØÞCR¨-è±GSOþàèjS"hfÒv¿°¸+*ð ÞvOáaQü£¬j·Ð¦ùôÍþM ï½a2)èÀ@üQ¢ äqC¡ult@¹Ä%X{l=ó¥ðÔTÏy©ì#_Nà)5øë=HeÜ ¹nW«m_&ëëÌns¥²PC¢ciÀß$´sÙÓ) ë1e¦Í±qݱÇbe/D9Ë©köYº9ÌZÁâÚz,ïÔ×|©%"áa.ø ø.VwëÆ4xU_ÄÜ,ü0êg½ì%ùÇiødY Ú Æý3C|ÉÓ+KÍÀ@uà8º ºß4-´TrËEl*Að¤ÞýÕj=´¥Z6É~3ù˰yó3»#±jïJ&½_6~¦Ç\SÑÒ=µ ä¿}ÜÒnÆX³ÇDÂȰ!gV³L¸Æµ½'¼ÙI_B|¦ðâkå^<¬Âº²Û52ÀGíf1>{þ娣I2äÖií:ôô³;_Ym;úÂÀuG?ô³[ÅO1D6¶"7jR6?nö àÛ&®"écò³JÌ[ 61¥_òÞ£hîv{¨vË ´?êøõrCsÇô}CÝö^F_Zy"IP¿üù*ÇM¼<Ø¡CX×x1þ@Ñù´4Q|I¶Ùìn[ZTA<Ô´BA<y¼{ò{ñæÉÐCÛC¡ÝÝîæ/0ïÍûMÞ¯dªÓþ¯Ó±o_â®'ªNìBZÁ|dXãjÌÑÐÅE®ÿÚÓÉø¿Qu¶ÖMFåB§KKO*ÌÚgzLjÂã³y-SÎfÄG\tOãöÆ~vaß4,yäqþÚ55IÀt!gnâlé82:aJ¥C(Ëk7ñn¬n°5ð®ö¬Ä}¡kì½ÊòÉM;Ýw«ß:Y~ÿë0âjcÝUÓ½%xs}òÛ¸A õeOå¶å\ä¯åddv÷ùp#ÂÚÖÕÑPX¿QöÌ#ÿ·ò{åÜ4uog¸rÂÃìO¤i>Ïfݱ:d {òßÎßñF'VDÞZ{Ûû²¦+ÕûÑ£õr RÕª=rè¿ôË{æÀUj)b%LâLê|A$/ñ{_¬^#x#òý¡fÌð*haòK,¶ýàbS ËaQR3bVÌ'âÐô0 ðõQ'*L,Ì ÷2þalÿJ?Åm§=£@Ê%GÖ=gPZS3(ˮִ¾XÌ?C×ßËic}Ѻ0¿R,3ɧà7«æCØþÀÐùôaÝÒ!iÓ+ì{×g×{\7ÝS5Öu¸ :òâbPÏ£Éýñ|Dݰ'zÔñ/ºëkÈ¿ Ø ÐÌø5*]ZT[xqǾ Í4£EÉôåRÉÆÀËsOl'`Bùª(o®Âé4ÑÈ|»+2ÁÜ8{ù£s×i¢èÎxv@ ¥èòü7%Ê Àã¡Ý[CYxúóBö¡¬8ÉÜò'æw׫§úoýY3Ãì;!hò/Mg\ËÇ}=)QLÙHÑÈì{ BÈ4sQ@÷éc´K¾esÉòÖâwãâFƾµZQPÈ=Õó7# ]"a5â^ÌÉ1/hJä$DZñ°÷ÿ R3ø"ô&ݨPY«ø|d£¾pmQràyWRöÔÀ`-©ëu¥Â*ÀOðëfJ®îYú²O|!ÞPöq]ÇNXútzCZtMÛlç¥þä¾5Þ:t¥Pn¤Ã±ÉäßnüV Yr¥õ¾Í¿Qíòø(ò®õKÊ-Lvï5ÚÙ¹ò;k¹a>b.¯Ë<bAD8BQ¥ìö|9ÍIÛðÄIª h[ËOEþÀÑÙë4Ãp<_壪ÁÄóò6LH<@UT¸ëqwùvÓ9C;û[¶º;EqË>QèIËhl¾{S¬Ã´¬ «(Ço¯sá S yäg'¢HtÇöq¦d7Àçãt ½û×2Þ¸ôé³Ö×Ü%ɤy²-z:² 9rôq#øZÈ5Ô-?VÐÎá¦mÎ|ý : >²_¤dG {&?÷aWÆ×¥Ï¡°³0oÞW7<ÙÊòÚGmã( M~ÁëÚä #¥ h{F˨n_ìühd'ݶ6ýúäHKVª6ݵ)HÍÒ.z$EÓEté7Ã^Õu WqÒµ78/^J¹<è±.þ èlr(ì±ÒªjB ¨PAÀ 8 0 Aì,áimú]Î!ËNA~Þ)õ/ ¡_íêã¥oc£|ÔZS\¥IdÀgT6W§[rQÃ:«!KLa¤ô©Â¾$H{żC)νX¹þÔ©¥s©Mtgy?$>ÖûæãÝà &ë{ß\;dFbxØIGþ&³eÍÏmØnàÍÓlOSárÝ´#iÒòDÇ[9ÀRt`|¡`wÅO¼IrayuÒ(ylºÆ»¶«bòíX{ÐþwÂ]É@3{g'gǰéi¹îÝpÕsºÖ+ÐWÁ÷äf2ý@ÑÕ´4ÑÝlö#I©VÔRôÐ7þ ñèÔ`õRè¡XlEÚ¤iºÙl6ÎüÞ¼Ù÷ƪªù2¹ÅeÔèW+©¾*úaͲ¦Ì%Ú·á³)@¿iÜ!C7( Å`P×´£dîZö¹ºWõ¨÷¥UfÖô«ðK6Ìõ p@GÉuí½£.NolÒö°U N}Ë&%§EÚ Øùæî Kf4®X?¢Ü{óÀJ=\ج;Íø¶ïý&?%ãðjÓôÅÅå\Q(Þn¬ÇÛñeC¸T\iwÃëß´ÅÿõnQ».º¨Õ J P²»}ds/"mOv©&ÀÈF hïK®*v'-gÆÄÌ °úá¹v5285®béÉ¡ÑFp_â"ÿz AHâ^zªÇ3¤QVΫ³&IèTyÝ ,«n³#ókLã á$*é®M^Ë Ùô Ð(çÓ&ï6& O,=×?j°4ÏÇLT/1ü@ÒÙ4Qxfw»ØÓho,µàÀ÷ÇGðB*Z¤Ò¶It³?Ñlv²gÎ=8°Èq ¸ÉÜuëðÔg¤u?ä N +~p½w{':G°L¨Xô íÂÂð[1ëN(øAËìâ¹¼ÚÔ ¬ÒuåeîÁªÖ_&[rüÿ zK-¬.Th°VNä:BzÇl®¶& ¹Öpædì ûZñ.ú¾«$¦ûèA3id°7)Ùy¦_ÏwíàÔ V+i02ó¼ûrj&ñ;ä|Í@wÆ>ñáÜö¤~ èÚua¨ó¸¯¶T:@A!`få;ÙùØ?Àc¡RÐê67ãìQÇö9Gr|lÛPFnpí8bÂ:À<mÇcà®ÖK]ô#w¥°þRùoÃF ) Õ-r~hÌ%¶ÔîÍzÊNf÷Zf *ÑãD(?ÐíÒIE^X_¿~ëæÍÈÒBC§^É´#INk©³KiØW¤ýj|½:4Î}`×ÖÕÌ1vþÙlîµM[ëÀ¥@}¢Ê«s£2§ýÞÈÿ\,å3Q7¼¦/;ñÐÓÅAfÑ'ÿ)/#,Ô,-°jÐ}{ôyIY~Í»/>Ø,AWEú,¦{Úþ`ù.Ææ¤*jÐSÖ$_Óöj'ÒåÛªþ£k[i ¢ìɶJ¥Ä oú滿àÇ/¢ >)ø H¥¶mm·f7Ùm²ñL29dÎÄ Þ-+¨p1±,wd(öQ~ÙJ$'üõÊ?7¯ÜD¦ð楷È"¥NK%ùfÃÞ+õn7¯ÖR#æÝó¨¾#ùb㫼ÞUz_wÎdCë¶4HÔ·ÓবCâãÿÞ/ o·\8Ö g»½eð_*à1XI´Ëê%F!F±´]Ót±DeUξhûØÆMj¿ ¢¾u;«\¹p|,½H·FùFax.ÝðXÐ]«à<Nn"Î"ÖÝ<åÏUwZ¤³±1ÐYÍ«4,Mfék.laCoÔ@¶0kGuKKbû\櫲ò¡yz]ó/ HlLL;ãʧðMM\h|÷lFCDþzË#tqÏùÚs˰yT&z.+Áz^ôGóEV¿Qú±-EzP««õF)VD§61è h (ObCèÄ-1RÀÄ5ݶÄlKÇPv `ÁU.ð£_þdã±7¹[odþ,AJÏåÊ!^Fü&Eéû²u:ç½þç2°ªõ.ËÍ xIfvªnÉ0|UÝÂEbHä#ÆîÐ?{ÿúz¯ôcýºø6òIÙ¦c§"î¢Kâ53͹gU+o^½:6Í!³º¡UVÃu¿FîY åÚ»Ã0#RBä.ê}ÔõÝÇê?º¸j7î^]Gî1âmþ/ Ú´viYh·;ÙÌÉ_7ïÃä£09ñP¦ìIwÑß׿òo¢F¸t¹ÕIË4µæ\ òãXoR¼NçR"@~§½á)´FO&óáBGAqû=á Ì{Ãé³A/<.(´jï#¸*ý\.ÑS{f©såZ ¼<«oz*±¸ÐÑpL*µ'µ¤Dâá¹åǶ¨ô*é£I¶>â£HP¤ÖàH /0Tî#ÐJ¡faíuÈDѪ×dÀMj¬£×M3Ã4ù´^¸Ü¶åÐ2üôqý¡/k¿ð/ vB´ÄT1*»OßȾ²¯ô 8R«ò\¿ ÏdMë¤8wÍÖq¨°ÃqLRCøæº¤ð&A¤¡õ#¸5ѳ½Ä¨ öòɪz¶gFISa¢wyHònï±?: ]ºO"Â&æ,=7ÙÇlÕcëøáÌOï\®]Ù3ü Àѵå4A?ëØF¦jU ø.Áe¸'GàÔJüE ®Ò$mf9-ywgfµë!òädq§Æß¢Âæ}<c>ËËi9jæ¹*c\ÉåÛ9òP)QYð°LÝÛbw¤*µ(¸àÿøL,eZ;ÙѾ [p¾¥¿HiyfeÔ'Eä*x¯gã©PÞhHûP$mfë^®Ê§EýzôMÕ³.ÁÅpòÓ\äf±-ù×M´³4éUBeå-t%²Däæw:kN³ýýµa'÷ýx@èOht\Lbk~©pà£ìèeÙïÌó²ÞyÿC^®*áV³ÿÎnK)Éþ]ëFä&$(ÿ&{¯?, )4þ @ÑÕ³4ÑÙÛz$¢±$ ØXÙùëÓµ ¢ÄäLr¹3·{û1ã,l¹l3óÞ¼³<#©täî $h~5ajéiÂbo`ÍG{UNcþ÷㨱cÏMÀêåÔúcOX>]C:HL¸>]x|}÷¸+Û¢1®gC¨¡®Ì(nøòæ÷ÿ ¢éÓ&¯.ÞÂÜî^ìu#ùñLppQAÝøõÌO®£ÓjX05íûÇS ß RøÀÄ éu+,V òÑøx_@W°&gÆIV MøÛ5«*ÄáÈJmgk÷ë®àt@ÖKR³ê@ Ï×#öBÜòªûÑõÛ½ 90ÇEȳßÑMRuLsXX ô?üN¢Oí¸Ú,È)²äv"Ïv~ðÓOSiëÂëCT9# À ×ܺùåÌu?ݹ:ÐM×9í$9ø{ülVèÖÖ<â$à»qvsvÁÑ6¡üÚu=ÃÐ;KÂÊñÉò{ì °"ÕZÁÀebmRt:`t}³4ö8Æ)ÓÙ ¤Ie'qÃf¿õîûîÓ}lÚáy6.êôIóecJ/ÚB:4ûQ ´2?¡ä"ÒN¿+ù ÁcK% àsÂCÒ9+±=haì!Ø÷$ãÙØé%Ð]4¸÷vh?);ñðÆfa³ý)-Ì^=b¥IÕjËXÊ.ú¿È¥h¥¨JîW¢¶PôPl¯Î´7]ÜÖ¸ZÿÚþk8ËÉQ ú¾M·{wq<ïd¾ÔFïEÒû² "¦µEgDÝdÅøHC´ø;£ -¬»¼í,ã{z)µnëö¾À?EØçUD;"r]g L[z@Ó·ªÄ'0gUJ˵ÎÔt ¹ñâŰfßjo$ lvóR«èÝ)»Qá¢à¿ =Ogpõÿ ±ä1±çOûÊϲ@½Aaâ²"T*Gê% ©.ËsñAqmIÑû$Wðhøµ´ÓmMØAÜJ;îÞòW³µæ»Ü.Ѭëþt¬}r}Ø%`I´ÊXÇ{îº:MFiºçTJ1OÎ2)¤¿¡Ô %G-OÖ`4¬Ûþ+ÍJñïµ:NÀ)ãR0?¬ûaé¡D Ĩ Wç%«LW#þ Àѹ,%Q4 ÉTQ(²pÿÿ/lqEi)`Ðâ!GwÇÛþÀÌ,ô9Ü4e_<xÆÎ"K¬´¯ Aa¼*ù,³Ë)ÖôèÖãókn58`Ì 4½× ¾»ö¾ÛkÓù¼uÓK.ç4µÚ£¾å®?10¸`V¦<kÜÇ{ѺäÂô61g AÆä;óQ2^ñëPì©êß(Óü&2Ð!&µp-a>[=<ÞSÁRð4ëܺËr«C; `dÝ×û¾Âtç<6wd8 TF8àÕAµ4±7ª+Û©²¤ §ãļeþ¢,×ü-Æ´=,ýLyÀ[zöT¯&)²ÊÑv¯³ð#òË `ï#´jxÍL+K§Û§0JÒÇ4º´_Ks{ÎyäÞg¹ b2q&3~ù·G¨¦ªþï/j8gÜDr¼×?,ŬhËb6î-Y`yYP©ô'· _áÅÃnóµ%!ÓìwÀXÐ HgùZPk.Ú-Àb]Q#ûÜ?é Ý,kT[«êÕfQóbeì·Ön¯Ñå«0ûFqwMÇ´A0÷Ã}¾L'Bô|Éhzv®éS®Q"@X(§ÚölRe ®LPtu- At¿î·ÚEÊ£zé#è¹è÷(½TJE¥ÙõîîݽÓì?Ø9çÃ9< 4ä05ÂTeí$ܼ¤X\iò}â]%×mÅÉ@Ú¾õ¾ ®Ø³ô²LUl¹mì'ApðWí|égÀ;>òRþ먰-AEqï-y-ä. 2>Ar-VDà·79z3.áë|aÝðïÎf ÔY¢VÀ¢Ð/¥F}ée£¾\ü<¸³þ;©òN%m»Ü<Û,ͯu©M »ÌOKo©¡¢åq Y¥²m¡6¶ä "DxÃ1¾èæk>[;¥zH[c.©ìi;Cjs] E(R8ì`çyôé*o*óÝ*1ÂwóLQ¹Û%²q²¿(:wb í]' "¢4© QrnÀh8 ¢("$ðP66»dýfnàb߯ÿý@60Þ7Þ«rMèV>0zæ~â¸ÚP{ êXZÓVÀ§ÄMCñc ¼Ì.aTvÃHúá®-dAw²kuQ\Ø0Ýú÷èïËö,Á9ÏH32©ò5õdö]"~>¯A¶N!(ó~¾³@b®Òx%ôöfóB¡O;iqã¬ZsªIßmÏNÖéó)nöpÙð½mܯë2üEþ¢- é¾ú⡠ĵ³·«/^ß^U/U÷¨ç\²«µÞâ!?"s·Xµp(ýȨoôS &¯ñ1`¡9ý²a.:ø²Ê-ÔWrqÀ»BMâ_ ÎÚâ¥Þ¼:{Ð)¦+ò?ëÎ<.ä{µ$)RR2áÀKzkï*_¿5fÀ% GÍxñ²E×z`Úµc¸ÖTÿùàgµÎTÇFêêhèÝüW·~Ù¸®û)ÞkùFzèð$ o dIê¹ÞLºc4ÏUDá¢ãÜA@WQÒ,B öm:YN;wÎv>\`P¨rg·Y¹?1ÛpZsÙAô.Ô=Y2<?dÆòHånqÄõ.Òs#xüØÐóÿpt-9 Ã@tfl'hhC Ën;v°ç6Ükp Ä5X $VH¨( ´IiÚ8mƽãù¼7y#»}¯*HÿSÂÀD8Q&üT²Mý+AoZåcæ33(SÉ:GÜï¡o)Zú®Ö¶&¿ Ì5òÀ(Üg¸à-&p¢3þy3¥>AÀu£Y(æ#CÉ W¸¥oÓȱ»½[º_Æú±ø{8IÇtÛ1§OdBg¬Æ'/í¦nìHÀrÓØ}õ9;!µÃ¿ºp÷~<jY¶ÌªÁ¨ôñÚ?Ū¶ºÊ¸£v¦Í¶÷Ѱ3ÏËêMøëØ ¾Òì¯Lú4)DÌ wY,¹¢qVø¢³ii Âp&³Ù¬´ zñâÿ¿û¼V(v»µØ-ÕÒm7L2Îo÷ÉÇδöF;Y³L>äáC<Å//îW\6&öv¢Ò"!\ã²-Û½P1îd´É°ò!*{mo¥ÿw(Î`®¼ôÃ"ÙMb¥ï*xÆwøö-ÅFÜe&ªö,ÑLÜsÄ÷âÑ(kãÚÈï>¬PD6Vw é*nî¹·ú(kéAÏß0µä¿2Y]uyæ°â½¨ K®êIQØv&kF2e¹û§ÛÙ!¯çÜåjCØ´²4î£?"¯ LäGDS%hè¦/ÖQ"vGzõ==Y »Íý@ÑÙ¶4Ãp¼MÚÝC;'8a>à`à+_ßÿKøRÑÔèÜv·ë51ùméC_IþAòqy/!*«HÜ)@ÏfsGf ùܦÀü-çÆx`(½}é¯dö0Ü ÈZÄ*oÊyÖ. Ðm4P¯^?§áy§ªéaO¥LëU¬ÂÌ5îCy7^sÐd¤s£òø6õÌrÜÏP®u'³?-|ÒFÉ=e K¢ Âßæî:VZC/Ä`Mÿ+®Mb[vo)¯³vú9í#Û¾¦QqÚ-_´9vX9|ÂðÓëí¦Õ,v11æx¼ôªL#<Ñ2|hס0ÄÔNêdtì|Z¶{Øî=¸FÏØ^¡[Å ÊwØIÿàèl^(>ÌM¿dµ·ö ¥èÅ«GÁÿߣB¡JAmE*ÖÊvÓÍÇ&Nürʼ÷c÷] uÒÙÉ °í¥ÖæWíi>¢¼ÕrªJÙÉÎØ ¾Þ&Q b.¯[)¼ïú¸çùLr!rdÏeP=º ~ëOv'¹`¥»Mòx®Óhìdb`+E¬MãT°|C_+ëMçâ"ÉCÝ`"XDú? .r¦ðS¹19ëÜ(¢yBüwà&¥¾;¯t]/]x÷aoÜVéT9WȹzßJÈ0vvdåäM_ü*$úcHOûúg×e9î©Ú²Ø{su2[¦.Á±>c:anoÌ$§ÅåµhÅ®áãÈÐÁE®4Öþ Àѵ´4Á¼³¸¶,R¥þyO "*-ívÉn6~éOHÂdfHf>vÙÝ Àày9æÖfªzܵޱ×þã+5nÇèc_áóÓJÆ\î@ÅHáS4ÂØÖøæ0Búÿ¢¾Þ%Óeø£çÀ¿¬x)`|õÒÕ ál³]öbi û4I¦ÇJR]ÛÔ¬·¿zÙýíÇr#|L]7q*Ô¶xº]µµnG;Rédd æ1¯¬yÍK]LDx¯¢ ckÇVÅ~oû¶}¥;Ò ÑØKÐ^Z/C"Fþ°ËÅ¿ T´ &Uüx? Qm Úc¤½¨Ê ]ONpÎ&cé©R¢î[Zp£q±¬ûñodùmXä¦ã5;RF°¥d/«¼ ,Èe *zIfòüªHF´câ°Ëï÷üYJWwoÁýÀÑÙó4aØç¯$¥¢D"ÀP± 1 ÁÐ_ÀÿdgafeGHÀEH|´VmJƱ}Üñ|g¿í÷=½÷ï Ë2Îø}Î÷dúööçZ¥ÿâz]α['ôRä5¬úÐôuöÔHbîRUSRùí4WKâ 8$ -aáZvqR¯8Îx]û+à· #NR£nqsr0lgðÓú®7¤yÞxçéaæª BéGFm5«ßØ®Lo¼ÅÏéÅn>Px³Þ\»8¤î¨ ÌB,'±$Î0üiÕС-Ù+Ä!¹"îk]!cF,ãÏ2[-¢WiFÒÉÕÝêhöBèbðH½FxðnÛÂp©üGD"{HF¾>MÛDÅIà[<Í1³2qG´ í©pt6= Ä@î×ÝITÆÄh<yðÿÿãÅN í¶ÓváÞKÛéÛ÷i§S[¤ \)³¶ä¾Ø ã4ë|72Ca.v¾Éøgè6éüN#£íÃûöZ8/{ÿÓ0|2§Èÿï¦ÜRù¨ý«Ò¹¢¹VâIËEkúåÚjÜ\ÉÚÛ×p´°Ôo®'BÔü)D~©eÂp]Àµq»ø+wR¶§T~e9¡ëÛJxöWÄJîªûÀËs²ü =éï39²¿ E8Is4v78jÐ|Hõ Îkòz¹ç 1T¥H÷ÄUFlI ø»è[.Þ¬SÛ 6p/NÌ&Ŧ&`O½ÒRò¾´6TvÔ(Ý ·pÛdw3W¦KÈǼ7/¼'_mEb\ Ò)¹Nä÷Jòk(Y$<,Ê2à]¯9=6ésË;ÊRZääp¤¢ÞË/;¦ZÚÞ»»õÌT&-Ñø¦eQ{ú®åÂu±ñíÀÑsÃm!¼XÈIz Òwù»/zÂRìÕU x&-²nSèçU0Û¾[Ý9 é_ HPu(3in8±ü>%ö3s«2UmI;Bëågø(s`õÙMO># 09]ðaA°K3ªdu¥ås(5æäe¤¦XiLTeñüç¯ãyaì£{>Uaè8µ©Î[ÎõÒãRj²ïð~,9â>%D§4|¿b3·É8¥êëE}©ÿþ¸éÖ·¸Eó¤Ô«@*{µ¥ÄY¯±s»Ñ U÷]ÛKÇ|°¥a¶§QsblçÀ¼ºJ|ôïQ-¥C(åþ;rÃ$e²½Ö:°QGÎ2mÎ-UPY±Úvwýºé,O§«gYørâõü+À --- NEW FILE: font.png --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/examples/nehe/lesson17/data/font.png PNG Î=HõÀ0*®¬¬ìîî&¨8-- '¹ººµã$ z<a>$`D£ *@ 1ëgÍ5}útÈ®ê`ø ©¸$d&A÷ Mf¹ ð<9Echç¸ù¤j¡]ø@ÚôDh§õêËA²¾ê õýT ÄhøÚ/<v@êíF ¯\¢9ËZFªz ÝO¼ud¬"rJî  äò,b ÝOk@äÀæ`äÒbEÐp!!!üa\ Zo± CäÅRâ]ì=¿a#|hY?ÄÈ0D ȱ\h¾Ã³[ë01ä /Fu¨r=3@ ]T[`;Ïâ1ª ì¤ e°F40¬Ùd-@ >Vv9VÃê÷ ê&Ü38Á7oy`ß¾}Ck½ 0~÷«@|ÈÍ d Á<i]¼½ \º?è²2bÈ6+°ñMp3'Ðv4é»Ù=ÀÔCûÎh!d< 2æ;°i>¾ ¤vßI=y~*@ `ºfË_!q_ÁGðÊ#7ã 99E½«¹?g²ë øµß ϯ¼Ð9UbÍ @æj ó<D.ûã ÐþµX©kiH:ÔûzxEüý$ Ôq¥6MÕÃOi'r¿z jµ__¾; è OñÄ(M@üÙhîLPÐ"ùáZæ@^éxAj: Ä\) <lf«[Ô«ºgýâáØ*ç$AÙEO1íßö92n#©µï-Cª*nsXÜ ?¬ßµá4×ÌÖ?ñð¨¦}÷9-~Òu¿P§x=Pûüy JA!ëì AÂÝt?d9:¼)ïÅe&@ Ï 'ì¨Z ɤu xHK 9ª g¯Ò¢P!cù $MÀ`|AJ¾ISÔ0G´h¢ ß ¯Ù$bøúu xC& ;Wp²mñãQtka(¼H»ñ"HÈìÄ4~ rZA'AFZ1^_RF¼áÄ#'ÃçæôMª`øC¦ñ¬ ,r>d=ÁÅIÈÏL͹$ÈRdbfé Ëâ?ViÁ#1WXCÁÁ!E!ðO£ Oü2 ñgHÈÜÄ1ïÁV ð$xzC\ ì±IÄl)9¬Èù?ȸ5rf ~kú 3 ÄäÍ@ú±ahG8h?B2!D~ÿ"o F==K_È<Í$2±&6\é æÃ+³®kÑ&o">'÷Õ¥´4µxcïlãòs)*à×'[Y¢z$q{:BÎaÅD&eRó:$\ÁTFdûâO`D¤àí+HýHÐ|xW¾;ulÜ|îAnB¹ ¸Slõðåå;Py)1á _oGdU «ÐoÆÁ÷mg®DnÜ úmq{v!&"U¢OLøC6¿%²¤Ë-QVâWC`n òB^x]GämeøwJ 7äÕµs[ N^;"¨Rä¢gòcÚßxKø/¯N÷êYÆ~|/ó7x1{qBɳpÉ2ø,oCo¤ØìÙå#Æô#k)y쯹ÍrᦠðXÀäOé @©óJÁ¼P\¨PJ®º(u´þÎ_Ð**¹JP¡t¿àò*NT¾Mï¸ÜÛB²ùæÙÕî÷« ÈÝJÛ¶4M;úÇãqØàr¹,Ë¢ª*6Móæ= Øó¼v<Ï[õ³Ã(㸪ª¢(ÃÐu½ïûº®?äÇ¢mÛXÉóü<ið~è÷¿ø¯íú&˲u]}ß×4ív» Ãp¦Éqáe¢@aí,ËÏçÈÀøÑñ¬Å<Ï»rRI¯§öÇ,Bïº.h£(B¤õHÀ^r¿ß7¿¢¢( GPy¾Xü/ßP(¥8Q:KðÎ9¢# qsçObüWKK ÃÖ ;饯û¾ç÷wh Ì\É[ÉÇ*âépbÞ÷½ÍÐB47ì@(²ÈRP³¤ñ§IÏR@$ÃÜpyÔ3B 1µàß@öbzbÔ£mê JNRøPk?d2òâböKS¸ÂÒXǯ²6Þ: ¢Rô רg¸Zü·\üÐgûU/ t äó\Ãàº.mÃ"ÝX ûÙx?××u}áS)eãMð¬ÇqÄÀ¶mÅ ãLdzP®øosL±¢ÀpÏóøNÓ|N¹ÃW F4 F4 F4 F4 F4 F4 F4 <8zs~P\ P:x9vk(¤ÆR`£hR%ã*UçÎ2.1é2Sñ>Ýí@¹TÏ8Fvöú¹ÄÓìÃ%fI7Ü|x}ML÷Iðx(T¸3 cHÚ< Q%.üèfHjèÂ_qCÆ»àW à ´Ãn©tÈ0 Ö @Ú¤ QÐѪsNL) ³Ü-D$Seâòqg¶¦ ·Ä$5®µ&ã<-íÔxsãYd·T Lÿ@]ÀÐZs#*9¢ìU 5Bâx{32óx°Y§&Áê½G?QZ²<1>/Ȩû[gç Ä£LZ$æ.°@Ú¥ àÅ!1uïÈ ¨\\\p]:Ø õ4ôj¾oªì¦sî½¾jïý/ ° tDÉz}ëïË!"'#!\yÀºð7CIÝñ¬àBv´q UÆ+Äpø j¿ð þÓ! h¸û!õ6÷ÀÏ<&> u/I·AV@¤àª'äæ @£h½ ¸Ç© K §ªà¿{<ÿÂ&²ªOâ7è Gêð« ìÑ6zS<µ F4 øúxâȱ~ *ÈÂ)üg_B mT °e) î06üPAø2LÈùxú!ȶC.»¥QȹÔ+õv2@ÂxÖ<ÂS 2¢@üéÐøW£ '²û?qÓá'<<BâOÈiðÒÂê2øY1Á䵸Ââtä1÷ÐN=é÷ Prÿ @·óþi Ïɳ ¥ þr FÑ H7t;ï$ F4 |
From: Luke H. <lh...@us...> - 2002-11-25 06:53:15
|
Update of /cvsroot/java-game-lib/LWJGL/examples/nehe/lesson17 In directory sc8-pr-cvs1:/tmp/cvs-serv18314/lesson17 Added Files: Lesson17.java Texture.java Log Message: up we go =) --- NEW FILE: Lesson17.java --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/examples/nehe/lesson17/Lesson17.java /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import java.nio.*; import java.io.*; import java.awt.image.BufferedImage; import javax.imageio.*; import org.lwjgl.*; import org.lwjgl.opengl.*; import org.lwjgl.input.*; /** * $Id: Lesson17.java,v 1.1 2002/11/25 06:53:12 lholden Exp $ * * 2D Texture Font * * Credit goes to Giuseppe D'Agata and Jeff Molofee (NeHe) whos tutorial this is based on * * @author Luke Holden * @version $Revision: 1.1 $ */ public class Lesson17 { private GL gl; private GLU glu; private boolean done = false; private boolean fullscreen = true; /* Base Display List For The Font */ private int base; private IntBuffer textureBuf = createIntBuffer(2); /* Generic Loop Variable */ private int i; /* 1st Counter Used To Move Text & For Coloring */ private float cnt1; /* 1nd Counter Used To Move Text & For Coloring */ private float cnt2; /** Creates a new instance of Lesson */ public Lesson17() { } /* A javafied version of AUX_RGBImageRec *LoadBMP(char*); */ private Texture loadImage(String filename) throws Exception { Texture texture = null; BufferedImage tmpImg = null; /* normally I would use StringUtils.isValid(String) from the jakarta commons lib, but thats beyond the scope of this lesson */ if ((filename != null) && (filename.trim() != "")) { try { InputStream is = getClass().getResourceAsStream(filename); tmpImg = (BufferedImage) ImageIO.read(is); if (tmpImg == null) { throw new Exception("Error: Got null from ImageIO.read()"); } texture = new Texture(tmpImg); } catch ( Exception e ) { throw new Exception("Problem loading bitmap", e); } } else { throw new Exception("Error: file name is not valid!"); } return texture; } /* Load Bitmaps And Convert To Textures */ private void loadGLTextures() throws Exception { /* Create Storage Space For The Texture */ Texture[] textureImage = new Texture[2]; /* Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit */ try { textureImage[0] = loadImage("data/font.png"); textureImage[1] = loadImage("data/bumps.png"); if ((textureImage[0] == null) || (textureImage[1] == null)) { throw new Exception("Error: got null from loadBmp()!"); } /* Create The Texture */ gl.genTextures(2, Sys.getDirectBufferAddress(textureBuf)); /* Loop Through All The Textures */ for (i = 0; i < 2; i++) { /* Build The Texture */ gl.bindTexture(GL.TEXTURE_2D, textureBuf.get(i)); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.LINEAR); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MAG_FILTER, GL.LINEAR); gl.texImage2D(GL.TEXTURE_2D, 0, 3, textureImage[i].getWidth(), textureImage[i].getHeight(), 0, GL.RGB, GL.UNSIGNED_BYTE, textureImage[i].getPtr()); } } catch (Exception e) { throw new Exception("Problem loading textures", e); } } /* Build Our Font Display List */ private void buildFont() { /* Our X Character Coord */ float cx; /* Our Y Character Coord */ float cy; /* Creating 256 Display Lists */ base = gl.genLists(256); /* Select Our Font Texture */ gl.bindTexture(GL.TEXTURE_2D, textureBuf.get(0)); /* Loop Through All 256 Lists */ for (i = 0; i < 256; i++) { /* X Position Of Current Character */ cx = (i % 16) / 16.0f; /* Y Position Of Current Character */ cy = (i / 16) / 16.0f; /* Start Building A List */ gl.newList(base + i, GL.COMPILE); /* Use A Quad For Each Character */ gl.begin(GL.QUADS); gl.texCoord2f(cx,1-cy-0.0625f); gl.vertex2i(0,0); gl.texCoord2f(cx+0.0625f,1-cy-0.0625f); gl.vertex2i(16,0); gl.texCoord2f(cx+0.0625f,1-cy); gl.vertex2i(16,16); gl.texCoord2f(cx,1-cy); gl.vertex2i(0,16); gl.end(); /* Move To The Right Of The Character */ gl.translated(10,0,0); gl.endList(); } } /* Delete The Font From Memory */ void killFont() { /* Delete All 256 Display Lists */ gl.deleteLists(base, 256); } /* Where The Printing Happens */ void print(int x, int y, String text, int set) { if (set > 1) { set = 1; } /* Load our string into a CharBuffer */ byte[] charAry = text.getBytes(); ByteBuffer stringBuf = createByteBuffer(charAry.length); stringBuf.put(charAry); stringBuf.flip(); /* Select Our Font Texture */ gl.bindTexture(GL.TEXTURE_2D, textureBuf.get(0)); /* Disables Depth Testing */ gl.disable(GL.DEPTH_TEST); /* Select The Projection Matrix */ gl.matrixMode(GL.PROJECTION); /* Put Our Projection Matrix On The Stack */ gl.pushMatrix(); /* Reset The Projection Matrix */ gl.loadIdentity(); /* Set Up An Ortho Screen */ gl.ortho(0, 640, 0, 480, -1, 1); /* Select The Modelview Matrix */ gl.matrixMode(GL.MODELVIEW); /* Put Our ModelView Matrix On The Stack */ gl.pushMatrix(); /* Reset The Modelview Matrix */ gl.loadIdentity(); /* Position The Text (0,0 - Bottom Left) */ gl.translated(x, y, 0); /* Choose The Font Set (0 or 1) */ gl.listBase(base-32+(128*set)); /* Write The Text To The Screen */ gl.callLists(stringBuf.remaining(), GL.BYTE, Sys.getDirectBufferAddress(stringBuf)); /* Select The Projection Matrix */ gl.matrixMode(GL.PROJECTION); /* Pop Our Projection Matrix Off The Stack */ gl.popMatrix(); /* Select The Modelview Matrix */ gl.matrixMode(GL.MODELVIEW); /* Pop Our Modelview Matrix Off The Stack */ gl.popMatrix(); /* Enable Depth Testing */ gl.enable(GL.DEPTH_TEST); } private void resizeGLScene(int width, int height) { /* Reset The Current Viewport */ gl.viewport(0, 0, width, height); /* Select The Projection Matrix */ gl.matrixMode(GL.PROJECTION); /* Reset The Projection Matrix */ gl.loadIdentity(); /* Calculate The Aspect Ratio Of The Window */ glu.perspective(45.0f, ((float) Display.getWidth()) / ((float) Display.getHeight()), 0.1f, 100.0f); /* Select The Modelview Matrix */ gl.matrixMode(GL.MODELVIEW); /* Reset The Modelview Matrix */ gl.loadIdentity(); } private void initGL() throws Exception { /* Jump To Texture Loading Routine */ try { loadGLTextures(); buildFont(); /* Black Background */ gl.clearColor(0.0f, 0.0f, 0.0f, 0.0f); /* Depth Buffer Setup */ gl.clearDepth(1.0f); /* The Type Of Depth Test To Do */ gl.depthFunc(GL.LEQUAL); /* Select The Type Of Blending */ gl.blendFunc(GL.SRC_ALPHA, GL.ONE); /* Enables Smooth Shading */ gl.shadeModel(GL.SMOOTH); /* Enable Texture Mapping */ gl.enable(GL.TEXTURE_2D); /* Enables Depth Testing */ gl.enable(GL.DEPTH_TEST); } catch (Exception e) { throw new Exception("Problem initialising GL", e); } } private boolean drawGLScene() { /* Clear The Screen And The Depth Buffer */ gl.clear(GL.COLOR_BUFFER_BIT | GL.DEPTH_BUFFER_BIT); /* Reset The Current Modelview Matrix */ gl.loadIdentity(); /* Select our Texture */ gl.bindTexture(GL.TEXTURE_2D, textureBuf.get(1)); /* Move Into The Screen 5 Units */ gl.translatef(0.0f, 0.0f, -5.0f); /* Rotate On The Z Axis 45 Degrees (Clockwise) */ gl.rotatef(45.0f, 0.0f, 0.0f, 1.0f); /* Rotate On The X & Y Axis By cnt1 (Left To Right) */ gl.rotatef(cnt1 * 30.0f, 1.0f, 1.0f, 0.0f); /* Disable Blending Before We Draw In 3D */ gl.disable(GL.BLEND); /* Bright White */ gl.color3f(1.0f, 1.0f, 1.0f); gl.begin(GL.QUADS); gl.texCoord2d(0.0f, 0.0f); gl.vertex2f(-1.0f, 1.0f); gl.texCoord2d(1.0f, 0.0f); gl.vertex2f( 1.0f, 1.0f); gl.texCoord2d(1.0f, 1.0f); gl.vertex2f( 1.0f, -1.0f); gl.texCoord2d(0.0f, 1.0f); gl.vertex2f(-1.0f, -1.0f); gl.end(); /* Rotate On The X & Y Axis By 90 Degrees (Left To Right) */ gl.rotatef(90.0f, 1.0f, 1.0f, 0.0f); gl.begin(GL.QUADS); gl.texCoord2d(0.0f, 0.0f); gl.vertex2f(-1.0f, 1.0f); gl.texCoord2d(1.0f, 0.0f); gl.vertex2f( 1.0f, 1.0f); gl.texCoord2d(1.0f, 1.0f); gl.vertex2f( 1.0f, -1.0f); gl.texCoord2d(0.0f, 1.0f); gl.vertex2f(-1.0f, -1.0f); gl.end(); /* Enable Blinding */ gl.enable(GL.BLEND); /* Reset The View */ gl.loadIdentity(); // Pulsing Colors Based On Text Position gl.color3f(1.0f * ((float) java.lang.Math.cos(cnt1)), 1.0f * ((float) java.lang.Math.sin(cnt2)), 1.0f - (0.5f * ((float) java.lang.Math.cos(cnt1+cnt2)))); /* Print Text To The Screen */ print((int) (280 + (250 * java.lang.Math.cos(cnt1))), (int) (235 + (200 * java.lang.Math.sin(cnt2))), "NeHe", 0); gl.color3f(1.0f * ((float) java.lang.Math.sin(cnt2)), 1.0f - (0.5f * ((float) java.lang.Math.cos(cnt1 + cnt2))), 1.0f * ((float) java.lang.Math.cos(cnt1))); /* Print Text To The Screen */ print((int) (280 + (230 * java.lang.Math.cos(cnt2))), (int) (235 + (200 * java.lang.Math.sin(cnt1))), "OpenGL", 1); /* Set Color To Blue */ gl.color3f(0.0f, 0.0f, 1.0f); /* Print Text To The Screen */ print((int) (240 + (200 * java.lang.Math.cos((cnt2 + cnt1) / 5))), 2, "Giuseppe D'Agata", 0); /* Set Color To White */ gl.color3f(1.0f, 1.0f, 1.0f); /* Print Text To The Screen */ print((int) (242 + (200 * java.lang.Math.cos((cnt2 + cnt1) / 5))), 2, "Giuseppe D'Agata", 0); cnt1 += 0.01f; cnt2 += 0.0081f; return true; } public void killGLWindow() { killFont(); Keyboard.destroy(); gl.destroy(); Display.destroy(); } public void createGLWindow(int width, int height, int bits, boolean fullscreenflag) throws Exception { fullscreen = fullscreenflag; try { Display.create(new DisplayMode(width, height, bits, 60), fullscreenflag); gl = new GL(bits, 0, bits, 8); gl.create(); glu = new GLU(gl); Keyboard.create(); Keyboard.enableBuffer(); resizeGLScene(Display.getWidth(), Display.getHeight()); initGL(); } catch (Exception e) { throw new Exception("Problem initialising Lesson", e); } } public void start() throws Exception { try { createGLWindow(640, 480, 16, fullscreen); while (!done) { loop(); } killGLWindow(); } catch (Exception e) { throw new Exception("Problem starting loop", e); } } private void loop() { drawGLScene(); gl.swapBuffers(); /* Keys that have a toggle effect */ Keyboard.read(); for (int i = 0; i < Keyboard.getNumKeyboardEvents(); i++) { Keyboard.next(); if (Keyboard.key == Keyboard.KEY_ESCAPE && Keyboard.state) { done = true; } } } private IntBuffer createIntBuffer(int size) { ByteBuffer temp = ByteBuffer.allocateDirect(4 * size); temp.order(ByteOrder.nativeOrder()); return temp.asIntBuffer(); } private ByteBuffer createByteBuffer(int size) { ByteBuffer temp = ByteBuffer.allocateDirect(4 * size); temp.order(ByteOrder.nativeOrder()); return temp; } public static void main(String[] arguments) { int err = 0; Lesson17 lesson = new Lesson17(); try { lesson.start(); } catch (Exception e) { err = 1; e.printStackTrace(); } System.exit(err); } } --- NEW FILE: Texture.java --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/examples/nehe/lesson17/Texture.java /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import java.nio.*; import java.awt.image.*; import java.awt.geom.*; import org.lwjgl.*; import org.lwjgl.opengl.*; import org.lwjgl.input.*; /** * $Id: Texture.java,v 1.1 2002/11/25 06:53:12 lholden Exp $ * * Just a small container class for holding texture data * * @author Luke Holden * @version $Revision: 1.1 $ */ public class Texture { private ByteBuffer data; private int height; private int width; /** Creates a new instance of Texture */ public Texture(BufferedImage tmpImg) { width = tmpImg.getWidth(); height = tmpImg.getWidth(); /* flip the image, so it displays right * There might be a way to do this differently... */ AffineTransform tx = AffineTransform.getScaleInstance(1, -1); tx.translate(0, -tmpImg.getHeight(null)); AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR); tmpImg = op.filter(tmpImg, null); data = ByteBuffer.allocateDirect(4 * width * height); data.order(ByteOrder.nativeOrder()); data.clear(); byte[] byteData = (byte[])tmpImg.getRaster().getDataElements(0, 0, width, height, null); data.put(byteData); data.flip(); } public int getData() { return data.get(0); } public ByteBuffer getBuffer() { return data; } public int getPtr() { return Sys.getDirectBufferAddress(data); } public int getHeight() { return height; } public int getWidth() { return width; } } |
From: Luke H. <lh...@us...> - 2002-11-25 06:53:14
|
Update of /cvsroot/java-game-lib/LWJGL/examples/nehe/lesson16/data In directory sc8-pr-cvs1:/tmp/cvs-serv18314/lesson16/data Added Files: crate.png Log Message: up we go =) --- NEW FILE: crate.png --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/examples/nehe/lesson16/data/crate.png PNG Óðú¨°É2ò1Ò>æ,Gªµg(NH¾Xy·ÛfhP¤© ïmIÒ}¿T5<(\/ú êåouã<k1;ãåNjNÀ.B¸'mTdg¬ðyØÖZ,ÕÌßßÏiÄÌ0³ ãþZµBú TìY/â7Ã+{[¶§°Ì²ìxnp»-VÑ9ýÂfñ}@]»¾~|Ó(Åâ<î¹|£Ôáï4#éGÁÔO¡à!b³V]øror4]ïò¬z»!ã$¿Ô&ÚZa¶p#g"þ® §çdGp)fËZYp£ýyª06¦åE¯OØíEo,ð%o3ãÿ#&`àüxQýß,½1¿,º°3x 8Ò_ǸÙÓ »ÂÈKþÀ@ô8 ÑxKÒ%iiYf©Äaÿÿ/ qCÊ »VBç¡·3¨¿?Ë1¹ãÄBVÔ|î^ALÖÛKcð"CUUOI¢ ¤\!ç:*ÒYÞ¯»pwÔRKÑÀÅ¡ÓÙ®ÙcH£Á½$ZÎÂÞSÀÓ W4pfçØaÞæ NÒ öm¬×íM1x²z9Ù´^W;èÅïΧY?ØúÏö½;/Y:HNÂ|,Í#;el£ñ°iÙ× ç:ÛT2*¯%§h.ÞqyfþÔ+;ÈV'×&r}ªù"Ö$#k-4)jîÝCgýöØb+ººÚÇ#óÂF E>zrhéº<KsØP*\×÷ï:st`xNÈÝsÓ? òöz^SnbÌ»XålWó?Ûýj@{ T²6ÎGøØ[m ØWgÈNÀD¶»Ð|úy(|ë>· Í8{.L ²(þ: (EéØºBÃÉ«i|_)Z&ÿ@Q¹ó¶ CQ_%Yq¢8AÀIºwéÔ¥sy×îÚ8iÛ#ßì5À êöåMEÍEÁv©á¦ùJ²ãÞiëggÔxfèh"0Ý^^³WÀiC!³¼z>¨ÿþM^${MÖ5},Í1ÔÝ ìpyY u,d¬ÆË]å4³üêÒÂkìiÚòØê)ãpQçó³~NQT£r§sÿûÔÊÄ·f¼Ðë>'T§¬ÈB§}$õKJE*é§Aé9à¼\]áup72 äµ ùZ2F²üCk?ÌáǧYEáôËõ&%Ç¡Ió¶ÀÍp°yF8²¯£m|(xüµ14顽Éà3"j¼Gv¦Wûn<\Pyê4Â)<¬b æm[?á¦Ý>\¬n <MÚUÍÿpô¡×ÊÉT®ãñeDgCc¼oØóáIì_?µÎªx)òd"Þ (qD¦÷Ò|Ù0- áµ Í$Òìb÷ɪDô±eGWÜ2í0zëFÐCøÞÔbã¿Ç.oÇñqSÅh:°íuå¬ÚÕnæÆ:¶ <!GæêBÞV¼¾`nfÈõKÚVfL8é¼ìØ4õîu5MK)Ä_èÜpbnºy_G-FÜ!ü9A9ÿ ±Lv£Â Ü»½ÏcrààÈû¿ Ï®ÓÁ mæED¼ ßQYS·á¦eÒS¾º*!N²B¢ :öçh1[/]×kÅvízz§6㩼ôh|A¢0s¤ö?_*qBíÛz_±Ãæ)AÄŰ¼øÃj¡Ó4j;Ìä ´CV+Æå׿gTëܹøbcÜ%u¿PkÌÖÒÖE.é¡r´¾»@Î"GgoWm{Ϊäa5ßµãqà( £¬I54ûwoæ)äµN6|¼áhT}nJxßc>ÏÛ(u~Í!¤ÀY§2ç& ½gw*øÄSÈp°]4üÐ'kí\²0ÿ÷E´¦Ï¾}ÿÁfiÎä` . {éy*ÞWªv$R¹*ùxe³ãÙdd6ËíéD¥¸ÉcÒ¨·yWÛäv âz?ó!¨ñ±¤f¹Tf¶µ¤Ôû÷åÀɪõ×séÃ*_çé M¤"Å@#bJÁ!!\¦ÀÓÁ8w®>ª Ã{^¯ÖA©½åv{R-\bÀ%hò|3SnUÙi ÍzÓßÏQªqƹybÔK¯ÿíOo}é/jöcev.}9VA§¬Ï½BÙÚ^V¼½/bxz,OÑð6з+g¾ÿ ájíºqìäÙc0AðR·»Æ8³h9ô¹é!÷ê tö±%Ön1¥df ÷C ½5 Ûäø=!à(à8ê×ù`Úu;Ô']0¶¿.ç¥ÚJÍçºï'×/òïqØ^~'ºâ`w Ï!¿>>×eO +µÎSbÜ¢u¸¤ç}g?Ê)ÏÄÉûÃlí¶¨$b³îF[( qŪÐ:)1áD®'mP&p½.¸øÆõ*bBÁÑìsK@°CTl+mãYQÿûÌbaáUgþ@q¹ôF CQØq¦étF¥¥¨+þÿÿ°@H,Z(δI¿âg²,ûúÞs¾ÃÞÜÞ ¾ DÃ0ãØH¡`zÞðýîo²3dúVëÔNm|ôÅ×rÉ[ ©1u¬PàáBLhßý³ÝqPRA^`ZÄÜæ·Ð¯.D¹ Q#ø¦Ãª!ÿÀ¡ºÆRö:¿;_cǼɬÅ9iPthâ~ ÆKÚ¨.4ôl¢SÒÚCÏhP°`Ügòq+¦ù23ñzÛAÑ ¿-¤þÒüýv#t¼+ úõºÑþÜ÷}Eo=Ì Iϰ@óé½4ØÑa<E)¼7©±ÆFÚEoJï$ù±R»C4ØB XZ+EI!8'3Eã&³_7yæÂÉIA[³TL±ÿ'ºÕ³÷í~òa×_ÑÙcQ4-À}\(ûÕçÑ\ÈÅDàM f]Ú@ ²¬EM ÈRSðï3rÇækײOø 9u]y¨ÔJS¦NÔð³Û}AÐøßôoElÊ4°6¿:&ª£K«åÄxZ[ÛàÏ6P|ª9MËÜ L×VZl«vô;«Þzé¥rú0:oeÿ»«ú¼eÜÿï.ÍǺE}8ü ÀÙö¦ qÜ1$9!NKiʤn{¹ööé÷1*mo¢I-Ð@Í0ûÙ©@àßÙ¾ûß}0%|ž/VÏÝ6ü7÷£m]β¸»ýEç`Q+Õ¢uNeéÓºFbÙóÝ~x4u(=Ó¼^Ép¸J,$dOsI¼S¦d ¯êª(ctQ¼IúíË&¡(M±îú¯Íý:Ydèþùi¦iѧg¼AÒÔü2òË\NT.çfmÚÝëløu»©FÐMâÄz©!#òy¸7óyàÙî·ã%ìyþ¨¼DºniQ«H(F&çT¡5à²KÄPûIèÓK;6HUïÆñAA[í~|AwÂýýìI1 ½&LgÁeªQ [ÊOwC»)rímwTÿ ÉÚvܨÍÍ6c²M jÚ½i¥¾öÿÿ£ûPµÝìCC¦!d wÜc¢²{fÎ9©¨ÍÜd î¼b0ksØ0d.v0 ¸ÅÜ¥ L*)àØ ãý*½©[Ím- ±òUßU×¾ò¹ÏZí9Vû1æÇñ\Ê0ÔSÜ0ÿ i\Jló+"4éböòÛÀ" Dz¢ð_~Mt`ß,v¹«ÕÅ7¸1Wa ¢H´@p¬¢SÕ`ÿe£có©ÒX"%_>£úÇñ Ï/YZpL|ûÖ$Yü{9À#1)ÊmÊê×-(·ýs\Hvp"yÁ¤Ôrîv6eàø/¯j@<yç,À÷ªEÊ+ú³°aäiç6õá Äâ|2Ü wÃp»êWþé«_íHü kS«sa Ü| ÄôWägYîöR®"5ÍÌô8xR IÙ(úë`77'çX-ð$£¡I².íl==Ì9æó?ºi(þ.ò>µ¤FܰIA'_Ûoê(ï'=ÿ¾LïÆóï÷ýÊS¿ópü' %î4#AÆÓÇú¦0mßÁl$ Ü?é ¿ôEQÆ,4¾¨K]Jx¸Ýâ«ÓOwòÚöèI9ÙU¨Ò ¤@Å8ÈÙ?uê}Èãk¥ÇøC«¤¶PS8TÒ>Íx/ 44¶Yê{íR0ÒÀ¨iØùÃØHÓ³Jm|§ñh'¦ïÈÔXü²4?ÆØVyÞJ À̺ vw{òÝ7¤e:ýçfz-ÀTò¥Gû(n):·I 9i µû ¾Ì7»©Ó3`,ú¢%:èv;rS Si.19zÞ6©.LÉ2Ön<»ôyi^ <HòÊ4ÝÛ7¶Öz>= Á&²â¹èHçÓV6?p"³W3;`~Ð'N(ðMdÖxÜ+Kc Æ5#ãEM,Ûf0ýc;Âp°'ÿ[¤Pw÷àØÕ«$u#c÷Ç&Àõ½. ë ¶v à-}×*ÂÛÆöÏYæ9Jϧ£/¬ÅÌ¥²@E7Ð4|DQ( ç+zQ$É] DÇma9æqÒ£(åQ÷i'&Q¥@úTã-M·)s;Ô$ =¦¸ù¯ka*22sBm\ÝMR2ø§U»X° ²G£+ìóýeýñºD¦IûH&%©Ð¼=Ý>ÆÚ¤ï½lÐ"3ÿçWEb<¯§ë$¤òõm±ÖÉN¡ mè~ʨÄÏ6[ÛÅÍðO ?XHó·â_¬ÊoáI#æö@$ÔÒLÀâ¢>·I±Wï øÃøöñÃFÏØÿm^óí¤B¨£AÐjÔélØ"2ãäî,ùU~c4R °×nùª6>3<QúÖ3$|Ñ ôÛ]lÒúÃXî¤wËÌîÌ£¢í×»üØDa*5h~ìßà;Wÿ§Ã¸ÔÔÕ À-¥¿&ýV J/ØXÿ¢H$«w.ØváóL¾Íýy@bâÚMáònDTæY1ñi;³Ñrµó²Åõïôk_mîÆïN´ååÜ \1Íî}-umÚPë±Áû&ëÐ7¡$5.E-qÎë¯á¶JÄE\i$Y"b/×5ÉÇäA âQ &¨¾"H&Jà¶k¡ êk¾ÓXÞÏêýj°h Ð÷ëÌÝj^á>è-PÞÍ~>ìÄ0þ°É±uõ@â0K çynãÿ ÅöªÊJPR5ñ+×Â%dÐ4iiÈEGFÈ'÷êrÝn3 Ãe@¦P!ÖÝïîÀÅ»´¦jl£-P(Eß¡M¦¤ÌË9jàÁÕêg½ùx{¡-ÅðdèU4Â$ÀFëzKí~å%ûcAzgã`ós'@ÍVÝ1BG^!ô#[drj:8¨UxÆ.²°aÛí> Q,/§J ºtª¶b"ݽ¶M+ÀyÃ2Äâs3>PéyþZàxkHUÐ1&cGt½+OÖ8gâXR*ì°ÕX¢ÇöêtÆÞå½äp3U} e4I ·Ü¶@AHW&Þø¾³ï^I åÇneýf¹ 4lÙéììÌ9g¤ì"y~º 5?ÞÏ!«ïÚ$|<xPá¾+Í÷¦YòX¿kÌõíWí+K;lR(ZY%.þ? í ÆAAàV©Gß HÏÒ*Þ8·5C)³ ÷}ñ£ø(ÖbÞýA ê3b@ N$ëÎW³@ ˸6(· ¶Ómu®ÜùÂ>]HXH(m¡Åãwf1&¬fæ\þ˼©Ú¿ðárY¨©4±2WL÷2Õµ´êþøfPÒçyÑ÷ÝÉ»(Þ]6/ÿºRã ì%x Nû!)N£^ÏCeêDÆU¡8ÝlkÅ÷¨ÆxÜΦâZÇ¼Ï £±´¥q/ºÆD ä¸ â}/éý±ÿdµ¤@0lÏ yÔh¼9Y䥻³q¶\n±Þ±òî çA¥èÇô-^ Тû©XƱP¸Ò ekîPÙqí`¿ @lõ]˶ÅÒ(={¿5f=êx¸$ ·$qËT`ÄqPÒ)aYxQ¤ô&´4ä*ÏFh-),ÑÎ[lTU;ñ²BWQîexÖøÜÖÀ5Û¹:+Hÿ½q[ xçï.³¼(ÐÁóF¾rs§¾s_îç.¢-&Á|µ+ ñäí8)Oë×e·=`B}TQ<A ó©´7®¾ <PèwÓܸÁÞ}÷ës/unÍ"õ2éÏF% á8..JpÝ+%%±¾ÂhíA$Àý#e#+Ì8ÃG]ÈV7*'ýÊpI7ð%×àj¹NÊêä´GÜó>ßy Át£%%³¼ò'eMÖ©³gO4fÁµYÓÛ6»_°¿+P¤ÀÑÎÍ9,ÒÃÞ".wáËÌ)¬¢ZU2»p¡¿® hè#[D7DîÚâf ò!~[ÇÃã4EEÐ$¶!#?ucÀ©°Yk²zW_Õp ½ÌvD} £H(k0¥â ίøa°x61¤^åÛè"N¬áÿ¥X°§ßÉòdQDÝ»LYãñpêfkçôöÉ%(à x-³ó|UVVb!øMHÅ!Sá}3/,PY$ ø¤Hcx%³6´ üâ±sFNjÌ&éú¯ÂcÆeÙ³ú)Fà6a«Ó¡õú>Bc{ÀEzlW³£ËÜ-\¹y÷º§¾Gµê£^øa¼Ô9}«££¦µì¯ëù8 b~EÞ(÷gàkE)TztR6n¬CªÁ¿)F%ºEl·.;¯e×oñ-l¬D©¼Ï¢ ¬SÖ4C1Ô¤tdþËÖ%ì$£f@iuùöÕäÅÝã Ü_T?<®T{Ëm/NÀá÷«ÍGnÁ&W#ø}Yhµïg»öµ°°ã¬í±¯ þ·¾ìyÓäy£dªÍ*ä-ÑKË=Ã7ªõW EÓeÄ%¼¥µ}j~MIûU?üIP;tæoR1´G28i§AÚØ"Ê\o±±yË#Ûe°3Û¼z«,Ñ}³°^YdäÂZÀweþ`¢õ*¡¼Däðiõ梹Mÿz~rW;ÆHÞ j_úÞ}ùF¾DdµQY¢M¿m;\90¿¸º ÈÑÂqö0M?£>èÿÿ/õÑD_´&Zh˨gvk}kHC¹eovgg®è~ëfc>3"÷v½lÔ½åa©`ZC{UH4Sq"QP繬°"=v9Kõ_Ó8Ò2¡$Tÿ±Å½ßH¯£ß+ºh ¥V0 彩tÅîk¹éþMUê¤ÆNkîà S3)©°Ìsä`"¤>¶OEY#èr#j²7À6Ðå¡ ëëwìШ˴ø ¶ààJ* +jr¹[fÂ=ÄHç+ÄÓ xÚ!¦|/TX v2Q<Ñ&I·ïßÅj9ß,jo¯$tôñjÕ|ÛöÇ(î£$î? vûzs@wtåÌ ©Ñ#=åÃ<á¿q¢îñ²KîíOûüò!uìlfÙWØízBÁ$Funib~`âjz¢ íÒÂÁ1&^¼xðÿÿ£LÊâR>ÚBí:³¯U$ Àî¾y3ofä½>s¼s6ñný¸»ðß<°UH+£*dnk(T@ì¶V£!4ã ßoÙæFGÚè§JAôS§»xÅKý¥d T"%R;a\$3¯+ç `C/ÙÚgିèvÖ\í¥Ç[oæìų9|Ú¿zÏp?þðúÞ$ 9Ð 8«èà¨TJJwÙßA¬¾&øb ôÍ ø®|TÊLϯyo[ZPô_¸¢Ý (W4Óô±ýÿ¿è/´ic[S Ò]1¾=âîììÌ&ae6ø®ÇÃÜèT waZAñÍm~Ø«· Ý©TG=,ÌP9i:ûÁý°Û8_ùr¥Î%XòOé¢9«Àýê?|¡®h®¿4ORKAYoZ ü±D7ý5 60ÊåAú¤Òe¢7i¶¿1pct;T& ]®ÅrǨ£e4HçEÏè.|-öÝ?îã1©kÐ~E¹«¤@J[¿£ÈO¯a¹¿Ö®ëöûOuÑ9ê<îø\WÓØy¸Ì=tÕÂõ24&ÀûqLßôâ$®ÂÁ¬ö|åý©=O' F¼#ÁXʦªc{B'"OWKP£ììxZbXÔÐ0@ñè--%ö!«®ßå9RnçM°iS Y(ÍL`-¢!*¬I´O»u§6KçP,ì6 ð lÐK7Ñ µ +x0ëÇ¹É ãQZ$!h¥üwG.5 ¾d!úêå v/ìU¥£Ø¢éüy:þøÜ¹¼= צc)\MÓa°ïáPYÉn<À4¨×ê³M¸îªÏ¨[aO KÚýáÿÚV±¤à·ó5ÌPå*BXËKÁªwúK¶1úÌ ZLÃ1ªXÎ\ûdÀÍIùÅ=þÎ $ Ü+ûuòKc53ìêtþàáê DZ¡;*uÆÚþþÿÇö?túdûhHè^ÎáaüÂÜe÷öö"âÀùüéMsy ÍÛ¯t='+½³ñYÆÓärrD¼j¥ ²²3õïêÓÇ×NÒFf®¦>ÿs'qþ(õ2·áaHj¡G2í405k-[Ý¿g}ÉÒ8¨±M¿lU¯ÛOõ¸½Áu \`,®ïîÓLvÊA8ÝL\Ü9TÍ¿ U(Á ¨ÿùþâhx¥PÒ]¨¿³£øÐÙ93g®» Ô[¦çýá í£ÞýãR»õ|m³ú\íJ±:;W¸õî7ü:MlÚöddªÆ³ó!-®jи¬Ê<ûHó©üÚÝl B_9ämA&²ûz× Ç¢Ä ò0@hÅrO/Ã,³,u¨< §¹ R·7ùl:> GÌõk·½<x[h*6ºp[IÀL2"!Û¥ s6üp¹Â$dauÂ&Ò¼×pzz rþ\¡úóyqZúp¦ô^ãcUH,C_Ñé¢ýºN0KW·×8IèÉ $Ðþ0ÿDÑ!rÿÝ ¡qËR!é]¦ïã¹êÎ<¨/«tÄiÅên C]9gæc½Â:ûÖþ·8¤B$©#F,PÓ¿Äï·ùHk,Áúño]LÐõU ÓæZoÙUx~- ùìæöÁ^ªy½U¨ÙŦx5¶FôZï÷ø/iÍ@:oÎ8ß«\GZÜçb¹øóF/~R»«Åd¡q4òDæÃý`q¤,\OÆÁGûãñ°nDê9h×9aX}äEÑM%J×[+ØÜ8q²wÉkN¸Û|õ|vß§{»êá¢#5bgOíjìK] $ WúàñÈòm¢YÆ[äºàRË£? 4ôfôÒÃ:§eãËýàþÜÀÕé¸y/Äcr'MúÎwàls iÇRÕé8L@2 à¸5 ¼/¡09ä ÊÄúil÷_àg;L¥éHÙÒI Þ ¹ æÌH];ýq )¸UüÓÞbÓ7Edþfè"W¶Ãù·RSdô;$È(ÅÒ±@½0_ä¥S¬¯¼N}§¹vk`y»HÃçB© 8~j¡:Æ2·¹·V/kÊB'3<¼c0²²~ÇÝEÖDpo²j«í&Néív5_â\ô×ÃÛGCvL"¬¨¸¡ÆÑ_Òð0iÇÛÖ{¸WñÜ3¨ÏößÏi*é³C÷o.Dîæ2§RÈã+FZTÕàøQ9d?/JÄ[ƶ¡°KØ$tçmããÅÂPK °Ä@¼Ôp°M=~ê·ï¤#_ð¦ép-ØÊ«ÀÎr8àPÌäãñÏpRIühôéÿ#¨¦F~9{$c@À{_áéIѶ</²z²¬ @Ôµ,5AòH0$h¬ò£åÙ«ÿ÷¢^ÔhÑ*$°`ÏÆÛRÙÃÚíÞ鬿f6tµQ|àæFèQÎëî¯$"JU¸$ðO2$XæðN1 ½¬TÙ¦m4; ûï©#a3m Yf¼JóE|ú¾L+»¹_VØô ¹ådáº9µÄ½¹4+°l 1þ"bTV9uÆtÉHF¯êÇTy-Ŷb׺·ªRl÷]6¨aÐX?Ï kBÛ°ø=Ë Å{PÄóé^)&òXlqö=ÒÕ&à®Ï´Ò@ B"¡ãwSùR/õÒ/húÑý@3ÕXyQF$AÚ=ÕñÁ½Êpι{ÎÝ]ÍuVh¢)Oþö]V^·e&Cìeë½øàéY\è|èÚLÐô!§_âÉâØs²->9[â UX~IØBã¸Í¤I©dz7FC²A5¶¦y¬>~éí=Q¼¢ÿáA|4uNOuü«æ<ZÕz(ò|xïQÔE:ã å='Ųñ¾Ó§ûa¶« 9bsÉÃê°GΤÂe¸n?ÄX9úä]Zä3ÒÒ×4ÙªiQ<%µJÔåÝ^kfð?¨ PéXP8â;sùïH!lD§òjêo(9\Ó>ôM|0*:yѳrÑ¢èâyDåµ±]øÿPëØ´ëC+ì:*^²ïw,¼3 dßÓ²²,ßÈÅhm¢+?¸ÅêÌç# Jâ=Þ-¥pnvà¤ç+¿INëÑrÅ»±[ÉUV9ƤBTÀ(ÍÜÀ £YÜ^6§ò 2lCÔu»¾ ®£.&´|ø\ -!W·¬±¼QaRÝHm±¶7åÂø@sòóo·0Ǹ_8~E1U`r©Fâó_Ç5_wcO*7ÜQÉÞØnô²y+ ê_Gã«_w{bÃ%ZÅÊ J±Ý}½ë[§W>2¹9ñÛê®ßñ¡ø¡É»u±n³,ßFãå7b²ùüï^1é^d^²ëOϦ ǶÂ.®:/«çE©Õ¨àóW Ú üÀÓÕô4ÑÂÒBåC#1þÿ·¤7/^L<x0öÐÖÚÒò±PÀ73s7dCggÞÛyó°ý8U¢UëhÀtle}IࢦA8ÞÿÃhQE19"ÁÎĹrdÑXc~KÙ¡º;P_©49{É Õ1±J@ô9 ^0®ÈwÉ*PÑõÈÆàgÁ+mf5»ö}Ö <ês:Çáy~ÍF°<jÒk) eÌ»Í8õ%v4:³ Û8@ÖÉ ZÄË3ùÐÁo»áغèþ.+I ¡_IKÓÅÆrUÙfÚ}PaÂ8aqïy,Ï")×ýî=ÛtkL7Ë~µÁoD?Çæ£Æå +téɹ,KByñØ)ã$]æFd V¶&´Ìþ¤Ä¹ÊWÛ)εI×Ö#â¼UC ÀÄ®DI\uí @ÔÕ4%Á<cBHi|®"Á»V¹pÚÚÿÿGö`y@*@ HØî¨ÇTåäe>z¦§çdUx®^ÝvÔ»&dE ©~ÎãFÝÑm¿©ñR<Ç£2#ý8Æ'ãý¦3\#`7j¿H1¿x,<Äú8&OËéj@h'V)Uü÷Þ¯ÁÍórMÝQú®Ëún^ZË ·ÐÜËÏAØÉÃ{yøÜOf/äPyÏZxY<ðß|õzÊQhBÍ×JÀuýLû8H\N°å*ÎaRRtZfU,ä'-'?µÂb2ª5ëØÁn²l£¬[ plo¨¸ÿǬ&uN%«?¹ðëùE¤¼ã\QæÅÕMS»Ø0ÿÂRÚÛßòkD¦~Pb«ø6A®°© ßQÜÌÀ-°:?¨Ùzv»(°[æâB 8µJ ÂÑ`T8]í>U EiFàÍ\̽À<.¶M6û;èþ¹k,_ s 6°ÈÊ^©ê¼²A3u?]éa}0ypSÑ?{_"µ|§¯~2-iØaìOÃpi±W<*ã˨ÞUx_oõÍ,ÂCKHn'Û\~EØ#uepQûm£è¥.$`a9æÂV¢á®IÝ&.;îUÏb²UrÕ©vÎ×1"M ~Pj_¥ÕHÿ2YÒiÝç}G:*Ëê²s<8zIäÍ(õ½l½ôÞ|nÈq3Ó'iª¤MüêÄG¢Ú³¤XÕqF&ø@ª-ímÐö³G/ªÍ·Í åçÓ§¯Iìp[h@±¼.â]Ú!mâïâêªÏʰ]*ô° Íb"«~ÊràoG5Hæ0J¸,(rqPu5ÒÕ{Úm¢Âë:®e\Öd¦ÇôµH·NRý' Ó´<è& bU·2bÆÂà/¬»qS¤Gªºs}C-àå}7Iû@o¨ûÙM|)¦øn^¾\oæ7¹Ë¸G»!Q»]¹:µxQÔ®±+fJ>ör<áï ª¦ÿ¸4è¦DI]l'dÉ´TÆ ¢¦ÓQox5U]Hsí%ç¬-qCO+kçén[µ>ìßoZúeóéëæè¨jøâU´.NXô*ç^Úò HSû! Kñ µqàÇ!-Hú7ùnw6ß TȺìxîA§îØËDQ\Çë½ÏÌEù©kÙi¢áQ XÊ`tá¦ê¶àÿÿÑÏÄF4))Ϲ·ÅîI`¹s_çãã¸ÀÓñâA¤2>Ô<ëDO'ɲ&»Å ¬ízU¨©è½ælñZ|"q¼)=D̾4,ÝVÂLëË6y@"G>ª>ó""kg ª×üêÜ1Jf}7ÎlúÚîa]¢íÈ¿@ü\c2j}>]¾öÓn))åm䬨¯8âÆÞ¦ i=ä K=#&aý¤ÚÌ$âûÝu]ÚxttÐfAî:G¢Ü© U2jã ¡¸Lu¬Ö_pÉ8½\©´d É6»2z'ö[wÈ ÖWæáåë±l`Ku*/#CTÃ"¸Üd²"mß×Êïwbcüu;ÛWë¤× ñî6Ç?]»ëûVGvbÝæßàôôû®R4<öì¸?0Sµ}sIÃ{î?6Ø¢nðIø' [ëÜÉÆ¸PHHÝï!ìø¤&afÞo^wÓÜîy~LSáÒdà+Wgʤ#(øãÅîËJr¥4D4î-f=3Ã^зø|º4ÿÍÕVDDÂÈ¥&²)õ\?"õCã§úØcÉ¿îgb8[|qù2gfÖÔ{ø!Õ1_usUMTEO qbEDQ`Ä®¥Bu¬ffwPÌ;\Þ*Ú5n{ ÚÀº#xÃ-ò1.Çj«Â®qñ©'¸uLÿÛ{1É.²¬ h¦ÿ!03da'¼rÈø7¥ÍbT \¹G5{)¶lû©w%ñV\åWÜ£@´dÇ´EÈ~¨|+[mBu¡5 êÕ²²c±££`ÁÁbOòÀË. tųU´×Qï+L¥:µ`°R×âeS>åÁãMâE£¥%ÙÎwÛ¿n*¬-ò½sêÜßQL;ͶmúÓòçþj¼øÙa<ÃSç ígÊ+H.edJBé-%ÈPtÊõ «Mhäçté[ÕÙªó¥}Ç~ÃWKkîæËRN÷?º¶ ]é ¶1Ñ`âñCü$ÿÑðÌÁh[-¥,vK©áÂìÎÌ9çÖ,Óo [h±¦á$ güÍÔ1¸öÈ6Ûy\F&#ÑÐSxÎUÝlç$e|v¥·þh: ²^rzÀ@mîÐ/>i·¸$ðnUNtÂCó²Ãïòéê Õ';QlºÃÆe çt¾ð.Ü"ÔòíµÜæðX®ÛåÜ}×BúQJ˵żß2/výÆøpÛkÇl~^À@¶sà¡âôAà%[ïð(,²%óþ=6|i@Zͤl¼há{^åÌn,¥8ì ¡T¼Þ÷:TܸLÛ(NIUG _°- ö^*(õÆ *~>ú¶"ØvÊ[¡lOó°"}YþsjÓovÏQ¿(¸l]ÃPºGäÒ©³Á3ÔBvoýpBPumöÍ\é?xºÝa ¨ð Ï@ByVU Ú[¿±ßÓÿé±^ 8tf¸#äØÞÇxwgJXÁk+E¨úZºNáÃp ,XX\ºÄ:Å4¬-Kf©ÞãIeØK:¨re®ïk*R)äñ AuÆè"Ë3Öû=}|Èíq¾\ãìq{ÉDÛoEíïeØï 1X⵩y|åÃÆ©.6WËèL7ãÀpo¨fɺÕ#aýNX°pñx´Zgã>É|¥9 p )¾·4á¶õ%kxZcb Øt@±.úÒ4rÕzH{*+ƱiÄ8\/³IðÐ[qôZkèÀ;ÁOH}¢Ã@®HabrðjØóÝ~7d+UõÁ'¼©¤/-h´ºú áÉý]`᤹ö(NøÉê0¶½Õ)G6K¾öù9Ë8ϲuØX>~äé|wxÿp«³ g³ð®¶¬\«ãZ*éÍ[$%çtw®vºþpýÅ'`îI Ê1¦øßíöNdrïrCH6©â¦ÚoÑ©¬Cj2Ý{%5ËóQ³LMr)tèÆ<5¼´õbÙóÊO½R9³Ó÷/ ÎÜSÐ hr{ïéÌy̨ åâ/×êq` {ÐÔVñÂQ¯óçâ+¹ÅÁ@ó³å=â«Ò AA;5käØÖ{Íî"âÝÍÕôó Ùô~ MfKFÇMÝo³ç§ÉG`k̶²Uýíè¥í0M¹?¸ ÷(è J5¦ûrrO§Dð"ÒN´q3;¨4³ø_$¬õzÚÌ #WKa½ÆÄÔât)Á ¶eÌï°U×óÄõ8ÙiFÞJªÇP$þù^I®#} Xp{@?Ä¡nZ=¸ÞÇI4lw=ù,^æf5Îô~ AäÚ¦Ê÷Áò÷ýFñÔ¡z¶a¯øHG4ä¡V «¦nÏìï -®ñáÛ!%¬û8íþì:Xi@; 8øUÃÔ;s»0u.» Ã@Í%n8AÑM+ñÃýîûìªV¢¥- ò á§÷zJÄÒM<×ö3Þ²Æ÷½çäË̼|8Ìë¨Îë¹SG|Û¸¥Ö\åÆÉHYHÎÃýXú¸ÐÆìYü½°¬B: ¿Ú¨çYDm}Wq90Ë+¿pË´p86ièx²B¸BK[ü±½Íq7zÑ_h~ØT,D 7·iï+ ÏÔ©A¤]\öó¬WÝu¿$7(o¿hxXdµØz_T±SaÓFÚ¤gYe8°yôX@#êAbyö§[×¥}WéSßõM6%=x9²4^úÞDÓÀ,4ÕÊú,kÉB!±¬ÏC£àïL!ö$¸. ÎÈïßx`N¿'[¢Â¿³ðUÑz" 1O)Ns<uÎÒz± £"K°]ÏæP¯ 'J}9U5ö];´¬Ú(ìX;g1ákTv¬©Ò6e³%UÚ ¼Hª§sÎH,·Ìñ<¨ ª½'YægA Q Bhêauhà V' ¸ÿ Màtß»ìS7CiÛ6v^Y2äÙëÇþ¸;RCÏ£ÄÌ3/ξ˰s2#J^þ¸Sþ\ШBèÍÒïÖß±Z+¾±-qÜØNµþ½jú!(.5ÛN=`¾G9òF(ñöÄaC"p(®s§ôvU,˹ü³"?ðt-I QB¾ º ܺðÞá )dì~/²EMÒ3Óï×ͧoÌæ$Rº}g]8ïöJ¹ Ïz¾å{¬¢ÄbZRv¨ÀµhÐÁÑEE³Ô/ýhßÙs4âtjÀ»ÈÕ÷Å5w¤2ÑùrϹ^æ©´/ùBZ´ºDMcã&_ßYØZË\á;g¶UkypYð7°¯¡M¹è% 1°/ÁÈ4#VTûìdêBgD½GE?õý°ýÆÒÿÄi"É1ô#; ,_ÄQXZÑTI3wÁ©KÃ}ÄyvñܽôXóùzè ¨m BåCmë¶.vø:f·öàÎ,F¨}ì̡Ⱥçǰ¡Á(ª³7´ÕöO *¦I;ß×udÛ$L½ ý°ñÃýä~ø þÚÁ¿ÈO~æû ãÇ&I ÐçùXî´³ ëÀ 9ß|sÚ©qßÞñ_ a1~IÇX±fH9$Ðé nÖñ±oÈz¿³<gUvþàéÚv¢`»Øti#ýc¿Ç0Æ×Þn¡W¡ÎúÝåìì9»sfT8OÍùÍE,åJ2w%Å%æ°â²êöz`UòP¶Ý{úúÖÇ ®dQëÈÖÏ,eLfw%[ïÊz±Pu¾ê§'q%ñ0}û´p7/ wj}Ò·W9¶ÔôèYÔ¢A$ú>á(OÆ££ðÖ$ÆÔ( E. ¬bOEmt×Rÿ¤¡Oö0¨É8]d¡±ø¶¶fƬŤ¹çÆÃ_[LZ·{M·CAeO¨ B:Óñ)¶ÍédÁ>.zó¥¹vxº¡ HåQÐIñ@&Lüÿ?À³ïF¨H+µÐ*uf½¾ìÛ}±7æùuo-]7.9´ÇBTâ·EBÎþHGÖèhÜÆC5AÔ|«0ÂV¨"¾X¨ÅÐjªmãÛæmCíÎ9vþâlö~7<!8µlw¶ ÇYx×=,WOY§Dhækâ<Qß®I÷ÝfR )âpÃÃêý³ÃG¡?;u¡ [B`ÑÙ|¯Ç>ª8Þú=HùOF¨ãzI±WFÊKÙíÅç»äÔmúAñ ÀÕµí$ÁRNiJ0Æ[¢/>øÿ?àøÆPh°íA±T(uælÆ' äݽÍ2å~ â¼dj^«¸.¡viØèãæÁk#`w@«¿4b>Eîj©´Ô;\ÜFçÇTT7ztÁΨ° IÊæê)=knpKÿ!òÝÑé Î?à´X~_ÍUjöR]EÒÌ[DqÌsX<Î ¹qGtW»Äº23Ì.¸pÚÞ VÝwíÇ»Ûçi²È· Îò² 1& Ü<ðL^º¥oéöé2eRîûi2áÒ\õ) ¤p· nCÒYDêF8óJºíÓ¼"°8ÁëÃ,t;íB?,'S«XJº@7AÀAV-_°Ó$Ì̱£N[p9®½Û:M{ ²D¼6Ù×]o#ì/n_'K¯UÆÜËp&±_ªÀýÜøJ¡Lc2MYͽLmpÉi0>`ÉßðK8'°|FÚ¡O Ò![ëÅ' )Oí< ýK¾º(:(PJC1 !Ѹ÷ÿÀ+7h"¾@B ´ÊÐòÐsîŲ!$LÒîÜ9ç¾Ó ©"Ïp²í Èþuó§½éw¤õÁ=ó(dç½Ï©ç,sdªlÃñe~ekPïu4QÇ\^ÕÓiÁ,AµlüèE]>Ùµ¡l"µ¸ÓMñ·cß4^áìÁS>?¾zPÓ^¤[ wSI%¬oµ¢´ ÷UØÒIËÂ×]9k45Ò_0þZ è¢ÝäÌÖ7® øf `Ͷ$® ¾m"Zl|éiæ«éb%ÞòÒ}N ØÎâ¡G H%nο½RÄÈ [ ]CÔ¨ Nïn4¶ÐKÆö¹è(x¸=Ãì/½ëQ[ðeZ§ÉgúÐù,C¿:@JÓà7ÖeröNnpÏÖlº-Ù·ÑsûtoÄÝGpD©@tÖª(Ù&"f rÛ¢KDÏÒßã8¦ÃSÝ#ü ÖC´<^ úÙ \X"lÝùþÙ ëEôãÉ&ñAÜs£Í ÐÇ«±r?ðVÚ FÜÑñ' 6õ29zmÚ¡6åê\!`nñÓ´`<LËÁ®(°\àþ7õ,¶±U´¶®¨J ¨D}uðc´ ÚáÆè^=b ¼Ø½eüÌqÀ`gXUlàTÌÙ%M£Ó\êu±[k½M;'´s7ÿµlz3W-¢$Ù9®s`+_»!त(ÜBOT @Ü:7¯)päãËw¼\Ý9°°ÍBØó¼Ò ¡.§UYþT3(ßý4ç`/AO½ÅU<ûÃ÷>Y òÚ°¥khÉbý®W÷aj¶øZÇlªlB#þø\%üï5ÍRæFu·£äÖñx>t}`q%ßßsY°¬ÆläÙ¸cûª£ðãë¢ÃæÐ¹Þκ¶¡ h[ ¥åRÁP¼Ä_>þ×ñFãbDîB[©3»¨o}9mÚ³gfÏÎðO¹ÚÖj×û ûô¸TQÛwÙíFJÿ«n¥×ù8 üN·ËL®|XîmfåÇÝ1e± ~¥l&ÃäÏBcbæÃæÈË{æ®°ð^1TÕJ<)`¸Æ¤þÐÓ«Xa½º^«Úßdͪ´Ö¡qϸñ¢`ɰ4(IÑ_[/$¥ëã´J¥ÕRW7 #í%ú D¹M¹YzYÏÌÔ<îv·³çÌåL¥Ò´nºtûUЫ¨û> ¹m8 n¦Å '[*g!ÔÄ}ÂVï+6G|¥15ïoJ×Õqq0Yq]÷f5¦6a¡w]s=IcÖf dL.Ë}ò´ÎÈO¸»Í~æ°ñ ¸°# Ï5ɤàä&ý/«f[öOzãi>§n«íÚj¡·Ñr^ŧȿàéÚVhsiÓl±&¥Ú¢â¥E ¢ßà¿ëøâ (´b6MÓÖsfoyìÎÎÎìýú8â½nåsËw¦æþ !¢S}d<,±NÄÄåaä$2á0«!B¹D£äÎ÷¸:R¹ ûQ2Öô3VvRUx±û-ß| q£ Ý¢Jn<ÛnDí$âW?::Ä9wËàwlkÙ'hÚ³QäµÕ¨lèñÑ!4?ÍVºæ2 !½ÒYßwïFeÆøF.<?=¼<ëöÌ*5Ëg/oßS×D3è5_æ)rÛè6ã`Ìh.¿.ö´¬ôiôÛ¢?ÊtëwûñD\"yWÍ«°é´b{{ð®\O_ýqîÐüc¤ÙÎ3ç ¶Áí «ïìy%Ëå®ì#çä:ö.ºiEþfغê¨S»Ë`;s]ûO ÖÚK}o¦n$Ýy³óf `ö÷f.¾], õÔ)p|SiyyOõ lÎhÛ Õ´æsTqØîðÎÓEv?,º=ïáÒÒù©kYJlx ýò7ದób}Ås H1¬ç4álQ"Û«Yº[N«ðjÀ-+dتyV^ÆÄ9*ñ ¦ÃþëS×j9ð?º(êJKå!B AÆÿÿ]iâF å° ¥çÌ-q 4éÌ;÷!C{¦ºãìrR³ÊáUµZå{~g½Yc®eÞ³EÁbT>ã]§qÄyc§YÇQU0ª(ýÉ5}&3wSü´ÆÝQ8{º£ Uf1 ¥ kôñøvÇɼ͹²E_Õ³JâWw5?ýw âVJ@¹Z5¾¦éôúýúö¥o}iL±A" Òs4é!¢°Ù³;söd ¬ièFÄ-æ<i]7îgG¯Õ*×b8^ôØõ[945÷®·-xò÷ ÙñÖ 4A§__ɾ76^÷SoFÈß®eg¦¾v¦»ÈàÖHYëªÕÌá+Xïi)´XyÝÕ¾ú$TÐÕµÞ+tðõjW~÷¨a¨@/UDë¯`!½øG|#å£íYÞXdh(B×]ôêɪSgly6Èê¯ ¼EIJ#ú4Ip,åÑoëf9%'M´Ñ:jõ ªMLz >_Éýk-<ä4T]Nù?ðtm; A´´Ðn×ô$ xÊ7øÿßá5ØTÛÒ]ÏÙ^x ÛôKÆ\@æÐ¢Â2 cÈár¿Îz»£ ´hüðnÂÕ3ÎO|Ç7ýÛ®]¥£]%-jZG'¾×0ùÃòÍkÄÉûÇä®VñËé0#s\®;âï¤Ü|wÑÚÀ÷7¿[«5ß¼|7³Ðë>_Wõ¼Þ?.S;Ñ;c4<(¼UÛçEûe½7AÓÿ4o´ßߥ.ÎÌÎ#YFþ!ÓÔ?¶-kÿ\OpbÈ^¯£ 6NsCÁ;V$ÔöéAy¦2ª%%ÙµÒ¤_Ë" H¡ï»·Kò4çW,ú\BT<c¬º}H.Ý(D!>y÷u6C§q?uh`¬Ì4ö çaìcÿJÃgçAç>´SÇtûj:è¥iæ©å{ì!*eÕÞèmè]6Ñ-xQÏTáh¥uíø}¬àÌQ-Ô6H|/© a^þ@Ôµ,%ÁKxdT RâÑðÿ?Àòh)¥IbØ$¬=3n`C%ÞÙ?¬wä5¥ãíÖV"½²ùÖÌìVÑ6¬®!óîÙý Ù±è7ß×"¨¤' tìSºåCA7Ä"ºã¼½9 Ú(sHã02¬\<,.è vÐî3fÂUg·©ÉÊMYà¢wÓ{î»æLðàóŧ8õâ3Â{<Ä'YÂh#^NSui¾Ýb«9=ùæ?¸D(Ó`öÒûbñÍ¥ïêC¾êYñ¯æ,iNSdϪÊ'_ò4a{µï7²áê]{Ý6Ö°i(ªµªmJ'cÜÏÒ'D Ú{êG¦q1Ët½¿$Êê$4|Lö @g'Õx]Q"kìP¯ìu<2üü¶â[㩺 HK¡w«jh<=ð þÿÅñ¢B"¯Z¡Buf¯$ îcö1;fyç~Qu=cÝv¶¾¹XÅ(kìrq&%»äéFT ²ÜmÙª±åà}ó:¬}Ô©`Py6L.5(§¶Ì+ûî2]ÂíênÍ ß[K=/xئdYüL§Ç»&îúq;Õ FS²9\üE¸ ÃÀ}óñ*â¹YÑ<¼¿òg$Ta4ù:#VÍÆÈL)Éyþà·ªj½ à®] \fvȺġTçGí^ =9×u`?+ÚBTu<kU m¾Ámú5>¬&ï ¼}òê}Ó±oÏ»d?Éé_º²¡ Ú Hjl(Æÿÿï>ùbâH¶t£¥xÎ_ÐåÎ9g3FÞ³dåkï®Ì>·Ç«Ø1U`ªÕ|j¢~S qpÿÏÌ·}³-(8ûhFz(tÙ¶ ö'îy>¯!Åía»'Ø[}Ô©/ÿDx]Öqb ñZídMéÖ³U«é¹¯ B_D AHq«pÏ'cÄ o4EÁN<g.>ßßbÝùéÉ|½iµ¦~ò¬Ô F µ0¸Ã&©ñgp´;3 %\Øýýò®QyO%b,K»$ÙOä-Bm?»ð[X7(ÇË~'8VéÚyßó® í!t¿)ÃÐ&´K®©Téu|ÿôʵYùümÕ!,K@ÀX²I¨éû"5iDv¤J+)AÈ9Âx¸Ë˶|KK²¼ÀÈhúµ3/ÊòO ø]âMÛµQ©vÚ ¢²6âÉkLþ{®bbÅçév÷ºù*;Î&¨&èLô¯Q·SF7>Íâ«ç±ÆUº.q"s«,ôô½ÍG×Élþ]ûü ozB(Qq|ØúþÆâ©ÔuÝÇn¯ÏákT óO%m04Öý¿Úïr}YÆ6'£N\öâ¤J»ÝdT0§$eî¯õÇê$}?þ¯ËqÔ©3ë«0¡É¶Ø¬uö>¾øh[ ØæÜ íyò hÉL·¾NúyXw½ì6ÅKáÑ Î5&º>¾óþk7Á~°ìãâýxÔl¶ú]ölD §¾-ô¥ÆÌyºË;¥,4JÁÒGÙùe£F¬½,'?¬[Zv± cYäâÜ7b QY¢§´J º#9ùöàÚz ök½(ÎF&êí©µ¤e+©\¤àCØÛtÄ2ÎÙѵmSU[Tyb ëãÀY Ûî±Päy"Í'Ëï§æ¶0ãP* µWÄRÐ\)D7 úx`3«ïþª¿óÁñËRâª[þ;åpbcö"¹A¾Õ2 ¬k4Hl19PvycÕ#£0°õÚÉ}¨ìû7gÛÖÆ qÓR©ÏªÎ¢D&þÙ¢-Ì_l¾Ä¨Î£ÄAÒ˯Ó8 ÓÚo¢ÞjYÀźy}ÈÓ¶«ò çñ!çâsñ;ÉÜùúiÆv=S³aiÁý e¢!Òùÿ!¬9åÍJFOî²GAV?ª*ÛMÞÃßúÚ8½?ºº ÈGÊ´\û¢¨il|Ñ'ÿÿoñÕDh%0-P>êÌ._IS¸ã¸ÛÙqv«+=âo¬±)ØZÚN§7 ÂThrX»Þ4ÜUï4¼Q}yú@ä¸8$Yø¢ç¾®-#½À¬³dvo¤¢F¨ IiMLORëÆ7Ý$£ea²æ·4gÊM6t´¢ãnùÍ@¡4;PKÌ5;-]Oùá.¢jÍzE?¹®ZÒ}kkè(§¬s÷~%×H%Ë%·À uK øs@puù^Ë$®+ q¿h¦ÁÛ¿2C±ÇQ¯°4Ó´ô|ª¬MvÊó/bªjÀ¢¯ñIûLy6B~`¶«Ë¼vE|lI Ð/@½§ÐHjÖVä¶/·ÕëÖ¼$áÚo6±Ôëo;sá9N~{l?÷ß÷«eÅö ÃY]±{ç¿xOñÚ àæ@7ÑT KóIÛª²-Ë¢ ãà1Çw<r,ã@ÅÀ'#®°næGxùühvVºô"uæXàW veE DOõ/üe¿¥§&51±\ ¶RÀ÷ ñÊXØ}óÞ¾Ù»õÅêk]æß§ö&(°üag;mÜFxã¾Å÷ Ùªrºa, ®pÒëGs2ðprÄÇ«uôÉiªØmq¦ ½.ü_ÕHô¸t¨ÁrOv¸þ4' â2\/!ð£ÛÒñÄß«©¥õq¯«RÛåRt4 %ZøõÀr¦q1_àì" åpVEu\ÿ0èæ ^y|éÛ ªj¡k½¯m ):7K³ÕägÌÃ|njmM@-r*þû¾øis FNw Léo4Ê£ÌMçà¢ríÑÕæO byÙBÀ`P`Ã?øÃþîü ¹É.AJj»Ëå= 02¿pï¶¡åDÚíâ9Ìfw_ØÞ÷×f'kkÝÛÍ^wvi>´Mðm>ãÿ.®ÉbIÅ$M-óÜIµÖªH²nÏUÿùp8K8©ÿZDz5%ýäíÃöD«Uç§E§9÷FÇËQd!óG¯ü¡[̯Õ?¬âÁZfÿ0C#Öm9JÞåtpJò%Ô-è Kc@?|hL[»Ô@-XÓe¤]¢ñd²N2ÜÌÑ'Ñý/f¾sã'$j -7¥ßoÑná¦0® Ím9â#Ë:¹Ë]ÂxKZiTã¿0u%K Q0Yf¦¹`É?Xåÿß¼yñâÁX@Ya3 V ©ñDGNú¤»L©Hgvà{þö0²"HnyòoÔÌ;,`å_ &½o¢4e¤gÕÓÒÔ.aØ9tËK1úUPRäFð F%ÅÑõèóN?)l ?âË4Ô}ÎQRÑÇ·²~m_ç ¸Â¶'1d'XÈ~A¢²È¸¸dB'2õâ*cDµ¡;åÿÍ«eô¸ú%?8®x»î;Jp¹¶7ééiÜ¢^Ap×Bbuàä̬àâ[®?'®xuãé6U!õÂbÎ5ÁÄò&eÁ¢±PÒ û±î9w©3¤So¾¶o(çW ðwÛB×ÕÒ3¹4ÁZXq%ÐL#nÖñ z}öe}ÁBlIáæäÞ**eÁhS~* éë8%z³FSÒ߯ÙjMr8äö°.hÔ;:C,Ægn¤ú }eÐ ?#aʱ:ãé97<aüçìýkn¬ÿXå8ÎÙçâÛ=dCó<iq5ÑmáÅä®v¼D' Á÷·ì`I±Åç}e/Ï¿Õý)Òä àBú/*Ëk|÷¼l Uå«Ó»°Ç+ü[CÀÓ~v 4¯pXµFó]eÐ(üÝa?¤´ ÁD×ÖjdøÒoó¬>í·udXâÙ5qÜÅÑJ÷7Ç@êÞ8y Ç5Þr ) {0°ä;åeÂe\ªxùÎýu¹Ã¦÷¶µ_M{?ÛbH*D¬ñ&'L$ÃáÞüÀh¯WëýÛ¥ËgFú+Ù±ñÄòåE} 9hÀ~qÊ5ÚÍÓ^a×ß&>açÝeØc)LäßAjôâ/øDãìØÌæwz¢Ø:ÉxØÒÈ©´Nkè6nx¶Fhý+ñ)!<AR ê9Ô±ù©«ëMwD=(ÐXѤýÿ¿ ?£Iß&MM?¬i"FäC-tfï ¼C ·;;·3ë-=rëØø£çsòë4M/¢ñð-ÛjuÄÛÍ~¾ ¸¥¼C©aÍN:»²ãÔÀ«<D1ëf"a*ÚìÞ¦Ãð aÊÓI£NQ düæ¬w:Ú"¬TE|Üvõ5¼/OT0e+ðÊæ|: !Uyò(G'Ý_çHX´Mn.7ѯ ³Ì³ÀüÓZéï5£S¥r¼Ü?\=³ ài½RrIà³_g*R»HhÖaÂÊk] q°gu¯ÏËÕÝüåiǯÍÀiwüG>¤ÙOßÌ--LMdi:Ã8iVcß«ªÝgè9LUó,* c&%óËõo¥ôh¥ í:kBi0VîÅ¢þgQ ð Ów;I J_ë¹Z *j²I?WîêJSß"S(TêÛ`,k+» ü¾2]Ù·¿xÔv|Y˱Qø"\g86çÐÏÄ è#=#gÄ&1|zZvéÑ[.ɨvÑõð-Öîj@àÞßÑ«Wݹ]¤LÕÿÌsÛP¨ðPA{ÅzGö)JGÞ=PB¨¶.*p>¶)ªÜÒç8`ýµÉ \³Ì+ÄDHà éâ«,µÆ §"@i[õú «R& Hiò 6Óh/ýþu(k³AP!>:g÷ê8¸ì=»{ÖÉ:oô¯g ÛiÆÉ¬¥(±éÔÁ(Þ3&m¶«Kÿn0ñS®¹CêiWØFj:'Ú)ÓñÀ`(=6Úi9¦/Dq¿Op¼Ã±ð'Û5õ#ÿéa± i`¶YàB¯zaÔg'%ÍéSlx4¦GGVŦç,'ß,@7(ÒêIàøÓxP o`¬Dûç ÔþÏBEM3sóY t')ü±[I¬E>øÆä+:¬Qú«:, :0ØZIewÀ#W;¹!hÆÖõñ `hêöå¹}ÿfÁWÚ§]êζ.Ìã²¥øL;k¨¦P¥-ZNÛÏaòà: '²GõCKësðáÎ+ó+ù¡T)©¼mrŨäe{SÕ0gZüÅêô.kÚ'»èw¯ômGÁØl«õ¯Ée÷|wTâèk@«å"Ø}çþtplcx¶·¨þÓK~ãVF.á#nþ êZ R!< J)zòàÝÿÿ<P%©JIH²y.vï8r ÙW7½Ñ"æa$¶»+Ú8#© çÞno¶Úã@þÉr¾ûÜÚ"6áæñÑ©)`RýÙª¸ÄZ)x`®)IË µ´*ÉCÞk+®\±uylI±È (xuakL:¶s§öTn}äJ2Wbí^ïDö¾ì ;¯hzE¶^xÚ`ÓH] f?¿ò Ôë¸ÿ6Qóu0éÛÃaóåÎç¥ßÏÍF·Îaù輦íÏs¤¶¶ÄèS£âxfÞ¼"ÀÇoüLª@ N. ¹@ÔèÜe¯{Y²?áÿÿ[eq Aa*vNd[âñ¶÷´¶Ä8,ªë×ñ$å"°Ùð.t õìà r¯.³eÓ©T´À6æZ<ì¹ ·bÐ!Øâ%û°nÆI2øk ¦<îl<_ ºªØ¾ Óà´qYU«VpUõ¹ YCNø;øªJà:?¨.ï[ÊKºF}þÇÕàé2 î6«í/!Ý~%P²ÚéêÕ "ÃÒõ!: =ò ð ÿÿ¯ø ÆhÄ(J¡3· Ä¡°ÇîÌíÎ,EnÀÌϳ >õazj+$çàTÃ0ÝÀÔq%ke®îõÝ ^ñ:`˳Һs§$Gï4Ë_wAÅ:BL?t'gýÂâº]z¡ éI8ÞM?Nsâ2Ï^çßý0ØmW_³Ô¸×Ü6+C+ûH'(ðà´´Aú*#6R¹ñ}¨Àõv²Ú£(ÞsÂj±£vÑDà+41:§©óFÆØ-ív|Ç«éd$]"ÿc} Gb@±Ê!dñõÓ(ãâçyuÚêè~[t#f÷3 M)'£ñ§gäæEîZþoªnuºnÃí]Ql^Þð &p¨?º²¡ jѶl·åB!jbâÿÑ}11Cè-]h=çU^.sgæÌrNoó³¨Ñ±5ÃiÑ[D³,;:ûà;¥?/)ï$P9 zNY¸tküÌ EÂwô¯Br¢ôûÙC)NãIKMV»öT<5yÛ}ÚaWLòÀhUÌ4Ç?Ñ>ò&|AȰIùL}2¸h.r¥5]Æ!i h»x;)r'I,[y.¹ÿ=ép³W`S4²? æECEQ£(ãJë¾íj÷v+»)ª¸eFDiʰÄLPIê²èÜdõþï÷ò±y~}[êþBUe]>ÝÂ`hJù󱫯Þjµ¢À«jÍ]¨²ÓaÎ FÝ^;Í)vàDöAeÀ¾_ú~@½¢Á*àj$±>1÷ T÷5µ#»êÙ<ÄI#CO8:8øÛ6«dhTj£\DZlvÇØ<.oj3>T%:îðYaúÌ~cöéb²W-÷Æ ]º¡Ö^´M¥gºOrÄêõ °1WdÂH,}\0E 8p^æ ß9=`Òæcë¬e@«fëLÅqâªI@Ö+¯£Àõ³z NÿÕ¥¥µÄ'§äU'pù¸øè\JDÝå|¦Ù²0lÃsàþõ¶wÍ vÒ«.CÒöov\QÖ÷"!I.}¯óTasܧD<i o)´4 Å.½NuÞÈùU6Æx°õù"úH8vÔ ¸Ð4Ýï¦?fÚ6ÓæP0ü ÀÓµì&A< ¸á¡RõÐJU{áúÿÿÑÒ$r ãºÌ0`}¤Æúç3_GÛ,!}o´uí-ì{Vf©vàsÑBïtF®[Úoç&º°ÙJ²Ð<˨>½ÙÅ5öÜ3t5ÀÈ ,»Zsྱè\äi$0л¯O¼}pbµ ÐP/=ÍFZØ&UÒ¹óÂu»×&ÑG~`°èÀM§ÔÄ^¢}¨PÓ<µTïöt9éí Û<¸VµÁ±R2évS¨-|`ÇÙäm1ÁTCôûø0ç²iYÁx©pÀ Á¶ mÙ è#$|´×ÛÙ5 Y±)pÇÎ á¤!Zª@"zñ=ü ¬%.:Ðæ,îÐ4:4ÔE¥ØëÒËÞrFÎ;N¤wó6*å6Ñ×ï®·ûdà® !Ù"h{PîßÒeí$ÂT +ëøX«ø¨ý zóp{Àú:z«ÿ ÚäØª[ÿ©Ü¥f`4j( L&}º<Äc=,£â2§#4Ý7ZþxbòÆ»D9´(,s$ϧÛVÛÝfÀ7ÎKÅ¡5r¯ÄU£«ÀÆôâh¬ÿ"QÚà0y].3:ÕÆ=+;#ÛnàPì|À£Þí$꽬¨ª\Ïg~àéÚv¢ `¸¨ÓZÓÆÆç&ýÿoiÒ¤Ö4¦m"JPe·3ç />mÝÙ9·÷IhÄdH,Äjì \} 45EdIT^üK§ó2b*eà !"FâùÙk?L}r¬×@ÛëqÍQ÷K;e2Uõ.ÉÊ<×9Vºº°TÌÑ^FÀÈf¢%1³jñH\üAét¾ß~~]GúÒ¹½mÑÀ³"ÓÒ¤öV(A©üG^£G}LØÍ EpuRì;Ü×8Õê(¬á$³¯Ý©òíØösxmYµÛÛ¹¤-j_À®)òá°õ %°æ*[Êw¡yßÐûñ9Ü?êfvÏx¼÷§%"·ëÏe;(¥5 ¾JZXÏÓe¶óõ3¦íw »Óë÷õ]o9`!M×:µ±Ú)[î \J|ÿòÝO4`t¿ñû·XÌÓÃêEV¾É"BI éÄ«Ûd) »*jì×¥éìºr{îM«ÀøciV,{¹+&va/ vÙÃÎr$÷â_ ¯ÿ-#i«¬{*¨¹Hº;º,³nðZ¾2ær×W«·¹ðÍË6ÕdEêC*¬é99QhBE ÛºDñ<U!Uéÿ§¯ÉËçûðeu¢Êîò»ÑPÁâáøaç/`ýïCæ9$u}]º&hqúÈáÔ¯¢0ÉëLWîñßzdqúý$˺;ÄFZݵ4297-#ÍÇL(}dP¤ºÐ)çwµj ùòoÀ£)6Lo¦ó?ëèíG¾Ü<ä;Ñ4²U§?ßh¹\åü&|+é¯qÃ'±nT¢öZ Ñôø5¢3ߢï¾ôÇp(Ç è<b $d¥àkkY«ë?Iªn¡Ò>#g¿¯ñTL×meܲJ»¼|4Ýõ^Éã¾³,-ܶ#?ññúv¥zü8DtÛôVµÚ¬/¥-ìH)fdèS$*@U¥¬6¬F¡b¡Ò-6*üâÏÍàÚð´@ÉTï¯]uÒÈøÉÉuZÓÆTú¸b§ç°äåg©(ücõoïé7¦z]D/qsj3¾!àÆëÊe.[¡w-.w RZÀçä ä3J·ÅÈsêû6Ü?|ïêÆ~§#EIáuRµÜΦn¡ ¿×õý §2bÿ.¨©íÈeH*"R¾ ËÅåóÌ4ÊDV´Hû¨tYO³Òõ<ñaØÓn5/:tÁp±GȧÏ2låjdË6Zã "$D¨Åî/)n[Ùéé1iÀÖi¶´¶>óëôÀê¶ÃÂÕÇ=[À§ÍBsRv°äÈ#ê³Ë-Ë]:32;²°¨º¤dîÈoÜt¹ýÆ6]9ì©*§¥O3©è*Àiv'j\ÚN ³EȦüçÚ¥>ô'ÖÒ_£É{dL*°Dá"qüÕëâð)ÂzwËç9å(´ÂCàÊVpü}+5K X 8éJfF¹ :ï3¦pÇÑ¿ñ\ EvAéæ_ë¢gª(Ì0u5= A¥¥À*.iÚ ãÕ?ßÿM#>ZJ}o¢èÎîÌfæ=l*i$j¿Awmj,úîç<M±û=T׿TÐÅnQ 6²¦ÞjVÖuÓb¶:=+â«M"lbwÅIc£ªJ£ pmúîÂìXåÄÔ¢ ãV®:LÄrøµ¯>'¹Èe+×w:.ÁvßݯƺÒ(oO[òžEnXëÀð¥EüR² ` 8LH W Àytr¤¸©>òÁHe°U<IV¹(ºñª×·µgDVÐöAD¥Î®§[²AKLf½§Ì"¨m 3=ÌG#Í õDæ3M$FÖ¬pßÍ¢iæ[G (Ye·_r_@¦Ó¹a²{êûmÂX÷þØÒ"¢$ðÓUuâ|úÄdF~!'ñgñå| ýq506*¾ª{G¬ùÒçpøýÂoàPpÆH6ÕlÁÿGLÝø¢vU?æ¹6ãs¹@ÍGBçÞ7[-"f"úá` áÓËÝHG+'¿0uEË Â@0ètZÛÿÿ?ú}èôI[;jQP¤»wÈøÃdr·ìíÚB( ß^7 IÚÝ© O>qvlÍ +¤ Pë5Yݦ¾!X} *Ô˦»Et ¨mkR¦ïýÿ¿èsôÅ[ä¢Ò¥3»}1<O³;{ézu±YÅîM ("ìU£¦(nKæc ÀhQãR$©ö²²ÔËïHV;Y§Mîùq´Zß*q/"oÑÀJà ۮk²\î$)¬ëF¦@TÔ¯emûLÌgæ(|Æ|n6ÓiS=@à;`%EÓ@#u³×wêôÛ4\ åêEÚñ¨5;=úw¨rå69'ïÞ^Ã÷ïèì#ºÖ N?þnÇ-a7ðz[Ïç{SáöÃý4ËìL0]Ѥ Óuá(¾¢]{ú¢è R`³º(E.ÚN^ûíDPaÐwÇÛ@ÉaögÊÃÞ°}¼ElÒJ¶3E^JT<Ùï^Õ(#Éb®í l=d¾ègûçWèiG5ë&K6¡AFÇÐP5èI^̦&K¹0CÑT£v4@^H&(¼ÞmÝÌA ì¥E)ÕâbWÒÛ9 T¼§»8GѾb¤ HÑfz3|ýHF¡¶å/¼~lVR5)ÀNt` R°´I[úÿÓÄÔ´öfÚµ4rU:³¤/>A9gÝÛqä¤Á)oýÝl£&C\åU³¶Sɧ@N âmMÍ. h«)I¬zDZô´7´&ÑÎõfjØÛT(Úäã¤Üô9wvÙÖµ<@ññ]ßmqÑ]-EÜÄP5}çsó ß¶XÌájõC<÷³èqùB, ¤í`uÏ_«Dõ:}ã¦Ø±5¢,RÃzÄØùÉ3áCJÊOy§ðu8D@ä0äeµBäE>óôZ!a»ÍsêS³6¾§¶jxMÎAEÕû0ãY=ý{ÿYfµ-å =Z <CÎz®µø~µ~ úÀ[×ûþ1±=Í-Ë\ÉK°ýI÷t¸ÖoþhÄ$>¡[¡Lên ´=&ò72öD¹Áx<aß¼p<\ÙøOd]ÿ;îe ëgt®ù¸Àá_åþäz{Ýî¾>.ðídÛºtE¿°¡ÞåÌu}k=ð½xVUÛ3"@hê+fÒ/â#² xzH¬ÀÖáÙÔ`ÑK ÑfýÉLÏ áéÓscÌU&³nnf¿¦øÍ;FÿfaBË :T©¨ÀTÁùÞ±Ì:pbÃg©ÝÑTK®Ð?ÚÀt@¼Cï;PÓg1Ó8²¹sn W;1ðïwÁÙNâàÜ\¤^×9yÁþ`êZàf y âQK ðÿÂÀA/¥<CB¨Äîéòâìfvºgvº=rYs· öçËbnÚ¡ÍFüjIÄt;Jp\¿Úl Ö|Ï:>Î+ÐõìiNÙtµÚµÐañL1¶FÓé»àÁÿ?"<H9lØTV´±(¥ã;ªÐ1Zm@iÎ4X2@On RìÅKZ©æ£ÉwÿüãÌoê¤IÜ¢('q°ü^¿]uT 8óLLò±$ õáÅŪ6¾5âÇï@/õl)3ç¨Z]*lO¢jUHã m¯,»OÑȵ6ñu_¹B6@$¨wÄ*C¶uí@NÒj[ù!6÷¹±'VNGÞâ·b7гÀÜIt¢DiµX[<ëãþP»?ºå¡ $/q£®^ÿ?æ3rÈ)½Êr î¨Ê ¥¾YzæõL;¾1T*k«ùhø4«f µ4%Ku ÑDÝ·=ÀÞÿIlÙ/³dÓÍ©ÊÝ9bö eæàD¾×·ÒUMIr£*[Pë¡RÑ>MÉ)«4Çn4æäU ÷däH!ëù|§ïÍ2-*(WØV®C»éºæ¦,µm¸ ËXýÄùXÈL ]è¯^ îß7ù~:[&®hCà*ù¨5C©¸³Ù/g\»-éåûpm@@B[¬`BZ}ïd]rÝ¥ì2A(ÏÌ:Sñ¤4u áúêKµòÝQ¯êäõlo{ÚÚ®WëÕâIeÕÿ]ÕÐP ÚÇapL8ºÞÐû¨«éI¢ ¤_j{FñÿÿO&Ô] HKK»m|o¦â6m¶³ó±óæ½+_|0æGoi"̾´~;Ô±pqXΨo¢XeíþgØ)~6"I+ 4]ñÅÔY&¡tñ¿_Ý jîô°³¦®Ò9óe=Ð!É×ì¾ôé$.`r2TäÕñjòâãà Ý"¯Ý {ö-Ä{f7DêçÇðöNõz±W|eH ëO;¹¿Y÷ôüm°¯sÛtuÕ»þW ê¾j?áÿ41Ñ@Z)-%åÙ-~ 618k,@9 ÀÏ# ÆBÓFïÊ¿înn±Ös·SÉcûaÿ,hT!뱡Aë¿M®·Ý½ëAêsXû¾öë³xVÄib½Ä§6ïkñôüò>æ\/=¹Ò=K?¹¢6éZß4ËÃéqY`mê==q½«xc°dè¸ÑjA° ${i'¡f ¿³='¨eCî<O¨|Ðxç÷qäâ)j×êív¸Jú=ÿrç¼Þ¿¤¿Uµµïpz%S¯¡´ÊL·x(éó d«]×87ªûmÔøÃÙ¢19¶ë ec"æ 6©_øÇcÿK"Vk-¥5´|@WàÙfû2tfVò&¥ÇÈÙ_xºå AÞ[,«rÍÿÿEC~ 9HB¬îñ*%¥ûèíf12uÑÿ$,T /ëPlWð÷ê4°ðn"1k¾/dññî4ÜsÇ HqSBëKí*6oò:36w=rMVà³>eqÛvsÝc /ÄæAÁåÄ.Wá)@Ý[X8 §^«+I¥Ã}{¦´º&j2K-@a)9j³.Ã{ýÚ³h`ߺ(&þ_ø&¨Õ$´_á÷aó²þþkËj¤~}ÿh#Ù´]w¦Úg¾ÃÐ_ ò.à¿TÖÌ¢/øîÛWã_Ú¥§ÏÜηçªîàÍÔ÷²$BØi ¶äè,ñfJ/Vey¹ÓÂÀ|Û,êzåÏ$FDîëTj¥²Szîåë´[&|4&<3Jï¹WG¿mÇgÑsEV¤±Øo3Û X9Né9ÝqxatÂUyÁbü¨Äý$ÄÆa¨]Óݪ>#V1´80Nùºº¿xù¨i¯pÇ6ãjÀtSÚx/NÈAÐ6®»6GlRb©tFwÍf4B ,DwÙTq¬,[ðÛÔ\0ÇR+AÄmÚ-î¦ã¶P[,%¢²µÛ' ]L"Moá¿=6>D® µç`¾R¢ëJ/C¶g®ó¹Ýôê×órF"r®³òÒ¨ÃÝç Iµà $/QÖû4FDJÈÄVµh* ßÏB3Ä¿¨zz¸ .Ã×t³±ûïã¾w ËHsí¥KD$W8Ø3v½Ùï¬Û<ÏsíÇ(ýÙ}ñÉ8ð/úöb RjlU´ ÕßaûÛåÖ[U.Qâ{BäCøùáH6µG,íË\øÄñÁ²!TGi%Ц¶ÇÊ«&±Zþ#ú-hLÚñ4]Y{<1=f4H¥°®j{[¤àöÐâ0"ÆR§·æáçuöÝÏ|w·jù¡o2Ó5Z²ã&Y.M2ÓåIÅ,¦N¼Í¹É<©è[»kÚð êÌ\YÞt ¶Xº8ÎÖ,¦&vS3:?bÓô"®`ôÔs¥ò»°ØgJY8jÎà¿Q·#³Up!sWÙyØ2b Ll«Ûç×u»3»QôÖ ÅÏFj6` /úòäx±à ¾ïVNÝ6ÏOåEԪʦ´%PÜà@ª*´>é<'ãdp¹ÈöþGÝV×U V>É@ÐëÖ߯ÇÊ:Ï· ÚHa!.üÿ_aãDA"Ë£gf Û×f5në¤,B¿|dd0-"3U6 (ÞÏ:âZ'A¢´+ó¯Ðu´¶]Uÿ÷ElÒ¹ vØ72×ΣåF+ ;!ú¯Ò²¶ág`þÖssô'.¡Z¼¶a~´W'°¯Ó"c%tx¾7mÎ-;ÒKÇ+¯ö¾ç¢êåVym¯ 'î/Ëü±Ï¾ã4ôN r!Û\M»5F8 ÀÔµì4Á$ní$} ª <¾çàÌ¥ ú8PhZEÙu#°µöîzwvë¯zñ¹ïóuü:_°bÐzD Ølèð.mãÊêPyÅG$EÚÒÝ^wu=_¹3¨õÐ6A²õ°¾!>bÏ$Õa±oÐã/T{ññ·æÁ:¨èqÀ@%ßÍtC%MYêíª¾¥KyYj°ÉÏ¡ÇÓà_lÆ#ã$¾û4É~èµ_¦<¸ÕÇ÷Uyñ¾Kß´î´ÚÛiá;âòû*7Ƹ¸óg;WJ®±kÚ,<ÎB¾\.©F¾÷8ýXÿ0*l".U w¿~¾OD¨ûílÙëÙ·7+¸Mrïü;¬·>ضä5#jP°^DÛê¦ÒB>fyÆZö¹¶FíªjÞnVÏØ±aW4Þý@ccüI©]O2*¨%Kòn¤ü帱Ùİ`èJsmë ÌÓt|?<ÜUTÚÈä#§('Â5+D" ý²Ð÷ ÕÌyá?ÏÊ]Æö0ª6ÙtºP¸õÅ£Ñ`ò{Ê~˧0Ulwwc&f`Ç_ÿÕh*x!9ƸöfÿÄË-ñ¬½åë?|?pÎÍ$}¥Ï¦öü3Üü; ¸}\̬mNĹ{Üsÿ¾£ ie¬Øò~¿wïÞó/´ÈËû·ªºÐ0ÄÜÜeP ³©íÜà ¬c§ú/mk»no/Â0N¬VéÀ÷ñ«ô®µÜ¦Rî*Ë_7ó5*¦Î3Ð}á-÷äÃ]²tûô0t%õ²Z.=a|~4È:2¯(Q§ Jw×*&Âä}<ú×=Új*^k¶Ú˸ùòQÝúýÌáÙ-ljå>½Ø³s¦!Ü©Y@¤×ßÑÕng²,i9vô"¨ÒKó"5+1§=úuãMö½.±÷l¡èj8BÞC=wù]0u-; QÔô¶"Úàb,þÿFWîLD¥GJ_3ª¤ôÎÜs_稤äL\Zy Þ l©,Ä çÝ£®ºÑi/·e"À \k§|ꮨ´t®1sO=Yw´4즰Þ|þ2=ç`Ûð¡) ;Ú¿±°MÕ½¹ãìÕÀ1á÷ã¾û' E7.ÿÿ~.L&XJ¤7-öI[ÏÌKº`qgæÎ¹ó8G¯UvÔß¶mX°î¢Â¢Ö9àÚºy$A`jÌÜ"<Å ûp©$«ÝÍ+T6ç2"Ütõ¾Aãùb éôZ¤¨ém#lgû\'U*ç}úÖ.AH±¢}¤=ÍàX, Y§Éj¾Î§§Ù@¼4ÜtR¡T(§1ñ>Pß(1# Z²áì¼UÃËóýÃòÉ´ú×T>g¶±ÓÌÝ@Íì?ÐÆþþ3Lá?ÝpÐA ´ÌûÚ äÜýWÚã,ðª=|u)VÙÁs¼wPá¼ AÚðt®; AnzZÙ4òþdLü¡ÁËRB©çÌ +Â3ýÄ9äYlwJÄXZ|Mø©:!M¾hKÙÃE{Î{7±Ñ¬Ùñ ÜüêfâÀJ4®Lèã[ËÖ0¸ÙJ»þjä(E©&ócíÞ¹â5å=¯½«YÙ@¢jé¥ð2Ø£Îîñ2áÏ÷å3ý]u&¿_lçð`|MiÖ;|̼Ó-±8!j_ f1ÊÓ¿êéq^¿³ÖóàUYØÄ¡_ïõ@+É :³KÚs¬`°w=ÞÇÌxáò6¸È°* x8Ïæ)rðÇÐg¹cAõ}*¹» ¢§3¾.ù88ùëqæE'× K¬A_?º©J.â×dyIlËkï\#AqrEìv;'sS&F~¼¾Ø»8?skuìN³îÓc¿©Û?ºÞÁ ø iúÏoñëìC¼'l làµ9ŨmÕªÕe( %íÒålk9ØÆy )n@G,ija ¹Ò³YáuêæQ!öÝã§Ë!íuªÙb'´Tb IÇùÛqpàÑPÁìº.v¾;[ØÍù2Ò]2¬ õʲ> äa`ø*ߢ"^à Iü ×ÒÌB^Ô¢±p®è(ÞTíYϳ( ±,Tt¡WqCi4» KRßm¡Æ#Å¥9[:âîß7Ó¾Öì'ÛÊ~¶/ ù EÃc/º2îüÚ{Ä-.êO éൢñÓQäµÔÓÍ}Íwõ °ù¡;¾3¨W«¬Ø6EYâeÀY fs%&ýQz¹Ú¨Ú¹ÂéÖâóÒ±B8](*ÏLï¿ÌSQë³Þf½)¨S p-&1ÞFH@[gFûxxÜ8]6Êý)ÀQ[vHÒQuÃqÙ åq÷ãØ¯¦æá6¤´TÙ°èµt/Ôu><¿×*àÌ-IÄÞS×rD_Îi³bÅ6ÒE¹Ü§bÙ?$F#cê³B?±w\*V£·ý{!iRé%ñG¢øï Z6PB§ë4ã°ÙiG ótCgK ò9Ûìb=¸»QUb'ÞÀ.ï! |ÁîÒ¦ á¯ôY £yÛKÌXÀèÚ¶(ÆÔô»y&10$hF=&eÞe:M¬+`5ó4dHVtæÑ/ÐKûsô'l6º+À|´ôP°Ïøÿ´`8ÂFåÁèwø 'þ6£°Áæj¹Þ<÷/_ê?¯ïßã96õd],×¾®qhüzôʽwk.RìÑ5ë¡cNÎ0û¼1Ý]µÀ RÕ§ÙÓÝ !*¯Í³åº½§À2¹òf©V£Bg¥KuÊa¯¸êpYëp#é],1_0Ó[ ÛöäèÉЩ ÀH/ÒÉ[UqµQûXDdç!H{õ 1aúå·®ÝNÿAÂ/@`8/bPÅmÝÜ4|úÉpÑW©bj0*a¼1ÙÖ7;¶ïÔÍcSgúêTCU@ûËÊ>(iØÍILY5/Õ_@ÞðØõ½Â}ʽV)Òxº¶(زP¶7h%P! D}ðÙö³41Á@KiKqfO%ád({9gf{Îmþ wU¹½Á¸Õ«hrØUG«-§K§`7Ë8ÕDü¾ Ì8á¨¥Ë Â16}WmGq^ÀhµM/e]n²F·æ5fâyX!ö£ù弪F']6°Mnô#â W>?C/àÆ©JZUÝlÍ£al·RQNÑ&k{¼ãáw6:,S4iXµyM¾DBÐÆd>&mÀé÷qQ -:º» ÓT,K>Ì2ë¢â/ã¹r¯mrõ:&yïíÓñMÊînU&¡ï'ql$?ãs(/ýÏM$+L}ñk×é[´í;j¹xWÔ_Ã"ëAIã\îTG ÂÅï.¼[ ? OÂøORQzÔf5Isج¸ ªyÐéf²i¤:y¨*ÛF1U\¥CF£XzZª>"ñ5¢Vèí§[Ü+.Ǧøª³kJ Â0 J¢òa¦VÕLÓôÿÿF?À»Æ«iDüÞw¦âáâpàìÙÝóî³ÖÀ̯}¶bv«LÓ°yÚ)Ø)* dâL9bm1lèuck¸Z'¯Ï7Ê(¢®òc=êP´$©FZçJ]§Úêòð ÍPO-Fí Öó¾OObYÕ&z^²9²&%W1GIC¸Ï´{Býlro§È:í÷õæ%sëqeç÷Ýlü°}fØ0nûµç¹Ñ¶@÷èÛSüûe±´°fr÷té ¸Æb¿->3ëSkf?ªr>qá2Qßými¬Xwi¨Á¸Ë»<þfÎM'9j|jDÀïÂVà!vÄ|¤ûW¸ËøLXóÊå]Åé¸{1UüG\gZRE1æSÄ¥l¦= HçD¼D8óÿKf¾Th®*ÒµÏ|íÿhNE#±ò[Ozf¯ÄaÚôêbCUÁ¡aV«ò}ࣳ ã<MiT¤]°ú=_¥°ÅÄJtÇbëH~´éS ²ËR¬Æ]ØO=xóöaÀæä¸ÿ- Gßk·D³VwÆaïâ'Ëçø õ{26¹ëQy¤®¯X¦oÑÚ¬¿8lF{\rÙï2èW>Êã]åâ>I]|zuoÆ©´ßo]í)´kº¹Lÿ3òv{àW-Íæ']ôknÙ}ß"×)ÓØ'³ ¬fÏc[xMÇlú¥ýÛG$D®ðeáE»ñëaPEƯV+Ñ4ô "4Úh<ôÒ6éÿÿ½õTÓ¤ÖØZÐT ov /xXØ7oçÍÎÙh;S½¬¯ qkéÂ\WÍçº ±Òh3ëÎHt¡gÝqÛa¾vÁoVÕ| YRÿ°XÞeº:N¨X7®Ø£e Ç$ÇXǰûðþ¡ÉêHÜÿ8¯ÒM±Tp*vYëh¾blïÚ¢>üScÜÏ`wç©sÍäÒȨA@QcQ=GíIx<È_3òã'êu-áXö<t¼Ï»po= Ç©¼ZMûÎä ¬øë<èà8 Z>u5i ¹&¡9©ëÌãr¢Þ¾ÿvv$ µ>ÇJ±v´ý'xLH #I t²ä9Í6eº|$ä EÎ+#[ÿà(²ýEé¢N.ð8 Ô4zOÇ»fMÜzìFý ÅEx¥yì,Sh}Á#|Ãtw¼øyÐwHãì¿×&Ó\¦P8'zÒA¨\t½C]£WÎÁäøJùì÷t.. ¾]3¼Ú(Ê0:çÎyPÙSüdAà:ù¤â%«¥ÿ+ k{ò£Àl¨];0¡9ªºäüÿÚJõº6¬"MÒÅ%Ñ]p©^\4ènA]ðâ°ûánµ%V³\âÎÉT]#t/6 Wooü£õïßäftÏï?kSTù6÷*lïåDVú£z©ã;Ѽ=Ôú¸I¶@W[Ö«àñÂÝaH+à'zØkDzåj>ÍvMG'3)2ISmQ!gQ¤LhsÙ£K1mô[6ĽÅÁ¼_<¤*#P5)ª LÉsýr^?ók±çï=J¨B_N "+râdJ¡øW¾ÎFõà7<;ìÇC4Úï|§5 ^tꡬ÷7á3ÙtÆ·ØQe¡ù=aò6¶ÙÊý°rº'))ÎÜÌí{×A1[ÏægSY|Ó.«,$i6;=¯^^-KH=Ó(VôC4âýO # 1ãÄîo¥vñ ó' <¶1¸(róʪËǵ3t,YD&ÒTBèLÂk©!ìÒ¢Qª6"åTØ/²çUý*ÀÿRþò#ðÃ9ýÏóï£èl6¸.´Ôî9;ÊkÁçÒ µÛ¤Í¹KPä¨íràðºØðaÙÊO÷;ÜK|!×4Çó]f²5i^FLÐjeE4àÒùbMÕVeufp¸ÊqÎ8xA,ðv2Ä!¤K$¶ô Â,¬'¢uªé$¢ Ãô69¤®.ü|c#¯«ö7¯gm©¬þ©«mIÂÛunwdNmVRIÑ×~B?¼þ@QE¦±µM×D·ç¿øqør=ç9÷</ê!öæ¶só¾MòÇ\¯üàêTcÌ[§A¢X6×cÛǯÇìQ¹)SF|¼Ò8jÌnól£©È ɺÂ\j½¬ñ.¿#=õÎ \kaãçØ#JZ1%37W´zFDÒ¨Eç¹_aÉvBa JÂ6¾qrÝ>PÞU,/¬ï+lÔöõÑgëò í|1ëK fOä¦^¡Ä {½Ñ>ãEÀZ}-«*{bÔþóã>£¹&§À PðyS¬ô-3!/i=$ñ:< &BÄêëgùy¨)l»&ÌÏsÎÙÈésH¬¿ÅPrãóùEÓîö[HU¤\CÔÒ» 1¾¥ø¢®-\±0+tÃæËk£k«*¤ÞoÜë£!$±ñ}yÔëRdÝg~h%¸² 7¼÷Ñ0¹|+;Åýºï ð+ =ÏåÂIúÏË`nÅ×Ê}YWÙ " Y¥Þ¡~ãL;i¬3r1 ²¢eÄ×.QôJþt h/´AÉ>È»?þ,ÉpÞ{æ¢ å*Z|½on®×â¦3k*CS#Ðø}ñfÀÕUèFÓNV^Ô.®3wÒ²Æm¯z çîÎ[ÒRçãÔÞ(ëUT.¢ôÍ^øo[@-æÀÿqàËâRrDÓ1ÂÙMÃQ?G¦fp°AÕì¯âÒQð)|RNÄèvV~ÿjâPÑúiöºÛ/äH<< ¢´fát²LÙaú5Ë]7³C&ÌP wß Ä7$ÓÛ~ß÷U£ÒaßNÒî÷}¹8çt~ù¦>Àpçïr§[Úaúx¢4ιA5+aÇ£IïÇÖÃU¹]Àøwßïâïõ ? zIæ¦N3ÞGK:d,iv-jö¨ç7 )³e,øy/º¡¬¶m6«´ÌÆÙãàO Y¸Ñx¯®.¬råï Cö0£»&q¿ØýÊÎ}<a$õqÕØ·CuáU '©ç"D²åj?^^¿»ªQò6 ò#ÁÇ äû[¡ã5\#ÇÝP7·/:gökmÀU í×ë]LE¹ ìRN×9e¶Eý (®B¡±vm+ëí¸%N8°ÔÆZû¶±DÿTÈ1Í.çr§Ü^CamVÄmÚn¶ ÞÊ»G×u/µGáÚ¡©0*À¿ Rñ¶ÉýÁí*wÒß*Ú&ñ¶»²Pàyä{R4«Èª0;\¶>¯b¶Dgá·69I¶âÂhh|ð®¨vâ¯"k¢¢xníýïºR}Õ@¥%Sñ?¦ÓlÀ:h g;×Þ #õµ?7ä¨s±ãFuN¦+kXøì{aå@Cã½S®(öÇ;h>Õir3Li}ÞØà ¹( hh$ØSò1hFy}ßP³Dg.TV9]¥ðSÛvôÐ8¬?p0czë⨺¶(h©Pº¥t £ñAã³ïøà Áµ@¯©3çTÐôí=;gÎæHQúa54@<x?ï?2òÄ ¯÷!ãñi[ÌF^Ïe`®úÍ:~[ÅV6yboowØe@<±Ç5ÄöÞ pÚh#¼^Ú<é>è¹}_§jEG¢²â ÅÔ©-6v,9t£·öÆÜ¶ª²-àR¬£¤,'\@·Ið§ÐÌ^ È£lküí óÄ»Ââ6Ç®½KSY9ÊÚ;(¢SG.xêqÌ ^ÀÆ@pü%=!H+4z"æ©©aõ"D"Eï¨ùCVìñPñ¹©6m¸GËåý "¢1k I0 ª[)ÊÍ®àÑQv³`×3ß_þYÑd¬ÁªR³!µV{׫m§Ù¢SÅë¸e)ÑO½r>Ò½8Gc(®üÓü@Ô+'DA9DÐJ0:IafR$eüH&8±@Í(à (f÷´2pw¾w{oß®2Ió¼8¸¶= [2Ù@³J/¯È§Fý´¨mƹØåˤ]l¢§1A~¶2 +òl¹ !EÔ*Êçß!:®Ë:*1lËm!ÞFL¬øë]9aD¾¼moð ï·ÚÓÛ±Rn*.p³·';ítátuñY²ná³ì|sð3 BÃÛÎÄþXmw5bá6,7T¶Þéhyß=lßèF=ÃÁÏ~*¨£öß}@i,.î0Û¼eé¼ÞËäÆHX/ÚoèÀNû¢¹í¦ij/ð!ô·S)µ¿á0}o¾Jn¾âÆîÈgâé|ª Cl²Óײa¨à# B´Æ¸;@¦»éæóM¼Åâ'ävGþÇèZRû2 í¿#svKlû<ã¾d¸Ë%#00? Ð*¾èr,²kòtMò .(É!ñÿ?ç?r³*)(yHÏpóìÎÎö=Ýæiä"Væ¾íÓi¤@ ³I G,Õ"£ë´¦]Å&b·½}ÁçΨ¥ö0ñ_ä iy"«ß×§äÍC²¹ÍÈ:Z¯_ÄL)X'ÔT&2¶Ú¯¬uU¥¹c+ÜøÝAðGpY GvÖ°&8ª¡ãÖlë_ÄÚKS yyx/þËRóŶÆ#1ÁW¬¦Öé¶¾xÀ{d'Zé }[LmãáøÄ±rIa: EXãbU+À÷ìÏÅ·ÒÑ1¨nop&ý3 ÒùÏù¥ru<é]Ä_ÑZç:å}¿Æ[Ý_Í}U¦ÉN|ÇN$t#çhݸ onÒ$ßÎþ«)º=½;¾½VÙ&ÅÁÌ¡¤+þÓCFùhà+&Y(É«¼¿Æ¸[mÂý/Ö°jþì ÜdZnù1") ¤=,¢yPv¤Óe=ã*SüÖRó9;¯u¦§_û!Vºë #©EÙ#£blϽ¼Ð ¤¬²tkáãp(yÄ.,ô@úÉ^1¹W^Xó÷O HÆ àçûì'#Q@Óè«3»I6çìÎîÎÎXëalç÷N®qþHQbêtÆjûd{Ò óÏ»öG!Ê¿"}ÑbcÏ`3@Y¢b¾ÚÌ©+r¹ H¾eçíÄÜТ*¾23ÍrR?º²¡(Hw±ÅL\0ñÅ/ ñWü_?Âè$ÆEQh½]èâÌ9I )pÏ̱ܳM-Ê%2½Bå·8á¶Tð5~oJE ÀN¦lræ'#êqÛKdÌ8C§¢$5+y *æ1²é 7;«¥%HDP._®/§ßëTy c±,Òx´bùEA§yÿÝíù"nîðë&/èoɸ±GØnk/.²«¸C½É@q¹inf®Õ×"ìFÄjæaö? cÒ±(è0ñ</FÞA½/ÕK1eûð¢H&þèÆ|&Õ(Ä´åÂÁÛ}}sæbð <ùBH¨>MNMßi¼}_¹öþÒ@ͶY}h8²´ã%Ä.é"¢qζ4dÆQÏ¥Kªª°)ÓÐúìzíq*YõlÅ:[k²JÛúó»S Ý4Í3S¢ v`Õ8zURÉ 2yÜ X&^À0v5üÜÔ2i üÛ7zÉ>ÌPZ ¥ßÜ(Ñ9â¸ïðû^ð:/Öªègn;Hí ÀÓÕ5%DQ C3H'q~AÿÿGôÒSOe5ô,¦Ð9{ ggåî=w÷|#ݾ¨ù×Ñþ´{òä·uå-ÙH¯;+¿ÆDÓ0 ÑiòëYÍ<¬¨_`|©á¶\z^๹ ÉÃÀ+}¾XûÀºó ZóÁCE9P¶4¬ ) )ÏPéèF½14îC³(9«Èç§oõÕôév<úúÔÞ.h>3YC¢]óïÓoE©m¥?ר*J&bÔ9YNà¦uªRÌûEÈ+gµ2ìæJ=+yªU}Û\iÀ(C ßUÙ2 ÝKW|p)Ê'©µÕlÄè ȬÅÀw63àÂ$#ÍØÀ0¸ÒùùlJÅXPª8Ó ÑUkz1³=¢·¤B;ÿ"gÖáÌbi¥%+ÛArg×»ÉþKÓ1 @wÛás^ÓÝÅÐ ùkéjÞXCrõ/ åbXBÔ¥«ÍÖꬦw÷âûI<ùù ëï£\^,&W" Ù·Èt°p½08 ©6òÊý:<¿|㾺sKDåÇa>ïG+Xæ»ÄwqÏàáeqñ¼i¬~ÕLßË*²UâåÜ/9ZØ:F¸ó¬µý.Íßzþë:ÎcxYr° kòû®x/¯¬[ºæP-JÞ í¹îQ(¢é¹£Ô_¶ëD5vVe~ 5ÅoËÕí4i{¼´¾Ê7Òì%NÚ¢Ìn¶µïEÕº´â¤ú0PäéD¬ÒmëU.!í4²MûùµìÝw-ÎÆoeófÃ*`^MPÙt&Á.±8@wZª"pàVõÁz9ÀtÝ9þhì³¶`:¡iãyÚ×Ro§¡ãÉ Ñí:ñý´u¹®*õI¸d{p̨¯ï»À`Å¡ÚisÉ §{Õã$«Å»¿ÑÃlÛ.?xº¶¡ Xªr°Øª&¿ÃÿõDEnm¹^ÖÝÊ+iÃÝ9»³;6¬ä¥¾y;¸ÉpÛ 8èt±|îT ^JGúð~Ö²¹*²ÐvÚ)ÇeÏθ÷kÇ«i£Gí×ufúÊ1¢v/½ÂTǾ ¬ Ç [#¾ñ½©8~m3x~N¯¿J<{ÍO/OǽÖëc .ë/}ßÉ ®?i; I´OïnÊ uÅYóyê7ݦÐÑÜs ÁóàóÕ¤ep °¿Â y<ßêB¬ÔñǦÙl:·Èeeq5B3Ý|"Éu¨øt»3-¡9a»SM¥¼Ã<}å=ãâT9ĵ¥ÂN»ÜQ2r ¤×Â.À\ACÞú÷*°o®cëN%C3Õu,|0V/>(9îG¥ª¶ºH¦bO3±Mì£j¸¶3Ìøß¥¡JãO *AÀÖ¢ZöÿÿOÇðd*/J3÷b[êûî¹3Ö¥\«Êª³.óèÃß 8Hë\®ôk÷ÛF8! íùáÈ:¡ #¯<ÇÕ$ê}R¨£Lú·<iÚIø7úµ`:4ÊVW=YKÀBx͸ÜG!õÛÉÛËã:ÏÃiß³]Ù]nHÜ©GMË^¾ w*ZèmZNyHÅî=«MUQi·¹ëøªòÊwô³$IæJëEïXºù¥{±,ùíÎïSÖ ÙÞzÄ1±:Êüÿ.Õ nW®/wi{ÛÌnÜ Í»nEU8CÀ©'nÎD½©½àé3¥×e Ç+aíj¿×½GÍI1PaÄ+p'ì¦ýTÍëS¼üÚ øfôÜÂdv÷½Ù÷L'=äc¥åçÇi³hêÕ¨1*FDÀðAØ&e$Tƾʪ$/üåÛ*U §R&àÆæ.u¿µ¦7à ©9 =2¯v¨ÿ~:Nh*©Þî²ÅbºSã5BÚ©©ÕC?þÜ»(J»ÔívXK {pt55+2k¾\Ht\ZØtr §pïJJìÐeTQ ONëizÆ*vÜ IxmvwMÈ@£Ò8´ôÈ&ËÞÏ?ÁàÙÌb®Q2'.Ì_ºÜ 1×1F,q"qÈ5ÎòäKH%,Þð®n@\|Y²Æéµº BZ*SÆî|´@uïû(Kwtzbz(Ìxào}-·Ê`";Ã6 1ÀQy`p'G'@î©hMW'?à½^]bȶæÃ²ÂØ;àW'ûÐD£HàPϪ}}û\¸_+EëÅ)V¹MXoRǶâýúQOÖ?mB£»<¥ô&¬@î@ÙïÕ¼o;ß;vÑÅxM4äú3&p+¿JD7A´Î¼ þÎð\\[¿i1ê¶ÖãhÄsJyÞÐ~ùü¡°òvan*`Ñä˳ùÃD°Í#ÝçP_®Z¦ÇQ¢ÏIoå£#îÍð >ì²øã.XËØN'0ILoB,± ÜR~FM Æ+7n| ß· qe-.mH=gX±"·åÞ3sg¾¹zª²". jGCòî³á&ì¢f¢UêdNÚVáCA@bZÀ+ Ø|ór¼ ¨³¤ÆÙv/É{ßXÓmJýxl½ê÷tÜ7¶74¦#Ëýÿ(§ ¶_ ò\& 6ù÷o³5ì5¶æ1±§¤îú ×Tì´8LøLDüîÔ.iTDÆ-O[ÖpÈýÄ,0ÌaÔ¡XÀÎmGFxpÙ-ÐõÈL£q3öwWÅE-±5<Òî¢q¶W&d_½U²±øRlZå =ͳã`M¶þ¾ÚZ>ÀLÞrîQ}VÎ3}½û>ê@c^r=Î2ÛÉ*N1äÀ¾ÉÐ÷=Û´:¤ÜwÍn0¡guYê}mCl¨5¦ÎÖßewPíé6¼¡ð@~.íJ+Q5Ö üByzÒð (W[<éI)ýM{£l+Æ÷Æ¡Cl½.éÐ0îä:=)¥O²)w:¾çeR¦ÔÏòRª:lvVÒVbGê!Ð3NP¬pßhIí:¬´ MùUNDá'¦rScÐe?ÏÀßIvÀ¾djáh_,wAjYìÀ§ S|$ÉÕ.2ÕºÚºà7Óã8}µ¶^Fa}C¼?FBĤ¸ô:ýçÁmc·Iu·D[éÔn?0¹YO¶Ü¶Ò×°:.Ê ,¤Oãëõ²³ËÁb±·Ê|}ÿçÈPÓºá#M¤/íkãêõÊ£&·S%Îóé¯{×¼}®åy0îÇlG.çöÇ$/h«0ÕúÇlýÀ÷:Ã)´å x¬h÷¤ð[XÎö}²£¼¨`¿Àô0q µAR[±&ìøñ½ï0tc/Å=ä6y-r]H˰ÆÙ<=׳ÂR³w=K-¥*KÄÆrÄ¢ìP¹>-³Ø=ôÌù.Ä·hÊ::S^2s¨Ç)¹¶9²VMM>KQgש++stj{Ø-øJ&e,ó2² + ÐtH.p¤¡é¬¼yÜÕj9Ê ÈÞ-à ʼ#©f!±Y¹;à©ÝÙTX¼ü\ D^o7TðþÀe¶ku|äì)¢¨(΢*ymJlµuÅ^d ^Xu* äÈu¾ª|>ÓäâO T 4íýOyf ¾(¸Lyñ×:¢ÕéX"²D¨0>̦±Î{#QaÿyÞ°Iá|ã7õÏËáýUôwµA£|[¶äO3Góëßp¿Û®~ÞßV˨=û1ìbUÇæ3 ò¸¹Çÿª8eø°{8$ ú?ü:×9i Gæfg6[5¹Ül¨Sf²¤>0Ñ"ê+Þ¾èI ìÇÅZ«Eã1nn;¡QKzOC3Õÿ,6ç]ççI/ÿ,Û+§°re@´E_å«Õåoàcß2¾o®È`1µÿit9Pyÿjxû^¶#shfùKáÐ4¾wÁ Ïöµ¬£Z(êkKEªÖeöSÓ÷âÖM¹~} wÙKBÍ,"'rûBÅyn·»Eà<;Ü ^ÌuÙM=ØIwhJ DÊ¢ú-º·ÍaûM®¹ûLpt©c±fÍwëû%{4 ì¹çߪ÷¼Ç>Å,¼ ~ÚÍZrM tÌ¿ûõ~Me²M0õúvî;yvþåíåXèTà:(¤Q¸Jn« ¦Ç# KÏcFÿ´Oê,ùÏ% ªø¦tãs H¸]ç ©L®"$F°Bb,*Áu Ö!ÚgÒÇéi¾ð¶Â=.þhÐk@ø ©]:¬O9±`^×ÿÀ<So·Q:IÓ B¶4xUVÌÔ¹/}º¾9 iÎdѨô »Q82iüÄ2w»â¾e)ï7Xtü1cÒ½ ,}¨]Ì4þöÍ|ú' ±ÊǦº]ÂLàÜÒªÄ!lü )<(^|7ó=S3T¢Àr!su;8ÿ¹íD:Ø%tÔía¬«éõ®T¹^¶#qÍðµ6¢2·AÆÆp¢\Zµ@Ô·,áÐð4Ñ7¥k/%î¿Úà:XþN7ÎM5Ñbµ!I(ëÂïÁ ãéÃÀ3Üø8R häcýn3wF]êmÒ<Ý\¼~%xr ĨÞè\ä'¨ÎbÙÄpªÙr8ÛÑYSv+j4æ~> /0J-;!õESiªaE\¿Þ«VLGÅq0ØwI_?§*÷¼¨Ý4ÓÙXT BqzĨð&Ã}iRâä(±ê+þélUÐÿ 庨¥Uòóf[ÎãÔºdZLñÎACÁCmáëbF5Á0D¬ÐU¹n'[aj»`8IGÝ£²G1±=Èìcà ¬Rc¶8ÿ¬.pØývÓ°¡VpðÃÀT$Àuº@A´÷ÓTÚúÉï¥÷Z¢cZ6E±/È » rïdOA_/Æ?º¶¡ X8BK±7¢ÞôWý%ÿÂDb ˨3»-úÂ4){vgÏÎÎÔEdºß×,H_b×ôÈðÑk²TÏx#³É×h~,rdqFÝÇ"g:ÄÆ[¬õadír<HaaÛ;;ÔùÏE.£}ò}Õ¿x:=Ï©â6uéËO¹ôØ*ëSª²uMÇôÌlåJÎÄß,?¼´¤=ã[Í¡e׿þ¾\QÞ´Û* ÚM]Q«ÁGmº)Z½ïòM¤Iè@ÙpðwÉÒCÇFù¼óvüÙ-e¸º(ÇB[î4[ËÔÔk2{;û8RmM .ÊJà_%¦ SɹQ³bV Ïø54g$è²aUªoE÷¯ÝÿgÌb¢Ê"ÉúµSq¼§Ô¤yExôP)8 XEå8 Ψ¤ÂUw7Ùël>mC3è@n#4B-$KúÊIV寰qıD_)©;ûÓî¢Z«BÉcª(Á¾YæªHº£'êÈ=/Ç ¤³;»¡*òkJÑ3mxße~nrxªè~Ñ#v^×µ¸=ÍH-ÕØQú+ rÂè:ÐÖÕ($!¤@|jWV¯ÈÏøKÒ4û5lJ¬òûÁ_w轷ǬûðbçéÑx2]ZïóàS:ûëÅi21Û)|jò'ÙóÇ¢ÂýÒs ¡Ú÷ú¶Ö¼;g{j QYB=îÙÈ@¨Èò0>JÌøcå£NÆ!± ' ÓBÚ11ñ\úÒ.|âÆ¥Å(ôp¯¡çÌP°`Ó@¹½ósçÌ7þ]Ñf¶L{E»ûvaSµ:ä'."è´ÝjYá½$~BB{ôA°p¸äësõÙú*âØ?Z 8eÒa"r î{»{XÇEýôNÂíy¸®Ûk(èöUä5÷³~c^<²¨4»9s ɯ¬¥ÙÇõ*È-èV×_0;útsÊ$Þµl)Äÿê:Üe$³ôfÆTÒþ FSbβÆW`_eQª(³1ò7% ¯Ij\µ5ò÷#jÑ. ȬÑmOI°VÁ5MKoyæ`hDϦ'RH<[À'Ál¢Nzþ§µ»2Jox>æe¾ªväüÉMdÀðQQÇÚãÊìsïÎX=¥á/²·\¥ñä2Õ¾¿é7`P4¹_¯¢QJa¦U.nDòiöäF~0m8ühì@EJFD@W ¦fn jÂN`å+5»bZDpª\{¨ÝW\ÞÒu¥<¯"ç q¸_:· ïÒ^¸Xb"èúâo0ñÿÿnI1 *ë9³$} <@»mÏìùFrÿ:È u-Nba^¶ÄQ o=K¤£m~j@ýmçaØ$iÔtfIv [U6 ¾ ®%_ÌÌö>,Ûæ}\{î1ñý ;Nµ~éEAbÜÃö¬Â¬mרÑÊÇ÷Ó\ÝÝHXÙï^GÇÏl]Êq#Ц?Ï&¶Ùù|¤tºÁExfpÛÀgÜBËgF%ñC1a¡äëi1UÀå6Ùøºü&uôX.ñ6 %¥ì¥Smý;¸TF%9«RÄ!æY`-äE¼2mÇ¿0ZÛ F<î(ÄN®¢´6 ©ÏëFñi8X én{»,]#:ðÓU«G@G/Rzzq)[fù<MGd¼«yõ±ª3²uûâ°Åáî õ¤ÞyÍïÁ"ÃÄç!¬3©BÅüöÆÐOÓÂQ¼ãét"øòAMGäBÔʲIJåsL_ìL+ò· Nïêæö·8 ¦WYÝ»¿&sQü§+[N@Âi!`<bóÿ_HUSeÐTî ª]5âõÑEñ±4÷OõÕ^äçõÇ.F1VZZÒÔŽP>Hù ë ¾ ÒÛpì¾Q~òa³Ü,¨NµÚîA[ÍD Îq{ÈQD<©Á÷º¶Ý ÊdT@R«í1&õ#úýÒ~IOX\¤sfVûæãÊÎíÌÌcè碧ÊgiÉ ~#üð åRÆ=DcßÍZ&zKÚãÛ¼BR¨#èté2~ð e»Ü®²âq;@g·¸¬ ¥¼G+¥@"¢ñà«ÿÿwxâDØ6 - ÖÝ $Ü·»³;;ãNzn<?PãÒÿ>[!¥BÐm½òñ:¤oFÀZqèà ¨1:*ÆãfèºYInÆZ$³§AI£Íò3woELìÈó½å漫"½&BÍÙ\è{úþÊu, £aÅiéLLmº=©á|áWtóÕ ¶fCU+Q g2°*]¸úÊÕs×n>À»Höd/ö9þÜ"O·øGê¶ ¢ÓDçZÖ÷îV%ë´éBÁ©ÛkHÉ{¨@iÚï´2Ã!ÞF}¢&À_º#±¨Ë;¸Ìµ\\òztTÍøÂÒ¥ #«%Ôñ¤¬CJm2«5g ®VaÒì¸pÝXóSÎ;Yþ^PÜe?MÍÊKüÅz`,iVÒ6yÿÚz,¥f63=Ï[¬¾g9׺àëTðÍíö@D;YHQÊÜqÜuݨ3]@JãURÙ1uçÏÌ m¬Óxµí@R]¥U1©µo×';ûxûW{Þ~gáÜý,Û2ûÙý^Gèßqoê¡À»ý¼7.¦å.§ïÃÈI)Û Å EjàþC ÿfÎàS7R³Ê°l³JBý I)É ÜØnÅ¢Dö¢CÍÉ¥(ËñàîßWÀ8£07ðq× ¼v¶lÆE CWg_à |_)o +%ñ×AT§+ ° êLMHÄ¢8&pµ1ñ0dÛïº$e~úëkÒ= À@®pª¥ð2`ïáà¸ÁÑMàé¢7[(q G};r)SÌ4ɶ6¬Â¸ÍÊú¯»rx>«(À¶ïT°äm¥L^É.U1iF»¾Â9m +ãÀ®îúfÒ9nÖµÇ<ÊaèÅ-Îà9í¡ ÚVñ[Bw«pO¼ZâF!h貨´ÂJ¸~¼I|5*¼@d×JpÉÉ_ä¶²Dù««éI¢ìZº´e!jÑ«g'ÿÿÝ«#&?B±-añ½ÂÁ;$Íîì̼ٷïY>G7JgíÝÍÍRð_îhÕD¹å+þö¾y½hËh£z òe:ÂÉAh\Ïú·áþqq"£Ü§¥XU®ÍçË30À¹· #&WãÝ<£ g>¢ª[ã+¯mUÔ« dl~¬¨`Æ>t(ÍjgÃâ{CÏ,±è¢$Ö£½-½MÙ¶òX#@[_ØCFfG°ÃO ÇNG¼ÌRï3¥¡È عúQ;*¶Å½ÚÉ 0±&ll@*jÁ ` ¨¦8Nùò=´×%?5Éj_iÉãë0½[Pþr4¸_éØW{à£|¼Ø|WªS¬¹r:Tнo8)ά²SÎNK8jìG/¨â¸:¾8K-àJë²¼SjÃÒ;å&!!éþaAVµ!q,®EsckB3Í9å £UÄý ÀÓì$A-¥B)Æ¢!Æ«übÿÇijW¥@Âk}¥uf·öÌ©Ý}³ûvfH ÿÌÐð=Æîst½#` DSë<Ý>g+`;À½'A¿È2bîF»Ùø _Ì,~_^ßÊ cÀëå~èצÉ7ãxÇí¦ª2ãTkÿtù: hJ §À (¸¤å¨¹íбðtm; Q¶ÐJl%^BÿâWû <ðhZZi±à:³Ix %iÈîÙ=gÎeÆ\ȯ¶;Ë=YV¯ÖÀw+.aVð& ¥Y»WÈ Z¥%SvIÓÉ·p³ÔÔ%ÙË£Ç3~Aø`¦hØó\áÒsºýðªR@$oßµ÷¢3þÈû~-Lü9õS¸vØ>N¶¬!ìSÔR*Zر<}± ·wWdw²l[õÂæ4«Ú®iqà ²ËUY;¸3¸êÓÄC Þ44'ã_(6Û<&"ºH!·mºl) Q¢ðPnÓÔÒ¢nRBæ«üìz¤Q|1pqâaÝfõ[¤fõ"Ám88âº&ùMÛ©tÁ³Ãn'0¡¸"$¼#zÔÓ'kmDÌpIºúÏ FÞÙ/Æf}8î÷éЮHRª?ºÖ X(ôÚB[A4!&ãÿÿ/~T#1AÒ=¤OJÙ+Ê÷rÜÞÎÎíÎô¾Ú6ÁãJÙµ^áÖEaÔ¡é[!í5íÜ(JCòØí+ðF «EàQ¤a²}p:gÒR¥4£ oñoH§ ÂnM¾ÍYÛe/È8Ü2 Îà²9Û8Já"Ú°?©z*û¹ç³¯Û»U>Dë«ÒÒW)Øâ«"ò¨ xc]9ÌTõ½SÕ¨±ðø t¤}v2S× ¹^¦Ó`Ðùã?©ùuãöòè@lZp©É]¼ ×BìGx9ì jñ««¸çÏ>YN$i·n!}tØK¹ãËä ¥þö/¨"·~D½ ÄG±âõ$©ä+ÁcxÆi¹Tmï$#DRµàîæ ¬W÷ð<Èé1¬l`2j>»üÅÏáרl*¬¥TnÒÔB.r ;Ä#¢¯ª-ð5®©¨¨¥KдÉ!e} qÿENó¤CªeÂV. ÆÌjv`JÉI]µrsRÄ)}µb×(N7AGwT´(è'Üvk¸ñá2}íù½P½|yóh9+ÿðtm» BAÐÈUª¦_Ñÿÿ¶±¯Ú&Z¨ U;³M1{ö:;SOà6»t½+së- QIÝB(E=ÕPjßp:N3n´Ô 3ei¼lIu¸ySûúA`qk_uf]j÷&å£ùA-³FÒ¯rõ¸pÿáÛTU¹ãs·Ë1®h#}5ëo¹lñÞ:½pìàéͲÈBÙPÀ÷#Â;^é÷áܵãéö}[D[Oå`8) ÑD°Däø±o+. ª AìÐØ¿vSâS`9lzÚòL=3VaÆd8Ôbß"¼>ô_×ïlo§'Êk:\ÈÊÖkÚAíV¥4|0w¯Ø·©I`(Ë»èYOÉ ¾»ûøF>£dlã(@THÿ§ñ ]G¨ ß§u?l'á,âÒ"DÀhàÁDZÕÛkÎÝQ?kôüôÄrì¹ø¿Û¯#<4R¸ÕCßDÛr;Êf¿ÛD@v[Qá©à8ÉÜWød¨e¡þðWÇHT`]É>A¢§W4 tbpxR}»ºcQ åF×¢ü©kYJdI²YbA4Rxôà'øÿ? g|,K !ÉF²NÏPU¸AÙÉôLO·RÇ:ó(ÈzKmZ{ïëû/±LX+K@°§×õÏ}!¬ÏWÍS¾ô´ö.ca¬$Xô±/²§M½þÙD/ÇÑsýÝÚ± ¥XqûòÀ®ÊøüÖ%Å}y²×{ÉP÷Y«9ËÌ·9©@9^ï9ç¡QÑ¡¥ÇjSrÚ ê¼ìlFKøùU¤/}$`_f5F)1úáÆ Ô^ð ÇuåN}̾ _Uà°$¬WÝLÌ7¤t·æ7ZÂô ´ÅU§bþåé>åJ«ÀC#ò<Ñõqý?`§ ÅAÏpÐáËÈ ÚdØ£A9ÎRç±(غýøäkYËöK$Cªóo@IZí®k[M¢ÅµÖ|H=ûmX¹²V¡d:ÑÂw;6ë/×úl]XoG¦±gP¶GéÜ,¡©b¹Q,éë(B :2zÆA¹Ý ÓÊ\<7ðObí»t¦Qì±°¹«l*dE¤É¶ª@¡¢^Íñ³j¿V?æ âW6 »<u}ÇãWPue; CA´½]Y1_äûòàÑ -mméZÏA Ðè2wî3ËñmC]pùôÞç}çvõ/÷T»¹èøÂ)bõsC^ÀÍd ï±¶»{\÷£ÖÃ"~ f<VÂá"y°+%,o=ID|é\gªêÜR?cÈÞJFmä .H6÷Mg¸áXeÑêЦÅå[´?ãå"*ÁÈ4E¸&W²À±kÓèç¶Ù¼56½À½Ò!¹,&ï]í(£¥øHÂã9Ùù:ì ±< ïP+¶DwLå">ÿ§+YN 6SA=$åçÛrÈÁSNV+%à6¤û z§TÆ7Ýoé¸Ç·µò7éQD#<ª½¿$@08V\×Õ ÏÆ¶SÅéîõõÝ{+ÙGÖ»÷TÖU_ûµÿì»ðMcÍëÀ1ù@£¬rpHJ£Ìn½üd²>c-,ñP.yWäl®]è~:µ)»5î]]Ø9ÄþçÇtüù.+ce:¼oCoÝ¢¤Rì|ºüX!N$Ê& ¶qΧYÚç 4ÊX6âÕp:·^/#ò;xA<}Y8·í@¾Ðnº¢7GÜ (FÔT<äÜsö·ó?ÉÉ*RÆG5(°ltï+wÔÖNOÏìt×ÇÞ7ð{u_¦ªÊKZ>§.B\Va®ÓÌ¢ÂjtmÀ|pÕ^ÓNÖ÷M¨j§m4òÉ|ÖõY¨9Öû*o"ÀXÆÁþ:óÛóËãô+;ع®Ã7#pÅf#öhiäØày'È ½ÁAÌÆÇòïv«<ZÒi²[àØ¢M©ÇÄ ¹A¥çv8= P6GJàv(õf> ebF;Ó ¥°ý0ÖS±³jQWå»ÝÊãrµå,¾ ?л ¸eG It41¡ée(Eý"ñU×íÔ½r-:fÎNÚ9((GV¿K´PÌMÙ¨lÄÎnÔÕ÷aû¶5ÌqeÛZ>×nÿ?XÇ>ÚþèÞ±ÑðCÔý¥N Áß)&e§UíbgÏw¨Yq$] `<ñ@ð¢jÝç%M)è¯ }ð¸3ì»h{oï3ù¦ã¡ïïÃØ>ªdnN/y§>>q5Ru{(V%ad°=ÇÃbæ¾>To_%Nè³¢jjÂÎhÛ-¢>dU,pîopÌC.·ØÝgÕYZþNý ôhÒ[cøq2,Ú½ o~ËÓ»ÊÇ*DM3Ù»½·«N!~4¯hÛ4ËÖµ%ýü2_<þÏÃýCeæùU=®Gä ÆI§äl ,'9Sãø´%L9å;à` _ ¸+.Õpß[îz'ÐÈØUÄTM ÈTEHgzh;6F±Ê:¦¤ µAÍU¥¥uÌÅnPsk5õËuíÉaekZp@øÉw¯m<×_;ß³;_<ªRUÖ4Eg?$Ëõ E 1Ãûá½ÝCéGe¦»§;Ó}ôÃ˨>RñuTra³>ó ºò¢(Nãdôüö£Û1épïé~3¨cë¤ ÉK«¸9ñ9¹ªÕ&OìÆ!FÞï»ØDFO6èuÙæ©(¦©M¢¸ßíþP3Z'êkârGVÓ g¼è&>Ù^;:±$Ôá\ 3{-9Ö#cWzQ¶LÁ%Å«´å|Át§t¹u'çy,¯YÖ×ö,Û÷}Z¶#Ô£úëýä]»*Ex¹ÛS=[6 ©ÌXz¹NsäJC÷ÿØ{ÅN×0¬¤Ò³&1Î ¦a³Îaç£,¿U®§ =¹ÁºÁBPó(B¸¬Áð³¨ñDd´qÈ£$Eð2Ò.®ú»üxdºÜvßIeA( &eîûlöM ùÎ]+$ð»i\Ì[ÊÅîUø£ú°oeíDâ3q_R<u7v¢ðb \«;@¸ÎW²àw£gãWUjßÑÞzµ·A»ÓÕ ÿq~ÌX½KØý¨kÛM PQ@16MÓ~Cÿÿ7>hR¶r±ÈU:³«6ñIAdϽÌÎ.c? Ã%nÊv8×yÙöM ×Iëë3Ébßß¶ÓºøJ*eEÆH .bá3«ú]v·pêÝ!ï¥&ý]Z0ýxbØMÚå©×gû½6z}G¨2D¯wB¸¹ júWÎEÈÚd<jðo# U&Ë0 ᯢ ÅESóH½6zváojBà6´È½$ÌgZyÄ̲tÞ72þâ÷jÉ` &Ñ?Olrìy0kÄH[9hÒÖð/ ó¢Æ^Gâ~a¿+îÇ`©¼Ð(çé¯$û¦zFm?ÖË0ýæAºüèh´ÇbLvº !U/Ãv"°9#ãÃða;Æ;ë(ÔZö ý*y\Å&Ñ2hÄD®Ñý ÀÓÕô$Ñ-ذB" LL<xðîÿ?ë_Pù(-¥à{3Å+M;;;;oöÍ<ö¾,Rd°6ݧ9ö¶óéC #ì2vxåéÁ;ø -ÞXQÑ ù4v²w¡Ó¨ÅRPÓ/'¹ß`PâZÇJëiç®hÄbÌÆ£hÎÂ;Ë.Ñ[:Ö1ÎÚ¯å+ôü8C|%ñ G«hÚ,'³s¥Ôà4))êvλXû×¹pýV£%ÓV¶HM* Ó&LNf.Ãõ¤7Ë(}w í =A×X3M²'Û(3®õ¤]Åÿ@Õv·DØG?è«VÞ§Â8.~ I;t®Î¦ ìngwÞì̼§ßæ uæ«Ý!^]¶õÇÁA°¾v äó0í=OË×Åú©¿»Q[¿iÞ5HsöösöÚsÍî¸åWÙBTÐTN¶ÉT/_BÐjE)Ö{ÑAÔãXZÏ#ÅB¼lØ:uØØv1±ªÈñJ] 3:h'p÷*ÖBî¨ÐO#¢¶µ,ª-Anþ¨o5§Çi¯¬õ*ÎÆ£s¼*½·ÕÕóØ0Ø$س٧Âq° 8úN¿#U¨üurXe PM^81("':hñ0 AJÅSÁi¬ ^×1;ý´n_ëè¹6§£Ý}6&®ö&Ø{·Êü ÁñîWÈë ¯ÒÄ3M7)¤!©b[Mûu}íÆ¾[º áMhm;WÁI§Â$e.IʦæÔjVÛÎÕNúKÇȾ&¿Twí kòÅÝPFlB« Ðíç|¨â¤~Îqñ,ÜÎwÂe}Ûô½r pD5/ñö¨\üSù8ìeªÕ¨\oP«6îT¡7Òfá%Éfe=¿Ín.¯´Uß¹Ô'Îdõvz!(®Ê!Â^:¿HÀÛu$±6¬PÆè |Ò®ÍÊAEôBÍò-ÔfÁßµÖõWëÌx]üEi¦27ù òLgíÍJ'w¨5§Áùsêù]´ð%4Næ(¨*ã½YãHpý@0ÕÿÚ1ÃEò]!oÛÊÄ! E8,RñWm:ÎEò¶@Æq)ÀZÎÂ"[.nµ?gKADõïu©ZÙ,ZXô/tڦׯ § éï¿&µÞø^,føUòµÂQ²_Þ¯} @ÈÆJeF¶Cö'Ó¥¥6{¥jþ>Âa¢=Sf_1J³¹FhP6ÝEeæT8pÑÿÀÓµ¬4DѼdZb°6qáÂ?ßQÜF*´PZûHÒÔsî ]BC2û>s äyå+Z¨ª»·"4=Ý_ÇäeÑÁhRo¿nvïß{·=!¬äÝ"Ö|6þÞ±4mÊù1ýèùYn)òºf] ³ÞÇRy´3Ã]Ú>pxãÖz¨®àáݱ³<Ç{]o¹ø] ;Út½IÈxµFDÞÅ2ÄâöMãð\¯ÌL¤ôD̹WªØ¦aïáÈÊcQÌ¢*zi`ñ «cÂëflQ±ð%H´gÃiQ{Ò¹çAò`~ hc_`shÿÛR\Ç·Ô¤(xÀÙ^ͨPû¤°gA¶$|mvmEp×*q·ÏGz;Oý ê$ÇP³r££Î ½¦Zdz0`¬ß]1A$ÉVíÊûÀ2ðp)u ø/#ë-!fkѬ]ô©B3J`$ç¾LÓM4°skI ÁàþQI(:Ñ?^ ãùßoø]!tÿ~eÄ0Gð3«Cæü ÀÔÕî$AZèÇU«ÔAbïÿ6>1h´`(¥¥ôÙô/iÊ¥×ë~Ìì=,Çtiýà*E¹9È¥ANú¢¬q]Ùt,¦Y8%+`wß©½ÌUÅó{°´£fy4¼ýíÑ ß+~O¦ ;=ÁYJm1Ëèê:12AG:ï¯4S¿ØnQx½¼nDÃ>ùßúE¡±CH4kÁÃc¡¹k»ätä{Ñ(¤{.òlLè,Ý/ÊÃÎâ~ÃíËfod¶ýmK8ñ"5bâ0°[DCÓ5ÑLÅȪ2§&¬ø¨ób£°?«Õ»Û|E$J/âíÔåÚA%íÔsb°|ùÈDZ5HÜÒ(ëTÏS¥+¿Hórü¥ÖD©ìÀgÏ`¶Jáã«À=~úVSÕæÔ sÂÊGx!3´ëÎAr=4äö\³ópÿÔ$t µíüsűG*üêQ¡Åü^?"V¦ò² ßÖ $«m&U[áv ó5$âQ%Ç~¨u!}Õì/Ä'Êö§Q>¬_ ª«ä10¤' ^í"3.¾þ¨kÙI¢múÒ¢þÿ_¸1.41!áa)Eë´ÐzÎ7,KgzgÎ} vy.lÖÿ8ûÀkü @Ôµ,%Aò"BIVéÙÿÿ/Vá£,KÊ Ä%FY»g Sâý¬9"ô¥]@µ¶SÔ^µ$²4éCÕêÌb¡Ãï|â>iþÛ.iYo²À }yç(ûr¦äµÝñ«ö'ú`! ü~hϹ)58ÑE]T¯GîÁ?¤^PÐyH£qOz±§[Q JÂxÌPHÝ]l}1[SE÷nESä»rµr+$/áÜÌͦkÕLOv{IáÁ<àß>?ÖOSf=}P´¢ê¹âN|p^j¢ìVó ¤î©;¬XÚÈñïàaL Y='9Ö꿵XØÙéßÇaDÅn| ܹSÙf RWÉ7øòJ)Yh>S!Î']Ñ¡èDúìô/£vÀÝU¯[@/#bnÀÀ¡1·«Dc;¢¨U¹Ý(n¢0©0a(§ì]ð×>ö¹¢Ï¸ã¨,9Óù¹'CÖ2ç,/å. мҧ ÄvÇpwújdµ²4xª¡ïù¦å¾TphÑôm@íUJB6%gVæh U9G¸×(p6VÏ2äT<4- ¢ïTÈZtÂä!ðp(ª'Hçq8\Î"¡£×ZQ§U!gÅuîw©û]ZÔöwzL4Íõg1óÒ%Ý & cÜ?×äÈ£ø¯×KÓ¼5õü|1¡K·Gtã Cá'[ÑÁ°»·§å4m±*Mvå8úLw"±KeUµFy¿¢~òqÏÉ ö][ü^^y>ü üÀÔµí$DA´`¹Ø*Ehâ«úþbbL-[K¡,¥PgΡêKú@¶½ÌËLýå+¿ï31ÆQqp@BÊ {Ö©UóC¸uÀÚåÖlóq§¼;£½)`Ïã5ãêÑdd%ëIP^`Ö«¢°à7T¾·Î¡9ÛÕëÛôjà?¿Y¬"ýÆÝy±æ\Û²NLBt~ã\ûsxÞ,þƱ§å¸U*g$ñ(^SBJó/öǹSjÀÜ.8ð¨Sqo½.4 ¤ÍF4±¥)wºðS[.¨ô&¼Í4mÚßÖrbÖö³GÑ"p;Ò ùgóìÞ¬ -gó5XÄàÒßôv "2Ûë9ªÀ9`w°(ZàK¼qw²àÀíËx<d©¶çÖÕq|²þ1ÀJv"³ L[z$µd}?A·Xÿ q5máj¸Bj¢)6cn»¶Âñ\ÚxåEêÁRÛmÃÛÕÁ JÀÔxdHH :6 é6³µëµ%äb>gqãñùKÕ)í,£lè¶% :ë3_ä<}ý%èHt*üM#ØÉceM¯ 6ã[Fuîãæ&lÛsgòý|-êÂÂÒ0v½×k +Ê(¼ÖTÁF ¼NaPreÅmVÖÇ;±³JW(°±NÑj#3lâ¿ /ÓeÒ¤bku7T ÚëúÇ!Ü" ·Ê¾V[ÜÜÉVçuÛ"®îÔMæ&ÿ,ÌÚÞ»[¿ß=ÒðääÑ+7p ~³ @½Xdt.+Ô²$Óê·þó´õ6ÎIÊEjÁË(Âý·AgçmKÁO98ÀiìÿÀÔµì4Ä@í¦UÕ<¨@¢'ÄÿÀ B ¤$mÓt³yÀ½¸õR5JwíñرëY[ æ~DY¬J?»ßäwAzÀºÚ¦ü+vÁÒîv½z¬"ßûço5í,í§+q¢ó¬1j833¸Qî ï{h¢ny¹JîìKËãKÂ~·Ã{~ûÝÑúfÉç×VXWÇmue6ÙúHjhs>ʪ¹+ÛÁMLÜÎ'$|¸_->Üäâ/A±b^Á_i¢ìA§íÉy´_uñ É%dc÷̨lv§§çÑÍw ÑÖ sà°´K Ï0ñàXND÷£8h ®ò¢fÅa&Ç÷£ÙS\éHÚ+Å ÀRâ0Ͳ¬´'¢èQÑÎÃõ¹-Æ Ú1 X+CȬ¸ªhñËËm®Óy5«p$(=ÝPuo+ê»oÉD¶d4e)1 ;æ»3¥×È=©¹*x¯]í 0¿n[kK=»À²ÌÉüë$¹päH`CÀÖdîBs}ÍÐ)|¼÷quØð\¶¬az@ðp ìByj8¿2ñrkEÉclÜ5%¶I²FT卸Àæ7ê°Ð¯V¿0³Â®Îz}¬$ÌÀ ¼âÂd\m-èitàáë½£xWº«ÇsÁÂGaäø{,ZIº¹mE¡ÔÇØH¢´G±¿Èo°Öî¹Ç£ÑÛÿu-Ë APQM¢Æ[þÿrI%X§¬@Ó=æbYTñÜyôìît÷oæ×7¡¤TIQæNº Òù·Çýü¢ÏZ÷3,ü8}X.ûæßëm»¬Òn!?Àh¨ý:#2·ÝR680©÷ |ÙnìrÑ¡ÐúQá~CC¯ðòd@U NÑlN }À ¡sV ÅRHZã`wÄSð?å ³YUjÇæE¶69qAíÑX.Å^ÙTbIÛV½í¾¡Îd<d¢°·>WÍäéuÏ0ý' R\Ä/6Ëlp£G¡Kì çs¢ë¡¬·þê®yf°(µy_¬ Ó¢¸q$$Ï®Ä*[ÉÛAdërx÷Ý}--¾ `Ï ùüåhnèº<J¸Ìç ®¢¨·ðÖÖ£>!»Í,EêÐ]ºAFîZÅd$5ý:K>Û<4.k {Q®¸Íùú±Yé1zófSbbÂß×¹!aÛÚ ·M¾7Æ¢B?äô`ÐV÷¶òRw¾Ä÷ö ¼ÚYDÀ¯¢¥9ï}ÓOûEr1¥yW ÏgÔê2rr¢C,ûÆ-½¯ÕIn/§h´ÅûæqùrvH|´üJ½&0Yµ¿úë îØÒØc^?ÌÒ<ºë <3±VxØØÂpJ³ÄOFG5þ'QÛê¸Hy{ÝXÜ«ýPN%Ë#ØÈ§Ñåè¢`ÒõÕëu6¬r%è÷s«\xVYÕ¯öÝjZpÉnÕp´¥|vse`Ð'¶²¦²!ø~BìÆgäOò¤à(ÀH#ÍÁ¶P<aûDz¬=ÿ¿3Q©hƵ¹ÿâáîÔe*wýYÅÇþ¯´±Å{ÙjcÊuÌE×åG¸´ÊàÍwÚRÌT>8²jg^oÕl{ÀqÚé÷ÐÌxI÷ & &åÂÆr~MI5ðà}jRNÓ °!ÀdÂ- ÍB®ôº]ð]ü}º^2Ã[£L íÆäÆçíè¤ûæQ nISÐ) %"ÞE0~¸ôwú<sì4÷nY <YV;ÄÆtúAðO ãã¤þüè Êéál]ö)i¤O)úÈäLUíJKìêuS»\É"B¿Z~ç)áWOx<0e¹®c®,MúDÂñÛñ÷Åà;8ìMm^ï|ÓøV$Òlú?æ¬A Jͺٲ0¬÷xf |Ρ}O#n}ZÁÚkLUµJ ¨ÊÉs u¤"H ¹@2Ébûk¹5n< q°hm7<UÕ<ÆåÀêuÉ8OgIÓ#,³Ä5ý+~ÊI»Oküá°Ëp¸mé§È'÷¤É©Èñw;]ª¾±Y³Þ˰²µW±Ù Uc¯ä\6µÞÕ+Ý:z&\¨wxó° 4§üwV)ÀjÄCoÃ31®æÝbÜoº~0`Óým]·«_d³ éûb;üD³Ö¡,QZçGEcnþ'⺺C§rô¤RÕ»l\~H,¬ÿÔ}k$DÛW fr æ&Kô°}7©ù3('Ð>ª¯z(< {]Óz u?ü£«é¢¶ÁÆ`>Â&M¥Iª6I¥zé¹ÿ¼§Þr©JU/¢|îfÙ]`cw3ϼ7#ÄÏGÈ!Ó=6Û`³³"Ï`^?èëEÝ¥vÔÐà ë¤4ØMx³ÜÔTkEØs¾ëÝ¿±fÔe`àÛéKé̳n3O*q8Qwó3jT&FöÊúøÁ)½ Î NæSF p»êzxõäðÛ}PX½ x(Çq¹.rèsníÛÈìñáç) +Cà.T¼á³¾kGÂ/Ïãm¯a²:±µ^.(Ðöæ³»µ§eà0cî«v&w=ÿ,_+² ·5ä/ÀºùôÜÅ@Ït: &C,ÿTtóÃTΰEXv£¸H·B\ËFé÷}É÷õ]ämÏÎrhñä×Ò>6j@ô±!§eÈ4Ôrô¢ è"`¿ÅºYIGDô¼Ïyó÷EY0OÂIîJf: >Ì 'Áw&jÄ-MSxÄ;}·×Ö¥Ýçdo7 Ù÷Yss;£È@éyiToQDñM8vx¦+ÛZ)?8ÃÑÈU D?;s=5úhPóî÷:ÏbïÆÃ`)Ã9ë'ÄD,~mºÊñó!¼ þ5>Äáû&¾ÒSZ5,{¬ ÛÏ®cßïp_´ËfqnþÆt¾úSrrÂeáµ&<A$ÅPhK3eã6׳'¼õ$¬<Ri$·Ë(,m %>gMÙ¨hÄà^à«<²³$nÄ#Ù´ýO®ôSµó>#Å >ar%©¤aFìCéÊ@[!Ò¼ksx½®ÌªuÇ\=¹Á¿ß´Âêïe{v÷÷k½0Cô´³óôÇ &'¡áa,ÄÇÙpÛÒºÎG¤¾+»ªQgã%Þ[ 9§¥±òìbÔ~ÈQ1ÜO_jB(.V»/'ì¹²<6íZ÷_&$À4_ÅEZéx ¥.²(R{ÔÙ"´saKÝIKqÇq!TØÉ3ØwünÛ>7n]µã<¸}R&7ýí©»¿þ®x éæÓ@äëq Oûevé8:Þ¶a "M²hK²ã¤1R§+ÒÍ©÷ö÷÷ÞZÄ(²õHqQ¹ë@gÞû¤xV6 ¥;§ê^¬³Os4Ï&y-K21r»?mPÊl\/Kîl¸ö°¯Õ oL7£>A ¢Bå¬4è¼Lï%æYr6? @ 7 ²På,wD[6éG¦!Ï&©WàK¯ÚhOÆýå0zÚEÚÅyïYø§"0ßkØÕ¤nú¶ÊüÓ®é½wu¦:èFQöõµ@®ÅàµÊù)O3ºø ÏǨ»ÛÇ9U}®/¤q+o%xÇÈÑàB[õm õ±Ákßn`ÉÍÃîøäørdjÆÅáÍ^È)1»0Æ2 %´³ÖÕóѨò5ÄL<¸1:Ãøðo-8xY°I+ASÄâ(íæev~1AÐóWhdÕÕ1VYLmßE*GÄSo!¼ çK&æ.{®¬>%bqÔ¾Ù³ãßÍèû¥þ±´Â§w QN³T ¢Åb2×>ËxWÑÚî5¡ !:@"iÌÖ*¦J>«nÕ¦e0CS$þ ÔâйTÉ__ïÍÞ°%Ô#x!mÎTµoo&Ë`MÅ ºbF]Sé¹B\§A}Ìks¥:øc çÛÎ}ì>3ä Ù pçÃqgQ¡ñ)f7'¬ ì 2<j0/CãqæeÜbû%ÅéAvó>~Ó Q¦lh.Õ¡Þµ ¥ù¾+»¾6¤|?y9Í%ñõT?ÍB0d¨9Ü£ xÕ8×·|W¶7©©Hºnò'y4N?BVå¬Ó®µ<õ»d+ÞïÓmåiì®[ l'Ð;Ðé+îÔÕ©-1lãYc½îQó0.µä¡/gîþÅ,ìmϳLí»ù9JhrÔë)¬)B)ÖG§j5´þ8ãØãs ÛÒï.è¬9²Ia7õz[ôVY":°Ä²ÍÁßm¸$öܰ×>Pó"q2ºßVpñQ#dF~mb+Ö8ò¼{¬§Iô.\N¨Äùd¬9F#ïüØ:· wIiK5¨Á{ßÿ¼6Fc Zñÿfº¹j¦süwÛÎ0ÎåF#×³ÐµÖ±ÈÆ<تÕv¤ÛÂûj×ñÔ4t\ÔªþÍÃg9z>×|=N,V/&ý1U+Í8 '*RèÛýi×vG{îO(yè,?Ø¿y*Rw½`m)Bû}^ÞLÍ ÂÉÒ(-ÝH2ªIÞw_Ë-_¤û.n± _µØ´çÇ:dùÍzPjìJV>(º ... [truncated message content] |
From: Luke H. <lh...@us...> - 2002-11-25 06:53:14
|
Update of /cvsroot/java-game-lib/LWJGL/examples/nehe/lesson16 In directory sc8-pr-cvs1:/tmp/cvs-serv18314/lesson16 Added Files: Lesson16.java Texture.java Log Message: up we go =) --- NEW FILE: Lesson16.java --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/examples/nehe/lesson16/Lesson16.java /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import java.nio.*; import java.io.*; import java.awt.image.BufferedImage; import javax.swing.JOptionPane; import javax.imageio.*; import org.lwjgl.*; import org.lwjgl.opengl.*; import org.lwjgl.input.*; /** * $Id: Lesson16.java,v 1.1 2002/11/25 06:53:11 lholden Exp $ * * Cool Looking Fog * * Credit goes to Christopher Aliotta (Precursor) and Jeff Molofee (NeHe) whos tutorial this is based on * * @author Luke Holden * @version $Revision: 1.1 $ */ public class Lesson16 { private GL gl; private GLU glu; private boolean done = false; private boolean fullscreen = true; /* Lighting ON / OFF */ private boolean light; private float xrot; private float yrot; private float xspeed; private float yspeed; private float z=-5.0f; /* Ambient Light Values ( NEW ) */ private FloatBuffer lightAmbient = createFloatBuffer(4).put(0.5f).put(0.5f).put(0.5f).put(1.0f); /* Diffuse Light Values ( NEW ) */ private FloatBuffer lightDiffuse = createFloatBuffer(4).put(1.0f).put(1.0f).put(1.0f).put(1.0f); /* Light Position ( NEW ) */ private FloatBuffer lightPosition = createFloatBuffer(4).put(0.0f).put(0.0f).put(2.0f).put(1.0f); /* Storage for 3 textures */ private IntBuffer textureBuf = createIntBuffer(3); /* Which Filter To Use */ private int filter; /* Storage For Three Types Of Fog */ private int[] fogMode = { GL.EXP, GL.EXP2, GL.LINEAR }; /* Which Fog To Use */ private int fogfilter = 0; /* Fog Color */ private FloatBuffer fogColor = createFloatBuffer(4).put(0.5f).put(0.5f).put(0.5f).put(1.0f); /** Creates a new instance of Lesson */ public Lesson16() { } /* A javafied version of AUX_RGBImageRec *LoadBMP(char*); */ private Texture loadImage(String filename) throws Exception { Texture texture = null; BufferedImage tmpImg = null; /* normally I would use StringUtils.isValid(String) from the jakarta commons lib, but thats beyond the scope of this lesson */ if ((filename != null) && (filename.trim() != "")) { try { InputStream is = getClass().getResourceAsStream(filename); tmpImg = (BufferedImage) ImageIO.read(is); if (tmpImg == null) { throw new Exception("Error: Got null from ImageIO.read()"); } texture = new Texture(tmpImg); } catch ( Exception e ) { throw new Exception("Problem loading bitmap", e); } } else { throw new Exception("Error: file name is not valid!"); } return texture; } /* Load Bitmaps And Convert To Textures */ private void loadGLTextures() throws Exception { /* Create Storage Space For The Texture */ Texture[] textureImage = new Texture[1]; /* Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit */ try { textureImage[0] = loadImage("data/crate.png"); if (textureImage[0] == null) { throw new Exception("Error: got null from loadBmp()!"); } /* Create Three Textures */ gl.genTextures(3, Sys.getDirectBufferAddress(textureBuf)); /* Create Nearest Filtered Texture */ gl.bindTexture(GL.TEXTURE_2D, textureBuf.get(0)); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MAG_FILTER, GL.NEAREST); // ( NEW ) gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.NEAREST); // ( NEW ) gl.texImage2D(GL.TEXTURE_2D, 0, 3, textureImage[0].getWidth(), textureImage[0].getHeight(), 0, GL.RGB, GL.UNSIGNED_BYTE, textureImage[0].getPtr()); /* Create Linear Filtered Texture */ gl.bindTexture(GL.TEXTURE_2D, textureBuf.get(1)); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MAG_FILTER, GL.LINEAR); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.LINEAR); gl.texImage2D(GL.TEXTURE_2D, 0, 3, textureImage[0].getWidth(), textureImage[0].getHeight(), 0, GL.RGB, GL.UNSIGNED_BYTE, textureImage[0].getPtr()); /* Create Linear Filtered Texture */ gl.bindTexture(GL.TEXTURE_2D, textureBuf.get(2)); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MAG_FILTER, GL.LINEAR); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.LINEAR_MIPMAP_NEAREST); // ( NEW ) glu.build2DMipmaps(GL.TEXTURE_2D, 3, textureImage[0].getWidth(), textureImage[0].getHeight(), GL.RGB, GL.UNSIGNED_BYTE, textureImage[0].getPtr()); // ( NEW ) } catch (Exception e) { throw new Exception("Problem loading textures", e); } } private void resizeGLScene(int width, int height) { /* Reset The Current Viewport */ gl.viewport(0, 0, width, height); /* Select The Projection Matrix */ gl.matrixMode(GL.PROJECTION); /* Reset The Projection Matrix */ gl.loadIdentity(); /* Calculate The Aspect Ratio Of The Window */ glu.perspective(45.0f, ((float) Display.getWidth()) / ((float) Display.getHeight()), 0.1f, 100.0f); /* Select The Modelview Matrix */ gl.matrixMode(GL.MODELVIEW); /* Reset The Modelview Matrix */ gl.loadIdentity(); } private void initGL() throws Exception{ /* Jump To Texture Loading Routine */ try { loadGLTextures(); /* Enable Texture Mapping ( NEW ) */ gl.enable(GL.TEXTURE_2D); /* Enables Smooth Shading */ gl.shadeModel(GL.SMOOTH); /* We'll Clear To The Color Of The Fog ( Modified ) */ gl.clearColor(fogColor.get(0), fogColor.get(1), fogColor.get(2), fogColor.get(3)); /* Depth Buffer Setup */ gl.clearDepth(1.0f); /* Enables Depth Testing */ gl.enable(GL.DEPTH_TEST); /* The Type Of Depth Test To Do */ gl.depthFunc(GL.LEQUAL); /* Really Nice Perspective Calculations */ gl.hint(GL.PERSPECTIVE_CORRECTION_HINT, GL.NICEST); /* Setup The Ambient Light */ gl.lightfv(GL.LIGHT1, GL.AMBIENT, Sys.getDirectBufferAddress(lightAmbient)); /* Setup The Diffuse Light */ gl.lightfv(GL.LIGHT1, GL.DIFFUSE, Sys.getDirectBufferAddress(lightDiffuse)); /* Position The Light */ gl.lightfv(GL.LIGHT1, GL.POSITION, Sys.getDirectBufferAddress(lightPosition)); gl.enable(GL.LIGHT1); /* Fog Mode */ gl.fogi(GL.FOG_MODE, fogMode[fogfilter]); /* Set Fog Color */ gl.fogfv(GL.FOG_COLOR, Sys.getDirectBufferAddress(fogColor)); /* How Dense Will The Fog Be */ gl.fogf(GL.FOG_DENSITY, 0.35f); /* Fog Hint Value */ gl.hint(GL.FOG_HINT, GL.DONT_CARE); /* Fog Start Depth */ gl.fogf(GL.FOG_START, 1.0f); /* Fog End Depth */ gl.fogf(GL.FOG_END, 5.0f); /* Enables GL_FOG */ gl.enable(GL.FOG); } catch (Exception e) { throw new Exception("Problem initialising GL", e); } } private boolean drawGLScene() { /* Clear The Screen And The Depth Buffer */ gl.clear(GL.COLOR_BUFFER_BIT | GL.DEPTH_BUFFER_BIT); /* Reset The Current Modelview Matrix */ gl.loadIdentity(); /* Move Into The Screen 5 Units */ gl.translatef(0.0f, 0.0f, z); /* Rotate On The X Axis */ gl.rotatef(xrot, 1.0f, 0.0f, 0.0f); /* Rotate On The Y Axis */ gl.rotatef(yrot, 0.0f, 1.0f, 0.0f); /* Select our Texture */ gl.bindTexture(GL.TEXTURE_2D, textureBuf.get(filter)); /* build our textured cube */ gl.begin(GL.QUADS); /* Front Face */ /* Normal Pointing Towards Viewer */ gl.normal3f( 0.0f, 0.0f, 1.0f); /* Bottom Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 0.0f); gl.vertex3f(-1.0f, -1.0f, 1.0f); /* Bottom Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 0.0f); gl.vertex3f( 1.0f, -1.0f, 1.0f); /* Top Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 1.0f); gl.vertex3f( 1.0f, 1.0f, 1.0f); /* Top Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 1.0f); gl.vertex3f(-1.0f, 1.0f, 1.0f); /* Back Face */ /* Normal Pointing Away From Viewer */ gl.normal3f( 0.0f, 0.0f,-1.0f); /* Bottom Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 0.0f); gl.vertex3f(-1.0f, -1.0f, -1.0f); /* Top Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 1.0f); gl.vertex3f(-1.0f, 1.0f, -1.0f); /* Top Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 1.0f); gl.vertex3f( 1.0f, 1.0f, -1.0f); /* Bottom Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 0.0f); gl.vertex3f( 1.0f, -1.0f, -1.0f); /* Top Face */ /* Normal Pointing Up */ gl.normal3f( 0.0f, 1.0f, 0.0f); /* Top Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 1.0f); gl.vertex3f(-1.0f, 1.0f, -1.0f); /* Bottom Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 0.0f); gl.vertex3f(-1.0f, 1.0f, 1.0f); /* Bottom Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 0.0f); gl.vertex3f( 1.0f, 1.0f, 1.0f); /* Top Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 1.0f); gl.vertex3f( 1.0f, 1.0f, -1.0f); /* Bottom Face */ /* Normal Pointing Down */ gl.normal3f( 0.0f,-1.0f, 0.0f); /* Top Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 1.0f); gl.vertex3f(-1.0f, -1.0f, -1.0f); /* Top Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 1.0f); gl.vertex3f( 1.0f, -1.0f, -1.0f); /* Bottom Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 0.0f); gl.vertex3f( 1.0f, -1.0f, 1.0f); /* Bottom Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 0.0f); gl.vertex3f(-1.0f, -1.0f, 1.0f); /* Right face */ /* Normal Pointing Right */ gl.normal3f( 1.0f, 0.0f, 0.0f); /* Bottom Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 0.0f); gl.vertex3f( 1.0f, -1.0f, -1.0f); /* Top Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 1.0f); gl.vertex3f( 1.0f, 1.0f, -1.0f); /* Top Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 1.0f); gl.vertex3f( 1.0f, 1.0f, 1.0f); /* Bottom Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 0.0f); gl.vertex3f( 1.0f, -1.0f, 1.0f); /* Left Face */ /* Normal Pointing Left */ gl.normal3f(-1.0f, 0.0f, 0.0f); /* Bottom Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 0.0f); gl.vertex3f(-1.0f, -1.0f, -1.0f); /* Bottom Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 0.0f); gl.vertex3f(-1.0f, -1.0f, 1.0f); /* Top Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 1.0f); gl.vertex3f(-1.0f, 1.0f, 1.0f); /* Top Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 1.0f); gl.vertex3f(-1.0f, 1.0f, -1.0f); gl.end(); /* X Axis Rotation */ xrot+=xspeed; /* Y Axis Rotation */ yrot+=yspeed; return true; } public void killGLWindow() { Keyboard.destroy(); gl.destroy(); Display.destroy(); } public void createGLWindow(int width, int height, int bits, boolean fullscreenflag) throws Exception { fullscreen = fullscreenflag; try { Display.create(new DisplayMode(width, height, bits, 60), fullscreenflag); gl = new GL(bits, 0, bits, 8); gl.create(); glu = new GLU(gl); Keyboard.create(); Keyboard.enableBuffer(); resizeGLScene(Display.getWidth(), Display.getHeight()); initGL(); } catch (Exception e) { throw new Exception("Problem initialising Lesson", e); } } public void start() throws Exception { try { createGLWindow(640, 480, 16, fullscreen); while (!done) { loop(); } killGLWindow(); } catch (Exception e) { throw new Exception("Problem starting loop", e); } } private void loop() { drawGLScene(); gl.swapBuffers(); /* Keys that have a constant effect */ Keyboard.poll(); if (Keyboard.isKeyDown(Keyboard.KEY_PRIOR)) { z-=0.02f; } if (Keyboard.isKeyDown(Keyboard.KEY_NEXT)) { z+=0.02f; } if (Keyboard.isKeyDown(Keyboard.KEY_UP)) { xspeed-=0.01f; } if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) { xspeed+=0.01f; } if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) { yspeed+=0.01f; } if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) { yspeed-=0.01f; } /* Keys that have a toggle effect */ Keyboard.read(); for (int i = 0; i < Keyboard.getNumKeyboardEvents(); i++) { Keyboard.next(); if (Keyboard.key == Keyboard.KEY_ESCAPE && Keyboard.state) { done = true; } // /* F1 switch between fullscreen/windowed is buggy... // * So for now, we are leaving this ability disabled */ // if (Keyboard.key == Keyboard.KEY_F1 && Keyboard.state) { // try { // killGLWindow(); // fullscreen=!fullscreen; // createGLWindow(640, 480, 16, fullscreen); // } // catch (Exception e) { // /* We dont want to put exceptions into our loop... so */ // e.printStackTrace(); // System.exit(1); // } // } if (Keyboard.key == Keyboard.KEY_L && Keyboard.state) { light=!light; if (!light) { gl.disable(GL.LIGHTING); } else { gl.enable(GL.LIGHTING); } } if (Keyboard.key == Keyboard.KEY_F && Keyboard.state) { filter+=1; if (filter>2) { filter=0; } } if (Keyboard.key == Keyboard.KEY_G && Keyboard.state) { fogfilter+=1; if (fogfilter>2) { fogfilter=0; } gl.fogi(GL.FOG_MODE, fogMode[fogfilter]); } } } private IntBuffer createIntBuffer(int size) { ByteBuffer temp = ByteBuffer.allocateDirect(4 * size); temp.order(ByteOrder.nativeOrder()); return temp.asIntBuffer(); } private FloatBuffer createFloatBuffer(int size) { ByteBuffer temp = ByteBuffer.allocateDirect(4 * size); temp.order(ByteOrder.nativeOrder()); return temp.asFloatBuffer(); } public static void main(String[] arguments) { int err = 0; Lesson16 lesson = new Lesson16(); try { lesson.start(); } catch (Exception e) { err = 1; e.printStackTrace(); } System.exit(err); } } --- NEW FILE: Texture.java --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/examples/nehe/lesson16/Texture.java /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import java.nio.*; import java.awt.image.*; import java.awt.geom.*; import org.lwjgl.*; import org.lwjgl.opengl.*; import org.lwjgl.input.*; /** * $Id: Texture.java,v 1.1 2002/11/25 06:53:11 lholden Exp $ * * Just a small container class for holding texture data * * @author Luke Holden * @version $Revision: 1.1 $ */ public class Texture { private ByteBuffer data; private int height; private int width; /** Creates a new instance of Texture */ public Texture(BufferedImage tmpImg) { width = tmpImg.getWidth(); height = tmpImg.getWidth(); /* flip the image, so it displays right * There might be a way to do this differently... */ AffineTransform tx = AffineTransform.getScaleInstance(1, -1); tx.translate(0, -tmpImg.getHeight(null)); AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR); tmpImg = op.filter(tmpImg, null); data = ByteBuffer.allocateDirect(4 * width * height); data.order(ByteOrder.nativeOrder()); data.clear(); byte[] byteData = (byte[])tmpImg.getRaster().getDataElements(0, 0, width, height, null); data.put(byteData); data.flip(); } public int getData() { return data.get(0); } public ByteBuffer getBuffer() { return data; } public int getPtr() { return Sys.getDirectBufferAddress(data); } public int getHeight() { return height; } public int getWidth() { return width; } } |
From: Luke H. <lh...@us...> - 2002-11-25 06:53:14
|
Update of /cvsroot/java-game-lib/LWJGL/examples/nehe/lesson12/data In directory sc8-pr-cvs1:/tmp/cvs-serv18314/lesson12/data Added Files: cube.png Log Message: up we go =) --- NEW FILE: cube.png --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/examples/nehe/lesson12/data/cube.png PNG ü>Ä>οÙþ³@Bÿõ£s@Ä$#'*ª§¦¦É", 'ß98@²ülª<ê"|Rî"J °»Êñî;á+£ÌÍ®T/Äb¨ Íýßýâü+«aÌ`Àö(õÓÊOW¨øßVNeÓÏ8åÿ=ÿÎò(Âüõ 0ôÿ½cçg @.;Èý\\üw߯>ügù)òüÜo_Dþs¼Utã&y½S÷n<Ò +Ù8Î?äþcÁOÀà3 ª$@¦Î´½s=Püí¿@ríÀÐöé/Pê YìXú+¢vjÊó á¸TÚ»±£º_AtRY¯FâiC?Ý¿síkp!¦+F tXèu ,eæúðR'mw%¶ tµZýÞeOønÅÆ ¥. MÆÑà31Æñd'o ñæE/Æx(&¶ ¡ÒJi±¸K½Lf&37/S !ö5+ÁFZÑÀÙSwøÍ4L87u4A\v>e®Y{!Ö0%æ!® ª>×S8ð8! k¥ÉÌÁò7þº ÉUäõ§®eP:çjyïm±õ"Ãâå ÕäëÛì1%Yò(F8 ÁÓ0 wáÿÌ/¹xßÈd¹òýûSoÓæd°1³2üúÕZôíá/eæ`ñ÷Â/f®ÍÁ¡Éô-´Ø@YÜä/ç'ÏÞ?á\µ¾íÛG©x©$¯±ÞáyǰpãVRãAóSî3ã·ço_A ø³i{u2e$AêýÑ´ #&¸\ÆÀ´nMDt1ß f±éøÒ®X*1R'Z¡ 7飯4Ù$Z@IQª_f5Á}°³wG6¿Þìß4ÿRöâå;8NïFÖpZ-´èÉåýÇÛE7÷·+ï]O<ó|QÆBT 7q㯠FΩdÆ+<%ÃYpßZÛt!L ÍÝ(»Ïl%Ô¢$è-§#Ë㳡8ñ©6NÂ'Tê5Ø 1dú(¶¹ØçRüÎÁ®7Ó°eë; ^8ò±Âº?zõ¹/åÝÿû_[å{Òñ5¤u5ÏLuÐæI)vÖÄ£ÌDÝbCeqYu?8X-ÏAp6Õ÷±-º¯Ã IÙ8à@s(¯ê[FÖèN|J:òêgGÀîÔï¯Oïµ"®¤îWa¼Äß6³ù½2G!Ü)_æTóâäáêæV Sr5Ð)|&ªÄ3-²ðh"0%£Gù?Q×ý\تB¦ÉVµ~8ePZAÙC&réîÞ ögYÏ/÷/Hú2KÇ[xpztwupVU&jË3[QV+ì° þñäø¯Ï¿>ê^ƽe¼ Þ¼Uûùý¿äÇ_?þýbç~{ÿËqÙ·Ù~j|çûôÿòEB¯µç¢,lDÄ~ßDR,¼ØrÙª¯9¿³Þaú÷ã7×£orì¼|/óÊÆWÿ3xÎËùG赨ddgDÞ^eý¬àÞq|{ÉùùÓ+Nv.~v`¤t±_ Xúê¨a2mÊî)Tÿ±÷жÅÜ?þàüÃré×ÿ·/_8ÔXfáRcÿjôÌ}àÀ×ïÞ ³?zÅÌúñ'ßF ¢F1-+²¼¢Y<:.e ]JøÁuÌaíT XSëóFój÷ÍÛ»Qü2=8NýâìòúwQ79#:á-ö¹_X0¡ H)bm½Dñ£FëÎ4Ñ OàÂ¥Ãpákø.\i]¨{Zʵ(%rZ·góÏ|óÏL)ÜûD.á:ÂËíµ"ײbKo1 gUB9>=É h2ìVs`x;ÓZ¶»}µwÀh,H¡ÞIc[rÆ8]¯×¡Ô(Qàà¾âYzÞô½* ¥,"Ë,gNÏì"%HÓT_S7Ä=ôBÿkZPákckX²"òb̾#ÚÕø_$ñÜìD)s¥ôt @ÍFdbÌ·Jªä2H±ì¤vat«¹ýÒöFÍöºGFác°:ÍÝP]¯ÂÜïx6Ç«p÷}ø-/©/>,~u¤èXS oîoñÝåõ?ÎÎíT M[5lÅký× Lß*ÈØö ë¥Zlç/E¿ÆZv>L7£Íÿ<i»ó &Ý]«ÀÉrîDÉt&OBR5ç¢<T^ CQZ,ÆeÉ3ÔÓ0ÂYߥòQõÂm`ù+ì«ð p?«¯i³ií9ñµW xÄÍ«C¸*ó8qý§ÁcK*;µùÿøp pw{}y/Aõ{í]eD'¨ÿ`Â\Z8lÞÙ¦ilÒ4¥D´Á~¿¸7'ARVÖ´é+ÙewÂ29,Ìk÷÷¤äððFÝÃ:³]ì0¶l§<ã +PÅk&£uÐdØnýÂû°5¹¤Õ£ÄWp¡4Y¯é³EÜK¾QŲ6ÇÒ×÷Be´-§³£ñmOñÎïè1ÑFõòùü ÀV%Ùl0ü)kÙI¢3 JZèÐZ´JMpíG¸ôwqeâÚ_àʵk7®MPc@µ¼[J§µÄxàÞ{sιÙ/]ÛÁ$ 3ÍôBhQ8Ó÷ ßì¡ ¢Ò{v°ju>KN¦2n òle4J²éLWÄ´Ú©a¥û eüá"AboÀå^ÚøÇ\ ¼j¨AÛ(kÖúåtÐù¯!úrÏaÀÏÞxå¢Û¹,äs^s$SÜ:Û :9ò(U˲NÏÏ*þ®ÐCâP³C¦x¨D¿ÎÜó¶7ý@¸÷Ú¾<¾XðNò¯|1ÞqËòn®Nbi)ËÄ'=TßàHfG¥¥ñÁZw·S¨2A?r·W'ÆAê?ðd= AfYD E ¶´@/zðäöxñf¢´KB¡-M(ºÌZÝÃ\wò2|ó¼E°;å-øPlj7Ný4wk´wKé ¿×©ÿ»¶³ÿÓFáÕÁëjwÊ7ø¤ ±¶±m:°é¤MôúÉýδh´R¥òÐrëðNrrVö`mr/"Â^0*©Z~DJÊ;_nÂPbjÍ4½¾Ï4!|»óô-z¼uxê_AÉî!.ÇïMWÑ<+hÓ?q¦{- X¾úzGWà«íßD°ÉKs¾Åoÿ>7"@¦'ï¤d¸0ó3I±¼~öIê'ã»÷_^}þÁøEB÷ÛÓ_OöïÜi8~dd"ÏþýâáUøôÿåAaÑ·/_ ìLÇð( ø-º-éxüXà·ô3!¾(=£ùóçË>}úXÔìVáú{é® ¢y?nI¯)mÓJµR,ý~ýwþ"âFºp'n âJübÑERúH1¤¹&ºåÌaçÌa®/ÔÿcØýÙqí uy/qrÂw&7Aäb¢§I_X²(§K!ÑÛÈ!ÁyEz[i+áSrj2FÁ²GèPÊ` OTXK*¥ZÛfî¯xb2ù&;H*Y´ôÉÞHòo«ÑHnÀ°í DÄWA«îîÑÉadò î½ÀcæÈ0¤EÍi6ï=Ð%·ú×ÁP ¡8]~j]»¾²Vn¼rt<=º±agQN§%Î×sóÒÎq1ÊvöF~_KU¹ùHMÌ+;(zWâ-ï|Y ùïi72eg·EÖÿ)kYj¢!¥W¥,êØÚ½3þÿ'¸ÔZíKK%^æ2]EÖsoÎ9÷Ì7%ËÔÎ*¼¼ªÒ1èÃK]îûr}rÊë[Ø*gÖøßÖ1åO@ëå¼_[(9hÈs{ÆbfiAf9¢Æegð·ñ~JBÞnE,Ñ?¯³~áQHÏÆ±ÓÞh}tåöòôÌûôÜJkÍké46Ñ n¹ß³èÅ$óUïwLíS¼/¾fªûK.ýFQ³«Å¨ä¾Ä}zíÛhíÝnÞ ?X~IW¡&G&®MM:ºcÇbˬüvýòh ÑëX=Öà*g,ðê6*FÊsÓ6}!éöfjê°h-M Ã@ض }YèÊc@Ð/êÅÿö¦2Êcdh `m6)v)·ìdfgg³ùò}ßD|@ýéÖÎp¨^¦s]ÿnÔL~µi>·nfvÀtäÞØöL¼[ß¡$IŰg s;V¶1µ+ð=+Á.¢ßB ±¸¹þÒ!Jzû3;ödÙ,øì²Ê$üaG4® Jæè»ù(ÂÓ.´²é÷sÒfSq©dOû³*Ð\@þXCu'³FÅU¯ »ª¸fqt ÕI\ ÿÆ? 8ÕÑÅÑÅM§ª¥b X4æ;oLLt½é¸ãyî]Ü\#X &|{ߦil æÂGHÌy·¬ïÚæIJ!R»Ä%wxÜáHÛ=w>ÅÅÿG&©9îqÒ+ûn0X/¢Íxa@ÊLbø µgý#X.ù«/ ØèÔâȰô*ÇÙ^°J¯i½? ¥nÄx<Mã=Ѻ¼×(EO@ÎN'J'mIQZ,E²£ lO0¦9øî¹¾Ójááð8O¦®î,¿_(Jµ~P(iä;r÷ü`×ã§8Q±B|"2¹¨3=:" +¬P]?öÊE9&ë ÉÈÕ¹ÍyÈÖÚçg6U t27¨Z4ÃàÃø5tûW·wä¯Þ¿ fÓ$ϰ1¡?Y[CVODÊø Û§U¿ü À¦Õô$ÑÅvÙ-lËG"ÆgGÿñÎÅDNþc¢rÀ¨P)©ÐhÙ¶´¥kz1qN3Éæ½7<þúêb·\) sSÇuûþöòë½b»©mÊBa{~zi ¼PC;C¿±0ªå5wªE8¯RÆF0>NJ³mý 1öíÊòID©âͼÁ©'ðu±öÄèåYÀ'PîR#úä¸~¿G:÷Ú¥ñÃCÎ;ÌaÖ!©ÅqÒÙù1ÈL-~ê¢<²÷ÄT-Õf.RJJ£F©«¯f`¥8Ø@Aóúf¤ª1fc£B'Z¿íûÐÇlÙ £Ã4}hßÚsÏÇmApÖV×Ì9tufî9°mrD9×û<q¤rTT~93TtÓQ îD«/Kï'©I!kEíÒàÙÏÞ8Q`¸»,ßkWE[Orú OÌj½¼ð?ª"4ÕÚaq{ñ1 ¸Ú_DUÉÄ0q_ öÿÒ¶£e3\\оAJfâ·½a<tK)Ū°çóÁ®@¥{¦^pú=-ÖëöxÓH7÷¥Õé ÉF~Ã&üvóÿ[üÏ8Uü3ȲÖl, ùiã$DËw77O¤<BäMFÑf1å§y5%X¯ £i©I&qjs^np¼2S·ã ѹîJÈev±v£©&é§î÷j±ÀUÆ =!<1Ð~gÊW¢h±^,xJÈ cõBÆÇq|ÿgð0ÈÎ "ÒJhKIMà2»?ßþ»cGyá®fLÇë$P5µÈì?Sà~I%ã;¶w$Æ?ûom¬ëÑþ}l¢Ê[+Í FØ{ØêG¬9>¬H âÑÄW²4\(ø¼ðm!?é^ºæ©»©8Û¾© ÿàÑ\v0ܰíÖÞ(EB¢Æ·¾Þ×0®Ü¹7qm4.t©7*^¸ÐÒÖÞë)!>ÁlfæûÿbÔëu.ÓÓòùÓ%óAzVº h¦ Vy>÷!(È!yï=°Îí}Ï_®ýaq}]À è.VÁÌeè¯@ì$«,f¿Ýcnn6q(Bý÷?HÛ0¯æH\ã§ógf%¤ùhJj;ªÀ+#õ¢q*²h¾CQwØ`*G;9ÜdÊMóEX&áݹr9 BÙÐçïÅýlØ&3©ú¸¦ícÂ`M!§ès8Fa\ $°G¤VfVÚM¢âòuª7°\Âj¥ÀlhU}û¤MýÖrÑa>¾µ§ëPÄ@HiÙ÷5=}¤´»½¡`. mpÖ¸*æÑ"ý @³Õì$áe·ôW,Û¡ &hbgO ^<û\| ËFbjû), Ù<*HÇ(Gí£öÔa§Zaºx^UW8åÅG,¡¸é^naj ©ÈÁçïïú(xCBÂì*ÀÚ7¿hBàüæá7éKR¯dof sX¿ê_PÿŬéÈ:²ÝãFï¶÷O£w&µfèº+Géß2C1Ö½ªV±û |è°È7Êfü# [Db¾·>ñ4.\ib$qáÊ5>> ¶½_[òïuU|2jáÝN3fà'y[-^]N|x¯=°:qüh}À]Î]'ù÷ÃÙ8A½ù\ü%)]W¯7IÛ¥|¶7X0æ¦NY¢GéúÅÙµZ!WËÐgs HÀO7Bθ%¶ÆÿлÙÔÌÆyí£¨OÝv-I<ðèi¯ aÒ [5Rh-_V1*Cy¦%>>ºùhsÛMÂ0rpYiE©¶VÓxc¼êû¿BoZ/HLÛx%"°Â*e I÷þÙÝùòÿ3¼iJX|õ£È÷Ú`hÁìôe,HÖǵͼL:]¨«÷O«#H|?æ'ú?Åĵ ÜÌK;è4)RÄâXTþuDêæÙÈÅJR»¡FI1æIZB«á {MÕi(/¬·ê£®#«33<<äÚ«Û@ÌI¨T®$]ê÷^ù¯¤P6öQ;ɱVõW½Ä½£Å¡}VhÐwáÖÊ@/tL§?[ÒLvrÏÜß3ºùøÖ3ö9¢ÿ-»¬cv}!ÖµúØé-K+Ïüîö2dÊfNý½Æ¾90oðÑM =3:}´Ü&U ¿°l}¿ Â@(F&þØÔiLÌb²d{Üÿÿ¾Ä×=¨N%(P(P vã{h.M»ä¾ûz_I¿/öGÓE¬£íö>±¬(k ydv$ÑuÿSòpÚ¯ ߸ئVïT`sÞc0#2BW¢}¸ÊH¯N/üõ®¯.H ÄóÈÚj _Ù++ÔYw´,¹z£ù¦°5ÅìÜ>A2y´hëwªG, VýÉý´cÇ Øíh´h±Iîa÷ê_ tY`]¤Ý¬ËνíÎïßy¯uSÊ4ëÍå<UjÜWÐïÓtá k½¬M\Þ&+ÚÖeþÞð$ÜD!E¶hj¿Ù©X&*(- â·©FÃ%ù¹ÙD¥ÚgkLݵø®%ûED \ÿ À£Õ´$ñÿ^tk¶9÷bÓa¯A÷¢Oà!"è^úAg»éi·è#ô ¼ ¾íÅ9ÎmÿæïÏûç÷ÀÿWyBÝýÕ Î]w$kT*zÄà¢edÕ}2ôÁۻǷkNgÒ Ã¬<°v~QRÅ*rÉÉ[ ~'µ<LÏV¥¢´<!£4½Vá LÁ¤àcL$ÿlu\fn¾ÿßdð[·ÌõI]¸gupì÷m ýýÝ¡å4ÉyX\v-«NOóOÍ|6¶Ä±?2Î¥¾Xô!2죫pCmF2 $go{.4ÈZT¨Ê5~·õe¦E[yóì®Þ.1çºFýÅW7/Ah,E#~`áìz¡0Üu]WÙØeJBL^yå÷ȵ5AÃáÖñ±ZÖJwMÛsÑæ='íyïÆGÍOBR¤cÊ(j`¤JäÏÆ'n2Û_ïzÍøvzEmëµ8FÒUjZ%wÈæsxfI®¥`Zð0Z¯Õ*³P`Ü+ú~Ûñe>" /kã©fÈejÏ0&»ÕPÝhuDZà1ªðöÜEÜ<.(Ûfì§ÑGë*8oÙWRwÒâßãlæ2YY+Ã*~;qoU%¯OÕÝZ:(gep¢ä8÷èyQ¨**ýàÝ=×U¯îÇnèîK¢ña7¯mwçäiW©¤qÕÙ/ê¯7ÛóGÖ¿ ÊåÒ%ÅÀ<Îr{~Éà¬íÉ`&î6Íù\Þ]%¦ÛÙ7PMQr5hrQ$ñ0 ¼5lG¢¿ÚÃù³h"N8æµ ëÙ{qÔxÌòEbwt2Zê"[øAA\¡üiXB3'ÖÜ>@R n)m5w6ú²j*ÈaÏlä4ÀºÓÇrĶz8KÛðtáE%dVÓ¯Ôèï'ñ}~@ËI?Úèè Ä%88´ìææÔ(÷¶,8 )Ò«:GgòT÷O Ãp/7ÅB¡TkTk¢q¸×Ðnñ1QQ+Ä^RZÊûá¥7pNþóúr¨y^ ¶çCP/ áµa¬Æâ$ØÔ>jÉ|ØÁùI3[8ãQ¢W)<»¸äj ÃMµGµÿØ!Fe¸N§ÍA?ÓúÌyÓE0 ÞE0v®Î¯e/~¯[üþÎù:@QW.âÉüñ \ão&8ávKÑ.çô4.æHôopÛuW½qº»ú&.$8æ½l J£ûJá?U¾Ìä¶ùUvZ¶(yÂìÓ]¢Dffc¢9 -ÇÓXÅÖïÒWl/Ô«r:QHÉÜVÜ' j?âVO 2h?¾ôô¢g«PWZǯ´ëzýõbÔÍh$q@Ä£ý# 9$:ò:y\û^ÂMú®E"´K%M>ê)tBõE³p á*Ø«B¬Ì÷°hKbÅÀ[ê]¦30ò±6ÛQÉvbLüYOsg: v¹ýMDd²Â¢¼rñõ»HDÈØ¶þ)ÞÑp6ó`³Ýþ<A]'HBT¶-;|¿m×Se<u©A Æ^9îÝyîäa¼òÁs·}]±2¸úkÙMnâ¤Q(}@Ú¢ÒP¯ýþxÕOh=ÔCs ¬¬úŧµCKhÿAø*`ã£MÜñ%>wâ¸<¼0 ïÊÉ-S¨§Ûóp%ϵÃßÞ?ÔèXÏ«ô¾|»ïMgdaÇ\g¤Øw¸¦@2ÄfÏÔ,TÅÈ×W©7JݺÉ` ¯ÕT þ~qÁ×Ö8%{>\Lì6IóÕX3,d+1¯Ë+³eð/ ]Wý C´»6W0Ø yºúó] Gn÷ÅK/êÛíw$#¿Cy²sX½DåJçFâèçIwßYÚ_øãCngeQý¥É!Í>¨AIZñçþZ»ã¾Ñïòü_`sÔHÏØpàxÓ©nÙñf]^gƪuü,Æò°bù7G°¢æã³QAÆð¢u Ú<]Êì\wîëKTÛ¶¿þ`áZvhÛÛÚRJ+ ¥MÄD÷nXéB#;?É{v&ºqÑ01~CA"µU^}ܶ×^ôf2çÌЫøEc~îûD±TÕñHX+ã¦Df§èé Åd!g~V5xä¡?ëE%<>:LFBPÌVLR®8qÃOZN§/@~.^i,àð£óv;iÖðÉFGúgNÛg7×¶ã _ÐaI¶´hüÆ6*5'oeTfjÊ?¾KA~pqu+ü`Ü `dQ²KJËh¦µQêXòØÀXi¦öà%Çë(^²ØAÐ8ù»0òU: ll¹¨Ã.µÍbL(mp:×m¹T¶,© æwS°ï¹"fÐc´ ,êaúcúªÖòÆø,§$Ó±V ÙYúÐ~ù^<Üa,þ ¥Ë¾ÿdfcca|ûöÉÿlÁçÃBÞók|Jò¯~Ú¹ßó~ãd`bܲzâw)ÈþP%ÁÆÎõ÷#8'0¬]»Ò`ÓcüÃö÷ïÏåEDY·ì÷ñ=¯0xàïÏßßÿå^}/¯'Áøáÿ&pA3þúöÿ8Ãß¿¿åýå'þOàð/îçÀºTÿó[òk§ËÖÙ+àYäî? `~ôK\\ÜêÕ«¼azZtáÛ¶Ø r d#æ!ú)Ç1ÇÊâëw«¦TÉ´ÍÀïd²U»ÅéqV{bàúÂ÷U;TÏɽÖRÔú4¤î»ïIÌ¡Ö0²7¨t0JöMµc/éáû,áCã\ú1ØëÖC û÷â¥ÎÇs®-5qåEü âÿ¨7v4íú±4McSË^òtn.99÷{GÚüõòìýõ Ýü/¥ì DÌÜo+Cçû°#èÙZ¹Ã Ü ÀðH)TI~°u ªÈ÷%ö)¹ã¦i9$4¤ö´0ôoú»ë[°n-Îã7/¥.A0ÔêdÌúi*52]HZL°i-¯$¶Òã £ÝvØæ7 Þyuvò=ïÞ.ý#¼6Ô¢<Ðûò£ eã2vRj°7/&ꫪB6s4ÏÓ«SÅD{L^ÇÏöø _P¸âÌTs[yï~=tÀµkõrs!´M°(ðD¯4ý Àõì$QÚÛ{ûn©ø@%!,LLüb@êÂã'ø/î`e\¸ÕÄ_páø ASÚÒVl˽Å6%üÂÌ3sf&yè<LpÞ¼,ÖúÑljæÛ¥8É ¢7¹ iÞimZA¨Ö ñÿô .+n\BÅ BWúÒÐZ%m-äUoæu½é¢¿pf8s83s]¯=?t;gwáëáê¾ÞØÂÂoܺ½Y+~>HpëK"mÛí§rùÞ°!8ïq*¦3B¨âÎu6/Z¨ÍÂ4¤4_æÑñikWX£_øæÕbjÎÀÍÉe úeT=hzÌ"ÏC?'l°Èjù ã8´TöäÓ* ¢£qìz<¬Ë÷çW½ÞÐùýfwí.'2 MÊÑÈäã± ð(XRõÜí«ÏeK¥)SË,PSHqË!ãAÀÑ$ö±ý#Õ lÞVÛ=õ]b:1оó"b&'Î÷ØÓGì@ÂνÇA¸jÿ}ι뤯Û<¢ñ&¤6BUdÀ¡®ü²-æ ³¹½ \Är¤Ð5 ÝVu&î%&JY÷âéâR@¸13NR¢49Ì 4,ëØÿK¨nR<ÈF#æò ÁYÇxa}1Ý#Î>ûíe¬2[Õ¨?,s¬k7^ùk=^4xÓÒE'²·T];jÊ«{Ð2è¥Ô`~ºD® &<UÂPÞ¶3 Í @ÃÙô4ax)Ý- ì¶HÚF/jÔj<y5é±ÂÄÄ1±j*¶MK)Ðòµý¸Íuwf2OÞê "%Ä Qj3ieèôH÷nrçÜÜ.ONÙ-cq R÷ôr Õ¼«S¥LGïmUZ, ¡ Jñ V«=?^!GôDOM«È.T ÿâüìF¿f æËýþ5 ]××ES½T¯×ÛíöT _x¡ üöáäD½v««µG²!Ùࢬ?8(iK[¹Tl¥`¸$CbôqݱиváJ7âÄx!HAHë ÿ¹}'9çÇL}¾|ËFä^g¶»¯$\¨µGB_¨å%"a]7îÎÓøÚÝ:ïtX6º{pö®nnß{âñaàN¬Û`øtBÂÅË}ª÷o/êMTòakRpÙ¸.y:5 íDhº¹Ø ©Fï׸ᩯ@ æL2Ë®«Hë6@-]T@ÿU¬szÅØÂ)ͣƢbMÔÕ7êÓ[¬Pê;© +j°,+Öçô ÇþaÊM+jµf^nY¨nü#ŬúüiÅ ú(<¯b¶ÇhCD×£0¶B©ïMú¶®¦Ë¼þUxÿN¢xdâNs5è ó`ÝÓyϳÒÐQQ"9ü³¿U\1²ÖʲâÄqîtkBT¥«ÁCAÂS¯3} gäë6>nm¡®t³9;àK¦ ¡/Þs³w7èØª-.p`Z1¬ií²ßíãî)c'7RðôÊwÑÀýδáhÇ!B8ìÈ#$è 8´Æ¸¹79'÷qN.}ÕàÎÑõ à.ümu¡]9øð²\òlûæ²~ëUÈùx+s+?%GÏd}ÁÊlÅShü4Y]Ä!4@GKË. §²m` Æ\~R5eÝxѺH)úÏ5+ðÍræ©@¨Ðr9YÞüð$𻽻A¯ú8ÜîëFémï«ø,ÂUFþ¯H¯m¾"ö¿â´ö¦kL<gà»TB©hErÐUPñ§µÆÙ\1£mÈÙüøÐ"Ø¡µÛJÊÄòáHdâ)û|¡1¨ó|hµþä×ÎJ8~ͧ&ÈQKÀ2×m)ôͳðöÊÛ¼1_h8 ï¶K»ý ) C Ïõ4Ñø V;um2Hk± GbC¥Í Ë_ÔsÉß--d¦Ñbv»Ý»«`ÜfZ¹à7þ§kYi ¢yܶ¹mhµqágùâZ(.bµ××îüZP°n, &é+æÑÜØ¦5×Î/3sÎæ¸{<eóÏO ÈAh·ðUà eËs¥du ´!mÒ/ºá/¤_3Tr Yx?²Rküyus®H4ÄRHéÄtEY4àõ=-[R3+á«îm'bî«zz]3{ò¢hu3Óµ¶f×OpûLèÛ Ïp%Á¥jnÇé ¦B1ή/¸IùÎdOÎ;±¸´ý»¬×Ò!9ıhØÕJ;áQ°ù oØáRT`|´(ÀOÓ ¶,ÎÕ0i6ï-U<cRb®Ûð=æ¾´µ²yøÿO +ó°7â·×Kè2>asbz.SµÛê ¯ÿ'cDÖð[Þ ÖIx22ØÖæQ«Mw¾Ì%oG÷༮]G%0íw[ÅûQ¸ù¤Ë¡uÎ d¤xM±ÃóþâJ3-ÊýIcqêid+·K2Åê¬òÕj~Ö¢&=Kâ{e¤¬jé{fC?9Gâmcr¯dòxÖ©ìrxXèBÌ ¥¡5óVô u½_X³Fx}ͦägâÿ¼²z{®Ï.Ödj²6/îxÅ?±G4£ØÈ méÝÁAàÔÆTÄ×7h-%\å£@CWøá#Ü$·»UYJ% <uUÜÄHÕ×÷·z\8ÌLاã8:·.Iä®àûþ[BÝwé=Ó4QT ðFnîÂt÷O¢eóú¸aéy#£³Üì¾9ARhj½ ` ,Ê*æeqðµihNc¨·ÔauãùÛ @ñ©RÞ*MqT29Õ9à<2XÂÑPÁµ¢nM^ÖËyïÇmÚê»\.&íIô§ªÆ±bU.÷óHéHþ¶]úM£%ùÀâùX N~˧ ³ì´ÊéÕú7D1Ï ËöÖÏr'<9ý¥óùIâxGײÑýÊ`02ÐèÁÿ\þÅÄ£'ãY££AÅ` `GâÌWh&=CµÃÃÑR¡°tm+ At·[zK&&m¨m¥>¨X~ RðÁçú~øÜðEb¨©6&níf³fÕ?93gfÎ0ù¿`i222<wQÜ;öª Ëø;â /®Z6]Ê#ÏÄ·ßQ¥ÖaRÖ, ÚÉÎNÏ'4éÃIñ°ô¸È·"Ôf*:ØÛí¥ì²LlÔí±Më%ý-'ÿñ±+kî3´LPô ¨¤õÊÖÏʯ c÷5ÒU4KN¥î)N^h8¡nwåÑ'!sÒ²7ê3 Ìé®1Zæ 6JfS¤:¾"@nÖ°ÒAu(øpWÚ»núÇXf Ê{ÿ<rë¬r9ÿE×iß>R´9 BßÎLæí·@=&Ý7³íb·YNvÐtn; A¦»íö° [ä½1ñÂÈkû"^ b"Q@ضl[)=mí|¹É?óçË?@Û#EÝßrµzaçÝÄJh4åè¼;°SlÀЬúz@ñ{+î(DK7YG!5-PxXJI;Ûét®²½£ÆÑ3ÁNRjê§2Ô¹KLUo.Y"äüÜe¡ <o"6Uãk7\cHGÉßUÍ*¿ûª{ÈÄûGÒÆNÂ-⵬m°C?W¸ë}e?cY!B¹gøÏIè¼x¢0Û-k1oÒ¹´)P/V> }Û¨7T` È= DGrrøÛ×ìÔ§ "..û=IúO,HË9ær²#`W¼<áQ¹SUïòjéx¥ú˨pÉºÞ |¿gzáºÁÖÿkÉIÃL;Ð}´ Q¢pçV×$®0qá<¥K7&ÝE¨)ÓBÛqZM¼Ä÷þ(q#E6¼ýíõ³×-é+ÉZ \{ôã2<~©%Z¬®ÅXxÊám¢¢cîììÓ3óÙ.S þK¡òüD\7Õ`÷µ¼ì0 Ñ0IÓ×ZFûÛã4-Òç¬`W>t>N9E0d k^Y&;µýäµ®8÷ ¡ï¯c"©n1i ,°´¤5+¼àã¿6 âÿÿu¹ AuwA ÐÚ¤ÕÄ_}Üÿ½BÓ¤m¤%-¯Ev2ÄØdO0ù²ß#38¡U¡¬hæ-9Zѱ¾6 1Ùþ¾Ì£q¯{^s¸åÕô#zM×àhXÈWÑZ 9¿½´ j ü¥%¥ µý' @ÄÕõ&CÑ"Ø*òU©¯ÛÛ÷ÿ½_¦8ÝÆ (¬×-éS&ý¸é9÷´çòûõXØ/ð·[àe«èU7ç¤]£±bMÿ`OTÆÉsM¨sê3BN!Äm%ÝÏäd!åß³ñúÂ?½ òÍzP®«&éÄ_ä"ÖÕ·âºPaòs/á§Ê3 yc·ýjåâèÇÿmØÔJ¨¼ªVMxtoEAÇáÌ9C6~oóRϸ5£¯Y2J³ë£3Ø µ×ëTZc½òEyTö>2SôÙ(ù4z̼»(1sócy ç¹³»JJ_¸6_VSÀBÁP^¾:7_ßU&Å-Å0b~`êêy¢èëkû*¥)¥| ñ#1ØSÿþ7\Hq`îäàà_pqÅJKKÛwm ¿à.çÞsNî͹Ü)T£þ3Ç,| 'Êkö©ûñ*#é^®jÊæ²ÊC>Ϥ·ãµQN)ÉËÝâDè¯ Á&K°<g~Ú Ì$ÄØ"æwÓ@¨ ƯÉàKTvC R(Óø ª["Ô°E¸´eXL»ïjÏ~ëºNm&0f°»ö¢Å`rNà ;d¹³ûî¼=R7Pi¤äÒBÀ×gçúmÛ*:TÊ5 Dµy/Xñøòêæþñ.EÙ|Çj=2èÏ>Ñ.´V«DâIGå!d ?Ö¨ªiZ»ó¢Yl¹ÞgÓu0ÙÔjëúJ*0cv_>¥?Ä2©g6'çíÌóh:y-Z´]äÝ3)é3Îòké}úÍKßÅ% 7ýxôØ´úJ1°~áúÅ.óýõeYnÕ'ÕTx.ü}«âàZ©~ÿ(ð²>µ0þKþc5ÅðïGfèºð7/ùù XYîÃçA»h~~}ÅÉËÅÀôº5óçG!Áé«W¯I(Fßd~ÿ¼ÇÁùëå/^f¶÷"_?áÔýú ´ ÷ç÷âL2?î±HXýdâÙ¼ý8èÚÇ ~÷ßoAÐBüß~þgb_¿~ý?Ðq_1ñüzóIàýIAи9ϲ ³uØólÒ<ß~}#Åýê¿ô§Yþ®è_÷T¨rp¾}ÎÿEZù!Ó§ÿÏÀç3q}ür|¯©ØWX¢£s·/ï<&#¨ëûiÂQØj,38}ðÇÆÿÿ¿0£FFÛ2ÅZp7¾]´msßww_{ &vÝh2åß=p¯g?>ïOeðÅ<Î&|p"]KÞö_$+f1Q°9êN¸¼[mP!¼9%ý|Ò¼1 ù1ÿ¡¸ÚÕµ¦ Ù¤z<úGØmÚß É´olg%zúúh4;è×[CàFÈÒÂÍ+cW¸ÂÇêZPrÂ<[ ¦Daú®g>C¿û VD»ªwh"Jýº¸s¼ZMYâ`,ưûUßÔüMÛ|¦AYlq$T|íVÉKÅAmËqQY6tnÙÕµ3«mó/¸XRÚª|´ð_º¾ßa -Ø(þêâ²=éÛýÿöÇ9I6ÈDâ¨tìaoM®w_ö»|½;ÄE3UFIõ OjVlèÀ±ÒÇ·â-[ ·Þr/¿^gR¢ÝñC«á>I*«jãa ý×Ü@5õ'»æeNË=T¼¼Ò%ÓsÁûÌwMèTQM+Äͼ[G¬¡|Hº¥ SoOõ£¼©+Â_IJ|é> `¦²tÍJI>Éw¿}{m¹Kñ¾{þ¾Æ´KðÃ÷ÜÚLß®ýçáaùÍÎ()&ðèæ[9Vñ'_C©ó3½ÐcþóDè×Ãoÿ¿±óð^ú¬xþ?Þúܹñãç=N.a忾¼úòÿ´°bâbeü ² CZDðÃÛ7¿N ñýcøÅðó»äçoÿ}{Î+È$]áëuG@éûûo¶R|ïAÍòXÆü)ÎNº÷êçßß¿þýùõíÛëgïä y@-æ¬ïY>½yÄ&Éøééwh¶8#ö_ë¿°3ûõ#h è/Ù¤þ{ dY+þyùú7¨þôVLR{· ¡è²»nÉJ3§ks:·[Jt{8çæ¼üÏáÇAéàò¤ùt[×z±ø®ÕjE¢C÷Cw¨ÙI;XDá2ÀªvK~ôúIÊeEÛ~ÁT `ÔyïÕj¤r¬ÇòKÞ\ W ÛÆ×¯¨ßÄJiÒÃó䯩ÅHÎs·õø°)P¿ðt-; CQ°·ï>)P$5®MØú7Æð;ãν®]úF¿ÀMT| ÖBÅÒöÒr[¹¦áfqfÎÌúät_×~ìd\m¥ny)àGR{"¥'ÄX5l áÇ̪és1Ñ*¬ïÁÈÏBG\A,WÉhdT4 D.ÆûªCÄémù1w*àÍŧ ßXqo5Ê[(-ÖTIaRãxZ:¶ <Ç?¿ý276ºû²àîúZ?ÈZõ| ÑwnYw_Kô´ð·u½ô[ë)Ì¥«¦f!âæ§ÀÞùÕ Òª5ѦѸÿSã qéäê :;¸KZKS*TôñQpq¼õrÉÝ}ïϱ:§[ULò²ð.oîñ¥kµ76Í$¨òR49ùäd7Á×L3ÈÐe¢4©Zut¸9ý;άéë·Öøl$ëW§8@q{¸½MÔ_GgeÒ£?÷«i°çHéÃ)P%YAkny6¾8gùV}Oèésí¶hh`äûÃ(Ìm©6|Ã/ÔuJIQ̽³(2}×J\ñfÉ|îùû «É_ðp©¢î8áæ¢7i8íôl xºåܶíå*>Ô0´gÕ³YjeËÈíûÒy~ý!öãYvR¢JBÿO»î(èj| vW?1--íÚûß·õ?²ÜWäÿôEö÷·«¬ü2¬ïß°ÂWÊ Q©÷~sè¼ææ<ÿî§1¯Ò[æ_<~qÃEì©´$ÇßÌÜrß@®ÿøòWÚAc{Àð[MLþé¥×âàs"¹þ~daþÈ.øVòÜßϯýdýðó+Ç_ !¾·ßøù¾q|f~˽!û»à_.Ñ_ñ3 ü|ÆÅ)ó¼Þæ'ëGDW÷ÆëwÊýÞ½{+÷U ÿ_²×w.fÎoµ^¿÷KüÛ¿/Aʼ_þq°efçxÁÂcë¹°uhÁ°/ïÅ÷UA¹ÜÃã«gø§ß<_ ¿¨r ¼üúC `á=çueµOú"Ò3ËXjÊ¥däÎ-ñY5Çõi{|éÏÞÓ¤t~\+fwÈÚÆ2.«°fG!_Ùwå&\2ôÿ~v¬6' Ö·g$~Ânàdè+¦2¬oÄ ^UãÈï¾´i äÎí½bI9ãEQë@ °w÷ø1ã5I8Bò}B3ôo®!:¯RnHS´µóØHMû.æºÈ¾sñiÉ.óC1@%î_0Í¢£ZÕvÒ_º¦a L6ii±Àà(0 9øãý Þ<xp©òÖN ¥iZûÒÅúØCN{Èlvö/_ ø,"§jå½{` ²«>VÂ}{'çQ(§õÜXªQ eZã8<Eðd´8® ^3?Mô@sç*èüÜIpGnÅÆø|ÎøåÀ+é`ßb§`Ö³¹¤b<{Í1ëê%zÀÐ eúN_ò²þ3(yÛ¢GúRµO:I&¤(ûÂÖ\-ó6[ÁMߦ ÈÏfrIâ¨(ùZvÝ#Ë8ðãb)Í,ÀÔ(PCL_¯¹¹c~Sä½ì{£Æbe ÊÑ»wûûVR~¸ç< þòL®¼ë0u-; CAôö¶ÚRJécÄ+Mü öeS @\âÂpÁBÂÒ?ðüÿ@W,\ºva4FÐRµ¥-· >ìÔäþÀÜIæ¥z{wSÈÂfº?/l üéºèKì±ÜmÕ_æS/ø¬¥°>j4dv(reoçj-v91U¦"SÌÂK¾$í Õ4·"Ï[#ô^Âl- 0±¤ýºö>ª¾±_q+rãìiÍTÀzhF~Tç5R++Da2ﯮ;t<i_âÆc^¦¶c( Îv Ûù/Éü÷PÁ¯g¦YlgZGÐÁý~î iƧ2 çP 4dP X_ÑSúùkéiÂ]^-Bi RZ£¶£õÿ=ªõb4iµ-h\ºXaYVñ6É\&ÙÍì÷YéÿvàñI\d¥Ì®áTÝgÚÁBv×øÚP""×Åß²¤°ù6GV|µª-,mÄÎhºèË2ÏÖZdïvËÇ·;]r4ØzÃñ°¡Ê)3Íþ[©ôéé TØËúrüºh$»«âÙÚOdØ~YFC>¶+«ß8 »´v]»6M^lÆþB8ç¼Ï¡ºázú½¨ÜÕqóR qõ\tä# î«2³È~ÔÐAÍm6¸W_3Ö¬ÆXºÜI Ê|ñ øë"Ûy¹½ÙÝ×èÃDq5¯óÿJÆ=IE¥¾¼n[à Û6Wºgl̸cH Ð6:ï,ÿ7-¶5²r,Ö»ÂNù } ,{òS|ìëM½ê>>ÝeÄ)Aêo) ïõÊ]9G£q¾ZMvF++®_fpÐ[ÒîÃíõ±é t:éÔ¹lû«1CÔ÷kã¡êÀ×b¡±©æMÌÖ;Sr×'ü ÀÕµô$áínKKY¨¥,Á4 `Gÿ²gþ1FL(¥´¥O`»îÖhâyfNóøæ8`ƪöé[©cNèÌezé®h~mý):x{ pöÙ l&á³ÒÇ¥ÁdR¥ÌÝÝmóͼÒi6è ºeÓZZ°ñâ&RyÀØ#¾º¸¼½¹Wu±¤h@UUï$ÿ]$Û =Í#/ùòX¨$¥½WAÊl12-]Q&\ rãK|f><IP©Ñÿ¨ÃÅ b{<%¬>>¥jþKÓºUñÆ!7ÍnÛÅÒEããìZîÆÍ²è ¡í}ô+ ¨Ü¶è»³æ¤ç¦*ÒþDí X³Ê"CZDPjy©Ù¸ErUÅf*⼨MsµbÁtq0¸¢B$ó#¥@óÏå5o WuDÍsuÓ]4°¡=VlükW92´¾UÎõó+hg'³bQà6f)Ü~H×VÃù' §#Ôв娧Ûúqy É8T3yq HpOq¡¨BâK÷w]Ãx:>:ý«Hº®3vÖ]ÆQxÆåáZ¨¸½Bpø5Laº´8ÂL´÷a¿79ßCEåsË~°6E©Ìfp¹¯gb%mdÇ5)%«!óµ¬)@¾Hc4©JÔ[ª;2ÞÛfm¤Y0&~ êZv¢hg·¬Aj®tiôý7òú~[ÝØØBåUT°6Ìj2«;9ç{/p#Î6ú;Ä Õ±|þ>åqsMyS;.õÞêrzõ][%ñSþäþ ê¶_3öÅÆù¬Hº²8Ͷ?Â$$µ¢_|OÈÃh8¶rL£ÐãË¡;ý7Üì.ÿÌ;l%æüîÜrä&MÜhuN¤ÆÀj(Â7·7[ºQT¶m2ÏûÇ;Ã0 Ðv0ÐÏ'$ 0&¦1µíÐN¶Ñ÷®É¬k¿°X@i²ÃÊÉCʺ¿°t-; Qt(ôAK¡PP(h 7úþîte\ú.ý7Æ ¿àVãÆhbDZ ZÚÒ§-3uFýMîä{3çäæéIDdÒäÍÛîÿo[J¥åk¡Yw6«$©P^y¥¼$G.à-_òK1ª±¼§U @úù®!÷¦ÜDøélRñÙ`g¨Á@2CMT·'l·;wkf¤ò3·±·÷Ñ-æ! Bzf¬0>ê]¨Ø)ÄZG±¼¡ÿçBt¨ DWHó «AúȾ8¿9=\^_å Z7Fï`õ>G'~×ìªã1¦s¬bØ)efq\Ïí<ØPAH{I£ý³déÔÒU¶9Ágê<JmÉQµ}5?t<ºÏØèoKQ[Ô<ÝoÕA±iR²õ"u6z¸JcwXü@ øòîÛæWìꢷ~ý`æúð÷üK©'JgY>ËühøHì ò'è@ö÷\ %<·¿úÌl?¥þýúÂðýãu¡ÏYÙ̪\o; YΩ0~°°¹9.?ã>:RìËP{]Zë ÷ûWßFxÇ¥¶12Êó²ñ§±y¾0þgúÿSíû¿¿9Ø~=ü),ÅtÇ+Ö?àc±ø?¾öcþÀÛ¾ÿÄd?±+qó°[3ÜÂ!×ofæ¤ÿác[»ùØ+i 8 ^î/x¿þX>g*0ã3sù¥¾üõìtðàªçcûÿÙ~àa3f~|ìÿsYÐ{Fè ¾¢ > »'Ì'ÍðJóýE~³»ËþF[ìÕÛbßX%>sq{ýö£øÛ7oÞ³²9Ëþû¦'õådKÜÀÓµä$EÑöYJ-)Ôò)¶RC3'nÀèpâĹ+pfbBü`Î0u © òi¡ZÛ¦_[%náÜ{ÏÍ9Éç$;&±ë£ 3|Ndõ¼á'6XÐ&÷ýÊ<Ï?^]ªt¤ªÆ*87gÐÄ;~WÊSÚl²¤²[,¡½L@HÈkz=$ ËIÈXîk¢b@JÜh+£44VrÑ;0 þT{XAm. ¯~)g!v0¢@~âÚquêP çîÕî0;¹8ÜrwÃu¦-7³¼£aKÎz \¤Bîã¬:º27o!ú¿À:¡â<i@4ÃÍöélV¤î/Éà[LãYpP `©UJºüÏóxdûù¥«×I´·- R¤° ¢þD'} ´½íí½ õçäü|ßùr©¦lé s¶ìÒ<K5&Þ ¬üÑÓÎÙ·:ÿ*/®éëU.~Ú1¼ÏÔØÖ1 @QZ`Xð§°P6$ó;àñÑ4ÔMÍòÙ¬2 -dUGÜ¿º&b>IùQqÑÛ}ûÞ®hxF:ý<ny¢/»rßdÎp!=ï PK¥0>@#,]rNÎNo®)ìËGµfTÅíl9ñíÅü^߯¶§û;QôGÆNd¹|8wÓÆqÔ8Ñ;ÝÇ=\ÓaÐÓ* ²ÅÉæ8|É73±hKûÓ¿_´å@ÁtDå±eámS¶xh@/´kpªB³!íïAù@³?kD;IoÜDséG7Tp)ñývëgàjÀÞ0ã ýÐ3ÍI\ÂôÛ!³eär8âYfç²OLj3ÀìümTÁýØò+bH<Qá`\á±îðR¶ÌÛÚÙù¡= Ú\h,°®O¯"iÙÞÂéÇ7u8l¬× ¸°ÜÕr Ы»;û{É. u·Ä~®±Î8a@ºB>ÓnMÔäóKø0@8¨ÿ z)Àå}¹üßwÎShÃ)«%Õ¯'¨½Ã[ÀU]rSýã?ªþr H>øxã³¼,#Ço¯åD ÿÞ`xÇÿóßoÈàÞ?`Yü_Aè +Ïßëþg}lÖ=UßûØú6~þVHã×§¿¥¿~|Ê ,}..ÊÒ²ÀÐ*Ð5k碲Ï?2Eí\P±.j~dû±dÒB!Ì\ 2z*r?ÿÞú§iðï#ðöÿ@vVößÜþ3ÿyùUè¬:$è ±B9îòÿûþ÷!ïoÁ»h«"8ï²ûGV ÍyR> W¬) M"Õ6u 6Å1 Dè äÈ%à´©ü où]VP^D}Ð~Ó?ó/ïÕÿ=ûÀôê¯Ô`èCÊÊH¾¾À¯¿2ïÞ /Ïóÿ2\l"ÿK¾ïyË-ÀÞ1 }ÐÜL¾ò7h·Úç÷ÿÁµ73ª ÿË;¬_¿|_^& =Hñ9Û+a &Alÿ>?`{*(ÂøOWô?ßgÙЩcñw/®²s ¨þúð <Üü <S =Sç/+0ô\`¢^µg3±pý$PÇXúß9Ds'ÏÊÞ}*!ª£¤$ÿïè=æWu¯ìÛ*..Êõ?¡ÿè£0[¾ 4¢ùUGÚÐÒâ÷;~)лoAî?þ°Öÿóï'7¢&øÆÀúûë;öo1Üüú]ø+´õwVÞ_ü?@[ÁÛç¿Ý TFQ0Ù=9¦F>&½þh´ÿà¾#!úS¼¢<âc@ã¶,º½©õ|qº×¸øôÕ³}ÊEÅ3RÃz#ÃêÊù&ýº(*¡ ä9RIÇåÔçZ¦¼ P¡ö½5e@ ïc}Ê-Ku=¿Ôâ`û}PÍ.ÆræÏw?/¡/Â%,Í#öá˳/°ó¿|ø°Oü Æö YMà>ôÄx`èÿUb>Ó§ß¿Tÿ½~* QOÁ[K|ûNïÁÇ'°AÊÏ«¿þaøËÊ-ýX_ñ;ãW&f5PTýøýWì/ÓS>fN-¥û"@-9dYYU乯YPcPð?Ä(qHWYDò²ÿ5½³}ÇÄ0ÊL`ð}þ+¾iתsw¼lÈôÔ4ìíbå4@Ëõ=kÛftN·^»(»ôø17ùºW®ììØjìn¥¢Äogóþy(ö_æÃÇǾʿ÷$øÁß3þâþÍÊÁûAÚW |
From: Luke H. <lh...@us...> - 2002-11-25 06:53:14
|
Update of /cvsroot/java-game-lib/LWJGL/examples/nehe/lesson12 In directory sc8-pr-cvs1:/tmp/cvs-serv18314/lesson12 Added Files: Lesson12.java Texture.java Log Message: up we go =) --- NEW FILE: Lesson12.java --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/examples/nehe/lesson12/Lesson12.java /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import java.nio.*; import java.io.*; import java.awt.image.BufferedImage; import javax.imageio.*; import org.lwjgl.*; import org.lwjgl.opengl.*; import org.lwjgl.input.*; /** * $Id: Lesson12.java,v 1.1 2002/11/25 06:53:11 lholden Exp $ * * Display Lists * * Credit goes to Jeff Molofee (NeHe) whos tutorial this is based on * * @author Luke Holden * @version $Revision: 1.1 $ */ public class Lesson12 { private GL gl; private GLU glu; private boolean done = false; private boolean fullscreen = true; private IntBuffer textureBuf = createIntBuffer(1); /* Storage For The Display List */ private int box; /* Storage For The Second Display List */ private int top; /* Loop For X Axis */ private int xloop; /* Loop For Y Axis */ private int yloop; private float xrot; private float yrot; /* Array For Box Colors */ public static FloatBuffer[] boxcol = { /* Bright: Red, Orange, Yellow, Green, Blue */ createFloatBuffer(3).put(1.0f).put(0.0f).put(0.0f), createFloatBuffer(3).put(1.0f).put(0.5f).put(0.0f), createFloatBuffer(3).put(1.0f).put(1.0f).put(0.0f), createFloatBuffer(3).put(0.0f).put(1.0f).put(0.0f), createFloatBuffer(3).put(0.0f).put(1.0f).put(1.0f) }; /* Array For Top Colors */ public static FloatBuffer[] topcol = { /* Dark: Red, Orange, Yellow, Green, Blue */ createFloatBuffer(3).put(0.5f).put(0.0f).put(0.0f), createFloatBuffer(3).put(0.5f).put(0.25f).put(0.0f), createFloatBuffer(3).put(0.5f).put(0.5f).put(0.0f), createFloatBuffer(3).put(0.0f).put(0.5f).put(0.0f), createFloatBuffer(3).put(0.0f).put(0.5f).put(0.5f) }; /** Creates a new instance of Lesson */ public Lesson12() { } /* Build Box Display List */ private void buildLists() { /* Building Two Lists */ box = gl.genLists(2); /* New Compiled box Display List */ gl.newList(box, GL.COMPILE); /* Start Drawing Quads */ gl.begin(GL.QUADS); /* Bottom Face */ /* NOTE: glNormal3f(...) was missing from the tutorial, but exists * in the lesson source code. * * Without this line, the lighting changes as you rotate the boxes */ gl.normal3f( 0.0f,-1.0f, 0.0f); /* Top Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 1.0f); gl.vertex3f(-1.0f, -1.0f, -1.0f); /* Top Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 1.0f); gl.vertex3f( 1.0f, -1.0f, -1.0f); /* Bottom Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 0.0f); gl.vertex3f( 1.0f, -1.0f, 1.0f); /* Bottom Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 0.0f); gl.vertex3f(-1.0f, -1.0f, 1.0f); /* Front Face */ /* NOTE: glNormal3f(...) was missing from the tutorial, but exists * in the lesson source code. */ gl.normal3f( 0.0f, 0.0f, 1.0f); /* Bottom Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 0.0f); gl.vertex3f(-1.0f, -1.0f, 1.0f); /* Bottom Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 0.0f); gl.vertex3f( 1.0f, -1.0f, 1.0f); /* Top Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 1.0f); gl.vertex3f( 1.0f, 1.0f, 1.0f); /* Top Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 1.0f); gl.vertex3f(-1.0f, 1.0f, 1.0f); /* Back Face */ /* NOTE: glNormal3f(...) was missing from the tutorial, but exists * in the lesson source code. */ gl.normal3f( 0.0f, 0.0f,-1.0f); /* Bottom Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 0.0f); gl.vertex3f(-1.0f, -1.0f, -1.0f); /* Top Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 1.0f); gl.vertex3f(-1.0f, 1.0f, -1.0f); /* Top Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 1.0f); gl.vertex3f( 1.0f, 1.0f, -1.0f); /* Bottom Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 0.0f); gl.vertex3f( 1.0f, -1.0f, -1.0f); /* Right face*/ /* NOTE: glNormal3f(...) was missing from the tutorial, but exists * in the lesson source code. */ gl.normal3f( 1.0f, 0.0f, 0.0f); /* Bottom Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 0.0f); gl.vertex3f( 1.0f, -1.0f, -1.0f); /* Top Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 1.0f); gl.vertex3f( 1.0f, 1.0f, -1.0f); /* Top Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 1.0f); gl.vertex3f( 1.0f, 1.0f, 1.0f); /* Bottom Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 0.0f); gl.vertex3f( 1.0f, -1.0f, 1.0f); /* Left Face */ /* NOTE: glNormal3f(...) was missing from the tutorial, but exists * in the lesson source code. */ gl.normal3f(-1.0f, 0.0f, 0.0f); /* Bottom Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 0.0f); gl.vertex3f(-1.0f, -1.0f, -1.0f); /* Bottom Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 0.0f); gl.vertex3f(-1.0f, -1.0f, 1.0f); /* Top Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 1.0f); gl.vertex3f(-1.0f, 1.0f, 1.0f); /* Top Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 1.0f); gl.vertex3f(-1.0f, 1.0f, -1.0f); gl.end(); gl.endList(); /* top List Value Is box List Value +1 */ top = box+1; /* New Compiled top Display List */ gl.newList(top, GL.COMPILE); /* Start Drawing Quad */ gl.begin(GL.QUADS); /* Top Face */ /* NOTE: glNormal3f(...) was missing from the tutorial, but exists * in the lesson source code. */ gl.normal3f( 0.0f, 1.0f, 0.0f); /* Top Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 1.0f); gl.vertex3f(-1.0f, 1.0f, -1.0f); /* Bottom Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 0.0f); gl.vertex3f(-1.0f, 1.0f, 1.0f); /* Bottom Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 0.0f); gl.vertex3f( 1.0f, 1.0f, 1.0f); /* Top Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 1.0f); gl.vertex3f( 1.0f, 1.0f, -1.0f); gl.end(); gl.endList(); } /* A javafied version of AUX_RGBImageRec *LoadBMP(char*); */ private Texture loadImage(String filename) throws Exception { Texture texture = null; BufferedImage tmpImg = null; /* normally I would use StringUtils.isValid(String) from the jakarta commons lib, but thats beyond the scope of this lesson */ if ((filename != null) && (filename.trim() != "")) { try { InputStream is = getClass().getResourceAsStream(filename); tmpImg = (BufferedImage) ImageIO.read(is); if (tmpImg == null) { throw new Exception("Error: Got null from ImageIO.read()"); } texture = new Texture(tmpImg); } catch ( Exception e ) { throw new Exception("Problem loading bitmap", e); } } else { throw new Exception("Error: file name is not valid!"); } return texture; } /* Load Bitmaps And Convert To Textures */ private void loadGLTextures() throws Exception { /* Create Storage Space For The Texture */ Texture[] textureImage = new Texture[1]; /* Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit */ try { textureImage[0] = loadImage("data/cube.png"); if (textureImage[0] == null) { throw new Exception("Error: got null from loadBmp()!"); } /* Create The Texture */ gl.genTextures(1, Sys.getDirectBufferAddress(textureBuf)); /* Typical Texture Generation Using Data From The Bitmap */ gl.bindTexture(GL.TEXTURE_2D, textureBuf.get(0)); /* Generate The Texture */ gl.texImage2D(GL.TEXTURE_2D, 0, 3, textureImage[0].getWidth(), textureImage[0].getHeight(), 0, GL.RGB, GL.UNSIGNED_BYTE, textureImage[0].getPtr()); /* Linear Filtering */ gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.LINEAR); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MAG_FILTER, GL.LINEAR); } catch (Exception e) { throw new Exception("Problem loading textures", e); } } private void resizeGLScene(int width, int height) { /* Reset The Current Viewport */ gl.viewport(0, 0, width, height); /* Select The Projection Matrix */ gl.matrixMode(GL.PROJECTION); /* Reset The Projection Matrix */ gl.loadIdentity(); /* Calculate The Aspect Ratio Of The Window */ glu.perspective(45.0f, ((float) Display.getWidth()) / ((float) Display.getHeight()), 0.1f, 100.0f); /* Select The Modelview Matrix */ gl.matrixMode(GL.MODELVIEW); /* Reset The Modelview Matrix */ gl.loadIdentity(); } private void initGL() throws Exception{ /* Jump To Texture Loading Routine */ try { loadGLTextures(); buildLists(); /* Enable Texture Mapping */ gl.enable(GL.TEXTURE_2D); /* Enables Smooth Shading */ gl.shadeModel(GL.SMOOTH); /* Black Background */ gl.clearColor(0.0f, 0.0f, 0.0f, 0.5f); /* Depth Buffer Setup */ gl.clearDepth(1.0f); /* Enables Depth Testing */ gl.enable(GL.DEPTH_TEST); /* The Type Of Depth Test To Do */ gl.depthFunc(GL.LEQUAL); /* Quick And Dirty Lighting (Assumes Light0 Is Set Up) */ gl.enable(GL.LIGHT0); /* Enable Lighting */ gl.enable(GL.LIGHTING); /* Enable Material Coloring */ gl.enable(GL.COLOR_MATERIAL); /* Really Nice Perspective Calculations */ gl.hint(GL.PERSPECTIVE_CORRECTION_HINT, GL.NICEST); } catch (Exception e) { throw new Exception("Problem initialising GL", e); } } private boolean drawGLScene() { /* Clear The Screen And The Depth Buffer */ gl.clear(GL.COLOR_BUFFER_BIT | GL.DEPTH_BUFFER_BIT); /* Select our Texture */ gl.bindTexture(GL.TEXTURE_2D, textureBuf.get(0)); /* Loop Through The Y Plane */ for (yloop = 1; yloop < 6; yloop++) { /* Loop Through The X Plane */ for (xloop = 0; xloop < yloop; xloop++) { /* Reset The Current Modelview Matrix */ gl.loadIdentity(); /* Position The Cubes On The Screen */ gl.translatef(1.4f + (((float) xloop) * 2.8f) - (((float) yloop) * 1.4f), ((6.0f - ((float) yloop)) * 2.4f) -7.0f, -20.0f); /* Tilt The Cubes Up And Down */ gl.rotatef(45.0f - (2.0f * yloop) + xrot, 1.0f, 0.0f, 0.0f); /* Spin Cubes Left And Right */ gl.rotatef(45.0f + yrot, 0.0f, 1.0f, 0.0f); /* Select A Box Color * FIXME: gl.color3fv is not currently implemented. */ // gl.color3fv(Sys.getDirectBufferAddress(boxcol[yloop-1])); gl.color3f(boxcol[yloop-1].get(0), boxcol[yloop-1].get(1), boxcol[yloop-1].get(2)); /* Draw The Box */ gl.callList(box); /* Select The Top Color */ // gl.color3fv(Sys.getDirectBufferAddress(topcol[yloop-1])); gl.color3f(topcol[yloop-1].get(0), topcol[yloop-1].get(1), topcol[yloop-1].get(2)); /* Draw The Box */ gl.callList(top); } } return true; } public void killGLWindow() { Keyboard.destroy(); gl.destroy(); Display.destroy(); } public void createGLWindow(int width, int height, int bits, boolean fullscreenflag) throws Exception { fullscreen = fullscreenflag; try { Display.create(new DisplayMode(width, height, bits, 60), fullscreenflag); gl = new GL(bits, 0, bits, 8); gl.create(); glu = new GLU(gl); Keyboard.create(); Keyboard.enableBuffer(); resizeGLScene(Display.getWidth(), Display.getHeight()); initGL(); } catch (Exception e) { throw new Exception("Problem initialising Lesson", e); } } public void start() throws Exception { try { createGLWindow(640, 480, 16, fullscreen); while (!done) { loop(); } killGLWindow(); } catch (Exception e) { throw new Exception("Problem starting loop", e); } } private void loop() { drawGLScene(); gl.swapBuffers(); /* Keys that have a constant effect */ Keyboard.poll(); if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) { yrot -= 0.2f; } if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) { yrot += 0.2f; } if (Keyboard.isKeyDown(Keyboard.KEY_UP)) { xrot -= 0.2f; } if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) { xrot += 0.2f; } /* Keys that have a toggle effect */ Keyboard.read(); for (int i = 0; i < Keyboard.getNumKeyboardEvents(); i++) { Keyboard.next(); if (Keyboard.key == Keyboard.KEY_ESCAPE && Keyboard.state) { done = true; } } } private static IntBuffer createIntBuffer(int size) { ByteBuffer temp = ByteBuffer.allocateDirect(4 * size); temp.order(ByteOrder.nativeOrder()); return temp.asIntBuffer(); } private static FloatBuffer createFloatBuffer(int size) { ByteBuffer temp = ByteBuffer.allocateDirect(4 * size); temp.order(ByteOrder.nativeOrder()); return temp.asFloatBuffer(); } public static void main(String[] arguments) { int err = 0; Lesson12 lesson = new Lesson12(); try { lesson.start(); } catch (Exception e) { err = 1; e.printStackTrace(); } System.exit(err); } } --- NEW FILE: Texture.java --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/examples/nehe/lesson12/Texture.java /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import java.nio.*; import java.awt.image.*; import java.awt.geom.*; import org.lwjgl.*; import org.lwjgl.opengl.*; import org.lwjgl.input.*; /** * $Id: Texture.java,v 1.1 2002/11/25 06:53:11 lholden Exp $ * * Just a small container class for holding texture data * * @author Luke Holden * @version $Revision: 1.1 $ */ public class Texture { private ByteBuffer data; private int height; private int width; /** Creates a new instance of Texture */ public Texture(BufferedImage tmpImg) { width = tmpImg.getWidth(); height = tmpImg.getWidth(); /* flip the image, so it displays right * There might be a way to do this differently... */ AffineTransform tx = AffineTransform.getScaleInstance(1, -1); tx.translate(0, -tmpImg.getHeight(null)); AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR); tmpImg = op.filter(tmpImg, null); data = ByteBuffer.allocateDirect(4 * width * height); data.order(ByteOrder.nativeOrder()); data.clear(); byte[] byteData = (byte[])tmpImg.getRaster().getDataElements(0, 0, width, height, null); data.put(byteData); data.flip(); } public int getData() { return data.get(0); } public ByteBuffer getBuffer() { return data; } public int getPtr() { return Sys.getDirectBufferAddress(data); } public int getHeight() { return height; } public int getWidth() { return width; } } |
From: Luke H. <lh...@us...> - 2002-11-25 06:53:14
|
Update of /cvsroot/java-game-lib/LWJGL/examples/nehe/lesson11/data In directory sc8-pr-cvs1:/tmp/cvs-serv18314/lesson11/data Added Files: tim.png Log Message: up we go =) --- NEW FILE: tim.png --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/examples/nehe/lesson11/data/tim.png PNG Q´vóÍ<Û`!¿e@õ$Òq}gÔÍfzÈEr§Í~Æu¥½iÇiúLbÛ7¢ÞXsbÈòϪÉàG]$÷¹j*:*6ɱ F-¨Q\ª÷R º)ÁãÒ]Mðá+7 8° Óíï<îë2{ú3¹;liO±Ëä9îÍcEÃÈ¢'çlU:ïM ¬;ÏÊOñf¬3>qýÈSl <´ÐK=`Õ5½"}æïãSS MbE)óBäR±MXG0¨ù¢xMÊl7ì±l¥G (#8¿ûªÔ Yª-TûVPHß$¯]5C³ñªLÉÂËØÕ} «¨ù¾¢)îyfIÎPØ4ÂnEíÿ A¥Lß"tDdv¨ü#ñK¨Jý'À\{fã>âäºÅ¶s^¾Æ§áBp@® C®r8@)û=¬$þðúQ*?þ½øðëJ ÜwU<¥Ú¿ ¨)3rüf$W¿ÊbTr^-Jú¤Uå¢xP®½÷<¡eÛ_ ÃÚï"Û Ìía´)¦E@°¦/²¿ó`G³¶vk@<D¼[VØz½/Igv´óè~À<Àðñ·Ø2¡ÿùÂmä[ ¾K)6Á:6 4w¹;Þ{} ¤Üyv%üêðjuM@s®=MÃgÌøôGå,¹!gY_+ú2Ñ`fíP£m©RS*JÆ_ÿÅéÉéÒjõ/}ò9Væ[ì}\çβ5ØùZ$téãû^È\E¥ýµµG¦% 4Vñ[lÈqob'+~®XrX÷q1A£Ðm´)òÈ-E¤ÂW§ à éqGNF¢:· ê6¾ É÷/i ñ³ÐXNý.ÎCa dÈN½j2ÚÆ¶çï»ÃQÅÊÎâ«Å®ë§k³ªA$i/qêüjÀÿ {.9Üáb0ühk¿²°Mº>n/W`1ÉeòÔ«ñì÷~´¹6«yC99méè»zðò°×Ðb#$² Àº¤ ÁXZ\´ôàAÐÿÿ'ñ*F²¶¢ÎfM)i"öØ6I';3»I96¹1ÓTé¨e¼ibaOT#Ðp6QÏ?÷» Íýôÿ2\"?` ØUJd¹µ²Âûµ¯eê6RH_¬¡^kOÞ?0ŧ8=®+ìç÷½Ù!~[(o³?ñOhe»h"äÌÍèE¡º;¼>«ÂñyáÚy5Oý}õJecÚýÖxÒ²Á×T5~ Ì ÆG×ëlHÖºýîSñ¥à@4ûy¦3wMHéh.Á!¼ Ü Vaheë¶ÿÿ¿@ðX%s¾$]í\dtí½¼¼¤ë|Êån²/lñj rö "?¢c{Ô¸§)|¾T+ÿ'¦#ýXÎ3~c7+¥ÁDÄÀ# ݬÈpÆF`)o ÇV|¬m æÝ!¼?Nôï´33ÎZz®9Ò]CØ0îU 7lÔbÁ³¦gzmSCÔ¸f¨ ×Ù=|UyIÑ2¨æE°-ÉõÙÓADáò% ( ¾>QÏâøQ°Þ>÷M\ì!?`}TÎiè¡Rª¦ÂpÚ6dèøÅÝ>¶þwÄ ô@Ð0Zk0.r¸7%!',Ë pØ©FuâIq/sÂÄ$XU¦Ð¶@o¶£q§Ù~ØÇUcÙäÉ=wb:çì]&G çy}¯ éê÷+(2´j1IÜhð½Dbì¤!±X úJ3ئGË*iG¸Óò #U¤pÕñþÑÊÈwÝ$¨´¥p[kó' 5ÕÚ¥'äf= QlËîjJá:?xLÌQ9n1L> &c¡bOEÃ4Ðâ½E¿bØyÛ_ø¸a Hh/ñ+üÿ¿ò ¡jJÜg²t£=& 4ÝIg&»=ÚaÿÃ(QbD~ñ(_çkûxÉÆ^·òÀnê56iþÈt'f,ËO.c|ìðúÐKwÌÄÛY6 txÙD?ªÎ3ÛÞЩx2{{J 4â<+éã0÷}Ú¯~®9Kö6"׳MÁ#þugöE[¶äÒ ¾txªíÆ g9ï¬ÃGÃÉÈmÎ%Ô#ja«øèj&¸[ï,ôfmÌÑ$+¼xpÖ¸¶ hìÞi½¹O{m ËÑÅ0ϤsJHK¤Øcz©Ë¨ÎhJÀÂæÌH9XÍ$ǯ´Þ®1 ¹dä²OȿԮ³{4gjGnC* è7_X¨Öú³S±ýo+ØA¡5¨É¼yàÀÿ^Ä"Alû Ô¬pà]´]ûÞë6é¾µØpÛâ+p©âÿç£0Ø$«DntQæå+É×`.·BË_ÐMyÚeëÀ Î8hRÇÅtç÷5p{z[q®½ðßÕÑm6a¿gâ®âªY8L& G\Rë]q gè%EL3¢o7m¯ÔÛ¡íô¥bÐéÎÎ ÑöD8Ifp£ W·T¥P¾ <ùþo'x±ÒÀ¨?q±ëZ½ì°K;&¾$¶vÖôâ±|VøÇÏþçﻩKa=VU©Ý^«u}½ø³û Ïdê\ûÕ\±§ çP¶w ϸ©Í`Èã¤8ÏÉ´¾½åüX«ÌB0EëCû&ß ýÒ&æ(F¹o§\"¢Ç Àe¬E^k±â}#F`Ü ×/«Ïv8Ìdà)V·ª2Cðü`üh<ÆèÔþ$+¸Jh% HÊñqVm3lÁð>¯ÆTV+ ;©E º/¬ñ/g[@G×NdP¼X7JÖe"<Æí³½lTåOûɸà$|¤ ß8²ÄâS @à¦8x¹Gç6ªöt ÷¨í»?ÜøÐÂä&&}¸§3édFè#)]/2àaÒ{ HåûG±²Ép3T úäü|©Mã¤~Jé/Fú7#B=Ã*Í»¸£Þò"v¶m`õÓ'YäØ:·Ü 'Ây¬s =£¹Ñ`ßn*?ög¥-]'+¢ÑsrQT:{¯z7ÞBÙ»M0ýÈÚ4djùÐG¦¥N@ÝÚ×ï0 ©4DÕh« B£Å+Q<3@ec\Êâ3²wÂù³3¬Àtª¿]¬L#"Ò¤ìÓÊã±#Í}`ÐÁHxöZg3¶uÞ+µ îè4~ôp4*ØéF ÉfS×ÙYn-)Ã@4V¥#ºÈÂE@Àû_Á.??ÎL¶ê¶%i¼¼yyÑàöKäÔwÞ·L÷¯æ©³»©Iðto.T N)<í¬IZ#Ë3îEÑÄ__kTqâ¸Æò1f#ëÉr%/×ÔÁ×ÃÒ[¤ â »Rìjçä´q¾,»@ó3ÃuÖ[ÄYE»KÈ?é9[5QÃefKû QâUÂð-ém¯-ùU&k,-àg,¯$Ø#éh/ñ]özV¢ZL ¦ËÑËQ4çäÒ.\ºz}Ïøg4ç düeW¨ÙI§©ÒÌ«ì¹àμ®×ÛÇ,ÈTùùVvCÙÀ´NMb>î3ò§ Â0UhD ñäIüÿñ$<ô AêÏ}%ª ú¡´ÝÙiGsùo(ÿ Þe8=zÙOÄ÷ :¾½ó (v(4lÐkÔ»¡ó%Årù6¾úY Ö*äÕ7õüsG¤è®UçÂh¶x%çõEë[³HS3±Q?=Ò%¡lÛ\sÇÁÍ@ÿÖ|e+.)Ô Ø5P|¯ª°ìܰ5§ÐÒUÖó®¸DÌÀÕþv<ÉúF÷ÉÌÝKȹY²hÄaqhÞ!u¹Qv:ý`鮣#ñÁW >KhBüöþ'ò\«bðí<iù!MÃÒ·ÌþõF÷À¡QS É í®ªÃZ½ìÿ_}Ï G-ÐtIÊ1´¹lBüñ^ ñÕÉb)´>ÓödÈc±n\ØYÖû%½æ³{]+C@Á¼÷là&)b'fâuV ßÍ'©@¦*rèÑ!î¸îÃ_Uíí:ê¯3¤® !kkÞñÙ6¡]2êp±ª1FÉ>8Ý)4-*Mt&ÿë¤b«?ô>réa3§T&$8öf/~;Íúc¦×[ /E zPËâ äÇ&I Ð{Èoλ%YE£×Õàx6ÐÀ`Ðv Ø ÛêkBÏF¥øs-mÿ>sI¼QéÕï1+ì°ÒH:e\Øó¦fÙë|ë³Øð3 JÛ_Jî(ñË, ägÐåë'0y¯ã©W7âP|ç³çlS9 =øÿ?æÍB|îd6Ù]*Ò£ÅZ6Édföj£ï£ïÌ+ÍÜêôzÐó ´ïÖ¥w«f¬#:gg4ºD¦èVñR ökÒÀ¹§-mäþ@d³íÆ]h:lZ*?R(#¤y¶¿x4G®%§!\8Ó}L m:Ý%Gü¿ìâñí±Y f¬Æ{ðñhý ¨D_ à6ÊB&Hq¢ ('=¥Gâ4°;@|¶Z/$EÌ'ÍÝCÂDcÕþb¡còqü}ÁX6)j zql(q=NsJ³õS¾âÆL¬Q¾ÄR%kB´ûÿ:ZTÙÒ×m¥9fII v¾¯W4ñwÑpG¥\Úêl¡æ@²9cngó\LÏ"7BWz%5ä¹7µ´Oëj ìaLi1 0!¼¦Ï¿nIMfòòÂÅH·b%³ æny9½cØJ7Ç{²k[UZU²ÝÅ^ãhª[ÜþgÝ\§\Ðqí:Ã@¬BRu °0ðÿß)-9Û¹¦:tèÐár/_|Þ×CN~b§áfv ѹEÎïØôwÉ#ofÀÖ\q±zÒnKÁV ÈÍ<þ^ªJc5¯ÐfB3ß9|?UºO"©ïm¢åZò¥ýäQR³±¶0|f ÂD¥³°îsj_øºó«½>¸÷o6OÙ±,ÂÚSp"¼µ¦ð@vÚ¨<ªräº øä³å)1W³¾üá ½@kö·0<j¬SG¦¿]"'1¢ã(55\«<é¹îæ0Öob'²÷6#lá^½ðÁ0 |éHr_sï×dÿ;<N~Ðu%9Ã00@¦§ÜàÿâÂ#"!UAØc;pi{h¥.I:ÇSï õX¶êîÊCÝ_ °îÆÌ9¶Sì¢+Ò7pãÈeY>*Ã]Ê\¿ÁÎc ×§çè⩼}RDøá´êÎJQÔäfÉs×ÐϧÏ2©èw?@NÛ£6YYD>ªjZ¤pÆ:áavkiÜ'.º"È¥¦` ¦÷ÙÜ)·~Áp®rlk^п©´Ò¿e@';¼ßiv:P"`UüÁòå>ïé6ËkNêcàäbç&i³Wkí&E,Miýô7,=%þ°u6;1nHp3xñýÎ+1Ñi»,+À@H°[úóMñÀ ȵ9°ìw°ÇÔãÂ+Cæ·|LÛFö_ï ëh{YÚ®ø$9DÃ,[PäÖ}'\ð¼ûíáêXÖÍý¦+·iTÜ>oþ`xÐPøM aá?ߨáÏÎ1ÒyÕn±Ì¥Ðs~cÌOƼ)N©ñâm=÷ÛÈÐl^¥PcrXR¬[b}/^Y/ ^æåy ç9Ý2à=Ü%H+¼mý©ÿ¢2°Þ2:oáeMJdåéÀ÷ÛvE¬³µÏG ^Xÿ½c eVîW /¾0DÕ{IJÖ:v!6ù#®.ðÑÁO $£åßz>×lh0:cUApO,°»ôàéý×ÐVcw%â#5L«I6P^:t×iÕVTÄjG1sEjUÊjÏNj¢ÿ¤¤ùÈ£JÊ®ÕÛ¦üDnâÂ7Ù>ÇÒD¯gvå¾^Ç$@×J³-ì~;ág ÿ®IßÁ8Ùʺª2ÈHy#p¤®D'(:´%(þºèfa¿Ø w_ >Zá¿õʦÁª¾3¬ç<ð¯+ÆA. ±ÿºD8ãºQÓµ[ıÏw>6Áé,t©ûEà©M<a$ Fa±CÍ)ÿÒ,¡\ 5¢xþ`ì raXÑV)8päÿ m:ãÕa&hÕôt¬L,kãË$WÓªÏ,¸*ûNÓÂ.ò{O°Èº:/Õ:D'v±¹,Ñ)ÔëIÓ¿âHlJ#ó·,¨,©?ÑnÆöU²§°$KÞA¸U¾ÉÚs;yò ¾§%/ÿ©-i"L¾Îè¯êdQØ?a{ïþ Æ5~¨np&;PÁá&c}äqxqÈésÉÕK°Íç×ñÍiñ¸íZ.¨ Þ«¯PÁ}¬Ö3ô±íý äZvbàh¬þÿçü pαôJm[¬Óá¬Íû¥È¡K¾kås´8gÈtæÃ âqJ7Õ¡ï¢=YU*-úý°jh1¾A±¬«·? ð£'ÄÈí_ÕxÑËÖ·"ÎS¥·æÀO΢/{i i'~3Í/h/+°ñ½Jò ÓØ-;P\NÏO§¾ê§±*øR¹ï<Þíå ÁW Ð"F¿e0 Jf*í¨üPðáq¢Ä¡´ö$á¡Wòþ ^ñ=ØÊ6ÎF;+2ÄÚ½¼SÀBS,HFiXÒ°ßÁ `PɶØpàõÎj ÙS9ÒÀk©ùbåsà>è¡ëCRÄæÎ];kwè©ÒoK%¾Tâä78ÉÔ3ÌÓ¦=DD^K±-BÛ=Ô¦mhG÷¦¾EócÍ%þ0v%9Â00z@åÿ¿²·²2v¼ÄÑ+bÊØÄϼÒLö3Bfݲ07°_µ©dAuÑä(öóO0×LhòÕ®ÆYÔP=&tÕÕL=D;ýNÂ> 6V@¡~gI´Ì´ù)Éä^8XÃäLó%lÍÉíçRÞæd,N'>(<ô¶ÁõÝG}ÿ ¼Ö0«#M»NOtïÇßãÑHÙÓe«¸¡Kt'CÌùÜÃézIÕú·öm<âF èÈxíi^WÒüÙ÷0é' +Ú$C"ê ÷¸%ïIʸyv+Øûyp`Ês(Ü/@é½®0 b.Ù]je$?hW8ÄóPÔcî¥Ó¸NyêVxTbVGMñ,4Ú¦¶T`]ivfã.ÕIJ¶=²~wh#¡àÿL aIõøÈ×DÍä1E¼þ>W6í9©È¸áð#n!K÷ß_¶Õ5hö#Åw»þ¸ Ã0$CLóÿßVÊO~ÄMJh·#ÙÒéN©¯ á,X9ÛÒÅC´QýÓ¾?&%¯K `ÿeq<#lÈ:XÀóÚjÿWF;rY¶ªrFd¶ø?#;xîìÂ6SÀ!9Ñ/,V_'Ý@G*(¶ ®î;þ<5Ó?õ£ 0@Sþÿ_:µu2·¡UAݬà«9^(¸§¡PBÏÃãÂÉ©ýÅW1Xé¨åz5Dºq/dN·Í¬)ÜIÙÃFø'sZ>Óä=þMøn;h C+h,/Êf£°¡dÏIGxùÖúh¯/¨tSlÒ7Á{ê0;z Eq¥ÂwCp÷Ût=½ ÇsumîéOcEâåBß©å,}¼¸ÿöìwÅ(1ÌKðÖÿÿ±C CZH±³EZJèÒ-%smYj-DàWÓZÚ±xü«=ÁÀ;V&¯éC), MW){ÞÞB<<:Q õöSÞ0Õ@)¿ïÝÇÈf +¶QçËåèZã}´Y÷Öp§ßíæÊ8EbêÊÉàÉèÿG¹øgj×e|`IàHkÄ^²<ãÖÿ28YÔþòOF¶ø|N8/ÛäO/¹ YI aöYf[«ydÇPçû»« ªR<ÊýÛúf®ø>üÿÔëµ+FDtëèÿ(ÆVDkrRtªÅ!ö.ñri7£X$XàBÎaªoZ©Ís!q45Kf ®KáK7cÎ5tx:fz'ÃÞú½^j9iWÁ6 ýk ûuücϹc»*ò¤ÒÈtg¶44%Ð OÀcÞ¬s½õýÜËk& ,<Ð$°NªÀ×àÆ'LÖ+ü E¬w¡QùW»Gø2"ðrÒ«wþY°ví* VÍ¢óîzlY#1%ðjO¡y¸@f|Z³ÈE9fÏý^õ^§}"· ¼ö´£[æôÃÆ פºÆ¹9Ðì+wUd î?´Xà} ¿ BûüùÜpv-; b¨½âBec§t5J»ùú¸%ÍD'ZŰgçl,@es{s <vôÿÿB/Aaè>ZsÙ¥Cö!4ìQß½[te+d}(ÎV a_²ÞÂë#`fýèTÜg5´¯\Ö%S¾}LP/½q ã« Òf,%]ÄcXM¶m k²:ËRÁúWè³Ø;¨B¥ã7Ëyo6ºJ2å,×ï®Ö/íáß´ÊYòÂl«è³ñhN6c¢¾Ñ 9Ç¡tOâ. =`öoä®FC#ÝIçåQ· L~þ. ¨*æé±7B¢3¶8¬P½= !á^äZ¾Kj·¦rÕ!u::×éÆ=÷ë)Ä 0°û¦- A½|eÙ_Ñ«ð7IË}v Ú}:?ѵ%% ÿÐ\αü] /yh§R1"¶ 0Ýóe'H^e »X;0A^§à¡°ë4kÇN÷èPûÓìÒ[ ²Mëvý³_»«]CÞ*Î¥Ñ7Û7GRlíþB{2ï]ÒbCn ¥°U×èQfÿµOè£80º&þß?½¿ÞÈdè,ɲzã2ÑÜü @Úµì >Äôèyx ô1Ç1|âjGQ«À%)Á«÷XÙAÃhÓà*ÉÜöýúaµ.¾ýÔªÊ÷ $ð1gбfÎ÷ÐCÞ©_t×°û¶æ Xà«e Çò \añãhz!ü d8X ]CwUý1|gï@ zô ÃçVä¸ÀÛ¹¤0Ã@T ¦xS(ä½ÿzCQi Ño)¨M÷YØF±<︨"B°fò¾Jä¼ñâ- [pP·òASexÖïI µ<ñeóÖ1]ÔèyÈ\¢ê®3½ÝØä$z},3Zý¶7NyJ?9YñîÌKIáðä ±peeúþ¤^¾ßÝ3¶%kèÁÜUI Ëü8Ôåûæ§r3þ&DÏ(À¦M":.¬âù®Û¼.7ðúgIÊñPE¦±4rÚËGÈq°°«MäEjÈ"Ø® üIIIÚòQÛçäBÉb(P}"Èpäw P3iFÿ̸dsxÛÒa¿;_®Ý©kiäyd^¡$½AÞl?ã>ß·ðò&Î<;G~8¾³¹±Å7}8Y·³ºÌßj+N¦Xuç÷o0¦\Ù»K ]^¸,DÓ !À&Æ54¤üÙK .qoSÝ++zñÑhù ÒFîÿ8!Óÿì?¾äº-È Áðõ|%&ôL\Ð`ÐÔ´içÀH©$Há îgVÐ2Ô3O®þÁ#(?qzYO ¶ém gÐÚYJpl,ů´çOn2jb,+ lôÅD ³ÎeÇ6s® @âñ@%ºH`â9 {¤zZÃÖ:üÀiìðõÿÀc8@g«@»*²mg"âlÐ?H»ç¶eG£"ËÍÉÌ >W®wZ^ñ7¤uù³arN®fÔFp®1 ܤgv,dæ¶Ö¼ÂÖÂWG¾ Ê0ÉÀtϤDç_:7 ¦ò?Ã÷ 5@/2uÁM @ÿ6+ îø#õÃ÷üßgJÆ®¤|õçÔj S¤8Ø89STà¡P±¡&/×>¼ûüìõ×OßÙ?Êf`ïÜå/,®ù/û¡ h'¤6àßÏV1B®Çý6ÔCä Ý»wHjkÛSü;WñË«ò ¾ÿüþór *ÆÀÉ×÷Ï\:ýY ÉZ~àhpóÇ?V½|õíÇÖSoÀ2[JÀ«®¬ "A|ýï×òr¢VÄÄÈ LúÒø4ý5Æ«÷8 í´µ?BðñëÀ ~ñá;å»(Äij ÷H<+æhü8 Hµ g À»µì$DÑÖN;í*´´ MÔ Kñü E¦£i;Nâ_ÂÎ þd=ãO÷ðF¿U`ÂVÂ;B½Åûì}öøòú# ÛjmAPbKòa=õd¢w¯þ^¯^ä ÊÇvR§»`àÝ&vóÌ;3ïÚ9¿ÆBßÚÌ |Ê»=k¥A ¾Ô00(ñzÅñ $LQ£xÒ6" ÆàµÕ^Z¥R¡Ñ|ÚÍIÊZÌÎã+NºÕaã1imáyC^£N<Du<B(Gód¦çU~°DÿRDMÅÐT]% í~߬ư H11ÁÄb©@Î@=Ó! ÑtÑI_éí=ç;s§#EòÙVGId×á`ÌfN4B`Ge&&Î ¾·,7_ÛîSJrØa#5RÒ©8[2L'È$H¬iº'ÇG§²2ó©ÑvÄ¡òÁ..lËÆ¼îg´:ðr½.ò s@yÄòð¸ípäðËóÍ|®®ËÀú0@xABÈ̦w¶¶Õ¹ùýÂìê|´ýnÁ9ÄÈÃDè&¶MÈx$vlÌÙ>ûNÞ×/°ñ&ó%¹cÛ¢9âåÇôG±¨w âÇ%À Z¾\ZnwîÕ Ár±øÒQä®[¶i>çf895£7}£ö½ÃBV¾ìõv÷ªg»{¿ü8xñ|Á]_¿Uà+¿Í®&)Ð!¦Òû Bv FÆ«LC"qîBÀ#8-Ôv·`J0Ù¦¹ Õ´5½0.Fv«åÜj0!ÂCbÑ=®E.N¥Ç©øo!ãåOL´ýñæqÛgîzÁô±äCá|C¸X¤d$V®LöõýÄ © Ù("dt$è0d¤X-B¹ü@þÝÛoÀ]T*ô]¤güïr0ï¹² l¥×7VægÃ0Ï2[Ï*ǧ¿Zm£qZÝxT~ÿæ-QÆá¾ÊÚ|iéñæÆÊ~iyɵÅù Ó{ ìúIóë×këq¼å¨úíá\Ùòtý_`®Î²ù 2]QÃðPýFTà Ùçí&*éC ¨ÕkýçA«{ÜüZ×ϯ6É}ZÒ¿Ðuµ=iCQ¸Ø[Úâ¥\µ°2Tæ£&ìÍÄ%ưâôÙ}ØEQC*Thik}Ù9\ lɾôKoöô<ç<ϹT|ñîØóíáCX¾(¤ ùM ZAà]·®5¶ uI$)uE¤Oú¿°5ÛvéÛÍeϾ<å7Á°ó¥qiõÍ´Z¨>?ðÅ\³}a¹Ù¾=ùxÚ¹ÞîérÃ`.pÀüYu<w!_-¸YjÞÎÞÂÏ%(åuE&i!¸)^`D°p+û£1D³7ð.ZJ[yÔ³ÙüqÚ´ËÅÅdåøï]!È·iáGø×Fwj¾C d?¯=Ëqwm%kvìÃ×;Å_JEuÍzoµýJiÿÕKECÊã)°ß(V«ÛùÚÙg-˪k«ÄîyåûþÞvE/f²¥`ÿÁ)ô%KgsîÇ´g?Z¡¬aoð88$£©³@,FH 7¨k Çÿ|#¨cB|×=¯Õ_k÷7Ýcÿ´<ÜÃýhQ¿!"¶Ç?Pvu-jQ4ÑÄÌdÕÕµÂ.»µØ>,°-ûÒÇ}-ô±¿¥ÿ®ÐRJ[¤îâÖ¯f F̬é.ìSCC!LÎ{Î;Iöüí;Ó.él6{Ó0¤9p½_Îé:ú»_ß¿<{ÍØzî{rÙ PÌè+gù~¾Üèþöó~ x>Ö.®Uêü%Pâ$U5 F±HNïkÒò]¤ºWÌ(A,U IJw¸| Û0¤èË_ịݷÀvÕ·"z[ì%BÁ.§< µ âÍ2ÀP¨ÎÜò¤®ÆD<àb1c´rÄ4P¦](àáM»ÓõÜÏ.ÛA8Mz;S;ÍÆ°+6-Ûè`ÿè¯ KÒ7Pøàÿ¥Ìù26Ýî-üÄ@&)ÊÍûÛ64©ÆåçÂXÚ¦_³oE\ûDd@ö´(IðóÐ ²¢(mÍÊ«½ª>âî:öB3pcE A!½T1g×|KÆ?jû 8ØíìöݲôÝMèßµý!¦ )kÎW Ãx¡J?Ò²Nç-¸DôÊ£þ¯^û,ñRnNèt n(pÚ~ÐãS ÆykÓö´MÚs÷yïéá§îLátÌÉ?b~úÞ ²(Ê+Æ ÈZ¯b¥ºÁ{³xBp÷ñY¯¬jªOd#çf8U]µZQ°¾¡_PD°¬yüþÙËæçv[i ÍQ?,#N¼Y ® !^±å \:+:ÇoÍs{Ò:í[ÝîÛÛéZhIM ¤U ÅÐJ¨ 3ÚYº~£ãFz?FÓpÞéê®+úÒ/fϹl=YÛþEëþç_A²(g%¸qôOÏ2¬éÂRÅ©C£%ô/¤_)ÐÐïèñÞÆºd}PØüÃÝ«¢{þêY-¿H6ئVAùP]Ì?Ú[ßÔY}·q·q-¨ÅªQ³¾õ>µÛkZíʵ*ñ¡)èÀìÃß&¹÷o]fÛ$îP Ä6înoý~7à×µ¬óñÔw¶ð\Q.Ïÿxy&n8=È^(.ôÁ<xTÈ +èIþowe1ó¸l|a×/\Ääk»ud~ø¸ß´Ls`ò!w/AâéXð*`ÍÔÏp»Gýßvu¿MÃ@ÜMØê4©TuJ² "ñ!´G¤ñ¿"ñ0ÁâM°ªbû c]×°&M&c$ì<£NGÞNÏJ,ç~wºßùXÐ0à $ #KzºÕ¬Æ§;aàk®@8aTÀ Àqü±?´½±«ª pÒ3ïpr7V¾Yë Õsä.NßfvµÕÝ/å)s|µ\R £°BÛbhITªª].ú }¾B÷}¶«V,hH%L8`¢Ì£Iìà$8îq-Ú¬ªzuu¯e{ñßs¾óÛò=úÄêZÀi÷³Z]R"ÌFWW¢´W®ÕÆÍ² ?÷¹ÚïÕa~ü§tº·ÞÙNPÜëÕ!la%ÄU7 èú¤½VÅ<º_mcÅWG¢ VGR½tVl÷ÉäÓqâð$>ÿåû¾,ÛRé¤6sçα¬%6©×Õ2ïv¹ óD*£të·ásÎÞüp*æÈEÜ3[àùëJýëÒæF´³ÆÒË!*à'} 9ÅK©¬2´7¦(÷Øñl&QhÜ!U£ÿÓ æÓ3Æ.Sþàä5¸$¶àxè÷[Í¿½:áÀ3¼^wnÅØ^»\øh*´Ä R±:ê@ïç«ßb¸ª{ ù(úÙLYôÜ ÁýÉÐvuÐô²V A×8"CÃ3>¤ m¤w=½Ý̶÷ô2¶ ã{ªY¹ðã=!ðsóªFXõ¶Ê¿vCüµ/î{EÍÈÞy'ÞÁYi"ò «¼ìèvóP8< ºTѹg÷˪¦uû£_ÝËÊæ4Ó6ýó ÅuØh½ÌyF§Ýb|ÆEkjZX óÂýôåøé£=5«_ô]NJ1JiíT÷ì¾ÿÚKËýí»kN>B6y)²^[×Vß\V[ÀÔóÀÔN.MÆs¯^<ß®Uêõÿn½À:íFLW3¿½y÷áíáÑQh:îIëLûÊ2û?¯FDPA°afK¢8[fqNhàÄ;и1ÜÇ%/@*äÛLt?RAûÈIX(¡£d t`!A(èÿ±kémÂñz?Ú IÊ£)ÐCg~!PBDª@P ÐPê´ul7®ßͬ7.HXÖjµ¶,YûÍ7³ß½l{û!Ä-"/BKeÁhƾEl yT9¿|ýqt i-¶*G¹¶z°êè^ºîU{¢@ÿÔýþåMæ!2:&8 vRê+)!²â áÌñ±òàpúåÄË2,ÉúíÍyBK¿¸þüýÆ í¶Þí´NíâãÄ»¹fônt?ìîFûw{[æÏ½*_öúéÛ~_ÀêV¯§¯^Oÿ)ìô??~ù @ÿäÍÎO£Yé% §,GîmØs4õ ÇçÐÇÕÆý mâ&ZR³í1VµÍóÄõâ È&ûÁÃd!Â\S¾§è_z Ãx§(§Ph2ØTÄM·ÝHWÞ¯ý~6¯¼Ð¯F¢fc1¸µ0âAK)ôë{V³D~¶ÏyÞßóô4ÛzùN)ÕÀÈÃs{y *´ +¦Ø9ÐNúfÚkßÚ4À:@ÑÎv{ ÷ë½Ýçy[¦iÉllg3`ùQ Ñ[wׯP7 ÂfÞOD»;:øÚÐg8æ¯ø¨É,E¥{)¯ `r(ñdHâQ#<M./ø±H4È{EOPòÌ{yx£MqÒN´9Hóéeø¬OdÈjj_/ɤ>´½~÷*ÏloGD Ü^Yb®å«H8ú#g4Ó¥ìjui{²Àð_bvàmý¼û]lµª³"ýüé㻫7cáòYëø¬DèýÍü©Ú®mm<¹'å÷ûWVÓæ1Ûx(pGd{* JxQ Ëåa§1iÔÏ3öv³ýêíÏû9"ÑÀú/7ßìW²ß>~Ù*2Ù½o ÓüϽF³¶_Øíü¨ñ zôOÎé[׿bÅs%[nTË¥×Ö××r»Å< ;2où×´ÃOÐM´aü( ¥§Í dÑÌDãÍÆkãɾÆ/ ÑãÌnf@MØ42@9hKPRÜ 7M¶Ióöÿ>Ïïyuî>xz^½è5OôÞýhÈç")Èùr{îÚ:ØÆbtB·2¶ºRõDjí`Iûúª©O,¯pqÊæX0uùX"rÓµøÇíBX¬KÃ=&jO+ßâÅìE#Ëv"juëx6¶¹#vZ¢0 L4à Ú8 IüÁ]ÔÙý½tf#MnÓ9G¹ó_]^|öè0²îÉl¤o§î¼DW°Ö#jª1W¨ÀcÖuCE©w®ÇB+ð:IVJ?åò«÷_¾}súåÓëϹ\±ÔèuJÍæYµ-'^;ÚdEpÄ¥ñT'rÔ|òðp=,T¾ êñþ^fçö»ãr«cèGÏ¿^ÔOóh×j¾£Pa_ñº{fj hí\TÆ¿úc¤ùä, Üà pZÃûü«ëM ÃåkPh@& qÓ¸Ä]Ìez=o½2ñÖ`¼ñø[¼Òu.Îl&2Í t¯(m) r|Õir.Ú¤§íó>ïó¼ç=ÇâH¬Ëí\³9L·ÉÔowòž(wª0©pº6ÑØ¼Êðn B¦)±Pt¶AÿÿÎ{kT<@V;2 Üs¿ÝæçæÞ# dL1VQ¦ÿ,ØV[Ô%YÂ\Nïå}Á«ñF¥ï!NáªjdMî¸E4 AÀýåðÜÝË Ó]|4Ü:âIö¼©hb³?XëZòfW ð ýt;ÍÔjgïw¿n§>mùQüUî¥ ñ·</jÑctè6#t&º±Éf_>}»»ó¦Xä1ä"gµqöoÇGõF÷Ñǫѯ_--.o¯ x¶Eaff]~'Ê1 õV'ÁP>}ùO'Æ^xÃ$¨£nk(ý©«ëM Ã>ÚB¡PXm1aÄè &ÌÄ;ÿ£÷^¹YBÌf4sQâÐ}àÄRlÒ~P¶D¶'iÏ9ïû>ÏsÎyO#ºpÇñ).ä8F:!&ìë©-ëOò;ÑUYw"ôÏ´Ús1TÜX2uJd Eq,O÷ X$òæR¸T÷~åÉèw´/C0>AéëÏGãà|õ(ýàá8$µ[a SóQ' !xæÂ3E ò¦A}Àè·¢yôn²t"Îjþþ³géfyõ«Åõêf¹Óý6m{´Ñ¨?Óþue¦Ëª}è"3 b \}N'¹§[yqõn(SÎÌé7Ö¾Ë,úÐ<ù9je^T±PøÕ»}©#çÌΣí8#TD¾¢®ÁT)ýsÉK¦> àí*_UßÐãZKåþ @Öµì6 DQ¿âÄI 5ª*MhC¡H,ÊX!v,`+ÄðE,X°dSAÅK´¥iCHÈÛ4NâWÆöØæØN»A #k<sî½çܹ3æÙR ó¼LauÉQó÷a§@gHG2bµ²2Ð nÉqbbÁÔ;¬ !]V³ù Î{^gèÁò¢c?céqL×¥[X\í¶keÓYøõ°´7Gût£²eÚ¯2öÊ-%¼ Eµ,l *:ßì;ÎÉr>çÐ/0v Á z®-26z¨T °>ÏwJáÕlAjììª?:7Bo_½òèáóïÿýá§ëÅ¥¥e˱¡Az AfÙ¸e:óS)áv)èPkß4Y~=¨ú8´4Q µ_ÃK¹byí]T¯Uß~Øß¬¬Ö{æv§¼Ø¬þ^SË,ÊÕÚϱ:µ{Oݽt"µ}óÆp¢·òbaåâåë[¥´a{¯ß½Ùù¼{Ü8Â,¨ôÕ½ãFóGOn<ø¢ô´bÍ%.LY«ÏÈË*¦ÌYĹþ¼¨#LtcdL@B.$sxÀ¿zùâî{Í^O§O%ù´JÖà/Öh¢ Ò÷xûÖúµµ$/µÆ§"ê³oöøt¿ÚǪ/%ܹûN'1Í&g,C4j:+ÌHsþþfñ ÃÓiÑ.?¼ùÌu>' áLÁE4¡ HøðÀäBMcã\eÏ ÀÖÌç¢6ñ»Z)-âDZRéòbÄ¿løJb¦Os·i¹(B;8¶ÔøgcÜÎÄçÚûÏoÉR.`³Âaåàþ9QYX\æ¢Lå~ -ÅÊÿ{ (ÇÅ%~gÀ]´cãøp/òÎL7ùú/Ä%1²ã\wþÌWo>´{ý/²T~¾ýäý§=DG6~ ýs³ÕPjò¸É¸{Üùî%e>Ob.¨¹3óNÃ5z\®¿]ã°3öò<§ANy¼°PVàG¬©Ëêj5]Óµ»5QâU}¥Ù¼ ÛÁÕv{½oßpÆ¥òbûiSWÞß¼¦ëwnßkÝêuv_ï~´°>GmJsí&ÀòE¡¤`Ã1bÍH®¸nm¹mSøø' 3ÀÍf 4 OïÙ 1¾$C@ÈqaQí¶ÛóN9¤WÇdÇ®ïZÕEÖ"Ø!¤s]ØXxk<>çÃöëÌÝxÇçót3²SÐô«lYmôQZV`!ùfÁ5ÓsÆw:}æ hºµo @¯HR÷`¨$ 3)Ì|>Æ6Yª)¢ÿ8/+NórQþÞ¦Ýk÷×zÚÈË·^Ù}~¶?@hà3Ö`¼Q\#<°ìýB¾Þ!Vß m 7Ó}öÑ»÷±ë¢z^kæÓÍGúqã¤\þZ©Ò̼I?Èå^k\«Q[½«ùuÞ²¬ÃÒ6qÈÙÕå÷Ê˪ç¡ÀÇoÄW7ͨ¸C°Xh%Ö ÈÍïÜàÄ(FA¤cE+X|N¼± W»ûd8Ø}¾ÕöWØÐ³Êñiùäçï«¿µ±|ýlgçÉÞÞíGÒ¢þ¯z}ôáí§Ïß"Rc?8ð@±ît~LÜ÷À¬&Ô¬":cè÷0gu<ä¶ÖJE½hd¸ÿ/ :¸ÏÓ>@Aü«[q]Yx7ÖοÙ>W©?7k{Y ß/:`«ÐÌTø .GÞã³n 2èÜÖA sviíXu.¿ø{ëBBB!ç;çûιçÜ¢dÝâ1ÚV-I«*×ksïQ« _«^Å ,BO^B÷úÏÞxõò5`ùu³½¼´ÔÙkîìÿüñþíS{k÷ð æSÑÃFÕåñÈÅ]Ä,5Z7ë÷¯×¹«v ?°u5½MAtñGâ&¶kS¥"\ª ¨T?@+B?Á!þw$$.$R"$-M¬¤ T¤ñG⬽¼Ý5AHøäåÃì7³ogUåúìc5² È×÷gèí¨,r4Æ"4Jý3T´;Û·ýù WÚDiZðEè@DÁ¨¼BF+8Yâ¥R%ãAõ¸n¸ B¢&?X)i(oþXæ:`" LRZ é¹|÷Ü¡ØtÑE§MÚ3ßë{o*3Éx¸{¸Õ <JÙ æºnÚëLY²0Òê<0>8ú}¥x¼ÙhV $9®þûcñ1)þ8a Ië±2ÔõÈqj°äià~G=o?UkûWKãÃéåUËí¿;?»ÿw¯qi\%4Éø>þOo謬7±D*(¤Ýþ_ên_s1¬Á¿®¯öYæÝ ¨ÿÕ4üÂØØéI;bóÇÏo[[Ó3sËïß}ùb¢4~éMù£6a'TvÔjgýÈà0͵reûþkpÃ*Ës¶¸wûúLij§ºW«7Á ®+ØE©yW§d½!×sPýÐ }Ïï\²4&òÞ [Ï>~òðk9K¯^/¾x¾²ZfÚ7}ÉRê'sùÉ Àiü;îþ91ßaÄG³®iô©éÿÔ9i,/ªÒË òJ£C¬èȨÁ§¹_;b@ø8PÚIàC_»éF±&ãX ÀÕµì6 DÑÄqäá¼LÒBQ¡"DR×,@ð1ð-,ø~u^-¨TT4-¤±ãÇØÇæÜ¹¤Ùxe[sçÞsîãLáÜÕ5ؽâé çEãF$¤à5,P¢I$ >_(^6síJÙÖ§RýbplÇ£¼cLjEl»jvL8Ö²E5äDÀQÿsÓRöL ÿsGÔxã&@NhdÇå)ÆÌM)¾bI |Ú§;bóp>è¯Õ xtjd÷§³t8è'áÑèÏü"Àq GqÁ ¥Je?Êת f髸ïqS(ÀKýäô5ú_EgÁ¬TçÜ)éÊ3âÀJ§½6ZfIZöå¬ÞmÕ¹V UÄ{¿ý¹\©ï¯ßn夸yåÒêhx0> Òhxg w~÷w¾|ûayw6n§eco×â[×Öïm^÷à©óÒ²Ý_wm×Íe¡¨ÝsQ¡¶²0* ÖO ® ¥ZÈ[KÀljù"É«ËJÞhsVÙ4°OìîsffWo¼9écxbBÆå0^÷IÎ k'K3½Âç·Ð¿{1.|©¦ZkÕÆ"ÂK:[ïäWÇeyîÛ ±R¼å]R 2_»©¤<Å÷ü'Ê÷¯D 0¥ºÌ ô§ro¹À v¸HS+ >d¿¨V70¨ïnvÝz» ÖÖõDN[̵æ»3;áywÅýËà Mí_Ⱥ޶0\Òôr5Vª8dE?Ø1ü$ù?ûÝ@D÷¡ìCaiÙÆµ¶µMÒ»äú\ÞT A )I_÷>yÏñÂO " ºí¥è#²§3°.@(öEæPÔ'ÐèÏ" -Éñ,ú7;ï +o´Z±)l½i°!,Þ21!#Ù:)T52-áviɵs`¯'íDa1ËÊiàªH,é¨Rè2[j:lº¦Z.g0eZÌXºqTäÚÞl8À¡¤hS|?l<-ÑÙÉçðýq&ÜQÚ\t½Ëpc½v®¢×.Û<¹ «ò?æü×CE[Ôt¬*]¼=`VIt¿õî®~öåäá`¯Óív3^×áníÎËÕ´ømlPSAªpá?sqÝ¿öM|D.Úy$°øûí×!SóË^O@n*Ó½áà+Æv(0K²GÕæe\pép±îY+á?)W[ %5'òĦµýv9&ìÿ2+áyRÞ2^âIÙëEÞÌá¯ws+ëÆ b¨|Ùæ-àCZüº3³ûõaîæÃöixSKÂæ×ôÞsj`÷Nà ;û¾Wï oïþîãÑß kº+8cä^n,r n¯´ð`êZv`ÆçÛ± (HH d«ø d¤ª°l×ÄÆ h³ O¾à%ÄoåÆT0ï·^wÇÑ.ÿýô«3ê,SKU,ªCþã rä!٠ݱvsP·?;N¯¹¶¿aT]ü 9q°ÚÚ MNÒ¢p@¦QBÞ£ïÉQæ£M5PÙD2ÝM¤W7 RU2~y ¸BaJåDU>*õùQ±W»E,DË5u±\øt¶{\m¶-¹«îòæ~¾ÊòBzýÜ>óWᾤR¿Í$Å í®ìGÖ¯÷a1ñiýþQ_ôÉ_ &FM[ÅZ v @YÆ3L·Ý¤!mJ&çÞ{ιs§4¼1ïò¡o ¡.ª ¡<àèæYc®,jäPïô0¾´ Ï͢Æaq¤¥_d)¨Õ"*DIW û! DxCNÍÙÒ¨àÆò¿îµWýTÖïµ¼aÍ×c@çu!~$rÀºo»W®k»õaúÿõ轩¶gáj ¦j,~ê=ÛàÇwO$ß>îD~ôp2˦ùip»¾úoÍJ¥kzËßî§üÖÃåL.RûøÎ©ÚôN»`J0HYB00ZtU·%hLÉhÖáâw(ç@,©(Ãð²õéÙùÈ@;F7<=íþâå«×oß<?V·µbÿú}ñóûû'g³\||]µ*¶ÈµÍ¿ß¨Ï`Õm]¼×KzpD¾ïÛ½\¯oëÙù¸GlÌ«Ü1¹ðhdWàë»Ãñí½aáÌLd{Á Õ u2¯LºÞAÇÀ`ANikÒænc[®ôo\|~¤üF¸,ÈÏ$Ï$øX4þD\ÐK¶3Ì|ùe*Þ}N?¥2Hè@J.e[ÞxÝ)%°¢ÆØ:(µ`RÜA1x,0j¢[ñ|)·îÝ¢/`Bqgbde Tº½{¸¨Átsy]¦§ûîµ_(÷,ë7W~اum¤Ï äiôWÛÍÇ_îë»#HÆ·Í3l¢a5LÏG4 C>fÃ$ÀmÅ,?û¢t!ù@bàyÁ0>mgD¾¾SuOOìñBð<Ðd¬)G¯i¦÷-Rz¸D²Å5«ûÒmÃàöÄ+yå d89$)El;Þ ý³¸vGzº1·,!¦E%ª×>É SÖ 0Ý"×®kd ø«P1YØ.¤ý!f¼¨Óª>1nìßFõ ug£uG{M×cÊ´-ü»ºHìá| dB9'Ð*ÄäK: ¨uÇïÞªJѸh)ÇSFÍÎ}Ê}ÀΫÌtúcÇÐ+ÆM>!mNË ÚþX´<½ö§Ïþý¼k"Oïdó§ËÔyw,õQôÛ¸"©ª´eDIµÙQÃÌgã`î¯×U]Ìf>~úv¿èÖ¥vór±}XùºÌ?ý>¾xsóâWw÷«0þ;"cØ' !Xyñ¸Üñ®ec<KuÌQ£Ý´S)ûÂc©¹í9yÙhÌ·ÀiÞ,ÜJø´[S&ËÛõ)ôXT¯ç$8F^lþf0X'g×KV°0¥.!J·ë ?$#¯ÿ>öçÙÿEøE©Æ¥Íj[\U%Ø¢ªcIµ³8áÈÿùrÃTZ%sÃI ~{58ùÃË3â P*û/ ^½Tp׫\À@¹¦Û¸ç®¡Mé&X?ë²Å¡æÛ8äCîþiþW»ÏsÀõ¸()¤µý×Kð.¢qtéAb£¹ïÐ.ÚÛ}&üÈkÿ0 'DÇX(\Ï_!ÒLôLù·ýù¶90·oþut:w§²aX"©µ Rcm^ÓQ#ÉþAÌp E³|Ú^g'£®¯Çc¨¥ïßÎ=ïóÞ~M..¯ÔóMâ:7?g·ýÃíÑÙëÁõ ¢p)ÀE¤ÔÖq¨b' =C7ËNÏ4 ²15u \7ÙÕö[û±9k ©cf4±,àfµÊ½E 4q80¬4è+ßܱýõÛïéÝýÝ<u4²¥a`@/òz´U¥KÌea-È"]{Î6~ÅD âç(£]ã>@Í!·« 'iþ\âQªdvfý¯ $VÝVêõX°©ØtÓì*ÔV4%cÅlÏøAzîLH(,k<ò,FºçÎ=÷5öFwÄÚaÚ©nPzý©QAcQÎxݼ)@õY1uKùF1´`t9³DmC¸xà©l2ùÑ èg*&rb][J0Wäs`hðof`æ»ýCsó{®Hö®¤ER¾©4¥aû~u!QoÃv?TS0hGåÇT ÓÍ`¬î"ÔEÉ?*¡C^W6öq´Âõq¿¯vÁÖ5ñæY¬ÃizÒg5ôýãÔ4IUë½ó4Éè.§çgW¿¿Ã榴íÑèËõ/pôO'a}Ø{sÿ Ã.?Þ%)z7Ä^¦»ÍX!ôÄiÇ]j©¼ _T= :éÚ((ªåâºu':×ñ @ØÕ¬4á$[i~ÜMR´[ô BQO=ù~> øâµ¯PÁ¥¶Ä4Û4´qv'Ic¼Ì!Ùݰd²ù¾ofgsÔµ9ÿ«eTéüö{ü-¨¬Î+lË¡¨( xLßàH$=@µô$Ûbr¬¬Ù3ÃïAòëQØRÜ,±4ÛçýÛËç§dî)ÆÁ?E+Ýó2×Ó1Ê£`s$ñ}1&ÃéµÃ-<Të;+ÝÞ Ì¾PÏyFàa_l1i (ë>N.J¸ecÀ8XAÉ&±l¸E¨ÅiSýchR§èeXÍoÈºÞ *²T+ ±¦Ú4iMìGÒ£éþÿ{hÓSS«X¬ +ô hÒ,,³óÞìÌÎ"'#%b#5X~IröóÔ- $:î¦êV àÛ¿ÍrÌÀ×ê) à.×UÚË;Ú_Ц4Ë4£ÑQay¢Ä;Û¶®/çqÛÔêRø, I0Û2F);àFiË'7aDWkhþoê²7k;¾r¾Udÿ·`vR¸K*H»4Ç{oDÛÀDYð?³·µ2)PÚíX¬¨ê£ÎNWîkùô°/¶(3ùÐÑHõò#í¯VÐìðoxs;-gÁÔü£õ4JB¾èÔFÅ82YÿùþJ|oÊí§ÈÈ·AoÀg ýr"Òú!GäÖ%¼ÙR$Ò)PªTeìkܶ8 § ÓW´Ü61ê÷µc=Gî]2~ß×Rò8ÆËÛ×Úýì:vp7Ú¡!~PË$òch"ª÷ÆÝyóaØ7Ííûïç§à(5º8à*cPªÆ.3 ÝÝe>}úD ïïü2Ébô(aFå8NÍr`*4cm[7"¶é:hí 06ÏEE]m5&¿¬8.ê¤ÝÈ""$¬(º©ÔD¼3¹ÒX 2Nhµ_O»®, CºJÂÑo°¨*TüË ¹·`aO«Y Eu3\,$¹lOÇÃõ{ kl¾}RÁTùBO9Æïëð)ºÍFeÞä_GÂȽ:ÐplFÛ]/¬H¹óÀ¹³T\_¥À¹=wJ¸póÌjâ ¢°\{fGJ|iB1 $93sfw2 qo-f^¯.-(gÚ¤/êoáfÌç\rÇW:Å5«ñÉdÂÏÇÞÍrúéòýPô Çañßÿúº^ov,Ö6©úEÁ¾ý¹É·/½ñ`µ8u¸x"CHÈr'w¬¦ç:-ekÇ:Ù½û8{{IÙÀ^ê´ÌðTÄ÷w1TQC¼lMÿ¸WÎÆxµHÔT@)ü.5æMjkëGÍÊ-¶z)Òª~87c±M!ÐÿGs.&ÇdÍB BçóÕôËåþѤ ͽ½Ò ®g ×]ôå$fÅ| âw%Pr;n9ųÖy}ëJo+ìR77óü:yehÁ$eǶ~õ&Bô AÅs¢2=L knî¸çâ?FìA*¤7U& ;Û{Á5DK©Qo âDâð(>:eã|òÌÿ' ø}$®WmZpgûõÍ@\ATVQ`~nb¸Â¬.*¿u5= Â`¸|Z²éKôäÁ¼øÿãÁ&.6.&ê2(Ò8>|ÛÙ&§Z(íó¶Ïû >0«ÁæüþÔüø gô@Dóf ÀÖÕô4DA¢i ,PÚDÓèÙ£ñjüÿg£5!ÀR@ Ý=ÍByoÞô1Y<Ý9tt½ôcÇD[dØ.]\2ÜÁJ yo< âfûS2ÑÃÌ £Éa ŶQ~DàÅÄ?àÿòÍ`BL$¨hV>j±½Ö¹{mHÈå²öfv§Ën[w5>Íî0ºpf¤{Þæ4;ëØSPOq J"wjñåôηÄ>Û"`¡ZéݶvÆÛ¶ ÍV?Ïp')¤'^ç³ïÛ)ä<h¬ûåc~d:qyÉÍãq%O}û~RÂMN®<ö%a|YµÎü=.ÍÎȺS#©ù)ïÜ(&.DµHÉX'Àùfè¤A=·§L @ã¡ëmò¶YgÔV)Fÿþºçu®¾¾ßqõQç¨ñÛÆQbϱÏöNÂa/Ï §*v¿è¦ÅÕøOKK¸=Ô÷;ÎnC:E;×9 ÄDqpÄâ§ñüØÙóë$^o-}7Ó¼ F7âé%½K® ´þyÏëáèõv³^!q'+Nÿ\µhÐ]İaÝ¯Þ îõ¾ùÊv-.{KÕªxºp:ÏçXÇÉ$!Üw)¡7ã˨©c>`(½Dò Øå/Ë4 Éý¥/áHOªÂøZwi ê³^¿";áòC þ«nWç/Úb-dÁ^ó¹ï¿¨ ¹!3~h©Jä ·Cõ×ðQÕ¡¡¡>+7ã^ )¶Ê 7®Ë±[õ³j 4P?X*¸X1gõ1rOTÄs=÷ýubmoÎÍ-Ü2£úñôö÷¢Çåú& ft66ÛÙiÖýÈ6íùr9·.d ér<Ð׿ùðl)ÎÖcä¼\wz'>°AV´OHØúÿ5Z~þÝüÂÅb\Í]v{òxÅ bøã" ºd© çT Óô±; cDILLzçû?öBcXAÅ@]ÏÌY'k¼Ùl ,?9çÙ,Q\m¼-Ñ^Ì<CD((ЧîeçWoå×ÕAXu³,ªs(BýQf © &ª wãI@en_É߬Äò¶¬Úÿ0 ûÍëÇ®Û:?NfáhH×<õ t¿¶Ø¾ÎNÌÒø/AÁÑûuÖS¶+³zRçP¤çlúùþ1XÖÒyh/@Õ»NÐVc9óúLø_ä[½§.VÎ>åíuErH¤ÏR)½  1Í$ççÈ{÷^þè¼ZÜ?}Ó^æ ÐA¤I#!È;ÒF«b»k4´gÂÅ«ó9\ÐdÌ'ñqØÊÙÎ f°2Æ]yQ0¡Äy 8Ø}úF}V´7ìÑAçFüñ#óUauM$²/¡{°ó# {߸ðÂGØSwý÷ÕÉ>.×PØÒÂ÷Ík}<õ½»F;_&ijR:y®C鬹bbzÛÍ@ÿmàL®j&¡WôoÁ¨mà"§Õe5¾Ô¦O¥ÓÌòÑx sXÊÂÿ>c(ÃÄ"ì[zACûÖ°ÿz`v ØhB]&?nÕ6Mpá}Ç 5Gp¾Aÿ®Ö»õwwêëgH¬!ð<ñfFp&¯þtÓNÍhc'µ=¸Á Áη£=köòâ«4" U0¡m©#âÄùG3¦Ùe1NRd,O ¤ ¿cñÀð¢+ÅÖ#=½¹Ê,ÎõÚ.Þ¦¯èwU¼cðÿ³»è zoëP5sZHvSúcëä&!Yâ @@»]zÎ8E5]اÇíKô;ßO¯Ú¨ÈñKçOÓ^¢Øtè:g(<íõ·;ûãþ!áãFÞæI{Ü×»?Úä «Å"* À1Î`<¥¼ð"! º6"gAðû±aeº¦É]ìa8*Áû57§Þ}'3N4õ-Äþk¡÷ÃW«#óC})bVn¯ýü=¶À!²ÿ4ÿRßûuæ`Æ5Áö»åBbðY{.ȳPû ÿ;"h9`[¶ÚÂfV !¿lWp"ÃÁþö<mFΰºTTÂà¹>ØÜBbú!ÈijH.©Ò|ð9ºÉ¤ïýñ¥[æùÂãsÝT°AZG_Á ì IÏÃZ:!ªÎÖ¦Étáà4âo'|ir3û}Tð¸*È3èÏ/Ú&Zdq×<íÞ§K´FºÍ<}ÅÃZ¬ÆÆó5M¹{:¨C7BÅ!¸-]öOÊÕÇ! >Ê÷ÒöBÒmõ÷èJ#HXC4V¾+µUW$¯¯ !Ä={ëºÇÀa<<'ÿ s[n¢(æVãqܸÓNúÐÿÿd^âÖ-6ØddD¬¼1àÜöÞ¤(\' ³4F2£);tXNJÁ§ä4×uwù®¶»÷±ó7¹Ø¥Ý/¯ð)õÀd$SP.<ö N%"²Aßã1NßÞs Uë Íìå8Amþ o¯a?½F«Þ.ÔgUîê2$e»PeÛ=øXY2_G_ãý×gÜwüp}Çe nog±LòêÏëéº+$'kbûnÒñhðÿ@ÓÕ4· Q}cØÆié8æÐ[ûÿÿGf2é¡Óiqc,Ô·(ñH Ý·û¤eõýk,>MP¸zúOÊ39´cÕúv¶$> Ü ÂÀ²Á5M»ºôKéä¸j9î>ÀcM¤«$JRKu$ñ~ÇbÖ6{ÒáàßÍX¥ úÒç Q ÔØê¥uwÓÝlslá³toJ^BT»æ¤(¿I^7tæO VÁÿÿÄ*hýh$¤*I½g ذäánwofv'iÀ)à f2bî°?È;\ÇZI§_mX¬û¶EgBnÐ^÷vùJµÝko÷ßÜZ¤Z«ÊäéÙ¥ãÊèß>¬ *X<«Z"Õ2DäÍý«h°UÝM³¾/l[(KlïK $EÈJWÿ;¡Jo£=_yñþ:ñ¬ý¦+R° ÿ¤_ò8×¾¤5ü T<oNeÈöÒ6¸fràÌw'ó¬! my G»YA"R,¸?K*Úù¥PsT³¦ÜDxí¯ ëêz¡h¡,á«|8g2½ùæÿÿ-Æ}R3FÓM Û°%úBëÊm{Î= 7"fü0¨³õïçÀ¿àãB6N1@±]¤ÓWApaåýWÔÉÝÅæa÷Èõ9ªÖH¹IRìv£X-?óßcOIli§Eláñ&½»¨s·V,¶ÚU߯ghBÒ '÷ e .qÈçB[¸G4ÙE7KlqÍväO¼²¤mí¿uPs/¨ÁÀ: æÌÜ?ãiÂ5çªoñhÙlè ÞfçÈ*NS¦%«ÙpûË!üî6H{ßÚ¶CÖ>Â;ïê}Þ¯Oôv&t»«KñÚ½fÝOçÿ,·'ϼÌF4 1[ø«l¢Ù×¾#" "&x;*YKô Ú$&GܰN²,8{<-WA.²L¨?Íd=ðïµmøeK_Z6zL>0îø[-ò¸MÚG ¡¥éìîÌ2Iªãé¤òçUü°¯äÛÃD¹\¼×"m{ÚsݼCÜS¿jQ¸$B_¯_!T'P~ mîÕÝ>YBTÕDaD{)ø+`Ô ÄSñ`½}YõÓc±tìÙ ã ïH~iøoVÐâ`/`22J×Ð0²ºK\V³-s~YRö^ +£¦DðÍX!E ô39%÷äͦ ËÆán+Q¢Æ!.ñ`d&΢sÄŬý6·%¤]ÇÙ{·¯®Q@ûÑeb³ØEȨÓ:5oÄØ6ßñ½ú úPI,ûBü^q±ÎÖjÓ|-µµâ¡mtB£Ûn/ÃËÎ%Ô¡Í 7 ¤`æù'OÇMvknòg¡Ë¦Ø" M $Aaì¤D%عiè~1J î«¡½-&Î©ÄÆaHîYïr× :U_PÐÎÕ@øxbÿ¾9¾»çUõWw3Þ@$ñd¯»««·Êw ( ÑHwÈ0ÍdG¶p«àiKü{þ3o¢Ý«£¬}ÀY±mKÛ^[w÷Tâ«×uÌrm¦÷ãÛ§!~4ÙR+Ø'¨O¿<=/å{oùþ$ú@ÿ¬Û) Aîø¡jïÖhÌm0îÉ*RIqMËÏd4åÛ²éÂÀ/?=<RöSkèUHaïJxYÊqJÑRj¸\Çæ 2ÝV;Xü¾éÈïÜÇ¡Ø ¶~ï8°ZìÂ=~5Ä>4¬òQÛä¥`QO»^)w¢9ÚæpQÇ"ëSþ0¤FÇ<ÔaAý @ÓÕö¶ a¿_ÈBHµi¾tû´ûÿÿ¥4)é¤&Y¥ûÁ»N:!eðããñq>Ë?ï5o±ÄÜ "Ken;ux?ý~lQHu®þ[FW'j>ûbíîmwö¸kx©çl¥Åëeµz~´,æÁQY ÅÇøºÁi ^±Cçy¼ÅÚVËJÉ< bíRI|2x<YÚy,` ã,F¹ûshúBW×ÇZü:¹½ÇàX·ÉJfìåMüàÁ¥ÆÈ1« 3zÞoÍÊ2ó²¿L«>öÒ] µMà9Ý%ðÜ55ºÚH?®sÀP'åðÀBõzô'ÎïçscªÕö«R÷jYm²>êéVÖ /êÃ#+Öf]fY2Ð'2Åø{¾ö·ø¯E`N±5 s0þÆ£î)½]=TºÔ«=LòÃÉå÷oÜXð¼f)h Õ Õ!J9³X¡ 8½Iøh8«ÉòcþO f×rTtÓúú½ gÖ-Ð)Êì.KÉ×7´JËÒ_¸Î¡dÄpÛä8<ìv$öaÚ"0 @Î×Ö(LHÿum« AtÄD»ÙE*TéS¡Ð~@ÿúj Õ&»ÑÖæÒ33U¾-f 93sæº1½VùG e»ÝÜ75x²ÈÉLTÏ7{ñxn¡uþ[½Ô©=£¨ÓBc?!~óÐ@B!&ºdøYõÓ¡¼k[}m{åñ¶>ê×ÌþW¼¥Âp¸(·¸H)Ø\»ìv2±)£jý¡ÊÑ`E3èS£>ZñbnïúÎU-@Z¼7ª¨ó7Õ/ªÍAÜPNß,ײ Xcç zNÎ#âOÚÜÛ¶.IhÁQ° âÖi³èi¶ùWDÊó)j$î f%ýï2eÛ¥x§.^Ï£ú3âY ÷l F N\/ÛÑE"6îM°.9¬Ã©äÈá@ÞÀ6®@AÒÐpÂN40Tg¿iL]jd¥×ZT¶F=ðl(\H~ êZzð¶KI«nkÒD)Dñÿü&&Ƴ|`Pì¶¥~³[0^HCòof¾yìL«éóþl~Ííñö<Åf~êu»0ùËñÃGébFKO7wòû÷·T÷é¥é'p âé¨ àõEùìòѾÁÝtD ¥¦rL/Þ¶Û Ms8Í@ÁykÒþç9]ÁU>~£¨Üd¹UdBMÐg5õ¬.÷Bªþ-[?íÒTÌç¸~è±)ø£à][i2HºrïRz»ÈcM(ÎJ-'dó®zn]G77w&sÚéeìzp~è'5´-OûÇ<`ü¾"0Ãçmúþ[^ýªþ®}çðj[\^ºÞf¹àÄWiÊDã.JI |ªÁAp1Úø!Ó<eõ%¡PÊ´¦AºûbTvòŸ¯Z=©5I,Coi»Dá?~?¤ÇQ`eÀ¸èUQIÃãíÍýJè7£VÕÚÚrMHõ9[éÜ^á12ªõ QNÔÀ.Á»úhëS[û]L»1[3N§*hîæü @ÕÕö¸ Ã`0 ¥½ëÚJÓn·Ú§ýÿ³Mmï¥íÁ&!ÙÐM[¡@ü!Qíü<üfói ³çAw®W¨h¥@ó¤ÈàmEªV³óàb¾ú²ÁU&.ø^OS©tÊ5ÛÎÏo¿ª=í^·»JDEAÿ<Ëé[éeS£Ó̺=RåìÌng^"79+²~ E®å2å$J%«úþ¹©+{ñæppvqÛ5*kø4 ÅC8]jÜõ3$znë¯"÷6º{G:cÿ`acסÅËáãjþ2pC`c³¹ã+T\èùýçØkJ¦àð#¤¨Rãm³ïL¾:*µèÈ¿ûÃÞXùá=D¶Õ%,o5ýI å\')9¥öµcZñ"ïH 0¾Bkõßï@|ê¯kíÇ*8zbY·Qd£òÜi ·ÈåM)Hj½Ýyú¾s8lû#´JâU(|;Í hF&Hô9¢.= 8ã13%{ÿ@C¡âvI1éØ §ÏKçŧí^R\Ò¹¾_/¼¸Å¼ñE<9Ì÷eÁIy+;ûi£`;"¸m+`læEùw=Ûi)!=q«s|I}³aøá*NÌñ{û#q0ú;j«øSb||®Ö.º¡Ú¾`8eaÀj!«È Þk ëZv¢(h°ò@£¶Qi¦I7nûý~pn»rÔ¦IÓTyZ51¬Âërgæ{/sä§Gi-xÁT-Ò%o+ÕWnCß×:ì;®qE)½H¤J*Ëu` æfS`ºbÀk¼$N¿òz,ø; '.«R¾+íÀý¦ªÛfu_ZÔÓßD±ü-`UÐ<Ó-bé/[î@k¯%â¸È+ÈÓò¼V,ßJluM4À0¯¢ØBò£GÑ\è³õ/ 3rëV>Q«0uE« AÐÔ.HMyLú-´ÿÿ ¥}ë P ÍiÃVíìÎåôMPÛ»]gnoe;t[m+=õFßÎÊrxÆ®*wÑ|*ô_×½¼Ú|3}Z%ÖYáÀáî£qHä$Ý,lÉG:Zàá"Bn³Ê&\ôÊlHÎ'Ò~²ü2èRýº´¾u,m/^Bl°è»Ós<¼¯,u7b6ERȪÍŪZRgÔø²bLߣõm¯Ìw UR'òà]±ÇHd\^ÄYMýý}ÿùëÝï!÷¹dÜtÛ¨Æcxk|¿?ì§ ¸JY´??HrñáýËOoo6ïêÙÃ[yò§! Zot<Ì΢íz)y¯ê¦K&G =_«FR§ÃJò³iî[éåE7Ò±àD´M{ñ8©V¯ó °<ú%äs2¸@I9Nhò´)¾&î¼(}R¦6«8'.ÿ]ÒSç@rS½,eFxØýù ¾hÎ:`Zô=çWÛüØåõ% ø~Äy¯]û¡vÛÅ7ý`°]ËúÁU0·fk"6 ;m ß)´NRÁíÁ=²8¥Ê¼¢¦Þ¯èÇcTÉ~¦L¨ÕùC¹óQ³óqRÔ|VK\\$»D)￵ÀâÚÃHm3Y0Wí_Ì×ÕÊrm¯~F¬É·?0u; A´» ,¤/BBb<ªgãÿ_=xòDÄpRXZ.Øv7³mL8È,÷Þ¼é®Êoíòx=Zɪ¨j6>5Dt_NÐÚ¸¦]~3xVW"I¦Ô2ûÌBu¦3¦À(]IJîÒçt>5×UÆ/©ÿg(çÚ½ÚZwØ\ðë³}IíNÀµªÐÁ ¨FñâÌ÷µ±}® µ¼ËiÁ¼¬ÝáZ'¶DÞVÑQø¸¯ó 8Ìx ¥cÚ'RTN`7eº ?ö±ÆÈG»xHaª&¸ÌE°ªÁN2 >ÓX8Ò²r0ß_OÈÍc VÔp¼R2j=CA%¸µµÚ^M¨çÅ»¨¸x>üüå×ÜÝï6¯PumËmÂ@T4ÁÈÑ :yÈ¥N> ý~xÞ3ñSݺ^cÊDvYßAË Ý£s´« ©Äi½Ê˱ñ*UÜTZ±¶ý¹ÚÿÈ/Qòã -®´ÒÂø-ÎsúuÖͰºEö=ùîè¨ë;¢Í©àÙà 0¢>?<eÜoî˯7ô$¢Ì¢îz°^kåXo-¸áëFÞ¹<K}Ùë¿Û©½HývËIôfX ¼m Á~+4Öe®ºÊ×(¡Ì©êþqEJSÃú'°ä0ǤÓ!ë¾*rÒ'8\D ñ ®K²Wþ¨òe®ÉÄ&Ùû'&à Ú{}~Ó®¨MiàUgXRJ8 êaDIk])USeo6_øD·Ï?Áçá[O.þÖ°6Þ¦ny_Jþ· ·yqJÛ¥§Dóܺé÷gø¬kÙM¢3âèÀ`LLZú]µ¤Þe»0&.eÀ¤Vè{eJÒqPû:çæÊÕËÜ4fýj-®ÊCÜ-«k$&` ¢½ÐÊCYC!1£?`Lü[÷&Bâ´P@©ôåÌR/ºè#ísæÌLÕãËmdÄUx:Yúél¾Älvc^g*õ+hÒóQoü0eÆ9h_IR?¬&Á.ïDrùõh^v®Û räµîSí9zb÷Pø*Hø@¿ÃR6tUAqÊl¯ß½Ú$`6ØYc£óåØÇJÚ%i¼b\á(þ¥CdëhívJotAÞk¼¨´|lÎCWnh_J«!URl<ú¬DKm5@°02¤ùáʵÞe_HóRSãC¢®%H~µ¥2·¾C¹´I'üÏÜ·2êxrÌb DÄnâS%¾ø. W1aT:_®÷&ç±d&¬uE´hÆ;÷á&2î9`ÂÛßntï¯Ïl)6· 3TL`4Ü?¡©¾4ÇüüJet÷K¦s ìöÇÛxçܸwh5!3X¤ÙÐ2ÿàêêz¡h¸±¨! ¾ñÁá¯ð_1,¨Ht±"+,²Þ»5Ä·Ñ%d[Ͻç´÷£µÛ»ËU*îfÐ÷Wæ¾0úµÀ¼ 3Ø&ÓóëË¾× 9KkÿÀ^ìçfñ)t¸`èÿÏk ÒV¢¥¼EgGcdóMº%´VaÊT#ïà~Æ ôQGøIs飶Jþ(¯ßó¯z8ôF^¸87Ë÷(PÛq[LS;ÂÕ0øÞdZûðñk½â¢¢ò¦Æhæ@püÇGVþ±©»Î« xf¦#~)|Izy2ªlÏD÷@%Â-ãÓí*¼ÍÖìê :e°#UaSk8TAÛv+¥S«èsªÓÈün[lÊìýåOJ;cx<ñǧÓd ÁâyÁB (ܸ÷ÉM"%ëªlÜ9µ]Ì^\¡ß"qÖü`l{Mÿ ÀÔÕõ8 DÑ;ÀhAºv«5¬þÿÿ£úhÑv·ÚhùHù¨gfØê¾îÜsçáÞ%80OiºÔ¸ @rx0½¥ÞÍï«P[±n`ºÕq§£&cÿººñè(ìLÝZïÈ/ù}ï9Æ1+À<è6=4®Øá¬§Vжðæj6 ËmåVVI3³®ãµ|·5lH xªÃ>2jQ2f¡×® ñ' Ñf3iÍ_¨0^Ñç<Dhý:÷<)ZÊ«êhý[e±å"ƹáSÑJæÏjÈ»Z õo*;ÆÄF9ì{ô£¶jXNUÂ156Æv²X*î'åfK*îèÞ6ö$/½¡Uª>t¤(ÁÏüý ¶U¥ÍáàÅû©×ì@ ìhÇëøàGªt?òeÈiñ óiÁãÿîUA¤Ê®§+¤V ao¦íZºWuÚuûê¥x iu1y'§Íjû·ðõGÙ_7ÏùÇ^f7o:Ïw÷¤Ù x·7غ(:HØtMlL×úþÿÿÒ_²¬ÙÖGL|@ŶÖ3s;Bè¦wî¹çûëêúé?¡G¢8Eýzk&^r¹ÛszU°çx%¹®÷hÔîA²4¶òÅÊñÖ¶á%"ÌW )T"o{ÂZø?_Å~Ï¥º{R~ u {![ÀÑFàDÃb<+÷J¥9D5óhØ"]ãp ÚZw¢µVѨE Æ|xTö43lß Û÷F¤ÝÂÒYóY}ì$ö×S¯L \:ÈSºj75N&S"ÌSx¬u(# Ï: Õ÷ÒR*`G¿UÌJ~Ë;!б^¡×ÖëàµÅ"Ò¼Lm³¹X|Ç_Dc*æ3Jä®EHû#ã §(ùÞ4Vr4rZË4;å&aÄ{ðÒ%»`G4' J[ªÎ&ÅÓ¦¾]½È&õ³.sú8sFK-Ã>§AxáCn æà1øñ.Ã¥ãsÉÏsilÿóæÊÇÅ¥RïúÝã~ mU¯`Ô{+ªÌ@%Ø 4³U§A/&á袲³°45H`¾-ªªns%+½A!rWÓ)\Y®½ÄmýÌüOîx@ ±ne$¶]Y[Ec·MüPg9¤g³# ©gè¶5èu6 SñöÕ ¢ÀûÚñÀ>7Û_±~ÐcFÄ©éd4àE âØ¤M yJ;z¼W¹0)K>=æíø 'ìÅlÜ>ZYe .#±â§Ødqå:ÔP¾Ma-@¹ªKÚ'sà,/Ò|½C D8óËÅÔ%ÿv/mW>¶Zù´E°>-ÞOѲ1:¯SÉ\oäÕÌ÷ÏHS.Ç} ¸ç`KßCßæ~¹û|Àú]K}Ofî£Õ~.ºrÿ_ 3ÐGnVµx Å9 /JÇäÊ3wßßê ú\ÈßñN!áÆ©GadëåzöilÂåµÂ*O=ü¥ÀÜtzÞ8fsF¥d¦ï©¸@QXx¤Óði'/®³Óíã®Mùe(äüìj» }no\Tk6Û-Ë'Ш5.O¹+Þ£Æ4?lLò>¨Y:ç ¶|§¨I/Îôî¾U-KG»{Ñnu_ñÈL2rúªY%G=¤û+ Up~y>J¸ 8pcÌÀBÈ?Q°$¨U û¥x\lpÔM81 ææHl"h¤aÌH{ÁRªñÉ\/¡v@H^>D_7Âx]-]@9nëÁ Ѱ-1éÓ´] À[U'4ÓõÐ6Ôb¦ ý¶tÍ HË úÄ^(øgt¸!Èáb6{{óæUØkí1ªÝ.ßn¢yp§±;ýZ/ÃI »&þÖYÇLëfÃãS1M;ý/ß»F½P+næ£y0ô}}6äîÓíúË·u8öc{¹\rõ÷ùðîÚµ¦Xý7Vä|U¬Î¾K>¾x½ÞåqÑÓTÕ!þ׫*ÝÊ}^ÄÏÁ>«¦¸¾zÆ´Ö7)Xk6ð(É Ä!ÄXº¢Ý6a(ÁdI»¥ë¦Múö´ÿØlª´ÙÖ2AÞ1LBĽçÞse;ÞÃÇ×Ðßhþg1âwe´%XÑ9²iAúÄæ{ $<¶#q Â(||J áZ´²T¾£4C¯éA} ¦ð<ú2tÂå\h£ÅvE¼bJ)o6áÒ]±°+ à ÒÚ!ìp·QÀB༡)§9îR¸´»¾¹ÁÿYïû_;æ7W+>£NP¢ØóQ}þ¬^Ä(~@gPç+xÜþã´r|²ãM5 DÏ(p?QÕ¬dîv ¤Úîhþqn¿Û¥&ǼÈs¯¤ÎÚÁÀç/Ér«Vp:ÕßÁöÉ,o|ãäÊ~oE3.ãÉôgj¸'@ÜHhN£ tÄsf×ÑØ[<f ¢TÝÂhÛÅsÐuî:]«gÆXÛkøïâ2¢ õèËC©!Ã3ÓéÞAÉ&eÇg:»Oîkö×¶1ô)Û·FµÂ9d%Ò«H{¸»]ö}òõéÇõ̧^uª¥åºº¾\²øãÐW Ï?ËwÛWi÷+ ÷={¯¸ï;8I¸¾<wηçßðZq¼2}dIQÉ]* ½ëFfà ]°_nP nP±~0âÐ ^ H±OéàïTàÊ;JPÔ4Í:Ö!eSÂïò±õ'omí£¿;QlÓd&dk+OoIȹRåñÏÝÚüðò ×aÆ, ¢ì.ü7yúG$? ZvÈ)ðEyÈ Æ©K1_{daÒB+¹S^ebØx®2wl#ëkIJÕïϹ»ä÷.JóvzÞ, ÊÁO´Ыk<quï°ZÐ Ý)>r]×·¦9ðc3oû0 QlE¶dµ"µ¬ïn¼#ÞìF(N׸7&ç3xTgëÕ¬ÈBÖÐí©fàþ·· ûPfe®zר&ºLÏ[±Sljoãõl´W_7[ÝÖütÏòäÇ~'s+z«Éë[[H]Õç³[@è¬'õ9¸CR¾ÉUïÎÅõÞ8v{E.-æïg¼Ì?'Õý~p¨{ÍLù¿ ugNFT¶Rï/÷Kåy³Fã{3I-XQé«þþ1þ²~§ó_¸$·Ç£ÑÛåv»'ªs8¾àÞãØ mR¡ `7uûd5÷Óh¬¦ôXx üI| zî\óp;dj?b¹ÊܯFìBåp~°+ÏÍ&áPnFñÁêݽ©ùûo®ý¢ïuà«T<´v[Õ¼J7ñúÌ©yóóOþ¼Õ»]ö¼±Ê¼ûü$0iôUÊuôðª;âô&nÅkõ j.D[öiÓÍé|pã¡¶;ì¨5¥ù' êØ)!©¾ùä³Ö?â?pêÏhÛ &É¿÷ÀÅsÐåY¡ó1_;Ñ4Mqá[6 Ù44±=¶éÃfU3ñå^a#/5<âð æ£)ÌõÙ@Øáu^ßîtù!D2GCÑ-u8Ñ<Cø£ì¢·üww:9 ßUÚWmû¼Î¬ÀzìÚ}ºÛ× ;!%ôc*édS>Q¤5bíèI¬; Ãè÷ÝÝ»ðàdÙë3 âdE//ÆZ>vë ýÑ^Ãj]ô%ùªY©DÂê%%ÑHß üè ïÇ-ãµB;ÚÝ'|7¯ES£rÑ`< áANL;UÙ °pÀ!û2:ôÙ wN]]²~+¸oZN×®h íôâûDpÓºWLËô¬WÚü§«ëmQ1w@ëTjc·RT5M¥þÿ·þ¤¢ÖcUIIw|\Hèîóf É:ÄîjwngF9´¯w Ùüøãæ{bò t47Ѷõçó^94o×8Å_-è ú\cØ<ë"=ýÕ׺eNÕ$9ª1®öPäE^LxÄ©ÇÇ'mQÑ·%ó<zÜÑ.~Eù4Ðü\ÆW@Aºº1.¡éQ"^°S.`íp,¿dÒï(´®åØè=DR6ëTؽêÿ6&ÎÝËëåýóiáã R¤9'JCMZPhÁ_Z/Ã3dÁ ²Úo%¼8¿fÁÍjÊòG°ÎUèg{D;ÜÕ"+:¥¶¹ÓëH·vF1h:Ì<5%5i5~Â$Ö¥H¥5vÇ£L#uE¸{ìý|º!Ï¥±Øf!c£¹ôa¿ÂpNÆÐÉîp[Dz@ó§ø¤lÌ2¼ªÕ?+þ® ¬ö9×ÍÛ7ºßwÜ54±DJÐÎ*0òW¶¶gÞäóoØÖ_/-bfLpÂÄ c¯ÙmK¾0?¾¢¦¡íêýyXurîòÿ0um»iAÔk¢ {1ëP)åâ(Z©_Ðþ¿ÔVÍK¥¢È8 ¤jðúM)`Ü3»Ú7?¬g9³»:sæî4UêÛOð½&# &ôÀ/èz$XÍÛþ§ø?ôe8Á&$¢¹óÌðjÒrËióô|Ámì;ó²Ì;S7gQõFC^¶"YÕÞ´CÝ}®Ú]]ZP|¸OPwZ ÞZr¦sui(Íá<Z6Yõ¸·Íà},Bpã¹úþôuK¥`pé[²t>£2Eµ -@º¶û¬¿1´ümÓ1þ-èSá {¢òºZªZígTEUÛaPÖ®ªiNLͶ8®o2n®%«çTî3¥66RóñµiIÖ¦büS.ã¯ÃÒé`V±h8zðÎ>g»ó19T[I!Å^&þbD-M#×z âøQûDWË´Úèß½8Yû]K2n³zcä½¶Q®¿ö^~-Z"Ó¹ÆêZ9{:;üêíq:&#ë3ÖS1§Ôdkø =¥)_yÓÃÄg8[¼kÍeö ²«Kuàwv,θÜ2xû»yæMà§69Sú²ÑbÃ1ñÿ¸À`ëçÂíÓâ2!mÞ8(QÉ·lWoWúýÍê9¿»ýoéSL'¸sø+ y0DºÆÂÜïÊ*ÌIÂloý3¶æ³À7ÞÇ þù½ì</¶ÿz×R*¼I]¡©8Ë8SØ©öÇ-¶È^åëpÚFzÖ ó=âµÆ¸i}M´Rnöj£¾yDZÊnÐïÝ"Õ)G³7Ô0ø³ÔµOVY½~Üî|iv~¹æöïgë´,5lN'+pa`R£.Wк֡ì2¹ó¬*3|3@ êüz¡(Þ¡ñfÉ g²ïÿQlÛdfmlEP¨ìÜùÂ4¼¿CoÏÁ_P/âuÜ:"GP6Îý üäÛñ*å(aVëìEIirZjµmë!TªkVIQ°P«Meò2½KAk-ÔºÚ¢¡´Ñ7¯Qk[ÿÖ ä¶Áw¥1z¼¦(pß¹¡½ô$ilÄÖìl08ëHçÓ6mç¦þxµgkovt´MËßîE:êéÌP.h {Û.-d@!3TÍÙif ¡Sôâh]Wf],¥P¶¯|ÿëû}ÿO æúW µ÷>¾ /ÖËéz)GUªTN=¡ÙÏ««Z×ñmÍR'."¦©Oô §¥'ÂÜÀ×§¦²ü"®ÌÃ(zìëË®[>9?:¿cøk\ÆV¿¶©-Õóò£ûÛëó^ac2EP#yh/¢ãxaÝ.Éõ wüµxT·±×2/Põ¿}.1ȳTy±Îé34X<~Fq¹1~/î&+ýÔÖÂ:¶¢es©9ôÆò6ÆJî#UÐKMiÿ~2sÑ*âê¼V);T%ËÉBrѼG"Ú[/u$°Êà(®º1«È±µÑamì,¢KO·d`ðqP/8»r» v\æÎo|ÈP ÁKµãëìI+lIºO9ÐJgãñ³|Ý6-·¹¾òöiI<Q y6s9c Å ÀÅ·mf»¡ÂJ£û«ë[ã²vî)9ÎÐ g±þí×äÔôBæÃ&æn ©¡}'Ð+qùâaÀJ| ¾>e´MPF¾²sEb½.Ò{ê4Æ(«þê<4è¤öûv§Ëúc 4V© (Ø&KÁ¾¢£mÄ_ÎçgP?~Ö)Uv8Læ´ÆºÖXõ¾ñfG¸#öj¦-uÃì2ôe¸÷Ç3DͽäãØÓ6õú÷¬"&8ïué½ðq¸ÝgÉ+E§Á9õa^~:-ÓÄ ÇåºdÚõDB»ÏoKZá¯.¡4Sõ×6Vi¤í´¨?ÀÕ@åUl¦7øB&»J÷ yp¼D0:µÄ]½AÆIô_B pé<Á½KâQp2_[ýO Ã6jkj&¶âB´QÑ¢wî|ßXtïÅ ¦©XÓæbÕ\ÆÿÌ´PJ Ð@rþ3ßs0þuú¹NT«^;½ ?+|¥rè`ÔÅ£tç*äÎê´þ|ÿ@Üô¾õA¸3@ÝqN'B¡0Ö-XO9eª§ @|ÂW× JDL/:ܤ%"¢HÀ2!mõTT Âì´¬®Uq[@&6{¼f^¥$Ö)r«aìk¯Tg².6½æjãôüöê>e)÷\äVdi^Ú®- ãì²Î99>è¿ÂO þ|ä>(¬;âO5@úEP´(:¢Ìîõ0 HþM )R»µ:ßv) iØ"<@ÐÇ2Ö2Õ.Â¥Ìz!1ôâax°ÃmîxÜ£©loCT¸|û¼9N£ãxJÔÀå¹f*C¡LÂåES.Ö¶Ú-|wVª²HÛ-Ë2u{ 4òÑÐ_ëöâ6µ^É8®³Z>Ê¿r+G æ:ÜÚ¹¿Ù$°m*ül¼æ¾hUÚ®2Ðz×åË»m×ðûRæ¶hæ ,S»MR×iü/Í2;t0¢oÑb1ÎØEà{þgÍüyä¹IÎ"à_¾ñ&£tý`³Ó3ôálD³\zC ]Å'Ç£w/¶ab]¿Z¦ºé|´EU;^ü«kÛmëÚN}Ï®IPZ'(ä*øp?P!ਠTäf{íÆÆM0sv ñ\äxwÎÌõKº~B¹waO¯³ì8¢LĦý2¶hË»ùù¡ð=ö`onüt¸.¨«¥û4gßAßÁç²ôÿR ¢(v¼ô°ÈÞ@ü§µÔ9túKHt7Þ¾|¼¸:PãÃû®/£lGÝ,Óv'Ä®~Mú¸ó3mYêÃíȱOÅI{Åǽ(9}DEs½ÕåâëÍ'ëá YÕ½uNÂÌ%C#½^¥Â®35IîäîºZ´S´7M¶R±e4&$íZ¦]äùÃDÜ úàOAÕj¦2Þ<éÎc¹êzÇö«çÿêê<u4¹uzI@»Æ÷ÓYtêúqÒ%0¿$ª,«ægy]צÖþ;iñ9´ØîëÉ ½+JÐÅÄ<½Q©TÏþÙ&TýlpQ¶áow::tW¬4ç±.©dìXúMZ§¦>\3Y¼aÐTØ ÆF"rÕ É¶ÂØw©B}A6iÂóûÒQå￸óÔï>źº_ºy§×E| ÅÙÉãê7¡ëZÕÂV »ºù#IC/kE¤ ¹Hâµa±yÁÿÝ.n¤ÜÄǸFö Ó`ïCH`GíôÜÎt².Îbúx`u/¬qá÷79erÊbjufW·J±ÊBìMwë~\sĤóY´Z.¼]òÎBéOÏã`¥FÒ>_T[±7!ÝÒ×½/7ì|0HEÅ**±LÐé,ä°eQ°¢Áf¶Å éõN*$_ª""Äño¡V=¹HKLäåEÙôG!¨Éü#pª¸w@Écõ˸}?¼è þ½ÐÈD¡(þ´Üuý0 ÷f¯Ô|wÚQÇ,MùÀ£ÞV×óð_ ¼{wÍHßVYá2Ù-\Ø`°X®n²õîñ³}ð:ým»¯ºPHX\þ)ÐÌr{Á) =3ÿá]øs·&S ½²Ål¸ÒnfW6ÖX¾$9&tcÌYEªÞÈ ZôN l"8ÌËûR?üÊë¶su57OUµ¯vÀÛd¬f#\+àêÛ#éR øcÈÈbõSá)°*0ÝÆÀDÚóYæ»>²ö¥O(@ à_MµMçÓOKp«u½¾ÌóýåFîê ã?=*ØöFRÎõ~:Ä*JÁB :H®¨ Aô~O©e[qæ±ËF¬ùâ@{ìÈ_½¿EÐÒÔóG JQKI XÄü~´©¹ÿàûËa»|ÿVÞhªîÔܪÍè¨y£R§:ÝAJ°7ô\ØZþOÂçÐï~o¿<ól®÷è_Sù> |ßgýÚ½w¸?ò ßOÞ3(x(=ñ¯åǯÇOâµyÝö~ ¬¢{4x[=s¥y~Ä y¼o×òlÒauvwoýªY¡¨¤>oë+n³S]Þ4»ç¸Ä(0vG7#Ú2JBmNS,/w¤O÷t²B·Æ..·)¥,ÒK¦Zªnµn6íR O j9}kÀm«x÷ sÕ} G>Ívøûuþ3ÄÔ9.eÞpPÔÂì±mSC¯ã<C¯î,ù/d ×òë´uõ=äú@Õp5qÄ4æTM¸þg "$Àv·7|ÁCÃ`@¿«u8ÒÐ×Uð®ðrPXI<Ga\ ]ß±~èeZoCÑaµñðÐÖy>«#qèu³p(75Ò^:t]Ѧ*½óXZÙþæ©40By³MÀüâQÅgPu÷å¢Òàc`êz^¢ð¶ÛæG#EWÙ6½z¼yô*øO{ÁØ&e»î.mfÔ$dßEC$3ïÇ÷æ{o$ÞàÆý¦ãÁÎn`båqÍ£gFfĹ=S'RÝIÿÁ?úF2McìUÈ }pícÅúýN+g·ãY Î!]( è#¬øÝÝîDÝ&ÝÇÌ(á³fsøPEï¯ß\òþ°ý¬xwÇ S]ófÈ5S2F¿Úâ°T½Gõ®2#g\F£Ù¹kükd&·~öo.ïc©¾|So_{Óáåæáö&ÕËUõ ïÐñÛ©.¹ãIDÑ+&Wª?¤=±K$a&J2Ó£éTâaI*h;ðé#OýVGFô½À%Ï3ÿ¥æµ,OO3&öý± ß»²*Ù25ÂY àä´CºäêÌÇï ´Å#áfbx1ÿÿ#|ö!ÄvÙVJÐVÏì@Câ;e÷ìÌ9sÙÙÒçÿVE2YdÕ(ÏêýìV\qzßõ°@À:ÛUL2ë×6AWS2 §ìÌàE«¹Äú>~duÝFv?£Eqª$OO¤Ð¯e!Þ IÄ^ Q#¤%ÂÆYø@IÞvÍÚ!ÔMZ>}ðISåmj}äbø þòûýÐÔ_ªG\ËxYÉhÏWÐ ?Ç¢Ý50îPø.W×9ï:ð¦wöì!MS{î|âþ [ò^ý6Æ8NetÙöeÒu¶.·@²Ï"L_Û82à¾zq?ãeÙ³fAH%\g¼Åaö-¨ïNöZø;|µ±ïW xvê×-rûÂãöXÙk V±Í/tÛÂtPZ%5ê",á÷ÊY·ô\rÐi8DzRÀ@¸ö~Mýg£x_î¢åÏ+H?£M;ÚrªÈQvVxiÅÊÐ X-ãûkÙÇê»Ý ¥5°Aìñ»fûº·[ï¿j:K;Ø:¶øa^ªÀNn ëö²g\h¢ö»çÈþåøÊ.³VK¾M¹ÍäW /VùÈYQÚúScàeØäyâ?gÆk·¯OÆ]6>:ç³Xäc1ÐmAfq H@07'zQû°9ü)ÚvÛ¦JÿYûó¬dÙz{ªÚSóÆP®D¯açæS-¾itÛ?±çý±í°«È² NÏ´`VôWçãv^¦ó :9Âr¸ØæqÿJÀÿû$ý' ÓÒ£6¾æË*½L_¶)möÔà¢AµÉ)¸±;v¨&>ϸ¾ËÝì#Óñ¥è``v®rùR¶d'±9käRp¼X=}fj8Þ¢ãMÇs®²Õ·sîÖ×¹öêyü¦Î+2~æcóI>Ó Å6|÷6,ÉC0`R Þ4k/ 6PÈ,1 ~Kiÿ17±Ó¿DʼÔ\«G×}k*ðmlil£©RV3!é4éSÕ'ÜÑ¿ºhâ=q)Í(KaƳù KcM¹4-ó¾QæëÒUïJ,öèíµ¦ ¿É12WqLRÃ¥2«D3ðQTbúPP2úG l4êÇãÉW´ÌFRdÐ\¬~ { ¯³sN%ãÍ;ÃOj¹ä1,hÈä@ðSWóÐôêéj-r/M^ñ$Ò(/%öÂÇg±ì¥åÈé0*qàÒÁuöç+é´®HÉ&ÏùËðÇ$R7ÞzÔµ¯f×ᨠķü ÀÔô$Dá©@-ZÐÄPc\b¼xð§èÅ1<pZBH©ß)àµiiç-ß÷æ-§ f²POàGÉ̸4D$|)¾(ÆQñåý⺩¤¿vììì«±É ?y /¹¹G~NÃr[Û üó|V*¨}T¥²ð«°ùP6Uº^Ý66Wykå,ºµíLnÚE¯0îû¬H>l5è½WwãhÞÜ´-ke]gØêÎúbZ%!+ñeÕDW ÈJÖJ dòNÍùd ó®©ÊÛàµã°Æ'ñêbì°k½¶sÚ Ñ ß2ê Ê9³a«Òæ0·u±Ä² Aw·+ÎwÁË& êEâ,Ê}ãêÁ£®ÃáÎ X-ûÀ³ï+'É[ ͤ·% ·üô®8¢ËâPd5èåB5ØÄç-VÛqéŧ$ìUgn«åÀsRÉÎ,BJå°)øÒâÛßcͯ³Né²Qvi Ul=<·CLìçTà"<¤Í k#ÚìÜ\Àúá¢^5Väh^hàKÉ ÉÖ]l`³©sòXêÔÞIïCïUBU¨LPßn»ksÞ¹[.BiaÑç²ÞqnÖ[´iHÛõCèîbÅ®á@p68sË1s¿ÈeµÏR r÷àlÊO+ºÆÉÉV¦P ÂtùU j>NÏ®.Õ*ܨ¬É¤wä αi?î¨Õl8ÀKÂc~ë_:»(ï®,ëG dtÝE·ýì.úA¤©¦én»Q¸¸=g Ââ ëìÌ;çã=ï=f_zµ®|eÿÙIE_z»r0OÄ?Fç^ .Ì(CDu</DZVÞýQûīåS賨º®jñþøwÂ_ÑÍ&¡UXGäÁkêȤëV¼Ð*'6åªÈÒ½ZRx_ xXÁd²ûAíýC/ýáÄäúNÂŲiA@ûYX¬ãÙðãköÔÏHÔ³ËÁH^T%O^©¬$&ó åm8 å´¾¨Å¶¶w×[|^6hâ$gq¯Ð·èç˻ʳ´?q_ºVpð ´ÿ-Á²î¬KbÊ`·q(Ü#¡ÛW]7nxÚÛpEÉk{B!KÓ¸õP6¤[=®¦¿p*ÊK×-á4ãj´Àâ2Bûe ¡AF°Ñ`á1ÞrEpæÞ26VÛs}@ưÆÙ#¶8Ôö~L%ÓH·SûÄëâ]-¨Ö±U© Ö'ÛaYà&À¢_»`ȵ[þ0jt¦ªÖÈâ«Âû3iµ }yõþ ;9M{hXGù%¿ýÇÖ*hEâA~¬È¨òES¡¯'ûÞ?t®eªÔ{ArzBªÂ± ÃøÝÕT% Ð 4¡OaÄcQ e$}<{ÆRðcxÑQ~~| &Ì {zÃ1 Oï{)5L:â%§ÅÚýåhIÁ_ ©0d]£d=_ÂJ LEH8!ÖrÈ9SAܦ{*P©Ùå@ööj&ÿ ÀÕµu© áX@ÖUØ=mW÷ìi{ÚзþÿçºmOëeU\ "¤µ/}¼L¾o.Ìd¢~ýöYà^É8àtUVr8u/McºvÜ}xw»Ü¾nÿU+IJÍQv@§¢ l¬ÿ̰òýùàrDWP°`x<.l«°ãOÐSÕ*c5 ðµpè]òûç6Y§_qH¾cÔ³Ìm·Ò¿<aCn*°ÜÜú$^s´aÝ<£©ï±KA2@¢V2L\m6[ªúygwÀÎÞ\ðtC/ P¢ã÷²{6B½!½ ìØ¿°u-;nÂPL^$!£N&6.º©]µÐo»êj¤.¦µ"ò00Øô²ªd±Â`sÎ=ÆÒ½ö»÷AV>*HTâ¯Ê{¤ý=4eÏ]ÌÜ.éYY¤<ì~éE^ß¶I§;\ÍWýú°ìô qɱ¸5Ðë!¨uNsÂH|Ý3t!'W^æyÆÍõô :ËÉb:yÅrùåÛç¯qÄÓpSC÷ dB+´miå䢦 ]¡LI0¤Jסð:µYp8åâ OÍuEæG®Jú 1Mè`<NE{æäÛíHÒ7>Ü÷wÁê¶óc]Øz@?%F¯OXúÛr? óx&üÆ%¹Þ½¿TBYíMT¸ J]ÎYdpÅzBþ¡»©0ù°Ûèܦq&À%ñ®¸Ç0Õ§sJúhm£ãÃ÷x0ôKÓâB` iHm¹Ë¨èÿB`ô(JM íÒè= õPÛ¨LÅõáí¼oTú6QC%±þ<0 ÜHs¿QWN<Íèwæ£ o¾¿OÇ,ó¢Fnû^'( µ6° /âí« Á`ùp¿JÐ?ÖK#ªh ðv)``üúÏÇËfÀGöe #:Ñ6ªTz= QäÓ¹l¨@ó ?Å4&Yr&þºøJá¦÷ù|3Ϧº üCÑjNUHj]¹IL¼_¶vâO ðDW÷Yº»ï>®8;vÙlæË¥yð·ã¼¯â˼c¯ìü Í÷ïÀW»üPiúò1\S£h!¶ê§ È£$+Ûûñ7ùR$![ÃYÞëæãç«/]{8o2ªÛª>צFçÃHgì¢u §VA.| UàC=³ÅtåõCügÜÝÇü©9îÏT$! ë÷追¢¶69ðC¹ùtM¢¬ùó]9ëàÝïªI ³¨}~W A=È¥;'"©àb$>ÈʧéJ¦¾·}%3×*éa½ßp òìteål±o nYüX´ÍB÷`à=Àx^ý1ÉÈr9aÖÀßF)ÒL)à¯ÔJØÏÛ1Þ±Áe<U© 1ñ1Úx»/$Ð×1¯«â" lØÉQÃ8âuvSÑ<¤±¨(Ìh>u¾®Þ½á £ ð§®>¤|°ñþÿº+/?E¡Ý6P2s(ì×j)6+èGfÚ³ H!»êöò5¶l§®Fd0¢l® hyß `-ü¢Ú byx÷{9øOéã¸y·Ü _ºÇæwè}<Ë=Ûüyìo6»¯ ×Âï`ë£MÍB¡h5, Vq©»n¶n¦6iïö¦¾@º/ÐÞu&M7Ö6®+« 3zF¼Ø^cÌï~Óºé >BTßjj³<BÞ×ÕâlDÀOøG:q® # pG¦~.Ôe@ôõ:ͺRK>@ÃzÓ+¨È ¹_£P¼íðirA¨¾u`ʡРXmæÂöíѰo¦³ÌQ M5X|+¥¹ÙÔ¶4[î#´¥Ç¹K\E«R)ÍOOmÔãÌ]Q¯Trà>DvoÃ<£U:>'ïÒVܾæÏµÓVî X«¢èëý)¯+½ BÄöÂpúÄ!áô¦Û2íêoi²Ue Á,3 ï²x\åÇ ±óZ6Û+B6)íÄëÖæYûAH"&9E¨I!Â!y[Þô©ïM5fCCðHà Ú<ßpu.= QéXK@` V$þÿß ÝjE%F ´@yEz¢ÛîÚ¹=wz{Î7&gN¼rµÜL?ØÏùçÖ®Ã}íùÔkº<¼2ßI¿PNNÖHg¼k\ú ÌheÒºà£*'µi:ÃÝÝâýRÄjèìF\n¯¹ÛØVÉÅ'__tþQ9X)[õ>ÞævܰºµKo±WYI¬Ê²b!ø3&?(µÝ÷É=t¹¡ôÛõÙ^?K@ïkË1h»eçruº,=1¥â*ª1ÜiIBHälvÑÜ Þ¶¤ûtì@P÷ÇðmúBÖÅdX«ÐÆÏE1"Û`¡ÖÅu¶ômFÂ3Öô<|ý¦óüþ6ê^ׯ`ûàëY\át_§3u¢Ä3ã&P6jwôD[g'( Âæþst³3Ýw¬á9> Å,!G Û+Vò¾ (^¦Ø>4Ú{@ $Äóá\wfÃ(.Øö=ɵ=M/L¨ÕH¿ðtm½iÃPØNÜH¸Â U;6±§M}ØÿÜ^Ö§i/£tR¹§$äbÇû¨òÅ>öù.ÇG±Þª±ÛKÇ4±ò(Ìdçq#Å@+ßúë¡Úa5°ûë3 ºÀoj&Ô²:ê>»- }ÖÚt{"oº=ÆÒ<²!$]!æËUê2»Û¦Yز¦vÁX6Qwª%gu>PGèíÔ?Ìb«ÊÒü^û6§F3Ü'$ÜýÔFÃzþ'^ìàÈq|WÏ5Îã¤1ÂÝ2ï®ÆþëûîCz9jâ´A¯ H/ã$åë~ÛZéÇ?7£â°;¹õ£OQÕìh32m±|<{§§H8`$âæBäD5#D´ºpVËU· Ð]^9õUºYb¨ ªXpZ]ÛQQ®È4·xx§ ÊuGäû®Þ(¤ìæµamg'í²G-Î5« óÆå r;6M°cѯô\ª>®WDÑòÇ °Dâª5¶KXk$¨ôþþö'¾çø¿ÿkZV5ºRêÃH¯µèNæ<!/'ýi/Å)nMÝ|þ¹³ûºâ·ºsÍ?ï×Õ'0¾ |A¥2îDxÏáQ\ ¢?Ûzìdç¤Gsª¨b\×n$Æó|yÝí±Kãy8)çÙi%år]4r̤6irÚm± ü56òû¯o!mâdpyQÖVå*!ÜÚºÂtÒ ´«m©êCú<9ÓÆ;Ôÿ]` s à¼ÝPJf¾ãÕ`Êý` ... [truncated message content] |
From: Luke H. <lh...@us...> - 2002-11-25 06:53:14
|
Update of /cvsroot/java-game-lib/LWJGL/examples/nehe/lesson11 In directory sc8-pr-cvs1:/tmp/cvs-serv18314/lesson11 Added Files: Lesson11.java Texture.java Log Message: up we go =) --- NEW FILE: Lesson11.java --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/examples/nehe/lesson11/Lesson11.java /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import java.nio.*; import java.io.*; import java.awt.image.BufferedImage; import javax.imageio.*; import org.lwjgl.*; import org.lwjgl.opengl.*; import org.lwjgl.input.*; /** * $Id: Lesson11.java,v 1.1 2002/11/25 06:53:10 lholden Exp $ * * Flag Effect (Waving Texture) * * Credit goes to Bosco (bo...@ho...) and Jeff Molofee (NeHe) whos tutorial this is based on * * @author Luke Holden * @version $Revision: 1.1 $ */ public class Lesson11 { private GL gl; private GLU glu; private boolean done = false; private boolean fullscreen = true; private float xrot; private float yrot; private float zrot; /* The Array For The Points On The Grid Of Our "Wave" */ private float[][][] points = new float[45][45][3]; /* Counter Used To Control How Fast Flag Waves */ private int wiggle_count = 0; /* Temporarily Holds A Floating Point Value */ private float hold; private IntBuffer textureBuf = createIntBuffer(1); /** Creates a new instance of Lesson */ public Lesson11() { } /* A javafied version of AUX_RGBImageRec *LoadBMP(char*); */ private Texture loadImage(String filename) throws Exception { Texture texture = null; BufferedImage tmpImg = null; /* normally I would use StringUtils.isValid(String) from the jakarta commons lib, but thats beyond the scope of this lesson */ if ((filename != null) && (filename.trim() != "")) { try { InputStream is = getClass().getResourceAsStream(filename); tmpImg = (BufferedImage) ImageIO.read(is); if (tmpImg == null) { throw new Exception("Error: Got null from ImageIO.read()"); } texture = new Texture(tmpImg); } catch ( Exception e ) { throw new Exception("Problem loading bitmap", e); } } else { throw new Exception("Error: file name is not valid!"); } return texture; } /* Load Bitmaps And Convert To Textures */ private void loadGLTextures() throws Exception { /* Create Storage Space For The Texture */ Texture[] textureImage = new Texture[1]; /* Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit */ try { textureImage[0] = loadImage("data/tim.png"); if (textureImage[0] == null) { throw new Exception("Error: got null from loadBmp()!"); } /* Create The Texture */ gl.genTextures(1, Sys.getDirectBufferAddress(textureBuf)); /* Typical Texture Generation Using Data From The Bitmap */ gl.bindTexture(GL.TEXTURE_2D, textureBuf.get(0)); /* Generate The Texture */ gl.texImage2D(GL.TEXTURE_2D, 0, 3, textureImage[0].getWidth(), textureImage[0].getHeight(), 0, GL.RGB, GL.UNSIGNED_BYTE, textureImage[0].getPtr()); /* Linear Filtering */ gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.LINEAR); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MAG_FILTER, GL.LINEAR); } catch (Exception e) { throw new Exception("Problem loading textures", e); } } private void resizeGLScene(int width, int height) { /* Reset The Current Viewport */ gl.viewport(0, 0, width, height); /* Select The Projection Matrix */ gl.matrixMode(GL.PROJECTION); /* Reset The Projection Matrix */ gl.loadIdentity(); /* Calculate The Aspect Ratio Of The Window */ glu.perspective(45.0f, ((float) Display.getWidth()) / ((float) Display.getHeight()), 0.1f, 100.0f); /* Select The Modelview Matrix */ gl.matrixMode(GL.MODELVIEW); /* Reset The Modelview Matrix */ gl.loadIdentity(); } private void initGL() throws Exception { /* Jump To Texture Loading Routine */ try { loadGLTextures(); /* Enable Texture Mapping ( NEW ) */ gl.enable(GL.TEXTURE_2D); /* Enables Smooth Shading */ gl.shadeModel(GL.SMOOTH); /* Black Background */ gl.clearColor(0.0f, 0.0f, 0.0f, 0.5f); /* Depth Buffer Setup */ gl.clearDepth(1.0f); /* Enables Depth Testing */ gl.enable(GL.DEPTH_TEST); /* The Type Of Depth Test To Do */ gl.depthFunc(GL.LEQUAL); /* Really Nice Perspective Calculations */ gl.hint(GL.PERSPECTIVE_CORRECTION_HINT, GL.NICEST); /* Back Face Is Filled In */ gl.polygonMode( GL.BACK, GL.FILL ); /* Front Face Is Drawn With Lines */ gl.polygonMode( GL.FRONT, GL.LINE ); /* Loop Through The X Plane */ for(int x=0; x<45; x++) { /* Loop Through The Y Plane */ for(int y=0; y<45; y++) { /* Apply The Wave To Our Mesh */ points[x][y][0]=(float) ((x/5.0f)-4.5f); points[x][y][1]=(float) ((y/5.0f)-4.5f); points[x][y][2]=(float) (java.lang.Math.sin((((x/5.0f)*40.0f)/360.0f)*3.141592654*2.0f)); } } } catch (Exception e) { throw new Exception("Problem initialising GL", e); } } private boolean drawGLScene() { int x, y; /* Used To Break The Flag Into Tiny Quads */ float float_x, float_y, float_xb, float_yb; /* Clear The Screen And Depth Buffer */ gl.clear(GL.COLOR_BUFFER_BIT | GL.DEPTH_BUFFER_BIT); /* Reset The Current Matrix */ gl.loadIdentity(); /* Translate 17 Units Into The Screen */ gl.translatef(0.0f, 0.0f, -12.0f); /* Rotate On The X Axis */ gl.rotatef(xrot, 1.0f, 0.0f, 0.0f); /* Rotate On The Y Axis */ gl.rotatef(yrot, 0.0f, 1.0f, 0.0f); /* Rotate On The Z Axis */ gl.rotatef(zrot, 0.0f, 0.0f, 1.0f); /* Select our Texture */ gl.bindTexture(GL.TEXTURE_2D, textureBuf.get(0)); /* Start Drawing Our Quads */ gl.begin(GL.QUADS); /* Loop Through The X Plane 0-44 (45 Points) */ for ( x = 0; x < 44; x++ ) { /* Loop Through The Y Plane 0-44 (45 Points) */ for ( y = 0; y < 44; y++ ) { float_x = ((float) x) / 44.0f; float_y = ((float) y) / 44.0f; float_xb = ((float) (x+1)) / 44.0f; float_yb = ((float) (y+1)) / 44.0f; /* First Texture Coordinate (Bottom Left) */ gl.texCoord2f( float_x, float_y ); gl.vertex3f( points[x][y][0], points[x][y][1], points[x][y][2] ); /* Second Texture Coordinate (Top Left) */ gl.texCoord2f( float_x, float_yb ); gl.vertex3f( points[x][y+1][0], points[x][y+1][1], points[x][y+1][2] ); /* Third Texture Coordinate (Top Right) */ gl.texCoord2f( float_xb, float_yb ); gl.vertex3f( points[x+1][y+1][0], points[x+1][y+1][1], points[x+1][y+1][2] ); /* Fourth Texture Coordinate (Bottom Right) */ gl.texCoord2f( float_xb, float_y ); gl.vertex3f( points[x+1][y][0], points[x+1][y][1], points[x+1][y][2] ); } } gl.end(); /* Used To Slow Down The Wave (Every 2nd Frame Only) */ if( wiggle_count == 2 ) { /* Loop Through The Y Plane */ for( y = 0; y < 45; y++ ) { /* Store Current Value One Left Side Of Wave */ hold = points[0][y][2]; /* Loop Through The X Plane */ for( x = 0; x < 44; x++) { /* Current Wave Value Equals Value To The Right */ points[x][y][2] = points[x+1][y][2]; } /* Last Value Becomes The Far Left Stored Value */ points[44][y][2] = hold; } /* Set Counter Back To Zero */ wiggle_count = 0; } wiggle_count++; xrot += 0.3f; yrot += 0.2f; zrot += 0.4f; return true; } public void killGLWindow() { Keyboard.destroy(); gl.destroy(); Display.destroy(); } public void createGLWindow(int width, int height, int bits, boolean fullscreenflag) throws Exception { fullscreen = fullscreenflag; try { Display.create(new DisplayMode(width, height, bits, 60), fullscreenflag); gl = new GL(bits, 0, bits, 8); gl.create(); glu = new GLU(gl); Keyboard.create(); Keyboard.enableBuffer(); resizeGLScene(Display.getWidth(), Display.getHeight()); initGL(); } catch (Exception e) { throw new Exception("Problem initialising Lesson", e); } } public void start() throws Exception { try { createGLWindow(640, 480, 16, fullscreen); while (!done) { loop(); } killGLWindow(); } catch (Exception e) { throw new Exception("Problem starting loop", e); } } private void loop() { drawGLScene(); gl.swapBuffers(); /* Keys that have a toggle effect */ Keyboard.read(); for (int i = 0; i < Keyboard.getNumKeyboardEvents(); i++) { Keyboard.next(); if (Keyboard.key == Keyboard.KEY_ESCAPE && Keyboard.state) { done = true; } } } private IntBuffer createIntBuffer(int size) { ByteBuffer temp = ByteBuffer.allocateDirect(4 * size); temp.order(ByteOrder.nativeOrder()); return temp.asIntBuffer(); } public static void main(String[] arguments) { int err = 0; Lesson11 lesson = new Lesson11(); try { lesson.start(); } catch (Exception e) { err = 1; e.printStackTrace(); } System.exit(err); } } --- NEW FILE: Texture.java --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/examples/nehe/lesson11/Texture.java /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import java.nio.*; import java.awt.image.*; import java.awt.geom.*; import org.lwjgl.*; import org.lwjgl.opengl.*; import org.lwjgl.input.*; /** * $Id: Texture.java,v 1.1 2002/11/25 06:53:10 lholden Exp $ * * Just a small container class for holding texture data * * @author Luke Holden * @version $Revision: 1.1 $ */ public class Texture { private ByteBuffer data; private int height; private int width; /** Creates a new instance of Texture */ public Texture(BufferedImage tmpImg) { width = tmpImg.getWidth(); height = tmpImg.getWidth(); /* flip the image, so it displays right * There might be a way to do this differently... */ AffineTransform tx = AffineTransform.getScaleInstance(1, -1); tx.translate(0, -tmpImg.getHeight(null)); AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR); tmpImg = op.filter(tmpImg, null); data = ByteBuffer.allocateDirect(4 * width * height); data.order(ByteOrder.nativeOrder()); data.clear(); byte[] byteData = (byte[])tmpImg.getRaster().getDataElements(0, 0, width, height, null); data.put(byteData); data.flip(); } public int getData() { return data.get(0); } public ByteBuffer getBuffer() { return data; } public int getPtr() { return Sys.getDirectBufferAddress(data); } public int getHeight() { return height; } public int getWidth() { return width; } } |
From: Luke H. <lh...@us...> - 2002-11-25 06:53:12
|
Update of /cvsroot/java-game-lib/LWJGL/examples/nehe/lesson10/data In directory sc8-pr-cvs1:/tmp/cvs-serv18314/lesson10/data Added Files: mud.png world.txt Log Message: up we go =) --- NEW FILE: mud.png --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/examples/nehe/lesson10/data/mud.png PNG ÜaHJ5ÙC;½öÒsÑÿÿ&ØH±`âClA ÊÔSÝPÌ Ñ.xNa£l¤+Ì!<Æ1#£ïJ Ý/w/ÂíKs"A¤AEl.sÜbèÀn¸â}ÃÖz$Õ2 'ЧËWdìáZÐãWQMA³RÕ#÷¦E*:^ |e´ìu æ%vªZÐfWñÃu/n$@ôe÷¤À©¶ö0fÄ.Ìz(ظÓP¬XH¶ÒH*·aÔÛNb&¢]ÏwÌÿÌ wAçln£5|ÞZØÉsÔ*ÅÏ_ÚÉ8Ñv´þ÷u¾Ìîgï6+¿m ó6kõkÂ3jܼ»ãØÔ^dKíTçÁÅ>2J9{ë5TñérÁ<Æb*Ï·ÞgU×òx_SZSMl²TÎCÑdß`Àqk£Lx4®¼ qðæ-£ñ{0Ï©±Ï£Ë#°$e §OÀ-uÀäVØûöººà͸$W´±Bâ¼Æ²»^·Ö¬«8qÓf² pÍG=-Z¤};ZÝ»hÁ -ÏÇw|è¼L~_1 ";<V*¥KP¤·ÌvëV-®9®~^^KuzãêÿRsQq±PY¤ ä0 ia©¡XB NªZW£^¬Áù ÷ÌmD©÷þ5üýó;,Aö³©4V®-Ú>WCw>À<nºRåuãòëçãǼ¿_]eý ! cI¹ÏUû#gm0Éy/Sà\Ê ¤\¡ù+Ó=-Z®·J/1&lG<SÊWü~ò47ªÃj®øÓc/:×=ÉÓ>zÙ\ÁBªAsÒÿ=-¡g;8^l*ZVýuÿ¼Ó?uo«w`¾¿;r2×Ó ERÙ GÖt´6Æ"+ÅyÑ»JËÒT¿ç{àbí]Y!OËëÍMLBbrÄïÁÇÉz¸åÅ&û°ëÐ-Fm`ÇRá97`!ø+b¹eÂà3öÔ§ú0Ô2xôåâqW#¢cmW3°_ÐKçfÚ¶ÃE4zØð¬.rë"T_ÙµCäÚèP+ÖxæhåP·m }PÜãa8Às^¦/EBÞ²ý`hí [Â,éÕB`Çëßg=©½i5¤]^!%hÊë¥ÍL§§ÈõÒ~/&Uú#A÷ d¼<³´8§Øp>&3yëLN&ó]£TTù´"5 ¬2Ä\ü³5'ëÀúexÆPötigöý:Ô¦UA²éÏëúp!Hßùí§% MG³I=¹xÏV±ÓìÞHN`¢¥iÛ¨¬9ܪgîrkÇç>ÉmÈnuÐuâÀ3I¼5ÅØ,Z2/IÙ:\ï°ªºï,çbÈ~9`JDâóx%¾úáiõý¾_×CHúhl)«#Ú§#3(ü¼¼®·Ä2lU ÙõïÒiE9çj?éµ§!¥wfµ"ÆÂm#qϤ»IBËuddôÝeî"w¿¹yr`±®XüÂ8¾¯ã<dç Iö"¼¤âöy,ãzáüÓíÏiÅ-P(Yc³8¸ ¯rƵøú¿ lÁ¦ºñ Y~NÏçà°'1Ýuö6íe+½»õÏïÙn¼hS4díæ@z¶ §0 µ> ,4¤¹:½»úÞ©9%9Üu§ä¬ ¼lÌV=}õ"[å«ïa5k¥G»ú¸bV#5;ÄÞLs½ið ~ù¶·v 5"&¹ü9tõýÐñ8Í8¢ë_2K/cVÓÉoÔÁA» dÜ+yE¤Róà£ÝÆÿ8"OFÚ-ðiáOIÈK o¯K³vIúìTËñ³µõ|ÜÆ(ÖªýºùAËHÿS׿úÆJ#<=´1ÉÛ õ¾FNƦ9LÔ&Ë'-T¶¸l1Î{ü£1Mí1Þï¨ü}TäUG ZÜP©{õ_ fÐպͣì]ïÅFsa.ýûûÔêDÔÖpÎèRÿÁ§ÕýàõÂô°®å|oï_eʹ9Z°ùN¤ä´Uñ¸®½Á°RïLKÎ qzè;¢BõßfÚvâiqx"dýaÒ|u×^v¬4Sõ{zfkYæóXùsÿh9x/®¾3q¶½éêCö;¾£TÒ{ñÖÃNåôs< ¢èBp×Ú2ª»]k În:³Ù à®r7ÓIæDõþ/ õ»ú8>öoûWÛo¶GÅ]ýcÐgÙYøé×°LºyÐ@¦_bÎP2¼k<¸®^ Ï&1]x²Þ«¦÷Ü ÇÍÞ qíGrÅáÆcæàK-2³«c'õ »Éyh >ÛþsQùäµÇ¶pɸ5$æ¶§¾÷z¿mIî½¼TúÐ > k»Íë:°3ÞOßOýËÝÔëqÿh&Ö @ZB»T.Ò~Ï$sän@vûûýa'¹FÙèǦ"7 ¥ Ø+a«Ê«Ssô®EUÍ®¸mHÌL\§ùbÉæ5ÒgfÛßGq4¥ò V©æüá¹t]+cNToTÙ'ùacÕ0önEef_Põ°Í/êÞÕ±1PýØõ´ |Å÷õüåB|Þo®×m¿o¹÷å²î|°ËIèà !ä³õûéôYÎ,¯<Ë:&!MKíÁà>ÒØ¢ÜJ;ÜÛ¤YÓ jã@§"Ó¹¢/LlQ ùÕ2PGZ ¾XH«Fâèý¼QTeÁce!ç|"IáDTõÛ2Ó]</@ÅÀÐàDù7¶dF¤Í¦¾(g\¸2ºu$D^Ó;05MUiîöVöïü¾'eÒ#k¥¨Ä]ÔØjJéàÎÂçùj¸#¿XÉòöxJÒìè5ÛX©dýe°²ð¢ÆeNK̪&MU6Σ°( Ä¿-@r xï }$²¢nýG7Ù÷ÓÀQWNÙ^{·åô =ð ¢3=Vn|áOm1$jOoS´['0YïL¤a½`Õ»ÛüÏ\ºø9tíî-]²kq"ÈBM³GÏKÛÐ-ç:ÔàYjqQZÊ"~Jh[7$HÔ.ÏdSç}®úìrvo'ñ]î4Ñs:÷@g_ ¢ ùávKÀ>Rç< }<ã¬ec-× @mLeÂ*YãJW +S·&ëH«=ì¯è¢ÃeÝe©L]̲óW»ôÌÕ1ÙÅþöîáÑæ¦:qÅxuEîU×f·3)º®RÖ±píjÀÛè£Yq¡¡ÈLQrÜ6\XU "°i04Ï (ýd3Én¡ Å©u¦×§È>÷èû$¶¬ÁTª¨ucÿÁBúÿýåe¬·4Y÷oÝ(SõÑæðÙÐE *|¼°v±Aµ/ëãìHòleMn(É£ªJr(Ê4Tl\÷ã½Mm.lác Ï ÀÛ·#ò7nêKô¿á7ã)]Íí¼®/£q\5/¤ktQª«RÍÖ!à#!"¼u¬úéÒJ^YêW¤q ÊVðwqêh·Ô9ÐãUJúâ3¥ÅdPÕ%åÉnÿûÏ2KË£UÇu£:7Gk(3];.³ Úðøz¶VØ·q&g=cYQ-Ȭ<WöÕa<ÞÀâQù-¶M¥@¡²Qb+,9Ä ¡8yswLȨñÙÔ£ÁQVA-TòµÇj/°çÕ@"µ-Ïþ·Ù+b#ó9rçR>^«ßtðïwRé1:FBÐ;ÇW^©-ÚùcÇøùåóß[8î^ów±½µ?Èv#ïsº)Ëé½éï<Ý3Þ?ÇÏ].èÕ§ê>ÓtytK»ÃüA`>ÄÁÚê¢IClKýêR!°'ö9ÝÄßv9Q>'¤âÈ3/Aød3[nè kÁàTîÿÿ¤o*,>²)Phén¯ì^Aº¬?¶¢ÑZ*ã :ÉW!B5u%Kf ¡<ÍÖÞÓuÇsÞÿ@Dî|øñ~Qs³n¡LPUÿÎ;.Höe£ZÿÑáo1(jßÊåF\ eÓà af êD=-#Ô+,ç ºí~ïüádÕ¾o>2ÐrKnëò~6}?+JÓé[PË toåké":EÌÕ"kòd-ºõ¢{ ð8==t%'$ølÃÆÖe*F;Í«ìÍw{»Ñ£dVYäßÉùý:»W2±_caeþ'Uu5pæËTX1ç(p4¦ç»$@¦²ý5cK(/"RgÛºÆ`ÿ»°C×PÉéBÝíL)¶"U¢+`\d³}#ªúøºCÆzêAÛÚº¯â³JUµ0Ñ¡Òkþ±õ»\%vT¨¼úõU _Î]§?ýîöu¼+ÎõÆíÙQWjÅ hRsm¥aø¡Õº=VÐ&U/ æ$|6rRë.zÓÇrpàµËfÂD}öME«ó«°lfKPEe3&ùÿï7¦Lå!ÊbE±ïmú\ó1H¾÷¤k«¶Ç¯/³+QØ.ái\¼Stp¹<M¿>b×vXÞÆ|ëìI:a·aæ °ÿ=º¶Åä:;ÀÁß>Pv43jYÙ¬ãÝØê¡OIÅPgùbÕðùAÞÒËÄ>B¢FZϸ9õSû~:é`Rÿ·ê¼?OJ»VÏDM<ó+Á\tñ®&VrÂl Óܳª§;§ødZ³bC!ì÷9«§²æÜ;fÎj«¥åßà®UZ)¿Án5¤·JÙ¬¸8Y/JÝ^ ×°Ãvhº®ê+(¸$f¹ÍÞΡk4^O¶ Boþ ÙÜ hI~çùËarÿ±åto*@ iwfv¦üþ|_jÆ k° Ã@Ô`óKNÞ2Î6²ÿ½dÀ§ÁàÜ«i7}dUTÎß_YURPUÖîÄ®Ic¡¶Ö$ßqÜ6ý²Ò -Z|1ÀƲ,3¥ ØÞÁäç>. Î86¹5Âå*À/½$®íöÑ´V± ÚÊóµ½x09k8FµrýßͲ¨Ç$Ç$zãcòðfk_äÏyT=ëlIÿÊ(Þ¯ÇVÓY©¨ý þ w¥ITß/òjAi¨9ü_k·õdCÈíátVUñfÝïÞ0\ʼ®û~¾ ügÉ |ÄqR c?§FMnÕüözÂÅfÜØ÷ð P5ÃÌÞíE½[è*Õ^ R#÷xSÍJóCjNu(´e!ñõlrÜÎö8YÒxX JQ(¤ì£Z"ò'²PFHn·:8mú ¨ÉÍÓ%ëw3¤÷l`9LÚ`¯¬ZR·.̶¶~Wã¸Ñ:.²¤ BÂü µé MÇêz%Ð98YÃ7:95+ºSݾ 3%:Î [ÔßY%z î4άûÆml% ³ù2ãáP¼1bQ¦\ ðÅÚ``BúLÂìÕÌhÝ(%¸vz¤]_^Éh×7=ÌEJÁLpÏ¥U_QX±Ýàa¾T äSH>Uêt9m»¡¼ù(kÖ®ÎÐ[uZU/-åvÆû1;¸ÏdÛ@UÅ#1tXØT5]ºI¬êÆSfc|§ýü ÀÂ.)Ã08l£ïÿ l!I¯Õ§î?é0ÔMˬ¥gZ¬eta(=AÛßbïB§Á z)>)®0#"2½ÊDª0Üñôô×~§T %÷PÎ7í: Jë"©g§ä¹N:Çv4RÓ{¸ U±>!^¤ÛÝzsé¶"ýóSýû±~8Ê7ÊpÔ_} ë%ß©ÆnQøUOIì 9B«Ê|°/ë©mQ¨9â>¢3¡¯hóCm.øêÚvÒü¦';Âç÷,8×: CZ&Úäa 6`¬1Ù3¾EíºùTn·q,Ë3/ T>mBWîøã´>QÑVUpÃQ{øáûH/¼iÿ.ÛÂ|zò¸X¹+D¥]Æü¸uT4ÜBjëJÇEÙ@¤ûõ[Ðy.´Âý(¦ÍS}JNg >tèLç -oÍ?¬½8FGè u ] °d²< lb¤ æìXb_)û îøk¬&Á¿q®ÅÛÒá)SF¢(èïqË»R]yx×̾-ø=ËÈbxi?X8£-Ahë>ìÿåîj²sc_{ÚI&¢Ö*ð-CNð Ǿ½¶¢g?3Ì@]êLÜÐP';Ó ÒßH²écGðåLeó¬ÖO"ì׺mwÃ=3¾U1 o.{½U¥si bͣǾö5=|{¶JêPn´Uq zî¹(>·ëÔ½üÀÁ\EAôI²eËù§ÂxÑFýºpaü$wU×~¾)¡ )Û=×ã<ú°Mx~Ÿ]Íu AÅüÉmz$µÖLHñÒȸÒUݶ§À7VØh [ Ðñ ëS½ .hÌÒâ9Ó¸H*O)ÞEèå÷~§[" ÄtùIºb>¶F¼)ãT7Ö×oĪ[,W¯ãêk¥(FwDØPÌvd¨ß¿_]âá;ÝÏMo_Q7EåC?ºhK»ÓSÑÀñHðÇ»K«³]?+à,EåÃxµoáÛóü¡ãÑäFÝRázÂÚ,ÖÕ+ §9o ÆÑ~(ç 21E´¸l3¡áw¡¢ðµ¢ÍàBûcS2Q@ >péºb°[+á¥sé±*Í´%j&ò2hãß%&^±+Ôþ:Ϭ+coî"àüµõ§O}HÀܶ-wT¨0Ëõn\X$Ö»/(.¶áÈyJ4îõð©v¸WH(,1À`"¡<ù*Llé9×Ûýòq¡i0Ï4±ùZÿ«®%àÿKx@0P¸tu &@*Hêqª¼ø"r¸a£gU28D °æào`2L¨ÒiÒâAÙñ*ØP¾mÊã±ìFóT[øÂ·8Ρº´D2b¥õãй$½oR Þú£üc=7yô' $Ä#ç¡´°µ&ý(¼1uNphhóÌÚüÄ®¨!ô¯£>êì$T$J×XFÛ0 xyÂøY¥í²Íî&IÚCÇ£3Âç)§ïl wR+ýúô6ÂÑ>G³e'jiU>¡,ë{i¶Ð¤dò&Ð 5¦5Í6úÃÒïXCUdÔò{§òÎöfÞ8vy²\,wÚ¡gNoáN³îF3CZM©øÖ]ù´0¶¬Õlô;ßQÝm|T´Æ³öúýÆtdâCÀC©©-êüß¡`<¹úW0D2mf{·ýÔ°C¶·%>æDH¬Gù§çÀÔÆ¦"Y¸khÏg?åJÑí3§«¼ïVGqèØ÷Ž$@]í&PÁ.Ù,óÃpÔOGx¡Qx½ËÛÍ XZIùÈÖñúCÿ¨2ìåcP1ó> P ÓxÁùh(]9(\ØÃö/ «¤ÆÞ"V±Þ¯*×í©Í®ÀQHÓa(£rµ´ÏÌÑy¼Vb;huÎͧ^gBá@vÖÂ6Í,øÃ7/àg¸èb] 7¥Híúâ¸*ÕSøA·¦yÈâÚFi@«ÒH÷VæÀUlØeêÓV3þÆ?ü$KÆÖ¯NTumG¹ÇaÖðr¿Ï7ÉhuË:.è3¾ç«àP,þáy Nl´tÁ¶Uï,©E)N¢`hP£QO64_Ã`û³°)¾XÌ¡î7ÔÖ*ø£ùÂû£-x¦»z½3þHgù-Í,7 ¥êTIMÚS'Ý8Å8<ðü}_7g,Ì~d&ºZ¬³4ÑSÚ û¡§èÈËïÜ®z¡ëY Ä¢KÉ£´?°; g²'P@`w4"¼:t½Ø X9&c× À µ r½Ñiå(è5U{ÿÀÒä4QÔ=Ú`ɱæ&Üÿ(H¶ÛvüW"Ê:âruýúCÂÏ÷~[êJãÔänIM!ì-¯£Ã¯£³.°þÇÛ~ÝÝCÐbUA.4+¦3^Ë[¢ÚmÕǦ7\s0²îÜËÖ\ù¥,O®NVß:Xq#î2¹\ §;Ýt×aÑc=Þ¾èȦÈEb3 °ì³u¶§LR<ÉV%yÃúб°d!ïÿl^áº,(°n÷³Q°qåMô d=ÍCó×5 (pu륳²ªº bXRºáf!GQI¨ëãhN>6t*,Uã¬ Ý [ åäÊ&Â!2$á$¾wW81bÒs E Tó¨¸:Ø ¦Ögá?Ân û::A~zm¬o®;½¼½~èBçvq?5A·¬áI§ âS˪é1¥XγçUØ@%$!áE«³sBÓÖ>nfcöYñã¿Â`es#ó7'`¡m=Tû¿°WgØÇÛIÐÛ¶:vk[×\&¨ôã8]º*Ä[ªü @Ò¹$7A!,»rÜ ÇÈý/á +)@è~ã 7.(Ë ù¨gºÇ}ÂÝH®Ü»Âå¢M Û Önä·GrG;ä´ô<koF_s5J8¨¤¾Õ7!ÓÛUvO"38N (!8VÄb¹*ÉC>Ød} Mté \h̺<¢_ZÅhÅgB}÷^!H±Ù(h\e!)0¸tßDåðËÖ½3Í!ܽÖwè «=Ñu¦µXgP. g(9¥íkÞk)!ÛÞj`Õ^MRßL¼9ó*. ªÒ¸ÕG=ñâãlr×Zw#VÊå< ¥|þ¾¶|Z¯Ôþz>ÏóàõTQA<¶-oO?èrê9&Æ ªÝFÔt Gã@Óø©¿Ðð8H~çe2ü¨m':ÁRáp°¹©¤Cän~Z<v,ÈÅiv2 »ËÜôÅ ÚÖnéÁ0Ò<eDC3üTþ`éܲZÀ ¸=É2ú×tÿûhâ ÖÁAÂ×X¬Y(iÐw¿Û_)î$ X_kãõ³yJV` ÀÒ$5CAT%;)Å)8BÂý¯ÀB°%,~],²L²?ôðóûí bØ©0 p ØOÛÓüÞÀ5aSCAZ;Á*Ç$ÀÃöݸùX¨qBÀ®ë%_ªØÆJòçuD¦$ïYÿø|@÷¡ozj¿ºà`Ö`0ÈåÈ/d`®Í<þÖg¾XÅÑìáèpFkÊgs»ß÷Ý&PZ}hI²QW2ª½+ã ôÆEÏÀîWEj¢ jûzå:J1rýx¤åXü/ üéäLÚcªK9À°ßòò #J_½ìXî8úó¼ÕµáuEɸ8Ço2eµùØ\w¿¸^+Èr]á2©ÍýUÖH É8°"gɤâ)Yuj÷ïcÓå~º³9F9èËôPüJHÑFª Ýr4ý¶}ö6~öö_vÄæÁØ? ëBª£ñ×wº(JzòºýTsLX¤Ì3°_Á¯ÖB}°|âwÀk-a¬±½Ï8ùm©Tfµò7Î]ÀÛ{j#<µ4HVmH}j«%-¾u1=/,Ômß!þµ¤Qfo³Ð@0'C3jÁ¬ örBÁ¶ ÞJYýÒqÓ!ÖAoÊи¤ ÎyùEPßËWNg Ö&S%mÝ}´b33²Óòº?_µ'¸²~Ðd¥ì;÷獵~½ÒÙs(_PªÁ× ¼V¥z¥pL±2ÚÚoJw+E§çÚ>ÇQr2Õë¬ Ög"°õnBWûÒêx¯UÿÂMÓ_]Îÿ¼jÓXs§có¯D¡V6³,/Æî¿p`Ff¿fuÖñ' £ªoUÐAsq«Rz66âgH±w ÆÖïà« ZWoï+\¥FïµiE±$«\óúºÅŵOz¯Gß>HÒùÜNµ¤Xm®D_T'³ìcô§#w×ɧãtÝK§j¬@ÒP©KÚ½ÇîV «_øB}·![E°9S g÷íïâ;Øèn*êÓù²xaðP¡¥Î9°2Ñ ìêªG{Ußç(àAZ^î~ IÑ7ºÅ>jOZ!z9wÇí¸?`éL²#a ÍÎ!²Î=rÿ³ä%Ô/²ïF¶¤4}}~à1{Öb-ÖÃçè}®°f=ýdq¯Å9úʯnÝQ 'cq ÌH7¡8.Æ÷P`£+¦³r´þPø®ª*ÈÑ_²}*0ÎÁbþ M11FJ<°µWÍ=çkC=Íîümöê%å{Ý1);/ ÐÔ: ¿Ep3ý×aÔ&ËxUájí¶nÅø`ùBÿwSÍ¥VVäæcÐò5-ìêyVÆl±N³~Ïñ¢UZdÞ½ÊhÍ|W7qÄ}µí°r C×ð_ÓFXl<2ÃF,°4§Ûxn½ó !Ú¤é?D3)*âµ1é\е±$ì|$×÷õ#@'+cyTÇÆTîÌ\ª_|î92ô¿¬ãæ?jüVxµaìÜ%½äKËCG Î̹è²=Î0VP·7°«àIUßt!ÆÃü[k=òú©Ø2(iyúx±±QÉ´¿3µïìHË N;ÜÏÝ(«Òÿ`é\ra jRVäO´Ën»ïEzÿI¶U>º« ìÖS6ÜÔqtÄ8ânl)[®oä½Ph[Ô¢yCQÝθ#8xI¶®c%ì$¼ÅøÍ®[xò5pV"«CûÑ^QYÁ·ÅµG>ζ_! éTÈë ª1 à?Û%7Ô*;¦e]fVÌ£ùsþÔÈ@§6Eðuµò¥^®ü42ð+fÆÞH?{ül'ÈÖNi¤:Ó6ÃÏÍ¥Ò|?ÒÑHWÆîíÚþ}Îf«BÉi%T"·;+÷ 4 Î3¢m3/:Ì8dá^ÉÛáÿýýâq#/ß×~hþWQE9IUÒjS* Õ.ÑgßRÒû.à~ª^å¶\ò¾¿¦ )úi¼Æ]ØÜÝì¤6G¶v±/) ~ò¡cj pkC1¥Ý²Óaü>!,_´ bi®(¨®#Så½þÂckÆ#Í.|0c<Ã[qÕLjÎUp¯d$pDÂæìeªÇwR±B¸µKìjÛ?u¥ªG gl ÙèF«s0÷/¨?9õû1.Ä_X:³åVa rÊ÷þÿf«!@¶ÓG¤Ê~ ¥gÔK×Tz#¾¯ä42)µe/û>yX¤5îe±~ú·J«¶F5r+â6öVÒkñØB°px×å\{h«°ût WYÔ¹¸ÇòºÈ 5?ÁÇlÖ dKà".[½ôÀA øVÎpZtå+44ÿ$ô)*Å1¤ KM¡jÌeM®PÑR_<ö\CüP¾@}r±ûåÌéÛ¬¿$§¬4ÚÄ¿Vxª êÐÛ9`É;!.g7ÍýUXÎ(¿qU?ìf¤kÛ|veí1ù¾×,5Çé;b$ðL5¡>ß±¤ÌÐ¢ÝØ<©:hDw¿Ðùôòp=PF{ÜÑé¾Á»¯{«Â9ú¡tñÍS«@ee§$pC¥Îâp(Cl=»ª<·]!ãô"X³éÀ1HTBY ͦ¬bçjQqà1=òGxKL#5r Ôõy.ÊVúÜoëÑï|® ª<ö-¥álM±×ã×UXÇ_óÓãóO$rÓF@¡òÞï¿íåVbJÇjòl ¯¼¨ðïÓqÒÃV¯Wë>Æ>âá²±xîÃX"ÎLT§ÃinsÞÿ¡gC¶a}»¼¼Ä¥¸jm%k~ ùom&m\3Ó4±ØÀð*ÞäßÕ g¹ËpÖW._â, 1NÃál&dk2îu»6í9E¹@÷¨^üüü¿ ÎFNvB@é¢9AÊÁÙÍ¥¸^´dúWÁ)Ӭؾ_æ£öÁ÷ØqólRÛ">ÖÄÎ7W 24áú,iÀãZrà[ ãÒ×Ígé·¨]SS7>ë§ÿ@(ò®^Ý@éPX&éò¢sBbOF¬K6hTÅBï[Ì×0SÔ¤ÂX7¾MÑú®ZëΨò Zt\jÓÛê`í§ÊÓW[JÜÇÞÎzüáKmüÕE£êãÑeà\¥÷üÊë=®7ýuéhóë0Ðj«{ÒÊ~è·grÓÔÄÜÓ< Ù_Â6ç?¡Iu·êý´T¹}c o+¡B° ÅB·çe½¨ûÐìÝï=Ne]³ö¶÷»ÖÅ1#U©7(÷»yT2±,÷üú+ë²ûõ¯óò½5×îâûÞ¿)@³Ô¸<äûÕh ³d©Jð´ðeÓÇ3d-xè9Á:¢3̪CVÛÅþ'9ÄZêO ûm¦X¨ü\T¹óßïù|>B´©®÷8þÖ« ¶»mÉÓë÷ñ:ÿ÷>ßõ1!´=ýËVáâK4$µ(÷éÞ¾aÞÀâÖZò^³°NYJõ§hMúÊ`NÓ¯Áò¶Â!Åïà°!#(αfá^> V Íâ¤à´j.Úõ¾Ñâ=vÝ4zo-ÓõO>H:©a ãÄMâÌ´$¼ÿqä]1I<þþz^ Øîê®ê*é{îÄVù"DzW¢¦îå úFìbÇåÒøÓÛg$³£hÊ4ÄþXòQs`2¡J+rËj®#PÜ¡t/rÏ.7sÃ>îÁ!¦E/4ê¥ì~\äÁ(©jÐÓçuÒ´aG«MzL¤ÓPù%CùiÒ×hÞ¥PàÜˬ« ®»®µÖ^é0×¹ýþÓÏ£Án×fßÎÝY2ñ:>êèæê«Mæu &×@5"Z¿¾Øïög¬óñ²Jkà¼g ç½µ"Ä2êPiVÓã½4NýÖFãëÜe^ZDðâ fiIÃ©ÔØêÚ·S:ÃqA¯÷%¥WeZçñpêÛa´ \¬\åÇçonYa·ñÖÚ¯¯Ò5,ûñøîÃË˯Òv¼ýýàµ'kÞ·c3Ænù¾ú &~6ä£`²c|Z¥³ö>áj ìæq2ÀÐ¥î¦Þð¸ù²ôÏt\£Ð}ç1ý2T³ãÄ 9øýþS~bé5N&ÙÁ>ÒyìüVÖO:9j°dz/8º}ubî ¾AOÄù¹J¬rq9ÿ`éìã ¼F$òJòìcäþ7ÉKªR{BH¸¿qNÐÏH3ÝÓí~½ýfp;W{ä¬û]o)+4¬°Ô%}¬ó}97)28j!u¼Ê²å?PïZÎçJ# A4ù|ÁY ŤCÈòhz+$)*õ×®ö£8V¨~fëæ`Zå¨UêÖk²æíRÖ}S²ùxî½Õ«tã¦ïãJ§³_3 ô.$ÉÌîJ\3)MgèÞÛ¿¦OÖäΨÓܵëÝõçùÇ4ºW16éñÀÒkìíÛtoËÆ½â[]ñµ â§µy§@'ßsKÚÕ ví#i¿;¤u!ÚPÑE-äÔYôHS_8+ÇÞ9ëe Ç\R)ÓGݤær!³hÆjE#ÙÎh`ÎÀidø(,è×LæÒXÔCªX·©+ùCÍY;º`&=öðz4ì¦*3-Û0q¯H/d/6þ1R¼Ëjå+çâøuçºCÐû9/Ë¢áæ7ø©èGûË&ðC v¼^®Ï__Ö% g#¥zíéípèIq¸&<¬LÞÕÆ2[¾;v5dìTÒ¸s¾¦ù}!`'¤Æ´óØ*§ºßqx/Ãæ«¾ mÓjQDÌ!$/8*p»Þ²²'ÅIiFA¹ÍÆÓ FÓ:f·í°É3´Á¼â,X6Øri bÛ!kíoP±Ó\o¬¦[ò] v¹NÚÓ[íIg1Ü5©4*xù½V4ö6#rMÅmü:1¶l£ôÿ é\s §iÚ#ôOÑû¥mHp¸óHg½;kÏÎÔïJ~yÊCKÚ¾lÓÈ#¾ ÃÁPʳ+²Mô]Ç}E¾¨6pÛZf«^;^uÝi-ÖôE +£WÀÞäÆyd× Öéã¾N×¶C÷æÈJÅÐöÿ0Ïi:wf°§H½\N·µMÁê¸õQãGáÌ¢ ! ×o8üDz¡¬ºë4-ÙS«£®´åôÎoÆ1BS±ëÐZR (µêU.!h ßD0to: ÆNQ§\3{©¬·Sn³Â¦ÁFð)¶NõÃ-*k äÃÂ2BãL'ß{§@[¨åÜåpþ`éÚhIÖ:}èÿÿY_;£õ!\6ôm_f¨ËÙÝs¡=߿ܿÐkn.ÃuÞ·Ñq\Ê7N uK-P«ÂH1ÃÍi©NÕlKN,&¿=9ò3)8 þ5×L)Ñf]ÚE VËú¸ò(lÍûey õëV[#+@x)îJtgï;_ ðIÜB>ÆM¨)£^×¹:ÈÇrÑCuLUz!Í8E/¤åÔþû³ââÿ`éÌ ( B%Æ6äÿÿ-3YAÂÂÌ=M]EBÞtû´u¥`aÓ BîÚçõÍXSõ´èÊ\çbùâþõymq8áÜmapaåxVs0|:¯ ¬|®6øðNßäX#öH÷ÝUë|§Ô:ÆÁ#a¶i×ùaMáÚý^¥Ú zlHmEÏ{4ÍG eH´v']YÁb;ë«q¼ n~þ~ËY¯¯®«0(êê/gòÇúýïcâÑ$ÍEo¼î¼ïKôsÏâ«åôíû°£ðIÙ]{Dø½ÎZ7ñeµð`ëè/åKû'2)Sq;yh~èo!]õ²]iK]ÙÍ ÉKSn§vLkPtùVIBA±-·¹ r1Ò ¢Î8=¥vGh?ïoIô¢çÀ]oëRÁvزÙ;Zl Êî9 ºæ§c5&ä¡°¶mÌAòõT¨÷åZB4p ¨;!¥u(`g% WYm(H@:ËÚ{v¸§cZ v÷®o}×Ébõ»kÞüÎ/iÐjx^ô~2ÊqJj²oä{=#fÚ|ÏàÏûÓ[U§²Fþr£kh´¬Ëýhiîæ¢~"mAì¨dêã2O¡e,Fó(?æ\QÏ5ËÃCîI. Zø«ÂG¤¦ýÊDØh`!Á§ÑÒ³#²T1",°'&{áöÛù22³Ï¯K¾»Ü¾¯c¸'j²N´9ùb~ºC8p nG³ÓÈos)®ñnå yfl| ¸ÓKÓ³ÆU÷'bUhLìÍ#}FÍÔE¢§ÄÞ¾7ét\Ám¥]ñ:T4v;O,=}轮ȷ,Vñ¼ü¬$#v¦=$õ' H óÓUþéÑ5QãµµáAto¹7Ïo¾ÆáëD¨åN4ÏR 8c^î÷åqMCLÄ ýTßó]R²WqëtuÎ1b9ZÝùe&LÁµË[Ñ3ò»ÇÅ 'ÝÄÓn ¼ aùÆÒ÷ùp+ò¬¢hÐó<l)ÚJa=½¾Ït.EßóÞ«óçÏ÷úàúaA´5Là5¿çYïÿÁ*P£$`îû±±CÛÄäýü)_¢ ¯ì¯'âú{ï{=þº =*=ê?¢8¢ÁÞöªñaz kk¶æPêÜ4ê ĸ³W»k&'ð þ; i"9%^º]]9.ê'÷0´ÓøT´MwÂÂ$ôÛÛÒ;bkÉ7»{7·ú9·qÁÇ>Fi9°æ,OöP¦"à`±nù' ,tOïumæí¯¶}l¾ýï·»þt¿\öësH߯ooåÌ+v¯nLcpûÐëk´ {%)[Ö3UÓµT¯VZ ~§SÆÑ×0ïÚzLaÒWà/° N7Þtݼá«ÖßìYW)Ùl@TØòHÅ SIFÑÃÞf$ 1 bDsc+Æðövßrnßßo¿nö3 Þ§Á*kóé+ú±èûõ6t¹2V¹Yeq.Ï&ìVÏ/ò^îi2h>ò/¾cÎy3ÐmɵìúíáÜþÇ¿ÿôêûÏ0æÅý¡V`ÃUãTR(aÜY´OËÚAr\Éð}ËîàJ1ÎvQç©cÛtòÙ+nUÖës=+{P_ #¾|yÆÖN1í ˦;Ó}¯&aù¯Ghs ÛJaÎÖ0/ ;Oï§.²Ëé=Üm¤÷±ú¤³[N¢0&!t|ÎôMúþOÑimU4 Ðý¶7^: ÉÝóc?Þßô%G£«ä+ÛÊ¢ÄìcAÃr®äG{+ï¾øSܺÚ/¡íÏǾ¯é\áëªö³ßwôÚ|øNá?dP@½ÀE¿`Ã!Û¦ãâÈfø¦>p´ò 2Pi 6Úî80g5óOàtÉ\sºe³´çKÙÕÓR}_µM\YËèM½yÛ²!WòE3 }'eô /Ü'ûãy^¯ë#¥áñ|ÍhDÇÆÃsTTª κy),B·#wò_§«üy]AÄ%{ÁÁm°òxq\rR÷ÃÂSú½Å4Ev³&É3)Ã+0`Ä02Ùy½·Ogn?Ïyàu㺣 7×ôÔÂÆ½K1öƹ=/=Ø4ky§¤>Jd(íÍC@>=y D){Z¬Ì&:®´=þ<OæîðR+Øqmq¤[ñB g|ÿ¡Ü>®ÙD½`ÍD b%~¾È[>D2*wO7db,÷cE¸R´ɩ%$=ñüö)é»wÆ)i»"ÝcåLLßQ uWO¹ãÌÔJBäF°yvá ß-yS¬&ÃàÔßáTWNX(MÁ)))°Â:J¢øtª=Ûâ$ì¤fb724¦äw~,Rç_'dÄX¼UÉôgrËvÒ¸e¿ ³{¬Ï&§T®3EmÁ±{Áå9óº¾iF,¥7oH1qØöÿ4;;Ùª¢ß$zæ"@]º×3 %?ÇÏ~·Áú×þ%+á¹9̲(?<uqºÁu¸~)JïÎ;C:â RXtد×N¸§ óF:\g¶G¡§åªwõú7î~p½oI'-x ¦¼¶\ú¢²\h`Tú0qT5¯/Êr¨!áuÈ!²ÑÒÌ ¦ÛÃ}KÎ#rç¼<¬G}Åy.Ál`%>/D˯c>½}îÚØ1Åì§¢¿oßVâ1ußî÷;XïO·Éù¾ g¹P«u¦0t iÎÙØä¿óükyäåÏí}ñÇ÷oo×kß×ðârì{psZj61#c'ÁêXpÅL4§¶, «ß&TÕû¢©ê«>\©MeH>zx¹=O 8z8sdÂÔý; µÑ;Ç×0¿kÖ »ÞÜ)ÄMãMr³½ xE6yaè «×ZÏ< %fÛ¼ÐëF1;Æ«!lü¥³mjp !/u´cuüÿ®t´ иÏá÷NCr·ÛÛEµO`½J©GæhoßÛõ_½[ ü1Vв÷ûÝL©±×Q©Á;PCù@Ø"O|µ£qQUð¦v»£JÒbå`µiFëÍ|G9q°$î)û+U½jñðà`Ò¯Æ&ímJ®ïÊ×èãå« 5è´¸?XºÝa(h *õPõÒÿÿ§Vê¥R){Á[ 3 À3o#»Ja`?·pYÜ߬bqHÔ]üÃSkN|SÜôdèºA ^¸Å¨Û¬F+SÌÝR(zÔYa*+C½ÀƧñµ¸ DuÈ5uÁT-Xak6v¨iJJU[Ñç<fyZÑ,iö]¿}¡/ÇÃÄ0LºDØÉÀf¡;2<U©læ@hî+Ï7P²28RÑ~µðh0/zytê,ÿ$âÊÚÌ·+ÇuÞ;"UYƪêÇÙZáô}×Ó¶ØòQÈ:¹+z©)mAS²dD%ÐDݨ» 1¬6,Ên3ð@âÖKÏn:!Å ¿bÅ<Ê#¥lÛ5óòÍ5³4°¾âþ·3 ZqçJ1ÎË¿ò %;î¤úxóEüü:ý\ÃÎÌíé´¯ltËñÇ)# É1ß@ý\)<ÅHÓÊÌÞ1íªnÊ\Pb.¡þÿlX¶ÐãòàºdÀSPÙ°sʵ¸Ø.Bx#vû»ê×óáÌ0ñÖ§Ñ{Ü/ódò¸ÀÕÔ+¨A7{ª àY[Ro"5p¹62Ã$µ6ì ^úê§Iÿ éj I >b§öú¿OÑ÷N«§J î¦ÿÉÝí·»êãýMdÄENª±àð 1%óaUQMQîgØãº51æ%ÈËm°g´hSZ=ÛѬEÄh0§VgF¥¢(©^OÍ¿¬6$uÔíC¯\lÜ"¸öTð©É]g@´{9t¥¥]^RðÇkóT*²ïúã m®µvøºÌ£#ÅMeæi¸ñeµîº¶ë«ÊHÏ%?jamIjI)l§5Hd&¤ß Ù M¨wäjófy馰±aÍQO ¾§ÕÑ7'-«däìøý9¬·ArÙ¬Úåû£ï*à×+ë¶ÙwtˤARHä )ç<Ý~-ºûHÚAÜp¡Ú«_g«MÁý¹àõöm^óc\¶QE5Ï˨ü'GS-*-ýG;Î GfB÷X]u[½vu%4´ç»Þ×ûæG7ýÁLÝv@nßÇè0 ÄÓ~¥-9¦&'¨*9ä(FÅStò9[ñléMSQtjÅdwÀÈæÖCÀÓçÔ!oreêO.IÈ.td{Twc40¾!)±naGÆ*> ¾DàfH¸B"KÍ;à¨1\ÓÁa£û9¥lý ×°8¼ðgªr9éÅàÞ¬]9É:Ç=x,¶A/C£¡½oÖÝìdm*Îë6+jÍÿuÃ/é:O»®³yÉ(WìÁËOi³néj¨^ÞÓ+N%31Çã>¾÷n&á¶<ÚZþb#wÉ?oÀ"c¤òvu3h¯YƸÙÎûr:·È¬êqûyØîûíúæ³l»qô¼îóõ I^1E|P±<â@bfÝs/ÂÀ2HÖ~h*]CòÔ´å¹üµ{ÎÔppSPPÑÒªSûJb޽ɡe&bÑb£ +PÔ |5Ī{·x)ÍjüøÒ÷ëó´h®Xç§yÉVîó¤0pUmßo« õT3ß;M ¶'/K´²¯K2ïi×f¥Ê4î{5l\4Ç£zéJ¯´/ÕbþõR%HPt&ØE¤j9â1 ¿OÁ¶Êõre·ØÖl*ë£ï°¦TÍz+¢['/èõN ÇùSÁ+ÿwÏ#:xó¶ ÑȨîx¹UosUÅ&Q&HUÖ$¡óËÐI~t.½mÃ@&e=¨ÛÀ{ë¥9äÿÿ¨Ð"q(¤(²3Ë/:äå,9û ÝLÖ<7cÞCñ¦$ìþЮNÏ¡VE³\/x9áìÔi¼bN%ÿhùçlD_7(ÛY6!ä´Ø¤Sêrþ¸Æ±+ôuä!ÊRM0gU·DÊñËèn ê¥pG3ݸwÇoç¾âÑ/3Ï8c%4+O9ßÑÊ»|ZäïvÛ:NÎXzÂ47SOVÞçú£e%ázÐ8åÈÀîÛ@Ãíxìâ§8F¬+ÃÚ]C»3îõrZ{`Õmçiý¹Î¤(Fh7aø~ÛÐ?ïÔo÷ÝF ¶f9("Kpè°ïkG8î8ZÛFxÀ(;ÿ¬oïË´øj¦ È<Moù&ò¨ß4h&D¨¦Ú<å£)Óh~Ýï·§+çb8×A{ )G§}[_ÿFûmãËßJ3 äùQ_h,8£ jp.ùêë®%2'Aó¨&*ôÐ20Uñ·Q¹ Ujlk(u@àDÒhÏ<Ïe¾/Ü%ç;ÇJ¹Æ*ËÖdXq"ÉÀ ¿ÓÀfº%7Bp£"u¨»B!ê䦫:Ë \ù/ ®YÅÂF£ Âãce.ãTîNj<{TÇô ûøÍ' ulíáöúDr%8©<)#a "8« qÀKÃuXا>»ªl|Ϻάè:ÇÀª@Mã¨buÖõ1cLË^¹ºÉ^oáTèmûÙYA7è"uÑä·Âò`P@}9²À^¬®çk?ºFiEH?á5K*j£²øõ(]ZÿåIdÛ×âBæîIadßËã 7¯5ÜÓ®º;ÓÎ µY) ?¶^Y.tiY£#ÅSò¹ó§L 3ÛG¼çFIRsÔí(©µ2*¥B íâ&ü°ð=cÿs¨~ÜpHkG~ÕÜætûý±Ä}}ksþÌûåkÿüò¡²7qZ¶R¦u}ûõ÷í}þò$h~bDÙôAtÕ¡ëï.ÞæÔ! ë¯À3Vö¨dé\YËUïÓcQ ³Åç²,á¶-qØÚ0øAtHbE¬³2ÿõö¨M"H=,ÎU·^),#RXùSWàw²ííXº¶äa F1~å1´èýÖÎ4 Ám Ó¼¬WÖ®$£RqÀU°eË5uØÈYf" Âæ¿ ÃF²ºô3>x)*eRõö(CEg¥HcöHÕ¢W',¦éßç,ãà©/»_xZ"Æä[E"Ò¦*Ê?,(N´ÜhN-£ØGRw«òç/;#ßç^å?»fÇÐ$Ó@ýºÆö¨ôøË´` QªÉÅÊÚ]Ô` ùzâØåÎkìWc"FνXX#³¿kjÉPÖl¹SíÆÒÃßM6»âR*ä|ªV´¡iJU«±Í ÝÿfEâãùöÌîóã3qÕpÉI%c²Â±7S9äªãÞÖ9»#Û-U-øìC;´£c Ø6ÏdÇ4öd%}°2éÀðh3ëááªµÕ T%§Ý /+e!ì%å*í0Ý â(»'U·`_±Pö?@ÔjßÑL ÜoÇï¯â:Nmåês©ôÜÌbdL-@QDé}ÀÎTR±¼J§ç±Ð¨ÜݪH/dRW8¨íÜ^^uªÃ.ìúU¤Ü<_éÓpÜúùú^U_9M*TÛoÍÛy¿ç¢ÔåÇ×ÎûÉ«Üg}Ìñ·jh¨%I>Ë-R¯Å¨ûIic`dÌçºÒjñ1ÎÃÀ´×Å^Z¿£3.ò£·1 /[Ò²sManUØLZÖ[{è 'ù`ÛX®$çñ@ØÉÃ>R²§¡öñò|mL;Y]ýt?ßê½¼½êa«ìÿRʤEãq8M§·NÂ}{Z ¬ÁöøsæW-í¸Gc©-Ãh¼eÔ2®íôO)r«xÁe«¢²¬£XÛv- æKZgCü½ÿõ?¶@"[ËÖ-Ñþ¤_[LIF#â[ÉièeêKÀÐ×Ý)kSX)¡·]§ñ1ëÛ\äæ©±¶*ÏJkű¨¢S+#*ZÜÓâRFëýÚ¹5O»VC2s°.Rà=×EÛզçtsâÂb[÷Öae͵wUã!( ¦§gý¢²Fh¢tÂéµ@7OBq8ÕþåÝõ¦û!ý/ X-D8)FЮ%Sô('A!ªÎÿuÐΤµK`7ã&Ëåxùx?_¯üáUÁìðû@w^Qà·Ö¼Ìù$PÃREÈÆ¾Üù²É¢y@9q hs8C×s[ÖÄZA ÿ¥j#¬]^/AÒùrÒï-âc}¨Øzv¬ûÒêÅ,nP¡&íí òvGÃyX~ËûJVcPÉwT»þH±«ÏþÒG´Ó´-Ãþwd£3I¶0ßîɱÆ,«ñÊuNÕiyx?8ï:T*< >ÂDP©ùoâc¡.ÉÅUS_·Òa&¶çLDufpBÊ¡²f?ÖdÕäëÇC_¤iúCCÒ×'!AïO^ë¦ ø£¼%D¶ UËT/ÖGLEX£×v<âV$Îp~79_^û×{zÎ46Øc¥ï¿ik×U7Шêýq5¢õÅ!)ÆhIÑ"ã¨UÃã·üHèD¡}X¿é³céØÞuü ÀÒÕõ6Ã@ |®]ÕijÕýÿÿ5iê¦R !$dwfï}@ÔØ>û|aaBqAÞ¥4GB¬.¾¢`1gÈC+¥ÚT u`3z`7$ú$ÄÓú&céÇ[{1Z5Ø^æb$G¡®¡5mJ`âJ @pãªVfj©ÓÇh§ÒèñyH-Ãè-Z´ôÞÞ¿¯×Çí±ÝíOçâD úüAßë'pÛì,Éáº]Â39kÆ¡Kç½Öj¦§54nøT%¥@(%Ä¢¶ºâ..´èäÈ <,ÚýÆÕÙ;¤S¤:@uOe/Dò#v@TnÑõîx¸Ðw X<I ?fJØ,LtM¤wé+rÓËvF÷å&ÛÓçÏ$~9©ªíåfh/hAÊh^#ý¤F² 2(JK ?± ¿êaæõu GMÓ§hK׿&ÀÍzB û<ÏÞÇi) ¤çcqèÈЮ`¤*äê2¼|²oÅ`>Ðt=¤ÞHTÅ÷s¹¢6ÄÓM§7jópcåP# sÄpø:8u¹¾íG{ص9P¾½è@ Áº´¬ãç@gjO«0Dã@ú6WúÕV71v§±ÂZî$¤øËÎ]\Ç5þ|bõúÛðд¿Sbòv6lù:Õðh~e)Dçæµ¾ gB}ªUë7ÂøEuÜæ1ªy¸Äôì»ÀgI¨Gá£Øò:âÍôߦö8UÇU+e\¸jC=ÞCÿ@ìþ éÌ¡(*@¶@±©*½ÞA/#û_A~² aI}ÏÓ¿*,xwßÿþj!g»Vu ù$c>$Lÿúù_À ^ì.ý°Fw .½Îù}ª¸Ì´ è©;0Ǩ,Ô¾ ÜÅX>ø¸V§V³Çq`¡Ý9I)ìL÷pÛ@ó ãunºÀMÁ° 8ÂadÀGDåÓ¾ÖÉá¡¡¯ ¢ª;·98}Jp©OYÓ'ü}l¾a«9Åq :âãóëçʸ!·}&x _;ÍT3>c( q%PàZ)y©ÐÃÜôÖ.?l2«z¨®án±´öÂ?¨¿-¶>¿=° «Ìì|qögê)Bï®1s$÷}ÃÊ¥¦}ïiùƸ ït×Îw^x#Çn4K´èWLüØfû|¹í? ÃöÔ7U ÷:¯ !l;pü§F I»ÎÓ{gg«ë©¾¾x!JAxÈ>CLÃBÄp,7GWõ~i+%kSÓ5x´iahг2'D+~6ãµn»ê®Ag`wç¶Ö#¨^ð"Õ®gVNxte¸õ9Ŷ¸>Ëd,׫rB7éÙ¥]AMø-ÍåO [é®éé¢âM\-x´,ôs¤qºJO_W=.6úf"ûGWVÅ@c¹gô ??#,º¿Õ"ÑmJ Ô+0E@ÝÒ&kÑ{8<Ó¿ ;íð÷«øïTä+PwdEªØ×C1ËÃôÅÐúË÷åkÙ8J¯ôÌÇcÃÄcâ&o|¼nxTÅC&µ,ÆõuæÄÐJpLÏUÛñlé9,æAayma5ð\ÏjÀ3'Uqöw8©ùæG 5"Ûêôþ&! ÈÚ±hp5âXum?ç"x³ÇÂÔg,.Aþ+Ê·¸Ïøsø·Sö].x×í·scâ8ÅF½2Ó«³í¯áòuý÷÷ñ}c#äp®^ßMsÚ»û"H{þÍëAýLmð®Ö»=©æy!ÎóitA÷;QIÕàhÇùSóãÞÿqìÖÑåËo»x»DÀbHÝJÝ©(ÌLqÌÏ#²·5;Iw|w'GPûÅØ|"«RÔ'ãïhÌûëxÏB1ÕÒýë¬Ù#¹0yp3z¿ª ×ç4ª Q%2!µ÷4ã¸gË>q½Ax2r[ 2¬ÕþzÕ^ ®}~ý ?ÖºPG ªFÕ922`G"üCëÌ:{[-ÚXjTÊîQ¹9÷ýõQ»«ò>C\E"T© Lõø¥Ö=£hDG1*½Ã%«jÅïxZniESqÊwE½rÖ¶à;³¤Ç¬ù¹¶PªÜÞ5>:ÞZkfI³uÓÕæ@»¹à 'B'³-¾nÇMaÉ7ññ5ë·øY 9eô q\ôUäzv2|kT?uF++ÞqXh²z êJ ùj4Ýù0Íw=Õ£¢Å6 )<î¿ ã3géïã+[ðIÚê½6A!BõV.åÅ´ô£> îØ/îØ1|5&%uÛÝ0|°ÅÎ1.·0¶ª= ÇW¬ÿJõGCÓ+ÓÚÁ¾×oSàh}aÞWBáõþÅZóÆ;C1¬¸Ö3f Ô]HaÅò,erCh¼²úÜë,®ÏI꽨ï|Ý0½¶Ëu1>*ßZW}4®Þ©o+ÏKò¡é#íäx¤¡¾p§yU~iW"æT$Þ$VíÉ%5nÔ¦8Caª{¸Þ¦Ój?¿¦ +dA&l®Üú®ÚUâk¤Ï^®`Ôws>Îþ|Âìn&LLÏç{§¹ïp»®õLµÐ4ÞÇp¡GpʬJ§¤q B£I= mwã³êÛ¸»/KOý¤³Ùip:nâü U\!qáxÞ_;'h NØf>sê¡©T9¶wgwvæðöúkÓг¶SØ?IËÙ@y® Ý+n°´)gÌÿ2CÀ5Ù¿ºD#jº/]ª)WJBRû/-d ¼³¯z½³èÌVÙT°MKdÐKÎvDÂvBÞ¯Ók3U;y×Âq ïa-mü?Æá;ÄsøFý0öÞîÆèáÌ8ËRa&P&oýXZ(Iÿ¹}ÓÓÐöBGª¢[°E®ê<hæW!Îù2ïÍn¦°ÖE%VW®ïÖK?b¦d6,|D;[ ðàB²Àñ ò*°Tër´--eÁ8Gf"ñº9È{,^4!¦SýOù`Ó0éŬG¹®4Õk&Ì;bÒVz£«Øu¾öø/åBC¾<e¨mË-ÓrÓ'='c1b</ÊÎïît<nO'¼ñ·C«]Æél1[ î¬ {(¬ µÐ^T`<_Õn=2]ò³¾[Xæ &Ê͹ëà 6`e´à=îzÄÙ=ÈC«MëzÀn¸"bxÏ\géZiª}7oî/×Ê;§·÷Óç òͧõÍç±Ê>½Ýê½þܰ7àMìk×î+hFLHô£WZzîÇCɨ=ën(WEa·ûɹZ¹ÒrÊ^IkvÓ8_ôn,ÐSB7oU ß>tç/£w1Ri"¥^Z|¹Á§Svt×û«£ãVOmòiÀ&Æ1e30d)§^(9Ä» xXÏÎDíUx5\ÔõÞ4ýèÿÇ8mÙõn8Y¡N hª%ëü}¯TZ)uÛ ÉÎ)XP-Vðè U÷¡¢(oëÇÇëÏë÷|¸¼}¼ãÒÉÍÔgîJÚ½CF±²7¡eUáÉ0½Ë¨Ö_¢oÓj³)¢x3XÈ`]ë¬ê;rãCø=§aI-vâp U[kË 3ÜÑ uý T¾çú1* k¢>¯x[ÕÂM×ÚWtf¹ ÂPl¢DYCÿºîýh%P0pïy]APl¿ñîëóè¾zBâÜn6Hº' W ¯ØÕ*¨ÔÞ Ç¶yÌl¼ÍÞ q*)G S|d'áÕ³¶ÔÓ£áw&>Ùê©=Y ÜÕ ¬áÊfÖ(ì4¥â? NãïôÞ?ßi^óR¥ûB½M?R³FµGK&ÈÕjªÚ\D®hv&öÍ/ve V*<Ð0KEÄZD£X¨/ÿ_%R@Zulþ¡øÕÅvö3§ïúd [ʦØ$@¸Bãú' È3jÕ{{nçË6rNiÍUÀ[Dð0åãQf˺íUãÿM`u¾³T)/7U,8G×5a²¢ÄH3 g°u´:¶bÄÅ4þèµèÞש@iuÙÏÂúDPç¯ÄáTÜla DjXs˪,ºïÁÚ(Í Ì£´.¥ °}Û¡³!¤7 } üw!ÚOP|h¹0M l]hߦ`´SB`q=æ¬R®U¹xÐõò3<Ås³¥·¶.\dËQ>tµ½õ kudì-Ð+ñýA#ÐÐw%äpTûbk°ô¢[+8§hBO^ñ@÷Né-Ã=d/v':Ý.Át¥¸DüÙa¢5b{â£e¸ßDxþ élv lÇ1NU%Ú§è±oÒׯÔ3UEEù5é|ÛBbïάggÃÇû[^1]RRâCJyV©ÓìÇU\ÀY;ì¿3- N÷r-hò@D¯Kdë¶öKb2{rû@µw¼ÄËÚÛ$e@yÐNÒûÚc;ê÷}¤ÄÌeøþ¯Úãйú<^ÿ±h7eià´§)ؼnÜþl]\ÁÁúY ½Õ¯x&'¬[`tÊãX'ïDbÜ-ýåçòõù=÷¿1ë}=×<ß6* ®£;@i%`iñcNñF]&Í%nÑÑíKw»óÙ¯7Ým¸k«å~¢È¶q÷ gzÙ(#;fèä©<'À*Df§]I!)èá´m}!b4Á0óY|®NKÊáH1Q (ã,¨¹Hè7tÊe©L÷Möj,Éá\ø¤3Kj¨-y³"àûq+,[2ý¤bYnÍzñ_RâÕ#U!c¹1ò!&L*²¦þ¤R;´x#NUlîFsÕY¸±cÏ EĬ2 UIfòìÛéh19áJçU!-+á¢Zf;ÊWCñh|Ï ekC@s×Á$TÇyûÚ~M|¯Ò']¥¡ôcÃË|ÖP6Aq=k§V)JÉß²P@m®[ÛÜ\ëãþÿÒÁfu¥bʪ¥L 'Ä4Zj-ѽÎ6æ×öV'£)SÍ8d7²ýÚýqI¯àº>©Òë`¾H½i¶>±»ÞÐAC¹Ù$ã|ÕûPÌìc>ðÂrûX:-ATmë¬ÿÿ³TEDw3ýNBBBîkf ¯²¬#\ ² ß|! ð=öfÂÜú'æWóÇ6ÌÌÎØ*·9â綬)¬4Hkí>è:)e4U5W3|7ßÚçÏ${õ½¬#â¯÷±o¶LïÛÏaßR6jG¢¤ f4ªÎ@ÀÉéq4=HM6X/¤úIÕF£¦_l æ V ZëySÌÙj-ð0ýlP£a: öëÉU¯-ͳÎ&ßBV>§e¢Yû¥s1l(BIÒº@·èþ´ »Y?ÜÝÐõü¿çNVLà.ihR0µz´fJð!ѳfÔ&^°·×ÊcÉûðJÖi ]ãïT¨0È8»&ôïJ- ÿ6DÜ\±þ) BDº¡8ù@ð;S9t²ÞTa~Û!`ŹWصãË1ûù±Ð@Z{b çEW§Móè®0ùãͶÌÖop6«þ`éÜvÛ ªEQ¾þÿõ© 8²$F¼uÎ:~µiÁ¸ÝuÓzsÚ<<©É«Øg*ýϦûÆOÞǧ§¦ öEQ1>t[ö+ò¯ ËJ·"N.Î&c/q{mÕìi]å}ëêsÞ Ô ]Z¤LÆ%=u5Þ×øçþööã×o]({A&²B}&Úß'è:õÁänͤg62rU_Ú¾i¿Ä¶ç}î;ݾé©\X¾¿<ÞkÔ½§wº¬?âÝ;mml9$ê¶åiÔîÍ¿`~æ1ô'~"èa¶=ÐcnF!~JZwiF_& 0Wz0ÅIÂÖëtªãØdÓE YÒS¨8?øëÇEG¢-Þ«êþˬ¼MØôàlÅ[åY8 ýùvQZP¶\Üæz[7py=¼½ªúÑ«ISDS(óº{½nK«I«oµF9xTÔÁ8·Ûy:¥®ÎÈ¡glG×ÝcÊ.ã6ßtm°q¤GeP¬=ýï(p;¡\)b2ütvIæPa<fΠɵ^WÌY[Í®iSD=Ò ±h`ú \:>è702\ÃÿñQ°º!(*$h±$Ë0CXV K] gs,Ù»ÂugU¾¹|¬gHèOàÆMÎî÷PqZòã¾ÚbI¤`mRÆl"]Òöh÷<£ïü¤³Ùipc;´ùiRDgî<ïÿHPÒæÇq2ßrê©";»;»³3þóã9¼ WÖ¡©=¤8aÊ)Oº°*Ð÷ôu#lû} ^Q_D׺ÛRWÚæÐ?¿õ}ozìåÛÆWE ß|,Ä¥?=0®wlܨsU©ò[µuwìýI BÕmL»P\lÅï04Sho½C!ßµùÙâg8ÀTÁüåaÎO¶áñ÷bLت2ÒÝÄþU§ì!ß w+:©:³2µ 'WÛ¬7RF%>é¹ =Ï¡°Aæ¸B X&t¬Wôò|¨å{&/µúBq_äÕsëÿÅÑw×¹éqtOÌ-{,`3} p]×mqøÆ{P¼``°þ5*=WÉõ»«dÕ~Ë= ó¿ *饶DÑÛ*ßÛöB¥üÒÅËêÛqçîá2üÚvóµ,]XtV©]Vßu ¢ð© W.£p(&9 Ð,Åü¨O" ýhnM°©½Ñ¹ ðÔV§vÎÍE\ô®ñl¬×¶ïB©þ¨ë-{ÿ°t&ËmÃ@D Hɲ\¶î©óÿK«¼EA2ý è¨`8[Ït×¥{èü(ú:tôT¥äìwzÞÛõ±fé1,¡B ôÿ| `p³*T³\Ui õܸ²Õ`ì}þùC}"e|r¶;#UZ·½N»õuZU"ÑÉß²qOÖ b7ô_ï7 \7u±0ä LQPàÊ,6Oõ¼÷nl?|ÎçC@ÀÜ4C?ígùª~Ø7¤¨\ßÖ2/Ø 0пl<ììÕ5]¯ßIï ,o;%URĦ¡Î§çôYdF%V]~ËÍd>Ò÷ckÃÍ7ÈÓÖ¥ ×fð4niA r³~Eè¼»{0öpLoº¡v±ì[Ĩwa¼,Û³~©¬z%ãï;V¡ÌL(ø$ë¡ëÌùç_í¹ßÝLoËßM j¨ôYËÛ«GØìïQ1ÏUã¶9#¼®0#´)ûøt¢õaS°pW?¯Æ^fç?'@Õ[ff¿BoGÎ4ÓÝ;b2OV¤«âñqþ¸ÊEô ip»¦te<ªà?2]0] ÄåÐÂj]Ê_sYRQPwèpÀ"¼´|â)!ÐvÊ´´Í²Þ5TLÑ˲þ @񵒦 A0Æciz;:ÿÿW}T5UÓ(ØÓM¢H¹@¼»³·½ ]>³?óÀ®³yßP_:ºJ¶uàÉT·ËZHzr¯,4±ÜïJwÌA5°YHXC£ÉfiÉÀ.dËH²Àhÿ×Õg[´G± 5µÏçïG`òqü÷×Ç4_/1$âVóZEðâ8g%1ѲWjÎsä½tÈqá})¨¸áØ«^DéYO?ÉX»h.±ã/ñ¤ÅPcÄÀ¨<V¡*ç| åÈndÊõzÉ?¸µÊOÊZû 4L¶òB5»jæ Qz >Cq·Än;å8ÄÉz<=ô»R=?Ïâ¥%ò5Eëú#å+æ½ÓWË 8䦡dvHÅÃ'Öº4jafçÛÓnË69¿ZþÚ 7w³ÆÄuöY*iµM,!áúxï?}¿wS÷jZÕý?±ÃÝÙ<´FÎÔäN\¬[¬ó^Þ «R¾e|$qjò˽¡¼{¥ ¦¶Eåªûfnõkf¸3ú\àrnYDF=²á ¶*òPÝÄuwv>C+PDKkLÓà"++Ãj$2Ì]ÆêÕÔÈUòÚêÞ¸¾%]CPÿ¤3Zn¢(H$à8L^úÔßèÿIÛi3tL`@¸÷È?ÀÀ iwµçÞµ?¾ãn!ÛpêUogsc)º¢tÓ:5²a#` £=°ªÀ(póØULAºÌ*ήf§vʨwP¥$¦f@e%RúaJ¥¤Ùñ~äK=y@5}Ñó.YÁÚYÈÓÂ7ú1×Ãν;ýFN÷X.w¯uýXûÚ),ZÛ'W©Öcð©-ûiµuè¨Ø£^nÓmSV©4dûùS¹ÿmTÐY²ËtôA['`Ó¤ÎËÈ@çz Ñé°»<½··¯eñï¿n`4ueׯyÒXû"{óÕÆEÊA{µ´Y"µÆU æYÑXl®®ZþÞöà¹üÂ^úcÕTÕSÛ¼ß^Î*nÛók{z>5g<:÷FÛüoùоÞcWåý:ü£ê°û¦ë~ÿúù±L5^ýã騶 âÓgßýùXhV¡ýß 9«0ìйº(Z¾=¿½ègX(.IY±i£$oC¯q9 A¥¥L7%¹EÊ};S¨ï Ìv\Å£BA#ô÷DêD£µöñ%¹rPW4]̦¦ÈÀïoë@aÃäFÊþ©¿ÎÃú_ UÕRòrvgõeÖëÝñì^\¢ÁÍC¨@OZ¸ÞÁØÃ|×qt´,` ¬FoC¢<J¾?h7Ã[VÊàD{bý|1Ë_¥ ¨¤º»ÌÿS´*Ù"æÖ*=E!n¼ÈNg'Ncr¢ÐÄÝ ÅªùF1O2=`2ãÀ,çñíÉìcÔ Õ¹¹Þ¯Íçm Ð¥D¨Je#oN9 ,òsYdÄà üÈ P0bÙ A\¦Û¦ÓË®ÄËU¡Î1V¾-çï5¹X®Îà¥ÎÔÆ)ì:ïëõvùºþ}{ûýúc¢;=ݾ=Âå¾äDczîikZ:)nã_5B¯íæf@"SHÃc qfßôí¦Î»¢þ/çzPðò¹(g®Ë%Ç-Þ>¿ËfÚVSs£Ro)E®Fì Ù=ÉùAQ®3l~HؼþÙh%h¯*¤j9£³û³+ðT³êPidÄ ³ÅAúJ`h·X"7À¡~_]A¶_½áfÍÎk7UC*Y ý>@ãSöËÃÆµf$èݩڤqçר1='¿ÊÜBW]6׸öWEL.êê¼Oüiqön=sÛ ¼ÑwuAöÃõ>¤ñ<;ÃÇîíø~xy± Àm§]-¯Å*ÞJlâí=÷ü^>t=áÛiºS;Ò:ïÊèЩK¥Eô]°+)Û C^få»Ñ¯u@§¬Úõå>¦Sý»UÀÛÈ_Óõ¢/·÷8ò@Qq÷]ÛÛåø(¤1O¿çNKÐÿþ1|8XÑ[Õ¨8Ö¡poÍ2HtÍd¥ÍÐ& oÎ d¦3ÅNS7ákQplSÛ.-÷ÞRã>d£ÖUÏÿDÀ T¤ÈP³Qà:wrHJ®?Ú,Ê;p3cÙëÂae¬(DþýiLZíoÁçã|h^¯$üyÎqÿ{(³têÃ@öêÊa%è]m¢ÐÑÎ ¶³· åQ¿P4P³²\-p<}Ñe»Ü0Ópî~|CzNLsÉé£Ú>Î ð¾¢L#ÌÐ"|¡ ®ß¦îq1سÆd}yÃ0²Í õ¶OH®µ(bίñ~¿©â §OÔ¢ý*xMäueiÂ^GÒn<à Ïz ²ÅR[]úÿ,@ë/{)0ÍS2gTuÙ t+õr]:l.Z'ÄÑÒç¶5Ü.®ÏQ_Ù Qæá½Y÷Ó<§èîpÜÇóY(¨ó(M"«.Fhãe~®Æ ß%¤ÐbtZhÏ´M¿öy-urlª\4jÂH8oñrÇUùB²¹N¢á®ÒdsºÆ÷ÖTµÀi,0un½qÂP ¬I7WEJ+õÿÿ®<Dmì*âjî|ÎKVû9ñS»þÆ@èéÎêL Ln³åÛKôÈNÈ¥-zTP¹¦"#_±Ïèf %ôßsIKG$&p íÅá¢åIXêãFãÒ§%"Ëü7½8-9Ñ7Õ÷g$Cì ÷øû<$ZFºnYétì´ÊÆ ]ÅX5dÏî)v§/ù>7Oì*Áñzµ¶ÏùlG ²9á´ÔÚ¥ËåïEÐÄóJ*vm0Q¦¬Ó ³ËÝÚu_ç+æþ¬¬mÿ¨iĦH°iÎÐúk§ÒÀô·ÜÅú*fwU!4·]»Ô°c½ïÓà«e+m8¶goÈÍÀyP¹¥éXLyDrB&Ø¡é=N®9|é\¶Rst§SUy³ÅÎÉü-EhS½½)[Cü&æÝöµhøÔ?¬ÇJôÓë÷¸q$2àíãíÏë{qÞÏ»»mw_\æÕïÚsBVV Ò#¢¬&ÛTvoÚ_|VÒ åÎ# ¸ÁÝdEưÉè¸ÈÎ*Ùqª~é* (B·â{ö C³°àYô_ ÙGlVåüÙ æÿrPRLCíÅ,/QU3µÇÈò¥;ý,)äªó%b,üW¬ëPL ¦9\4ªGÚá ÂE0;s?¯<UÂQV¶Àg>ÝÈ~u*x©·x«úV.ËvUðÒ1gâ§îN»zÕ75öí÷%y XÏSËn~;äiº¯ÕÍZ$Cåm,ðR$ 1*ãµÙsøÉFxÁ7ZÿDðmK¦êh°¹¡l<©ÒH^-«ÄÃcö¢¿ÒjNDFä> $¤5J*Â?Àbu7Z#ÚbY©ÚêLÓÌ. é\vÝ¡(1Ø@î£o©ÒvÞ_éÿ«¶·jIÂÛ¤{9Y1ÇÛxµí·¯_&3Ã$!;ÃÀOìXh´#Ð/£w¶g ú4'ø½é"^sÕ[Ǧ[â qM¡°RÀyYÕ+¦½Êay$û»ÍàÐnHçÒ4ðÙl®RáªDÐÉÌå|9÷Ý6Ób$£0E<§oj{Ê7=oD#³Ö®Ñ¬Ð m?¼x!ÕqDô5ÉÞfäé)+®d¿v¢÷h å3©÷JuN3`+¦íï¿Ó2N1×»0n¡Ø^Oó0ö¾þôÎïË:ÎN*wÝéÚÿ¦>j¾Æy8ÿùõý÷e:ç1x<E Åt\VOlkN_ds¯I¨IO¯öé´GîuXHAé]Û4 ,lxmD´$²|>hÃAåÖ´o>\X[hîº&¥~|ëI ÌAa ó\6k×ÿèÛ@&©TÆ.DdeDÔ½a¡Ýb*LYÐb¬ÿz:¾¼|~z~®Û#϶¬TyüÁCǸAüg5½0Y9/#M>°n£n 'U%SEî}¨¯| ùyËý\Á<$*Ä ¥øuØ+Væã¬ñIÜI²èzdf°Q×Y"cw»1Ë0q©L.ÂI$væÊ%ÄX(àà6x ãx'4¥Ê'ݩƫ«E&k!51þ×jn;B)cmâ¨õLVÜl3å}Úd´y2-Ç8ÓåÜãâk¿ÜÌCÙö·É0zV-9¨cPK©í:÷Ódl¹ a)ûÀ«Ól5±¬Vn¼ñF ÿ´ìGSûÓå_þS(NÅâÇÚÉöa(E½*}z|Þù¼¸(ÄöÒ5ï_Ãñ:kÝ*9óéË#ëDYWþV¹õë÷©tîÉßÈ,Fir$ *Iú¸¤f#`Z0 ·µÀßÍÍá3Îàå;Àî2_cß>v#3ÙûwÍì¾ÕæÛñyß4ðGC×½~ü<ýn35^q_ÆcªÉ$ß-³NCæq¹ÿDÖKQªâ¦TÞ{òós }\ÙdS|ËòÑ{W!áò Ì}¬Lm×1ÁÍ;ªê¸k·ÏÃõ|ÇæâiÆ©p ÇeÖ1UÝzDo ©ÈÊfëÍ#?)æ)o7ÝUaJÙÀCöÌdçõãÆ1@XRȪpÛ÷xËl'á´þP+¡gþ¡'º Õâ²BÁ¯_øSÃÝ;w08 â¸(pQZ(\JtÖ!`¬ÌÜC"Þ·QÇô9áÌnLV×[ýl£,+uwɶǦñ0uè멽Ò*´^àH+k«Ú¿¼¾>UU鬯hä0|±NÖ´¢ø¶rÞÒOð¸qÅÞ5ªRòÅ2qØãĶ£Ú{kèøm&}w×kë\Í Ó»;%¯©ìuh÷mÌÖ¹¹¯Mwõd¦ü{¿ûxßï®ôNÍy?,6ÈeÁA´áfË)¶.'«¡Þ><n³1tÈã»"üëx Ésx)J46å\R9HºCFÆùFnèbpívý¦Òfæð#j);gIñ h8%(~@èANò# ¹ÈjqlÉvòT3 pÌy^¼U8]ì½ôqÒ9¤ÄÖgÙd,2I)n%¦}æ|4B&jGRrN¡ÝïmÛ/ yá£{¯7÷ó ïPZC»ÈÛ¿u®km2¹<³MÛ îY¹µ/ü?eàí)çãÑÐÃÛ5ÍZÙ_XcÓm&Ád¼Z1½çöª¸yòþþs9WWuºÁ~csËá¾Jïw+8¹~~´ÝŪà,¡éÎ Ò ºéN·°«ÊYÃ0GÈØÅ²Þ'å§z ÀÓµì4AÇÄ;UR ½ÿÿCH\ ¤ÍËnÂ̦j/C£x³;ûY9;aT/aE5#R?ÓÏÜÞqN'Ñríµ>W å)w.¬6 ò¶¨)ÃÝ Ü ¾°ö2©A-HÖO RÔÀ˽(Aj¼*ÿ¨ÒÿNiVSÝgã yà¡;A5SWºå,ùB°d#¡ZfYl\-d¾¼¿ØtdúáyçtÎÑÎV x[¨d;¡ÑÀ[Zr> ų4£ó2](ýêån</rýQ"íH ²Z9§\ ÕVk§ÑÄÁGz;é\ pÖPbÏ¡I}B©^`ØiBKg;{.µg\Lh~}8Tu6ª b#© ¾p¿ÈÊ1lP]÷ð¬®J^¯æËÂö]õlÅ4-.lùcHôÊ®óÙ|éÙÞey~÷$ÝWåþkd]5Þûã Ä´´ADûë7£eòWø -GWlªüôc1Ll]fXçJhj 5ïõ¶YßÌ#Ê %RA'Rê¢nÊ¢b2µ¢û¤´Ñ®hO 6äÛ~rMR¦S]¶¿]G×^5%鼯#®×@®Z¦Aà 1 ý\ð£rå;üGãñÝßflûñQÒ²gûçëSëÏ_M7ä}ïìOJzûâo¸Çêö-â²»ft.óoÙ>òÌ.¿/9«¾cd?»ö¾e&ÃÍóHÀÖ¡Äpý-µ56 3-§·âçOÕ^ÓÛåú2;CêÅ]lS[w©(1ý1ë ÂÎöÆ[QÚdLf¼ÎÊ]ÄH½@àW%=%µésUA±¢mE,ÔTfýysnë0,+VSb?¾ÐÙÙ íScÝ)ö#M¤mó\Ïo¦oLdÊÚ´úöÂÂûy¢xÿ¾×iÎ].ñ~ë³®9¼¾ëxQùøytè]Ú¹õÌRä7øêÕ Æ#ÒÈSí/]£)§z» Ûë7-ûso¬ö ý2ÌÞu×SÛ¦±(wMËyÇŤ00Ây$æ)ÑYËðyÃ)CZøènÛãÆ]ÇnÞé »1ØÆfá}Âæû\aµ´Ï_îd©ìIÅ&j0°H^ûáÃ¨Ýøi}ÏÂL*¯À#˰0@£yU®Ü×úyÇÙL¨ Ùn¤C!2AÜ×ôÊ9*þOKT]ñ8H6AøhàÒ¹A¡\äáNRö×:++ nç0 Ùôn KPô+Â|Öù±XmÕAðñÚ¡&¢ók£Náô! ã ÂH%»¥c2ë273ܦµµ,^Î4«iSâPºû¥³Yr0 !l²|É%ïÿZ9ä§j/ !Ò»«0öhfzÔÝc+þ멳*¸ÔAk<>3ëÖuMPÂG}k¸ÛONlxQË2×XWìݸõÞ¤Z0 Ñ5=Æz4y§òO=øvÿ¹]?½5Ë6ã-ÞðnVæ¼2¥ÈöÏß,&Ë[k÷ihþ?p¦uý×qâ^|t¯Pú8Ã÷qÒj÷Òûþ§y¼ßpB°¶»ô9±¦hT\ÑÁE×Þ I6;ÆÑÃÁ4:ò¢h=kÎAZÞq-ÚIlé [f ´Üjå¡×¶*Ó[ÆÍ2¦L8yßw*|ÒÚp4ËñmfâÔ*'ûn`Üq@.Ëa2$þÐ%·LÏ+àÑûÄ98ômmxÊÖ Ür^¯}w,3°ZaVÃZ`(L§wÐÄ:²ñ¤)ïV¸KÊ¢Áa`wgøh «Öι³}ñcû´²4èä¥R[0{´ti&HPIÀ vªª_èÉ==HG£]aãP¤UW©Yê ®-kC?8 D´>Ø»2)p Æ{w¦^Kßg/NÆ)B?¡,È ÆïN²üb#jóP¡©]'Àg±ÕÛUWkøÊ¸½|!ÆÔ0È`Åoâ]âÕ3%kñ_VÛ6¬¦Ý§úJøaÚ¼¸k2×9)ÍX«ø}ìX³µî§ªiTváÿÿ éLwb Ã!áÔ÷¿ªjK8×v>ç7 ¬×öØã±mYÃØMÛ´1P:ú]£Jj©+nTeÃú'@V\ÿ}®Îô¦iÈ3f:wà»2$è¬/V¾°WТ6ªÇ)wñ,:ØWpnwûRò9.Eå*&yÖˡ̽m·+FÆ"Cª9Ãû©kG×v~ÊD[ÛÏ a[ÔtkÅì~=Ý>/Íù]Ä©ýZ<]N5ûÖÝÉì¥ß<íÆ:$ òÿ.¨ëR£äB)u õ´ìMpç< þiDÂ`Û¦ej8äcU4Êòp©`8ÉáZ\&Äu/ç{Æ/äãRtk=,ÅI]L?óIÈ6y¤E°zM®Ne¨$JàýØ*¦$Ƽ6Y§/[e³sÎ À°ªà±NÏP Ro%V/÷{?+¶à Ebn|ûM.F×ëËîPaVtMX!,g^úÇQ±ùMÙݾ˲öàÞnqÇpô°6gþÈ ¯I!Í(Ô¤ôÙ+Aóð1ô ÝÆë§\-Ê.,f_cA:ÍÐÐõBEÀ:fÏ__6UAæÿÀÒµm)1(·Ò¢îúÿ¿¸g]µ@¾úÒªÌ%±¸è ¸,oèIùìÔ¢.JÊÃÁñvÉ»÷tXY·UvÍ»q.«Z~·áòEïK1=ïÌIMÅÑ5ÉT9Ï6Ce^ñ¬<(²uÚûÊkåºb+~ZÅhÌÎ 0drÚùÔÝÊ -b)\ÊÓü=ÆùwqYÕ{5^/ `KãÜ/ýêy2/i#¶t¯2çp8/ø2nó}Þ÷\fÄ"íy2($$WÓ1,gÕ¬¼"Oa¢nU`ø Q8GêZéÎáÖ[:ÞÛVv8;Û´ou÷¿ O"ðò(êz ÊB)Ð'$z{ëØõ£¬¿3BÜX O ×b)°701¤ðÀÀ?A´ÉÝ¥ãC¤6A0÷jh6Ò>Û XsôbåàñÏçã(Ú$ð'ªÎ°&èÁÏ¥ýûë¨7 ü>jcÒþ£sª7ÑÔæl}à]FÄ"çiö·hJ^K½¿¸Ê$½%îcÕgµ.]¸Lè7Û÷ÏÑ£EèyK˽ø¢@- FND0ÐWNY¸üµmª DÇ¿ÎÜS)_]ÕKÕimöñã2ôa+ð×úÜæULèxLØý:?q¦[ÆcÀ ¸~+qU¶öM¨z \7wcs¹Õ±a¶sË÷ÿÁìËÅûû3°>þW-Áfq]ISRpHG ç×Óø/f¦çS¡·nQDOl©¾DÈîyÁð¶MgýªÈQa²³aÔ õv\FToî¼´"f¥,MM±åÅX ¸r aäj× ¢ß ·*O4¢ùîl~¶±äu?ØÌui(sgY©6eKxZ¸qáåWaeB5j{0y§ >táíëîÎc U%×jØuÏáSt{[ØuÔuÖZÛÞá/e:DAÉ×fÎÆÄ_c¶K`¥.l=À° -G±/f Lê=®nÙkgª&hYðÕIu¡"#RWÅzËåÿ°tn¹ ÃPâÄI RU©¨ÔutÿKÑæåÄî9n pü¹;Ó|}~síMN¶|O}G¬¨K½S`ÒÖuÝj @'××wSÀ[¼êÒ íÈì+Û<ë?Ò2ò hüf°CÅf<ö¨pzw/lGVÀ@"k{Õkþx1N1ãÐò´¤iÛLÉó ÎÜ]1¶ÉFáÿð^Å*ÚpýâtXîSy®¹í_âXTpÊrÍÅI·¡_ùÑ?7GF½ïbÝá ,¬1{KÚDôõaåȶjÍ·ØU»VÛMw3{dJÙVSì`ÐÓ´ÉÊuRÄ«^ÒL¤[Ϭr 5õ×'¶1M17Ehkª£ªª÷XL_/=GÒPKìãþP~¶QJ§o/X¸ìAgíñ\f¥ÒÙzR< ¢çb¤bÖV¯O@@VrùwY&ÝÔbB°{ÏѳkÆxAS] õv'êzÚuØZAâ;o0ea7VÆþ½b(£j¿°t× 0¶!$vÒNÒ_¥û¯×:Äl ÷© ± BÒ éÎ}~(,+eWÏ]éoëàô0OÆÔ?±c½g@,mOëòÝÒúÚ^â ÀÙZ,@#¡}ÅP¤É¹#_ùÌdg9_«P05310jùÆÑ<¼+¬>ðË:.Hÿ\ú<¦·woøåy_CÀ-?c©»µ½Ñ»öGIMµÌ¼Æ%FåÿÝÃF kuÝÜ¥Ó·+Ñ´æEJp\AÃ#Öv"ßjCØóÔ¯þÜdEqø_Ê1¯ýb<z·Ò¡ ?)ur¬eCÕAf|¨.*co O¦@0 mùÉèzäÒ`Éó3²÷Ì8){)0PãëØ']Ô³ÐéË0ÁpHâäÄàézè`=x°ü¥$s~Ñ GË Ê|k¥?îª gmTÉÊ'¥YÓ~A#æ.[K+OílÍQU:÷"ßpNèvZÂú7p PßöÆÃmø Ý*ã\Áù¼Ï¡è*:½°¬Ë{ëõs7k')¤AÀë´kÜQãéeTÂK<ÝAN©×#ÍÓ3µvr¿ðtn»Â@eðHÄK)ÊÿÞn²+1`HÎj_æa4£¹Øî®rWw ÅqÉW¢õÄ[ ª¹M_´ ±^y4ì Éw_[q`¤Å82űvGåÎi&LÐ::Ù~×ú¥ øð&`äòU2¢uüßÖÜðÓdT½b¦ä¯Oº&¨sïìÔ¦±nÎ.÷Ö?+¨Z¹½ÚæpdðX)Ä4=ûAÿÙ¦+ªV+Ìõ0C ¹ì³ðOß*O+ycà¸& [8Õ?Fk[Ôd´IÙ,°½]LÀÄVm2²Ú]ÉZh#ã½/ýbK:bFï»`«-Ñ]8Úøùe^-EDKßLDuwÀZ xhè:4k?1Öývjò¸Ïú ÷];y^Áq)à 5ñàñBïõxUÑÙæ£Ô"Å &æmPäÆRáaâRçcì´b0ÚOZ>ìióvÿ¾¯µ Ê÷Wsoñ¾<SqbaX:ï»öýññÖ¶"IsK8©qõh{ÿkMý鱯k¸Ä&ëzzBsôê xvckÝo¸³î)h£Ñì~zDËI$8(Ï»iSz¶îûø- ±rjÒ>+)aLÞm^M )ÍdO#=ÄyDóþD[<õFFvìÈÅSÑC|6pá"Þ<ùe§Wå±MÙ#,é¤m¾Ëk¹c¯µGеp:_8¤ìl½ñ¶°Öäm{Ú¸>bÉHò¯Cx¥~÷¨3N=,G ºçn·¬PoNÚ®TXüãð:3I@< ESlG5Å7½9".K¦Â+âÄPÉu:à÷!µHOv-+×6ÜwhHJ µy¦® [ÈOm©c,ÕdEØãµÌ3ºRáøó¿èF)ýnÛº^/ëGØ}DK)dp§·QôÆì6/Ü\°>ªÄ!®«Óa)ÑÚ.ÃÆ]mè3ed¦ [J(%.WÎö˳ÒNZRô ~Ô¾è !e)Ó÷ é3»±dAWNÐæ±¡¹-øóçûÇí¢äwÙâSÀ¬zµ ÚuÃ(>õ°àr§Uj3\ÎÑ#ÊOÂÆôÜéM¿SdB$kqNÍð¼ìYË:¸%¦9WN!*¨u²þy(-:«ÏÙB¶!!«e¶ù¾¯CîølwmXÜåªôW}4»"h´1ôò:iÊßµIô¦tAþ@ ëÒÁiÎïMð}6ÒôÇ N?ì+Ðñìk+¦Ç¡6mjþ±sðÁKñv¿mÐEtæJld «t`Ó2HLV×R³EÔð6²z¶3ÌHbúpfw¸"H%?æ+²(8 g5#L Êf*Ç|¶|öQ²4ÉÚ§õ÷âïo¯×Û~3Áv¥¥ùBÒL¢bµíÿºÔÒÈ>Ï9ɨÚâ·%ËúuÊVú¬y ö"b _°t6K Ã0ãüµÓ2\ÂGÞ÷ ql'µÃ~^zèLÓÚi%´þýí ¦ý^»J6ß[ 2ÉØ"YPèàp5x¡Ê¢lg°Róf6kQùÐÑ¥ê¾kÞ#.c èã=B|ÔÀA©¨Ó ï²0ëo OçÓ¶'íÖùçºtð @Ò¹$5AÔÉrb bãâÜ[pÿ[@ü#lú)ËìT<Ó=n÷ùñ~jN± ëÆ¼Øç!Ú{*Xå¢DfçpÐWÊOCÐI)L¯Ya$ðR[eÒ¹BWüÌ9ÆTDÜEbé¦h'ê@|iúª¥Ê 3bî Íhó×î*î;JsK/6WzÝ®xÁöÞ@igÛ/X¨ÑºÎwu»o/çóñøó÷=5ûúüÖ\+Ô¦d[ ¥;]âÕå¨%P-LÎVnI ° ýIxWoit±HL(C¯|b³Þ!²2 [߯Á©¡ïÖØ6yª kiýÚ FW["ÊW褨ÿjûËô~éå3Òô u8qÇfàoÃ1ʤÙìaÇoÃeZ qí4¥4- aÒRaÔ {ºëÚa>Lþ évÛ L)n¢È%ÿèôÿOE$(bJIQTæ/|aj¹3KîÎø?¿ßñt2Ó*ÃwTrÀ*N#Õ"êW65®`OEö /pêÍç·Ì´]éu¥<@µq*âLõÞ:ùkG8]Ý.ð½[¦<- Àéü8ÙÕ¯ ¢O8Vrú´Ý¶t¹¤r]Ä~â8Yí±kôÓó [¤ùÜæÏcü9uôóv®`ä@Qo_ Z-mYå®HíÃè½²ã¯ð8 3erO7®z}÷Â9/^¬W%rpíebvvêËtÉëú[Jæ0°æyýÿùùßosõ¹G9%Rø* ]»ßqðR|FzC-º¼¯éýòññ÷¹Nmö¥_^~½NÓ(¹¢®£ü.k;¹c¬é²b[ÏÚÝײ:(åôÖóÃ9 NÐçz=D8ê~©ÐhÑ*^Äлàù<ØY$þE( 7úz8ñÖrVF[̨17%r2{f DÐBnz¢Ù_QPߪ¸S3Àîá¾Y<úp£zã¡U<âÀhª0¦(¬«áæMWñC=¢ÙÕvÖï)ÈçW¨]ßt.é AÇðÆF Ù$û ÇÈýMÀÀ@êܹ ªéîªèëóãV^6¿#ÑJÅÁjNexõ'U,ÇN/α+bP%4âͶ.`Ô Ü9F×ÚrL"Û¬½²ÜîíOöN3´f Ê»´«c ÑÀ00#ÏTca´-8wõÚ¤J"´ `ajÑ*Âs. pàû13¯âÕµ¢½¶»¥B¡;ZCEdòÐ ?[(ePo P2º§ñÞ|bÃrÅLÞñmx0s*zµâzâ^)Í.tèA§Þ.=âPeɺ6Aª(Ú8?¢¤½(Î ç²nëss>Ú·öÔ¦ûZøT=ðAj{ßë|½^¾ú®W^I«b×¶ûã騯~MY¸îéõýp~©*KJzõE¬ ¡wçº_¢è²ÒßÅÈÿ®»R²Û$â`ÿDh"¹ò@O¨ØNáÖ VD_ *S «¡3²ï¬[h3åLßçÐ!õ< ÙS^eÆ ëÇË]dß+(¡ÅÐP£Ïâ%#Ü«fk;¤¾ÃÒ èÓÆx§tÚôÜhÅ*©óh%e)ãA/öøGѨhZÌÝ×qæ=.ª4&æì£E¬k¼ïìVLa®¶e½Dc]¡AD3«úwàMðvýÖÆTM jhÄC#;+Rgæ&3°tQ+fÍa¿;ÀÜ¢´á¤Í!X½IÙbäê'l²b¥¨® @§Cãyð[.qÛ¬0éI]VX¢%w>«áHȲ¶)@õ]ÜÃS|o?Xê(4¡_ºÝHÑ þ'àõc2 $ËòmÉÇÇö¹M>ÇK¥ênc wíëûÇÓóKôbqm{ùùêËK°ÐLvÙô8:ÏX·]¥CpÁ1aÑìÃÜýξLÙ© ª»²@?ZFä?ïG¯¢(ðøH·ú~¯Ýݱ.`N.âĪvc"Í]Ü(/1Cc®+íÛhÐI8èf?ôØkÂù&±T .CMñC:R!0çÑtpenæI)tC¡hÛ®pÉxÆÁx Óæ[Ï(5fI{&k¸Â\òÆñ Ò%éïuñjÎ-DÜMqºï.íqoÕ¾{)$LÅ#¬{PÙs«Vôιs¤ßú¯ºr`«ZûÝãqNh ¼özDÖ KO}êÉLiBF°¶j'ºkÑeë)BøEø(õÉa?ÚG®oÛxçoßÜæ§Öt·×Wx;Ñ¢é[ñÅwðM¾ø6çéçï_Y¨R}ÑCi©_ßGiÄQC½´RªÚ5lèÐl(µRüçö¾ìcn/Hu¡ðS'9°º·Y 44ë£Ïª}¬½LæîµÏÚÚäF×´]±/J8K°ôeëpZ¦Ñ\mÇsæÁQºôÒuùlÔ*|ìë õW¡õÓ9Ûo|עʥI^U ÌÌûW CVÈ]31å\åXb©:J" ß\ÓÈ þÙDzz%Ær«ÁÉ^'#ö[ÔàOÂdìcûà=QXW¤N÷òS.Ϲ?¶§ÓÛ»¥bF{O¯ ÷|ûúø#õj;M¬)Éö3uÇ,këQ ÅT0R×}{¯ÛâH3NG½vt:mËᨠÈÓôºpêS[/¯mhÇ+«ÖÛ^Ð]Ð]c0yÖ÷ÏM{5bÌébÈD#}ïR¼@äö8m°§2ÙöþÇ`þ¾5ݲbÑڵŤqé!]Ì]}ÐóY9#õZú/ÿ=Ó÷C·¦ävª¼ãéu®ãK9Àt õfbàsURÈ-}ÇøDQûuû¸ä}ÒXµd-TÕyó.û`îàép³âàH³[ÝAøÕý¾æ¾$ð?%8£±é÷ÔØ`¦îƺoçd{]è®rk©Õz5yI Ç%ÝÍø0~\°kÃ[9zª¨øBÅ.8öUÔÍÆÑlµÜÝ LdU©ë.RCûìÊn¼±A©°R3}þ ÀÒ¹$É A$ÐÐöDÌ!¼õE|ÿ[xÂî@Bç+Ï®#:zÑBõÉ"+súõóªgw?ÈtÙZ»kjÜ#XÕÝ´?ÁÓêÞVÚ¯Á)XpdFøæ¡nåÎöd8Î3PJ9ööçÆÖÅÓܯ ôÍÕõGòzÁ7®´I½*%f@RÇþæ5<u=ÍdF;òLs¸7@kÞþ{~µÜ÷ ´Û«ãéÕ¸fRwâòÚ¢D'mlWEmÍÉwÉ|Äé ´â?Ðõ©Z{bÕ¥X39jÉ=eØêÙQÛe×õ$ØB¥1Ô^@)dH` ¬°@¢0 H¯ ¨F_N{Ýúc§[$-]̤x V´}P¾IÄÃ~0 ¸µ2#½,JfP¶'î¸èÇFÊÙòFÓUÉb"®7Í¡o´©$¬ ÝÞ¶¾_S;¹ÎaØë¼ó\áë'HzîNëéwDTPÒ)!Ö`PÆ`¿ î vw6#Î@á~|J-°kô6è"³·eÐÓæÎÇX¡Åê|dϸÆÜâ£-×*CÅ4ü4E2ö~T[ Ásð }>+û¦3In¡(S«lßÿrYfXdp ä?,¼°ËÅTZúªÿ: º×??[Â@ñ/éΪÉèWÒ÷Õ»:êõ½±òE*Wqfè¢lT`½~Õf µÉÇl>RL9̹Æ{\c¦ÆfW5eßÕ^°§]R)95º(tHm`PZN©óÏaé-{ÕBís >io÷ërZßï/¡n®M3Zq9QPßG[Iª§¤È»º¶:Þä`º+Ij<yx-ÐCªµ@¹!]³µep¦"jz 3ØæµÆµf:&|"¢çÝ(³(ÊÍÇZ8)*U;afÚ¶ör9L¿´Æ5¼à& ÓúNDÓ5FôkíE5ÞZ³;ú%r 3B üQ÷/ÝN×÷óYûÊ©kÉ9¥i¼[×7Zn(ð9¼×.ñj±1F\ë_%1!À|Ê[ßñr½.4«µnJä:}ôH£~°¬X3éoÈþé´äЫ³QRF´¯; d|ã 7$n&EïÞvd{Ú ¨ÐàÓÂ\QójDg Òp.5ê±èx ÀL)3.tù¥³Ùm°~(IiÐ&@N9öý¥¢§ [Ò«eÍ6ÒÜb9;«èÜxT;ÚêxTË8MÝÐpqÙpÞGp=l¥p:Z|á¬râ"ôÖrÐD .<%ÂñêÂLkB R fÛÑ4Ö×6H1VKÕjwÛÓdy0 CóÔv¦[câï´Áö¦Ð«Æ){ÆÔ@»JßC+¾×Üt¦`,U(~UY^M×kVß=æv¿r ׸º'¶¡id$Ë<CÞn çÿ`êlr(ù Ê"èªÞÿB=A¤`c÷}*u¡ í« Óf¼A´é{'ÌÚý¼J'-;Z4-Ò dxÃysUÝê~© KxÐoìXýÑöÜæÜ¿ Ô13§{2 ÆEZdU'WY<0U`ÐòyRÞ£Gü-,þTAͦ/ñK½~`élÁ òM03N{ðÿÿ²ZÇ:¶Jb twíÍCc°/Ï2<~#´±"K¥Îmà®I;oÉà5âaéø-i³Ï®.áÕ®{<ĵª:£ÔbR _Í4A4ÎQÕÒ(9Ô]ËÀ`p/ï][[âk¸wETKOL;§R²1kª:ÅÎlÜüýÔÇã3ôjÝ5¿\"Ø= <á·ªaxº²/yjѤyF;!c*n¾ÇPÜHC¨L[Á¸ÐźÞJs5~* 7¹Ò¹¡SÈÜrY×xúÄðºâãÇðÌÓf`õÿîsáÍlt(ý=ïÃ`½zOÅÈ«ÏÞO÷J3+aÛðtõpÀüüºûïË´ßf¯ðHHß?ZcbyÑ£-ç·ÝfyAGÙlxéðÌ,ñO¢ ØaîCfKJÖ$°5*uQò3Êm[¢! :Û£ã°T*è(£Øâ+©á·:÷4È,/ä¤$¸ £©yT* NŦãr®ÁT·dÖ+1£ÈZNãÍÓÙ¤t&×dñÚ¸©Vg) Øg»rrÑã cÑ' §ç`aeÃVg &t× 1È\,GP§ g3íE¡ÜpXTÍ{oeÝ Ïñ 03vßß©ºÝî´P:`ógt?ôÓ0y3Àw¬öÊRãÉî ø¦%tGáâÑKlÙ-~ÎËñh)®$É>ìo|¦ÉK"y7¬8yY ìÀ±V6u\Ýãk¼Uϵn²P©M/üM^Ö®¶,tç|äԷ̦[ãÕéM iHóÝõ½õæþNËEÛÕå¦1Ö«îÙ5 ûÛ§lØq2ØÏ% !¼)£²ù0WWYÍeÈó*3U(il½p¾XÌ4Î;§t$õ»vÄiÊî ï*Lj öêÍ©*'N ³ÛãÔJY(Bë´)ÚÔUhüØÈ£¸>%aÕIï_sÍÓS l{EXI-Ò)Ø×)Û%n¦hægéìI6ADj¹Qí$ÏÉçr:b.Fcú ÑR®í06¡±K~nÛê²nr%6Ú®·K³oïÖ=y~QÆÍËÏE2ý=Å(o0G]ÝÙ ç~VêW,dè¨XÒÚÜ@ME¦Xç¶7È|)ñùWb'RÁZ\+5g4iòj:Îê뻿«)¦ÞM~ §ÒÀòÞ¶1@¤ÿº.ÌÔÂФ2ÒhþÿzjÈ¢e-º%I½\ïnjØÒ\kÌ£íe! ]× ÀÕ¹,'ÃP4NcâP²¤ôÿ¿¬3]tÉ@{Òé¢V/Y²¯ÎEuÍ6uUr:LaXêúPgDdóÔ®Oml0B¨vl5ËÚ@+5yZÕÁïÚj<GÎöѽ¤òµ¶½o¤R Çl|»k23̾å]õ]7%÷Ò.«ó »Vq*ôKÉ·Ö÷·cÐ`®+¯çôýL®MJ¹Æ¹V¾Ó§Ëå{áÜÒíllV$¨w¥Ñ21N¤nåVmzLnêpQÖ =©SÛoPµÐZM0ïþv^ÊÅ \Ä>½,£ëÝ·FøY¾ËxqðX<S%GG¬*»¤b{uþ³ M>Ô` ÔS?ש ö×äÇË´X:%ab0KT&ÿÿù¹fƱ§È-T¥ÔmIÝ uħv½²Vb:ÀFµfm-_ñ¯ýxxÑÚ¨¶Ú£ü©*Áàûá¡I>\лéõ%{\bD¹Cl»øPVSã1ñ¹d&ö\{bŦ³þ L/þOÌëbÐ'|ãúÜð$6QzàÖí¯~¤ïý°ÇÎ2CsèùfCÐzBªÓÔΧéíºyÍ%slªbbÍ4ETÕW¦p\êáz×[fýh´ )Jt¦Ì»Ds¤z¶Oæ\~ªêH^À©Oéͬ2pèÂQSØÄÍÛf¾rwæí!ýjuå¤bÌøã_jüIìë;pO«)K§ApÕHwT°mÄñ_ á¼-s}±!F¯Ì9XGÒêcN ¤UEÁ:à ¶þ"ÿp·¢K²>Á zÆÎ 2ã3öJÈèÊò Yù,Ï]×.JdïaîR¥à4äù¥¾=·ü½òV&ÚS´Ú¹CuèÌ×A!"ô(Ò Mno4_àðc0Tãù=8!z«:òú;}VÂþÖ£;eβ<Ý÷ æú97Øè«U[J뢰֤HÿÝîMÛÐîºóM $¤¥SP̽½ëv»?<º%ìB<ý:©*áõ¡¯9Më×.ÝÜÍÀÊÉ ð~5M¥m!÷ÓÌT¬´S¼×mW£VjoøÓ/Q,ãaò²ÑúIg;¾0Æ©ÆÚç©Ú³vú÷&À0=N Tí¾*Sú$HÌäðô3/dÐómxÇÅ«zÿ`é\°¡ ª¢MÚ¦§û_d©û äAÞo¸ÔR¸Ê¯!C;^ÓcDô(j7;¦Þ] ÏÉ õ·iõèc(axRdNèsKc`§¶Å¼¢¹góä³y´¡-ÿ³sí8ö¬=,cPpÈÇúúðÔ;N{e¬¬ÞeNQCZî)=÷?¿·ÁºæÒsÚìz±\ûÝ7ÊUph°ã²øÉ ¥<tfv|øúmÙÚ¾ÖquË¢Îá¸RvÚ·)ÃÞCºú¨Är Ôº¤ PåWÕÃD{?¹ÊêfDf`9"õ÷zK«2jeÁbªê1÷kÀ6¦;~î0*0?¥Ôv1\êÀl7QË´n3aQÏøfn¦ÑFi¦l³¸6_®úa§ÿØ¢ëÎp¬OP3^3cÿº6»KµLà÷×Ƕ®÷b¥ #פ=Ý#þSQÜLÃPátmcÇ9ºC*0èÈüq=Þª7¥GÎ×YmfhêoÝ39&?.(lÇ6»Î°ú5Bg¦£¡_î/.ðÕëÚY9]ÁH:»äA Ê&ÖÊK#ä¹ÿ-6 ¤¿ñ]kYKaz¦Â÷×§@8NåS0Z¾£zh!ȼtxÌ}v8Ý8@°+ô(B,*U Y%%.°ë UâdõAç «CRÖp^?Ye6Y½q ¤ 3Ç®íðB^Z î=O:±i_$Hx'¢-åxþÄÞ½ÜoK=0íCDª¢½9ÑïO!ÃéZ¬_Ü-¶þmí^[Lhz~TQ·ÞWø.¾÷N;ò®Ê±ÀiÃ+Ð ½Â?ÛØËÝ¢ B`QÈD±@ÛéG%½àAs¸ëJcÐRUdµ íaä@Æ @E5¹ÛD/zSÞ ©å2cñS@Ю[2V±ÓàcBþ¶-±AD.á© cwØO»iÄr ²lþz¦Ó8AW~N§óIï·rg¥ßÇãçé½\RmÙÓó#${§© gÉn@´°ê÷IûèfWéëåÃÆ.rTöúAïNëýäPÁæ ÃD_ÉWÎ]Jyv ÅòëmA&V²úWÄZ¸C9&$öëÚ¢¢ÐË×G¾ÙÛX ßýÀÒ,¹ AÚüÿæ8,iûMR>øb\*£éééi£Ï~óp"ããé±ëáVÊ:""ÊõSN6?´)[`s¦^Os\ *`mVåE]ÖÛØF}V£²©ãvF¸ü'såawQ¸<ÁOuÌbûÒAÞÆ§øôeFæúq+:¯: !¢V\æ¯3çTö·uÿIi.ýá¡øtÏ?¿ÏgJã7E·é!g4ÅÔÛä=ÇÑ Ò(BU¼Ðú^¬ô0õfè©^Pe±ËÏqóº!äfqÒñP}(_ªÊèon·Þ·%FóÁQL¡QÑëÒSx/á]8(2cðÒiä¶Ç1¬4jósa";+GsµÉ4}+ù1ÔLÑä sª/kÁ>«;1¬ ·oºÎ"ìô÷aÕAa²©I/\qÕìý^¡©¯GòÉ``ãÑã£Ò*´¦\ÿ´´K R?d¿©Ç+l-^_/]§ÑÝkÍ(uÍÔ)lµÄiq=9 ÞØ:R0̰jeLã`KFÇëÛ|ò²2ßq.v[<+V7ÎQS®^ ¶çKiÑ`qX¿×Uâ QAÆ@Ò¹#'Atõ((:pè{øþGq$$fÝoRE ßn÷Ìlw7¿?ßÓ4 ¨[ +.ïé¹§¬/ ¬ 9æ×cÐ:Duͥʹ¾gâÙ9[̤ ;M©NÝ»Ù.@ç-åÝ~u=ûÝá~äJ1Rè® ¸ì âm¼ã©§Ô^§ëýo^Ë*ØÐ^òV ßQrÔO»>©b§\=»ÈP'¹¦A]ÊxÌùd..ßTG²¶·wÇc[åÜ ç3'ýêú<p:K/°èB×»YÜyÁD;ru0Ûo<T7nÃféWAýðÖÓXPÇ<ñbQz=¡61+Æ~ ·¨2 ~ÆG&IÑúéµ ów*å`ã×g>|Ì×ç¦')$&(e%e{õÐ!1Ñ»n~o¼BáTÅÑ¢W¸hU»hÍònxº¶[7¦¬\Ý#±=/ÂHÁÇ4CfÊÃTêÐë¢îèüpdR{3N¨ÜÔ YU±ua°lFíïï=îâàÛªçýv{éùµ°ÌN´¢ÿ`éìa Æn¡/½HïNÚFøýÔ¾gYÚ5Òîòùñ;¾gvÀª-*7ÊÙè£3[£Ç\9\.~ÂãD[ F/Ô,*XÂ'ÄÔÈ9~zsÆä]0*à¢9åþßñ|Ôs; üÿ!ÙBíN@Tg¨äà¶ìd% - Ê!Jêë½N~ùlöø*»¨èø¾×R¿í¡½¿ïdE Õ¼Mô\ML`F8×eúa'Z{CÀ×2O3Nq"¥b6zTØ.¥^vU¯¸ÝÒö8gCÒr°« ¯V ðêÛ98>½ c# qté B8óAU`în¿µ Û/$UrÌ2Z¬.ä³GQ%·Ò5%öÄ`¡ö¤s;n¢(¬ NùK!é¿ÌxÂä¥öuá÷çQ68zrzýü Ë!¤´êÑýé©¿] ý%ÃxA¥JÓSUçͪÑo£ûÁîNëd{g ¬r(ÎÓuZ¼]kuèÔ¼§yVüÉ`¡aJ ÑZ©LnRRÕÌ0Î~ø¾Þ?¿®·Ç]E¸(²loë®Uñg@׬N4Ì8Y¥µb-¬/K!´O,$áXÚÍ÷*¬º¬RÓòäCÓ#/0¥ßÆÖÇxºñ\ÈúÃZÆpb¸ßæ¬æåkÎ.ögK 9ä:Ò'óEñÔ¸¬¶Åg ¬Ã»OÉÕZ8¶",-l{h²Zª=ÿ8äÞ!¯¨çáBÎäÏí7¶'=)ÃÃÜ Ì&¨xÁTêkÇumrÆÑ·Ë<ëÛB'}9Ç;Ôâ$¹06Ë ½ ¿+lÂÐAê ¦¶!&zoÕÙN-¼ZNhhNÓkìe·X:·ìabüN»þv!Ýÿ2Úö©1;éàidifâÇûRW¨(¶ãÑYOÆGiNª@³¥¬»Ât<Í,`Ö{^úJ¡ÂF>×u Ý:ªÿ#Øuè7#NÀ1zEÙL-CnÈMáïTé3X7 ø£bÞÁU4 q>`F9VïY¨ÖuðÃðNAÛô²«¹<v]Q+R!P}w;pR¢üBw»\SHGSçÞ7ºc·%6î¨tA'BjÆÇKàìmDñÔÛjë_2eª²m£»<aåòLfÑl&ºòñRméÿ:y» N ©u+2*: c±°Z©²«Ú$K<d2,Ë&ªÕ.¸ëa|ÀÒ¹æDAÔu/àoâýbÄðæe}û{7l~Uûúüõ¯ *|6Í1@7Õ0Á*«XÞSÂ<ÒDT²ä+9 PX´8"F5ÖÀ΢Ð.àºt Od÷ìµM¦j¯À¦qþIp¼l²ÁÔ#Ógý]T®{(÷õ«,GQÔ_¤¡m% V¶¬IÿÜ¢¯3vÀÕ8·hý(ÅÃÇ8WÞ/°tnÙ Ã@MLÛ1°~v%Ýÿ68 6<íê]9!4céôõùÁ-=Ìÿ\ʺ´A£) Ì ®à3!§:_bÛ gAáÛѱuQ§èeð7¦I§ÎúxËùÀ6§³ÑîÀÂÆÞVd² nïPÀZz|IY:ÁÉ·T"N8Qü¾úCôËÊXãõ}KÁ%\ÏâÁâì¾ÚÍÃ8ÕðNæcrVrpSDchìEYäó{ÔA!áÖ"K6bf8U ò®NsöIZWs-PlT$·®¾àã tMµTNyÅð9DÔGvËï{V4îvþr=ÃóOºéz»ÖkncÚ{%_h6põ±|§i;x˸EK¢+ájÚx¤$ñ±SÊZ*aͧx=(ÚöÜ|¹»+ÁCI[¼GàÞ^Ü·³ªg$;Ýâ1Òph!k©ô4^N¡;ûmÂ6=½Xîqþ+v«\®ïðka\uïo§Ã±ß¢W '¯Qyíâj¯*ï¦àCg²uú÷&)~°S æ¬/iªÇ6 ¾{Ú¯`ůÙ)«·aZ÷n·8±YBÜ]K$ 8}H`E«Â÷ÀÐêzt,ùº«êߢ %Ôý âåÖìZ©¢m#¨¶³jm-î>ü,ø1¥eÝY1¤+Çm̾§ñÝGÊqDýSŶôVwE3²nÜÅjÆóÚµô¸M¼AqÅýOV¦Àg÷\Wå0WCMGÐ^¢ÿÖþ½-&ìY6mD¸ª( ¡v¹j)tV¼FÑGóob Cæ4rV¬foäBß¾ÿ°t&I Ã@-!S°æÜÿTQO²dÙü×f]Jº·þà¾>?ê]-Îäs{¶ÜqÒ*0à¶3@Dñ:nf(\@ÁU0ñ#u¡,m[Ï~Ãb2]h¨gaXXÕ¦gLq«ëç½ôÔxX6@6jM*; ±¹&Îé9,à ±mlÇ|°nmiÌÔýÇL$·ý @ÒÙ,7 AâÇN¼ëCÞÿÁv¯É!å@éO>úBîföÅ·Xï ®M¶g*޲ʧþÃUqKß*T³75NèHyÙØvÊ´È«xhèQXg·ÌY1(Zg·ÅéÎÒ¯=æ}ÐÀ)ÜÖî ÎÉGÕW:7-É ïaï§izý.Nýûð£_-Âä¤~¡Z( Û ë Z`qAèö¥Ð¦2m¬¬Íòó\4¥y0!bþé±ÑK¬ßÌ«KSïÃÎhn\r´AÂnýC2 `¾þ÷ß§×åÅë®·Z¿õã¶}$Â×3°§'g-B³XK_9UtÌë\lNÓVtGUÜ©4è@k_ëOP"íÏdXÓÌ^C`YÞÎ×NZ{üÔ1Û«hñïܤÊÞSu¿<¨ ÝYs*`FãáðÝúb»ñ¶ÐÿO !$!MRªÿÿ´TrHb;6bÓ2Ý/w ¤V¿Û]ÇîIBO8j»¥¤ÁÏè§M2Y¨Næ~°tÆ ¿v v`ßìc¤Ë3aTe-ÈFsýÔ\\ê\*ñ &|LÎÖO²5=2ÇZÃÔN"ä¢ÛËïŤãN.ôú÷Ï0½4ºr·ëÃkíN¼¤rRÔñÿï¸á;"ÀÃ}v)S¥Îió^; s85×kìáÅM£Ý5Ruª}ÍÚ/cTÕk/Öòl`ÛøüRGMs(¹ühÍÒ{`³8ÌÄRîLz÷ýë ÌÔ3õ¯ðb .f×ãç LuæÜ+S¢PØ|æX"h(A¦-3`]Ù[g)WŬÕi§IHú§]JBxBV¦3LvÖDçcÿMî<fx²ØóBú§¤uâäjë¼&H¡bvi[EÒ¦cW?ÇõY#0GUÿ`é¶ **ûÒsÚÿÿ½¦IάyÏQuöÊ*,¾æeH¨tLéÑÞýÌ ËMuX6¡Î±ýA÷g¦»igÎÊß}iË<ãH"^Msð¾ãM¦À´÷»é@ÓEdõ: Ç[ãHJU´r%ÿêÊúÖÈE/öøÉÝHdÐHÒMî6× ão§C´J£Fãç>yÃÃàI @kQÄ´:grÆù XÄaÊhÐDð¹ôX]o5ÞRMÌ ìrb¨ÿLúÈÚ¬(È#« 2Ül«7)@ºe׿ñr?y÷ÐUñ6ÿ|MãÔ÷¯/ïÝëÓÛbr@:ô®Wýâpá¡êÌ<Ês=G[Yâì^1v¨ÊÖIëÌ=A§ÄB#;Ñ+ÓlVÉcP7täìá@¬«Y÷o[bÖ¶gyôP¶ï0] ¢¨hI¤V>Kòªv¸ñõý þvóoe\¡[峦+ËDÝJÂ"ÌÁðîM¬kW]QïK[ÒÌû:O ïq3zy{|éûÏo©¦ú±K+éòv9fë¼Ié_GW4À£lÛÀÂx_ØA²Dòú0Ð;xcø¸æXøÁc*³ïdͬóò5°l£ÂAö AU,(IAªÒ3ëÞD;ÖVÉJö?y©i)PuG U²]®/l:É)¿xù¹D#¨Ù+¨Ä°·¹2¤%`j9eNdOÿGÖ&º«6avòòJøO Â@l¹dÛÝJ}ÿ×k¥jÓ ààÎçôg)rncæÌ(^aÓó%c3Í-ÍEhÃRäîyÈ´B$T°Ó/cÉÃsË5¥õEÐU®ÑL¸§):ü5 #fûãÁ åMõ¯~ÿJ·`Ì7¡¢¹¬¡y[~þx¿/}߯¦ ©ï²\Ø ³RÃ;ûp5º ܳfo36v×Qªã©cÊ®`ë»°tn¹ Â@µ Á<¢JÉgûÛý¯,iÞ3tl3wÆ3÷é ÷ßioÊÄ2p`¨[ê4x3¦aC-*´ ?11Zq.M.´µ3;ɸ 1Ê+Ý?£^è\\(¼ºAæw' ÆßúÑß®ß}axããï_·{Zì×û:¿X_»Gâ `áb×ί§þä+U}©óTHíÎÃaEÜ ³=¥Ü|R¢ÔùV Ç"ù~mBÓÞö0fѯ¤/ìq>øCinòÉ;ÐÊÐáNÖvNø ê±Ç¾DHa8Gûýºyóö63^7Jõc.òFéìý8¡@3/±$Ý©íÚL§EÁÌ ²vMßHàSÒHªM³ò¬ßíÌÝßJéø#¬Å£]Í ËêTév[Ýò³·k·½ BVfîìñÕØÉ>Ü!X]S|Q=_X½JëAFX>"å.ìjFó_æVçÿª§°øV®0vRófXºîþq£cÑZõÝçuàÛ1Ð h½pÏ_j3NKé,oL;[Â6þQª`"ÃDvíÚôY¨ÞmÛlhÜ#õC¿oV¥J1ý®Ì\n®XÎk?tÁ*H¥2Bkò'h³j¤OK÷0JZA ñëãù^7+*ÊqÈñ¢«8æç¬ ¢Beü;^ ¬:= tµTÇ(b=\ùTýµ^ ö|÷ã1¬F¤c"x'ؼ 5¡ÈÊ+¨]_¤Gúp³¶=êuñþ¼P× Î¸f8Gìe¸øÓõëÃÎy®LZ+²¡ý7®Ó4[êhÛÂ8c/7Ø/2¶¦s»ãU¦ù,1AÒ3©Û±ËÝMÄUL²+$]öª¿3±·j\<ªîÍÏc ±±j¼ÂØôéK`ÓÝpCS«¡·wÇnÀX»i}ãx¶(D¢\ß<¥wåÕ4OTªMBƤÛ=ç*GãAFemd$ADF@Ðí5móÜÂSÄ¥Gص9ß] i.wçG³æ½Y JÁ5f3\êª=¢þÍîgÔ äÙ4@¢û* )¯d©åµf2Ø3¿óï]¥Æ#j³ ÆdVsèÙùD¹¸u:s3QM» ÛM Ø ¨¿¯©á¶1é³Ë"1Úª¢M°Bs®+ÇÔ-OU¾Üuþ¼MdkaxÇû8Ìueϯo§7ÿôÞ÷=J ôp,ëJh !×Uªe1%w Í2§ÚËÏó2BÿxìvãËI +¨K-óS@âªm´ZÚD=ÏOrl"P\F&ÈNbqAáê1MqnõæÓÙX¤|ÃM°à%g#úª6zî%-0óX=}/Ñ-¦øäß_H:·Üa &qlÇô¡R(R×Ðï.¢ûßG[QHí$½gø ±'w<÷á¾>?ê$¸§éOØx$1>OBAê<~ªÝ9-x :²$ê¯ÖÙÑÃòqׯò¢6²üÏÓíû÷G@àZ/áx|?¼ÒËÞ{«6ÎÎxÃÔyÀtÂ{ÿå[yX©JiÝ># áõ|dxÞ¿Ò²xÇYÕ0=¦ma²1[¬mq}èr¡áä®Ogøîk¬é5ÇÓ|ë½¹Z:ü,W8Ó8cD«Å]ÿà& ¥qõuÐyUã¦s!´zS2ôÛàÁ¸è2gâN~$L¢@Ú\¬øyeTMW+MÔ´.á4K2 "jµ>õ6ã©5¨ùyУ$¨m6½ÁŤ~:*=cÃÁ8,[:[*soïlú ?Z4WX-_k»ÃI·#uF¨¯êA^Ucúà¢[ó¢jáÆÓDõ_Mxy*37 }N»ðôðy*-°0<áHèÈ%úfÃB¤*ÒÝX 5æy#ô»e]ÿö;$ÁiÒ ®y©ËÚlÿ°t.É Ã@Û²",²ÍErÿ$Uÿìô²cÆG3£é×îëóC¿ÿx<s3ÝûvÎeí0GÛvV3"1Ün OKãKê{Aè,hÙcÞàÞÉÉ6¶ á\2Y<°L§UµÊ]·×öÌÜ ÷ï¿ßÍèOÛ0Ï'}j9FQËÛ¢GâO(èZÓë2Ò±®txZÌoôâmh1¸ªD80,MnA%è¸Ú7Æí^*¡ïñDÞ׬ì I]°ã0ÚÞ*üH^héÚ5 2QIfàÔ(WYgK£IùmÐ9ÐöWÆÔ©R*8õ§Õi ôºÒ%¯Ç9N`¦ø#s «»saU%AápéByùÇ2A;ÕÇ`ÛÚ(NKdjº&SÒ7=£Þ\p6'ÊTÚЩ¡´TD1øe>tSïµL)¦{j]¢¨Jãz*6&%UÅc¸IqëN*$Æ!skUÔS 8|íMnƧf[³ãé¢ÙVT)?}|î1æ|ò¢Z=¾¼´þ¢®`ìöuHKºOÊg±?Jo¬Ñb·VvOãmþ^r%U]ì9Ù²¼Qµ}±«àêw§»Ïç}{[¯_ºoþüþåÞß9í®ªc¯e;Ôýõþu£CWÓ³5'.®âtb Â'«0m W&eôXzbþ ¥ªÊuÙ©¢òZ;á÷ITAݤ«ÎÁ¯Ü/U¦Ô> 6QV-Ôùw]s¿ÝÇëÄxÙÊè<oÁ6a7Gå ë4éÚÖwVjѶ£Ä ²òÃ=sÁо:[¶áßf¾x\< à=c¨oá©;_.æÊ±ÓßþÍi4ÅcÊ}ËúW»} ß®¼Ó¢ºGFìå¢n¸¡kÒáC U ìg.ËßM£ò01(c9©¤ ¥hèFÅ3ê:0ýÃÚ-L?¬Ëݦ5{ëy Á´ú¤w±0¢¸ém1>nXU ÞG¡j®ÂF,ÚªU·Â}VÒ ÍÒW_2FöÝLÿÀÒ%5AÔJØ I¨TÁøæÜÿmÙô8eiÔ-^oß^_F¿èYNdÛD§ÙDFvÑqÑtèõ²µtóçô]$ÜsJ9ì§ëóåñéx¾Ð£Xn¹|K)\äxx³P?ÎZ{£D 44þg"ôÞÖþ¨ý,¦«j¹ÊãÂ+PmæÍ4ÏÛ²Ö¦øÃA+#Ýíëã½&:CÇí$wJYåGõó|½H&î® >ÚT[ÖaÓð MH §n('¨ñÂu¯l¾6J,Y§Ïëüé´F¼6¨øÅ#+Æ]0ÙE÷r;6OkÂÃ÷£¾÷ä8mÑ¥9ÌÏàá-m H©m©Õ·Wâ]®k@è8²5Ú|½Ã[ +tQ÷Ë]ËÒæ#ðntB#µÍÁç½ mbÎuÏÿ`élÜ ¬ ݨüwmd´AÞÀËÑúHÞe£Ì»õKÚó¦è+Ô°¾¶¸oO > ^ö ôÀÍeve0$鹡dTÚ,V)5 ë L4Væ Û}US ïè|ër,q°GÏZ ͤXcå°:¸Ã1vj± OQ®iþ½î¡Ùì[zô÷ó"ç£Åý~ q0ÎuóNGÛ®`å#Ôd3# çØ!V-ÙÈÌ@fëMAðH¦°èÆxbñRÅó$áÃá³×EÉF·Ú,fT¸.pía#²j\Hçùí¡$¢ºbÍ6ùäe½ Â3õ"[È yh+fUºbá{"A°ßº9Y×éD(ê&UäH ÈEHÂ}w T°ìL÷ôt?¿êñò¦©@÷ÉÛË'v¾ã½·}Ýý|{ý1·ý^Ååÿx:ÿ;«> mx YúgÇñÖ¾æ2]&Ii¨5lÁ§«Q÷'4ÖÝÏû_ÏÙÑ@â ëJ¯¿ 5jHKàÃ&¼ÛѵF8¾\]$:[¶ÅÝiá=Xuôûx¸µ5&Ït1æ1ìÂe<].·v:Ô÷ú"XÙåÁ9aé§K` ôÙö¼c¦¢Û×¢ÉÇt:ì¶öÎ_R¬*©Ä¤ Ãozàó ´IÞ;[5MTâ Ð?Ï~xáÔ7è®æ)^ ;¢âëõ¿vÆ ÅbËíö2è ¼Fô*¥õÌXIGµ!=¢,6׷Ǭ+£3ØVJº%P[]sÓ1¤"[ÌË¢C¶²Ôq<Ýçéóã+éx< õÙ>Jùz.¯¬^·³`Óù]ͯ·ê¨y!]jµf4GS½èyêPeÖÚdÑII"ò\°Ý'Ë˵R´ÍÌ«³ècýõ¿»âé6ÑSò]cvfç°A WR{ÏHni³rÃ:óívY¯9ïIF,²BÐ o¥*Hî:ìõÐ3jr»êïîáú³Çy EÒél×£`l*Àåû~çÎu¤ ë)R#oÕ.ÚCèðlÐ'/=$<´BXÕÄ+â£6M¨ÃÓFÓ7ª,ïP]QJi¯SÝîaè#¹ id<_£ò® jh°³I³n´@ôPt¯M2òà¨À\ty^ (§²ÌØD§ sªb ¸k R_ö [FbÎ $e?JöJ1G PQ1óÖT0R!k£9mxM˾ío×îAm%Å|¬¹«t}g1Ã×Es@¨j fy)f·ícÛT´gѨT¦ ࣺ-¬ò údÁk:èæ§q3ï\ÂÞôiA®E"¤ò 4«°ÐcÄÔYÅ}¶ê¹X'q)X%Iu(ë|îf!¶¢N/WwÉÂP@Ââ/yª0ÂÑbÇn¸×y·î]¬ýÆÈH:Å6a @1µcç÷³¶i?#Ôùä£/>iwvwva,«,KMÁªñsEËõª´V_t¸B"ß÷B§û캿65{ÆIþn'ºyò¦ôG Ó1·±ÄC²çL¥¸DùU!¥1îrëÏ7Žiÿ~&óßRO-i-EÄØy!4üóob mO{Ͷ¼ÿþú{»]?>?»"áÔË@S{QuÍdi1(¦kû)ýíð|DÕHfF0üƼ{#ñ23¾Lp}gÙº$iKÓ´ )ʰðµW§¨¯°l0¿86ë1bhÚÙ³NÀ<qê¨À $TàȽ2SÀO̸ZB'Éõ*hÕ213ÄJÄÒ2×:y qÝgÌ(°à\¿tÙçál;nU s ÷rå9Ǩÿ;YL½;î®:dæ_èÉx fºWB!¤®t^.Ô"úá<÷êk?¬,]3Çb¶ðs¹³ úûrl`¤$u2sÓÀ5AÓ\Êî»i}6Ø/ÅØÕѼ%·q3ç |rÌw7¢¥ôf]©W[Ó0ݫ۴ ¼_f®pµ~!<ìÉf:Özzd~<ÞU(8ÁQ±p(ð(|T;ªßñ/ Ç! *èÌï~Éú=;#6BcMÝékµV®)zçå±_ª2¡°{!ÑY[{PT\¬Þ¯Mü£o÷xÌ¥3¢Ck,ÙÁ×csdÎwYµR.è©a÷^l£ðnGaìóv¿¾uçë©»øØÀÈ£ç>UfÀ&¥5ãÍVIÏiuO£m,"¢ÛEÞ`Ãcû'è*ÍÀÛ )0ãF«¼ùj¡Rè](k²~bͧÅöÍ:}îgâ0®1I¿3EK| B'¦ÓyK¨¦£¢[-nªv!¨=tSëÖÖdÙimYçÝÏ~(×SõþN¨mã_eVTß |ül"é?q]·VÀÞQÈgÊt+©Ø(aB+Re`Ôð9 ôm,ç6AÇÂi1D3S´îÙÚº1¦¬0Ô88º}ø¤3Kn¢ 1 $WrÜÿXÙ*žòzòïrÙÍú:´¦Ñ)1î×ot,ëØiàëIÑÉ®¡Ö±ª,\©ÓçàQ½Äc=yJ¶r[ád¢2gÄ)t(y îJOÿk³nM9^½nodf}ï Ý@ ݰôs¦cMô¾! 8|ôÞ62µît§ÈMîöâû ß¿¥õóëcæñ{Uú{ÐжZ*µ<g^¢L¼JýxÎ\Óu#ˤJ©'Ѽ§]gI®+¡.êføm6ªëi@«iëj=Iì<ÂôLD^¡Lim> ûëÉäu+c«cJ´\5È78¤ÆË/«d£Êv4]ÐÑqµ¾c³×ÇêãzJÊlÒ}½B§á6áMPÛ&O :±{ÏÌÇ ³®¯s-Q§Ü²×ƧÐäf¥\éd1Õ[ýú¶ôã:R ªX_ÒÕ#éHWÉï A¥ ÇØ^.XúAtV¸è骬dùºV"°¦k Öe6 |Ð2ÑÞZ)JÚûTË0)X"±Ì´ØEyì Â×óOy宿2ÌL\I·müý@Yþ éܲ *pBÇGd³ÿu̱ºý ´º«Ô¥®Ë¯÷u~Ç¡p2ñt\Ö`%r¶Q4[©Êi¼÷Ëà\Oµ½¶éaÈ6ºpÞnZ/UiRýu97¯ eîÍ¥CÙÄQî©"fºá¥DçâÙk¦øÑï'©ñ«*=Xjª¼ÂÈlj)ÙOóÓËkZÏß®ÛUçBáV¦t%àBMýßí3_Ó4¢+.ÊqÅ%Öè-ÝK3gã^ÅçÆpçý Ë7»êz±¡@¦ñÈVÜJÚG5 ¹1BÂm¡Êÿ?Z#¼b`Å ³ÃÒ=êze®[·8þg;BµïÐ|Ò7}à¡÷$BHeRúUeѸÅû¾7°Ýw~}ýbµÄ&,OöL!JÛ®O÷3Q8~ïCXìôlíìËXøÞÖÿån"´EF/ZÈ·wÎc3öGå¯ñ= "IbÛÜõ¾6)àÐEÈãd:ÝÝpUPÆhu!TB»wPJ:^¦Wï=>y?¾gß×/=oëó! ß¼½¿§³-æzýÓyjG¯»nüéëé-zhiiH¥ÆHº`jJ$Ø£é²Dææs!*8á¼æ(¹d À&:Áöt.8h±ZØ6÷,áøÞÔR `_Ú£Õ` eDdD¤só½<nóó.cÞPX[V*Û ½Þÿ³.°HÓ¯Õ6¥4ÿ é¡ BBÀ¶Óç¾÷CúÿÒq¦ê($ {â»#(áfwsïnýóý É5§ÎëÇ{¹ÞªHÀFç[ÏL3*Sxݵ4Ò 6úãh Û=¬RøFÛ#ÊmÓlãã9wÑ>®ÒÎH?Åîø)~®Ö/DH"ÈgGm%\04ÇùD¾?/J°ºPMC M1G|ÔÓµx)×Vd C{Hm§Â:ÅP òHK>E3Î8uØôä.Ó Ñ`È9ø1ÅóB'èxªbäV:$W®ymÁTD&(½/Å¿Rà©"9ÿ»ÌÌX×rPêîÊ©)¦õk6143ß^¾ÿì?î·ñs08 z¤À ɤ-l=F$6ô=Xµ ùBêhÒ7t,n8PÆpü¾Í² WüÖ"RêmsB,;¹åWlFybß´WÈǹ££e(¬ß¿·Y竵Üz@´ÓêÜï9®¨Ë0õÏ/m½oý\°¸?")¾óT. ÃýÔ)UйWy÷ødâfj²Ã,+Q·ñTÕiòkͤÀ.aÆäÖ-`³<Q:üû¯Çá£i^ª¦UEpeë®îrø¼`Z ÎgWmùºÉãÓÔm~(ó#YZº±Z[\ðØZAéLjê>SeW^R¯°3£¥ ¼ó;%SÑ'\ãnݽéîú÷aEõÜ çu¯æ% ~n9ª÷Nç¦5ü Ùñ¡îQ_ýlÌMH÷6mݯ4á{- uÒó×_ºü8ű>É÷¶±` ¬¯;4ÊïÖí8ûì,¶Ðß?ѪªM¯jÝU!¶|ù&Hu±z ¤;\bÓÁÁp$ m(1Âq7ØzìþPùÆÇ{¦8&»Å¦w{¨"Üu!HAYò¼ÿ¤kÙm")¾d«ä ¹æØéï·½¥Ò*1)Ñ%RQ`@GHîrv93«~|FªAHüà<À 1`]dexz_K󴯲RoÑ|ZM }èÖrM$Tþ)§#;=+CL$¾ÎHãy?4Îá"µÝ½Ò&M÷9-i¢êYðQÃ:vW¦¶ªXgg(w[¾Q£¨sCa½ä) T2üöVKZ¦aA¦6iÍ¢qÞÛ¾ïì°p{ÿúùöòÓöõéóÝåáñÜYLø7p"cδ¸4E [lMñ[¾y ¼cû¹Åca áH½âf Ëu¡µµN/"[¶ uÃ%èT¡[Es«Æ2¸M·°~GòËeVô¦ìð®e~Phùã{u ï@Wo9MèÒ:Øê»þö÷Õ+ýëbÀ$ðãýßÓ¦[Ä×ë§{>¿ÛøVyÔзö&Üè2 Cá½g£]÷+E}!(TÓ×DÔ]ÎVh´Naäð쮥\í§Þ[~ç´QAsºödTí}¤uܧÏô)ÿÛvÇèOaʪï;Y;$¼Ë,7¦«P»m¥C,{θ¼eV;ëìy e'Cüô\Ê2³ôô¨òå5¡a 1ñca» U+¼Ézäï¶ ã¦¬2ýù+ ÊùQD³^߯I.ELi[# Þ¹/q QûËL¤¤Ëæ¶XBÕ 'ö8í?ËqHM-¾0àÄãvïî_ãêsC °ª5GÛý}{kÿ]gßsu~>zQunå>}wíÇE§N!¢QT ê$ PJáàdM*éIQ^®0Uë¥jbqQ/aJþzôÓm"{4t"+ æ¶;ú]}¬qdµFHs/¡òÄb÷ãýçýû=[¥^N&7×ÏöÚ¥êæR¹£ö7X¸òriʺ<¹5§¢Py5 lrµÕob±iÄ*$¦Q3Q!QQÄ3ây»ñT.ôÚ;SFWøÅõqIgG1À¤Ov©¨/E¯6Ä0Ûg{o³TO¤ ¤ \&©f38]:Wë²EqíÐ ¬UfÍÏ#í'XMEPiÔÌ9I¤a T¤±Cú¤3YN¨yP\8æOÉÿ©`¼ÈÂFN?åNäéîüûëS1"tèrI0 ç²(*Rd\Wjvò5 ¶mØx;/þ6¸qad0SãKÐ2ö¬¬×Ö¨Öõr>¯Wem|ªg¥P5qmìTÆé;Ã2¨!ÐǰøcÝgcôÙÂÓS$U©½2·ÄÖÍtÑa×W¿ÃLó=CÁs{ò #$:+iò?2*ÙM`gI%0®SV×÷þþÆYfÉZ6Ö*¼_ô¹¦_¿*j§^wéÜ8y#:Vw+ÄêáQ¬C-b×¥H E&¿4âLL¿åPÜ©)°LS!Ò6]«4:þ::ÐQjlîó<ö·Þ]_`îØ}´§=YÌGðwPFGSÇt.Í&Ôa©¢²&eÔõz7È]»ur>â̰¡ dý)X®J¢9fR/DÂzmÒáà;ÜÁ©~ÔøÐ0©55+mâêèìÈN-T$õ» ;}Óí¶îºÿbËUnÛ"µÑW¯#«§µR¥\ý5´Lñlka̳~Ët%âúB¨äíïO<Ýr@CÍãºz·ªê¨ ªc/tî÷aF9èvË ÑyÊ l!fWó9~üþÂ0¹ªP¶WËÁdiâôÆeßÈ.ÆÏýÖéþÍãâ0ÁáXa5ÅAª%5x1B ¦èyÎc¦ÍÏbÙ¨QSC.BI²þl-ºHZ2ÿq7F_.ÏfÒ²¸"öÓ%¨ºA8ÛÇ®PK @¬§6m®Òض¶lCð¿ºîq×rÔEcÖµgÕ¾Àä×çóC·£àÜëûO×Î×k5®³Ãz{"DHí#ÑiÌ&bº±Ç!º*,#¶É* ø1¥ ò¨ô÷ kîGÜcýrjÚ òÓÑ©|¹´hëø)¯¤ ÕßoÚqÙW6"ìÜp Ú1"ÿʬ½µR@XØÈrL ¼Ù¸øHnÆt¢c^ì ^ÈÀKV±Çt2MéPø kOLjÑù:¤-iF<p}oXÏ5cMw¾Ýçë8¦ß¿k/O/O}ÝnôRº\+èíNåHOi`¨\ xOì.ZVH6¿P¶ 4Àvº¾1ãH7-eµ2åÈ'ãÌæ³¤ÅïSz?þ¤«ÝqbÂn9V«}ÿ;U«RÊW Íý¯¨ ebÏxl®ï~Pt^âõ. ;0üvb[c#;OûldST[°ßT\ùáye;ÞF¸¼Úµ.&pç<ÌõSd#Ö%Ó &]P92m»ó¡;¿ÑzÂç¿ï·áòþñãýË·ÎîOǶ9öýþZùô¶ [¿¾¦i¡Ñø3HøeRþ%xÑç¢Òº/TVºÐ:LF`¶*ÛËN§ OlÝÜE-wÉ*Ä,ÞCØcpLdKa%{ó§è*î1· K³gáKJÕw$iÏ~§½h ®_Ïa¬p¶25ÂÜ1ºÖ¹Ã¶úê¯Ñ0¡Ò"éfó4ä²zôBh'Ú¢|²iàMÖRíúÀN3©?àC¡ÎÑJëìI_iüøRµHñ:O±¡Mä¿y_êÛâ È*cc8|¦l׫Û(Á;Y@!'4=ÇÿeÖÉ6j`q«i&IÛ38¶*ëî~Û¢Ú+à¦+ñÝòg¦©"ŲïÃÉìmÎXÖÂkë¦~~LÙ >´æøhi S¨D {±óC ë0ö¥×`WSvlE¬N³I¿áä!úG,aRT¬çd»T XJ¬a.{ýð.PZì{Ú÷ã"ÙÍ òÍÝóÄÓÙ·×n-6ÀMõ¾ÿúFÙBñåµHµ$c-rvì÷¥øñ4 Ë{^ÄÙ3t«ÐÁ á{Öòë°Du}ë?úì£Òëý÷§kÑQÀª^ºî0qK¯çÆ;í!P}ËL?¨;[é³=êCÌâù~Xlß&T¨Tzþþ|Ü®`¥ùøHÙi) 5Pét[>F6]@A´äе¾[`Íeyñ1"7àù-äèÜçhs ÷g_{ú¼#uÎèÆÔ×`¤XU¶|ÊQ ÀÑè¶ ATâ¡ÛvdÇH[¤ÿÿcE5|)&;Ã?ÕpVÜ}£¸z¤}QíÂÆT ,K.CTV»ã°¸:. 1f³¼?¨²óÄÅ3.EtÕõ~âDW6Á_¬çe#]fXz=ðuÓ,éñLÖAÜ×{x@,î¶¢IÖªIE_¶(pâ¼|ÛmEE2ÛuðlW»z ³Ä4^eRG-Ì%^N¬N1JöÔ¹ZÃYÅÊtE-Áª0O^uÄ¥,¹Ëüyʽ*IþâZlXcß2ðñ;/n+ûQ2X×;H<³+qUìæácþ¢0¸O@¼ã·$Ûböòý÷?>ο}Oó®ú ¹¼_®WsÙôÙ¦göÆ$}[»0Ì·Ê0³Î¥½Nw|õÃ9]¥ãîxØ]b4ppÍÓúMýÒL;Q¡v£)ß6ò§.;Uî_Ú,æÀùÐÛÇ'´úíÑs4¿SL {½äñÝûU¿BR]=¤ÂYo(G¾¶ZûÙ¶rx½ú©lñ Tr@È'ÕßëqQ<Æ\ ÖÄóÂCà\)yBª±ðÿ éZv Á6`Éd¥9íÿÿÕJ{if?°rîQ·«ªÓ®â¥hI®¨è3®¶ÂïûÓmEÑ]"TÝ(ÜSÒ¥Q9j.Irþ×ßHsjùÂÞDË÷ü®+ºT»møÊ"©F¾¬äêq¯ê¸ËLéÞg@ `t[D 6Ç-Úºq|¹¶0¤@hZ.) !W µ¸¿ßAæÝA%ß ÒÒ@}\{vѼ¢:=æoi6Ò§öâh çÂ!Õ6dzDæ&H²?ôwsØñvédz»µv) rã.ÀºRm }5 ÌJJw϶ËtqáäÕv°íµî&SRdÈ* §1@PUÕ ùÄèD®(Ä[ÔíóÁïÏ/w¨Xÿ7_²«P¯YqÌnæaXéýÇFqu¥L¯þøí&½Òuû¨b£¸YqAÀÝÖcs9],z÷¯p ¦Si¤[rÜÜ/v¯Æ÷BïäÙWr#Ø]/´Ö§ vHNþþÜLÀzû¸}ôêR¯¾Õ6Ëøkó 5ôÓRëUYm`ÃÌSvµ(¢hx¹¦ qÉpºØVY3Y^«õçÜB¦÷:%ŬÄ-Ú¨Ô Æ>¶F(d utª·9!¸EdsCx*e4}ÝâVï_ë a4¨ÁUâêÛlÿ-8ý-äI Trñ>#!á(ÏêñÀ;CJzM9°°Ù »;#ªgH3wÇô»ó;©÷ññ %â¼¶zaGÈä÷\$HoºÔjgçL4/%Ù0BégE\SRá@ÆËì5ÉòdAãNs·q[d=í|ãjæíñÄCcÏPÖgïHó¸Õ×m¦Ð;;w:ÖNSpðâXÉêvÑ#J¾½¿&È{¤'nùT|ÿL5YÕíFÙ¨ Å÷¸U¼·ý\õsè;Wé¼Ëå¶g×.rÄj·×l/ÒÝ<ÔU=wg«äÊ-RBÁz.ÖÔó,"²^Zö·ëázÛ¦¼ª$d?¤Mµ qHONyäi¦¹ÔaÙ oòòÂVðt;7ê½ÚD&ÖK/å /²,þbgXéåí*k&ÿ>Öm?·}O\2Õæ÷ÒQ D»msÆîAm&J ö¾Ëbh.p'¹ºP PQÑZ·Oûÿ_·I÷ÒTÊθ/MÓÔsÃ7dÙ ¸£¢5n"ñç4çQ*²H¢[ªRií]ñù1§à]pÏûÒ³¼½¼ 4°NÔ§¥ÜÞ!¾ÛË< ¾¤jLÐMür K<õWs4ÛrM§$¡âp ÿJlbb(×þ+ämÍBP²=ñÂzeYÆåmÖì¼ÀHûÞ,FsêRÚT NîASpö'©y(IJe%¹M·âç»é®Â$fEÚ?¾?ÃÃÅFÞÛ»¹Q²F Li!XêDãSj° YÅØÎCwé·[IhBçè_oBÎÝ¡ì Ä"U5ªâUwÊ8Qì-°:,V ¾Oÿï´u By)Ù빯ëQ±¢îw£.ún¡ÆöÏÏ!å1]5¯ê#¯àz`G©øjRÚ¢î¢ê·mßVªÍsöøä< .}Ãê(ÏdB¨®ÆL·1 ËMÃÃåͳ|u´bMc©Â£ÚùGî#íM[ ¸íÔ 1N|^¿Bð%¬·æ2ù*ÂÆõñ×a$cðAÏ|éi]×Rü±äd}RE8vóÃçô³bÝcèh3zO D% ï8Ñ/ÙÄ«â(í¡ÈÇäô[Fç8º¶-Ea rPç³ûÿÿ¶/;ë"HBSÅzs鮦»ªhlHqËH2VU]Ä*HCÆ*ʹ{ÈK¡>£i,§Ç ^KÓà`¢/^úÕ×ý8 ¿"¶6C9.ßS8Óò´¡G Àªh! רëA±Fx«l*tå GXÉäÄÎC!jt¥$ñMVkÑö+Þ8]º{¢3 ásk(Ø#´±8dÎlùß8ì?M0kè¼e:c Cu,TúßdØ(¾Ãgl]oø)ÊUÇÅ.Ä£=«H£á6Þz;¼yq /Eÿ@Ò¹e¹ ATØ °gÎä?ÈþÇAêâ`,ª«¡»®â Owàû¦ßÏæ~Ûdoeíä2дl»Í¯_íwGëú0}tnebF-yU¿#PãË0C!»XP[¼¤xÙ%r÷Á³7åë¿ ¬¨_Dç`J© ßúÐ[Ù ä'Z±+B'm/ W6êMÑöÝy ÁÚ$ÙJi]P Y¨"+½hÂ9kª¥ª*U[©l¹5§W¢ÚÕY ¤&V4yzëá½ÅyÒó÷ï?ëû¼Üµï¥Ê]ñ$(û¬èªÇú«ë¸Cé×ÑÊ Ð"¨Îþ¤3jn°ÛI3üÿij[ @Ù%OöÇ {ÜÝ~¶>w G´"RµeÍÎ;e|Lÿp,¦cþmô<#òÐDb3&ÿlX GHb1û=?nìâõÑY}dÓ¨SÞj¶Î¯Çh±¸éþ>¾È/*ÿ!'pöxÏâfÏÙ¶úã$_0.UÂ{¤Deª`Ü@47ÓN9Øÿ}½=êZ ÷ Ò/õ-ì!LG½ÇÿÝn»| ál'EbhW§MGi3±¾"Ø8w=~z,ð"D°%5Èò/f%d£õ8çóîÿ?Â÷OB-®~½â¡W2[vº3!xûmýºÝZ··dÄtwa§¥3V/öé ßi¶¢d°oÅ:õ'<Þi$¢a%ú ÉúÆër¥ÞI$0¬T4¬Øåk£í>-k¨3sWí&ÐA·Ñê"Ò°·ºJ&õ&/-5t* ¶|Ó[<u¤Ë«TìèÒv¤ÎuÞãöËֲǵxc]À~BÏ·èÅÆj+ÄLEü¾k>âG<jÍ}ió43jyeð Ab1P8n©aó®o29ñ£ýP©.Þô_, äÑ"û»X ÛÙÜtûâŸ3rMô· à³T×¹ÊOSnM¹ lFHH Ýc__{Ð ¼u¼9åjÅ¡ÃUPyu<Á$öÊÛ9Pz§vKJj´iä½ßɤÿÒbb¸éw7¶µ/a@ÈÕÇ^çnÏeNÆ<T4Ñ?ín5)¥rVé¼f ¾Õ2¯Íô¡'©HPoïïËÆ5ü#ýþnúªÈV¦É£È£ÕBEPòè_¯ßLü R¸SÙYª=gF.ìc<Lóþ8^{ÄJø%Ïrô-ÿ1zÍF«òy±tGhOÆ8Ýã9r¿³q®£EÍ*Ö±ÊÄ«ÂÔÝãiÈ.{Õ³Î~î*].Zd¿¤Ë², Ô^öqúÙ±u*Àx9;2¥ùð|Ïm½?Èzs<Ãy £ïû.töX_.éöýùU¹µ³fÿ§õqM¾KYLÁ=» pº4åµÚ7Ghç¬BéÐ,s^ÜMÒêçHzU¢¨ÜMØP±7?iqmÀ/"q*{´GwaÇ×ɮʰd´L<Kä/×*d ç @Èã¸Ù¥2d÷étT¥Ù¿däX¬Pat®FU ^ûf£_.üªò^0Ô+O2¥LWVºEÿ éä... [truncated message content] |
From: Luke H. <lh...@us...> - 2002-11-25 06:53:12
|
Update of /cvsroot/java-game-lib/LWJGL/examples/nehe/lesson09/data In directory sc8-pr-cvs1:/tmp/cvs-serv18314/lesson09/data Added Files: star.png Log Message: up we go =) --- NEW FILE: star.png --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/examples/nehe/lesson09/data/star.png PNG A¢Où´ =« ´ ÇäbecÆ r& Vn ñ3330l`>@Ë+¸ò®~þrkæÀìÀ[h ZéD Ú;hYÐ ¬¡w=°èB¬¬¬L«à"~¤Wáʸbv-f}Ë(ÌÄ }¬ ,"# ö 2j]\øÄ¤w´÷~àãããåå²?~ü k8 A>¤°BnAjBxq &H ÚÐZ î4Õ ¡±^~]/ôq à K¯Á`Y«Ó¤'=åziJ&5U ndRÑf4UôìË¥ÇgPfÆ* 4Rb@LhT$ð° a#çHqLû@¼Ø ¦HKp`M Áñ>/½ÇÏå6°ås8¦7ÑVU* 2SJÑ È "k`ü¹~/rò0 íHÞÄ$¡ûbÀ "">H 2là& ¯üLïýÓ½®:üÀ¤ Ü -¤Ós×Gmk¨êSIpY±ÓM°ãÛý93¶ nI6$æÎEA`÷¹Ò.~8n_%ÛN 8¯%»Gª2جÕ6&-Ì(uUx³)ÔsÇo# ý ³/Ǭ*¨x ×#9ï«ëf) 0®I xy]j I#Ëg\ÝlKHÊUr¶¥(!,¥Ó`ñbª:i0`·ÜQÞ·ÙQC¨6ï¦âWhßr¶1 ÔR Ï®ÑbË$Çêñl9 ¶èþgn`à! á¶Ujøa|ݽþâ,~ÑòlW¿{¤rmÞ: 9aQBh+Øâ¶ól»Å!/sÅ ëÆX̳ýYQ 1«o¿Rè¦ÿõ<ÕÙVôëª5Ì él ?t>ØÝ UPKeëy Ù¿²\F÷úA©cL±Éì$Ho¼õ:ÖÛß8¶ À DÑ÷?³BÐè¤Ú?ÑLºÆ;¸;Gêݰhm¶LåþØûA#zþP"ÈÆÄñ?£Ù¼jantg(ÂÀ- wú÷~"±.Ïju®¾øP¨þ ñëÙðq/) üûKÜ\(ÑÌý} 8º²ÍùJµH¹#|Õ4FèØ}{(uø ^"5Û>J^ø=ÓFä½ã}Y«ùt Ì6p%¤ à=r¯ÞIWËýCh¡ß;ÙYÓvF¤|4à@!g À7± ÐÚ9ð![ø /òÄrLÀ¥K6¬Á±3J óhZmáeò +ò!|A0è üH¶Teåð´Vá È.³·oß»ÑVä]GÈÓXWÀ¯)ÆÌúxÆ$ y1/fºÄ Ör3-£-K!&7à A²G xÀ»ÈSç¸öX-¿n }< (òÚH$õ· 6yÉ^ÞC6 wbð´H±îça w1@ Â:§Ì¡J¾$ |
From: Luke H. <lh...@us...> - 2002-11-25 06:53:12
|
Update of /cvsroot/java-game-lib/LWJGL/examples/nehe/lesson10 In directory sc8-pr-cvs1:/tmp/cvs-serv18314/lesson10 Added Files: Lesson10.java Texture.java Log Message: up we go =) --- NEW FILE: Lesson10.java --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/examples/nehe/lesson10/Lesson10.java /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import java.nio.*; import java.io.*; import java.awt.image.BufferedImage; import java.util.regex.*; import javax.swing.JOptionPane; import javax.imageio.*; import org.lwjgl.*; import org.lwjgl.opengl.*; import org.lwjgl.input.*; /** * $Id: Lesson10.java,v 1.1 2002/11/25 06:53:09 lholden Exp $ * * Loading And Moving Through A 3D World * * Credit goes to Lionel Brits (ßetelgeuse) and Jeff Molofee (NeHe) whos tutorial this is based on * * @author Luke Holden * @version $Revision: 1.1 $ */ public class Lesson10 { private GL gl; private GLU glu; private boolean done = false; private boolean fullscreen = true; /* Blending OFF/ON? */ private boolean blend; private float heading; private float xpos; private float zpos; /* Y Rotation */ private float yrot; private float walkbias = 0.0f; private float walkbiasangle = 0.0f; private float lookupdown = 0.0f; /* Depth Into Screen */ private float z=0.0f; /* Which Filter To Use */ private int filter; /* Storage for 3 textures */ private IntBuffer textureBuf = createIntBuffer(3); private class Vertex { public float x, y, z; public float u, v; } private class Triangle { public Vertex[] vertex = new Vertex[3]; } private class Sector { public Triangle[] triangle; } Sector sector1 = new Sector(); /** Creates a new instance of Lesson */ public Lesson10() { } private void setupWorld() throws Exception { float x, y, z, u, v; String buf = ""; Matcher m; /* Example: NUMPOLLIES 36 */ Pattern numPattern = Pattern.compile(".*NUMPOLLIES\\s*([0-9]+)"); /* Example: -3.0 0.0 -3.0 0.0 6.0 */ Pattern pollyPattern = Pattern.compile("\\s*([\\-]?[0-9]+[\\.]{1}[0-9]+)" + "\\s+([\\-]?[0-9]+[\\.]{1}[0-9]+)" + "\\s+([\\-]?[0-9]+[\\.]{1}[0-9]+)" + "\\s+([\\-]?[0-9]+[\\.]{1}[0-9]+)" + "\\s+([\\-]?[0-9]+[\\.]{1}[0-9]+)"); try { BufferedReader in = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("data/world.txt"))); /* Get the number of triangles */ while ((buf = in.readLine()) != null) { /* Find a match for numPattern */ m = numPattern.matcher(buf); if (m.matches()) { sector1.triangle = new Triangle[Integer.parseInt(m.group(1))]; break; } } if (buf == null) { throw new Exception ("Got to end of file before finding pattern: " + numPattern.pattern()); } /* Read the rest of the data into the world */ for (int loop = 0; loop < sector1.triangle.length; loop++){ sector1.triangle[loop] = new Triangle(); for (int vert = 0; vert < 3; vert++) { while ((buf = in.readLine()) != null) { m = pollyPattern.matcher(buf); if (m.matches()) { sector1.triangle[loop].vertex[vert] = new Vertex(); sector1.triangle[loop].vertex[vert].x = Float.parseFloat(m.group(1)); sector1.triangle[loop].vertex[vert].y = Float.parseFloat(m.group(2)); sector1.triangle[loop].vertex[vert].z = Float.parseFloat(m.group(3)); sector1.triangle[loop].vertex[vert].u = Float.parseFloat(m.group(4)); sector1.triangle[loop].vertex[vert].v = Float.parseFloat(m.group(5)); break; } } if (buf == null) { throw new Exception ("Got to end of file before finding pattern: " + pollyPattern.pattern()); } } } in.close(); } catch (Exception e) { throw new Exception("Problem setting up the world", e); } } /* A javafied version of AUX_RGBImageRec *LoadBMP(char*); */ private Texture loadImage(String filename) throws Exception { Texture texture = null; BufferedImage tmpImg = null; /* normally I would use StringUtils.isValid(String) from the jakarta commons lib, but thats beyond the scope of this lesson */ if ((filename != null) && (filename.trim() != "")) { try { InputStream is = getClass().getResourceAsStream(filename); tmpImg = (BufferedImage) ImageIO.read(is); if (tmpImg == null) { throw new Exception("Error: Got null from ImageIO.read()"); } texture = new Texture(tmpImg); } catch ( Exception e ) { throw new Exception("Problem loading bitmap", e); } } else { throw new Exception("Error: file name is not valid!"); } return texture; } /* Load Bitmaps And Convert To Textures */ private void loadGLTextures() throws Exception { /* Create Storage Space For The Texture */ Texture[] textureImage = new Texture[1]; /* Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit */ try { textureImage[0] = loadImage("data/mud.png"); if (textureImage[0] == null) { throw new Exception("Error: got null from loadBmp()!"); } /* Create Three Textures */ gl.genTextures(3, Sys.getDirectBufferAddress(textureBuf)); /* Create Nearest Filtered Texture */ gl.bindTexture(GL.TEXTURE_2D, textureBuf.get(0)); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MAG_FILTER, GL.NEAREST); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.NEAREST); gl.texImage2D(GL.TEXTURE_2D, 0, 3, textureImage[0].getWidth(), textureImage[0].getHeight(), 0, GL.RGB, GL.UNSIGNED_BYTE, textureImage[0].getPtr()); /* Create Linear Filtered Texture */ gl.bindTexture(GL.TEXTURE_2D, textureBuf.get(1)); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MAG_FILTER, GL.LINEAR); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.LINEAR); gl.texImage2D(GL.TEXTURE_2D, 0, 3, textureImage[0].getWidth(), textureImage[0].getHeight(), 0, GL.RGB, GL.UNSIGNED_BYTE, textureImage[0].getPtr()); /* Create Linear Filtered Texture */ gl.bindTexture(GL.TEXTURE_2D, textureBuf.get(2)); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MAG_FILTER, GL.LINEAR); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.LINEAR_MIPMAP_NEAREST); glu.build2DMipmaps(GL.TEXTURE_2D, 3, textureImage[0].getWidth(), textureImage[0].getHeight(), GL.RGB, GL.UNSIGNED_BYTE, textureImage[0].getPtr()); } catch (Exception e) { throw new Exception("Problem loading textures", e); } } private void resizeGLScene(int width, int height) { /* Reset The Current Viewport */ gl.viewport(0, 0, width, height); /* Select The Projection Matrix */ gl.matrixMode(GL.PROJECTION); /* Reset The Projection Matrix */ gl.loadIdentity(); /* Calculate The Aspect Ratio Of The Window */ glu.perspective(45.0f, ((float) Display.getWidth()) / ((float) Display.getHeight()), 0.1f, 100.0f); /* Select The Modelview Matrix */ gl.matrixMode(GL.MODELVIEW); /* Reset The Modelview Matrix */ gl.loadIdentity(); } private void initGL() throws Exception{ /* Jump To Texture Loading Routine */ try { loadGLTextures(); /* Enable Texture Mapping */ gl.enable(GL.TEXTURE_2D); /* Blending Function For Translucency Based On Source Alpha Value ( NEW ) */ gl.blendFunc(GL.SRC_ALPHA, GL.ONE); /* Black Background */ gl.clearColor(0.0f, 0.0f, 0.0f, 0.0f); /* Depth Buffer Setup */ gl.clearDepth(1.0f); /* The Type Of Depth Test To Do */ gl.depthFunc(GL.LESS); /* Enables Depth Testing */ gl.enable(GL.DEPTH_TEST); /* Enables Smooth Shading */ gl.shadeModel(GL.SMOOTH); /* Really Nice Perspective Calculations */ gl.hint(GL.PERSPECTIVE_CORRECTION_HINT, GL.NICEST); setupWorld(); } catch (Exception e) { throw new Exception("Problem initialising GL", e); } } private boolean drawGLScene() { float x_m, y_m, z_m, u_m, v_m; float xtrans = -xpos; float ztrans = -zpos; float ytrans = -walkbias - 0.25f; float sceneroty = 360.0f - yrot; /* Clear The Screen And The Depth Buffer */ gl.clear(GL.COLOR_BUFFER_BIT | GL.DEPTH_BUFFER_BIT); /* Reset The Current Modelview Matrix */ gl.loadIdentity(); gl.rotatef(lookupdown, 1.0f, 0, 0); gl.rotatef(sceneroty, 0, 1.0f, 0); gl.translatef(xtrans, ytrans, ztrans); gl.bindTexture(GL.TEXTURE_2D, textureBuf.get(filter)); for (int loop_m = 0; loop_m < sector1.triangle.length; loop_m++) { gl.begin(GL.TRIANGLES); gl.normal3f(0.0f, 0.0f, 1.0f); x_m = sector1.triangle[loop_m].vertex[0].x; y_m = sector1.triangle[loop_m].vertex[0].y; z_m = sector1.triangle[loop_m].vertex[0].z; u_m = sector1.triangle[loop_m].vertex[0].u; v_m = sector1.triangle[loop_m].vertex[0].v; gl.texCoord2f(u_m, v_m); gl.vertex3f(x_m, y_m, z_m); x_m = sector1.triangle[loop_m].vertex[1].x; y_m = sector1.triangle[loop_m].vertex[1].y; z_m = sector1.triangle[loop_m].vertex[1].z; u_m = sector1.triangle[loop_m].vertex[1].u; v_m = sector1.triangle[loop_m].vertex[1].v; gl.texCoord2f(u_m, v_m); gl.vertex3f(x_m, y_m, z_m); x_m = sector1.triangle[loop_m].vertex[2].x; y_m = sector1.triangle[loop_m].vertex[2].y; z_m = sector1.triangle[loop_m].vertex[2].z; u_m = sector1.triangle[loop_m].vertex[2].u; v_m = sector1.triangle[loop_m].vertex[2].v; gl.texCoord2f(u_m, v_m); gl.vertex3f(x_m, y_m, z_m); gl.end(); } return true; } public void killGLWindow() { Keyboard.destroy(); gl.destroy(); Display.destroy(); } public void createGLWindow(int width, int height, int bits, boolean fullscreenflag) throws Exception { fullscreen = fullscreenflag; try { Display.create(new DisplayMode(width, height, bits, 60), fullscreenflag); gl = new GL(bits, 0, bits, 8); gl.create(); glu = new GLU(gl); Keyboard.create(); Keyboard.enableBuffer(); resizeGLScene(Display.getWidth(), Display.getHeight()); initGL(); } catch (Exception e) { throw new Exception("Problem initialising Lesson", e); } } public void start() throws Exception { try { createGLWindow(640, 480, 16, fullscreen); while (!done) { loop(); } killGLWindow(); } catch (Exception e) { throw new Exception("Problem starting loop", e); } } private void loop() { drawGLScene(); gl.swapBuffers(); /* Keys that have a constant effect */ Keyboard.poll(); if (Keyboard.isKeyDown(Keyboard.KEY_PRIOR)) { z-=0.02f; lookupdown-= 1.0f; } if (Keyboard.isKeyDown(Keyboard.KEY_NEXT)) { z+=0.02f; lookupdown+= 1.0f; } if (Keyboard.isKeyDown(Keyboard.KEY_UP)) { xpos -= org.lwjgl.Math.sin(heading) * 0.05f; zpos -= org.lwjgl.Math.cos(heading) * 0.05f; if (walkbiasangle >= 359.0f) { walkbiasangle = 0.0f; } else { walkbiasangle+= 10; } walkbias = org.lwjgl.Math.sin(walkbiasangle) / 20.0f; } if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) { xpos += org.lwjgl.Math.sin(heading) * 0.05f; zpos += org.lwjgl.Math.cos(heading) * 0.05f; if (walkbiasangle <= 1.0f) { walkbiasangle = 359.0f; } else { walkbiasangle-= 10; } walkbias = org.lwjgl.Math.sin(walkbiasangle) / 20.0f; } if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) { heading -= 1.0f; yrot = heading; } if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) { heading += 1.0f; yrot = heading; } /* Keys that have a toggle effect */ Keyboard.read(); for (int i = 0; i < Keyboard.getNumKeyboardEvents(); i++) { Keyboard.next(); if (Keyboard.key == Keyboard.KEY_ESCAPE && Keyboard.state) { done = true; } // /* F1 switch between fullscreen/windowed is buggy... // * So for now, we are leaving this ability disabled */ // if (Keyboard.key == Keyboard.KEY_F1 && Keyboard.state) { // try { // killGLWindow(); // fullscreen=!fullscreen; // createGLWindow(640, 480, 16, fullscreen); // } // catch (Exception e) { // /* We dont want to put exceptions into our loop... so */ // e.printStackTrace(); // System.exit(1); // } // } if (Keyboard.key == Keyboard.KEY_B && Keyboard.state) { blend=!blend; if(blend) { /* Turn Blending On */ gl.enable(GL.BLEND); /* Turn Depth Testing Off */ gl.disable(GL.DEPTH_TEST); } else { /* Turn Blending Off */ gl.disable(GL.BLEND); /* Turn Depth Testing On */ gl.enable(GL.DEPTH_TEST); } } if (Keyboard.key == Keyboard.KEY_F && Keyboard.state) { filter+=1; if (filter>2) { filter=0; } } } } private IntBuffer createIntBuffer(int size) { ByteBuffer temp = ByteBuffer.allocateDirect(4 * size); temp.order(ByteOrder.nativeOrder()); return temp.asIntBuffer(); } private FloatBuffer createFloatBuffer(int size) { ByteBuffer temp = ByteBuffer.allocateDirect(4 * size); temp.order(ByteOrder.nativeOrder()); return temp.asFloatBuffer(); } public static void main(String[] arguments) { int err = 0; Lesson10 lesson = new Lesson10(); try { lesson.start(); } catch (Exception e) { err = 1; e.printStackTrace(); } System.exit(err); } } --- NEW FILE: Texture.java --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/examples/nehe/lesson10/Texture.java /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import java.nio.*; import java.awt.image.*; import java.awt.geom.*; import org.lwjgl.*; import org.lwjgl.opengl.*; import org.lwjgl.input.*; /** * $Id: Texture.java,v 1.1 2002/11/25 06:53:09 lholden Exp $ * * Just a small container class for holding texture data * * @author Luke Holden * @version $Revision: 1.1 $ */ public class Texture { private ByteBuffer data; private int height; private int width; /** Creates a new instance of Texture */ public Texture(BufferedImage tmpImg) { width = tmpImg.getWidth(); height = tmpImg.getWidth(); /* flip the image, so it displays right * There might be a way to do this differently... */ AffineTransform tx = AffineTransform.getScaleInstance(1, -1); tx.translate(0, -tmpImg.getHeight(null)); AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR); tmpImg = op.filter(tmpImg, null); data = ByteBuffer.allocateDirect(4 * width * height); data.order(ByteOrder.nativeOrder()); data.clear(); byte[] byteData = (byte[])tmpImg.getRaster().getDataElements(0, 0, width, height, null); data.put(byteData); data.flip(); } public int getData() { return data.get(0); } public ByteBuffer getBuffer() { return data; } public int getPtr() { return Sys.getDirectBufferAddress(data); } public int getHeight() { return height; } public int getWidth() { return width; } } |
From: Luke H. <lh...@us...> - 2002-11-25 06:53:12
|
Update of /cvsroot/java-game-lib/LWJGL/examples/nehe/lesson08 In directory sc8-pr-cvs1:/tmp/cvs-serv18314/lesson08 Added Files: Lesson8.java Texture.java Log Message: up we go =) --- NEW FILE: Lesson8.java --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/examples/nehe/lesson08/Lesson8.java /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import java.nio.*; import java.io.*; import java.awt.image.BufferedImage; import javax.swing.JOptionPane; import javax.imageio.*; import org.lwjgl.*; import org.lwjgl.opengl.*; import org.lwjgl.input.*; /** * $Id: Lesson8.java,v 1.1 2002/11/25 06:53:08 lholden Exp $ * * Blending * * Credit goes to Tom Stanis and Jeff Molofee (NeHe) whos tutorial this is based on * * @author Luke Holden * @version $Revision: 1.1 $ */ public class Lesson8 { private GL gl; private GLU glu; private boolean done = false; private boolean fullscreen = true; /* Lighting ON / OFF */ private boolean light; /* Blending OFF/ON? ( NEW ) */ private boolean blend; private float xrot; private float yrot; private float xspeed; private float yspeed; private float z=-5.0f; /* Ambient Light Values */ private FloatBuffer lightAmbient = createFloatBuffer(4).put(0.5f).put(0.5f).put(0.5f).put(1.0f); /* Diffuse Light Values */ private FloatBuffer lightDiffuse = createFloatBuffer(4).put(1.0f).put(1.0f).put(1.0f).put(1.0f); /* Light Position */ private FloatBuffer lightPosition = createFloatBuffer(4).put(0.0f).put(0.0f).put(2.0f).put(1.0f); /* Which Filter To Use */ private int filter; /* Storage for 3 textures */ private IntBuffer textureBuf = createIntBuffer(3); /** Creates a new instance of Lesson */ public Lesson8() { } /* A javafied version of AUX_RGBImageRec *LoadBMP(char*); */ private Texture loadImage(String filename) throws Exception { Texture texture = null; BufferedImage tmpImg = null; /* normally I would use StringUtils.isValid(String) from the jakarta commons lib, but thats beyond the scope of this lesson */ if ((filename != null) && (filename.trim() != "")) { try { InputStream is = getClass().getResourceAsStream(filename); tmpImg = (BufferedImage) ImageIO.read(is); if (tmpImg == null) { throw new Exception("Error: Got null from ImageIO.read()"); } texture = new Texture(tmpImg); } catch ( Exception e ) { throw new Exception("Problem loading bitmap", e); } } else { throw new Exception("Error: file name is not valid!"); } return texture; } /* Load Bitmaps And Convert To Textures */ private void loadGLTextures() throws Exception { /* Create Storage Space For The Texture */ Texture[] textureImage = new Texture[1]; /* Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit */ try { textureImage[0] = loadImage("data/glass.png"); if (textureImage[0] == null) { throw new Exception("Error: got null from loadBmp()!"); } /* Create Three Textures */ gl.genTextures(3, Sys.getDirectBufferAddress(textureBuf)); /* Create Nearest Filtered Texture */ gl.bindTexture(GL.TEXTURE_2D, textureBuf.get(0)); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MAG_FILTER, GL.NEAREST); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.NEAREST); gl.texImage2D(GL.TEXTURE_2D, 0, 3, textureImage[0].getWidth(), textureImage[0].getHeight(), 0, GL.RGB, GL.UNSIGNED_BYTE, textureImage[0].getPtr()); /* Create Linear Filtered Texture */ gl.bindTexture(GL.TEXTURE_2D, textureBuf.get(1)); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MAG_FILTER, GL.LINEAR); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.LINEAR); gl.texImage2D(GL.TEXTURE_2D, 0, 3, textureImage[0].getWidth(), textureImage[0].getHeight(), 0, GL.RGB, GL.UNSIGNED_BYTE, textureImage[0].getPtr()); /* Create Linear Filtered Texture */ gl.bindTexture(GL.TEXTURE_2D, textureBuf.get(2)); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MAG_FILTER, GL.LINEAR); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.LINEAR_MIPMAP_NEAREST); glu.build2DMipmaps(GL.TEXTURE_2D, 3, textureImage[0].getWidth(), textureImage[0].getHeight(), GL.RGB, GL.UNSIGNED_BYTE, textureImage[0].getPtr()); } catch (Exception e) { throw new Exception("Problem loading textures", e); } } private void resizeGLScene(int width, int height) { /* Reset The Current Viewport */ gl.viewport(0, 0, width, height); /* Select The Projection Matrix */ gl.matrixMode(GL.PROJECTION); /* Reset The Projection Matrix */ gl.loadIdentity(); /* Calculate The Aspect Ratio Of The Window */ glu.perspective(45.0f, ((float) Display.getWidth()) / ((float) Display.getHeight()), 0.1f, 100.0f); /* Select The Modelview Matrix */ gl.matrixMode(GL.MODELVIEW); /* Reset The Modelview Matrix */ gl.loadIdentity(); } private void initGL() throws Exception{ /* Jump To Texture Loading Routine */ try { loadGLTextures(); /* Enable Texture Mapping */ gl.enable(GL.TEXTURE_2D); /* Enables Smooth Shading */ gl.shadeModel(GL.SMOOTH); /* Black Background */ gl.clearColor(0.0f, 0.0f, 0.0f, 0.5f); /* Depth Buffer Setup */ gl.clearDepth(1.0f); /* Enables Depth Testing */ gl.enable(GL.DEPTH_TEST); /* The Type Of Depth Test To Do */ gl.depthFunc(GL.LEQUAL); /* Really Nice Perspective Calculations */ gl.hint(GL.PERSPECTIVE_CORRECTION_HINT, GL.NICEST); /* Setup The Ambient Light */ gl.lightfv(GL.LIGHT1, GL.AMBIENT, Sys.getDirectBufferAddress(lightAmbient)); /* Setup The Diffuse Light */ gl.lightfv(GL.LIGHT1, GL.DIFFUSE, Sys.getDirectBufferAddress(lightDiffuse)); /* Position The Light */ gl.lightfv(GL.LIGHT1, GL.POSITION, Sys.getDirectBufferAddress(lightPosition)); gl.enable(GL.LIGHT1); /* Full Brightness, 50% Alpha ( NEW ) */ gl.color4f(1.0f,1.0f,1.0f,0.5f); /* Blending Function For Translucency Based On Source Alpha Value ( NEW ) */ gl.blendFunc(GL.SRC_ALPHA, GL.ONE); } catch (Exception e) { throw new Exception("Problem initialising GL", e); } } private boolean drawGLScene() { /* Clear The Screen And The Depth Buffer */ gl.clear(GL.COLOR_BUFFER_BIT | GL.DEPTH_BUFFER_BIT); /* Reset The Current Modelview Matrix */ gl.loadIdentity(); /* Move Into The Screen 5 Units */ gl.translatef(0.0f, 0.0f, z); /* Rotate On The X Axis */ gl.rotatef(xrot, 1.0f, 0.0f, 0.0f); /* Rotate On The Y Axis */ gl.rotatef(yrot, 0.0f, 1.0f, 0.0f); /* Select our Texture */ gl.bindTexture(GL.TEXTURE_2D, textureBuf.get(filter)); /* build our textured cube */ gl.begin(GL.QUADS); /* Front Face */ /* Normal Pointing Towards Viewer */ gl.normal3f( 0.0f, 0.0f, 1.0f); /* Bottom Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 0.0f); gl.vertex3f(-1.0f, -1.0f, 1.0f); /* Bottom Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 0.0f); gl.vertex3f( 1.0f, -1.0f, 1.0f); /* Top Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 1.0f); gl.vertex3f( 1.0f, 1.0f, 1.0f); /* Top Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 1.0f); gl.vertex3f(-1.0f, 1.0f, 1.0f); /* Back Face */ /* Normal Pointing Away From Viewer */ gl.normal3f( 0.0f, 0.0f,-1.0f); /* Bottom Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 0.0f); gl.vertex3f(-1.0f, -1.0f, -1.0f); /* Top Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 1.0f); gl.vertex3f(-1.0f, 1.0f, -1.0f); /* Top Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 1.0f); gl.vertex3f( 1.0f, 1.0f, -1.0f); /* Bottom Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 0.0f); gl.vertex3f( 1.0f, -1.0f, -1.0f); /* Top Face */ /* Normal Pointing Up */ gl.normal3f( 0.0f, 1.0f, 0.0f); /* Top Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 1.0f); gl.vertex3f(-1.0f, 1.0f, -1.0f); /* Bottom Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 0.0f); gl.vertex3f(-1.0f, 1.0f, 1.0f); /* Bottom Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 0.0f); gl.vertex3f( 1.0f, 1.0f, 1.0f); /* Top Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 1.0f); gl.vertex3f( 1.0f, 1.0f, -1.0f); /* Bottom Face */ /* Normal Pointing Down */ gl.normal3f( 0.0f,-1.0f, 0.0f); /* Top Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 1.0f); gl.vertex3f(-1.0f, -1.0f, -1.0f); /* Top Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 1.0f); gl.vertex3f( 1.0f, -1.0f, -1.0f); /* Bottom Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 0.0f); gl.vertex3f( 1.0f, -1.0f, 1.0f); /* Bottom Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 0.0f); gl.vertex3f(-1.0f, -1.0f, 1.0f); /* Right face */ /* Normal Pointing Right */ gl.normal3f( 1.0f, 0.0f, 0.0f); /* Bottom Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 0.0f); gl.vertex3f( 1.0f, -1.0f, -1.0f); /* Top Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 1.0f); gl.vertex3f( 1.0f, 1.0f, -1.0f); /* Top Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 1.0f); gl.vertex3f( 1.0f, 1.0f, 1.0f); /* Bottom Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 0.0f); gl.vertex3f( 1.0f, -1.0f, 1.0f); /* Left Face */ /* Normal Pointing Left */ gl.normal3f(-1.0f, 0.0f, 0.0f); /* Bottom Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 0.0f); gl.vertex3f(-1.0f, -1.0f, -1.0f); /* Bottom Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 0.0f); gl.vertex3f(-1.0f, -1.0f, 1.0f); /* Top Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 1.0f); gl.vertex3f(-1.0f, 1.0f, 1.0f); /* Top Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 1.0f); gl.vertex3f(-1.0f, 1.0f, -1.0f); gl.end(); /* X Axis Rotation */ xrot+=xspeed; /* Y Axis Rotation */ yrot+=yspeed; return true; } public void killGLWindow() { Keyboard.destroy(); gl.destroy(); Display.destroy(); } public void createGLWindow(int width, int height, int bits, boolean fullscreenflag) throws Exception { fullscreen = fullscreenflag; try { Display.create(new DisplayMode(width, height, bits, 60), fullscreenflag); gl = new GL(bits, 0, bits, 8); gl.create(); glu = new GLU(gl); Keyboard.create(); Keyboard.enableBuffer(); resizeGLScene(Display.getWidth(), Display.getHeight()); initGL(); } catch (Exception e) { throw new Exception("Problem initialising Lesson", e); } } public void start() throws Exception { try { createGLWindow(640, 480, 16, fullscreen); while (!done) { loop(); } killGLWindow(); } catch (Exception e) { throw new Exception("Problem starting loop", e); } } private void loop() { drawGLScene(); gl.swapBuffers(); /* Keys that have a constant effect */ Keyboard.poll(); if (Keyboard.isKeyDown(Keyboard.KEY_PRIOR)) { z-=0.02f; } if (Keyboard.isKeyDown(Keyboard.KEY_NEXT)) { z+=0.02f; } if (Keyboard.isKeyDown(Keyboard.KEY_UP)) { xspeed-=0.01f; } if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) { xspeed+=0.01f; } if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) { yspeed+=0.01f; } if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) { yspeed-=0.01f; } /* Keys that have a toggle effect */ Keyboard.read(); for (int i = 0; i < Keyboard.getNumKeyboardEvents(); i++) { Keyboard.next(); if (Keyboard.key == Keyboard.KEY_ESCAPE && Keyboard.state) { done = true; } // /* F1 switch between fullscreen/windowed is buggy... // * So for now, we are leaving this ability disabled */ // if (Keyboard.key == Keyboard.KEY_F1 && Keyboard.state) { // try { // killGLWindow(); // fullscreen=!fullscreen; // createGLWindow(640, 480, 16, fullscreen); // } // catch (Exception e) { // /* We dont want to put exceptions into our loop... so */ // e.printStackTrace(); // System.exit(1); // } // } if (Keyboard.key == Keyboard.KEY_L && Keyboard.state) { light=!light; if (!light) { gl.disable(GL.LIGHTING); } else { gl.enable(GL.LIGHTING); } } if (Keyboard.key == Keyboard.KEY_F && Keyboard.state) { filter+=1; if (filter>2) { filter=0; } } if (Keyboard.key == Keyboard.KEY_B && Keyboard.state) { blend=!blend; if(blend) { /* Turn Blending On */ gl.enable(GL.BLEND); /* Turn Depth Testing Off */ gl.disable(GL.DEPTH_TEST); } else { /* Turn Blending Off */ gl.disable(GL.BLEND); /* Turn Depth Testing On */ gl.enable(GL.DEPTH_TEST); } } } } private IntBuffer createIntBuffer(int size) { ByteBuffer temp = ByteBuffer.allocateDirect(4 * size); temp.order(ByteOrder.nativeOrder()); return temp.asIntBuffer(); } private FloatBuffer createFloatBuffer(int size) { ByteBuffer temp = ByteBuffer.allocateDirect(4 * size); temp.order(ByteOrder.nativeOrder()); return temp.asFloatBuffer(); } public static void main(String[] arguments) { int err = 0; Lesson8 lesson = new Lesson8(); try { lesson.start(); } catch (Exception e) { err = 1; e.printStackTrace(); } System.exit(err); } } --- NEW FILE: Texture.java --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/examples/nehe/lesson08/Texture.java /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import java.nio.*; import java.awt.image.*; import java.awt.geom.*; import org.lwjgl.*; import org.lwjgl.opengl.*; import org.lwjgl.input.*; /** * $Id: Texture.java,v 1.1 2002/11/25 06:53:08 lholden Exp $ * * Just a small container class for holding texture data * * @author Luke Holden * @version $Revision: 1.1 $ */ public class Texture { private ByteBuffer data; private int height; private int width; /** Creates a new instance of Texture */ public Texture(BufferedImage tmpImg) { width = tmpImg.getWidth(); height = tmpImg.getWidth(); /* flip the image, so it displays right * There might be a way to do this differently... */ AffineTransform tx = AffineTransform.getScaleInstance(1, -1); tx.translate(0, -tmpImg.getHeight(null)); AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR); tmpImg = op.filter(tmpImg, null); data = ByteBuffer.allocateDirect(4 * width * height); data.order(ByteOrder.nativeOrder()); data.clear(); byte[] byteData = (byte[])tmpImg.getRaster().getDataElements(0, 0, width, height, null); data.put(byteData); data.flip(); } public int getData() { return data.get(0); } public ByteBuffer getBuffer() { return data; } public int getPtr() { return Sys.getDirectBufferAddress(data); } public int getHeight() { return height; } public int getWidth() { return width; } } |
From: Luke H. <lh...@us...> - 2002-11-25 06:53:12
|
Update of /cvsroot/java-game-lib/LWJGL/examples/nehe/lesson08/data In directory sc8-pr-cvs1:/tmp/cvs-serv18314/lesson08/data Added Files: glass.png Log Message: up we go =) --- NEW FILE: glass.png --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/examples/nehe/lesson08/data/glass.png PNG qmaJ\D£«¢EäÔêfµ¹Úôy^NÏEU¶¥3¹&L ]§ßqü>>ôÿ2FÑ"ÖD@J~ê`yàQî=], G:ð"xܳ@ZR0Ñ|ºz¼^ßö:-ÈðÂ3qÍØ Çì ²áTeøéhW#ëmi+¢P±zÀQáÍLñnU+·¯ÓyɲË)DVÝÀF)(WP7¡XC踪Q½ÖÓ% Ò +íWdª5ÚïÑMs8GV· й¥ÑQR·ÈÐzÃPë;4PWêG;fµxh ôK«)TÛ58 ß ¢§¶\o7Tèô<³(ÏõåâÞî¶m©ÿPP-; QtÞm§´V,AÀþ³1qã&.E $hK§óèxûçÞódÈîsbÕÎí1@â÷×ùÝm¿eaN(ÎuËßFaè<!7óY|-)ÇãTÊR!ä@Æi' i-20Yêñ~É~·ÙQNêCûHá]H#(hÁUæDÈØ;[j¾øé "Ó4eóøêØÚEÍK8"BeüéùHxÛ>ÎÏ ñADE^UpÍȾG³ÙêûsxA4éFä¶H)LVÇ¥`N`ýz2,tæS,â ÈÖ¥¢GP¬ëºT Æ@³Ê2Ç·éhtsuÜwdþ¡´ÖaM¥ÔïjµÞlÁ¥"¢HزÙèË¿ 9D³ÜÃÒà¶-%~8&e·@*àñæ_jëõ bÖ¿íé{¨ú¡MbN»¢ÿ5ùÀNáÆA>KuA:R*g5§:½àúY@°(-§lµ]Ag(QÄÐã^ÿòvÄ#67Åíön¢»±õwj».>=¢åLMËeB]ô`L°26iiô-TÆ/*yË|À¦5|:ò±¥ÊÆ<¾J3ìâe²Æ<æVZA.rʶAcÚÌg|ósWÅ|ùúö/ £1¸@Â:#³·ÅT*éêÿûj4êÐÒËôóáqøöú.få®ÖM87iÑà e+r* a:ÉG)FÇÀ)Øqçd§É½¥8îñ ÌèrÕöt! 0ëû/T§÷sòyx.<×m/âeùÁpæpØ=«ýH>Þªq¹Eáðvzjm ÒÙá¥ÐhIÀÄ( ;yqÕµ²Êø<2 l_ iÔ0hÔÎÌaÜd§c'õÉÌ.WÕDh¸)6à ÷ÍßwþJùÿ7='ï1µÐÆM/{Uëú18{´Ý[3 Å90,«ÎÉÓ×Àåo u®¥ÆÑ1'½ËFNµTJWëúÂsÔµ KZ¢ÎúFoì«ÒZiíûY×Xe¶¦î1²þ·æ¦ÃÈü9Ûe{ Ó¢³§Ücªß\.; Ã@õ+G¶KÄ ñ!ü¿Ø°EÑB];1ÇaïÇ8s'÷·1±º©ÊbæR>»÷&ô÷ÃC½"yV¼âÉB¸óª?~±Âäëq2hÜ,±Ì53-ý|½à<&REÉ*ÚàQìF_þ $ÒÆDE¾K%nè&80EZ.}]`|÷uz{Üßܰ`¹FScûQÎÍ|uª eNù+Frù͹?Æ·gûïSé3õh/+Þ ÿà¸\v"Á(\J¹&Ʈԯà¸ö]ÌÖ1(¥0ò÷G׬øá|ç;ÿÛRbp½»m6¼õs~ßÄm«Gùä3%t#acà8)qEø¦Y !*VZÚ´ç«ëåË÷ò}ïó^ZùÀChS¯ÝQÛiýy¿o&ãþDåa1ØËX8)ÄÇ úïÍÍë!âRG M+àþ$ÚleÞó»zÖ¹Ïvøä/ É> BVØhO¿º¤=³Çs}5#Zm»|Èʧ@ôúr°¶E*-ßÚùÉáìÄ_£Pi¿¹Ó33ñA&ª¤º&e÷å)ç7a´%vÀã% 3x«µmÞþ¦óÇ ¾,ª¤Cb߱ɬ)'¨ÐI(STÁ¹ÅýïNÒepPW^EAì@G)ÈÖ¥ÜĵåhLø#@]Ä»Tw×·?æ$I²,!cæpd>/ ÃPoÚ&mÚ2eLD'¼©zü/ýOÄó<Û@ÄÃ@Ö᯶YÖ´i¿Ù)Þ{!ïûýðk ÝN0LT¶Êj#eú{r>¼df§¡zør±KÙ»4xâÒF<i::%k ÂÐ PðBÇ3¾ß 1Z( òVðWcb ³Eëç8ZPò&?Þ.f±ÎåÜ*¶¨É·~¤ñÉñþÃx¬ò_àv¾$Õìl ~OuÎ^7 å÷«²ºþ.8Y~úôwzH2ÄûõʧU}SWuÍWï1Uw`ÿé@5ú~+®¤i@ev¢ ôN%¾¦ùe¤²zQÝì¿,Ϋö̵eðVPâáé ®ÆËuÎÓÝϧ|âO£`èÓÕ²½;)×%;gÿ;hÖ/Úúj+^~ì9t?TÛÁJà4dÀÑ8Ã[²¶Ø£®?öíOøíly¢O¸iiÁ5¨¶§àzÅ52 )ãôëDy8ëyc,E ¶: äá3ÈñÄá²G!I)ÝÄ-8D»ÈúVqÞ$hdèà;y¯1¢ê wX8S,Z» oO·jàì;÷ ùm]ÿ§&0þ/bWêýlÃï*: Ò7êõhÿ¼ ŸKh Ï8È¥³A eÝ£.óNîÁ9¾ÆÜãßmÕ-ZÔCàªÌÄ$©:CaÜøÀX©êßQJIÊ/\â½N ÊÅ:°¬#R,Yý vcßòo_ûqèjÎ ¬vðï#ÀF©ÎÙÞ:gÇ7éÌ0åsB¸0ø|8àkaq8'Ì CÁÈåEs\´õ}.åÚvjd'ßþë#V¦ÞDNòU¨¢¡»ß}>ß'¹vL¡Mx86ò¼nôËëÝãv>eã¥Ar®Ë*ÏuVÑ Û'uºy&^äAê} <ÚæÍâ=k¸BâòkhÅ!hÈwåàvhú/°PånyhÿÊ2Æhpk!8uG.âÔ¹(ò«¶ÖÐ"Oa~`Éüy(۹رÒDª!ÁÔ¯ÌÄÎ'`f-ÿX6¨¨¥JwÁ»uö½{ï~2¾'ã4Rêó |$ë°< \W##g}hE Í«#£«Ñ-6uau¦pwÞ#³3ÐKë#8®©+¬àA¦Õ°ùé ùÁÍl"×u>U»ýãÅë{ãÛ¯]» ÙÍâ Ô¿ÍVû»E·u<æT.Ê$¤g}òô6Yà Ð^¥Êûþ¯"%% m¯3q3xï¬cÒW@èsáça4 ,\¿ph6;Âpo¥ÙàrPÜÈIãxðî{ð=<¬Gq5Y(Åùï¡ítú¡È-§#âü 5ç@Ì )ëeÁ #¥&TÕNY¨.Í#7R»ÌS%µ` 5Vç<a4TI68ôk1¤s=°84a Ç¿qâªH QaA6±à\@bX UJÒÔÞÄ«x=~óÍApIËÄߤù¨É,$Ãüà§/!ôTã.ó`j´11ѶoÓ±Yäç2SN¦ÍÈ,B*ð¡«Ú»~âRÒÐó¸X//îÏOÛãëì¶:ªêÝ×e×äÉpVo;ñ]¶g¨òÜoåØ>îû§´È5SD${]¸ r#Þ×íOØÞç ò}jÑÜü&_½Êkþ:QÕÌÛR|ËÒHÎù©m i:ü ©ÁÛLüÀ4KÁäºiÚ: ihcãµëyoÅøß3¢òâ²Sô=¬+<8¸ïa 8°Æ)¸Õ¦?84{a( Û¸¡´B,E¼< ^<[*¢T¥Ý6]gâ¼Ã{oggÞ¯©rÈâwU&¡ø~Ä{ÇX_±kS°AëJI bB©"a5È+¶¨,FMmzÝ©Èr <äòׯêUÿVûù¸Y® ¢6eÜ]î5ÏÇþª8\ÎM¿Ü lÿåã"U·>jnÛk÷ÅɬsOÕ¶%Êù\òõL<öf³Ê:Äâ+ûvE×ÚXà © ]SÍ+lØ,üþ .ýÝ2ýÈNB±|ëhX1V¢´ñI¼T&Rh>; Ä@ß¶KwÛÿ£1Æ1< åkø¾11&^=x2^ P²îBi®ßÀ{d¾Ìü¦ßpT½i·Ä $òûëÊ{Æ#§ MþïåÓÒY¯cÀä/è$Ñù]í¸(7p:SmÉ1Êtm¤IS4tÅDÊÀN¡Åu·öTÆìÓãçÝP¾UzÕd0õpþ|5ô=a)\õ Ï¿çmoÝl:X NáAq-Ëjw{R¬OÅ}züppù»Êv¡ ôtó5êÍ>\O»Æë5õdHzÓ@^Ñ ñ#þ¾°ã}Ak¥YÌÙKà?G~WuÿØòCÄzó9ãH ue ¥Öõöíþͱ P,öª#;³Ë¢©µ·Ð½yW4ís²üD3Fj¢¨$˶Ë2iè)ÒÓSQsnFÇ=èR$P0a2±GV´²ø.`{,íÿÿí®B}áÿTe*&϶"|ÆÓ:ìK :^YÕ-¢=¸!PÇáéAGh)ÁÔNEP[ÕÓævñp× ì%o´·¡ëÈ7⹯Õ÷îø±î×EÝìn¶_=Y|-鼦¼¼f°l#cnºô6éb-ßS5?tRî ÍáÔÓÚöOóf(rÐÀV4f#´Ç/±¡àé÷0¬fûÏ¥rîMÀ7xyQiïóöý? Q f®¸ùo¾®mÍPP|.9ÊòÞ{dÑË^0ȶ"ü À¡µì4Áxór*Ô!qáÖÀÂ×r@Bâ 4MÚÚë7»¹ÙËwwfÖ Îú1µ²ª¥ÛñaN{¸Çàg*jIûÓT;å³+aÐêV+Gê¤ò¡ËÙ¤Sä}þ$ÕdY÷wë¢I§Ø È´"¦´ÏQ¼d_bþpÿWNÜSÍ ù@Ih;æ~×÷ºkíßÖyquSRÖPü8AtV*3r-\VU2`··ð´HgÁ^ðníã÷ ¦=ìÓëce6ãq@Ý K8[ÀKÙÆ´\¤ÓiCªUÈ,f?^ëÌ¢/)jT(¥u~qg ñ¬ÑYv§yD<Rw¦$0ÿDóÙI Âx·Ý?,,HVÅÄ?w_@yßÑx7ñ =yñâÁ!!( ËvÚNwëT Íöûæ73|6-n®o¬Fk ÀkÑø'DV tñ5]ßß=Þ'¿ph~+ ÃPo²f]«²:ë\Qæ&^^!xáÃú>Ân¼lµ[Û¤iÒ¦_ «Î9ßù}!48vç7w÷uËùfÛ¹6QiÈPh VM*WØ4]IJr¤YÍE#E!vÛ"ÞZ2©9ÿÝå ð¯EU"´©¤¡eϱXÏØPµØ¤ &»ö«U_4ØDê½îÊsÎÕí|¾ãíS?7E#À,Ø éI]¶ Pú^³ñÃìTíù_ãj0sÉ÷ÕæWû,ýØh:ÌöPK5>ÑfÊø-2_µúçBHÌHÛ É ¬µô!£Úr÷á|h÷ÙÀ;u/¥Ñ/«.ë1j ¨S$`\T¹@ßhQ¦¦û|dI¹Fû%Ãò0.æ/áäìO wPleCç²ù5Ñx7>¯ç#øÞyç óÂDÙfe´eâA_¡'ßï95@Õw÷ÐxÔÑ¥ÏÁh`¼?óÐ~×R䢥9Êe¶âàj* î$\äË-q DQôÒOÒea"²EÇÅ`5D£¤1rQsíC-z ²~Ûª|éÅ«M{éu»¸Ë]9a Hÿ¸Çipj´zº¸DÅî §6¥e±[3ºý7çdÇ'x5{aóáCÛ~sÞCüúj¸®J6-MµæßÖþS¨&Qû0H÷ ÕÔö¡èâuP~~èXÖj«ÕqâuÍ.ÿ^ÓqlÏ#¸\Ãë õ7Uþ[ÐÀ0K \ɳ8¼*OvÏáWçÍèÖªüäMüùdóiiãpÚfmÒ-ÝÊDd²]vôàwñcùD¼(;(²¡S7Ú¥M×üi|ßyË-$ÏóK~Á{;¹ø[ iBCfnq<ÿ*_ÁÄ&¶òíDJS\úÈ*ØÎ.Àn1°\ +#e¯aÖ¢.KçVe±6°AtãÜI¤~Ò? Ð\ø¤Ë¶S¯ÖÂusr¨Ý}Ó ø8:ü]m¯»¡e1kWy¾¨úÏà`઼8ø4fy{9<=$6&¬g0K¸ÙDONÚ7ÏC¤<U±ú.Ʊ¦§ÉçÒ¶IÄ9 ñ³(o7uX11 Ø´ö!+Eiuù@$=Ðê©Hºû7Êÿ¨´ïØa0Ä n\à@aiÖÉ:/ÍûGoߤ¢ð÷Ø·Ç ¦pl~+ ÃP_Ú4McëÖn¢0s W^ ÁñÒ;¼¼QðÏ Wlâþ¶iº¤mâÉà<@8óý¾/'ÎT·\§´Aêvoª·ãz h ¨=yÈ7³9©u»Änùk¬J _·:hÐË©Îq%mrF`îl~²1OðZa©Äô ÊsçXOd)å~ºrç¬Ö~:®?ß;OêºJà.Û .ÔîÕÔè86a(Æ'iRR$ÔIA¨â/:1AÝöÀ.X;@HÌ`Ä BH@å|8¶Ï¬áÙ÷{ýèHi>q·rXÏèËÖ ¼<KÈÁU@5â°i&}}¾¦1DhsÂ$NÒìvKÖÊOQíÒ ^Q T\ $ $Ã{ØÞYQMgÍX£ùæ·g*õÏ MNð=ýÄJü5ÿhv\^25´FÓë÷z~·ÃF÷'qäA<[/îëóyù8QË_BTó¶î¿½Ïvñ )¼SfÖgNíÂv}ýnkϸnXà0Ö%DPµ]¤I]y6âNã éè®ðÖÚ\Róêõ¼ðÚ1'ºô0²ÌZðéÙ1î_MrRÉJXnN'±¦ÈºAz;Zì¬Ì ù(g V* § DõÊì6½À!U°YFdZexüõtzX3¶;¤®¹ªùRâܲèçD&-©GÜÛ*%Eß-æ0߯2Q§Bà 1Ï3FQ h;SÁ åE¯Yð Uoã M"/øKèF±yX׿ åUüI»TT¢×(oûÙõÕà9¿ Èßßåá2E©÷I5>Ñ;4Oiá¥)H¾e@!pHcÚ+ ©ZsÄ@ ElW«ÜêBiÙÆîFr¨Lè*Õ@Ymþ±ãm^ã·á ü/ <hÆÏÀͰ`¦xy£t´ÖéàHuwÍÓ4æ_t,ÿÞì'W;wu[^殦Ù(ÅÜâ;`µHË4KÊ&7ĺyLúh3âs&8åÎÙe¶íú!Ö"Q<ÁÅ¢µB ÃMdmÓtkÅ)ÛüCðÏļoÃòþ(¢0ÜÀmí\[×5ë'õÉ9yÞ÷=G 00µO¯7À}Uh'A̱ |× \8ê2½´Âó5°/&¸\'á¦Ùj7§_¯é$BnpÏ÷?÷ø{t§³OFaÏÍhG¾Ñwß0»;ÃõÞåPENDÅÖtEÆÝѺÇöÀDzo.N×§Âàr´ ÿsnMÑØ Âx}M³Ôöû/¶gÕfÍeK Õ*gHEkù$soxÛͤåEÉz¦áذ<o§WìÉ¢ú÷KÚ)qZ,Ø8H¼Üç¡2©SåçëÄr¥kA¯G¼®;3áÆ[R¤Fêá ªJÓRà[1uÛª ë?6ó' ?ìõ*3K¦hvQæàz°gØ2Û\ûÄ=pH@'«Ìç}´þÎ/OfÝQð®-¥©ÝD¼÷¯¨¶®:ÄÓ7^HìBpßÈGû£hE¯´>;-în6[gø0õn_`3ر(h v.86õ»¸Êj/T{³láÕe©EY×*8^¾ÓyÒxàèá1Ýޢů5]ê¯^ã®XÊGxhGUeäaÔ °i{eeS§ý8j ½¡#xàAN`Çp¶¶¾(²ZZ2ʨH¶b0¸}tß}íÖªà¥Õ¥Qðæ/¼xìEÄ"Ä*ÕÒlµû ÙÍ&ñKý¹Lo¾LÐQÝqì$IGëQÈþà Î,ª¶,ÕvußF.ÁmLÂÑí5jÀ¢ÉôZØvÛÍ4ÀjNBÅ1Îtã׺,9ozϹ·ÆEiEÓ¸Öý^ë9ᢵnè1h:|I._=S(ÛTRèGKdgf ¯¹çØÍÞͽ&ëíí?΢ë{½¬RÁëÇ LµÜÁeÝ~5bjã¦KUø@Wß±Ag<Y õDQO¿W§¬è³ê¬ëæ|ÌØät[ïuKnA(8 µRµjRÓ$ݤlÖ7X¾ùýf¾Yahïøáñ>M`4ßu *y×/E26*2<BÇɸ<ÆLgu-<Ïc4(¥à\1è&vÛ]ØvT6¿Å¥qÒ1DÐð§ôæµ»;à§I¥T´¿ý¤©ÑH2ÜË«áõøðåLÄCæ)f&kè$®'ÎJIÛ»Ùè<ÜÚÔôG{*oÏÉ|eÙRJ6µ +çëí9 ÞgE²$iÊì?*pUFɪHeÏãÌ˳ÿiN_6Z³W·¡P\3©"ô+ëï»Ë:!ÛJ´¸4W@VÕP))Åhu!V({VÓ¨@×ÉÏ HºRfUmd?µ&÷ì¼ËMðnãö·q{اÒòc~%ÚU_+|]58:%©ÙB¨Ù°#ÂeÙÊ÷ùËáõÍtn»¼¸ ÒøfòÔÁ¬íNE}³Ú FµÚÃXvóÉÙ°ãû*µGLC±G3òøï BRÛVª¦ênÊùÄX'4¤:8Kýà8Uñ*§Ï/«A të ¼Ej´(à.tj¶²E¿Ò(ÁÙÂþåª(#F# ÀèÌÏ$à ÒÀ< Ið/*åz½î~Ûü]@Npö: Ã`µÝØU¦mH Bí`DØaåéy¶.L : ZQþ¤IÄqbó¹,Þ<E¾¹Ç>¶9bF;±eCìC×apSrÊHÆá<S»þM1Y0è!Ï ¿×/ò¾Ç: ó`Ù³íËMÜÆ«Ðiÿ²þËMù;ö8£çgöà¨gCJÒó4ñ)w\µ6,#Q )"`p EjT<ÅÌæCÝ Äæ¶¹ÇNàGRWçüO ±?ò?=þ`WRH]¿½ ·L;ÓN BHQ7Æ%jâû &î\¸0ÄÄ &61#" i;þ0Þy ɹßÉsU,´*¬Xm9ÅàÐ=DÍuöËË ¬úf³Våf -õÔ-"ÈÀ2ìyÜò[A·oh4µ+¯¦qna1¯O¹â\-EQÐÀn5á¶wK°=ÑÃ2%5SCLI°«Ñm˵YbÝ^ãñYpÿ¦*uHûØ9¦it3Vh,×,c~N qåäÓ¬ÐyÝ®Øî* ½0Ì$Û1ùê÷'ÞìhæÑÌ÷º/Ñ÷â3¤¼îÏNÐDL^õõ3Êk]4À]-C×õèÀ§V{<½ûÁ ¯ÊFúߪâbüµÀz¥~+Æ·Õª@v0keCÖ¸*ã¨í*ÀC`;Tª¶>ìtü³éIÂ0ûÕni) Eh â1¼yó{á¨ã¢45HÛ ~°»¥îò&3ï3ó¾u @i¶ò`E åeSÅVЩ ÀjÚ8æ\o þ¢PAß ×i»~k~K)ºþÑh8ÄÈ×Ëb(í]êX>Ô¥¶Í·QR'eɳçÉl|ÍïÆÁøeÐ4p0*Ò±¤Æ¾koÌl>=ö^2b´fa§?áÉU äÃ)³%ü¾ÒåÆ^öåúk^æ«3ÊÌ3Ǹû°ê¤®ë/Áfú]í{ótJ^)kú^8U%\ñuq>4-Ó«Û;üûQJ**µ".Ëb¡B騴Pm¹Ô,Îrmüo!ReÌQU[TXÖ Åpp.= QîôÝ>ÀP`diܺ2&ÆÄlâ!Å >P òj§-µtêLï?¸÷,î¹Éwþ#Ev- ÈpgSÏS×U$òaC"¨³å`,}#üÌûõõħR[xÞ:æñÚ]×bi0ÁÙÃßôJ&ÔÇñ£<ø8K·$ï´fÇÙwÐñAfW÷Ï¥ï勉$ø*ÛGê*1ñláîÓ 'A=Íû½ö3:¨ m'Ô³ø¶Â«8¾U9@ ?7;·Ì[2ó±wr¯7&ÓC[³ÊTàÅ¥»Í¢ÅEÆÚMÕá/Ïÿ®¯ e¨È Ody`Á[â*¡ hP wT9Ku. ¤xídAd¯(K¤»¯ Õd È ÕÜÊdj -SOL ;8WW³·RB£úùÉàæº!%JõËöx·«¤ß7r§$uÅg-) öK¯/üw*óüç×Â[krèzJ>ÓÕãJ^ £s¯ÎxÕrAe4¡~pa» M6AÐ.¢¡V>G«¶µ QhTcjs;?ÝAz ïï|çãå~@@F*mRÚEñJÇ"u8öÞç8lb^ûüÆ:MíÄ!˵´/¥¨b3á&ßp<]ªÏajI!ÊùA!iq|۰ǬÔ{\¨fYh hÏ}è>º:QîIG×A§? {!À Z¯U'Ï<ͯ¨;ûggóêÞùÍÆAqi÷BÙö¯mÆÓË'g¥âióê²òd¯D9³Ù:i©P¾ î·tû&õÞs¢Sde!*EÕþ ïYSh^(ós»&Ûhw;¬ERéUZ:¦ 9?r-ô ãg¸'§%#â <t<Ãk2B`.&ºíÊ¢éux+úÝÿ÷,ÏtûÿsÙIÂp[ÚNK§@ÁPÁ¨ !qá°sç°ðeXêÖ'Ð01Ѹ1n½ @²P£E((½ÍLÂäääÏwÿÇÔya×¶A<éK;¢ª4ñ¡¢¸µò)Vf¦TDÀNw 2¬ABYPÝæ á AÒ¢æQÎj$ÜVÎpq\lÚ!¿x¢x>*xdú(ûc¼ó×éÃ¥VíF.*_^?5?Úbf»pPC Lâ½Ø9;-Õ µCa*1.21O®.nîáÖÊZ*+ãÙõxX>®g÷öÅÕ³o¿4_Aëù.-§ËÑtö§ZEPêb% ½ ;¾UPÒ)»CX)³7®7|LàY®î{ÁECAQ^`§Ä¥Ù ÃËd4mÖZQÛº©` 7DßAtáB\»Ap¯/àÒðt+"ZA¥T´ bÞÒ¤¹´ãóÿ?ßwÿ©ÄÆÕ3ZÍc6:¿D ^úÂNd6p"dÐBÂDª¤Á@5¸D,ÅÕØX|Uî2-)äq\ÝCÔuq¢-3®%jäHe»n I Áèö|? a.QìÐú¼2²¦ïf¡Ø¼¹ÿ¸º}¤£Y}÷ 219²Ùµ%·®/3<{'cQMÍln¬ínÌ.¯O§Såç;¯¾CNn1÷R ç?µ\J¤ò¦»¢·õLHļ¨D¹JLójÐs¾ïÄPõõÛáöÞVÚ8¥ríó«)(b%UO)3¨9t1ä,,sF|ðý ô ÏoääöêNQ©ùzôîè°§Âab¹·j3ðs)Ìtêj£¦µ)±(º°mq ßÍtÚ^·ÆC_yÛjCEtÄ»äGo ýûýýýýôüô èøíø÷öúó þóùí ûùùè Ú 1öüúùÊé äðûô572#Z^0úïðÖóÈÏ õTRÒÒæ×óüDae0%ôñ ö"(F"÷0B¿{èâ;J éæÿáÐÖÿËÔ%í×%&ñÜÿ îëôþì øúýõøóÿúûöö õùûøÿ÷ñÿë ÿj ªM«5M¤éKLô3\.÷Î=?Øh8ù;µüÑ,l£YàgIÓ>rÚeõûª4 ÒöJ ÈkînîBR^Öö_õÛ!¡O×ʲa?ò¨¤X)YÊ} Ù3]þù±Nsm5±µþ~t£ìvXºvþ*óÓóñ±Ö ZªQ·-£q8&9·p±¹âã.ÞÇà±¢tbi¥v==;Vr÷âò{ºcé´«påk|b¶?> ÏnQB ¸¿ÚäÔx8@75-Z7*½Ùåìáv^èÑLöbáÊtñÖ] iMéÜgnwè\8ÜsÎï,þ?Îá°%âãéëéµÌY]ÃÄ\'âR¿k^¤¥! Kª´ùX{ý³ó&Ø»jzm5º°âhª¹ZeTB!A¢ !=ÂbÀ«íoÖתÖÊgÇÊúÖ@0bi$Ì|·.¶¼T*ܾLoî$q âÇHì½V +sÄíîs 3¸Ó£D7¥Éйcå©6þÓ×ÒbOáá¶xw&9ë'á{~QîÖ x "BÆùff_ÌCbÛ[ÇGõ×ÇX2êÓF1l¸Î¬ó=O+É£Õ yÞG,2 BEe³[5÷WF+ð±ÀE£!à¿t5- Ã`¸ig?ÖuÓMeâ¡LD2ô´ þÆ áQÏó$½ì" S6¦ 8g×Ú®i4&óKHòæÍó¼¼Ï®éC^rfSÈRÞI¿L3UÂð"3Ø*Ð>¥ !£0d!)1Ý2ݳð§^Õ³I-`}Ô©¶íãÃÆýmÜÁýG{uØ\vecgwÏo¿:Í*pÞ(pK^7@_ð|¹RÞܺ¹¸úÐ"¾Ã»p æá ìclëVîà ¶2öììÎûýx)¼zå¢z}ÇkdA¹&ªs¹Z\px±d,ÛÚt¯yî¶çû TÅ¡Jz$¢$6tdlBa¸ !(¶mÇ Íy«¨*`«AÒ Jÿ`élV8Éî6îG[j¿Ô ÅBÁ x|#Ãð&Ozð ¨E<(~!íR,ÚÝn6Mb">A` ÿÌ2óÛLƦTrÓÄ"%d@@ªÊAIÃ`WðX)cX £ bÁëËE yÁ åÃF³Ûé×í5¸>Õ- ÀÑùë4a<>7±ÐthEAB !R%$f&x^1ñÝ Ì0 ñoCδNÇu̹/àåü}÷»á¾k-¬ªPZ ."åM+òMLÜöep'>ðp©§ZnEÜPE|íX°THÄ ïOEîÃAÉcòþ §>"KY{UÖÕNÏ>ÂÉ×ëÝúÛ¿ÆrÖ ã¬*·´¯uñ°PÑàätxq9¾îwû½DiÉЫC ihî"v×>Ü7ÿptþ.ÃPO¤i«×^ç · "8ù88+þnþ ®ê_pà õ,zöÚ¦Mß»=Sà½|ÉçèsV Á¨ +SªÛÅ`= &kS åÐiît1³BPèwÃà¥:ï³9 u o¦¾míxCùxØÖÆ_¥Zxgùê¦ÿpK^GîîþC)\P(©ï}Ö_ÎO¯¯n>./;Û~ð0.:¬sÑKÌWÌ2ÒþO¿&ãýãÂb±d£û*C%k]9}|R¿Óç»ûªTl -E¡EkÏ3QÆmg~N!ri*É×6÷kàk]F&^k({´,(µ``ë êÁÄÃîÃòï¢<@êJþb ¤¸ôXùãÎå]@ ÕaX ±ÿàèJV"hgëd¦'Ä0"*.¸GAñ;ü (¨P&Q0þ¯l±»óÞ̬ÞÍ#.':òlð´åÜ¢íFtqêSve2SöøÑÈÀô¶ítrâ¸M_á̰B<àh¾ ÒFÆÊ:åä"ÙBé¯R«Sùm-×ugÑh &Ï/ÞíÝðôö QEweY×ï©Üj9A<Ù?EФNBgöþÛ{z½?ÌÇçéápcäÀS³ë´¢Ñt Ä8$kt%N¹Ó ËÅÍÕOYÑ1IßT~ÓÙÍb6ôº¾¡^S$8¨»¸Æúk!"ö"íûöò» §åÒ+>«ò«°z÷Òz³^¯:º¸º>>Þ\~¿½Îªåt|÷û>9>;Oó¸[£*̽xÅôÏýÓt²2»Cl°QÊ,RYÎtb¼PtSÌߢXa`N¼ålÖ¬ÙA²Y[Ú,*¤ ÉCê^°xkÔpÂñÀØ"ÃA·í¯&¬L:mÜÐ84ºï_ ÃMËÔLj[)£ êB}W¾ Èl|_ÆàÒ½î ³W :3&¶I=§n³ ÉÉï$9°Rëiðlmd)ÜoIB¨ ERâL Ìôa-¼W³j@Ù ^$$ ÎGH7rphã9ç[»Ìÿi¾ï»¼à>h0ÄFÔ\É:gR"½"0 ¥tÍ7BßßBÄe©ComÉ¡¤íU§çËëáάvBWÒç:ñéS«ÎA.ñ }B·8λýþݹ;?Ý'·Éä@ô»«Ë=ÞéQ©¤y{/>ßgÏs¯ãë)¢¶ådÖ oOå =Oh s^]sô/õq»Ã0óåzI^4EÚR8º2Eë8° MÞÔpäeÆ2îC ^Å#>wO¡¾oáID Eu±Év]ãLû$ß7É÷ _× lAPM¿3m5Ö¾Þ+F=çaCòVä(Æàf0@.e³hD,8¥CßâN{@Jɵ$èDÄ](ÿB¼Je8ÿ¨ RA-©ó¢kYèÜîÝ<»¹<?Þ(³£Ã×¹/øPzCXÆ(Èû¾yéõªµ¸²:^Ädruû0Û;=o2þ®Þç÷éôþîúB?=Î~Y¸îFcØa=é yÏ`²ÖtªÈÂÜLÙhm´_ö§Èß4Ró*NeI½ðÆ@ëL¸Kæ2.è÷3\`Re¸V¤AÔ2ZÛÖæEjæ\~U¿ä ÜXzG[NWD¦ù£³×i¢°ãÄùi£´Mª©PÚ.BH 1T}Þ b¡ò#¥JXIc'Á§»'[×>çÞëïÌP['53c,§:8Õ ¨:[ÛñFòüý1^¯¯ï©L {rmÆ$pb$LãnÒê_ e!¤ª×7 _× ¡ëºzU¦Á¾>½ÕóZl@ªDÂsuGÙN«¢ÌzØx¥£)ǰP7q^FmÓ28¬8á{!-°3|ºÛ%a¸5º Á ó2yÈÇymü^&4%¢ï¶:&B}+#]àЧhh#нJ1XµA^E1Éü8Òhn,³MY3cÃGÉJj©góU5VõÕM 8l :Q¡` 0_ñ@É@ô_ Rûü9¾ '®\zU@£?â¬aö¼ÞÙ=#'"*v+6k°)ç¥mpÂÀ%¦¿¼FÎ&eã-^ÇG?7Müu¬âdæ¥bEÐ2)tÈÀ!m9ذ¤"Z%9Õ¹ÚÍv^ º»*ï.¦ó¸ë"-\ ymòørþxNÅ:9ôâ"?&Íãer6Ï:g¿`óØÿÞ^ØævËk/~ ÞP²ÍM]Ú*~êâWFR^v¨qVVÃàè·'a|KõªQª lÌ·Kö²¥ôíâù«/³Úwm]E Sò¨O,ÕÒðÇ7H[j«+º:³Ýt3aÒZÏe,8p Rãp|Úß³Çzøþ/ ¼0¸ ìR;.ëeL]]ßÛ¯¸*ÓèËâ1xTµeºfÕè::ÕÍ2f÷¯§Ãáù¡9Þíe\®Ýéïâ|-yÌZFÀÁÛçËòj.ÉP3¨G¬)ÎZhÔø(&1èü$%Ä»ÂBÖãÐyϽ'ĬhÝëÁÚÛª(ýíÖÚm]tmäyÅ `ç~ì{) +!Pz-SäZARÓÍ ÉéòÊ~ö¢Í1¥¿-$(à£èºöóãÏo}Â8°H:w¤a(J¶ÉÙÌ>j 6À°6ÀnèY5©4;-Ëm® U)½9÷¼ýy þ§ã¦¹D¸T«»ùmaeEÝûh~[E& Ð 3®Èѹgò÷'= p²9ã=Hª¬GÞ~ã@:Ý{IàkU3¥ÁÛ¦ÈÚÈJà¢ÂØzÑXFõW;I~DX_Ás¶gÅX±®m®Ï»Ç§×çÅÅ"{¸ï«Xº'G!»M/BÖÙõr¥&§$æ0HrÊÅÈBê¦ Ðrp9?ü¾Ü|¯ºg±ÕúPH®>xÛºu·>Ã+£wº]îê á9ÍR·²jåÆßl"QdÔù 1¬© AYl ë®rëíÑ¥Ý]½¿}èÀüü @Ò$5Q$(ÚS»ñpï==p¼CgܸÁÖQZÚ!à^ Ydþ/ïeÏ+ÝÉ¿ÒírDrçÞ_ë·S¬{«G ýáÔÿ×¼n;tÄ$Ùv¶»"\úGÆ@9¸(½ìÙ]é\ÆC{§®«O ¿H %Õ njͯ Å¿(qqFËGñ5[½o$ò¥E±«¾Uëzã;N]Lè5´Í;³¾èάmc®:ûøp4Ð2Joy!»íyêé4õ¯&vÞ±õÔpTîôdÜ\LERÉ3<CPMWØÓógó¿Ìy¢v±1#U¯M£½lâ%ÒcLo():zÔ½À[EX0àÌÅ:pø 꼪. n|ý£³Éi¢°'S7 ´´E®8 _àÌOàÈ@rªPÒ<\?b;ìöêËJ¼;cgPì µ¢RaYsâÖ&¿I>ß¾úmâÁlKôõ6×q?©ÀÆÇÒù¦×LXSôY¨ÄÏS4ÎöôcQ7iVµW·M²b¦¦/:PÙ®HX4õ(z[¹Z4¥)Ù ÀvdÏ')ÿ'â÷åùõþ¡ªÖdjꨮÓêÒhê .t£¸àS®|;¡+Ñ "Ø JÚÆÔ4Í$LÆ3} ásÎ3ÿ1;1ADlLøo^}/NÇ{P) ÜïÍ<mvüY 0ÝØÂítÍnöVrSÀ¦à¢ÏÃç¥X$ßdÅûùyT¶Wr¦;þHÈm÷C¼Õ»$HN¸*í3h¶5!â> ç£#¼¥ØõÌ|õY>>½ÏØÞg4 Ç®Àuõ,ÎW*öA)ò Ò^å(_®·6 à NGÚïEò7ªÔ<ëCk@\ÇvàÂ(¤¤$>Ùm¦w7·è¢À ÞÆq-WpÛ?$¢ú+ T¡ Ð}WJõ_ HTÇ¡3zaU·UAá<d|,êrmX¦É~*Rj](åB =2¼z;òqcpq/È×ka(êd/³ãô"+W;»Â]¨\§¨¯lì¿ Ñ(\-B²¶¢È)Îèýûáîåcüû/ J3RQÞ8cTCyáF³Àâ%Þ>Ä#¬54¦Xã!S4-%)ì;d˽qqL«»÷[q¾â§gÞ§0ªðýd[D!e÷ô°6_Ù08+ôò ¬ï¯×½S¡iQDÊÑ:O.ð¾PÜ@4BÞ¿åͺø~Uä(¿t×}¼R5:êÏa¯Ç&Dln¬¯ªRåYÝtB ü@2jOeFSÀB¿<·ÜÖiáùT+¥´Ö¢û6mÓìîâw²Ù^Éá=á8ºba 86NÓ¨EJQQ:1°3Ubg(|?ÀgÀPÄÀR 6ã8{||öÝÓ=¿Çã¡:;=¾¿{^ݾbª"Ô^V%,KK(»¬Gy]5a,HHC Ñ ¦`Þì{ª+º¤A¥%÷;Tl¡L`_°õ!¶ûoF·«8ïæñþ{öòx}õ4½±Ev_ÞGô¡ÃÖ¾*)+´Q²¿Ùæòâ|>¤uâNfø ½uO=BÇf²NÏä^оÉl§ÙLæ£eÞò³o زeFYÐ"èÒì !ÀF\';»ÓÄlô¶¾Rt²h\%DªmmQÑp@ñLHî5Ô\rÌuEÛ{aåëuI Ö´MFÆü¸ )9§³ñÉò¨,Ú?8ºva(oÇ,K²Hh 8ÀvôT{Rp!Äh á#6q>3ô.léÍ?34®ñ3$à´g(6ôê?^oeÈg¥J\±ÀúYR'¥ãN¨!Ñn ow7kÅË&Lc2Í©ObtÄÙ®\˾ÞUeöþôòðØßßÕÇc[lûNefé¾SWùM1h×Êßs!k5Æ)Ð\ÓŶ(QÒ¾©áU<FuÓÜ^æW©,Çñl©EhqÆE«g,¨}Y'i}±N§/ ]QÂjL^ïLzܶª2£Ð lè3°J"ôI³³j7ô®·= è<£Ùº§ÙÐÙ(,¨Îqì¬þàèÚu" !ã\Þ'"ñ¸h(¡î>ÿ£¦ EB÷ÐRÑ %$øìıfó#{vgÖZïxQÀ×"§hNY¦ Tâh¥$WÉ ¡ê?)þDZàOy²R½R¹Xx¤1½.ip3iMNàC7¦ab¦îXPS{¨£(¦ë±8ã7§Ãúíõ¥Ûïýë»î~çºiRÏ6òÜPó<´_Ú|÷ðøþü4¢6Ï¿ c "ͳì;Ï«~è7G³Ù"± ʲ/]Cº·Z´6la,Ýÿptí8Ã@4±ãÄ"A+$$$Åh¡@â2ܰbºÕ:µ3þ13x>o¬÷Áò¦(KÊ kòÀAðP7oÕ£>Ín¶ãÁæÄW4ñ¦ç{3$U j**¼{}Vg.í·ÅÎ+)ú¸P6Z©{ÈÎ ÇöÇ' «S¥pENiG*æÜuâúåîõI<ß¼ÈÏ7i4n¤rlN.Zqu!xOõ÷býuß÷ìay¹ºmzoENn±ª[EQÔGÚ Í+O¤5ÝÌÀÏ]ÂN³ëtÆBÛcì¡(qâª!¢þo#$+¥ Ã)ySAtÚ´¸j¯¶ÍÏoÑ®ëNÎCpXc}gùô/ (ÒÌMBcºî¯iÃR?86Úm¿®®U©§&éÄ]!ë <% xX³gêíì¥Ø ÎÝÀ ?Z>¢½úì%&g=¨CD±N-YVzàæ QÒ´>(ïnï¯ö_ï/¯a§ô+KP[¹ýÍç¶ãcût¹ÝéMyBEJSÞ)N ³Y"15. b¤sTÁ±É¸ÄéHNZI¡¢«M*$hùWd¼3 !¦åçûMÎC|½a<Ò`°i[¶À0¼8$ÙnÈç`®Ù~¥µæþ ý<RüÀѵä4Q7vâ$MÐ!TÎÍs°`à HHeAiIK:¶óX²=~±Ç#øÿ߯ðÁÚ^wP¬¡;zÃå µ0ãÌËR® ±Ý}ªTý"O.ð~÷&Î %áa<xf0a¹tÁyÛ9%ÂQ)ñ0ï¶ ìUóBUò`Øãÿ;¿'ñ7üí½÷ü Àѵì8ÃÀ.4! Jýÿ_Û«ª]µKy§;à %öÄcOìÃK >C`æùCQ3U#¨uIH «vnØÅ]wy<_,èäd&}A{?ǬbR>øUM˰¿@$¬Êª©²A¼¡Ã¹à¨îOðY õîe} 262Âú`Ûðºwç»]ÁWczþÚùoò¹¿n OK $ ìÔ 4>Ä4&ÜhX,HvÑBµ"ÂBþá¢ØÒ*È0 ñá-y©ÿ²Ï0wñÖûy6ß~ò·ïB<êæåÞ·¶u )É;`£öD5ZO§@5òQÓ}òz%cðÔ¼¼6Ïø+9Nó¶oÍçûÖ 6ÂÆoNN÷õãªày7ÃôÏתC"^N%Ë 4õÿàèZv çÑ4IÉnEBâ;8ó|s/½!!ÁT8Uã¤k+f&×¼ÙgwVvv¢9Ó¡ÆÊ^ëýáíﬧU,:Pñ¼*ËJ´´QbT*c;ÕÁå¹DL¹`´ôÞ¦Tò/ÅýéÄv÷u`i]0<pÒG^$JMÓîQÑÌ<¤8/E¤h¡µhKý×ùPU>ñóËk)ÅÓc8÷!tÒ µÞ_dF×÷×á§ùÎâý|5Õtá5H¿¸#v×4g§´%çh8ïrKÙªÖZ{[o°jøvÖ8ê®ÃsZqU¶}Ø<âó£ ÌÞBû=)+[¶³Ëøèp4>;¿¼¦-ït|ð ¦o¯/eñ}è®"ãZÈHif%n/kMðTzBÄZÊ}ÎeÃý-à~ÙW¨0ØÌ7;ã¤l\´7̲ Ýèø@·ýÙ,YÌÙV¶¬&B2ª¾¿f}&5 Ogл!4¢õRI:ÉÞòÇÎUbÇÓ~Rm)¹û«çiv'n'©Tµ*¨T Ä`ªÄïn7Ø @hHÛIìÄ<÷x¸wïîÉwM6Ù H³¨ïd6=G·iï¶÷ÛÕéh0^¹mm½îLõ'[Ð!A» %þÊB¼R ¸}1@.= jªQ##w6ê¦ÍÙ:¼Å\ã8K¾QHrt¨*õ¥òß;v¥=:is÷íâìæòjÇÓLNDÏ×ñ|ºY<ü>3g8¡#1Å%5ÊEAÑ-nCêq½2ÁdhT2D°ßÁûoÚþgc»|ìÅÆP_7߸Zî'G J£Üç s f~Þÿ|òãÅ|<¡éEYiS~ÕÅÚuG&Ú$bÈþf¬lþ é\v(ÇC@´ UjW]öÿ?¡;¤.Ê¢¡@ÛÄéø[cÏëÇÜKÌCMX,oèã °g¥Ðnuè¤ ÓéhÕ²Ò¼«í¡w®Ò§ÞÒí;ÒNu5V¼XïýgÉ \t6òøpÿ´Z=Î#5ÏÓ$e*¿B.×÷"û=ÛÌ3D+V³2"Óä¹)Bj ÖÅG׿³cFÈ\̦RVq³ÙoGçXEâÞë,äTG§dçúP\r;ú¶´Ø¯?_nê`Y2)Ú~6ê%èÚd£PBNUVéb0ÿpt.« ÃP-Éb[Mô,ºëßw×Méª.)m BÒ4ømË^÷®`¸sFù«LRÊ,å²ÁN;ÊòÄ.ÝwıϳåApjq¡ Ù¬°`iÚ½a¡lÒcE@};N ùÂcjm®¢[ÕIeKvÕ_ÖÁì-yaTÜñX÷¸= ïîgÕ ¾£+eYNF±ôWþ ÀÑÙô$qî %DCxÆHâÑßTÏÞý<p4ÑcÑvtļ»ôؤiû<ÿßóÒ*TWB¨t$ÒÀßo}Þ1âMlÏ3HïªãbÅi(hA·ã±óжíÑË,q9:ZL®5pͳÇub®Y¿Í®Ê{»C,pf»"ØW¦*VÏJÍc©K®E4 j%WqlÕè§³á`´üøº_Ìè ¢p÷èåõí5<×UßRAuæÔ@ÖÂX2Ï @}DU«óYdÖg¢¬À0\Ì _´®îͳ{s·,¸6`öáþ±xÒûrÆaZeLùÎpE½ ιmN-A_RCJ¢tWÐÀ}þÃAÿ£Ö ´ºË9Õ/¡_nÉEÑê½ÝÍäu 'hX5xy%"Ǿ*Ö 9àïdÝv>³:¦½Ç&ºËýçáýíc§«%ÜðÙs:N\bÐk9"ÌìD;(k/1N@Õ@*>¢Q¢^ñhÎÛu!x&2 =³]e>LYn*¢;«Ï!/¹å6å±ê.K+s^¯WO£Éx<ÅûÔµ_ç Ô£ì¾4[é (& ·¤Qg'Ó(?¼ñ4ÃR0<r×8)BäÎ:Ðõb1+eÑôíöýFárVìÖëv6YÎãQæ¤*Üéñ¨ªJ%i>£é´sp?o»ÏZé²ÝxLú' ࢤ{±2ßÌd:ôc~.¯ 9©Æ>ÉÀhcçü}]û®{´P©ezY7/>'û/ A;[(8ñ¯èéD¸IëZ¨áo^T5íîMUs{ÄßKz|. :gÅçqâ=/½]¼ÉXÔÔà ¥-H >öñ/Mu¿ïóÌå¿7H=__>&ÓY´CH@ïÀÚÃÍÏ zu°!V E¢!J1#D6Üã Øßóû\Ý«Èbo>Û!luÖ¼9ܯ¦gGì Õ·Ñv>Ä|.ËB¬Ê¤åktÏåc¡ÐÔ6ÍFðÛ¡¢ÌÓóü¾iΧ'ªò$¯ÿU.ÛÎÉ&°iWgº¶ I®Sîá¥Ðû2h}¶DhtKå8z°Ï ,R=ÞÍÞÞë«ëSU¼Î®¾W_$½Bs¹\yqÕL Æ¥hP¢ lS·P«eâö¼æ7·»;ÇíÔK!Ró8RÖ?5=¤~Y,øW·51úÍ j44´^g×°ÊI>°ìk±Þí×GeÑ ü |ìúd 5Ûh ^ð!»b4SS »89tÌSB,ÒJP¾~ðºZÃûÛÊêËÑä$6C¡\éüËSùýD÷KiQOò¥Ñ{ çV]Yóû7ÿø ×?eLWyµ®þ |
From: Luke H. <lh...@us...> - 2002-11-25 06:53:11
|
Update of /cvsroot/java-game-lib/LWJGL/examples/nehe/lesson09 In directory sc8-pr-cvs1:/tmp/cvs-serv18314/lesson09 Added Files: Lesson9.java Texture.java Log Message: up we go =) --- NEW FILE: Lesson9.java --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/examples/nehe/lesson09/Lesson9.java /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import java.nio.*; import java.io.*; import java.awt.image.BufferedImage; import java.util.Random; import javax.swing.JOptionPane; import javax.imageio.*; import org.lwjgl.*; import org.lwjgl.opengl.*; import org.lwjgl.input.*; /** * $Id: Lesson9.java,v 1.1 2002/11/25 06:53:08 lholden Exp $ * * Moving Bitmaps in 3D Space * * Credit goes to Jeff Molofee (NeHe) whos tutorial this is based on * * @author Luke Holden * @version $Revision: 1.1 $ */ public class Lesson9 { /* Number Of Stars To Draw */ public static int NUM = 50; private GL gl; private GLU glu; private Random rand = new Random(); private boolean done = false; private boolean fullscreen = true; /* Twinkling Stars */ private boolean twinkle = false; /* Create A Class For Star */ private class Stars { /* Stars Color */ public int r, g, b; /* Stars Distance From Center */ public float dist; /* Stars Current Angle */ public float angle; } /* Make 'star' Array Of 'NUM' Using Info From The Class 'Stars' */ private Stars[] star = new Stars[NUM]; /* Viewing Distance Away From Stars */ private float zoom=-15.0f; /* Tilt The View */ private float tilt=90.0f; /* Spin Twinkling Stars */ private float spin; /* General Loop Variable */ private int curStar; /* Storage For One Texture */ private IntBuffer textureBuf = createIntBuffer(1); /** Creates a new instance of Lesson */ public Lesson9() { } /* A javafied version of AUX_RGBImageRec *LoadBMP(char*); */ private Texture loadImage(String filename) throws Exception { Texture texture = null; BufferedImage tmpImg = null; /* normally I would use StringUtils.isValid(String) from the jakarta commons lib, but thats beyond the scope of this lesson */ if ((filename != null) && (filename.trim() != "")) { try { InputStream is = getClass().getResourceAsStream(filename); tmpImg = (BufferedImage) ImageIO.read(is); if (tmpImg == null) { throw new Exception("Error: Got null from ImageIO.read()"); } texture = new Texture(tmpImg); } catch ( Exception e ) { throw new Exception("Problem loading bitmap", e); } } else { throw new Exception("Error: file name is not valid!"); } return texture; } /* Load Bitmaps And Convert To Textures */ private void loadGLTextures() throws Exception { /* Create Storage Space For The Texture */ Texture[] textureImage = new Texture[1]; /* Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit */ try { textureImage[0] = loadImage("data/star.png"); if (textureImage[0] == null) { throw new Exception("Error: got null from loadBmp()!"); } /* Create Three Textures */ gl.genTextures(1, Sys.getDirectBufferAddress(textureBuf)); /* Create Nearest Filtered Texture */ gl.bindTexture(GL.TEXTURE_2D, textureBuf.get(0)); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MAG_FILTER, GL.LINEAR); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.LINEAR); gl.texImage2D(GL.TEXTURE_2D, 0, 3, textureImage[0].getWidth(), textureImage[0].getHeight(), 0, GL.RGB, GL.UNSIGNED_BYTE, textureImage[0].getPtr()); } catch (Exception e) { throw new Exception("Problem loading textures", e); } } private void resizeGLScene(int width, int height) { /* Reset The Current Viewport */ gl.viewport(0, 0, width, height); /* Select The Projection Matrix */ gl.matrixMode(GL.PROJECTION); /* Reset The Projection Matrix */ gl.loadIdentity(); /* Calculate The Aspect Ratio Of The Window */ glu.perspective(45.0f, ((float) Display.getWidth()) / ((float) Display.getHeight()), 0.1f, 100.0f); /* Select The Modelview Matrix */ gl.matrixMode(GL.MODELVIEW); /* Reset The Modelview Matrix */ gl.loadIdentity(); } private void initGL() throws Exception { try { loadGLTextures(); /* Enable Texture Mapping */ gl.enable(GL.TEXTURE_2D); /* Enables Smooth Shading */ gl.shadeModel(GL.SMOOTH); /* Black Background */ gl.clearColor(0.0f, 0.0f, 0.0f, 0.5f); /* Depth Buffer Setup */ gl.clearDepth(1.0f); /* Really Nice Perspective Calculations */ gl.hint(GL.PERSPECTIVE_CORRECTION_HINT, GL.NICEST); /* Blending Function For Translucency Based On Source Alpha Value */ gl.blendFunc(GL.SRC_ALPHA, GL.ONE); /* Enable Blending */ gl.enable(GL.BLEND); /* Create A Loop That Goes Through All The Stars */ for (curStar = 0; curStar < NUM; curStar++) { star[curStar] = new Stars(); /* Start All The Stars At Angle Zero */ star[curStar].angle=0.0f; /* Calculate Distance From The Center */ star[curStar].dist=(((float)curStar)/NUM)*5.0f; star[curStar].r=rand.nextInt()%256; star[curStar].g=rand.nextInt()%256; star[curStar].b=rand.nextInt()%256; } } catch (Exception e) { throw new Exception("Problem initialising GL", e); } } private boolean drawGLScene() { /* Clear The Screen And The Depth Buffer */ gl.clear(GL.COLOR_BUFFER_BIT | GL.DEPTH_BUFFER_BIT); /* Select our Texture */ gl.bindTexture(GL.TEXTURE_2D, textureBuf.get(0)); /* Loop Through All The Stars */ for (curStar=0; curStar < NUM; curStar++) { /* Reset The Current Modelview Matrix */ gl.loadIdentity(); /* Zoom Into The Screen */ gl.translatef(0.0f, 0.0f, zoom); /* Tilt The View */ gl.rotatef(tilt, 1.0f, 0.0f, 0.0f); /* Rotate To The Current Stars Angle */ gl.rotatef(star[curStar].angle, 0.0f, 1.0f, 0.0f); /* Move Forward On The X Plane */ gl.translatef(star[curStar].dist, 0.0f, 0.0f); /* Cancel The Current Stars Angle */ gl.rotatef(-star[curStar].angle, 0.0f, 1.0f, 0.0f); /* Cancel The Screen Tilt */ gl.rotatef(-tilt, 1.0f, 0.0f, 0.0f); /* Twinkling Stars Enabled */ if (twinkle) { /* Assign A Color Using Bytes */ gl.color4ub((byte) star[(NUM-curStar)-1].r, (byte) star[(NUM-curStar)-1].g, (byte) star[(NUM-curStar)-1].b, (byte) 255); /* Begin Drawing The Textured Quad */ gl.begin(GL.QUADS); gl.texCoord2f(0.0f, 0.0f); gl.vertex3f(-1.0f,-1.0f, 0.0f); gl.texCoord2f(1.0f, 0.0f); gl.vertex3f( 1.0f,-1.0f, 0.0f); gl.texCoord2f(1.0f, 1.0f); gl.vertex3f( 1.0f, 1.0f, 0.0f); gl.texCoord2f(0.0f, 1.0f); gl.vertex3f(-1.0f, 1.0f, 0.0f); gl.end(); } /* Rotate The Star On The Z Axis */ gl.rotatef(spin, 0.0f, 0.0f, 1.0f); /* Assign A Color Using Bytes */ gl.color4ub((byte) star[curStar].r, (byte) star[curStar].g, (byte) star[curStar].b, (byte) 255); /* Begin Drawing The Textured Quad */ gl.begin(GL.QUADS); gl.texCoord2f(0.0f, 0.0f); gl.vertex3f(-1.0f, -1.0f, 0.0f); gl.texCoord2f(1.0f, 0.0f); gl.vertex3f( 1.0f, -1.0f, 0.0f); gl.texCoord2f(1.0f, 1.0f); gl.vertex3f( 1.0f, 1.0f, 0.0f); gl.texCoord2f(0.0f, 1.0f); gl.vertex3f(-1.0f, 1.0f, 0.0f); gl.end(); /* Used To Spin The Stars */ spin+=0.01f; /* Changes The Angle Of A Star */ star[curStar].angle += ((float)curStar)/NUM; /* Changes The Distance Of A Star */ star[curStar].dist -= 0.01f; /* Is The Star In The Middle Yet */ if (star[curStar].dist < 0.0f) { /* Move The Star 5 Units From The Center */ star[curStar].dist += 5.0f; /* Change Its Color */ star[curStar].r=rand.nextInt()%256; star[curStar].g=rand.nextInt()%256; star[curStar].b=rand.nextInt()%256; } } return true; } public void killGLWindow() { Keyboard.destroy(); gl.destroy(); Display.destroy(); } public void createGLWindow(int width, int height, int bits, boolean fullscreenflag) throws Exception { fullscreen = fullscreenflag; try { Display.create(new DisplayMode(width, height, bits, 60), fullscreenflag); gl = new GL(bits, 0, bits, 8); gl.create(); glu = new GLU(gl); Keyboard.create(); Keyboard.enableBuffer(); resizeGLScene(Display.getWidth(), Display.getHeight()); initGL(); } catch (Exception e) { throw new Exception("Problem initialising Lesson", e); } } public void start() throws Exception { try { createGLWindow(640, 480, 16, fullscreen); while (!done) { loop(); } killGLWindow(); } catch (Exception e) { throw new Exception("Problem starting loop", e); } } private void loop() { drawGLScene(); gl.swapBuffers(); /* Keys that have a constant effect */ Keyboard.poll(); if (Keyboard.isKeyDown(Keyboard.KEY_UP)) { tilt -= 0.5f; } if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) { tilt += 0.5f; } if (Keyboard.isKeyDown(Keyboard.KEY_PRIOR)) { zoom -= 0.2f; } if (Keyboard.isKeyDown(Keyboard.KEY_NEXT)) { zoom += 0.2f; } /* Keys that have a toggle effect */ Keyboard.read(); for (int i = 0; i < Keyboard.getNumKeyboardEvents(); i++) { Keyboard.next(); if (Keyboard.key == Keyboard.KEY_ESCAPE && Keyboard.state) { done = true; } if (Keyboard.key == Keyboard.KEY_T && Keyboard.state) { twinkle=!twinkle; } } } private IntBuffer createIntBuffer(int size) { ByteBuffer temp = ByteBuffer.allocateDirect(4 * size); temp.order(ByteOrder.nativeOrder()); return temp.asIntBuffer(); } public static void main(String[] arguments) { int err = 0; Lesson9 lesson = new Lesson9(); try { lesson.start(); } catch (Exception e) { err = 1; e.printStackTrace(); } System.exit(err); } } --- NEW FILE: Texture.java --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/examples/nehe/lesson09/Texture.java /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import java.nio.*; import java.awt.image.*; import java.awt.geom.*; import org.lwjgl.*; import org.lwjgl.opengl.*; import org.lwjgl.input.*; /** * $Id: Texture.java,v 1.1 2002/11/25 06:53:08 lholden Exp $ * * Just a small container class for holding texture data * * @author Luke Holden * @version $Revision: 1.1 $ */ public class Texture { private ByteBuffer data; private int height; private int width; /** Creates a new instance of Texture */ public Texture(BufferedImage tmpImg) { width = tmpImg.getWidth(); height = tmpImg.getWidth(); /* flip the image, so it displays right * There might be a way to do this differently... */ AffineTransform tx = AffineTransform.getScaleInstance(1, -1); tx.translate(0, -tmpImg.getHeight(null)); AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR); tmpImg = op.filter(tmpImg, null); data = ByteBuffer.allocateDirect(4 * width * height); data.order(ByteOrder.nativeOrder()); data.clear(); byte[] byteData = (byte[])tmpImg.getRaster().getDataElements(0, 0, width, height, null); data.put(byteData); data.flip(); } public int getData() { return data.get(0); } public ByteBuffer getBuffer() { return data; } public int getPtr() { return Sys.getDirectBufferAddress(data); } public int getHeight() { return height; } public int getWidth() { return width; } } |
From: Luke H. <lh...@us...> - 2002-11-25 06:53:11
|
Update of /cvsroot/java-game-lib/LWJGL/examples/nehe/lesson07 In directory sc8-pr-cvs1:/tmp/cvs-serv18314/lesson07 Added Files: Lesson7.java Texture.java Log Message: up we go =) --- NEW FILE: Lesson7.java --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/examples/nehe/lesson07/Lesson7.java /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import java.nio.*; import java.io.*; import java.awt.image.BufferedImage; import javax.swing.JOptionPane; import javax.imageio.*; import org.lwjgl.*; import org.lwjgl.opengl.*; import org.lwjgl.input.*; /** * $Id: Lesson7.java,v 1.1 2002/11/25 06:53:08 lholden Exp $ * * Texture Filters, Lighting & Keyboard Control * * Credit goes to Jeff Molofee (NeHe) whos tutorial this is based on * * @author Luke Holden * @version $Revision: 1.1 $ */ public class Lesson7 { private GL gl; private GLU glu; private boolean done = false; private boolean fullscreen = true; /* Lighting ON / OFF */ private boolean light; private float xrot; private float yrot; private float xspeed; private float yspeed; private float z=-5.0f; /* Ambient Light Values ( NEW ) */ private FloatBuffer lightAmbient = createFloatBuffer(4).put(0.5f).put(0.5f).put(0.5f).put(1.0f); /* Diffuse Light Values ( NEW ) */ private FloatBuffer lightDiffuse = createFloatBuffer(4).put(1.0f).put(1.0f).put(1.0f).put(1.0f); /* Light Position ( NEW ) */ private FloatBuffer lightPosition = createFloatBuffer(4).put(0.0f).put(0.0f).put(2.0f).put(1.0f); /* Which Filter To Use */ private int filter; /* Storage for 3 textures */ private IntBuffer textureBuf = createIntBuffer(3); /** Creates a new instance of Lesson */ public Lesson7() { } /* A javafied version of AUX_RGBImageRec *LoadBMP(char*); */ private Texture loadImage(String filename) throws Exception { Texture texture = null; BufferedImage tmpImg = null; /* normally I would use StringUtils.isValid(String) from the jakarta commons lib, but thats beyond the scope of this lesson */ if ((filename != null) && (filename.trim() != "")) { try { InputStream is = getClass().getResourceAsStream(filename); tmpImg = (BufferedImage) ImageIO.read(is); if (tmpImg == null) { throw new Exception("Error: Got null from ImageIO.read()"); } texture = new Texture(tmpImg); } catch ( Exception e ) { throw new Exception("Problem loading bitmap", e); } } else { throw new Exception("Error: file name is not valid!"); } return texture; } /* Load Bitmaps And Convert To Textures */ private void loadGLTextures() throws Exception { /* Create Storage Space For The Texture */ Texture[] textureImage = new Texture[1]; /* Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit */ try { textureImage[0] = loadImage("data/crate.png"); if (textureImage[0] == null) { throw new Exception("Error: got null from loadBmp()!"); } /* Create Three Textures */ gl.genTextures(3, Sys.getDirectBufferAddress(textureBuf)); /* Create Nearest Filtered Texture */ gl.bindTexture(GL.TEXTURE_2D, textureBuf.get(0)); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MAG_FILTER, GL.NEAREST); // ( NEW ) gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.NEAREST); // ( NEW ) gl.texImage2D(GL.TEXTURE_2D, 0, 3, textureImage[0].getWidth(), textureImage[0].getHeight(), 0, GL.RGB, GL.UNSIGNED_BYTE, textureImage[0].getPtr()); /* Create Linear Filtered Texture */ gl.bindTexture(GL.TEXTURE_2D, textureBuf.get(1)); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MAG_FILTER, GL.LINEAR); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.LINEAR); gl.texImage2D(GL.TEXTURE_2D, 0, 3, textureImage[0].getWidth(), textureImage[0].getHeight(), 0, GL.RGB, GL.UNSIGNED_BYTE, textureImage[0].getPtr()); /* Create Linear Filtered Texture */ gl.bindTexture(GL.TEXTURE_2D, textureBuf.get(2)); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MAG_FILTER, GL.LINEAR); gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.LINEAR_MIPMAP_NEAREST); // ( NEW ) glu.build2DMipmaps(GL.TEXTURE_2D, 3, textureImage[0].getWidth(), textureImage[0].getHeight(), GL.RGB, GL.UNSIGNED_BYTE, textureImage[0].getPtr()); // ( NEW ) } catch (Exception e) { throw new Exception("Problem loading textures", e); } } private void resizeGLScene(int width, int height) { /* Reset The Current Viewport */ gl.viewport(0, 0, width, height); /* Select The Projection Matrix */ gl.matrixMode(GL.PROJECTION); /* Reset The Projection Matrix */ gl.loadIdentity(); /* Calculate The Aspect Ratio Of The Window */ glu.perspective(45.0f, ((float) Display.getWidth()) / ((float) Display.getHeight()), 0.1f, 100.0f); /* Select The Modelview Matrix */ gl.matrixMode(GL.MODELVIEW); /* Reset The Modelview Matrix */ gl.loadIdentity(); } private void initGL() throws Exception{ /* Jump To Texture Loading Routine */ try { loadGLTextures(); /* Enable Texture Mapping ( NEW ) */ gl.enable(GL.TEXTURE_2D); /* Enables Smooth Shading */ gl.shadeModel(GL.SMOOTH); /* Black Background */ gl.clearColor(0.0f, 0.0f, 0.0f, 0.5f); /* Depth Buffer Setup */ gl.clearDepth(1.0f); /* Enables Depth Testing */ gl.enable(GL.DEPTH_TEST); /* The Type Of Depth Test To Do */ gl.depthFunc(GL.LEQUAL); /* Really Nice Perspective Calculations */ gl.hint(GL.PERSPECTIVE_CORRECTION_HINT, GL.NICEST); /* Setup The Ambient Light */ gl.lightfv(GL.LIGHT1, GL.AMBIENT, Sys.getDirectBufferAddress(lightAmbient)); /* Setup The Diffuse Light */ gl.lightfv(GL.LIGHT1, GL.DIFFUSE, Sys.getDirectBufferAddress(lightDiffuse)); /* Position The Light */ gl.lightfv(GL.LIGHT1, GL.POSITION, Sys.getDirectBufferAddress(lightPosition)); gl.enable(GL.LIGHT1); } catch (Exception e) { throw new Exception("Problem initialising GL", e); } } private boolean drawGLScene() { /* Clear The Screen And The Depth Buffer */ gl.clear(GL.COLOR_BUFFER_BIT | GL.DEPTH_BUFFER_BIT); /* Reset The Current Modelview Matrix */ gl.loadIdentity(); /* Move Into The Screen 5 Units */ gl.translatef(0.0f, 0.0f, z); /* Rotate On The X Axis */ gl.rotatef(xrot, 1.0f, 0.0f, 0.0f); /* Rotate On The Y Axis */ gl.rotatef(yrot, 0.0f, 1.0f, 0.0f); /* Select our Texture */ gl.bindTexture(GL.TEXTURE_2D, textureBuf.get(filter)); /* build our textured cube */ gl.begin(GL.QUADS); /* Front Face */ /* Normal Pointing Towards Viewer */ gl.normal3f( 0.0f, 0.0f, 1.0f); /* Bottom Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 0.0f); gl.vertex3f(-1.0f, -1.0f, 1.0f); /* Bottom Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 0.0f); gl.vertex3f( 1.0f, -1.0f, 1.0f); /* Top Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 1.0f); gl.vertex3f( 1.0f, 1.0f, 1.0f); /* Top Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 1.0f); gl.vertex3f(-1.0f, 1.0f, 1.0f); /* Back Face */ /* Normal Pointing Away From Viewer */ gl.normal3f( 0.0f, 0.0f,-1.0f); /* Bottom Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 0.0f); gl.vertex3f(-1.0f, -1.0f, -1.0f); /* Top Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 1.0f); gl.vertex3f(-1.0f, 1.0f, -1.0f); /* Top Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 1.0f); gl.vertex3f( 1.0f, 1.0f, -1.0f); /* Bottom Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 0.0f); gl.vertex3f( 1.0f, -1.0f, -1.0f); /* Top Face */ /* Normal Pointing Up */ gl.normal3f( 0.0f, 1.0f, 0.0f); /* Top Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 1.0f); gl.vertex3f(-1.0f, 1.0f, -1.0f); /* Bottom Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 0.0f); gl.vertex3f(-1.0f, 1.0f, 1.0f); /* Bottom Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 0.0f); gl.vertex3f( 1.0f, 1.0f, 1.0f); /* Top Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 1.0f); gl.vertex3f( 1.0f, 1.0f, -1.0f); /* Bottom Face */ /* Normal Pointing Down */ gl.normal3f( 0.0f,-1.0f, 0.0f); /* Top Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 1.0f); gl.vertex3f(-1.0f, -1.0f, -1.0f); /* Top Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 1.0f); gl.vertex3f( 1.0f, -1.0f, -1.0f); /* Bottom Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 0.0f); gl.vertex3f( 1.0f, -1.0f, 1.0f); /* Bottom Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 0.0f); gl.vertex3f(-1.0f, -1.0f, 1.0f); /* Right face */ /* Normal Pointing Right */ gl.normal3f( 1.0f, 0.0f, 0.0f); /* Bottom Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 0.0f); gl.vertex3f( 1.0f, -1.0f, -1.0f); /* Top Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 1.0f); gl.vertex3f( 1.0f, 1.0f, -1.0f); /* Top Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 1.0f); gl.vertex3f( 1.0f, 1.0f, 1.0f); /* Bottom Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 0.0f); gl.vertex3f( 1.0f, -1.0f, 1.0f); /* Left Face */ /* Normal Pointing Left */ gl.normal3f(-1.0f, 0.0f, 0.0f); /* Bottom Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 0.0f); gl.vertex3f(-1.0f, -1.0f, -1.0f); /* Bottom Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 0.0f); gl.vertex3f(-1.0f, -1.0f, 1.0f); /* Top Right Of The Texture and Quad */ gl.texCoord2f(1.0f, 1.0f); gl.vertex3f(-1.0f, 1.0f, 1.0f); /* Top Left Of The Texture and Quad */ gl.texCoord2f(0.0f, 1.0f); gl.vertex3f(-1.0f, 1.0f, -1.0f); gl.end(); /* X Axis Rotation */ xrot+=xspeed; /* Y Axis Rotation */ yrot+=yspeed; return true; } public void killGLWindow() { Keyboard.destroy(); gl.destroy(); Display.destroy(); } public void createGLWindow(int width, int height, int bits, boolean fullscreenflag) throws Exception { fullscreen = fullscreenflag; try { Display.create(new DisplayMode(width, height, bits, 60), fullscreenflag); gl = new GL(bits, 0, bits, 8); gl.create(); glu = new GLU(gl); Keyboard.create(); Keyboard.enableBuffer(); resizeGLScene(Display.getWidth(), Display.getHeight()); initGL(); } catch (Exception e) { throw new Exception("Problem initialising Lesson", e); } } public void start() throws Exception { try { createGLWindow(640, 480, 16, fullscreen); while (!done) { loop(); } killGLWindow(); } catch (Exception e) { throw new Exception("Problem starting loop", e); } } private void loop() { drawGLScene(); gl.swapBuffers(); /* Keys that have a constant effect */ Keyboard.poll(); if (Keyboard.isKeyDown(Keyboard.KEY_PRIOR)) { z-=0.02f; } if (Keyboard.isKeyDown(Keyboard.KEY_NEXT)) { z+=0.02f; } if (Keyboard.isKeyDown(Keyboard.KEY_UP)) { xspeed-=0.01f; } if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) { xspeed+=0.01f; } if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) { yspeed+=0.01f; } if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) { yspeed-=0.01f; } /* Keys that have a toggle effect */ Keyboard.read(); for (int i = 0; i < Keyboard.getNumKeyboardEvents(); i++) { Keyboard.next(); if (Keyboard.key == Keyboard.KEY_ESCAPE && Keyboard.state) { done = true; } // /* F1 switch between fullscreen/windowed is buggy... // * So for now, we are leaving this ability disabled */ // if (Keyboard.key == Keyboard.KEY_F1 && Keyboard.state) { // try { // killGLWindow(); // fullscreen=!fullscreen; // createGLWindow(640, 480, 16, fullscreen); // } // catch (Exception e) { // /* We dont want to put exceptions into our loop... so */ // e.printStackTrace(); // System.exit(1); // } // } if (Keyboard.key == Keyboard.KEY_L && Keyboard.state) { light=!light; if (!light) { gl.disable(GL.LIGHTING); } else { gl.enable(GL.LIGHTING); } } if (Keyboard.key == Keyboard.KEY_F && Keyboard.state) { filter+=1; if (filter>2) { filter=0; } } } } private IntBuffer createIntBuffer(int size) { ByteBuffer temp = ByteBuffer.allocateDirect(4 * size); temp.order(ByteOrder.nativeOrder()); return temp.asIntBuffer(); } private FloatBuffer createFloatBuffer(int size) { ByteBuffer temp = ByteBuffer.allocateDirect(4 * size); temp.order(ByteOrder.nativeOrder()); return temp.asFloatBuffer(); } public static void main(String[] arguments) { int err = 0; Lesson7 lesson = new Lesson7(); try { lesson.start(); } catch (Exception e) { err = 1; e.printStackTrace(); } System.exit(err); } } --- NEW FILE: Texture.java --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/examples/nehe/lesson07/Texture.java /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import java.nio.*; import java.awt.image.*; import java.awt.geom.*; import org.lwjgl.*; import org.lwjgl.opengl.*; import org.lwjgl.input.*; /** * $Id: Texture.java,v 1.1 2002/11/25 06:53:08 lholden Exp $ * * Just a small container class for holding texture data * * @author Luke Holden * @version $Revision: 1.1 $ */ public class Texture { private ByteBuffer data; private int height; private int width; /** Creates a new instance of Texture */ public Texture(BufferedImage tmpImg) { width = tmpImg.getWidth(); height = tmpImg.getWidth(); /* flip the image, so it displays right * There might be a way to do this differently... */ AffineTransform tx = AffineTransform.getScaleInstance(1, -1); tx.translate(0, -tmpImg.getHeight(null)); AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR); tmpImg = op.filter(tmpImg, null); data = ByteBuffer.allocateDirect(4 * width * height); data.order(ByteOrder.nativeOrder()); data.clear(); byte[] byteData = (byte[])tmpImg.getRaster().getDataElements(0, 0, width, height, null); data.put(byteData); data.flip(); } public int getData() { return data.get(0); } public ByteBuffer getBuffer() { return data; } public int getPtr() { return Sys.getDirectBufferAddress(data); } public int getHeight() { return height; } public int getWidth() { return width; } } |
From: Luke H. <lh...@us...> - 2002-11-25 06:51:13
|
Update of /cvsroot/java-game-lib/LWJGL/examples/nehe/lesson07/data In directory sc8-pr-cvs1:/tmp/cvs-serv17776/data Added Files: crate.png Log Message: --- NEW FILE: crate.png --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/examples/nehe/lesson07/data/crate.png PNG Óðú¨°É2ò1Ò>æ,Gªµg(NH¾Xy·ÛfhP¤© ïmIÒ}¿T5<(\/ú êåouã<k1;ãåNjNÀ.B¸'mTdg¬ðyØÖZ,ÕÌßßÏiÄÌ0³ ãþZµBú TìY/â7Ã+{[¶§°Ì²ìxnp»-VÑ9ýÂfñ}@]»¾~|Ó(Åâ<î¹|£Ôáï4#éGÁÔO¡à!b³V]øror4]ïò¬z»!ã$¿Ô&ÚZa¶p#g"þ® §çdGp)fËZYp£ýyª06¦åE¯OØíEo,ð%o3ãÿ#&`àüxQýß,½1¿,º°3x 8Ò_ǸÙÓ »ÂÈKþÀ@ô8 ÑxKÒ%iiYf©Äaÿÿ/ qCÊ »VBç¡·3¨¿?Ë1¹ãÄBVÔ|î^ALÖÛKcð"CUUOI¢ ¤\!ç:*ÒYÞ¯»pwÔRKÑÀÅ¡ÓÙ®ÙcH£Á½$ZÎÂÞSÀÓ W4pfçØaÞæ NÒ öm¬×íM1x²z9Ù´^W;èÅïΧY?ØúÏö½;/Y:HNÂ|,Í#;el£ñ°iÙ× ç:ÛT2*¯%§h.ÞqyfþÔ+;ÈV'×&r}ªù"Ö$#k-4)jîÝCgýöØb+ººÚÇ#óÂF E>zrhéº<KsØP*\×÷ï:st`xNÈÝsÓ? òöz^SnbÌ»XålWó?Ûýj@{ T²6ÎGøØ[m ØWgÈNÀD¶»Ð|úy(|ë>· Í8{.L ²(þ: (EéØºBÃÉ«i|_)Z&ÿ@Q¹ó¶ CQ_%Yq¢8AÀIºwéÔ¥sy×îÚ8iÛ#ßì5À êöåMEÍEÁv©á¦ùJ²ãÞiëggÔxfèh"0Ý^^³WÀiC!³¼z>¨ÿþM^${MÖ5},Í1ÔÝ ìpyY u,d¬ÆË]å4³üêÒÂkìiÚòØê)ãpQçó³~NQT£r§sÿûÔÊÄ·f¼Ðë>'T§¬ÈB§}$õKJE*é§Aé9à¼\]áup72 äµ ùZ2F²üCk?ÌáǧYEáôËõ&%Ç¡Ió¶ÀÍp°yF8²¯£m|(xüµ14顽Éà3"j¼Gv¦Wûn<\Pyê4Â)<¬b æm[?á¦Ý>\¬n <MÚUÍÿpô¡×ÊÉT®ãñeDgCc¼oØóáIì_?µÎªx)òd"Þ (qD¦÷Ò|Ù0- áµ Í$Òìb÷ɪDô±eGWÜ2í0zëFÐCøÞÔbã¿Ç.oÇñqSÅh:°íuå¬ÚÕnæÆ:¶ <!GæêBÞV¼¾`nfÈõKÚVfL8é¼ìØ4õîu5MK)Ä_èÜpbnºy_G-FÜ!ü9A9ÿ ±Lv£Â Ü»½ÏcrààÈû¿ Ï®ÓÁ mæED¼ ßQYS·á¦eÒS¾º*!N²B¢ :öçh1[/]×kÅvízz§6㩼ôh|A¢0s¤ö?_*qBíÛz_±Ãæ)AÄŰ¼øÃj¡Ó4j;Ìä ´CV+Æå׿gTëܹøbcÜ%u¿PkÌÖÒÖE.é¡r´¾»@Î"GgoWm{Ϊäa5ßµãqà( £¬I54ûwoæ)äµN6|¼áhT}nJxßc>ÏÛ(u~Í!¤ÀY§2ç& ½gw*øÄSÈp°]4üÐ'kí\²0ÿ÷E´¦Ï¾}ÿÁfiÎä` . {éy*ÞWªv$R¹*ùxe³ãÙdd6ËíéD¥¸ÉcÒ¨·yWÛäv âz?ó!¨ñ±¤f¹Tf¶µ¤Ôû÷åÀɪõ×séÃ*_çé M¤"Å@#bJÁ!!\¦ÀÓÁ8w®>ª Ã{^¯ÖA©½åv{R-\bÀ%hò|3SnUÙi ÍzÓßÏQªqƹybÔK¯ÿíOo}é/jöcev.}9VA§¬Ï½BÙÚ^V¼½/bxz,OÑð6з+g¾ÿ ájíºqìäÙc0AðR·»Æ8³h9ô¹é!÷ê tö±%Ön1¥df ÷C ½5 Ûäø=!à(à8ê×ù`Úu;Ô']0¶¿.ç¥ÚJÍçºï'×/òïqØ^~'ºâ`w Ï!¿>>×eO +µÎSbÜ¢u¸¤ç}g?Ê)ÏÄÉûÃlí¶¨$b³îF[( qŪÐ:)1áD®'mP&p½.¸øÆõ*bBÁÑìsK@°CTl+mãYQÿûÌbaáUgþ@q¹ôF CQØq¦étF¥¥¨+þÿÿ°@H,Z(δI¿âg²,ûúÞs¾ÃÞÜÞ ¾ DÃ0ãØH¡`zÞðýîo²3dúVëÔNm|ôÅ×rÉ[ ©1u¬PàáBLhßý³ÝqPRA^`ZÄÜæ·Ð¯.D¹ Q#ø¦Ãª!ÿÀ¡ºÆRö:¿;_cǼɬÅ9iPthâ~ ÆKÚ¨.4ôl¢SÒÚCÏhP°`Ügòq+¦ù23ñzÛAÑ ¿-¤þÒüýv#t¼+ úõºÑþÜ÷}Eo=Ì Iϰ@óé½4ØÑa<E)¼7©±ÆFÚEoJï$ù±R»C4ØB XZ+EI!8'3Eã&³_7yæÂÉIA[³TL±ÿ'ºÕ³÷í~òa×_ÑÙcQ4-À}\(ûÕçÑ\ÈÅDàM f]Ú@ ²¬EM ÈRSðï3rÇækײOø 9u]y¨ÔJS¦NÔð³Û}AÐøßôoElÊ4°6¿:&ª£K«åÄxZ[ÛàÏ6P|ª9MËÜ L×VZl«vô;«Þzé¥rú0:oeÿ»«ú¼eÜÿï.ÍǺE}8ü ÀÙö¦ qÜ1$9!NKiʤn{¹ööé÷1*mo¢I-Ð@Í0ûÙ©@àßÙ¾ûß}0%|ž/VÏÝ6ü7÷£m]β¸»ýEç`Q+Õ¢uNeéÓºFbÙóÝ~x4u(=Ó¼^Ép¸J,$dOsI¼S¦d ¯êª(ctQ¼IúíË&¡(M±îú¯Íý:Ydèþùi¦iѧg¼AÒÔü2òË\NT.çfmÚÝëløu»©FÐMâÄz©!#òy¸7óyàÙî·ã%ìyþ¨¼DºniQ«H(F&çT¡5à²KÄPûIèÓK;6HUïÆñAA[í~|AwÂýýìI1 ½&LgÁeªQ [ÊOwC»)rímwTÿ ÉÚvܨÍÍ6c²M jÚ½i¥¾öÿÿ£ûPµÝìCC¦!d wÜc¢²{fÎ9©¨ÍÜd î¼b0ksØ0d.v0 ¸ÅÜ¥ L*)àØ ãý*½©[Ím- ±òUßU×¾ò¹ÏZí9Vû1æÇñ\Ê0ÔSÜ0ÿ i\Jló+"4éböòÛÀ" Dz¢ð_~Mt`ß,v¹«ÕÅ7¸1Wa ¢H´@p¬¢SÕ`ÿe£có©ÒX"%_>£úÇñ Ï/YZpL|ûÖ$Yü{9À#1)ÊmÊê×-(·ýs\Hvp"yÁ¤Ôrîv6eàø/¯j@<yç,À÷ªEÊ+ú³°aäiç6õá Äâ|2Ü wÃp»êWþé«_íHü kS«sa Ü| ÄôWägYîöR®"5ÍÌô8xR IÙ(úë`77'çX-ð$£¡I².íl==Ì9æó?ºi(þ.ò>µ¤FܰIA'_Ûoê(ï'=ÿ¾LïÆóï÷ýÊS¿ópü' %î4#AÆÓÇú¦0mßÁl$ Ü?é ¿ôEQÆ,4¾¨K]Jx¸Ýâ«ÓOwòÚöèI9ÙU¨Ò ¤@Å8ÈÙ?uê}Èãk¥ÇøC«¤¶PS8TÒ>Íx/ 44¶Yê{íR0ÒÀ¨iØùÃØHÓ³Jm|§ñh'¦ïÈÔXü²4?ÆØVyÞJ À̺ vw{òÝ7¤e:ýçfz-ÀTò¥Gû(n):·I 9i µû ¾Ì7»©Ó3`,ú¢%:èv;rS Si.19zÞ6©.LÉ2Ön<»ôyi^ <HòÊ4ÝÛ7¶Öz>= Á&²â¹èHçÓV6?p"³W3;`~Ð'N(ðMdÖxÜ+Kc Æ5#ãEM,Ûf0ýc;Âp°'ÿ[¤Pw÷àØÕ«$u#c÷Ç&Àõ½. ë ¶v à-}×*ÂÛÆöÏYæ9Jϧ£/¬ÅÌ¥²@E7Ð4|DQ( ç+zQ$É] DÇma9æqÒ£(åQ÷i'&Q¥@úTã-M·)s;Ô$ =¦¸ù¯ka*22sBm\ÝMR2ø§U»X° ²G£+ìóýeýñºD¦IûH&%©Ð¼=Ý>ÆÚ¤ï½lÐ"3ÿçWEb<¯§ë$¤òõm±ÖÉN¡ mè~ʨÄÏ6[ÛÅÍðO ?XHó·â_¬ÊoáI#æö@$ÔÒLÀâ¢>·I±Wï øÃøöñÃFÏØÿm^óí¤B¨£AÐjÔélØ"2ãäî,ùU~c4R °×nùª6>3<QúÖ3$|Ñ ôÛ]lÒúÃXî¤wËÌîÌ£¢í×»üØDa*5h~ìßà;Wÿ§Ã¸ÔÔÕ À-¥¿&ýV J/ØXÿ¢H$«w.ØváóL¾Íýy@bâÚMáònDTæY1ñi;³Ñrµó²Åõïôk_mîÆïN´ååÜ \1Íî}-umÚPë±Áû&ëÐ7¡$5.E-qÎë¯á¶JÄE\i$Y"b/×5ÉÇäA âQ &¨¾"H&Jà¶k¡ êk¾ÓXÞÏêýj°h Ð÷ëÌÝj^á>è-PÞÍ~>ìÄ0þ°É±uõ@â0K çynãÿ ÅöªÊJPR5ñ+×Â%dÐ4iiÈEGFÈ'÷êrÝn3 Ãe@¦P!ÖÝïîÀÅ»´¦jl£-P(Eß¡M¦¤ÌË9jàÁÕêg½ùx{¡-ÅðdèU4Â$ÀFëzKí~å%ûcAzgã`ós'@ÍVÝ1BG^!ô#[drj:8¨UxÆ.²°aÛí> Q,/§J ºtª¶b"ݽ¶M+ÀyÃ2Äâs3>PéyþZàxkHUÐ1&cGt½+OÖ8gâXR*ì°ÕX¢ÇöêtÆÞå½äp3U} e4I ·Ü¶@AHW&Þø¾³ï^I åÇneýf¹ 4lÙéììÌ9g¤ì"y~º 5?ÞÏ!«ïÚ$|<xPá¾+Í÷¦YòX¿kÌõíWí+K;lR(ZY%.þ? í ÆAAàV©Gß HÏÒ*Þ8·5C)³ ÷}ñ£ø(ÖbÞýA ê3b@ N$ëÎW³@ ˸6(· ¶Ómu®ÜùÂ>]HXH(m¡Åãwf1&¬fæ\þ˼©Ú¿ðárY¨©4±2WL÷2Õµ´êþøfPÒçyÑ÷ÝÉ»(Þ]6/ÿºRã ì%x Nû!)N£^ÏCeêDÆU¡8ÝlkÅ÷¨ÆxÜΦâZÇ¼Ï £±´¥q/ºÆD ä¸ â}/éý±ÿdµ¤@0lÏ yÔh¼9Y䥻³q¶\n±Þ±òî çA¥èÇô-^ Тû©XƱP¸Ò ekîPÙqí`¿ @lõ]˶ÅÒ(={¿5f=êx¸$ ·$qËT`ÄqPÒ)aYxQ¤ô&´4ä*ÏFh-),ÑÎ[lTU;ñ²BWQîexÖøÜÖÀ5Û¹:+Hÿ½q[ xçï.³¼(ÐÁóF¾rs§¾s_îç.¢-&Á|µ+ ñäí8)Oë×e·=`B}TQ<A ó©´7®¾ <PèwÓܸÁÞ}÷ës/unÍ"õ2éÏF% á8..JpÝ+%%±¾ÂhíA$Àý#e#+Ì8ÃG]ÈV7*'ýÊpI7ð%×àj¹NÊêä´GÜó>ßy Át£%%³¼ò'eMÖ©³gO4fÁµYÓÛ6»_°¿+P¤ÀÑÎÍ9,ÒÃÞ".wáËÌ)¬¢ZU2»p¡¿® hè#[D7DîÚâf ò!~[ÇÃã4EEÐ$¶!#?ucÀ©°Yk²zW_Õp ½ÌvD} £H(k0¥â ίøa°x61¤^åÛè"N¬áÿ¥X°§ßÉòdQDÝ»LYãñpêfkçôöÉ%(à x-³ó|UVVb!øMHÅ!Sá}3/,PY$ ø¤Hcx%³6´ üâ±sFNjÌ&éú¯ÂcÆeÙ³ú)Fà6a«Ó¡õú>Bc{ÀEzlW³£ËÜ-\¹y÷º§¾Gµê£^øa¼Ô9}«££¦µì¯ëù8 b~EÞ(÷gàkE)TztR6n¬CªÁ¿)F%ºEl·.;¯e×oñ-l¬D©¼Ï¢ ¬SÖ4C1Ô¤tdþËÖ%ì$£f@iuùöÕäÅÝã Ü_T?<®T{Ëm/NÀá÷«ÍGnÁ&W#ø}Yhµïg»öµ°°ã¬í±¯ þ·¾ìyÓäy£dªÍ*ä-ÑKË=Ã7ªõW EÓeÄ%¼¥µ}j~MIûU?üIP;tæoR1´G28i§AÚØ"Ê\o±±yË#Ûe°3Û¼z«,Ñ}³°^YdäÂZÀweþ`¢õ*¡¼Däðiõ梹Mÿz~rW;ÆHÞ j_úÞ}ùF¾DdµQY¢M¿m;\90¿¸º ÈÑÂqö0M?£>èÿÿ/õÑD_´&Zh˨gvk}kHC¹eovgg®è~ëfc>3"÷v½lÔ½åa©`ZC{UH4Sq"QP繬°"=v9Kõ_Ó8Ò2¡$Tÿ±Å½ßH¯£ß+ºh ¥V0 彩tÅîk¹éþMUê¤ÆNkîà S3)©°Ìsä`"¤>¶OEY#èr#j²7À6Ðå¡ ëëwìШ˴ø ¶ààJ* +jr¹[fÂ=ÄHç+ÄÓ xÚ!¦|/TX v2Q<Ñ&I·ïßÅj9ß,jo¯$tôñjÕ|ÛöÇ(î£$î? vûzs@wtåÌ ©Ñ#=åÃ<á¿q¢îñ²KîíOûüò!uìlfÙWØízBÁ$Funib~`âjz¢ íÒÂÁ1&^¼xðÿÿ£LÊâR>ÚBí:³¯U$ Àî¾y3ofä½>s¼s6ñný¸»ðß<°UH+£*dnk(T@ì¶V£!4ã ßoÙæFGÚè§JAôS§»xÅKý¥d T"%R;a\$3¯+ç `C/ÙÚgିèvÖ\í¥Ç[oæìų9|Ú¿zÏp?þðúÞ$ 9Ð 8«èà¨TJJwÙßA¬¾&øb ôÍ ø®|TÊLϯyo[ZPô_¸¢Ý (W4Óô±ýÿ¿è/´ic[S Ò]1¾=âîììÌ&ae6ø®ÇÃÜèT waZAñÍm~Ø«· Ý©TG=,ÌP9i:ûÁý°Û8_ùr¥Î%XòOé¢9«Àýê?|¡®h®¿4ORKAYoZ ü±D7ý5 60ÊåAú¤Òe¢7i¶¿1pct;T& ]®ÅrǨ£e4HçEÏè.|-öÝ?îã1©kÐ~E¹«¤@J[¿£ÈO¯a¹¿Ö®ëöûOuÑ9ê<îø\WÓØy¸Ì=tÕÂõ24&ÀûqLßôâ$®ÂÁ¬ö|åý©=O' F¼#ÁXʦªc{B'"OWKP£ììxZbXÔÐ0@ñè--%ö!«®ßå9RnçM°iS Y(ÍL`-¢!*¬I´O»u§6KçP,ì6 ð lÐK7Ñ µ +x0ëÇ¹É ãQZ$!h¥üwG.5 ¾d!úêå v/ìU¥£Ø¢éüy:þøÜ¹¼= צc)\MÓa°ïáPYÉn<À4¨×ê³M¸îªÏ¨[aO KÚýáÿÚV±¤à·ó5ÌPå*BXËKÁªwúK¶1úÌ ZLÃ1ªXÎ\ûdÀÍIùÅ=þÎ $ Ü+ûuòKc53ìêtþàáê DZ¡;*uÆÚþþÿÇö?túdûhHè^ÎáaüÂÜe÷öö"âÀùüéMsy ÍÛ¯t='+½³ñYÆÓärrD¼j¥ ²²3õïêÓÇ×NÒFf®¦>ÿs'qþ(õ2·áaHj¡G2í405k-[Ý¿g}ÉÒ8¨±M¿lU¯ÛOõ¸½Áu \`,®ïîÓLvÊA8ÝL\Ü9TÍ¿ U(Á ¨ÿùþâhx¥PÒ]¨¿³£øÐÙ93g®» Ô[¦çýá í£ÞýãR»õ|m³ú\íJ±:;W¸õî7ü:MlÚöddªÆ³ó!-®jи¬Ê<ûHó©üÚÝl B_9ämA&²ûz× Ç¢Ä ò0@hÅrO/Ã,³,u¨< §¹ R·7ùl:> GÌõk·½<x[h*6ºp[IÀL2"!Û¥ s6üp¹Â$dauÂ&Ò¼×pzz rþ\¡úóyqZúp¦ô^ãcUH,C_Ñé¢ýºN0KW·×8IèÉ $Ðþ0ÿDÑ!rÿÝ ¡qËR!é]¦ïã¹êÎ<¨/«tÄiÅên C]9gæc½Â:ûÖþ·8¤B$©#F,PÓ¿Äï·ùHk,Áúño]LÐõU ÓæZoÙUx~- ùìæöÁ^ªy½U¨ÙŦx5¶FôZï÷ø/iÍ@:oÎ8ß«\GZÜçb¹øóF/~R»«Åd¡q4òDæÃý`q¤,\OÆÁGûãñ°nDê9h×9aX}äEÑM%J×[+ØÜ8q²wÉkN¸Û|õ|vß§{»êá¢#5bgOíjìK] $ WúàñÈòm¢YÆ[äºàRË£? 4ôfôÒÃ:§eãËýàþÜÀÕé¸y/Äcr'MúÎwàls iÇRÕé8L@2 à¸5 ¼/¡09ä ÊÄúil÷_àg;L¥éHÙÒI Þ ¹ æÌH];ýq )¸UüÓÞbÓ7Edþfè"W¶Ãù·RSdô;$È(ÅÒ±@½0_ä¥S¬¯¼N}§¹vk`y»HÃçB© 8~j¡:Æ2·¹·V/kÊB'3<¼c0²²~ÇÝEÖDpo²j«í&Néív5_â\ô×ÃÛGCvL"¬¨¸¡ÆÑ_Òð0iÇÛÖ{¸WñÜ3¨ÏößÏi*é³C÷o.Dîæ2§RÈã+FZTÕàøQ9d?/JÄ[ƶ¡°KØ$tçmããÅÂPK °Ä@¼Ôp°M=~ê·ï¤#_ð¦ép-ØÊ«ÀÎr8àPÌäãñÏpRIühôéÿ#¨¦F~9{$c@À{_áéIѶ</²z²¬ @Ôµ,5AòH0$h¬ò£åÙ«ÿ÷¢^ÔhÑ*$°`ÏÆÛRÙÃÚíÞ鬿f6tµQ|àæFèQÎëî¯$"JU¸$ðO2$XæðN1 ½¬TÙ¦m4; ûï©#a3m Yf¼JóE|ú¾L+»¹_VØô ¹ådáº9µÄ½¹4+°l 1þ"bTV9uÆtÉHF¯êÇTy-Ŷb׺·ªRl÷]6¨aÐX?Ï kBÛ°ø=Ë Å{PÄóé^)&òXlqö=ÒÕ&à®Ï´Ò@ B"¡ãwSùR/õÒ/húÑý@3ÕXyQF$AÚ=ÕñÁ½Êpι{ÎÝ]ÍuVh¢)Oþö]V^·e&Cìeë½øàéY\è|èÚLÐô!§_âÉâØs²->9[â UX~IØBã¸Í¤I©dz7FC²A5¶¦y¬>~éí=Q¼¢ÿáA|4uNOuü«æ<ZÕz(ò|xïQÔE:ã å='Ųñ¾Ó§ûa¶« 9bsÉÃê°GΤÂe¸n?ÄX9úä]Zä3ÒÒ×4ÙªiQ<%µJÔåÝ^kfð?¨ PéXP8â;sùïH!lD§òjêo(9\Ó>ôM|0*:yѳrÑ¢èâyDåµ±]øÿPëØ´ëC+ì:*^²ïw,¼3 dßÓ²²,ßÈÅhm¢+?¸ÅêÌç# Jâ=Þ-¥pnvà¤ç+¿INëÑrÅ»±[ÉUV9ƤBTÀ(ÍÜÀ £YÜ^6§ò 2lCÔu»¾ ®£.&´|ø\ -!W·¬±¼QaRÝHm±¶7åÂø@sòóo·0Ǹ_8~E1U`r©Fâó_Ç5_wcO*7ÜQÉÞØnô²y+ ê_Gã«_w{bÃ%ZÅÊ J±Ý}½ë[§W>2¹9ñÛê®ßñ¡ø¡É»u±n³,ßFãå7b²ùüï^1é^d^²ëOϦ ǶÂ.®:/«çE©Õ¨àóW Ú üÀÓÕô4ÑÂÒBåC#1þÿ·¤7/^L<x0öÐÖÚÒò±PÀ73s7dCggÞÛyó°ý8U¢UëhÀtle}IࢦA8ÞÿÃhQE19"ÁÎĹrdÑXc~KÙ¡º;P_©49{É Õ1±J@ô9 ^0®ÈwÉ*PÑõÈÆàgÁ+mf5»ö}Ö <ês:Çáy~ÍF°<jÒk) eÌ»Í8õ%v4:³ Û8@ÖÉ ZÄË3ùÐÁo»áغèþ.+I ¡_IKÓÅÆrUÙfÚ}PaÂ8aqïy,Ï")×ýî=ÛtkL7Ë~µÁoD?Çæ£Æå +téɹ,KByñØ)ã$]æFd V¶&´Ìþ¤Ä¹ÊWÛ)εI×Ö#â¼UC ÀÄ®DI\uí @ÔÕ4%Á<cBHi|®"Á»V¹pÚÚÿÿGö`y@*@ HØî¨ÇTåäe>z¦§çdUx®^ÝvÔ»&dE ©~ÎãFÝÑm¿©ñR<Ç£2#ý8Æ'ãý¦3\#`7j¿H1¿x,<Äú8&OËéj@h'V)Uü÷Þ¯ÁÍórMÝQú®Ëún^ZË ·ÐÜËÏAØÉÃ{yøÜOf/äPyÏZxY<ðß|õzÊQhBÍ×JÀuýLû8H\N°å*ÎaRRtZfU,ä'-'?µÂb2ª5ëØÁn²l£¬[ plo¨¸ÿǬ&uN%«?¹ðëùE¤¼ã\QæÅÕMS»Ø0ÿÂRÚÛßòkD¦~Pb«ø6A®°© ßQÜÌÀ-°:?¨Ùzv»(°[æâB 8µJ ÂÑ`T8]í>U EiFàÍ\̽À<.¶M6û;èþ¹k,_ s 6°ÈÊ^©ê¼²A3u?]éa}0ypSÑ?{_"µ|§¯~2-iØaìOÃpi±W<*ã˨ÞUx_oõÍ,ÂCKHn'Û\~EØ#uepQûm£è¥.$`a9æÂV¢á®IÝ&.;îUÏb²UrÕ©vÎ×1"M ~Pj_¥ÕHÿ2YÒiÝç}G:*Ëê²s<8zIäÍ(õ½l½ôÞ|nÈq3Ó'iª¤MüêÄG¢Ú³¤XÕqF&ø@ª-ímÐö³G/ªÍ·Í åçÓ§¯Iìp[h@±¼.â]Ú!mâïâêªÏʰ]*ô° Íb"«~ÊràoG5Hæ0J¸,(rqPu5ÒÕ{Úm¢Âë:®e\Öd¦ÇôµH·NRý' Ó´<è& bU·2bÆÂà/¬»qS¤Gªºs}C-àå}7Iû@o¨ûÙM|)¦øn^¾\oæ7¹Ë¸G»!Q»]¹:µxQÔ®±+fJ>ör<áï ª¦ÿ¸4è¦DI]l'dÉ´TÆ ¢¦ÓQox5U]Hsí%ç¬-qCO+kçén[µ>ìßoZúeóéëæè¨jøâU´.NXô*ç^Úò HSû! Kñ µqàÇ!-Hú7ùnw6ß TȺìxîA§îØËDQ\Çë½ÏÌEù©kÙi¢áQ XÊ`tá¦ê¶àÿÿÑÏÄF4))Ϲ·ÅîI`¹s_çãã¸ÀÓñâA¤2>Ô<ëDO'ɲ&»Å ¬ízU¨©è½ælñZ|"q¼)=D̾4,ÝVÂLëË6y@"G>ª>ó""kg ª×üêÜ1Jf}7ÎlúÚîa]¢íÈ¿@ü\c2j}>]¾öÓn))åm䬨¯8âÆÞ¦ i=ä K=#&aý¤ÚÌ$âûÝu]ÚxttÐfAî:G¢Ü© U2jã ¡¸Lu¬Ö_pÉ8½\©´d É6»2z'ö[wÈ ÖWæáåë±l`Ku*/#CTÃ"¸Üd²"mß×Êïwbcüu;ÛWë¤× ñî6Ç?]»ëûVGvbÝæßàôôû®R4<öì¸?0Sµ}sIÃ{î?6Ø¢nðIø' [ëÜÉÆ¸PHHÝï!ìø¤&afÞo^wÓÜîy~LSáÒdà+Wgʤ#(øãÅîËJr¥4D4î-f=3Ã^зø|º4ÿÍÕVDDÂÈ¥&²)õ\?"õCã§úØcÉ¿îgb8[|qù2gfÖÔ{ø!Õ1_usUMTEO qbEDQ`Ä®¥Bu¬ffwPÌ;\Þ*Ú5n{ ÚÀº#xÃ-ò1.Çj«Â®qñ©'¸uLÿÛ{1É.²¬ h¦ÿ!03da'¼rÈø7¥ÍbT \¹G5{)¶lû©w%ñV\åWÜ£@´dÇ´EÈ~¨|+[mBu¡5 êÕ²²c±££`ÁÁbOòÀË. tųU´×Qï+L¥:µ`°R×âeS>åÁãMâE£¥%ÙÎwÛ¿n*¬-ò½sêÜßQL;ͶmúÓòçþj¼øÙa<ÃSç ígÊ+H.edJBé-%ÈPtÊõ «Mhäçté[ÕÙªó¥}Ç~ÃWKkîæËRN÷?º¶ ]é ¶1Ñ`âñCü$ÿÑðÌÁh[-¥,vK©áÂìÎÌ9çÖ,Óo [h±¦á$ güÍÔ1¸öÈ6Ûy\F&#ÑÐSxÎUÝlç$e|v¥·þh: ²^rzÀ@mîÐ/>i·¸$ðnUNtÂCó²Ãïòéê Õ';QlºÃÆe çt¾ð.Ü"ÔòíµÜæðX®ÛåÜ}×BúQJ˵żß2/výÆøpÛkÇl~^À@¶sà¡âôAà%[ïð(,²%óþ=6|i@Zͤl¼há{^åÌn,¥8ì ¡T¼Þ÷:TܸLÛ(NIUG _°- ö^*(õÆ *~>ú¶"ØvÊ[¡lOó°"}YþsjÓovÏQ¿(¸l]ÃPºGäÒ©³Á3ÔBvoýpBPumöÍ\é?xºÝa ¨ð Ï@ByVU Ú[¿±ßÓÿé±^ 8tf¸#äØÞÇxwgJXÁk+E¨úZºNáÃp ,XX\ºÄ:Å4¬-Kf©ÞãIeØK:¨re®ïk*R)äñ AuÆè"Ë3Öû=}|Èíq¾\ãìq{ÉDÛoEíïeØï 1X⵩y|åÃÆ©.6WËèL7ãÀpo¨fɺÕ#aýNX°pñx´Zgã>É|¥9 p )¾·4á¶õ%kxZcb Øt@±.úÒ4rÕzH{*+ƱiÄ8\/³IðÐ[qôZkèÀ;ÁOH}¢Ã@®HabrðjØóÝ~7d+UõÁ'¼©¤/-h´ºú áÉý]`᤹ö(NøÉê0¶½Õ)G6K¾öù9Ë8ϲuØX>~äé|wxÿp«³ g³ð®¶¬\«ãZ*éÍ[$%çtw®vºþpýÅ'`îI Ê1¦øßíöNdrïrCH6©â¦ÚoÑ©¬Cj2Ý{%5ËóQ³LMr)tèÆ<5¼´õbÙóÊO½R9³Ó÷/ ÎÜSÐ hr{ïéÌy̨ åâ/×êq` {ÐÔVñÂQ¯óçâ+¹ÅÁ@ó³å=â«Ò AA;5käØÖ{Íî"âÝÍÕôó Ùô~ MfKFÇMÝo³ç§ÉG`k̶²Uýíè¥í0M¹?¸ ÷(è J5¦ûrrO§Dð"ÒN´q3;¨4³ø_$¬õzÚÌ #WKa½ÆÄÔât)Á ¶eÌï°U×óÄõ8ÙiFÞJªÇP$þù^I®#} Xp{@?Ä¡nZ=¸ÞÇI4lw=ù,^æf5Îô~ AäÚ¦Ê÷Áò÷ýFñÔ¡z¶a¯øHG4ä¡V «¦nÏìï -®ñáÛ!%¬û8íþì:Xi@; 8øUÃÔ;s»0u.» Ã@Í%n8AÑM+ñÃýîûìªV¢¥- ò á§÷zJÄÒM<×ö3Þ²Æ÷½çäË̼|8Ìë¨Îë¹SG|Û¸¥Ö\åÆÉHYHÎÃýXú¸ÐÆìYü½°¬B: ¿Ú¨çYDm}Wq90Ë+¿pË´p86ièx²B¸BK[ü±½Íq7zÑ_h~ØT,D 7·iï+ ÏÔ©A¤]\öó¬WÝu¿$7(o¿hxXdµØz_T±SaÓFÚ¤gYe8°yôX@#êAbyö§[×¥}WéSßõM6%=x9²4^úÞDÓÀ,4ÕÊú,kÉB!±¬ÏC£àïL!ö$¸. ÎÈïßx`N¿'[¢Â¿³ðUÑz" 1O)Ns<uÎÒz± £"K°]ÏæP¯ 'J}9U5ö];´¬Ú(ìX;g1ákTv¬©Ò6e³%UÚ ¼Hª§sÎH,·Ìñ<¨ ª½'YægA Q Bhêauhà V' ¸ÿ Màtß»ìS7CiÛ6v^Y2äÙëÇþ¸;RCÏ£ÄÌ3/ξ˰s2#J^þ¸Sþ\ШBèÍÒïÖß±Z+¾±-qÜØNµþ½jú!(.5ÛN=`¾G9òF(ñöÄaC"p(®s§ôvU,˹ü³"?ðt-I QB¾ º ܺðÞá )dì~/²EMÒ3Óï×ͧoÌæ$Rº}g]8ïöJ¹ Ïz¾å{¬¢ÄbZRv¨ÀµhÐÁÑEE³Ô/ýhßÙs4âtjÀ»ÈÕ÷Å5w¤2ÑùrϹ^æ©´/ùBZ´ºDMcã&_ßYØZË\á;g¶UkypYð7°¯¡M¹è% 1°/ÁÈ4#VTûìdêBgD½GE?õý°ýÆÒÿÄi"É1ô#; ,_ÄQXZÑTI3wÁ©KÃ}ÄyvñܽôXóùzè ¨m BåCmë¶.vø:f·öàÎ,F¨}ì̡Ⱥçǰ¡Á(ª³7´ÕöO *¦I;ß×udÛ$L½ ý°ñÃýä~ø þÚÁ¿ÈO~æû ãÇ&I ÐçùXî´³ ëÀ 9ß|sÚ©qßÞñ_ a1~IÇX±fH9$Ðé nÖñ±oÈz¿³<gUvþàéÚv¢`»Øti#ýc¿Ç0Æ×Þn¡W¡ÎúÝåìì9»sfT8OÍùÍE,åJ2w%Å%æ°â²êöz`UòP¶Ý{úúÖÇ ®dQëÈÖÏ,eLfw%[ïÊz±Pu¾ê§'q%ñ0}û´p7/ wj}Ò·W9¶ÔôèYÔ¢A$ú>á(OÆ££ðÖ$ÆÔ( E. ¬bOEmt×Rÿ¤¡Oö0¨É8]d¡±ø¶¶fƬŤ¹çÆÃ_[LZ·{M·CAeO¨ B:Óñ)¶ÍédÁ>.zó¥¹vxº¡ HåQÐIñ@&Lüÿ?À³ïF¨H+µÐ*uf½¾ìÛ}±7æùuo-]7.9´ÇBTâ·EBÎþHGÖèhÜÆC5AÔ|«0ÂV¨"¾X¨ÅÐjªmãÛæmCíÎ9vþâlö~7<!8µlw¶ ÇYx×=,WOY§Dhækâ<Qß®I÷ÝfR )âpÃÃêý³ÃG¡?;u¡ [B`ÑÙ|¯Ç>ª8Þú=HùOF¨ãzI±WFÊKÙíÅç»äÔmúAñ ÀÕµí$ÁRNiJ0Æ[¢/>øÿ?àøÆPh°íA±T(uælÆ' äݽÍ2å~ â¼dj^«¸.¡viØèãæÁk#`w@«¿4b>Eîj©´Ô;\ÜFçÇTT7ztÁΨ° IÊæê)=knpKÿ!òÝÑé Î?à´X~_ÍUjöR]EÒÌ[DqÌsX<Î ¹qGtW»Äº23Ì.¸pÚÞ VÝwíÇ»Ûçi²È· Îò² 1& Ü<ðL^º¥oéöé2eRîûi2áÒ\õ) ¤p· nCÒYDêF8óJºíÓ¼"°8ÁëÃ,t;íB?,'S«XJº@7AÀAV-_°Ó$Ì̱£N[p9®½Û:M{ ²D¼6Ù×]o#ì/n_'K¯UÆÜËp&±_ªÀýÜøJ¡Lc2MYͽLmpÉi0>`ÉßðK8'°|FÚ¡O Ò![ëÅ' )Oí< ýK¾º(:(PJC1 !Ѹ÷ÿÀ+7h"¾@B ´ÊÐòÐsîŲ!$LÒîÜ9ç¾Ó ©"Ïp²í Èþuó§½éw¤õÁ=ó(dç½Ï©ç,sdªlÃñe~ekPïu4QÇ\^ÕÓiÁ,AµlüèE]>Ùµ¡l"µ¸ÓMñ·cß4^áìÁS>?¾zPÓ^¤[ wSI%¬oµ¢´ ÷UØÒIËÂ×]9k45Ò_0þZ è¢ÝäÌÖ7® øf `Ͷ$® ¾m"Zl|éiæ«éb%ÞòÒ}N ØÎâ¡G H%nο½RÄÈ [ ]CÔ¨ Nïn4¶ÐKÆö¹è(x¸=Ãì/½ëQ[ðeZ§ÉgúÐù,C¿:@JÓà7ÖeröNnpÏÖlº-Ù·ÑsûtoÄÝGpD©@tÖª(Ù&"f rÛ¢KDÏÒßã8¦ÃSÝ#ü ÖC´<^ úÙ \X"lÝùþÙ ëEôãÉ&ñAÜs£Í ÐÇ«±r?ðVÚ FÜÑñ' 6õ29zmÚ¡6åê\!`nñÓ´`<LËÁ®(°\àþ7õ,¶±U´¶®¨J ¨D}uðc´ ÚáÆè^=b ¼Ø½eüÌqÀ`gXUlàTÌÙ%M£Ó\êu±[k½M;'´s7ÿµlz3W-¢$Ù9®s`+_»!त(ÜBOT @Ü:7¯)päãËw¼\Ý9°°ÍBØó¼Ò ¡.§UYþT3(ßý4ç`/AO½ÅU<ûÃ÷>Y òÚ°¥khÉbý®W÷aj¶øZÇlªlB#þø\%üï5ÍRæFu·£äÖñx>t}`q%ßßsY°¬ÆläÙ¸cûª£ðãë¢ÃæÐ¹Þκ¶¡ h[ ¥åRÁP¼Ä_>þ×ñFãbDîB[©3»¨o}9mÚ³gfÏÎðO¹ÚÖj×û ûô¸TQÛwÙíFJÿ«n¥×ù8 üN·ËL®|XîmfåÇÝ1e± ~¥l&ÃäÏBcbæÃæÈË{æ®°ð^1TÕJ<)`¸Æ¤þÐÓ«Xa½º^«Úßdͪ´Ö¡qϸñ¢`ɰ4(IÑ_[/$¥ëã´J¥ÕRW7 #í%ú D¹M¹YzYÏÌÔ<îv·³çÌåL¥Ò´nºtûUЫ¨û> ¹m8 n¦Å '[*g!ÔÄ}ÂVï+6G|¥15ïoJ×Õqq0Yq]÷f5¦6a¡w]s=IcÖf dL.Ë}ò´ÎÈO¸»Í~æ°ñ ¸°# Ï5ɤàä&ý/«f[öOzãi>§n«íÚj¡·Ñr^ŧȿàéÚVhsiÓl±&¥Ú¢â¥E ¢ßà¿ëøâ (´b6MÓÖsfoyìÎÎÎìýú8â½nåsËw¦æþ !¢S}d<,±NÄÄåaä$2á0«!B¹D£äÎ÷¸:R¹ ûQ2Öô3VvRUx±û-ß| q£ Ý¢Jn<ÛnDí$âW?::Ä9wËàwlkÙ'hÚ³QäµÕ¨lèñÑ!4?ÍVºæ2 !½ÒYßwïFeÆøF.<?=¼<ëöÌ*5Ëg/oßS×D3è5_æ)rÛè6ã`Ìh.¿.ö´¬ôiôÛ¢?ÊtëwûñD\"yWÍ«°é´b{{ð®\O_ýqîÐüc¤ÙÎ3ç ¶Áí «ïìy%Ëå®ì#çä:ö.ºiEþfغê¨S»Ë`;s]ûO ÖÚK}o¦n$Ýy³óf `ö÷f.¾], õÔ)p|SiyyOõ lÎhÛ Õ´æsTqØîðÎÓEv?,º=ïáÒÒù©kYJlx ýò7ದób}Ås H1¬ç4álQ"Û«Yº[N«ðjÀ-+dتyV^ÆÄ9*ñ ¦ÃþëS×j9ð?º(êJKå!B AÆÿÿ]iâF å° ¥çÌ-q 4éÌ;÷!C{¦ºãìrR³ÊáUµZå{~g½Yc®eÞ³EÁbT>ã]§qÄyc§YÇQU0ª(ýÉ5}&3wSü´ÆÝQ8{º£ Uf1 ¥ kôñøvÇɼ͹²E_Õ³JâWw5?ýw âVJ@¹Z5¾¦éôúýúö¥o}iL±A" Òs4é!¢°Ù³;söd ¬ièFÄ-æ<i]7îgG¯Õ*×b8^ôØõ[945÷®·-xò÷ ÙñÖ 4A§__ɾ76^÷SoFÈß®eg¦¾v¦»ÈàÖHYëªÕÌá+Xïi)´XyÝÕ¾ú$TÐÕµÞ+tðõjW~÷¨a¨@/UDë¯`!½øG|#å£íYÞXdh(B×]ôêɪSgly6Èê¯ ¼EIJ#ú4Ip,åÑoëf9%'M´Ñ:jõ ªMLz >_Éýk-<ä4T]Nù?ðtm; A´´Ðn×ô$ xÊ7øÿßá5ØTÛÒ]ÏÙ^x ÛôKÆ\@æÐ¢Â2 cÈár¿Îz»£ ´hüðnÂÕ3ÎO|Ç7ýÛ®]¥£]%-jZG'¾×0ùÃòÍkÄÉûÇä®VñËé0#s\®;âï¤Ü|wÑÚÀ÷7¿[«5ß¼|7³Ðë>_Wõ¼Þ?.S;Ñ;c4<(¼UÛçEûe½7AÓÿ4o´ßߥ.ÎÌÎ#YFþ!ÓÔ?¶-kÿ\OpbÈ^¯£ 6NsCÁ;V$ÔöéAy¦2ª%%ÙµÒ¤_Ë" H¡ï»·Kò4çW,ú\BT<c¬º}H.Ý(D!>y÷u6C§q?uh`¬Ì4ö çaìcÿJÃgçAç>´SÇtûj:è¥iæ©å{ì!*eÕÞèmè]6Ñ-xQÏTáh¥uíø}¬àÌQ-Ô6H|/© a^þ@Ôµ,%ÁKxdT RâÑðÿ?Àòh)¥IbØ$¬=3n`C%ÞÙ?¬wä5¥ãíÖV"½²ùÖÌìVÑ6¬®!óîÙý Ù±è7ß×"¨¤' tìSºåCA7Ä"ºã¼½9 Ú(sHã02¬\<,.è vÐî3fÂUg·©ÉÊMYà¢wÓ{î»æLðàóŧ8õâ3Â{<Ä'YÂh#^NSui¾Ýb«9=ùæ?¸D(Ó`öÒûbñÍ¥ïêC¾êYñ¯æ,iNSdϪÊ'_ò4a{µï7²áê]{Ý6Ö°i(ªµªmJ'cÜÏÒ'D Ú{êG¦q1Ët½¿$Êê$4|Lö @g'Õx]Q"kìP¯ìu<2üü¶â[㩺 HK¡w«jh<=ð þÿÅñ¢B"¯Z¡Buf¯$ îcö1;fyç~Qu=cÝv¶¾¹XÅ(kìrq&%»äéFT ²ÜmÙª±åà}ó:¬}Ô©`Py6L.5(§¶Ì+ûî2]ÂíênÍ ß[K=/xئdYüL§Ç»&îúq;Õ FS²9\üE¸ ÃÀ}óñ*â¹YÑ<¼¿òg$Ta4ù:#VÍÆÈL)Éyþà·ªj½ à®] \fvȺġTçGí^ =9×u`?+ÚBTu<kU m¾Ámú5>¬&ï ¼}òê}Ó±oÏ»d?Éé_º²¡ Ú Hjl(Æÿÿï>ùbâH¶t£¥xÎ_ÐåÎ9g3FÞ³dåkï®Ì>·Ç«Ø1U`ªÕ|j¢~S qpÿÏÌ·}³-(8ûhFz(tÙ¶ ö'îy>¯!Åía»'Ø[}Ô©/ÿDx]Öqb ñZídMéÖ³U«é¹¯ B_D AHq«pÏ'cÄ o4EÁN<g.>ßßbÝùéÉ|½iµ¦~ò¬Ô F µ0¸Ã&©ñgp´;3 %\Øýýò®QyO%b,K»$ÙOä-Bm?»ð[X7(ÇË~'8VéÚyßó® í!t¿)ÃÐ&´K®©Téu|ÿôʵYùümÕ!,K@ÀX²I¨éû"5iDv¤J+)AÈ9Âx¸Ë˶|KK²¼ÀÈhúµ3/ÊòO ø]âMÛµQ©vÚ ¢²6âÉkLþ{®bbÅçév÷ºù*;Î&¨&èLô¯Q·SF7>Íâ«ç±ÆUº.q"s«,ôô½ÍG×Élþ]ûü ozB(Qq|ØúþÆâ©ÔuÝÇn¯ÏákT óO%m04Öý¿Úïr}YÆ6'£N\öâ¤J»ÝdT0§$eî¯õÇê$}?þ¯ËqÔ©3ë«0¡É¶Ø¬uö>¾øh[ ØæÜ íyò hÉL·¾NúyXw½ì6ÅKáÑ Î5&º>¾óþk7Á~°ìãâýxÔl¶ú]ölD §¾-ô¥ÆÌyºË;¥,4JÁÒGÙùe£F¬½,'?¬[Zv± cYäâÜ7b QY¢§´J º#9ùöàÚz ök½(ÎF&êí©µ¤e+©\¤àCØÛtÄ2ÎÙѵmSU[Tyb ëãÀY Ûî±Päy"Í'Ëï§æ¶0ãP* µWÄRÐ\)D7 úx`3«ïþª¿óÁñËRâª[þ;åpbcö"¹A¾Õ2 ¬k4Hl19PvycÕ#£0°õÚÉ}¨ìû7gÛÖÆ qÓR©ÏªÎ¢D&þÙ¢-Ì_l¾Ä¨Î£ÄAÒ˯Ó8 ÓÚo¢ÞjYÀźy}ÈÓ¶«ò çñ!çâsñ;ÉÜùúiÆv=S³aiÁý e¢!Òùÿ!¬9åÍJFOî²GAV?ª*ÛMÞÃßúÚ8½?ºº ÈGÊ´\û¢¨il|Ñ'ÿÿoñÕDh%0-P>êÌ._IS¸ã¸ÛÙqv«+=âo¬±)ØZÚN§7 ÂThrX»Þ4ÜUï4¼Q}yú@ä¸8$Yø¢ç¾®-#½À¬³dvo¤¢F¨ IiMLORëÆ7Ý$£ea²æ·4gÊM6t´¢ãnùÍ@¡4;PKÌ5;-]Oùá.¢jÍzE?¹®ZÒ}kkè(§¬s÷~%×H%Ë%·À uK øs@puù^Ë$®+ q¿h¦ÁÛ¿2C±ÇQ¯°4Ó´ô|ª¬MvÊó/bªjÀ¢¯ñIûLy6B~`¶«Ë¼vE|lI Ð/@½§ÐHjÖVä¶/·ÕëÖ¼$áÚo6±Ôëo;sá9N~{l?÷ß÷«eÅö ÃY]±{ç¿xOñÚ àæ@7ÑT KóIÛª²-Ë¢ ãà1Çw<r,ã@ÅÀ'#®°næGxùühvVºô"uæXàW veE DOõ/üe¿¥§&51±\ ¶RÀ÷ ñÊXØ}óÞ¾Ù»õÅêk]æß§ö&(°üag;mÜFxã¾Å÷ Ùªrºa, ®pÒëGs2ðprÄÇ«uôÉiªØmq¦ ½.ü_ÕHô¸t¨ÁrOv¸þ4' â2\/!ð£ÛÒñÄß«©¥õq¯«RÛåRt4 %ZøõÀr¦q1_àì" åpVEu\ÿ0èæ ^y|éÛ ªj¡k½¯m ):7K³ÕägÌÃ|njmM@-r*þû¾øis FNw Léo4Ê£ÌMçà¢ríÑÕæO byÙBÀ`P`Ã?øÃþîü ¹É.AJj»Ëå= 02¿pï¶¡åDÚíâ9Ìfw_ØÞ÷×f'kkÝÛÍ^wvi>´Mðm>ãÿ.®ÉbIÅ$M-óÜIµÖªH²nÏUÿùp8K8©ÿZDz5%ýäíÃöD«Uç§E§9÷FÇËQd!óG¯ü¡[̯Õ?¬âÁZfÿ0C#Öm9JÞåtpJò%Ô-è Kc@?|hL[»Ô@-XÓe¤]¢ñd²N2ÜÌÑ'Ñý/f¾sã'$j -7¥ßoÑná¦0® Ím9â#Ë:¹Ë]ÂxKZiTã¿0u%K Q0Yf¦¹`É?Xåÿß¼yñâÁX@Ya3 V ©ñDGNú¤»L©Hgvà{þö0²"HnyòoÔÌ;,`å_ &½o¢4e¤gÕÓÒÔ.aØ9tËK1úUPRäFð F%ÅÑõèóN?)l ?âË4Ô}ÎQRÑÇ·²~m_ç ¸Â¶'1d'XÈ~A¢²È¸¸dB'2õâ*cDµ¡;åÿÍ«eô¸ú%?8®x»î;Jp¹¶7ééiÜ¢^Ap×Bbuàä̬àâ[®?'®xuãé6U!õÂbÎ5ÁÄò&eÁ¢±PÒ û±î9w©3¤So¾¶o(çW ðwÛB×ÕÒ3¹4ÁZXq%ÐL#nÖñ z}öe}ÁBlIáæäÞ**eÁhS~* éë8%z³FSÒ߯ÙjMr8äö°.hÔ;:C,Ægn¤ú }eÐ ?#aʱ:ãé97<aüçìýkn¬ÿXå8ÎÙçâÛ=dCó<iq5ÑmáÅä®v¼D' Á÷·ì`I±Åç}e/Ï¿Õý)Òä àBú/*Ëk|÷¼l Uå«Ó»°Ç+ü[CÀÓ~v 4¯pXµFó]eÐ(üÝa?¤´ ÁD×ÖjdøÒoó¬>í·udXâÙ5qÜÅÑJ÷7Ç@êÞ8y Ç5Þr ) {0°ä;åeÂe\ªxùÎýu¹Ã¦÷¶µ_M{?ÛbH*D¬ñ&'L$ÃáÞüÀh¯WëýÛ¥ËgFú+Ù±ñÄòåE} 9hÀ~qÊ5ÚÍÓ^a×ß&>açÝeØc)LäßAjôâ/øDãìØÌæwz¢Ø:ÉxØÒÈ©´Nkè6nx¶Fhý+ñ)!<AR ê9Ô±ù©«ëMwD=(ÐXѤýÿ¿ ?£Iß&MM?¬i"FäC-tfï ¼C ·;;·3ë-=rëØø£çsòë4M/¢ñð-ÛjuÄÛÍ~¾ ¸¥¼C©aÍN:»²ãÔÀ«<D1ëf"a*ÚìÞ¦Ãð aÊÓI£NQ düæ¬w:Ú"¬TE|Üvõ5¼/OT0e+ðÊæ|: !Uyò(G'Ý_çHX´Mn.7ѯ ³Ì³ÀüÓZéï5£S¥r¼Ü?\=³ ài½RrIà³_g*R»HhÖaÂÊk] q°gu¯ÏËÕÝüåiǯÍÀiwüG>¤ÙOßÌ--LMdi:Ã8iVcß«ªÝgè9LUó,* c&%óËõo¥ôh¥ í:kBi0VîÅ¢þgQ ð Ów;I J_ë¹Z *j²I?WîêJSß"S(TêÛ`,k+» ü¾2]Ù·¿xÔv|Y˱Qø"\g86çÐÏÄ è#=#gÄ&1|zZvéÑ[.ɨvÑõð-Öîj@àÞßÑ«Wݹ]¤LÕÿÌsÛP¨ðPA{ÅzGö)JGÞ=PB¨¶.*p>¶)ªÜÒç8`ýµÉ \³Ì+ÄDHà éâ«,µÆ §"@i[õú «R& Hiò 6Óh/ýþu(k³AP!>:g÷ê8¸ì=»{ÖÉ:oô¯g ÛiÆÉ¬¥(±éÔÁ(Þ3&m¶«Kÿn0ñS®¹CêiWØFj:'Ú)ÓñÀ`(=6Úi9¦/Dq¿Op¼Ã±ð'Û5õ#ÿéa± i`¶YàB¯zaÔg'%ÍéSlx4¦GGVŦç,'ß,@7(ÒêIàøÓxP o`¬Dûç ÔþÏBEM3sóY t')ü±[I¬E>øÆä+:¬Qú«:, :0ØZIewÀ#W;¹!hÆÖõñ `hêöå¹}ÿfÁWÚ§]êζ.Ìã²¥øL;k¨¦P¥-ZNÛÏaòà: '²GõCKësðáÎ+ó+ù¡T)©¼mrŨäe{SÕ0gZüÅêô.kÚ'»èw¯ômGÁØl«õ¯Ée÷|wTâèk@«å"Ø}çþtplcx¶·¨þÓK~ãVF.á#nþ êZ R!< J)zòàÝÿÿ<P%©JIH²y.vï8r ÙW7½Ñ"æa$¶»+Ú8#© çÞno¶Úã@þÉr¾ûÜÚ"6áæñÑ©)`RýÙª¸ÄZ)x`®)IË µ´*ÉCÞk+®\±uylI±È (xuakL:¶s§öTn}äJ2Wbí^ïDö¾ì ;¯hzE¶^xÚ`ÓH] f?¿ò Ôë¸ÿ6Qóu0éÛÃaóåÎç¥ßÏÍF·Îaù輦íÏs¤¶¶ÄèS£âxfÞ¼"ÀÇoüLª@ N. ¹@ÔèÜe¯{Y²?áÿÿ[eq Aa*vNd[âñ¶÷´¶Ä8,ªë×ñ$å"°Ùð.t õìà r¯.³eÓ©T´À6æZ<ì¹ ·bÐ!Øâ%û°nÆI2øk ¦<îl<_ ºªØ¾ Óà´qYU«VpUõ¹ YCNø;øªJà:?¨.ï[ÊKºF}þÇÕàé2 î6«í/!Ý~%P²ÚéêÕ "ÃÒõ!: =ò ð ÿÿ¯ø ÆhÄ(J¡3· Ä¡°ÇîÌíÎ,EnÀÌϳ >õazj+$çàTÃ0ÝÀÔq%ke®îõÝ ^ñ:`˳Һs§$Gï4Ë_wAÅ:BL?t'gýÂâº]z¡ éI8ÞM?Nsâ2Ï^çßý0ØmW_³Ô¸×Ü6+C+ûH'(ðà´´Aú*#6R¹ñ}¨Àõv²Ú£(ÞsÂj±£vÑDà+41:§©óFÆØ-ív|Ç«éd$]"ÿc} Gb@±Ê!dñõÓ(ãâçyuÚêè~[t#f÷3 M)'£ñ§gäæEîZþoªnuºnÃí]Ql^Þð &p¨?º²¡ jѶl·åB!jbâÿÑ}11Cè-]h=çU^.sgæÌrNoó³¨Ñ±5ÃiÑ[D³,;:ûà;¥?/)ï$P9 zNY¸tküÌ EÂwô¯Br¢ôûÙC)NãIKMV»öT<5yÛ}ÚaWLòÀhUÌ4Ç?Ñ>ò&|AȰIùL}2¸h.r¥5]Æ!i h»x;)r'I,[y.¹ÿ=ép³W`S4²? æECEQ£(ãJë¾íj÷v+»)ª¸eFDiʰÄLPIê²èÜdõþï÷ò±y~}[êþBUe]>ÝÂ`hJù󱫯Þjµ¢À«jÍ]¨²ÓaÎ FÝ^;Í)vàDöAeÀ¾_ú~@½¢Á*àj$±>1÷ T÷5µ#»êÙ<ÄI#CO8:8øÛ6«dhTj£\DZlvÇØ<.oj3>T%:îðYaúÌ~cöéb²W-÷Æ ]º¡Ö^´M¥gºOrÄêõ °1WdÂH,}\0E 8p^æ ß9=`Òæcë¬e@«fëLÅqâªI@Ö+¯£Àõ³z NÿÕ¥¥µÄ'§äU'pù¸øè\JDÝå|¦Ù²0lÃsàþõ¶wÍ vÒ«.CÒöov\QÖ÷"!I.}¯óTasܧD<i o)´4 Å.½NuÞÈùU6Æx°õù"úH8vÔ ¸Ð4Ýï¦?fÚ6ÓæP0ü ÀÓµì&A< ¸á¡RõÐJU{áúÿÿÑÒ$r ãºÌ0`}¤Æúç3_GÛ,!}o´uí-ì{Vf©vàsÑBïtF®[Úoç&º°ÙJ²Ð<˨>½ÙÅ5öÜ3t5ÀÈ ,»Zsྱè\äi$0л¯O¼}pbµ ÐP/=ÍFZØ&UÒ¹óÂu»×&ÑG~`°èÀM§ÔÄ^¢}¨PÓ<µTïöt9éí Û<¸VµÁ±R2évS¨-|`ÇÙäm1ÁTCôûø0ç²iYÁx©pÀ Á¶ mÙ è#$|´×ÛÙ5 Y±)pÇÎ á¤!Zª@"zñ=ü ¬%.:Ðæ,îÐ4:4ÔE¥ØëÒËÞrFÎ;N¤wó6*å6Ñ×ï®·ûdà® !Ù"h{PîßÒeí$ÂT +ëøX«ø¨ý zóp{Àú:z«ÿ ÚäØª[ÿ©Ü¥f`4j( L&}º<Äc=,£â2§#4Ý7ZþxbòÆ»D9´(,s$ϧÛVÛÝfÀ7ÎKÅ¡5r¯ÄU£«ÀÆôâh¬ÿ"QÚà0y].3:ÕÆ=+;#ÛnàPì|À£Þí$꽬¨ª\Ïg~àéÚv¢ `¸¨ÓZÓÆÆç&ýÿoiÒ¤Ö4¦m"JPe·3ç />mÝÙ9·÷IhÄdH,Äjì \} 45EdIT^üK§ó2b*eà !"FâùÙk?L}r¬×@ÛëqÍQ÷K;e2Uõ.ÉÊ<×9Vºº°TÌÑ^FÀÈf¢%1³jñH\üAét¾ß~~]GúÒ¹½mÑÀ³"ÓÒ¤öV(A©üG^£G}LØÍ EpuRì;Ü×8Õê(¬á$³¯Ý©òíØösxmYµÛÛ¹¤-j_À®)òá°õ %°æ*[Êw¡yßÐûñ9Ü?êfvÏx¼÷§%"·ëÏe;(¥5 ¾JZXÏÓe¶óõ3¦íw »Óë÷õ]o9`!M×:µ±Ú)[î \J|ÿòÝO4`t¿ñû·XÌÓÃêEV¾É"BI éÄ«Ûd) »*jì×¥éìºr{îM«ÀøciV,{¹+&va/ vÙÃÎr$÷â_ ¯ÿ-#i«¬{*¨¹Hº;º,³nðZ¾2ær×W«·¹ðÍË6ÕdEêC*¬é99QhBE ÛºDñ<U!Uéÿ§¯ÉËçûðeu¢Êîò»ÑPÁâáøaç/`ýïCæ9$u}]º&hqúÈáÔ¯¢0ÉëLWîñßzdqúý$˺;ÄFZݵ4297-#ÍÇL(}dP¤ºÐ)çwµj ùòoÀ£)6Lo¦ó?ëèíG¾Ü<ä;Ñ4²U§?ßh¹\åü&|+é¯qÃ'±nT¢öZ Ñôø5¢3ߢï¾ôÇp(Ç è<b $d¥àkkY«ë?Iªn¡Ò>#g¿¯ñTL×meܲJ»¼|4Ýõ^Éã¾³,-ܶ#?ññúv¥zü8DtÛôVµÚ¬/¥-ìH)fdèS$*@U¥¬6¬F¡b¡Ò-6*üâÏÍàÚð´@ÉTï¯]uÒÈøÉÉuZÓÆTú¸b§ç°äåg©(ücõoïé7¦z]D/qsj3¾!àÆëÊe.[¡w-.w RZÀçä ä3J·ÅÈsêû6Ü?|ïêÆ~§#EIáuRµÜΦn¡ ¿×õý §2bÿ.¨©íÈeH*"R¾ ËÅåóÌ4ÊDV´Hû¨tYO³Òõ<ñaØÓn5/:tÁp±GȧÏ2låjdË6Zã "$D¨Åî/)n[Ùéé1iÀÖi¶´¶>óëôÀê¶ÃÂÕÇ=[À§ÍBsRv°äÈ#ê³Ë-Ë]:32;²°¨º¤dîÈoÜt¹ýÆ6]9ì©*§¥O3©è*Àiv'j\ÚN ³EȦüçÚ¥>ô'ÖÒ_£É{dL*°Dá"qüÕëâð)ÂzwËç9å(´ÂCàÊVpü}+5K X 8éJfF¹ :ï3¦pÇÑ¿ñ\ EvAéæ_ë¢gª(Ì0u5= A¥¥À*.iÚ ãÕ?ßÿM#>ZJ}o¢èÎîÌfæ=l*i$j¿Awmj,úîç<M±û=T׿TÐÅnQ 6²¦ÞjVÖuÓb¶:=+â«M"lbwÅIc£ªJ£ pmúîÂìXåÄÔ¢ ãV®:LÄrøµ¯>'¹Èe+×w:.ÁvßݯƺÒ(oO[òžEnXëÀð¥EüR² ` 8LH W Àytr¤¸©>òÁHe°U<IV¹(ºñª×·µgDVÐöAD¥Î®§[²AKLf½§Ì"¨m 3=ÌG#Í õDæ3M$FÖ¬pßÍ¢iæ[G (Ye·_r_@¦Ó¹a²{êûmÂX÷þØÒ"¢$ðÓUuâ|úÄdF~!'ñgñå| ýq506*¾ª{G¬ùÒçpøýÂoàPpÆH6ÕlÁÿGLÝø¢vU?æ¹6ãs¹@ÍGBçÞ7[-"f"úá` áÓËÝHG+'¿0uEË Â@0ètZÛÿÿ?ú}èôI[;jQP¤»wÈøÃdr·ìíÚB( ß^7 IÚÝ© O>qvlÍ +¤ Pë5Yݦ¾!X} *Ô˦»Et ¨mkR¦ïýÿ¿èsôÅ[ä¢Ò¥3»}1<O³;{ézu±YÅîM ("ìU£¦(nKæc ÀhQãR$©ö²²ÔËïHV;Y§Mîùq´Zß*q/"oÑÀJà ۮk²\î$)¬ëF¦@TÔ¯emûLÌgæ(|Æ|n6ÓiS=@à;`%EÓ@#u³×wêôÛ4\ åêEÚñ¨5;=úw¨rå69'ïÞ^Ã÷ïèì#ºÖ N?þnÇ-a7ðz[Ïç{SáöÃý4ËìL0]Ѥ Óuá(¾¢]{ú¢è R`³º(E.ÚN^ûíDPaÐwÇÛ@ÉaögÊÃÞ°}¼ElÒJ¶3E^JT<Ùï^Õ(#Éb®í l=d¾ègûçWèiG5ë&K6¡AFÇÐP5èI^̦&K¹0CÑT£v4@^H&(¼ÞmÝÌA ì¥E)ÕâbWÒÛ9 T¼§»8GѾb¤ HÑfz3|ýHF¡¶å/¼~lVR5)ÀNt` R°´I[úÿÓÄÔ´öfÚµ4rU:³¤/>A9gÝÛqä¤Á)oýÝl£&C\åU³¶Sɧ@N âmMÍ. h«)I¬zDZô´7´&ÑÎõfjØÛT(Úäã¤Üô9wvÙÖµ<@ññ]ßmqÑ]-EÜÄP5}çsó ß¶XÌájõC<÷³èqùB, ¤í`uÏ_«Dõ:}ã¦Ø±5¢,RÃzÄØùÉ3áCJÊOy§ðu8D@ä0äeµBäE>óôZ!a»ÍsêS³6¾§¶jxMÎAEÕû0ãY=ý{ÿYfµ-å =Z <CÎz®µø~µ~ úÀ[×ûþ1±=Í-Ë\ÉK°ýI÷t¸ÖoþhÄ$>¡[¡Lên ´=&ò72öD¹Áx<aß¼p<\ÙøOd]ÿ;îe ëgt®ù¸Àá_åþäz{Ýî¾>.ðídÛºtE¿°¡ÞåÌu}k=ð½xVUÛ3"@hê+fÒ/â#² xzH¬ÀÖáÙÔ`ÑK ÑfýÉLÏ áéÓscÌU&³nnf¿¦øÍ;FÿfaBË :T©¨ÀTÁùÞ±Ì:pbÃg©ÝÑTK®Ð?ÚÀt@¼Cï;PÓg1Ó8²¹sn W;1ðïwÁÙNâàÜ\¤^×9yÁþ`êZàf y âQK ðÿÂÀA/¥<CB¨Äîéòâìfvºgvº=rYs· öçËbnÚ¡ÍFüjIÄt;Jp\¿Úl Ö|Ï:>Î+ÐõìiNÙtµÚµÐañL1¶FÓé»àÁÿ?"<H9lØTV´±(¥ã;ªÐ1Zm@iÎ4X2@On RìÅKZ©æ£ÉwÿüãÌoê¤IÜ¢('q°ü^¿]uT 8óLLò±$ õáÅŪ6¾5âÇï@/õl)3ç¨Z]*lO¢jUHã m¯,»OÑȵ6ñu_¹B6@$¨wÄ*C¶uí@NÒj[ù!6÷¹±'VNGÞâ·b7гÀÜIt¢DiµX[<ëãþP»?ºå¡ $/q£®^ÿ?æ3rÈ)½Êr î¨Ê ¥¾YzæõL;¾1T*k«ùhø4«f µ4%Ku ÑDÝ·=ÀÞÿIlÙ/³dÓÍ©ÊÝ9bö eæàD¾×·ÒUMIr£*[Pë¡RÑ>MÉ)«4Çn4æäU ÷däH!ëù|§ïÍ2-*(WØV®C»éºæ¦,µm¸ ËXýÄùXÈL ]è¯^ îß7ù~:[&®hCà*ù¨5C©¸³Ù/g\»-éåûpm@@B[¬`BZ}ïd]rÝ¥ì2A(ÏÌ:Sñ¤4u áúêKµòÝQ¯êäõlo{ÚÚ®WëÕâIeÕÿ]ÕÐP ÚÇapL8ºÞÐû¨«éI¢ ¤_j{FñÿÿO&Ô] HKK»m|o¦â6m¶³ó±óæ½+_|0æGoi"̾´~;Ô±pqXΨo¢XeíþgØ)~6"I+ 4]ñÅÔY&¡tñ¿_Ý jîô°³¦®Ò9óe=Ð!É×ì¾ôé$.`r2TäÕñjòâãà Ý"¯Ý {ö-Ä{f7DêçÇðöNõz±W|eH ëO;¹¿Y÷ôüm°¯sÛtuÕ»þW ê¾j?áÿ41Ñ@Z)-%åÙ-~ 618k,@9 ÀÏ# ÆBÓFïÊ¿înn±Ös·SÉcûaÿ,hT!뱡Aë¿M®·Ý½ëAêsXû¾öë³xVÄib½Ä§6ïkñôüò>æ\/=¹Ò=K?¹¢6éZß4ËÃéqY`mê==q½«xc°dè¸ÑjA° ${i'¡f ¿³='¨eCî<O¨|Ðxç÷qäâ)j×êív¸Jú=ÿrç¼Þ¿¤¿Uµµïpz%S¯¡´ÊL·x(éó d«]×87ªûmÔøÃÙ¢19¶ë ec"æ 6©_øÇcÿK"Vk-¥5´|@WàÙfû2tfVò&¥ÇÈÙ_xºå AÞ[,«rÍÿÿEC~ 9HB¬îñ*%¥ûèíf12uÑÿ$,T /ëPlWð÷ê4°ðn"1k¾/dññî4ÜsÇ HqSBëKí*6oò:36w=rMVà³>eqÛvsÝc /ÄæAÁåÄ.Wá)@Ý[X8 §^«+I¥Ã}{¦´º&j2K-@a)9j³.Ã{ýÚ³h`ߺ(&þ_ø&¨Õ$´_á÷aó²þþkËj¤~}ÿh#Ù´]w¦Úg¾ÃÐ_ ò.à¿TÖÌ¢/øîÛWã_Ú¥§ÏÜηçªîàÍÔ÷²$BØi ¶äè,ñfJ/Vey¹ÓÂÀ|Û,êzåÏ$FDîëTj¥²Szîåë´[&|4&<3Jï¹WG¿mÇgÑsEV¤±Øo3Û X9Né9ÝqxatÂUyÁbü¨Äý$ÄÆa¨]Óݪ>#V1´80Nùºº¿xù¨i¯pÇ6ãjÀtSÚx/NÈAÐ6®»6GlRb©tFwÍf4B ,DwÙTq¬,[ðÛÔ\0ÇR+AÄmÚ-î¦ã¶P[,%¢²µÛ' ]L"Moá¿=6>D® µç`¾R¢ëJ/C¶g®ó¹Ýôê×órF"r®³òÒ¨ÃÝç Iµà $/QÖû4FDJÈÄVµh* ßÏB3Ä¿¨zz¸ .Ã×t³±ûïã¾w ËHsí¥KD$W8Ø3v½Ùï¬Û<ÏsíÇ(ýÙ}ñÉ8ð/úöb RjlU´ ÕßaûÛåÖ[U.Qâ{BäCøùáH6µG,íË\øÄñÁ²!TGi%Ц¶ÇÊ«&±Zþ#ú-hLÚñ4]Y{<1=f4H¥°®j{[¤àöÐâ0"ÆR§·æáçuöÝÏ|w·jù¡o2Ó5Z²ã&Y.M2ÓåIÅ,¦N¼Í¹É<©è[»kÚð êÌ\YÞt ¶Xº8ÎÖ,¦&vS3:?bÓô"®`ôÔs¥ò»°ØgJY8jÎà¿Q·#³Up!sWÙyØ2b Ll«Ûç×u»3»QôÖ ÅÏFj6` /úòäx±à ¾ïVNÝ6ÏOåEԪʦ´%PÜà@ª*´>é<'ãdp¹ÈöþGÝV×U V>É@ÐëÖ߯ÇÊ:Ï· ÚHa!.üÿ_aãDA"Ë£gf Û×f5në¤,B¿|dd0-"3U6 (ÞÏ:âZ'A¢´+ó¯Ðu´¶]Uÿ÷ElÒ¹ vØ72×ΣåF+ ;!ú¯Ò²¶ág`þÖssô'.¡Z¼¶a~´W'°¯Ó"c%tx¾7mÎ-;ÒKÇ+¯ö¾ç¢êåVym¯ 'î/Ëü±Ï¾ã4ôN r!Û\M»5F8 ÀÔµì4Á$ní$} ª <¾çàÌ¥ ú8PhZEÙu#°µöîzwvë¯zñ¹ïóuü:_°bÐzD Ølèð.mãÊêPyÅG$EÚÒÝ^wu=_¹3¨õÐ6A²õ°¾!>bÏ$Õa±oÐã/T{ññ·æÁ:¨èqÀ@%ßÍtC%MYêíª¾¥KyYj°ÉÏ¡ÇÓà_lÆ#ã$¾û4É~èµ_¦<¸ÕÇ÷Uyñ¾Kß´î´ÚÛiá;âòû*7Ƹ¸óg;WJ®±kÚ,<ÎB¾\.©F¾÷8ýXÿ0*l".U w¿~¾OD¨ûílÙëÙ·7+¸Mrïü;¬·>ضä5#jP°^DÛê¦ÒB>fyÆZö¹¶FíªjÞnVÏØ±aW4Þý@ccüI©]O2*¨%Kòn¤ü帱Ùİ`èJsmë ÌÓt|?<ÜUTÚÈä#§('Â5+D" ý²Ð÷ ÕÌyá?ÏÊ]Æö0ª6ÙtºP¸õÅ£Ñ`ò{Ê~˧0Ulwwc&f`Ç_ÿÕh*x!9ƸöfÿÄË-ñ¬½åë?|?pÎÍ$}¥Ï¦öü3Üü; ¸}\̬mNĹ{Üsÿ¾£ ie¬Øò~¿wïÞó/´ÈËû·ªºÐ0ÄÜÜeP ³©íÜà ¬c§ú/mk»no/Â0N¬VéÀ÷ñ«ô®µÜ¦Rî*Ë_7ó5*¦Î3Ð}á-÷äÃ]²tûô0t%õ²Z.=a|~4È:2¯(Q§ Jw×*&Âä}<ú×=Új*^k¶Ú˸ùòQÝúýÌáÙ-ljå>½Ø³s¦!Ü©Y@¤×ßÑÕng²,i9vô"¨ÒKó"5+1§=úuãMö½.±÷l¡èj8BÞC=wù]0u-; QÔô¶"Úàb,þÿFWîLD¥GJ_3ª¤ôÎÜs_稤äL\Zy Þ l©,Ä çÝ£®ºÑi/·e"À \k§|ꮨ´t®1sO=Yw´4즰Þ|þ2=ç`Ûð¡) ;Ú¿±°MÕ½¹ãìÕÀ1á÷ã¾û' E7.ÿÿ~.L&XJ¤7-öI[ÏÌKº`qgæÎ¹ó8G¯UvÔß¶mX°î¢Â¢Ö9àÚºy$A`jÌÜ"<Å ûp©$«ÝÍ+T6ç2"Ütõ¾Aãùb éôZ¤¨ém#lgû\'U*ç}úÖ.AH±¢}¤=ÍàX, Y§Éj¾Î§§Ù@¼4ÜtR¡T(§1ñ>Pß(1# Z²áì¼UÃËóýÃòÉ´ú×T>g¶±ÓÌÝ@Íì?ÐÆþþ3Lá?ÝpÐA ´ÌûÚ äÜýWÚã,ðª=|u)VÙÁs¼wPá¼ AÚðt®; AnzZÙ4òþdLü¡ÁËRB©çÌ +Â3ýÄ9äYlwJÄXZ|Mø©:!M¾hKÙÃE{Î{7±Ñ¬Ùñ ÜüêfâÀJ4®Lèã[ËÖ0¸ÙJ»þjä(E©&ócíÞ¹â5å=¯½«YÙ@¢jé¥ð2Ø£Îîñ2áÏ÷å3ý]u&¿_lçð`|MiÖ;|̼Ó-±8!j_ f1ÊÓ¿êéq^¿³ÖóàUYØÄ¡_ïõ@+É :³KÚs¬`°w=ÞÇÌxáò6¸È°* x8Ïæ)rðÇÐg¹cAõ}*¹» ¢§3¾.ù88ùëqæE'× K¬A_?º©J.â×dyIlËkï\#AqrEìv;'sS&F~¼¾Ø»8?skuìN³îÓc¿©Û?ºÞÁ ø iúÏoñëìC¼'l làµ9ŨmÕªÕe( %íÒålk9ØÆy )n@G,ija ¹Ò³YáuêæQ!öÝã§Ë!íuªÙb'´Tb IÇùÛqpàÑPÁìº.v¾;[ØÍù2Ò]2¬ õʲ> äa`ø*ߢ"^à Iü ×ÒÌB^Ô¢±p®è(ÞTíYϳ( ±,Tt¡WqCi4» KRßm¡Æ#Å¥9[:âîß7Ó¾Öì'ÛÊ~¶/ ù EÃc/º2îüÚ{Ä-.êO éൢñÓQäµÔÓÍ}Íwõ °ù¡;¾3¨W«¬Ø6EYâeÀY fs%&ýQz¹Ú¨Ú¹ÂéÖâóÒ±B8](*ÏLï¿ÌSQë³Þf½)¨S p-&1ÞFH@[gFûxxÜ8]6Êý)ÀQ[vHÒQuÃqÙ åq÷ãØ¯¦æá6¤´TÙ°èµt/Ôu><¿×*àÌ-IÄÞS×rD_Îi³bÅ6ÒE¹Ü§bÙ?$F#cê³B?±w\*V£·ý{!iRé%ñG¢øï Z6PB§ë4ã°ÙiG ótCgK ò9Ûìb=¸»QUb'ÞÀ.ï! |ÁîÒ¦ á¯ôY £yÛKÌXÀèÚ¶(ÆÔô»y&10$hF=&eÞe:M¬+`5ó4dHVtæÑ/ÐKûsô'l6º+À|´ôP°Ïøÿ´`8ÂFåÁèwø 'þ6£°Áæj¹Þ<÷/_ê?¯ïßã96õd],×¾®qhüzôʽwk.RìÑ5ë¡cNÎ0û¼1Ý]µÀ RÕ§ÙÓÝ !*¯Í³åº½§À2¹òf©V£Bg¥KuÊa¯¸êpYëp#é],1_0Ó[ ÛöäèÉЩ ÀH/ÒÉ[UqµQûXDdç!H{õ 1aúå·®ÝNÿAÂ/@`8/bPÅmÝÜ4|úÉpÑW©bj0*a¼1ÙÖ7;¶ïÔÍcSgúêTCU@ûËÊ>(iØÍILY5/Õ_@ÞðØõ½Â}ʽV)Òxº¶(زP¶7h%P! D}ðÙö³41Á@KiKqfO%ád({9gf{Îmþ wU¹½Á¸Õ«hrØUG«-§K§`7Ë8ÕDü¾ Ì8á¨¥Ë Â16}WmGq^ÀhµM/e]n²F·æ5fâyX!ö£ù弪F']6°Mnô#â W>?C/àÆ©JZUÝlÍ£al·RQNÑ&k{¼ãáw6:,S4iXµyM¾DBÐÆd>&mÀé÷qQ -:º» ÓT,K>Ì2ë¢â/ã¹r¯mrõ:&yïíÓñMÊînU&¡ï'ql$?ãs(/ýÏM$+L}ñk×é[´í;j¹xWÔ_Ã"ëAIã\îTG ÂÅï.¼[ ? OÂøORQzÔf5Isج¸ ªyÐéf²i¤:y¨*ÛF1U\¥CF£XzZª>"ñ5¢Vèí§[Ü+.Ǧøª³kJ Â0 J¢òa¦VÕLÓôÿÿF?À»Æ«iDüÞw¦âáâpàìÙÝóî³ÖÀ̯}¶bv«LÓ°yÚ)Ø)* dâL9bm1lèuck¸Z'¯Ï7Ê(¢®òc=êP´$©FZçJ]§Úêòð ÍPO-Fí Öó¾OObYÕ&z^²9²&%W1GIC¸Ï´{Býlro§È:í÷õæ%sëqeç÷Ýlü°}fØ0nûµç¹Ñ¶@÷èÛSüûe±´°fr÷té ¸Æb¿->3ëSkf?ªr>qá2Qßými¬Xwi¨Á¸Ë»<þfÎM'9j|jDÀïÂVà!vÄ|¤ûW¸ËøLXóÊå]Åé¸{1UüG\gZRE1æSÄ¥l¦= HçD¼D8óÿKf¾Th®*ÒµÏ|íÿhNE#±ò[Ozf¯ÄaÚôêbCUÁ¡aV«ò}ࣳ ã<MiT¤]°ú=_¥°ÅÄJtÇbëH~´éS ²ËR¬Æ]ØO=xóöaÀæä¸ÿ- Gßk·D³VwÆaïâ'Ëçø õ{26¹ëQy¤®¯X¦oÑÚ¬¿8lF{\rÙï2èW>Êã]åâ>I]|zuoÆ©´ßo]í)´kº¹Lÿ3òv{àW-Íæ']ôknÙ}ß"×)ÓØ'³ ¬fÏc[xMÇlú¥ýÛG$D®ðeáE»ñëaPEƯV+Ñ4ô "4Úh<ôÒ6éÿÿ½õTÓ¤ÖØZÐT ov /xXØ7oçÍÎÙh;S½¬¯ qkéÂ\WÍçº ±Òh3ëÎHt¡gÝqÛa¾vÁoVÕ| YRÿ°XÞeº:N¨X7®Ø£e Ç$ÇXǰûðþ¡ÉêHÜÿ8¯ÒM±Tp*vYëh¾blïÚ¢>üScÜÏ`wç©sÍäÒȨA@QcQ=GíIx<È_3òã'êu-áXö<t¼Ï»po= Ç©¼ZMûÎä ¬øë<èà8 Z>u5i ¹&¡9©ëÌãr¢Þ¾ÿvv$ µ>ÇJ±v´ý'xLH #I t²ä9Í6eº|$ä EÎ+#[ÿà(²ýEé¢N.ð8 Ô4zOÇ»fMÜzìFý ÅEx¥yì,Sh}Á#|Ãtw¼øyÐwHãì¿×&Ó\¦P8'zÒA¨\t½C]£WÎÁäøJùì÷t.. ¾]3¼Ú(Ê0:çÎyPÙSüdAà:ù¤â%«¥ÿ+ k{ò£Àl¨];0¡9ªºäüÿÚJõº6¬"MÒÅ%Ñ]p©^\4ènA]ðâ°ûánµ%V³\âÎÉT]#t/6 Wooü£õïßäftÏï?kSTù6÷*lïåDVú£z©ã;Ѽ=Ôú¸I¶@W[Ö«àñÂÝaH+à'zØkDzåj>ÍvMG'3)2ISmQ!gQ¤LhsÙ£K1mô[6ĽÅÁ¼_<¤*#P5)ª LÉsýr^?ók±çï=J¨B_N "+râdJ¡øW¾ÎFõà7<;ìÇC4Úï|§5 ^tꡬ÷7á3ÙtÆ·ØQe¡ù=aò6¶ÙÊý°rº'))ÎÜÌí{×A1[ÏægSY|Ó.«,$i6;=¯^^-KH=Ó(VôC4âýO # 1ãÄîo¥vñ ó' <¶1¸(róʪËǵ3t,YD&ÒTBèLÂk©!ìÒ¢Qª6"åTØ/²çUý*ÀÿRþò#ðÃ9ýÏóï£èl6¸.´Ôî9;ÊkÁçÒ µÛ¤Í¹KPä¨íràðºØðaÙÊO÷;ÜK|!×4Çó]f²5i^FLÐjeE4àÒùbMÕVeufp¸ÊqÎ8xA,ðv2Ä!¤K$¶ô Â,¬'¢uªé$¢ Ãô69¤®.ü|c#¯«ö7¯gm©¬þ©«mIÂÛunwdNmVRIÑ×~B?¼þ@QE¦±µM×D·ç¿øqør=ç9÷</ê!öæ¶só¾MòÇ\¯üàêTcÌ[§A¢X6×cÛǯÇìQ¹)SF|¼Ò8jÌnól£©È ɺÂ\j½¬ñ.¿#=õÎ \kaãçØ#JZ1%37W´zFDÒ¨Eç¹_aÉvBa JÂ6¾qrÝ>PÞU,/¬ï+lÔöõÑgëò í|1ëK fOä¦^¡Ä {½Ñ>ãEÀZ}-«*{bÔþóã>£¹&§À PðyS¬ô-3!/i=$ñ:< &BÄêëgùy¨)l»&ÌÏsÎÙÈésH¬¿ÅPrãóùEÓîö[HU¤\CÔÒ» 1¾¥ø¢®-\±0+tÃæËk£k«*¤ÞoÜë£!$±ñ}yÔëRdÝg~h%¸² 7¼÷Ñ0¹|+;Åýºï ð+ =ÏåÂIúÏË`nÅ×Ê}YWÙ " Y¥Þ¡~ãL;i¬3r1 ²¢eÄ×.QôJþt h/´AÉ>È»?þ,ÉpÞ{æ¢ å*Z|½on®×â¦3k*CS#Ðø}ñfÀÕUèFÓNV^Ô.®3wÒ²Æm¯z çîÎ[ÒRçãÔÞ(ëUT.¢ôÍ^øo[@-æÀÿqàËâRrDÓ1ÂÙMÃQ?G¦fp°AÕì¯âÒQð)|RNÄèvV~ÿjâPÑúiöºÛ/äH<< ¢´fát²LÙaú5Ë]7³C&ÌP wß Ä7$ÓÛ~ß÷U£ÒaßNÒî÷}¹8çt~ù¦>Àpçïr§[Úaúx¢4ιA5+aÇ£IïÇÖÃU¹]Àøwßïâïõ ? zIæ¦N3ÞGK:d,iv-jö¨ç7 )³e,øy/º¡¬¶m6«´ÌÆÙãàO Y¸Ñx¯®.¬råï Cö0£»&q¿ØýÊÎ}<a$õqÕØ·CuáU '©ç"D²åj?^^¿»ªQò6 ò#ÁÇ äû[¡ã5\#ÇÝP7·/:gökmÀU í×ë]LE¹ ìRN×9e¶Eý (®B¡±vm+ëí¸%N8°ÔÆZû¶±DÿTÈ1Í.çr§Ü^CamVÄmÚn¶ ÞÊ»G×u/µGáÚ¡©0*À¿ Rñ¶ÉýÁí*wÒß*Ú&ñ¶»²Pàyä{R4«Èª0;\¶>¯b¶Dgá·69I¶âÂhh|ð®¨vâ¯"k¢¢xníýïºR}Õ@¥%Sñ?¦ÓlÀ:h g;×Þ #õµ?7ä¨s±ãFuN¦+kXøì{aå@Cã½S®(öÇ;h>Õir3Li}ÞØà ¹( hh$ØSò1hFy}ßP³Dg.TV9]¥ðSÛvôÐ8¬?p0czë⨺¶(h©Pº¥t £ñAã³ïøà Áµ@¯©3çTÐôí=;gÎæHQúa54@<x?ï?2òÄ ¯÷!ãñi[ÌF^Ïe`®úÍ:~[ÅV6yboowØe@<±Ç5ÄöÞ pÚh#¼^Ú<é>è¹}_§jEG¢²â ÅÔ©-6v,9t£·öÆÜ¶ª²-àR¬£¤,'\@·Ið§ÐÌ^ È£lküí óÄ»Ââ6Ç®½KSY9ÊÚ;(¢SG.xêqÌ ^ÀÆ@pü%=!H+4z"æ©©aõ"D"Eï¨ùCVìñPñ¹©6m¸GËåý "¢1k I0 ª[)ÊÍ®àÑQv³`×3ß_þYÑd¬ÁªR³!µV{׫m§Ù¢SÅë¸e)ÑO½r>Ò½8Gc(®üÓü@Ô+'DA9DÐJ0:IafR$eüH&8±@Í(à (f÷´2pw¾w{oß®2Ió¼8¸¶= [2Ù@³J/¯È§Fý´¨mƹØåˤ]l¢§1A~¶2 +òl¹ !EÔ*Êçß!:®Ë:*1lËm!ÞFL¬øë]9aD¾¼moð ï·ÚÓÛ±Rn*.p³·';ítátuñY²ná³ì|sð3 BÃÛÎÄþXmw5bá6,7T¶Þéhyß=lßèF=ÃÁÏ~*¨£öß}@i,.î0Û¼eé¼ÞËäÆHX/ÚoèÀNû¢¹í¦ij/ð!ô·S)µ¿á0}o¾Jn¾âÆîÈgâé|ª Cl²Óײa¨à# B´Æ¸;@¦»éæóM¼Åâ'ävGþÇèZRû2 í¿#svKlû<ã¾d¸Ë%#00? Ð*¾èr,²kòtMò .(É!ñÿ?ç?r³*)(yHÏpóìÎÎö=Ýæiä"Væ¾íÓi¤@ ³I G,Õ"£ë´¦]Å&b·½}ÁçΨ¥ö0ñ_ä iy"«ß×§äÍC²¹ÍÈ:Z¯_ÄL)X'ÔT&2¶Ú¯¬uU¥¹c+ÜøÝAðGpY GvÖ°&8ª¡ãÖlë_ÄÚKS yyx/þËRóŶÆ#1ÁW¬¦Öé¶¾xÀ{d'Zé }[LmãáøÄ±rIa: EXãbU+À÷ìÏÅ·ÒÑ1¨nop&ý3 ÒùÏù¥ru<é]Ä_ÑZç:å}¿Æ[Ý_Í}U¦ÉN|ÇN$t#çhݸ onÒ$ßÎþ«)º=½;¾½VÙ&ÅÁÌ¡¤+þÓCFùhà+&Y(É«¼¿Æ¸[mÂý/Ö°jþì ÜdZnù1") ¤=,¢yPv¤Óe=ã*SüÖRó9;¯u¦§_û!Vºë #©EÙ#£blϽ¼Ð ¤¬²tkáãp(yÄ.,ô@úÉ^1¹W^Xó÷O HÆ àçûì'#Q@Óè«3»I6çìÎîÎÎXëalç÷N®qþHQbêtÆjûd{Ò óÏ»öG!Ê¿"}ÑbcÏ`3@Y¢b¾ÚÌ©+r¹ H¾eçíÄÜТ*¾23ÍrR?º²¡(Hw±ÅL\0ñÅ/ ñWü_?Âè$ÆEQh½]èâÌ9I )pÏ̱ܳM-Ê%2½Bå·8á¶Tð5~oJE ÀN¦lræ'#êqÛKdÌ8C§¢$5+y *æ1²é 7;«¥%HDP._®/§ßëTy c±,Òx´bùEA§yÿÝíù"nîðë&/èoɸ±GØnk/.²«¸C½É@q¹inf®Õ×"ìFÄjæaö? cÒ±(è0ñ</FÞA½/ÕK1eûð¢H&þèÆ|&Õ(Ä´åÂÁÛ}}sæbð <ùBH¨>MNMßi¼}_¹öþÒ@ͶY}h8²´ã%Ä.é"¢qζ4dÆQÏ¥Kªª°)ÓÐúìzíq*YõlÅ:[k²JÛúó»S Ý4Í3S¢ v`Õ8zURÉ 2yÜ X&^À0v5üÜÔ2i üÛ7zÉ>ÌPZ ¥ßÜ(Ñ9â¸ïðû^ð:/Öªègn;Hí ÀÓÕ5%DQ C3H'q~AÿÿGôÒSOe5ô,¦Ð9{ ggåî=w÷|#ݾ¨ù×Ñþ´{òä·uå-ÙH¯;+¿ÆDÓ0 ÑiòëYÍ<¬¨_`|©á¶\z^๹ ÉÃÀ+}¾XûÀºó ZóÁCE9P¶4¬ ) )ÏPéèF½14îC³(9«Èç§oõÕôév<úúÔÞ.h>3YC¢]óïÓoE©m¥?ר*J&bÔ9YNà¦uªRÌûEÈ+gµ2ìæJ=+yªU}Û\iÀ(C ßUÙ2 ÝKW|p)Ê'©µÕlÄè ȬÅÀw63àÂ$#ÍØÀ0¸ÒùùlJÅXPª8Ó ÑUkz1³=¢·¤B;ÿ"gÖáÌbi¥%+ÛArg×»ÉþKÓ1 @wÛás^ÓÝÅÐ ùkéjÞXCrõ/ åbXBÔ¥«ÍÖꬦw÷âûI<ùù ëï£\^,&W" Ù·Èt°p½08 ©6òÊý:<¿|㾺sKDåÇa>ïG+Xæ»ÄwqÏàáeqñ¼i¬~ÕLßË*²UâåÜ/9ZØ:F¸ó¬µý.Íßzþë:ÎcxYr° kòû®x/¯¬[ºæP-JÞ í¹îQ(¢é¹£Ô_¶ëD5vVe~ 5ÅoËÕí4i{¼´¾Ê7Òì%NÚ¢Ìn¶µïEÕº´â¤ú0PäéD¬ÒmëU.!í4²MûùµìÝw-ÎÆoeófÃ*`^MPÙt&Á.±8@wZª"pàVõÁz9ÀtÝ9þhì³¶`:¡iãyÚ×Ro§¡ãÉ Ñí:ñý´u¹®*õI¸d{p̨¯ï»À`Å¡ÚisÉ §{Õã$«Å»¿ÑÃlÛ.?xº¶¡ Xªr°Øª&¿ÃÿõDEnm¹^ÖÝÊ+iÃÝ9»³;6¬ä¥¾y;¸ÉpÛ 8èt±|îT ^JGúð~Ö²¹*²ÐvÚ)ÇeÏθ÷kÇ«i£Gí×ufúÊ1¢v/½ÂTǾ ¬ Ç [#¾ñ½©8~m3x~N¯¿J<{ÍO/OǽÖëc .ë/}ßÉ ®?i; I´OïnÊ uÅYóyê7ݦÐÑÜs ÁóàóÕ¤ep °¿Â y<ßêB¬ÔñǦÙl:·Èeeq5B3Ý|"Éu¨øt»3-¡9a»SM¥¼Ã<}å=ãâT9ĵ¥ÂN»ÜQ2r ¤×Â.À\ACÞú÷*°o®cëN%C3Õu,|0V/>(9îG¥ª¶ºH¦bO3±Mì£j¸¶3Ìøß¥¡JãO *AÀÖ¢ZöÿÿOÇðd*/J3÷b[êûî¹3Ö¥\«Êª³.óèÃß 8Hë\®ôk÷ÛF8! íùáÈ:¡ #¯<ÇÕ$ê}R¨£Lú·<iÚIø7úµ`:4ÊVW=YKÀBx͸ÜG!õÛÉÛËã:ÏÃiß³]Ù]nHÜ©GMË^¾ w*ZèmZNyHÅî=«MUQi·¹ëøªòÊwô³$IæJëEïXºù¥{±,ùíÎïSÖ ÙÞzÄ1±:Êüÿ.Õ nW®/wi{ÛÌnÜ Í»nEU8CÀ©'nÎD½©½àé3¥×e Ç+aíj¿×½GÍI1PaÄ+p'ì¦ýTÍëS¼üÚ øfôÜÂdv÷½Ù÷L'=äc¥åçÇi³hêÕ¨1*FDÀðAØ&e$Tƾʪ$/üåÛ*U §R&àÆæ.u¿µ¦7à ©9 =2¯v¨ÿ~:Nh*©Þî²ÅbºSã5BÚ©©ÕC?þÜ»(J»ÔívXK {pt55+2k¾\Ht\ZØtr §pïJJìÐeTQ ONëizÆ*vÜ IxmvwMÈ@£Ò8´ôÈ&ËÞÏ?ÁàÙÌb®Q2'.Ì_ºÜ 1×1F,q"qÈ5ÎòäKH%,Þð®n@\|Y²Æéµº BZ*SÆî|´@uïû(Kwtzbz(Ìxào}-·Ê`";Ã6 1ÀQy`p'G'@î©hMW'?à½^]bȶæÃ²ÂØ;àW'ûÐD£HàPϪ}}û\¸_+EëÅ)V¹MXoRǶâýúQOÖ?mB£»<¥ô&¬@î@ÙïÕ¼o;ß;vÑÅxM4äú3&p+¿JD7A´Î¼ þÎð\\[¿i1ê¶ÖãhÄsJyÞÐ~ùü¡°òvan*`Ñä˳ùÃD°Í#ÝçP_®Z¦ÇQ¢ÏIoå£#îÍð >ì²øã.XËØN'0ILoB,± ÜR~FM Æ+7n| ß· qe-.mH=gX±"·åÞ3sg¾¹zª²". jGCòî³á&ì¢f¢UêdNÚVáCA@bZÀ+ Ø|ór¼ ¨³¤ÆÙv/É{ßXÓmJýxl½ê÷tÜ7¶74¦#Ëýÿ(§ ¶_ ò\& 6ù÷o³5ì5¶æ1±§¤îú ×Tì´8LøLDüîÔ.iTDÆ-O[ÖpÈýÄ,0ÌaÔ¡XÀÎmGFxpÙ-ÐõÈL£q3öwWÅE-±5<Òî¢q¶W&d_½U²±øRlZå =ͳã`M¶þ¾ÚZ>ÀLÞrîQ}VÎ3}½û>ê@c^r=Î2ÛÉ*N1äÀ¾ÉÐ÷=Û´:¤ÜwÍn0¡guYê}mCl¨5¦ÎÖßewPíé6¼¡ð@~.íJ+Q5Ö üByzÒð (W[<éI)ýM{£l+Æ÷Æ¡Cl½.éÐ0îä:=)¥O²)w:¾çeR¦ÔÏòRª:lvVÒVbGê!Ð3NP¬pßhIí:¬´ MùUNDá'¦rScÐe?ÏÀßIvÀ¾djáh_,wAjYìÀ§ S|$ÉÕ.2ÕºÚºà7Óã8}µ¶^Fa}C¼?FBĤ¸ô:ýçÁmc·Iu·D[éÔn?0¹YO¶Ü¶Ò×°:.Ê ,¤Oãëõ²³ËÁb±·Ê|}ÿçÈPÓºá#M¤/íkãêõÊ£&·S%Îóé¯{×¼}®åy0îÇlG.çöÇ$/h«0ÕúÇlýÀ÷:Ã)´å x¬h÷¤ð[XÎö}²£¼¨`¿Àô0q µAR[±&ìøñ½ï0tc/Å=ä6y-r]H˰ÆÙ<=׳ÂR³w=K-¥*KÄÆrÄ¢ìP¹>-³Ø=ôÌù.Ä·hÊ::S^2s¨Ç)¹¶9²VMM>KQgש++stj{Ø-øJ&e,ó2² + ÐtH.p¤¡é¬¼yÜÕj9Ê ÈÞ-à ʼ#©f!±Y¹;à©ÝÙTX¼ü\ D^o7TðþÀe¶ku|äì)¢¨(΢*ymJlµuÅ^d ^Xu* äÈu¾ª|>ÓäâO T 4íýOyf ¾(¸Lyñ×:¢ÕéX"²D¨0>̦±Î{#QaÿyÞ°Iá|ã7õÏËáýUôwµA£|[¶äO3Góëßp¿Û®~ÞßV˨=û1ìbUÇæ3 ò¸¹Çÿª8eø°{8$ ú?ü:×9i Gæfg6[5¹Ül¨Sf²¤>0Ñ"ê+Þ¾èI ìÇÅZ«Eã1nn;¡QKzOC3Õÿ,6ç]ççI/ÿ,Û+§°re@´E_å«Õåoàcß2¾o®È`1µÿit9Pyÿjxû^¶#shfùKáÐ4¾wÁ Ïöµ¬£Z(êkKEªÖeöSÓ÷âÖM¹~} wÙKBÍ,"'rûBÅyn·»Eà<;Ü ^ÌuÙM=ØIwhJ DÊ¢ú-º·ÍaûM®¹ûLpt©c±fÍwëû%{4 ì¹çߪ÷¼Ç>Å,¼ ~ÚÍZrM tÌ¿ûõ~Me²M0õúvî;yvþåíåXèTà:(¤Q¸Jn« ¦Ç# KÏcFÿ´Oê,ùÏ% ªø¦tãs H¸]ç ©L®"$F°Bb,*Áu Ö!ÚgÒÇéi¾ð¶Â=.þhÐk@ø ©]:¬O9±`^×ÿÀ<So·Q:IÓ B¶4xUVÌÔ¹/}º¾9 iÎdѨô »Q82iüÄ2w»â¾e)ï7Xtü1cÒ½ ,}¨]Ì4þöÍ|ú' ±ÊǦº]ÂLàÜÒªÄ!lü )<(^|7ó=S3T¢Àr!su;8ÿ¹íD:Ø%tÔía¬«éõ®T¹^¶#qÍðµ6¢2·AÆÆp¢\Zµ@Ô·,áÐð4Ñ7¥k/%î¿Úà:XþN7ÎM5Ñbµ!I(ëÂïÁ ãéÃÀ3Üø8R häcýn3wF]êmÒ<Ý\¼~%xr ĨÞè\ä'¨ÎbÙÄpªÙr8ÛÑYSv+j4æ~> /0J-;!õESiªaE\¿Þ«VLGÅq0ØwI_?§*÷¼¨Ý4ÓÙXT BqzĨð&Ã}iRâä(±ê+þélUÐÿ 庨¥Uòóf[ÎãÔºdZLñÎACÁCmáëbF5Á0D¬ÐU¹n'[aj»`8IGÝ£²G1±=Èìcà ¬Rc¶8ÿ¬.pØývÓ°¡VpðÃÀT$Àuº@A´÷ÓTÚúÉï¥÷Z¢cZ6E±/È » rïdOA_/Æ?º¶¡ X8BK±7¢ÞôWý%ÿÂDb ˨3»-úÂ4){vgÏÎÎÔEdºß×,H_b×ôÈðÑk²TÏx#³É×h~,rdqFÝÇ"g:ÄÆ[¬õadír<HaaÛ;;ÔùÏE.£}ò}Õ¿x:=Ï©â6uéËO¹ôØ*ëSª²uMÇôÌlåJÎÄß,?¼´¤=ã[Í¡e׿þ¾\QÞ´Û* ÚM]Q«ÁGmº)Z½ïòM¤Iè@ÙpðwÉÒCÇFù¼óvüÙ-e¸º(ÇB[î4[ËÔÔk2{;û8RmM .ÊJà_%¦ SɹQ³bV Ïø54g$è²aUªoE÷¯ÝÿgÌb¢Ê"ÉúµSq¼§Ô¤yExôP)8 XEå8 Ψ¤ÂUw7Ùël>mC3è@n#4B-$KúÊIV寰qıD_)©;ûÓî¢Z«BÉcª(Á¾YæªHº£'êÈ=/Ç ¤³;»¡*òkJÑ3mxße~nrxªè~Ñ#v^×µ¸=ÍH-ÕØQú+ rÂè:ÐÖÕ($!¤@|jWV¯ÈÏøKÒ4û5lJ¬òûÁ_w轷ǬûðbçéÑx2]ZïóàS:ûëÅi21Û)|jò'ÙóÇ¢ÂýÒs ¡Ú÷ú¶Ö¼;g{j QYB=îÙÈ@¨Èò0>JÌøcå£NÆ!± ' ÓBÚ11ñ\úÒ.|âÆ¥Å(ôp¯¡çÌP°`Ó@¹½ósçÌ7þ]Ñf¶L{E»ûvaSµ:ä'."è´ÝjYá½$~BB{ôA°p¸äësõÙú*âØ?Z 8eÒa"r î{»{XÇEýôNÂíy¸®Ûk(èöUä5÷³~c^<²¨4»9s ɯ¬¥ÙÇõ*È-èV×_0;útsÊ$Þµl)Äÿê:Üe$³ôfÆTÒþ FSbβÆW`_eQª(³1ò7% ¯Ij\µ5ò÷#jÑ. ȬÑmOI°VÁ5MKoyæ`hDϦ'RH<[À'Ál¢Nzþ§µ»2Jox>æe¾ªväüÉMdÀðQQÇÚãÊìsïÎX=¥á/²·\¥ñä2Õ¾¿é7`P4¹_¯¢QJa¦U.nDòiöäF~0m8ühì@EJFD@W ¦fn jÂN`å+5»bZDpª\{¨ÝW\ÞÒu¥<¯"ç q¸_:· ïÒ^¸Xb"èúâo0ñÿÿnI1 *ë9³$} <@»mÏìùFrÿ:È u-Nba^¶ÄQ o=K¤£m~j@ýmçaØ$iÔtfIv [U6 ¾ ®%_ÌÌö>,Ûæ}\{î1ñý ;Nµ~éEAbÜÃö¬Â¬mרÑÊÇ÷Ó\ÝÝHXÙï^GÇÏl]Êq#Ц?Ï&¶Ùù|¤tºÁExfpÛÀgÜBËgF%ñC1a¡äëi1UÀå6Ùøºü&uôX.ñ6 %¥ì¥Smý;¸TF%9«RÄ!æY`-äE¼2mÇ¿0ZÛ F<î(ÄN®¢´6 ©ÏëFñi8X én{»,]#:ðÓU«G@G/Rzzq)[fù<MGd¼«yõ±ª3²uûâ°Åáî õ¤ÞyÍïÁ"ÃÄç!¬3©BÅüöÆÐOÓÂQ¼ãét"øòAMGäBÔʲIJåsL_ìL+ò· Nïêæö·8 ¦WYÝ»¿&sQü§+[N@Âi!`<bóÿ_HUSeÐTî ª]5âõÑEñ±4÷OõÕ^äçõÇ.F1VZZÒÔŽP>Hù ë ¾ ÒÛpì¾Q~òa³Ü,¨NµÚîA[ÍD Îq{ÈQD<©Á÷º¶Ý ÊdT@R«í1&õ#úýÒ~IOX\¤sfVûæãÊÎíÌÌcè碧ÊgiÉ ~#üð åRÆ=DcßÍZ&zKÚãÛ¼BR¨#èté2~ð e»Ü®²âq;@g·¸¬ ¥¼G+¥@"¢ñà«ÿÿwxâDØ6 - ÖÝ $Ü·»³;;ãNzn<?PãÒÿ>[!¥BÐm½òñ:¤oFÀZqèà ¨1:*ÆãfèºYInÆZ$³§AI£Íò3woELìÈó½å漫"½&BÍÙ\è{úþÊu, £aÅiéLLmº=©á|áWtóÕ ¶fCU+Q g2°*]¸úÊÕs×n>À»Höd/ö9þÜ"O·øGê¶ ¢ÓDçZÖ÷îV%ë´éBÁ©ÛkHÉ{¨@iÚï´2Ã!ÞF}¢&À_º#±¨Ë;¸Ìµ\\òztTÍøÂÒ¥ #«%Ôñ¤¬CJm2«5g ®VaÒì¸pÝXóSÎ;Yþ^PÜe?MÍÊKüÅz`,iVÒ6yÿÚz,¥f63=Ï[¬¾g9׺àëTðÍíö@D;YHQÊÜqÜuݨ3]@JãURÙ1uçÏÌ m¬Óxµí@R]¥U1©µo×';ûxûW{Þ~gáÜý,Û2ûÙý^Gèßqoê¡À»ý¼7.¦å.§ïÃÈI)Û Å EjàþC ÿfÎàS7R³Ê°l³JBý I)É ÜØnÅ¢Dö¢CÍÉ¥(ËñàîßWÀ8£07ðq× ¼v¶lÆE CWg_à |_)o +%ñ×AT§+ ° êLMHÄ¢8&pµ1ñ0dÛïº$e~úëkÒ= À@®pª¥ð2`ïáà¸ÁÑMàé¢7[(q G};r)SÌ4ɶ6¬Â¸ÍÊú¯»rx>«(À¶ïT°äm¥L^É.U1iF»¾Â9m +ãÀ®îúfÒ9nÖµÇ<ÊaèÅ-Îà9í¡ ÚVñ[Bw«pO¼ZâF!h貨´ÂJ¸~¼I|5*¼@d×JpÉÉ_ä¶²Dù««éI¢ìZº´e!jÑ«g'ÿÿÝ«#&?B±-añ½ÂÁ;$Íîì̼ٷïY>G7JgíÝÍÍRð_îhÕD¹å+þö¾y½hËh£z òe:ÂÉAh\Ïú·áþqq"£Ü§¥XU®ÍçË30À¹· #&WãÝ<£ g>¢ª[ã+¯mUÔ« dl~¬¨`Æ>t(ÍjgÃâ{CÏ,±è¢$Ö£½-½MÙ¶òX#@[_ØCFfG°ÃO ÇNG¼ÌRï3¥¡È عúQ;*¶Å½ÚÉ 0±&ll@*jÁ ` ¨¦8Nùò=´×%?5Éj_iÉãë0½[Pþr4¸_éØW{à£|¼Ø|WªS¬¹r:Tнo8)ά²SÎNK8jìG/¨â¸:¾8K-àJë²¼SjÃÒ;å&!!éþaAVµ!q,®EsckB3Í9å £UÄý ÀÓì$A-¥B)Æ¢!Æ«übÿÇijW¥@Âk}¥uf·öÌ©Ý}³ûvfH ÿÌÐð=Æîst½#` DSë<Ý>g+`;À½'A¿È2bîF»Ùø _Ì,~_^ßÊ cÀëå~èצÉ7ãxÇí¦ª2ãTkÿtù: hJ §À (¸¤å¨¹íбðtm; Q¶ÐJl%^BÿâWû <ðhZZi±à:³Ix %iÈîÙ=gÎeÆ\ȯ¶;Ë=YV¯ÖÀw+.aVð& ¥Y»WÈ Z¥%SvIÓÉ·p³ÔÔ%ÙË£Ç3~Aø`¦hØó\áÒsºýðªR@$oßµ÷¢3þÈû~-Lü9õS¸vØ>N¶¬!ìSÔR*Zر<}± ·wWdw²l[õÂæ4«Ú®iqà ²ËUY;¸3¸êÓÄC Þ44'ã_(6Û<&"ºH!·mºl) Q¢ðPnÓÔÒ¢nRBæ«üìz¤Q|1pqâaÝfõ[¤fõ"Ám88âº&ùMÛ©tÁ³Ãn'0¡¸"$¼#zÔÓ'kmDÌpIºúÏ FÞÙ/Æf}8î÷éЮHRª?ºÖ X(ôÚB[A4!&ãÿÿ/~T#1AÒ=¤OJÙ+Ê÷rÜÞÎÎíÎô¾Ú6ÁãJÙµ^áÖEaÔ¡é[!í5íÜ(JCòØí+ðF «EàQ¤a²}p:gÒR¥4£ oñoH§ ÂnM¾ÍYÛe/È8Ü2 Îà²9Û8Já"Ú°?©z*û¹ç³¯Û»U>Dë«ÒÒW)Øâ«"ò¨ xc]9ÌTõ½SÕ¨±ðø t¤}v2S× ¹^¦Ó`Ðùã?©ùuãöòè@lZp©É]¼ ×BìGx9ì jñ««¸çÏ>YN$i·n!}tØK¹ãËä ¥þö/¨"·~D½ ÄG±âõ$©ä+ÁcxÆi¹Tmï$#DRµàîæ ¬W÷ð<Èé1¬l`2j>»üÅÏáרl*¬¥TnÒÔB.r ;Ä#¢¯ª-ð5®©¨¨¥KдÉ!e} qÿENó¤CªeÂV. ÆÌjv`JÉI]µrsRÄ)}µb×(N7AGwT´(è'Üvk¸ñá2}íù½P½|yóh9+ÿðtm» BAÐÈUª¦_Ñÿÿ¶±¯Ú&Z¨ U;³M1{ö:;SOà6»t½+së- QIÝB(E=ÕPjßp:N3n´Ô 3ei¼lIu¸ySûúA`qk_uf]j÷&å£ùA-³FÒ¯rõ¸pÿáÛTU¹ãs·Ë1®h#}5ëo¹lñÞ:½pìàéͲÈBÙPÀ÷#Â;^é÷áܵãéö}[D[Oå`8) ÑD°Däø±o+. ª AìÐØ¿vSâS`9lzÚòL=3VaÆd8Ôbß"¼>ô_×ïlo§'Êk:\ÈÊÖkÚAíV¥4|0w¯Ø·©I`(Ë»èYOÉ ¾»ûøF>£dlã(@THÿ§ñ ]G¨ ß§u?l'á,âÒ"DÀhàÁDZÕÛkÎÝQ?kôüôÄrì¹ø¿Û¯#<4R¸ÕCßDÛr;Êf¿ÛD@v[Qá©à8ÉÜWød¨e¡þðWÇHT`]É>A¢§W4 tbpxR}»ºcQ åF×¢ü©kYJdI²YbA4Rxôà'øÿ? g|,K !ÉF²NÏPU¸AÙÉôLO·RÇ:ó(ÈzKmZ{ïëû/±LX+K@°§×õÏ}!¬ÏWÍS¾ô´ö.ca¬$Xô±/²§M½þÙD/ÇÑsýÝÚ± ¥XqûòÀ®ÊøüÖ%Å}y²×{ÉP÷Y«9ËÌ·9©@9^ï9ç¡QÑ¡¥ÇjSrÚ ê¼ìlFKøùU¤/}$`_f5F)1úáÆ Ô^ð ÇuåN}̾ _Uà°$¬WÝLÌ7¤t·æ7ZÂô ´ÅU§bþåé>åJ«ÀC#ò<Ñõqý?`§ ÅAÏpÐáËÈ ÚdØ£A9ÎRç±(غýøäkYËöK$Cªóo@IZí®k[M¢ÅµÖ|H=ûmX¹²V¡d:ÑÂw;6ë/×úl]XoG¦±gP¶GéÜ,¡©b¹Q,éë(B :2zÆA¹Ý ÓÊ\<7ðObí»t¦Qì±°¹«l*dE¤É¶ª@¡¢^Íñ³j¿V?æ âW6 »<u}ÇãWPue; CA´½]Y1_äûòàÑ -mméZÏA Ðè2wî3ËñmC]pùôÞç}çvõ/÷T»¹èøÂ)bõsC^ÀÍd ï±¶»{\÷£ÖÃ"~ f<VÂá"y°+%,o=ID|é\gªêÜR?cÈÞJFmä .H6÷Mg¸áXeÑêЦÅå[´?ãå"*ÁÈ4E¸&W²À±kÓèç¶Ù¼56½À½Ò!¹,&ï]í(£¥øHÂã9Ùù:ì ±< ïP+¶DwLå">ÿ§+YN 6SA=$åçÛrÈÁSNV+%à6¤û z§TÆ7Ýoé¸Ç·µò7éQD#<ª½¿$@08V\×Õ ÏÆ¶SÅéîõõÝ{+ÙGÖ»÷TÖU_ûµÿì»ðMcÍëÀ1ù@£¬rpHJ£Ìn½üd²>c-,ñP.yWäl®]è~:µ)»5î]]Ø9ÄþçÇtüù.+ce:¼oCoÝ¢¤Rì|ºüX!N$Ê& ¶qΧYÚç 4ÊX6âÕp:·^/#ò;xA<}Y8·í@¾Ðnº¢7GÜ (FÔT<äÜsö·ó?ÉÉ*RÆG5(°ltï+wÔÖNOÏìt×ÇÞ7ð{u_¦ªÊKZ>§.B\Va®ÓÌ¢ÂjtmÀ|pÕ^ÓNÖ÷M¨j§m4òÉ|ÖõY¨9Öû*o"ÀXÆÁþ:óÛóËãô+;ع®Ã7#pÅf#öhiäØày'È ½ÁAÌÆÇòïv«<ZÒi²[àØ¢M©ÇÄ ¹A¥çv8= P6GJàv(õf> ebF;Ó ¥°ý0ÖS±³jQWå»ÝÊãrµå,¾ ?л ¸eG It41¡ée(Eý"ñU×íÔ½r-:fÎNÚ9((GV¿K´PÌMÙ¨lÄÎnÔÕ÷aû¶5ÌqeÛZ>×nÿ?XÇ>ÚþèÞ±ÑðCÔý¥N Áß)&e§UíbgÏw¨Yq$] `<ñ@ð¢jÝç%M)è¯ }ð¸3ì»h{oï3ù¦ã¡ïïÃØ>ªdnN/y§>>q5Ru{(V%ad°=ÇÃbæ¾>To_%Nè³¢jjÂÎhÛ-¢>dU,pîopÌC.·ØÝgÕYZþNý ôhÒ[cøq2,Ú½ o~ËÓ»ÊÇ*DM3Ù»½·«N!~4¯hÛ4ËÖµ%ýü2_<þÏÃýCeæùU=®Gä ÆI§äl ,'9Sãø´%L9å;à` _ ¸+.Õpß[îz'ÐÈØUÄTM ÈTEHgzh;6F±Ê:¦¤ µAÍU¥¥uÌÅnPsk5õËuíÉaekZp@øÉw¯m<×_;ß³;_<ªRUÖ4Eg?$Ëõ E 1Ãûá½ÝCéGe¦»§;Ó}ôÃ˨>RñuTra³>ó ºò¢(Nãdôüö£Û1épïé~3¨cë¤ ÉK«¸9ñ9¹ªÕ&OìÆ!FÞï»ØDFO6èuÙæ©(¦©M¢¸ßíþP3Z'êkârGVÓ g¼è&>Ù^;:±$Ôá\ 3{-9Ö#cWzQ¶LÁ%Å«´å|Át§t¹u'çy,¯YÖ×ö,Û÷}Z¶#Ô£úëýä]»*Ex¹ÛS=[6 ©ÌXz¹NsäJC÷ÿØ{ÅN×0¬¤Ò³&1Î ¦a³Îaç£,¿U®§ =¹ÁºÁBPó(B¸¬Áð³¨ñDd´qÈ£$Eð2Ò.®ú»üxdºÜvßIeA( &eîûlöM ùÎ]+$ð»i\Ì[ÊÅîUø£ú°oeíDâ3q_R<u7v¢ðb \«;@¸ÎW²àw£gãWUjßÑÞzµ·A»ÓÕ ÿq~ÌX½KØý¨kÛM PQ@16MÓ~Cÿÿ7>hR¶r±ÈU:³«6ñIAdϽÌÎ.c? Ã%nÊv8×yÙöM ×Iëë3Ébßß¶ÓºøJ*eEÆH .bá3«ú]v·pêÝ!ï¥&ý]Z0ýxbØMÚå©×gû½6z}G¨2D¯wB¸¹ júWÎEÈÚd<jðo# U&Ë0 ᯢ ÅESóH½6zváojBà6´È½$ÌgZyÄ̲tÞ72þâ÷jÉ` &Ñ?Olrìy0kÄH[9hÒÖð/ ó¢Æ^Gâ~a¿+îÇ`©¼Ð(çé¯$û¦zFm?ÖË0ýæAºüèh´ÇbLvº !U/Ãv"°9#ãÃða;Æ;ë(ÔZö ý*y\Å&Ñ2hÄD®Ñý ÀÓÕô$Ñ-ذB" LL<xðîÿ?ë_Pù(-¥à{3Å+M;;;;oöÍ<ö¾,Rd°6ݧ9ö¶óéC #ì2vxåéÁ;ø -ÞXQÑ ù4v²w¡Ó¨ÅRPÓ/'¹ß`PâZÇJëiç®hÄbÌÆ£hÎÂ;Ë.Ñ[:Ö1ÎÚ¯å+ôü8C|%ñ G«hÚ,'³s¥Ôà4))êvλXû×¹pýV£%ÓV¶HM* Ó&LNf.Ãõ¤7Ë(}w í =A×X3M²'Û(3®õ¤]Åÿ@Õv·DØG?è«VÞ§Â8.~ I;t®Î¦ ìngwÞì̼§ßæ uæ«Ý!^]¶õÇÁA°¾v äó0í=OË×Åú©¿»Q[¿iÞ5HsöösöÚsÍî¸åWÙBTÐTN¶ÉT/_BÐjE)Ö{ÑAÔãXZÏ#ÅB¼lØ:uØØv1±ªÈñJ] 3:h'p÷*ÖBî¨ÐO#¢¶µ,ª-Anþ¨o5§Çi¯¬õ*ÎÆ£s¼*½·ÕÕóØ0Ø$س٧Âq° 8úN¿#U¨üurXe PM^81("':hñ0 AJÅSÁi¬ ^×1;ý´n_ëè¹6§£Ý}6&®ö&Ø{·Êü ÁñîWÈë ¯ÒÄ3M7)¤!©b[Mûu}íÆ¾[º áMhm;WÁI§Â$e.IʦæÔjVÛÎÕNúKÇȾ&¿Twí kòÅÝPFlB« Ðíç|¨â¤~Îqñ,ÜÎwÂe}Ûô½r pD5/ñö¨\üSù8ìeªÕ¨\oP«6îT¡7Òfá%Éfe=¿Ín.¯´Uß¹Ô'Îdõvz!(®Ê!Â^:¿HÀÛu$±6¬PÆè |Ò®ÍÊAEôBÍò-ÔfÁßµÖõWëÌx]üEi¦27ù òLgíÍJ'w¨5§Áùsêù]´ð%4Næ(¨*ã½YãHpý@0ÕÿÚ1ÃEò]!oÛÊÄ! E8,RñWm:ÎEò¶@Æq)ÀZÎÂ"[.nµ?gKADõïu©ZÙ,ZXô/tڦׯ § éï¿&µÞø^,føUòµÂQ²_Þ¯} @ÈÆJeF¶Cö'Ó¥¥6{¥jþ>Âa¢=Sf_1J³¹FhP6ÝEeæT8pÑÿÀÓµ¬4DѼdZb°6qáÂ?ßQÜF*´PZûHÒÔsî ]BC2û>s äyå+Z¨ª»·"4=Ý_ÇäeÑÁhRo¿nvïß{·=!¬äÝ"Ö|6þÞ±4mÊù1ýèùYn)òºf] ³ÞÇRy´3Ã]Ú>pxãÖz¨®àáݱ³<Ç{]o¹ø] ;Út½IÈxµFDÞÅ2ÄâöMãð\¯ÌL¤ôD̹WªØ¦aïáÈÊcQÌ¢*zi`ñ «cÂëflQ±ð%H´gÃiQ{Ò¹çAò`~ hc_`shÿÛR\Ç·Ô¤(xÀÙ^ͨPû¤°gA¶$|mvmEp×*q·ÏGz;Oý ê$ÇP³r££Î ½¦Zdz0`¬ß]1A$ÉVíÊûÀ2ðp)u ø/#ë-!fkѬ]ô©B3J`$ç¾LÓM4°skI ÁàþQI(:Ñ?^ ãùßoø]!tÿ~eÄ0Gð3«Cæü ÀÔÕî$AZèÇU«ÔAbïÿ6>1h´`(¥¥ôÙô/iÊ¥×ë~Ìì=,Çtiýà*E¹9È¥ANú¢¬q]Ùt,¦Y8%+`wß©½ÌUÅó{°´£fy4¼ýíÑ ß+~O¦ ;=ÁYJm1Ëèê:12AG:ï¯4S¿ØnQx½¼nDÃ>ùßúE¡±CH4kÁÃc¡¹k»ätä{Ñ(¤{.òlLè,Ý/ÊÃÎâ~ÃíËfod¶ýmK8ñ"5bâ0°[DCÓ5ÑLÅȪ2§&¬ø¨ób£°?«Õ»Û|E$J/âíÔåÚA%íÔsb°|ùÈDZ5HÜÒ(ëTÏS¥+¿Hórü¥ÖD©ìÀgÏ`¶Jáã«À=~úVSÕæÔ sÂÊGx!3´ëÎAr=4äö\³ópÿÔ$t µíüsűG*üêQ¡Åü^?"V¦ò² ßÖ $«m&U[áv ó5$âQ%Ç~¨u!}Õì/Ä'Êö§Q>¬_ ª«ä10¤' ^í"3.¾þ¨kÙI¢múÒ¢þÿ_¸1.41!áa)Eë´ÐzÎ7,KgzgÎ} vy.lÖÿ8ûÀkü @Ôµ,%Aò"BIVéÙÿÿ/Vá£,KÊ Ä%FY»g Sâý¬9"ô¥]@µ¶SÔ^µ$²4éCÕêÌb¡Ãï|â>iþÛ.iYo²À }yç(ûr¦äµÝñ«ö'ú`! ü~hϹ)58ÑE]T¯GîÁ?¤^PÐyH£qOz±§[Q JÂxÌPHÝ]l}1[SE÷nESä»rµr+$/áÜÌͦkÕLOv{IáÁ<àß>?ÖOSf=}P´¢ê¹âN|p^j¢ìVó ¤î©;¬XÚÈñïàaL Y='9Ö꿵XØÙéßÇaDÅn| ܹSÙf RWÉ7øòJ)Yh>S!Î']Ñ¡èDúìô/£vÀÝU¯[@/#bnÀÀ¡1·«Dc;¢¨U¹Ý(n¢0©0a(§ì]ð×>ö¹¢Ï¸ã¨,9Óù¹'CÖ2ç,/å. мҧ ÄvÇpwújdµ²4xª¡ïù¦å¾TphÑôm@íUJB6%gVæh U9G¸×(p6VÏ2äT<4- ¢ïTÈZtÂä!ðp(ª'Hçq8\Î"¡£×ZQ§U!gÅuîw©û]ZÔöwzL4Íõg1óÒ%Ý & cÜ?×äÈ£ø¯×KÓ¼5õü|1¡K·Gtã Cá'[ÑÁ°»·§å4m±*Mvå8úLw"±KeUµFy¿¢~òqÏÉ ö][ü^^y>ü üÀÔµí$DA´`¹Ø*Ehâ«úþbbL-[K¡,¥PgΡêKú@¶½ÌËLýå+¿ï31ÆQqp@BÊ {Ö©UóC¸uÀÚåÖlóq§¼;£½)`Ïã5ãêÑdd%ëIP^`Ö«¢°à7T¾·Î¡9ÛÕëÛôjà?¿Y¬"ýÆÝy±æ\Û²NLBt~ã\ûsxÞ,þƱ§å¸U*g$ñ(^SBJó/öǹSjÀÜ.8ð¨Sqo½.4 ¤ÍF4±¥)wºðS[.¨ô&¼Í4mÚßÖrbÖö³GÑ"p;Ò ùgóìÞ¬ -gó5XÄàÒßôv "2Ûë9ªÀ9`w°(ZàK¼qw²àÀíËx<d©¶çÖÕq|²þ1ÀJv"³ L[z$µd}?A·Xÿ q5máj¸Bj¢)6cn»¶Âñ\ÚxåEêÁRÛmÃÛÕÁ JÀÔxdHH :6 é6³µëµ%äb>gqãñùKÕ)í,£lè¶% :ë3_ä<}ý%èHt*üM#ØÉceM¯ 6ã[Fuîãæ&lÛsgòý|-êÂÂÒ0v½×k +Ê(¼ÖTÁF ¼NaPreÅmVÖÇ;±³JW(°±NÑj#3lâ¿ /ÓeÒ¤bku7T ÚëúÇ!Ü" ·Ê¾V[ÜÜÉVçuÛ"®îÔMæ&ÿ,ÌÚÞ»[¿ß=ÒðääÑ+7p ~³ @½Xdt.+Ô²$Óê·þó´õ6ÎIÊEjÁË(Âý·AgçmKÁO98ÀiìÿÀÔµì4Ä@í¦UÕ<¨@¢'ÄÿÀ B ¤$mÓt³yÀ½¸õR5JwíñرëY[ æ~DY¬J?»ßäwAzÀºÚ¦ü+vÁÒîv½z¬"ßûço5í,í§+q¢ó¬1j833¸Qî ï{h¢ny¹JîìKËãKÂ~·Ã{~ûÝÑúfÉç×VXWÇmue6ÙúHjhs>ʪ¹+ÛÁMLÜÎ'$|¸_->Üäâ/A±b^Á_i¢ìA§íÉy´_uñ É%dc÷̨lv§§çÑÍw ÑÖ sà°´K Ï0ñàXND÷£8h ®ò¢fÅa&Ç÷£ÙS\éHÚ+Å ÀRâ0Ͳ¬´'¢èQÑÎÃõ¹-Æ Ú1 X+CȬ¸ªhñËËm®Óy5«p$(=ÝPuo+ê»oÉD¶d4e)1 ;æ»3¥×È=©¹*x¯]í 0¿n[kK=»À²ÌÉüë$¹päH`CÀÖdîBs}ÍÐ)|¼÷quØð\¶¬az@ðp ìByj8¿2ñrkEÉclÜ5%¶I²FT卸Àæ7ê°Ð¯V¿0³Â®Îz}¬$ÌÀ ¼âÂd\m-èitàáë½£xWº«ÇsÁÂGaäø{,ZIº¹mE¡ÔÇØH¢´G±¿Èo°Öî¹Ç£ÑÛÿu-Ë APQM¢Æ[þÿrI%X§¬@Ó=æbYTñÜyôìît÷oæ×7¡¤TIQæNº Òù·Çýü¢ÏZ÷3,ü8}X.ûæßëm»¬Òn!?Àh¨ý:#2·ÝR680©÷ |ÙnìrÑ¡ÐúQá~CC¯ðòd@U NÑlN }À ¡sV ÅRHZã`wÄSð?å ³YUjÇæE¶69qAíÑX.Å^ÙTbIÛV½í¾¡Îd<d¢°·>WÍäéuÏ0ý' R\Ä/6Ëlp£G¡Kì çs¢ë¡¬·þê®yf°(µy_¬ Ó¢¸q$$Ï®Ä*[ÉÛAdërx÷Ý}--¾ `Ï ùüåhnèº<J¸Ìç ®¢¨·ðÖÖ£>!»Í,EêÐ]ºAFîZÅd$5ý:K>Û<4.k {Q®¸Íùú±Yé1zófSbbÂß×¹!aÛÚ ·M¾7Æ¢B?äô`ÐV÷¶òRw¾Ä÷ö ¼ÚYDÀ¯¢¥9ï}ÓOûEr1¥yW ÏgÔê2rr¢C,ûÆ-½¯ÕIn/§h´ÅûæqùrvH|´üJ½&0Yµ¿úë îØÒØc^?ÌÒ<ºë <3±VxØØÂpJ³ÄOFG5þ'QÛê¸Hy{ÝXÜ«ýPN%Ë#ØÈ§Ñåè¢`ÒõÕëu6¬r%è÷s«\xVYÕ¯öÝjZpÉnÕp´¥|vse`Ð'¶²¦²!ø~BìÆgäOò¤à(ÀH#ÍÁ¶P<aûDz¬=ÿ¿3Q©hƵ¹ÿâáîÔe*wýYÅÇþ¯´±Å{ÙjcÊuÌE×åG¸´ÊàÍwÚRÌT>8²jg^oÕl{ÀqÚé÷ÐÌxI÷ & &åÂÆr~MI5ðà}jRNÓ °!ÀdÂ- ÍB®ôº]ð]ü}º^2Ã[£L íÆäÆçíè¤ûæQ nISÐ) %"ÞE0~¸ôwú<sì4÷nY <YV;ÄÆtúAðO ãã¤þüè Êéál]ö)i¤O)úÈäLUíJKìêuS»\É"B¿Z~ç)áWOx<0e¹®c®,MúDÂñÛñ÷Åà;8ìMm^ï|ÓøV$Òlú?æ¬A Jͺٲ0¬÷xf |Ρ}O#n}ZÁÚkLUµJ ¨ÊÉs u¤"H ¹@2Ébûk¹5n< q°hm7<UÕ<ÆåÀêuÉ8OgIÓ#,³Ä5ý+~ÊI»Oküá°Ëp¸mé§È'÷¤É©Èñw;]ª¾±Y³Þ˰²µW±Ù Uc¯ä\6µÞÕ+Ý:z&\¨wxó° 4§üwV)ÀjÄCoÃ31®æÝbÜoº~0`Óým]·«_d³ éûb;üD³Ö¡,QZçGEcnþ'⺺C§rô¤RÕ»l\~H,¬ÿÔ}k$DÛW fr æ&Kô°}7©ù3('Ð>ª¯z(< {]Óz u?ü£«é¢¶ÁÆ`>Â&M¥Iª6I¥zé¹ÿ¼§Þr©JU/¢|îfÙ]`cw3ϼ7#ÄÏGÈ!Ó=6Û`³³"Ï`^?èëEÝ¥vÔÐà ë¤4ØMx³ÜÔTkEØs¾ëÝ¿±fÔe`àÛéKé̳n3O*q8Qwó3jT&FöÊúøÁ)½ Î NæSF p»êzxõäðÛ}PX½ x(Çq¹.rèsníÛÈìñáç) +Cà.T¼á³¾kGÂ/Ïãm¯a²:±µ^.(Ðöæ³»µ§eà0cî«v&w=ÿ,_+² ·5ä/ÀºùôÜÅ@Ït: &C,ÿTtóÃTΰEXv£¸H·B\ËFé÷}É÷õ]ämÏÎrhñä×Ò>6j@ô±!§eÈ4Ôrô¢ è"`¿ÅºYIGDô¼Ïyó÷EY0OÂIîJf: >Ì 'Áw&jÄ-MSxÄ;}·×Ö¥Ýçdo7 Ù÷Yss;£È@éyiToQDñM8vx¦+ÛZ)?8ÃÑÈU D?;s=5úhPóî÷:ÏbïÆÃ`)Ã9ë'ÄD,~mºÊñó!¼ þ5>Äáû&¾ÒSZ5,{¬ ÛÏ®cßïp_´ËfqnþÆt¾úSrrÂeáµ&<A$ÅPhK3eã6׳'¼õ$¬<Ri$·Ë(,m %>gMÙ¨hÄà^à«<²³$nÄ#Ù´ýO®ôSµó>#Å >ar%©¤aFìCéÊ@[!Ò¼ksx½®ÌªuÇ\=¹Á¿ß´Âêïe{v÷÷k½0Cô´³óôÇ &'¡áa,ÄÇÙpÛÒºÎG¤¾+»ªQgã%Þ[ 9§¥±òìbÔ~ÈQ1ÜO_jB(.V»/'ì¹²<6íZ÷_&$À4_ÅEZéx ¥.²(R{ÔÙ"´saKÝIKqÇq!TØÉ3ØwünÛ>7n]µã<¸}R&7ýí©»¿þ®x éæÓ@äëq Oûevé8:Þ¶a "M²hK²ã¤1R§+ÒÍ©÷ö÷÷ÞZÄ(²õHqQ¹ë@gÞû¤xV6 ¥;§ê^¬³Os4Ï&y-K21r»?mPÊl\/Kîl¸ö°¯Õ oL7£>A ¢Bå¬4è¼Lï%æYr6? @ 7 ²På,wD[6éG¦!Ï&©WàK¯ÚhOÆýå0zÚEÚÅyïYø§"0ßkØÕ¤nú¶ÊüÓ®é½wu¦:èFQöõµ@®ÅàµÊù)O3ºø ÏǨ»ÛÇ9U}®/¤q+o%xÇÈÑàB[õm õ±Ákßn`ÉÍÃîøäørdjÆÅáÍ^È)1»0Æ2 %´³ÖÕóѨò5ÄL<¸1:Ãøðo-8xY°I+ASÄâ(íæev~1AÐóWhdÕÕ1VYLmßE*GÄSo!¼ çK&æ.{®¬>%bqÔ¾Ù³ãßÍèû¥þ±´Â§w QN³T ¢Åb2×>ËxWÑÚî5¡ !:@"iÌÖ*¦J>«nÕ¦e0CS$þ ÔâйTÉ__ïÍÞ°%Ô#x!mÎTµoo&Ë`MÅ ºbF]Sé¹B\§A}Ìks¥:øc çÛÎ}ì>3ä Ù pçÃqgQ¡ñ)f7'¬ ì 2<j0/CãqæeÜbû%ÅéAvó>~Ó Q¦lh.Õ¡Þµ ¥ù¾+»¾6¤|?y9Í%ñõT?ÍB0d¨9Ü£ xÕ8×·|W¶7©©Hºnò'y4N?BVå¬Ó®µ<õ»d+ÞïÓmåiì®[ l'Ð;Ðé+îÔÕ©-1lãYc½îQó0.µä¡/gîþÅ,ìmϳLí»ù9JhrÔë)¬)B)ÖG§j5´þ8ãØãs ÛÒï.è¬9²Ia7õz[ôVY":°Ä²ÍÁßm¸$öܰ×>Pó"q2ºßVpñQ#dF~mb+Ö8ò¼{¬§Iô.\N¨Äùd¬9F#ïüØ:· wIiK5¨Á{ßÿ¼6Fc Zñÿfº¹j¦süwÛÎ0ÎåF#×³ÐµÖ±ÈÆ<تÕv¤ÛÂûj×ñÔ4t\ÔªþÍÃg9z>×|=N,V/&ý1U+Í8 '*RèÛýi×vG{îO(yè,?Ø¿y*Rw½`m)Bû}^ÞLÍ ÂÉÒ(-ÝH2ªIÞw_Ë-_¤û.n± _µØ´çÇ:dùÍzPjìJV>(º ... [truncated message content] |
From: Luke H. <lh...@us...> - 2002-11-25 06:42:48
|
Update of /cvsroot/java-game-lib/LWJGL/examples/nehe/lesson01 In directory sc8-pr-cvs1:/tmp/cvs-serv12937 Added Files: Lesson1.java Log Message: up we go --- NEW FILE: Lesson1.java --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/examples/nehe/lesson01/Lesson1.java /* * Copyright (c) 2002 Light Weight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import org.lwjgl.*; import org.lwjgl.opengl.*; import org.lwjgl.input.*; /** * $Id: Lesson1.java,v 1.1 2002/11/25 06:42:45 lholden Exp $ * * Setting Up An OpenGL Window * * Credit goes to Jeff Molofee (NeHe) whos tutorial this is based on * * @author Luke Holden * @version $Revision: 1.1 $ */ public class Lesson1 { private GL gl; private GLU glu; private boolean done = false; private boolean fullscreen = true; /** Creates a new instance of Lesson */ public Lesson1() { } private void resizeGLScene(int width, int height) { /* Reset The Current Viewport */ gl.viewport(0, 0, width, height); /* Select The Projection Matrix */ gl.matrixMode(GL.PROJECTION); /* Reset The Projection Matrix */ gl.loadIdentity(); /* Calculate The Aspect Ratio Of The Window */ glu.perspective(45.0f, ((float) Display.getWidth()) / ((float) Display.getHeight()), 0.1f, 100.0f); /* Select The Modelview Matrix */ gl.matrixMode(GL.MODELVIEW); /* Reset The Modelview Matrix */ gl.loadIdentity(); } private void initGL() throws Exception { try { /* Enables Smooth Shading */ gl.shadeModel(GL.SMOOTH); /* Black Background */ gl.clearColor(0.0f, 0.0f, 0.0f, 0.0f); /* Depth Buffer Setup */ gl.clearDepth(1.0f); /* Enables Depth Testing */ gl.enable(GL.DEPTH_TEST); /* The Type Of Depth Test To Do */ gl.depthFunc(GL.LEQUAL); /* Really Nice Perspective Calculations */ gl.hint(GL.PERSPECTIVE_CORRECTION_HINT, GL.NICEST); } catch (Exception e) { throw new Exception("Problem initialising GL", e); } } private boolean drawGLScene() { /* Clear The Screen And The Depth Buffer */ gl.clear(GL.COLOR_BUFFER_BIT | GL.DEPTH_BUFFER_BIT); /* Reset The Current Modelview Matrix */ gl.loadIdentity(); return true; } public void killGLWindow() { Keyboard.destroy(); gl.destroy(); Display.destroy(); } public void createGLWindow(int width, int height, int bits, boolean fullscreenflag) throws Exception { fullscreen = fullscreenflag; try { Display.create(new DisplayMode(width, height, bits, 60), fullscreenflag); gl = new GL(bits, 0, bits, 8); gl.create(); glu = new GLU(gl); Keyboard.create(); Keyboard.enableBuffer(); resizeGLScene(Display.getWidth(), Display.getHeight()); initGL(); } catch (Exception e) { throw new Exception("Problem initialising Lesson", e); } } public void start() throws Exception { try { createGLWindow(640, 480, 16, fullscreen); while (!done) { loop(); } killGLWindow(); } catch (Exception e) { throw new Exception("Problem starting loop", e); } } private void loop() { drawGLScene(); gl.swapBuffers(); /* Keys that have a toggle effect */ Keyboard.read(); for (int i = 0; i < Keyboard.getNumKeyboardEvents(); i++) { Keyboard.next(); if (Keyboard.key == Keyboard.KEY_ESCAPE && Keyboard.state) { done = true; } } } public static void main(String[] arguments) { int err = 0; Lesson1 lesson = new Lesson1(); try { lesson.start(); } catch (Exception e) { err = 1; e.printStackTrace(); } System.exit(err); } } |
From: Luke H. <lh...@us...> - 2002-11-25 06:38:00
|
Update of /cvsroot/java-game-lib/LWJGL/examples/nehe/lesson17/data In directory sc8-pr-cvs1:/tmp/cvs-serv10191/lesson17/data Log Message: Directory /cvsroot/java-game-lib/LWJGL/examples/nehe/lesson17/data added to the repository |