]> Creatis software - gdcm.git/commitdiff
removal of now useless LibIDO Jpeg Lossless .h and .cxx
authorjpr <jpr>
Mon, 27 Oct 2003 14:01:12 +0000 (14:01 +0000)
committerjpr <jpr>
Mon, 27 Oct 2003 14:01:12 +0000 (14:01 +0000)
src/Makefile.am
src/gdcmFile.cxx
src/gdcmHeaderHelper.cxx
src/gdcmJpegIdo.cxx [deleted file]
src/gdcmParse.cxx
src/iddcmjpeg.h [deleted file]

index aad63b014ef15da37bcf9000888ce10b1d7c6b6f..f073d71b8dc8aa5226c44e7f7a2a71fd79c0c7dd 100644 (file)
@@ -30,8 +30,7 @@ libgdcm_la_SOURCES=           \
        gdcmJpeg12.cxx   \
        gdcmJpeg2000.cxx \
        gdcmRLE.cxx      \
-        gdcmParse.cxx    \
-       gdcmJpegIdo.cxx
+        gdcmParse.cxx
 
 libgdcmincludedir = $(includedir)
 libgdcminclude_HEADERS =   \
@@ -50,6 +49,5 @@ libgdcminclude_HEADERS =   \
        gdcmFile.h
 
 EXTRA_DIST =            \
-       gdcmUtil.h      \
-       gdcmIdo.h       \
-       iddcmjpeg.h
+       gdcmUtil.h      
+
index af62cd8f545a8856958298eca0e2e1668bb5b47c..ed51d6984503b8d15e0ef21f7e77c3abd586d808 100644 (file)
@@ -2,7 +2,6 @@
 
 #include "gdcmFile.h"
 #include "gdcmUtil.h"
-#include "iddcmjpeg.h" // for the 'LibIDO' Jpeg LossLess
 #include "jpeg/ljpg/jpegless.h"
 
 /////////////////////////////////////////////////////////////////
@@ -40,10 +39,10 @@ gdcmFile::gdcmFile(const char * filename)
 /**
  * \ingroup   gdcmFile
  * \brief     calcule la longueur (in bytes) A ALLOUER pour recevoir les
- *             pixels de l'image
- *             ou DES images dans le cas d'un multiframe
- *             ATTENTION : il ne s'agit PAS de la longueur du groupe des Pixels
- *             (dans le cas d'images compressees, elle n'a pas de sens).
+ *            pixels de l'image ou DES images dans le cas d'un multiframe
+ *             
+ *         ATTENTION : il ne s'agit PAS de la longueur du groupe des Pixels
+ *          (dans le cas d'images compressees, elle n'a pas de sens).
  *
  * @return     longueur a allouer 
  */
@@ -58,8 +57,10 @@ void gdcmFile::SetPixelDataSizeFromHeader(void) {
       nb = atoi(str_nb.c_str() );
       if (nb == 12) nb =16;
    }
-   lgrTotale =  GetXSize() *  GetYSize() *  GetZSize() * (nb/8)* GetSamplesPerPixel();
-   std::string str_PhotometricInterpretation = gdcmHeader::GetPubElValByNumber(0x0028,0x0004);
+   lgrTotale =  GetXSize() *  GetYSize() *  GetZSize() 
+              * (nb/8)* GetSamplesPerPixel();
+   std::string str_PhotometricInterpretation = 
+                             gdcmHeader::GetPubElValByNumber(0x0028,0x0004);
    if ( str_PhotometricInterpretation == "PALETTE COLOR " ) { 
       lgrTotale*=3;
    }
