c c this driver tests eispack for the class of real tri- c diagonal matrices exhibiting the use of eispack to find all the c eigenvalues and eigenvectors, only all the eigenvalues, some of c the eigenvalues and the corresponding eigenvectors, or only some c of the eigenvalues. c c this driver is catalogued as eispdrv4(rteispak). c c the dimension of a should be nm by 3. c the dimension of z should be nm by nm. c the dimension of w,norm,d,e,e2,rv1,rv2,rv3,rv4,rv5,rv6, and c ind should be nm. c here nm = 20. c double precision z( 20, 20),a( 20, 3),w( 20),d( 20),e( 20), x e2( 20),rv1( 20),rv2( 20),rv3( 20),rv4( 20),rv5( 20), x rv6( 20),norm( 20),tcrit,machep,resdul,maxeig,maxdif, x eigdif,u,lb,ub,eps1 integer ind( 20),error data ireadc/5/,iwrite/6/ c c .......... machep is a machine dependent parameter specifying c the relative precision of floating point arithmetic. c machep = 1.0d0 1 machep = 0.5d0*machep if (1.0d0 + machep .gt. 1.0d0 ) go to 1 machep = 2.0d0*machep c nm = 20 10 call rmatin(nm,n,a) write(iwrite,20) n 20 format(48h1the subdiagonal, diagonal and superdiagonal in , x 53hthat order of the tridiagonal non-symmetric matrix a, x 10h of order,i4,4h is) do 30 j = 1,3 is = max0(1,3-j) ie = min0(n,n+2-j) 30 write(iwrite,40) (a(i,j),i=is,ie) 40 format(/(1x,1p5d24.16)) read(ireadc,50) mm,lb,ub,m11,no 50 format(i4,2d24.16,2(4x,i4)) c c mm,lb,ub,m11, and no are read from sysin after the matrix is c generated. mm,lb, and ub specify to bisect the maximum c number of eigenvalues and bounds for the interval which is to c be searched. m11 and no specify to tridib the lower c boundary index and the number of desired eigenvalues. c do 230 icall = 1,10 c c if tqlrat path (label 80) is taken then tql2 path (label 70) c must also be taken in order that the measure of performance be c meaningful. c if imtql1 path (label 85) is taken then imtql2 path (label 75) c must also be taken in order that the measure of performance be c meaningful. c go to (70,75,80,85,89,90,95,100,110,115), icall c c rtwz using tql2 c 70 write(iwrite,71) 71 format(42h1all of the eigenvalues and corresponding , x 51heigenvectors of the real tridiagonal matrix follow./ x 36h the path involving tql2 was used. ) call figi2(nm,n,a,w,e,z,error) write(iwrite,72) error 72 format(//30h *****error from figi2***** = ,i4) if( error .ne. 0 ) go to 230 call tql2(nm,n,w,e,z,error) write(iwrite,725) error 725 format(//29h *****error from tql2***** = ,i4) do 73 i = 1,n 73 rv6(i) = w(i) m = n if( error .ne. 0 ) m = error - 1 go to 130 c c rtwz using imtql2 c invoked from driver subroutine rt. c 75 write(iwrite,76) 76 format(42h1all of the eigenvalues and corresponding , x 51heigenvectors of the real tridiagonal matrix follow./ x 38h the path involving imtql2 was used. ) call rt(nm,n,a,w,1,z,e,error) write(iwrite,77) error 77 format(//30h *****error from figi2***** = ,i4) if( error .gt. 0 ) go to 230 write(iwrite,775) error 775 format(//31h *****error from imtql2***** = ,i4) do 78 i = 1,n rv5(i) = w(i) 78 continue m = n if( error .ne. 0 ) m = error - 1 go to 130 c c rtw using tqlrat c 80 write(iwrite,805) 805 format(24h1all of the eigenvalues , x 38hof the real tridiagonal matrix follow./ x 38h the path involving tqlrat was used. ) call figi(nm,n,a,w,e,e2,error) write(iwrite,807) error 807 format(//29h *****error from figi***** = ,i4) if( error .gt. 0 ) go to 230 call tqlrat(n,w,e2,error) write(iwrite,809) error 809 format(//31h *****error from tqlrat***** = ,i4) maxeig = 0.0d0 maxdif = 0.0d0 m = n if( error .ne. 0 ) m = error - 1 if( m .eq. 0 ) go to 230 do 81 i = 1,m if( dabs(w(i)) .gt. maxeig ) maxeig = dabs(w(i)) u = dabs(rv6(i) - w(i)) if( u .gt. maxdif ) maxdif = u 81 continue if( maxeig .eq. 0.0d0 ) maxeig = 1.0d0 eigdif = maxdif/(maxeig*machep*dfloat(10*n)) write(iwrite,82) eigdif 82 format(//49h comparison of the eigenvalues from tqlrat with, x 52h those from tql2 gives the normalized difference , x 1pd16.8) go to 130 c c rtw using imtql1 c invoked from driver subroutine rt. c 85 write(iwrite,855) 855 format(24h1all of the eigenvalues , x 38hof the real tridiagonal matrix follow./ x 38h the path involving imtql1 was used. ) call rt(nm,n,a,w,0,z,e,error) if( error .gt. 0 ) go to 230 write(iwrite,859) error 859 format(//31h *****error from imtql1***** = ,i4) maxeig = 0.0d0 maxdif = 0.0d0 m = n if( error .ne. 0 ) m = error - 1 if( m .eq. 0 ) go to 230 do 86 i = 1,m if( dabs(w(i)) .gt. maxeig ) maxeig = dabs(w(i)) u = dabs(rv5(i) - w(i)) if( u .gt. maxdif ) maxdif = u 86 continue if( maxeig .eq. 0.0d0 ) maxeig = 1.0d0 eigdif = maxdif/(maxeig*machep*dfloat(10*n)) write(iwrite,87) eigdif 87 format(//49h comparison of the eigenvalues from imtql1 with, x 52h those from imtql2 gives the normalized difference, x 1pd16.8) go to 130 c c rtw1z ( usage here computes all the eigenvectors ) c 89 write(iwrite,891) 891 format(43h1some of the eigenvalues and corresponding , x 51heigenvectors of the real tridiagonal matrix follow./ x 38h the path involving imtqlv was used. ) call figi(nm,n,a,d,e,e2,error) write(iwrite,892) error 892 format(//29h *****error from figi***** = ,i4) if( error .ne. 0 ) go to 230 call imtqlv(n,d,e,e2,w,ind,error,rv1) write(iwrite,893) error 893 format(//31h *****error from imtqlv***** = ,i4) m = n if( error .ne. 0 ) m = error - 1 call tinvit(nm,n,d,e,e2,m,w,ind,z,error,rv1,rv2,rv3,rv4,rv6) write(iwrite,99) error call bakvec(nm,n,a,e,m,z,error) write(iwrite,894) error 894 format(//31h *****error from bakvec***** = , i4) go to 130 c c rt1w1z using tsturm c 90 write(iwrite,91) 91 format(43h1some of the eigenvalues and corresponding , x 51heigenvectors of the real tridiagonal matrix follow./ x 38h the path involving tsturm was used. ) eps1 = 0.0d0 call figi(nm,n,a,d,e,e2,error) write(iwrite,92) error 92 format(//29h *****error from figi***** = ,i4) if( error .ne. 0 ) go to 230 call tsturm(nm,n,eps1,d,e,e2,lb,ub,mm,m,w,z,error,rv1, x rv2,rv3,rv4,rv5,rv6) if( error .eq. 3*n + 1 ) go to 230 if( error .gt. 4*n ) m = error - 1 write(iwrite,93) error 93 format(//31h *****error from tsturm***** = ,i4) call bakvec(nm,n,a,e,m,z,error) write(iwrite,894) error go to 150 c c rt1w1z using bisect and tinvit c 95 write(iwrite,96) 96 format(43h1some of the eigenvalues and corresponding , x 51heigenvectors of the real tridiagonal matrix follow./ x 38h the path involving bisect was used. ) eps1 = 0.0d0 call figi(nm,n,a,d,e,e2,error) write(iwrite,97) error 97 format(//29h *****error from figi***** = ,i4) if( error .ne. 0 ) go to 230 call bisect(n,eps1,d,e,e2,lb,ub,mm,m,w,ind,error,rv4,rv5) write(iwrite,98) error 98 format(//31h *****error from bisect***** = ,i4) if( error .ne. 0 ) go to 230 call tinvit(nm,n,d,e,e2,m,w,ind,z,error,rv1,rv2,rv3,rv4,rv6) write(iwrite,99) error 99 format(//31h *****error from tinvit***** = ,i4) call bakvec(nm,n,a,e,m,z,error) write(iwrite,894) error go to 150 c c rt1w using bisect c 100 write(iwrite,101) 101 format(25h1some of the eigenvalues , x 38hof the real tridiagonal matrix follow. ) eps1 = 0.0d0 call figi(nm,n,a,d,e,e2,error) write(iwrite,102) error 102 format(//29h *****error from figi***** = ,i4) if( error .gt. 0 ) go to 230 call bisect(n,eps1,d,e,e2,lb,ub,mm,m,w,ind,error,rv4,rv5) write(iwrite,103) error 103 format(//31h *****error from bisect***** = ,i4) go to 150 c c rt1w1z using tridib and tinvit c 110 write(iwrite,111) 111 format(43h1some of the eigenvalues and corresponding , x 51heigenvectors of the real tridiagonal matrix follow./ x 38h the path involving tridib was used. ) eps1 = 0.0d0 call figi(nm,n,a,d,e,e2,error) write(iwrite,112) error 112 format(//29h *****error from figi***** = ,i4) if( error .ne. 0 ) go to 230 call tridib(n,eps1,d,e,e2,lb,ub,m11,no,w,ind,error,rv4,rv5) write(iwrite,113) error 113 format(//31h *****error from tridib***** = ,i4) if( error .ne. 0 ) go to 230 m = no write(iwrite,1135) lb,ub 1135 format(//49h the eigenvalues as determined by tridib are in, x 14h the interval ,1pd16.8,5h to ,d16.8) call tinvit(nm,n,d,e,e2,m,w,ind,z,error,rv1,rv2,rv3,rv4,rv6) write(iwrite,114) error 114 format(//31h *****error from tinvit***** = ,i4) call bakvec(nm,n,a,e,m,z,error) write(iwrite,894) error go to 150 c c rt1w using tridib c 115 write(iwrite,101) eps1 = 0.0d0 call figi(nm,n,a,d,e,e2,error) ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