use opengl use msfwin IMPLICIT NONE CHARACTER CH INTEGER I,J,K,L,M,N,N1,ORDER,GOOD_N1,GOOD_N2,GOOD_N3 DOUBLEPRECISION X,Y,X1,Y1,X2,Y2,X3,Y3 INTEGER assa DOUBLEPRECISION ,PARAMETER::A=2.5 !Is the distance between centers of the disks DOUBLEPRECISION ,PARAMETER::RDD=1.0 !The radii of the disks (disks are equal) DOUBLEPRECISION ,PARAMETER::small=1E-6 INTEGER,DIMENSION(1:3*(2**14),1:15)::DIG,DIG1,DIG2,DIG3 DOUBLEPRECISION , DIMENSION(1:3*(2**14),0:15+3,1:4)::MZ DOUBLEPRECISION , DIMENSION(3)::XD,YD,RD assa=0 XD(1)=0; YD(1)=A/sqrt(3.0); RD(1)=RDD XD(2)=A/2.0; YD(2)=-A/(2.0*sqrt(3.0)); RD(2)=RDD XD(3)=-A/2.0; YD(3)=-A/(2.0*sqrt(3.0)); RD(3)=RDD 100 PRINT*,'ENTER THE ORDER OF TRAJECTORIES(2-15)' READ*,ORDER CALL COMBINATIONS(DIG) CALL FILTRATION1(ORDER,DIG,GOOD_N1,DIG1) ! DO I=1,GOOD_N1 ! PRINT 20,i,DIG1(I,1),DIG1(I,2),DIG1(I,3),DIG1(I,4),DIG1(I,5),DIG1(I,6),DIG1(I,7),DIG1(I,8),DIG1(I,9),DIG1(I,10),DIG1(I,11),DIG1(I,12),DIG1(I,13),DIG1(I,14),DIG1(I,15) ! 20 FORMAT (I4,I4,I4,I4,I4,I4,I4,I4,I4,I4,I4,I4,I4,I4,I4,I4) ! END DO CALL MINIMIZATION(ORDER,GOOD_N1,DIG1,XD,YD,RD,MZ) GOOD_N2=GOOD_N1 CALL FILTRATION2(ORDER,GOOD_N1,DIG1,XD,YD,GOOD_N2,DIG2,MZ) GOOD_N3=GOOD_N2 DIG3=DIG2 CALL CALCULATION(ORDER,GOOD_N3,DIG3,XD,YD,RD,MZ) IF(assa==0)THEN CALL OPENGRAPH(3.0) END IF DO L=1,3 CALL CIRCLE(XD(L),YD(L),RD(L),1) END DO DO N=1,GOOD_N3 call fglClear(GL_COLOR_BUFFER_BIT) DO L=1,3 CALL CIRCLE(XD(L),YD(L),RD(L),1) END DO CALL TRAJECTORY(N,ORDER,MZ,1,10) PRINT 30,N,DIG3(N,1),DIG3(N,2),DIG3(N,3),DIG3(N,4),DIG3(N,5),DIG3(N,6),DIG3(N,7),DIG3(N,8),DIG3(N,9) 30 FORMAT (I4,' ',I4,I4,I4,I4,I4,I4,I4,I4,I4) PRINT*,'L=',MZ(N,ORDER+2,1) PRINT*,'Lambda1=',MZ(N,ORDER+2,3) PRINT*,'Lambda2=',MZ(N,ORDER+2,4) IF (N>0.AND.N<100)THEN PAUSE END IF IF (N>100)THEN PRINT*,'NEXT TRAJECTORY?' READ*,CH IF(CH/='y'.AND.CH/='Y')THEN assa=assa+1 GOTO 100 END IF END IF END DO PRINT*,'DO YOU WANT TO CONTINUE?' READ*,CH IF(CH=='Y'.OR.CH=='y'.OR.CH==' ')THEN assa=assa+1 GOTO 100 END IF !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !*********************************************************************** !*********************************************************************** !*********************************************************************** !*********************************************************************** !*********************************************************************** !*********************************************************************** !*********************************************************************** !*********************************************************************** !*********************************************************************** !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! CONTAINS !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SUBROUTINE COMBINATIONS(DIG) INTEGER N,J1,J2,J3,J4,J5,J6,J7,J8,J9,J10,J11,J12,J13,J14,J15 INTEGER,DIMENSION(1:3*(2**14),1:15)::DIG N=1 DO WHILE(N<3*(2**14)+1) DO J1=1,3 DO J2=1,3 IF(J2/=J1)THEN DO J3=1,3 IF(J3/=J2)THEN DO J4=1,3 IF(J4/=J3)THEN DO J5=1,3 IF(J5/=J4)THEN DO J6=1,3 IF(J6/=J5)THEN DO J7=1,3 IF(J7/=J6)THEN DO J8=1,3 IF(J8/=J7)THEN DO J9=1,3 IF(J9/=J8)THEN DO J10=1,3 IF(J10/=J9)THEN DO J11=1,3 IF(J11/=J10)THEN DO J12=1,3 IF(J12/=J11)THEN DO J13=1,3 IF(J13/=J12)THEN DO J14=1,3 IF(J14/=J13)THEN DO J15=1,3 IF(J15/=J14)THEN DIG(N,1)=J15 DIG(N,2)=J14 DIG(N,3)=J13 DIG(N,4)=J12 DIG(N,5)=J11 DIG(N,6)=J10 DIG(N,7)=J9 DIG(N,8)=J8 DIG(N,9)=J7 DIG(N,10)=J6 DIG(N,11)=J5 DIG(N,12)=J4 DIG(N,13)=J3 DIG(N,14)=J2 DIG(N,15)=J1 N=N+1 END IF END DO END IF END DO END IF END DO END IF END DO END IF END DO END IF END DO END IF END DO END IF END DO END IF END DO END IF END DO END IF END DO END IF END DO END IF END DO END IF END DO END DO END DO END SUBROUTINE COMBINATIONS !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !******************************************************************* !******************************************************************* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SUBROUTINE FILTRATION1(ORDER,DIG,GOOD_N1,DIG1) INTEGER ORDER,GOOD_N1 INTEGER N,N1,J INTEGER,DIMENSION(1:3*(2**14),1:15)::DIG,DIG1 N1=1 DO N=1,3*(2**(ORDER-1)) IF(DIG(N,1)/=DIG(N,ORDER))THEN DO J=1,ORDER DIG1(N1,J)=DIG(N,J) END DO N1=N1+1 END IF END DO GOOD_N1=N1-1 END SUBROUTINE FILTRATION1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !******************************************************************* !******************************************************************* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !******************************************************************* !******************************************************************* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SUBROUTINE MINIMIZATION (ORDER,GOOD_N1,DIG1,XD,YD,RD,MZ) INTEGER ORDER,GOOD_N1 INTEGER N,J DOUBLEPRECISION A_x,A_y,B_x,B_y,C_x,C_y,D_x,D_y,DLL DOUBLEPRECISION AA,BB,CC,AB,CB,CA,DD,LENGTH_1,LENGTH_2 DOUBLEPRECISION , DIMENSION(3)::XD,YD,RD INTEGER,DIMENSION(1:3*(2**14),1:15)::DIG1 DOUBLEPRECISION , DIMENSION(1:3*(2**14),0:15+3,1:4)::MZ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! DO N=1,GOOD_N1 DO J=1,ORDER DLL=SQRT(XD(DIG1(N,J))**2+YD(DIG1(N,J))**2) MZ(N,J,1)=XD(DIG1(N,J))*(1-RD(DIG1(N,J))/DLL)+0.001 MZ(N,J,2)=YD(DIG1(N,J))*(1-RD(DIG1(N,J))/DLL)-0.001 MZ(N,J,3)=DIG1(N,J) MZ(N,J,4)=RD(DIG1(N,J)) END DO MZ(N,0,1)=MZ(N,ORDER,1) MZ(N,0,2)=MZ(N,ORDER,2) MZ(N,0,3)=MZ(N,ORDER,3) MZ(N,0,4)=MZ(N,ORDER,4) MZ(N,ORDER+1,1)=MZ(N,1,1) MZ(N,ORDER+1,2)=MZ(N,1,2) MZ(N,ORDER+1,3)=MZ(N,1,3) MZ(N,ORDER+1,4)=MZ(N,1,4) END DO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! DO N=1,GOOD_N1 LENGTH_1=0 DO LENGTH_2=LENGTH_1 LENGTH_1=0 DO J=1,ORDER A_x=MZ(N,J-1,1)-XD(MZ(N,J,3)) A_y=MZ(N,J-1,2)-YD(MZ(N,J,3)) B_x=MZ(N,J,1)-XD(MZ(N,J,3)) B_y=MZ(N,J,2)-YD(MZ(N,J,3)) C_x=MZ(N,J+1,1)-XD(MZ(N,J,3)) C_y=MZ(N,J+1,2)-YD(MZ(N,J,3)) AA=A_x*A_x+A_y*A_y BB=B_x*B_x+B_y*B_y CC=C_x*C_x+C_y*C_y AB=A_x*B_x+A_y*B_y CA=A_x*C_x+A_y*C_y CB=B_x*C_x+B_y*C_y LENGTH_1=LENGTH_1+sqrt(AA+BB-2*AB) D_x=A_x/sqrt(AA+BB-2*AB)+C_x/sqrt(CC+BB-2*CB) D_y=A_y/sqrt(AA+BB-2*AB)+C_y/sqrt(CC+BB-2*CB) DD=SQRT(D_x*D_x+D_y*D_y) B_x=MZ(N,J,4)*D_x/DD B_y=MZ(N,J,4)*D_y/DD MZ(N,J,1)=XD(MZ(N,J,3))+B_x MZ(N,J,2)=YD(MZ(N,J,3))+B_y END DO MZ(N,0,1)=MZ(N,ORDER,1) MZ(N,0,2)=MZ(N,ORDER,2) MZ(N,0,3)=MZ(N,ORDER,3) MZ(N,0,4)=MZ(N,ORDER,4) MZ(N,ORDER+1,1)=MZ(N,1,1) MZ(N,ORDER+1,2)=MZ(N,1,2) MZ(N,ORDER+1,3)=MZ(N,1,3) MZ(N,ORDER+1,4)=MZ(N,1,4) IF(ABS(LENGTH_1-LENGTH_2)<1E-8)EXIT END DO END DO END SUBROUTINE MINIMIZATION !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SUBROUTINE FILTRATION2(ORDER,GOOD_N1,DIG1,XD,YD,GOOD_N2,DIG2,MZ) INTEGER ORDER,GOOD_N1,GOOD_N2 INTEGER I,J,M,N,N1 INTEGER,DIMENSION(1:3*(2**14),1:15)::DIG1,DIG2 DOUBLEPRECISION , DIMENSION(1:3*(2**14),0:15+3,1:4)::MZ DOUBLEPRECISION , DIMENSION(3)::XD,YD DOUBLEPRECISION,PARAMETER::sm=1E-4 DOUBLEPRECISION B_x,B_y,NV_x,NV_y,ModB,ModV N1=1 DO N=1,GOOD_N1 M=0 DO J=1,ORDER B_x=-(2*MZ(N,J,1)-MZ(N,J-1,1)-MZ(N,J+1,1)) B_y=-(2*MZ(N,J,2)-MZ(N,J-1,2)-MZ(N,J+1,2)) ModB=SQRT(B_x*B_x+B_y*B_y) NV_x=MZ(N,J,1)-XD(MZ(N,J,3)) NV_y=MZ(N,J,2)-YD(MZ(N,J,3)) ModV=SQRT(NV_x*NV_x+NV_y*NV_y) IF(abs(B_x/ModB-NV_x/ModV)0)THEN PRINT*,N1 DO J=1,ORDER DIG2(N1,J)=DIG1(N,J) END DO DO J=0,ORDER+1 DO I=1,4 MZ(N1,J,I)=MZ(N,J,I) END DO END DO N1=N1+1 END IF END DO GOOD_N2=N1-1 END SUBROUTINE FILTRATION2 !************************************************************ !************************************************************ !************************************************************ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !***************************************************************** !***************************************************************** !***************************************************************** SUBROUTINE CALCULATION(ORDER,GOOD_N3,DIG3,XD,YD,RD,MZ) INTEGER ORDER INTEGER N,J,GOOD_N3 DOUBLEPRECISION A_x,A_y,B_x,B_y,C_x,C_y,D_x,D_y DOUBLEPRECISION AA,BB,CC,AB,CB,CA,DD,LENGTH,TRJMATR,DETJMATR DOUBLEPRECISION Lambda1,Lambda2 DOUBLEPRECISION BAV_x,BCV_x,BAV_y,BCV_y,BAVMOD,BCVMOD,COS_Phi DOUBLEPRECISION , DIMENSION(1:2,1:2)::JJJJ1,JJJJ2,JJJJ,JMATR,JMATR1 INTEGER,DIMENSION(1:3*(2**14),1:15)::DIG3 DOUBLEPRECISION , DIMENSION(3)::XD,YD,RD DOUBLEPRECISION , DIMENSION(1:3*(2**14),0:15+3,1:4)::MZ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! DO N=1,GOOD_N3 JMATR(1,1)=1 JMATR(1,2)=0 JMATR(2,1)=0 JMATR(2,2)=1 LENGTH=0 DO J=1,ORDER A_x=MZ(N,J-1,1)-XD(MZ(N,J,3)) A_y=MZ(N,J-1,2)-YD(MZ(N,J,3)) B_x=MZ(N,J,1)-XD(MZ(N,J,3)) B_y=MZ(N,J,2)-YD(MZ(N,J,3)) AA=A_x*A_x+A_y*A_y BB=B_x*B_x+B_y*B_y AB=A_x*B_x+A_y*B_y LENGTH=LENGTH+sqrt(AA+BB-2*AB) BAV_x=MZ(N,J-1,1)-MZ(N,J,1) BAV_y=MZ(N,J-1,2)-MZ(N,J,2) BAVMOD=SQRT(BAV_x*BAV_x+BAV_y*BAV_y) COS_Phi=(B_x*BAV_x+B_y*BAV_y)/(BAVMOD*SQRT(BB)) !************* JJJJ1(1,1)=1 JJJJ1(1,2)=BAVMOD JJJJ1(2,1)=0 JJJJ1(2,2)=1 !************* JJJJ2(1,1)=-1 JJJJ2(1,2)=0 JJJJ2(2,1)=-2/(COS_Phi*MZ(N,J,4)) JJJJ2(2,2)=-1 !************* JJJJ(1,1)=JJJJ1(1,1)*JJJJ2(1,1)+JJJJ1(1,2)*JJJJ2(2,1) JJJJ(1,2)=JJJJ1(1,1)*JJJJ2(1,2)+JJJJ1(1,2)*JJJJ2(2,2) JJJJ(2,1)=JJJJ1(2,1)*JJJJ2(1,1)+JJJJ1(2,2)*JJJJ2(2,1) JJJJ(2,2)=JJJJ1(2,1)*JJJJ2(1,2)+JJJJ1(2,2)*JJJJ2(2,2) JMATR1(1,1)=JJJJ(1,1)*JMATR(1,1)+JJJJ(1,2)*JMATR(2,1) JMATR1(1,2)=JJJJ(1,1)*JMATR(1,2)+JJJJ(1,2)*JMATR(2,2) JMATR1(2,1)=JJJJ(2,1)*JMATR(1,1)+JJJJ(2,2)*JMATR(2,1) JMATR1(2,2)=JJJJ(2,1)*JMATR(1,2)+JJJJ(2,2)*JMATR(2,2) JMATR(1,1)=JMATR1(1,1) JMATR(1,2)=JMATR1(1,2) JMATR(2,1)=JMATR1(2,1) JMATR(2,2)=JMATR1(2,2) END DO MZ(N,ORDER+2,1)=LENGTH MZ(N,ORDER+3,1)=JMATR(1,1) MZ(N,ORDER+3,2)=JMATR(1,2) MZ(N,ORDER+3,3)=JMATR(2,1) MZ(N,ORDER+3,4)=JMATR(2,2) TRJMATR=JMATR(1,1)+JMATR(2,2) DETJMATR=JMATR(1,1)*JMATR(2,2)-JMATR(1,2)*JMATR(2,1) MZ(N,ORDER+2,2)=TRJMATR Lambda1=0.5*(TRJMATR+SQRT(TRJMATR*TRJMATR-4*DETJMATR )) Lambda2=0.5*(TRJMATR-SQRT(TRJMATR*TRJMATR-4*DETJMATR )) MZ(N,ORDER+2,3)=Lambda1 MZ(N,ORDER+2,4)=Lambda2 END DO END SUBROUTINE CALCULATION !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !******************************************************************* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !******************************************************************* !******************************************************************* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SUBROUTINE OPENGRAPH(R_0) use opengl use msfwin REAL R_0 INTEGER Count integer(4) ret integer(2) pattern !***************************************************************** call fauxInitDisplayMode (IOR(AUX_SINGLE , AUX_RGB)) call fauxInitPosition (0, 0, 800, 800) ret = fauxInitWindow ("TRAJECTORY") call fglClearColor (0.0, 0.0, 0.0, 0.0) call fglClear(GL_COLOR_BUFFER_BIT) call fglColor3f(1.0, 1.0, 1.0) call fglMatrixMode (GL_PROJECTION) call fglLoadIdentity () call fglOrtho(DBLE(-R_0), DBLE(R_0), DBLE(-R_0), DBLE(R_0), DBLE(-R_0), DBLE(R_0)) call fglLineWidth (1) call fglClear(GL_COLOR_BUFFER_BIT) END SUBROUTINE OPENGRAPH !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !******************************************************************* !******************************************************************* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SUBROUTINE TRAJECTORY(N,ORDER,MZ,COLOR,DELAY) use opengl use msfwin INTEGER ORDER INTEGER DELAY,COLOR INTEGER N,J DOUBLEPRECISION , DIMENSION(1:3*(2**14),0:15+3,1:4)::MZ IF(DELAY>0)THEN DO J=1,ORDER call sleep (DELAY) call fglBegin(GL_LINES) call fglColor3f (COLOR, 0, 0) call fglVertex2f(MZ(N,J,1), MZ(N,J,2)) call fglVertex2f(MZ(N,J+1,1), MZ(N,J+1,2)) call fglEnd() call fglFlush() IF(J>2)THEN call sleep (DELAY) call fglBegin(GL_LINES) call fglColor3f (COLOR, COLOR, COLOR) call fglVertex2f(MZ(N,J-2,1), MZ(N,J-2,2)) call fglVertex2f(MZ(N,J-1,1), MZ(N,J-1,2)) call fglEnd() call fglFlush() END IF END DO END IF END SUBROUTINE TRAJECTORY !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !*********************************************************** !*********************************************************** !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SUBROUTINE CIRCLE(X0,Y0,R,COLOR) use opengl use msfwin DOUBLEPRECISION X0,Y0,X,Y,R,PHI INTEGER COLOR !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! DO PHI=0,2*3.14,0.02 X=COS(PHI) Y=SIN(PHI) X=X0+X*R Y=Y0+Y*R call fglBegin(GL_POINTS) call fglColor3f (COLOR,COLOR, 0.0) call fglVertex2f(X,Y) END DO call fglEnd() call fglFlush() !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! END SUBROUTINE CIRCLE END PROGRAM !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! call fglClear(GL_COLOR_BUFFER_BIT) ! call fglBegin(GL_POINTS) ! call fglColor3f (COLOR,COLOR, 0.0) ! call fglVertex2f(X,Y) ! call fglEnd() ! call fglFlush() !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!