@@ -412,7 +413,7 @@ size_t gdcmFile::GetImageDataIntoVector (void* destination, size_t MaxSize) {
    //                            PhotometricInterpretation=PALETTE COLOR
    // and heuristic has to be found :-( 
 
-      int planConf=GetPlanarConfiguration();
+      int planConf=GetPlanarConfiguration();  // 0028,0006
 
       // Whatever Planar Configuration is, 
       // "PALETTE COLOR " implies that we deal with the palette. 
@@ -524,7 +525,7 @@ size_t gdcmFile::GetImageDataIntoVector (void* destination, size_t MaxSize) {
                // See PS 3.3-2003 C.11.1.1.2 p 619
                // 
             int mult;
-            if ( GetLUTNbits()==16 && nb==8) mult=2; // See PS 3.3 
+            if (GetLUTNbits()==16 && nb==8) mult=2; // See PS 3.3 
             else mult=1;
 
             // if we get a black image, let's just remove the '+1'
@@ -541,11 +542,25 @@ size_t gdcmFile::GetImageDataIntoVector (void* destination, size_t MaxSize) {
 
             free(newDest);
                
-         } else { // need to make RGB Pixels (?)
-                  // from grey Pixels (?!)
-                  // and Gray Lut  (!?!) 
-               unsigned char *lutGray =(unsigned char *)GetPubElValVoidAreaByNumber(0x0028,0x1200);
-                    // Well . I'll wait till I find such an image 
+         } else { 
+            // need to make RGB Pixels (?)
+             // from grey Pixels (?!)
+             // and Gray Lut  (!?!) 
+             //unsigned char *lutGray =(unsigned char *)GetPubElValVoidAreaByNumber(0x0028,0x1200);
+                 
+                             // Well . I'll wait till I find such an image 
+                 
+            // or Segmented Green Palette Color Lookup Table Data and so on
+                 
+                           // Oops! I get one (gdcm-US-ALOKA-16.dcm)
+                           // No idea how to manage it :-(
+                           // Segmented xxx Palette Color are *more* than 65535 long ?!?
+                           
+            // WARNING : quick and dirty trick to produce a single plane Grey image
+           // See also  gdcmHeaderHelper::GetNumberOfScalarComponents()                              
+                   lgrTotale /=3;
+                   return lgrTotale;
+           // end of dirty trick
          }
          break;
       }
index c1f38406185ac902477cefe87c2042e4ec949064..a5f78136d3eb6dcac4bb06e8be5420330c254f6c 100644 (file)
@@ -1,4 +1,4 @@
-// $Header: /cvs/public/gdcm/src/Attic/gdcmHeaderHelper.cxx,v 1.13 2003/10/24 14:34:22 malaterre Exp $
+// $Header: /cvs/public/gdcm/src/Attic/gdcmHeaderHelper.cxx,v 1.14 2003/10/27 14:01:12 jpr Exp $
 
 #include "gdcmHeaderHelper.h"
 
@@ -109,6 +109,11 @@ int gdcmHeaderHelper::GetNumberOfScalarComponents() {
           PhotometricInterpretation.find("MONOCHROME1") < PhotometricInterpretation.length() || 
           PhotometricInterpretation.find("MONOCHROME2") < PhotometricInterpretation.length() ) return 1;
 
+            // WARNING : quick and dirty trick to produce a single plane Grey image
+           // See also  gdcmFile::GetImageDataIntoVector()
+           // if(GetPubElValVoidAreaByNumber(0x0028,0x1201)==NULL) return 1; // Lut Red
+            // end of dirty trick
+
       return 3;
 }
 //----------------------------------------------------------------------------
diff --git a/src/gdcmJpegIdo.cxx b/src/gdcmJpegIdo.cxx
deleted file mode 100644 (file)
index 6a4d257..0000000
+++ /dev/null
@@ -1,384 +0,0 @@
-#include "iddcmjpeg.h"
-#include <stdlib.h>    
-       
-static ClbJpeg* ClbJpegAlloc(void);
-static void    ClbJpegInit (ClbJpeg *); 
-static int     ClbJpegDecodeDiff(ClbJpeg *);
-static BOOL    ClbJpegDecodeData(ClbJpeg *);
-static int     ClbJpegReadBit(ClbJpeg *);
-static BOOL    ClbJpegReadHeader(ClbJpeg *);
-static BOOL    ClbJpegStart(ClbJpeg *,FILE *); 
-static BOOL    ClbJpegFillHuffTable(ClbJpeg *);
-
-void _IdDcmJpegFree(ClbJpeg *jpg) {
-   free(jpg->DataImg);
-   free(jpg);
-}
-
-ClbJpeg * _IdDcmJpegRead (FILE * fp){
-   ClbJpeg * jpg=NULL;
-   //printf("entree ds _IdDcmJpegRead depuis gdcm\n");
-   jpg=ClbJpegAlloc();
-   if(!jpg) {
-      printf("Fail to ClbJpegAlloc \n");
-      return(NULL);
-         }
-   ClbJpegInit (jpg); 
-   if(!ClbJpegStart(jpg, fp)) {
-      printf("Fail to ClbJpegStart \n");
-      return (NULL);
-   }
-   return (jpg);
-}
-       
-static void ClbJpegInit (ClbJpeg *jpg) {
-   int n;
-   for (n=0;n<256;n++) {
-      jpg->lHuffTable[n].HufCode=0;
-      jpg->lHuffTable[n].HufSz  =0;
-      jpg->lHuffTable[n].HufVal =0;
-   }
-   jpg->ValCurByte     =0;
-   jpg->PosCurBit      =10;
-   jpg->MarkerFound    =0;
-   jpg->RestartInterval=0;
-}
-
-static ClbJpeg *ClbJpegAlloc(void) {
-   ClbJpeg * jpg;
-   jpg = (ClbJpeg *)malloc(sizeof(ClbJpeg));
-   ClbJpegInit(jpg);   
-   return jpg;
-}
-
-static BOOL ClbJpegFillHuffTable(ClbJpeg *jpg) {
-   unsigned char c;
-   //int testindex=0;
-   int n=0;
-   int NiDHT=0;
-   int indexY=0;
-   int k, Code, Si, i;
-
-   for (c=0;c<255;c++)
-      jpg->RawDHTstart[c]=0;
-
-   c=fgetc(jpg->infp);
-
-   jpg->MaxHuffSz =0;
-   jpg->MaxHuffVal=0;
-
-   for (n=1;n<17;n++) {
-      jpg->RawDHT[n]=fgetc(jpg->infp);
-      NiDHT+=jpg->RawDHT[n];
-      if (jpg->RawDHT[n]!=0)
-         jpg->MaxHuffSz=n;
-      }
-   for(n=1;n<16;n++) {
-      if(jpg->RawDHT[n]>0) {
-         jpg->RawDHTstart[n]=indexY+1;
-         for (i=1;i<(jpg->RawDHT[n]+1);i++) {
-            indexY+=1;
-            c=fgetc(jpg->infp);
-            jpg->lHuffTable[indexY].HufVal=c;
-            jpg->MaxHuffVal=c;
-            jpg->lHuffTable[indexY].HufSz=n;
-         }
-      }
-   }
-   k=1;
-   Code=0;
-       
-   Si=jpg->lHuffTable[k].HufSz;
-
-   while(1) {
-      if (k>=NiDHT) break;
-      while( Si==jpg->lHuffTable[k].HufSz) {
-         jpg->lHuffTable[k].HufCode=Code;
-         Code+=1;
-         k+=1;
-      }
-      if (k<NiDHT) {
-         while (jpg->lHuffTable[k].HufSz>Si) {
-            Code=Code<<1;
-            Si+=1;
-         }
-      }
-   }
-   return 1;
-}      
-
-static BOOL ClbJpegStart(ClbJpeg *jpg, FILE *inputfp) {
-   jpg->infp=inputfp;
-   if (!ClbJpegReadHeader(jpg)) {
-      printf("Fail to ClbJpegReadHeader\n");
-      return 0;
-   }
-   //printf("sortie ClbJpegReadHeader\n");
-   if (!ClbJpegDecodeData(jpg)) {
-      printf("Fail to ClbJpegDecodeData\n");
-      return 0;
-   }   
-   //printf("sortie ClbJpegDecodeData\n");
-   return 1;
-}
-
-static BOOL ClbJpegReadHeader(ClbJpeg *jpg) {
-   unsigned char gr;
-   unsigned char el;
-   unsigned char l1, l2;
-   unsigned int sztag;
-   long ouca=0;
-   BOOL HeaderEnd=0;
-   BOOL isLossLess=0;
-       
-   int tp;
-
-   gr=fgetc(jpg->infp);  //FF
-   el=fgetc(jpg->infp);  //D8
-
-   while(!HeaderEnd) {
-      gr=fgetc(jpg->infp);  
-      if(gr!=0xFF) {
-         printf("gr!=0xFF (=%02x)\n",gr);
-         return 0;
-      }
-      el=fgetc(jpg->infp);
-
-      if ( (el==0xFF) || (el==0x01) || (el==0xD8) ||(el==0xD9) ||( (el>=0xD0) && (el<=0xD7) ))
-                       ;
-      else {
-         l1=fgetc(jpg->infp);
-         l2=fgetc(jpg->infp);
-         sztag=(l1*256)+l2-2; //tag length
-         ouca=ftell(jpg->infp);
-
-         if (el==0xC3) {
-            jpg->lSof.precision=fgetc(jpg->infp);
-
-            l1=fgetc(jpg->infp);
-            l2=fgetc(jpg->infp);
-            jpg->lSof.Himg=(l1*256)+l2;
-                               
-            //printf("%x %x Himg %d\n",l1,l2,jpg->lSof.Himg);
-
-            l1=fgetc(jpg->infp);
-            l2=fgetc(jpg->infp);
-            jpg->lSof.Wimg=(l1*256)+l2;
-
-            //printf("%x %x Wimg %d\n",l1,l2,jpg->lSof.Wimg);
-
-            jpg->lSof.NbComponent=fgetc(jpg->infp); 
-            //printf("NbComponent %d\n", jpg->lSof.NbComponent);
-
-            jpg->lSof.SofTabPos=ftell(jpg->infp);
-
-            isLossLess=1; // TRUE
-         }
-
-         if (el==0xC4) {
-            ClbJpegFillHuffTable(jpg);
-         }
-         if (el==0xDA) {
-            jpg->lSos.CompCount=fgetc(jpg->infp);
-            for (tp=0;tp<jpg->lSos.CompCount;tp++) {
-               jpg->lSos.CompId=fgetc(jpg->infp);
-               jpg->lSos.CompDc=fgetc(jpg->infp);
-            }
-            jpg->lSos.SpectralSelStart=fgetc(jpg->infp);
-            jpg->lSos.SpectralSelEnd=fgetc(jpg->infp);
-            jpg->lSos.SuccessiveAp=fgetc(jpg->infp);
-            jpg->lSos.Sospttrans=(jpg->lSos.SuccessiveAp & 16);
-            HeaderEnd=1;
-         }
-         if (el==0xDD) {
-            l1=fgetc(jpg->infp);
-            l2=fgetc(jpg->infp);
-            jpg->RestartInterval=(l1*256)+l2;
-         }
-
-         fseek(jpg->infp,(ouca+sztag),0);
-      }
-   }
-
-   if (!isLossLess) {
-      printf("NOT isLossLess\n");
-      return 0;
-   }
-   return 1;
-}
-
-static int ClbJpegReadBit(ClbJpeg *jpg) {
-       int r=0;
-       unsigned char c;
-       if(jpg->PosCurBit>8) // need lire octet suivant
-       {
-               jpg->ValCurByte=fgetc(jpg->infp);
-               if (jpg->ValCurByte==0xFF)
-               {
-                       c=fgetc(jpg->infp);// est 00 ou restart marker: a skiper
-                       if (c!=0)
-                       {
-                               jpg->ValCurByte=fgetc(jpg->infp);
-                               jpg->PosCurBit=1;
-                               jpg->MarkerFound=1;
-                               return 0; 
-                       }
-               }
-               jpg->PosCurBit=2;
-               return (jpg->ValCurByte>>7);
-       }
-       else
-       {
-               r=(1&(jpg->ValCurByte>>(8-jpg->PosCurBit)));
-               jpg->PosCurBit+=1;
-               return r;
-       }
-}
-
-
-static BOOL ClbJpegDecodeData(ClbJpeg *jpg)
-{
-       int iX,iY;
-       int lbInc=0;
-       unsigned int mask; 
-        int dimX;
-         
-       int lPredicted=(1<<(jpg->lSof.precision-1-jpg->lSos.Sospttrans));
-        dimX=jpg->lSof.Wimg;
-
-       jpg->ValCurByte=jpg->lSos.SuccessiveAp;
-       jpg->PosCurBit=9;
-       
-       if (jpg->lSof.precision==8)
-               mask=0xFF;
-       if (jpg->lSof.precision==12)
-               mask=0xFFF;
-       if (jpg->lSof.precision==16)
-               mask=0xFFFF;
-
-//printf("jpg->lSof.precision : %d\n",jpg->lSof.precision );
-//printf("sizeof(*jpg->DataImg) : %d\n",sizeof(*jpg->DataImg) );
-
-       jpg->DataImg=(int*)malloc(jpg->lSof.Himg*dimX*sizeof(*jpg->DataImg)*jpg->lSof.NbComponent);    // *3
-       memset( jpg->DataImg,0,(jpg->lSof.Himg * dimX * sizeof(*jpg->DataImg)*jpg->lSof.NbComponent)); // *3
-
-       if (!jpg->RestartInterval)
-       {
-       //printf("il N'y a PAS un define interval\n");
-               for(iX=0;iX<dimX*jpg->lSof.NbComponent;iX++) // lit première ligne // *3
-               {
-                       lbInc+=1;
-                       if (lbInc>1)
-                               lPredicted= jpg->DataImg[lbInc-1];
-                        jpg->DataImg[lbInc]=lPredicted+ClbJpegDecodeDiff(jpg);
-
-                       if (  jpg->DataImg[lbInc] > ((1<<(jpg->lSof.precision))-1) )
-                                jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
-                       if ( jpg->DataImg[lbInc]<0) 
-                                jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
-               }
-
-               for (iY=1;iY<jpg->lSof.Himg;iY++) //lit la suite
-               {
-                       lbInc+=1;
-                       if (lbInc>(jpg->lSof.Himg*dimX*jpg->lSof.NbComponent-1)) break; //*3
-                       lPredicted= jpg->DataImg[lbInc-jpg->lSof.Wimg*jpg->lSof.NbComponent];//*3       // se base % premier é ligne d'avant
-                        jpg->DataImg[lbInc]=lPredicted+ClbJpegDecodeDiff(jpg);
-
-                       if (  jpg->DataImg[lbInc] > ((1<<(jpg->lSof.precision))-1) ) 
-                                jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
-                       if ( jpg->DataImg[lbInc]<0) 
-                                jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
-
-                       for(iX=1;iX<jpg->lSof.Wimg*jpg->lSof.NbComponent;iX++) //*3
-                       {
-                               lbInc+=1;
-                               if (lbInc>(jpg->lSof.Himg*jpg->lSof.Wimg*jpg->lSof.NbComponent-1)) break;//*3
-                               if (jpg->lSos.SpectralSelStart==7) // si spectral
-                                       lPredicted=( jpg->DataImg[lbInc-1]+ jpg->DataImg[lbInc-jpg->lSof.Wimg*jpg->lSof.NbComponent])>>1; //*3
-                               else
-                                       lPredicted= jpg->DataImg[lbInc-1];              // se base%pixel juste avant
-                                jpg->DataImg[lbInc]=lPredicted+ClbJpegDecodeDiff(jpg);
-
-                               if (  jpg->DataImg[lbInc] > ((1<<(jpg->lSof.precision))-1) ) 
-                                        jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
-                               if ( jpg->DataImg[lbInc]<0) 
-                                        jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
-
-                       }
-               }
-       }
-       else // il y a un define interval
-       {
-               //printf("il y a un define interval\n");
-               while(1)
-               {
-                       jpg->MarkerFound=0;
-                       lPredicted=(1<<(jpg->lSof.precision - 1 - jpg->lSos.Sospttrans));
-                       for (iY=0;iY<jpg->RestartInterval;iY++) 
-                       {
-                                jpg->DataImg[lbInc]=lPredicted+ClbJpegDecodeDiff(jpg);
-
-                               if (  jpg->DataImg[lbInc] > ((1<<(jpg->lSof.precision))-1) ) 
-                                        jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
-                               if ( jpg->DataImg[lbInc]<0) 
-                                        jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
-
-                               lbInc+=1;
-                               if (lbInc>(jpg->lSof.Himg*jpg->lSof.Wimg*jpg->lSof.NbComponent-1)) return 1; //*3
-
-                               if (jpg->lSos.SpectralSelStart==7) // si spectral
-                                       lPredicted=( jpg->DataImg[lbInc-1]+ jpg->DataImg[lbInc-jpg->lSof.Wimg*jpg->lSof.NbComponent])>>1; //*3
-                               else
-                                       lPredicted= jpg->DataImg[lbInc-1];
-                       }
-                       while (!jpg->MarkerFound)
-                       {
-                               ClbJpegReadBit(jpg); // skip bits restant avant restart marker
-                       }
-               }
-       }
-       return 1;
-}
-
-static int ClbJpegDecodeDiff(ClbJpeg *jpg) {
-   int lInput;
-   int lInputBits;
-   int lHufVal;
-   int lDiff;
-   int lI;
-   int resultat;
-   lHufVal = 666;
-   lInput = 0;
-   lInputBits = 0;
-
-   while (1) {
-      lInputBits+=1;
-      lInput=(lInput<<1)+ClbJpegReadBit(jpg);
-      if (jpg->RawDHT[lInputBits]!=0) {
-         for(lI=jpg->RawDHTstart[lInputBits];lI<(jpg->RawDHTstart[lInputBits]+jpg->RawDHT[lInputBits]);lI++) {
-            if (lInput==jpg->lHuffTable[lI].HufCode)
-               lHufVal=jpg->lHuffTable[lI].HufVal;
-         }
-      }
-      if (lInputBits>=jpg->MaxHuffSz)
-         lHufVal=jpg->MaxHuffVal;
-      if (lHufVal<255) break;
-   }
-   if (lHufVal==0) resultat= 0;
-
-   if ( (lHufVal>0) && (lHufVal<16)) {
-      lDiff=0;
-      if( ClbJpegReadBit(jpg)==1) {
-         for (lI=1;lI<lHufVal;lI++) {
-            lDiff=(lDiff<<1)+ClbJpegReadBit(jpg);
-         }
-         resultat= (lDiff+(1<<(lHufVal-1)));
-      } else {
-         for (lI=1;lI<lHufVal;lI++)
-            lDiff=(lDiff<<1)+1-ClbJpegReadBit(jpg);
-         resultat= -(lDiff+(1<<(lHufVal-1)));
-      }
-   }
-   return resultat;    
-}
index 16598ac237e23917b6b81694c765daf1bb1eda96..5a54e8b49535c4588cbae764a9ca03d1bc270af8 100644 (file)
@@ -14,7 +14,6 @@
 
 #include "gdcmFile.h"
 #include "gdcmUtil.h"
-#include "iddcmjpeg.h" // for the 'LibIDO' Jpeg LossLess
 
 #define str2num(str, typeNum) *((typeNum *)(str))
 
diff --git a/src/iddcmjpeg.h b/src/iddcmjpeg.h
deleted file mode 100644 (file)
index d41cacf..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-#include <stdio.h>  // for FILE
-#include <string>
-
-#define BOOL int
-
-typedef struct {
-       int HufSz;
-       int HufCode;
-       int HufVal;
-} HuffTable;
-
-
-typedef struct {
-       unsigned char precision;
-       int Himg;
-       int Wimg;
-       unsigned char NbComponent;
-       long SofTabPos;
-} Sof;
-
-
-typedef struct {
-       unsigned char CompCount;
-       unsigned char CompId;
-       unsigned char CompDc;
-       unsigned char SpectralSelStart;
-       unsigned char SpectralSelEnd;
-       unsigned char SuccessiveAp;
-       unsigned char Sospttrans;
-       long SofTabPos;
-} Sos;
-
-
-typedef struct  {
-       unsigned long RestartInterval;
-       BOOL MarkerFound;
-       int MaxHuffVal;
-       int MaxHuffSz;
-       int* DataImg;
-       unsigned char RawDHT[256];
-       unsigned char ValCurByte;
-       unsigned char PosCurBit;
-       FILE* infp;
-       unsigned char RawDHTstart[256];
-       Sof lSof;
-       Sos lSos;
-       HuffTable lHuffTable[256];      
-} ClbJpeg;
-
-
-ClbJpeg*_IdDcmJpegRead (FILE *);
-void   _IdDcmJpegFree (ClbJpeg *);
-
-
-//
-       
-       
-
-
-