  
  [1X5. Technicalities of the [5XAtlasRep[0X[1X Package[0X
  
  This  chapter  describes  those  parts  of the [5XGAP[0X interface to the [5XATLAS[0X of
  Group   Representations   that   do   not   belong  to  the  user  interface
  (cf. Chapter [14X2.[0X).
  
  Besides   global   variables   used   for   administrational  purposes  (see
  Section [14X5.1[0X)  and  several  sanity  checks  (see  Section [14X5.8[0X),  they can be
  regarded  as  the interface between the data actually contained in the files
  and  the corresponding [5XGAP[0X objects (see Section [14X5.2[0X, [14X5.3[0X, [14X5.4[0X, and [14X5.5[0X), and
  the  interface between the remote and the local version of the database (see
  Section [14X5.6[0X  and [14X5.7[0X).  The  former interface contains functions to read and
  write  files  in [5XMeatAxe[0X format, which may be interesting for users familiar
  with   [5XMeatAxe[0X  standalones  (see  for  example [Rin98]).  Other  low  level
  functions  may  be  undocumented in the sense that they are not described in
  this  manual. Users interested in them may look at the actual implementation
  in  the  [11Xgap[0X  directory  of the package, but it may happen that this will be
  changed in future versions of the package.
  
  
  [1X5.1 Global Variables Used by the [5XAtlasRep[0X[1X Package[0X
  
  For debugging purposes, the functions from the [5XGAP[0X interface to the [5XATLAS[0X of
  Group  Representations  print information depending on the info level of the
  info  classes  [2XInfoAtlasRep[0X  ([14X5.1-1[0X),  [2XInfoCMeatAxe[0X  ([14X5.1-2[0X),  and  [2XInfoBBox[0X
  ([14X5.1-3[0X) (cf. [14X'Reference: Info Functions'[0X).
  
  The  info  level  of  an  info  class  can  be  changed  using  [2XSetInfoLevel[0X
  ([14XReference:  SetInfoLevel[0X).  For  example,  the  info  level of [2XInfoAtlasRep[0X
  ([14X5.1-1[0X)  can  be  set  to  the  nonnegative  integer  [3Xn[0X  using [10XSetInfoLevel(
  InfoAtlasRep, [3Xn[0X )[0X.
  
  Information  about  files being read can be obtained by setting the value of
  the global variable [10XInfoRead1[0X to [2XPrint[0X ([14XReference: Print[0X).
  
  [1X5.1-1 InfoAtlasRep[0X
  
  [2X> InfoAtlasRep____________________________________________________[0Xinfo class
  
  If  the info level of [2XInfoAtlasRep[0X is at least 1 then information about [9Xfail[0X
  results  of  functions in the [5XAtlasRep[0X package is printed. If the info level
  is  at least 2 then information about calls to external programs is printed.
  The default level is 0, no information is printed on this level.
  
  [1X5.1-2 InfoCMeatAxe[0X
  
  [2X> InfoCMeatAxe____________________________________________________[0Xinfo class
  
  If  the info level of [2XInfoCMeatAxe[0X is at least 1 then information about [9Xfail[0X
  results  of  [10XC[0X-[5XMeatAxe[0X  functions  is printed. The default level is zero, no
  information is printed on this level.
  
  [1X5.1-3 InfoBBox[0X
  
  [2X> InfoBBox________________________________________________________[0Xinfo class
  
  If  the  info  level  of  [2XInfoBBox[0X is at least 1 then information about [9Xfail[0X
  results  of  functions  dealing with black box programs (see Section [14X4.2[0X) is
  printed. The default level is 0, no information is printed on this level.
  
  [1X5.1-4 CMeatAxe.FastRead[0X
  
  [2X> CMeatAxe.FastRead__________________________________________[0Xglobal variable
  
  If  this  component  is  bound  and  has the value [9Xtrue[0X then [2XScanMeatAxeFile[0X
  ([14X5.3-1[0X) reads text files via [2XStringFile[0X ([14XGAPDoc: StringFile[0X). Otherwise each
  file  containing  a  matrix  over  a  finite  field is read line by line via
  [2XReadLine[0X  ([14XReference:  ReadLine[0X),  and the [5XGAP[0X matrix is constructed line by
  line,  in  a  compressed  representation  (see [14X'Reference:  Row Vectors over
  Finite Fields'[0X and [14X'Reference: Matrices over Finite Fields'[0X), which makes it
  possible  to  read  large  matrices  in  a  reasonable  amount of space. The
  [2XStringFile[0X   ([14XGAPDoc:   StringFile[0X)   approach  is  faster  but  needs  more
  intermediate  space  when  text files containing matrices over finite fields
  are read.
  
  [1X5.1-5 AtlasOfGroupRepresentationsInfo[0X
  
  [2X> AtlasOfGroupRepresentationsInfo____________________________[0Xglobal variable
  
  This  is  a  record  that is defined in the file [11Xgap/types.g[0X of the package,
  with the following components.
  
  Components corresponding to [13Xuser parameters[0X (see Section [14X1.7[0X) are
  
  [8X[10Xremote[0X[0X
        a boolean that controls what files are available; if the value is [9Xtrue[0X
        then  [5XGAP[0X is allowed to try remotely accessing any [5XATLAS[0X file from the
        servers  (see  below) and thus all files listed in the global table of
        contents are available, if the value is [9Xfalse[0X then [5XGAP[0X may access only
        those  files  that are stored in the database directories of the local
        [5XGAP[0X installation (see Section [14X1.7-1[0X),
  
  [8X[10Xservers[0X[0X
        a  list  of  pairs [10X[ [0X[3Xserver[0X[10X, [0X[3Xpath[0X[10X ][0X, where [3Xserver[0X is a string denoting
        the  [11Xhttp[0X  address of a server where files can be fetched that are not
        stored in the local database, and [3Xpath[0X is a string describing the path
        where the data directories on the server reside,
  
  [8X[10Xwget[0X[0X
        a  boolean  that  controls  whether  the  [5XGAP[0X package [5XIO[0X[Neu07] or the
        external program [11Xwget[0X is used to fetch data files, see [14X1.7-3[0X,
  
  [8X[10Xcompress[0X[0X
        a  boolean  that controls whether [5XMeatAxe[0X format text files are stored
        in  compressed  form;  if  the  value  is  [9Xtrue[0X  then  these files are
        compressed  with  [11Xgzip[0X after they have been fetched from a server, see
        Section [14X1.7-4[0X,
  
  [8X[10XdisplayFunction[0X[0X
        the function that is used by [2XDisplayAtlasInfo[0X ([14X2.5-1[0X) for printing the
        formatted data, see Section [14X1.7-5[0X,
  
  [8X[10XaccessFunctions[0X[0X
        a  list  of records, each describing how to access the data files, see
        Sections [14X1.7-6[0X and [14X5.2[0X.
  
  [8X[10Xmarkprivate[0X[0X
        a  string  used  in [2XDisplayAtlasInfo[0X ([14X2.5-1[0X) to mark private data, see
        Section  [14X3.2[0X, and
  
  [13XSystem components[0X (which are computed automatically) are
  
  [8X[10XGAPnames[0X[0X
        a  list of pairs, each containing the [5XGAP[0X name and the [5XATLAS[0X-file name
        of a group, see Section [14X2.2[0X,
  
  [8X[10Xgroupnames[0X[0X
        a  list  of triples, each containing at the first position the name of
        the  directory  on each server that contains data about the group G in
        question,  at  the  second  position  the name of the (usually simple)
        group  for which a subdirectory exists that contains the data about G,
        and  at  the  third  position  the  [5XATLAS[0X-file  name  used  for G, see
        Section [14X5.6[0X,
  
  [8X[10Xringinfo[0X[0X
        a list of triples, each containing at the first position the name of a
        file  with  the  matrix  generators,  at  the second position a string
        describing  the ring generated by the matrix entries, and at the third
        position  this  ring  itself;  [2XDisplayAtlasInfo[0X  ([14X2.5-1[0X) displays this
        information  for example for representations over proper extensions of
        the  rational  number field only if the representation is mentioned in
        the [10Xringinfo[0X list,
  
  [8X[10Xprivate[0X[0X
        a  list  of pairs of strings used for administrating private data (see
        Chapter [14X3.[0X);        the        value        is        changed       by
        [2XAtlasOfGroupRepresentationsNotifyPrivateDirectory[0X      ([14X3.1-1[0X)     and
        [2XAtlasOfGroupRepresentationsForgetPrivateDirectory[0X ([14X3.1-2[0X),
  
  [8X[10XTableOfContents[0X[0X
        a  record  with  at  most the components [10Xlocal[0X, [10Xremote[0X, [10Xtypes[0X, and the
        names  of private data directories. The values of the components [10Xlocal[0X
        and [10Xremote[0X can be computed automatically by [2XReloadAtlasTableOfContents[0X
        ([14X1.6-1[0X), the value of the component [10Xtypes[0X is set in [2XAGRDeclareDataType[0X
        ([14X5.5-1[0X),  and  the values of the components for local data directories
        are   created   by   [2XAtlasOfGroupRepresentationsNotifyPrivateDirectory[0X
        ([14X3.1-1[0X).
  
  
  [1X5.2 How to Customize the Access to Data files[0X
  
  We discuss the three steps listed in Section [14X1.7-6[0X.
  
  For  creating  an overview of the locally available data, the first of these
  steps  must  be  available  independent  of  actually  accessing the file in
  question.  For updating the local copy of the server data, the second of the
  above  steps  must be available independent of the third one. Therefore, the
  package  provides  the possibility to extend the default behaviour by adding
  new      records      to      the      [10XaccessFunctions[0X      component     of
  [2XAtlasOfGroupRepresentationsInfo[0X  ([14X5.1-5[0X),  the  components  of  which are as
  follows.
  
  [8X
  [10Xlocation( [3Xfilename[0X, [3Xgroupname[0X, [3Xdirname[0X,
               [3Xtype[0X )[0X
  [0X
        Let  [3Xfilename[0X  be  the default filename (without path) of the required
        file,  or a list of such filenames. Let [3Xgroupname[0X be the [5XATLAS[0X name of
        the  group  to  which  the  data in these files belong, [3Xdirname[0X be the
        default  directory  name  (one of [10X"datagens"[0X, [10X"dataword"[0X, or the [3Xdirid[0X
        value         of         a        private        directory,        see
        [2XAtlasOfGroupRepresentationsNotifyPrivateDirectory[0X  ([14X3.1-1[0X)),  and [3Xtype[0X
        be  the data type (see [2XAGRDeclareDataType[0X ([14X5.5-1[0X)). This function must
        return  either the absolute path(s) where the mechanism implemented by
        the  current record expects the local version of the given file(s), or
        [9Xfail[0X  if this function does not feel responsible for these file(s). In
        the  latter  case, the [10Xlocation[0X function in another record will know a
        path.
  
        The  file(s) is/are regarded as not locally available if all installed
        [10Xlocation[0X  functions  return either [9Xfail[0X or paths of nonexisting files,
        in the sense of [2XIsExistingFile[0X ([14XReference: IsExistingFile[0X).
  
  [8X
  [10Xfetch( [3Xfilepath[0X, [3Xfilename[0X, [3Xgroupname[0X,
            [3Xdirname[0X, [3Xtype[0X )[0X
  [0X
        This  function  is  called when a file is not locally available and if
        the  [10Xlocation[0X  function in the current record has returned a path or a
        list  of paths. The arguments [3Xdirname[0X and [3Xtype[0X must be the same as for
        the  [10Xlocation[0X function, and [3Xfilepath[0X and [3Xfilename[0X must be strings ([13Xnot[0X
        lists of strings).
  
        The  return  value  must be [9Xtrue[0X if the function succeeded with making
        the  file  locally available (including postprocessing if applicable),
        and [9Xfalse[0X otherwise.
  
  [8X[10Xcontents( [3Xfilepath[0X, [3Xtype[0X )[0X[0X
        This  function  is  called  when  the [10Xlocation[0X function in the current
        record  has  returned  the  path(s)  [3Xfilepath[0X, and if either these are
        paths  of  existing  files or the [10Xfetch[0X function in the current record
        has  been  called  for these paths, and the return value was [9Xtrue[0X. The
        argument  [3Xtype[0X  must  be  the  same  as for the [10Xlocation[0X and the [10Xfetch[0X
        functions.
  
        The  return  value  must  be the contents of the file(s), in the sense
        that  the  [5XGAP[0X  matrix, matrix list, permutation, permutation list, or
        program  described by the file(s) is returned. This means that besides
        reading  the file(s) via the appropriate function, it may be necessary
        to interpret the contents.
  
  [8X[10Xdescription[0X[0X
        This  must  be  a short string that describes for which kinds of files
        the  functions  in the current record are intended, which file formats
        are     supported     etc.     The     value     is     shown     when
        [2XAtlasOfGroupRepresentationsShowUserParameters[0X ([14X1.7-8[0X) is called.
  
  [8X[10Xactive[0X[0X
        The  current  [10XaccessFunctions[0X  record  is  ignored  by [2XAGRFileContents[0X
        ([14X5.6-2[0X) if the value is not [9Xtrue[0X.
  
  In  [2XAGRFileContents[0X ([14X5.6-2[0X), the records in the [10XaccessFunctions[0X component of
  [2XAtlasOfGroupRepresentationsInfo[0X ([14X5.1-5[0X) are considered in reversed order.
  
  By default, the [10XaccessFunctions[0X list contains three records. Only for one of
  them,  the [10Xactive[0X component has the value [9Xtrue[0X. One of the other two records
  can  be  used  to  change  the  access to permutation representations and to
  matrix representations over finite fields such that [5XMeatAxe[0X binary files are
  transferred  and read instead of [5XMeatAxe[0X text files. The fourth record makes
  sense  only  if a local server is accessible, i. e., if the server files can
  be read directly, without being transferred into the data directories of the
  package.
  
  
  [1X5.3 Reading and Writing MeatAxe Format Files[0X
  
  [1X5.3-1 ScanMeatAxeFile[0X
  
  [2X> ScanMeatAxeFile( [0X[3Xfilename[, q][, "string"][0X[2X ) _____________________[0Xfunction
  [6XReturns:[0X  the  matrix  or list of permutations stored in the file or encoded
            by the string.
  
  Let  [3Xfilename[0X be the name of a [5XGAP[0X readable file (see [14X'Reference: Filename'[0X)
  that contains a matrix or a permutation or a list of permutations in [5XMeatAxe[0X
  text  format  (see  the  section  about  the  program  [11Xzcv[0X  in  the  [5XMeatAxe[0X
  manual [Rin98]),  and  let  [3Xq[0X  be a prime power. [2XScanMeatAxeFile[0X returns the
  corresponding [5XGAP[0X matrix or list of permutations, respectively.
  
  If the file contains a matrix then the way how it is read by [2XScanMeatAxeFile[0X
  depends  on  the  value of the global variable [2XCMeatAxe.FastRead[0X ([14X5.1-4[0X). If
  the  parameter  [3Xq[0X  is  given  then the result matrix is represented over the
  field  with  [3Xq[0X  elements,  the default for [3Xq[0X is the field size stored in the
  file.
  
  If  the file contains a list of permutations then it is read with [2XStringFile[0X
  ([14XGAPDoc: StringFile[0X); the parameter [3Xq[0X, if given, is ignored in this case.
  
  If  the  string  [10X"string"[0X  is  entered  as the third argument then the first
  argument  must  be  a  string  as obtained by reading a file in [5XMeatAxe[0X text
  format as a text stream (see [2XInputTextFile[0X ([14XReference: InputTextFile[0X)). Also
  in  this  case, [2XScanMeatAxeFile[0X returns the corresponding [5XGAP[0X matrix or list
  of permutations, respectively.
  
  [1X5.3-2 MeatAxeString[0X
  
  [2X> MeatAxeString( [0X[3Xmat, q[0X[2X ) _________________________________________[0Xoperation
  [2X> MeatAxeString( [0X[3Xperms, degree[0X[2X ) __________________________________[0Xoperation
  [2X> MeatAxeString( [0X[3Xperm, q, dims[0X[2X ) __________________________________[0Xoperation
  [6XReturns:[0X  a  string  encoding  the  [5XGAP[0X  objects  given  as input in [5XMeatAxe[0X
            format.
  
  In  the  first  form, for a matrix [3Xmat[0X whose entries lie in the finite field
  with [3Xq[0X elements, [2XMeatAxeString[0X returns a string that encodes [3Xmat[0X as a matrix
  over [10XGF([3Xq[0X)[0X, in [5XMeatAxe[0X text format.
  
  In the second form, for a nonempty list [3Xperms[0X of permutations that move only
  points  up  to  the  positive integer [3Xdegree[0X, [2XMeatAxeString[0X returns a string
  that  encodes [3Xperms[0X as permutations of degree [3Xdegree[0X, in [5XMeatAxe[0X text format
  (see [Rin98]).
  
  In the third form, for a permutation [3Xperm[0X with largest moved point n, say, a
  prime  power [3Xq[0X, and a list [3Xdims[0X of length 2 containing two positive integers
  larger  than or equal to n, [2XMeatAxeString[0X returns a string that encodes [3Xperm[0X
  as  a  matrix over [10XGF([3Xq[0X)[0X, of dimensions [3Xdims[0X, whose first n rows and columns
  describe  the  permutation  matrix  corresponding to [3Xperm[0X, and the remaining
  rows and columns are zero.
  
  When  strings  are  printed  to  files using [2XPrintTo[0X ([14XReference: PrintTo[0X) or
  [2XAppendTo[0X  ([14XReference: AppendTo[0X) then line breaks are inserted whenever lines
  exceed  the  number  of  characters  given  by  the second entry of the list
  returned  by  [2XSizeScreen[0X ([14XReference: SizeScreen[0X), see [14X'Reference: Operations
  for  Output  Streams'[0X.  This  behaviour  is  not desirable for creating data
  files. So the recommended functions for printing the result of [2XMeatAxeString[0X
  to  a  file  are  [2XFileString[0X  ([14XGAPDoc:  FileString[0X) and [2XWriteAll[0X ([14XReference:
  WriteAll[0X).
  
  [4X---------------------------  Example  ----------------------------[0X
    [4Xgap> mat:= [ [ 1, -1 ], [ 0, 1 ] ] * Z(3)^0;;[0X
    [4Xgap> str:= MeatAxeString( mat, 3 );[0X
    [4X"1 3 2 2\n12\n01\n"[0X
    [4Xgap> mat = ScanMeatAxeFile( str, "string" );[0X
    [4Xtrue[0X
    [4Xgap> str:= MeatAxeString( mat, 9 );[0X
    [4X"1 9 2 2\n12\n01\n"[0X
    [4Xgap> mat = ScanMeatAxeFile( str, "string" );[0X
    [4Xtrue[0X
    [4Xgap> perms:= [ (1,2,3)(5,6) ];;[0X
    [4Xgap> str:= MeatAxeString( perms, 6 );[0X
    [4X"12 1 6 1\n2\n3\n1\n4\n6\n5\n"[0X
    [4Xgap> perms = ScanMeatAxeFile( str, "string" );[0X
    [4Xtrue[0X
    [4Xgap> str:= MeatAxeString( perms, 8 );[0X
    [4X"12 1 8 1\n2\n3\n1\n4\n6\n5\n7\n8\n"[0X
    [4Xgap> perms = ScanMeatAxeFile( str, "string" );[0X
    [4Xtrue[0X
    [4Xgap> perm:= (1,2,4);;[0X
    [4Xgap> str:= MeatAxeString( perm, 3, [ 5, 6 ] );[0X
    [4X"2 3 5 6\n2\n4\n3\n1\n5\n"[0X
    [4Xgap> mat:= ScanMeatAxeFile( str, "string" );;  Print( mat, "\n" );[0X
    [4X[ [ 0*Z(3), Z(3)^0, 0*Z(3), 0*Z(3), 0*Z(3), 0*Z(3) ], [0X
    [4X  [ 0*Z(3), 0*Z(3), 0*Z(3), Z(3)^0, 0*Z(3), 0*Z(3) ], [0X
    [4X  [ 0*Z(3), 0*Z(3), Z(3)^0, 0*Z(3), 0*Z(3), 0*Z(3) ], [0X
    [4X  [ Z(3)^0, 0*Z(3), 0*Z(3), 0*Z(3), 0*Z(3), 0*Z(3) ], [0X
    [4X  [ 0*Z(3), 0*Z(3), 0*Z(3), 0*Z(3), Z(3)^0, 0*Z(3) ] ][0X
    [4Xgap> MeatAxeString( mat, 3 ) = str;[0X
    [4Xtrue[0X
  [4X------------------------------------------------------------------[0X
  
  [1X5.3-3 FFList[0X
  
  [2X> FFList( [0X[3XF[0X[2X ) ______________________________________________________[0Xfunction
  [6XReturns:[0X  a list of elements in the given finite field.
  
  [2X> FFLists____________________________________________________[0Xglobal variable
  
  [2XFFList[0X  is a utility program for the conversion of vectors and matrices from
  [5XMeatAxe[0X  format  to [5XGAP[0X format and vice versa. It is used by [2XScanMeatAxeFile[0X
  ([14X5.3-1[0X) and [2XMeatAxeString[0X ([14X5.3-2[0X).
  
  For  a  finite  field  [3XF[0X,  [2XFFList[0X returns a list [3Xl[0X giving the correspondence
  between the [5XMeatAxe[0X numbering and the [5XGAP[0X numbering of the elements in [3XF[0X.
  
  The  element  of  [3XF[0X  corresponding  to [5XMeatAxe[0X number [3Xn[0X is [3Xl[0X[ [3Xn[0X+1 ], and the
  [5XMeatAxe[0X number of the field element [3Xz[0X is [10XPosition( [0X[3Xl[0X[10X, [0X[3Xz[0X[10X ) - 1[0X.
  
  The global variable [2XFFLists[0X is used to store the information about [3XF[0X once it
  has been computed.
  
  [4X---------------------------  Example  ----------------------------[0X
    [4Xgap> FFList( GF(4) );[0X
    [4X[ 0*Z(2), Z(2)^0, Z(2^2), Z(2^2)^2 ][0X
    [4Xgap> IsBound( FFLists[4] );[0X
    [4Xtrue[0X
  [4X------------------------------------------------------------------[0X
  
  [1X5.3-4 CMtxBinaryFFMatOrPerm[0X
  
  [2X> CMtxBinaryFFMatOrPerm( [0X[3Xelm, def, outfile[0X[2X ) _______________________[0Xfunction
  
  Let  the  pair  ([3Xelm[0X,  [3Xdef[0X) be either of the form (M, q) where M is a matrix
  over  a  finite field F, say, with q <= 256 elements, or of the form (pi, n)
  where pi is a permutation with largest moved point at most n. Let [3Xoutfile[0X be
  a  string.  [2XCMtxBinaryFFMatOrPerm[0X  writes  the [10XC[0X-[5XMeatAxe[0X binary format of M,
  viewed  as  a matrix over F, or of pi, viewed as a permutation on the points
  up to n, to the file with name [3Xoutfile[0X.
  
  (The binary format is described in the [10XC[0X-[5XMeatAxe[0X manual [Rin98].)
  
  [4X---------------------------  Example  ----------------------------[0X
    [4Xgap> tmpdir:= DirectoryTemporary();;[0X
    [4Xgap> mat:= Filename( tmpdir, "mat" );;[0X
    [4Xgap> q:= 4;;[0X
    [4Xgap> mats:= GeneratorsOfGroup( GL(10,q) );;[0X
    [4Xgap> CMtxBinaryFFMatOrPerm( mats[1], q, Concatenation( mat, "1" ) );[0X
    [4Xgap> CMtxBinaryFFMatOrPerm( mats[2], q, Concatenation( mat, "2" ) );[0X
    [4Xgap> prm:= Filename( tmpdir, "prm" );;[0X
    [4Xgap> n:= 200;;[0X
    [4Xgap> perms:= GeneratorsOfGroup( SymmetricGroup( n ) );;[0X
    [4Xgap> CMtxBinaryFFMatOrPerm( perms[1], n, Concatenation( prm, "1" ) );[0X
    [4Xgap> CMtxBinaryFFMatOrPerm( perms[2], n, Concatenation( prm, "2" ) );[0X
  [4X------------------------------------------------------------------[0X
  
  [1X5.3-5 FFMatOrPermCMtxBinary[0X
  
  [2X> FFMatOrPermCMtxBinary( [0X[3Xfname[0X[2X ) ___________________________________[0Xfunction
  [6XReturns:[0X  the matrix or permutation stored in the file.
  
  Let [3Xfname[0X be the name of a file that contains the [10XC[0X-[5XMeatAxe[0X binary format of
  a  matrix  over  a  finite  field  or  of  a  permutation,  as  is described
  in [Rin98].  [2XFFMatOrPermCMtxBinary[0X  returns  the corresponding [5XGAP[0X matrix or
  permutation.
  
  [4X---------------------------  Example  ----------------------------[0X
    [4Xgap> FFMatOrPermCMtxBinary( Concatenation( mat, "1" ) ) = mats[1];[0X
    [4Xtrue[0X
    [4Xgap> FFMatOrPermCMtxBinary( Concatenation( mat, "2" ) ) = mats[2];[0X
    [4Xtrue[0X
    [4Xgap> FFMatOrPermCMtxBinary( Concatenation( prm, "1" ) ) = perms[1];[0X
    [4Xtrue[0X
    [4Xgap> FFMatOrPermCMtxBinary( Concatenation( prm, "2" ) ) = perms[2];[0X
    [4Xtrue[0X
  [4X------------------------------------------------------------------[0X
  
  
  [1X5.4 Reading and Writing [5XATLAS[0X[1X Straight Line Programs[0X
  
  [1X5.4-1 ScanStraightLineProgram[0X
  
  [2X> ScanStraightLineProgram( [0X[3Xfilename[, "string"][0X[2X ) __________________[0Xfunction
  [6XReturns:[0X  a record containing the straight line program.
  
  Let  [3Xfilename[0X be the name of a file that contains a straight line program in
  the sense that it consists only of lines in the following form.
  
  [8X[10X#[3Xanything[0X[0X[0X
        lines starting with a hash sign [10X#[0X are ignored,
  
  [8X[10Xecho [3Xanything[0X[0X[0X
        lines  starting with [10Xecho[0X are ignored for the [10Xprogram[0X component of the
        result  record  (see  below),  they  are  used to set up the bijection
        between  the  labels  used in the program and conjugacy class names in
        the case that the program computes dedicated class representatives,
  
  [8X[10Xinp [3Xn[0X[0X[0X
        means  that  there are [3Xn[0X inputs, referred to via the labels [10X1[0X, [10X2[0X, ...,
        [3Xn[0X,
  
  [8X[10Xinp [3Xk[0X [3Xa1[0X [3Xa2[0X ... [3Xak[0X[0X[0X
        means  that  the  next [3Xk[0X inputs are referred to via the labels [3Xa1[0X, [3Xa2[0X,
        ..., [3Xak[0X,
  
  [8X[10Xcjr [3Xa[0X [3Xb[0X[0X[0X
        means that [3Xa[0X is replaced by [10X[3Xb[0X^(-1) * [3Xa[0X * [3Xb[0X[0X,
  
  [8X[10Xcj [3Xa[0X [3Xb[0X [3Xc[0X[0X[0X
        means that [3Xc[0X is defined as [10X[3Xb[0X^(-1) * [3Xa[0X * [3Xb[0X[0X,
  
  [8X[10Xcom [3Xa[0X [3Xb[0X [3Xc[0X[0X[0X
        means that [3Xc[0X is defined as [10X[3Xa[0X^(-1) * [3Xb[0X^(-1) * [3Xa[0X * [3Xb[0X[0X,
  
  [8X[10Xiv [3Xa[0X [3Xb[0X[0X[0X
        means that [3Xb[0X is defined as [10X[3Xa[0X^(-1)[0X,
  
  [8X[10Xmu [3Xa[0X [3Xb[0X [3Xc[0X[0X[0X
        means that [3Xc[0X is defined as [10X[3Xa[0X * [3Xb[0X[0X,
  
  [8X[10Xpwr [3Xa[0X [3Xb[0X [3Xc[0X[0X[0X
        means that [3Xc[0X is defined as [10X[3Xb[0X^[3Xa[0X[0X,
  
  [8X[10Xcp [3Xa[0X [3Xb[0X[0X[0X
        means that [3Xb[0X is defined as a copy of [3Xa[0X,
  
  [8X[10Xoup [3Xl[0X[0X[0X
        means that there are [3Xl[0X outputs, stored in the labels [10X1[0X, [10X2[0X, ..., [3Xl[0X, and
  
  [8X[10Xoup [3Xl[0X [3Xb1[0X [3Xb2[0X ... [3Xbl[0X[0X[0X
        means that the next [3Xl[0X outputs are stored in the labels [3Xb1[0X, [3Xb2[0X, ... [3Xbl[0X.
  
  Each  of  the  labels  [3Xa[0X,  [3Xb[0X,  [3Xc[0X  can be any nonempty sequence of digits and
  alphabet  characters,  except  that the first argument of [10Xpwr[0X must denote an
  integer.
  
  If  the  [10Xinp[0X  or  [10Xoup[0X  statements  are  missing  then  the  input or output,
  respectively,  is  assumed  to  be given by the labels [10X1[0X and [10X2[0X. There can be
  multiple [10Xinp[0X lines at the beginning of the program and multiple [10Xoup[0X lines at
  the end of the program. Only the first [10Xinp[0X or [10Xoup[0X line may omit the names of
  the  elements. For example, an empty file [3Xfilename[0X or an empty string [3Xstring[0X
  represent  a  straight  line  program  with  two inputs that are returned as
  outputs.
  
  No  command except [10Xcjr[0X may overwrite its own input. For example, the line [10Xmu
  a b a[0X is not legal. (This is not checked.)
  
  [2XScanStraightLineProgram[0X  returns  a  record  containing  as the value of its
  component    [10Xprogram[0X   the   corresponding   [5XGAP[0X   straight   line   program
  (see [2XIsStraightLineProgram[0X  ([14XReference: IsStraightLineProgram[0X)) if the input
  string  satisfies the syntax rules stated above, and returns [9Xfail[0X otherwise.
  In  the  latter  case,  information  about  the  first corrupted line of the
  program is printed if the info level of [2XInfoCMeatAxe[0X ([14X5.1-2[0X) is at least 1.
  
  If  the  string  [10X"string"[0X  is  entered as the second argument then the first
  argument  must  be  a  string  as obtained by reading a file in [5XMeatAxe[0X text
  format as a text stream (see [2XInputTextFile[0X ([14XReference: InputTextFile[0X)). Also
  in  this  case,  [2XScanStraightLineProgram[0X  returns  either  a record with the
  corresponding [5XGAP[0X straight line program or [9Xfail[0X.
  
  If  the  input describes a straight line program that computes certain class
  representatives  of  the  group  in  question  then  the  result record also
  contains the component [10Xoutputs[0X. Its value is a list of strings, the entry at
  position  i  denoting  the  name  of  the class in which the i output of the
  straight  line program lies; see Section [14X2.4[0X for the definition of the class
  names that occur.
  
  Such   straight   line   programs   must  end  with  a  sequence  of  output
  specifications of the following form.
  
  [4X-----------------------------  Log  ------------------------------[0X
    [4Xecho "Classes 1A 2A 3A 5A 5B"[0X
    [4Xoup 5 3 1 2 4 5[0X
  [4X------------------------------------------------------------------[0X
  
  This example means that the list of outputs of the program contains elements
  of  the  classes [10X1A[0X, [10X2A[0X, [10X3A[0X, [10X5A[0X, and [10X5B[0X (in this order), and that inside the
  program, these elements are referred to by the names [10X3[0X, [10X1[0X, [10X2[0X, [10X4[0X, and [10X5[0X.
  
  [1X5.4-2 AtlasStringOfProgram[0X
  
  [2X> AtlasStringOfProgram( [0X[3Xprog[, outputnames][0X[2X ) ______________________[0Xfunction
  [2X> AtlasStringOfProgram( [0X[3Xprog[, "mtx"][0X[2X ) ____________________________[0Xfunction
  [6XReturns:[0X  a string encoding the straight line program/decision in the format
            used in [5XATLAS[0X files.
  
  For   a   straight   line   program   or   straight   line   decision   [3Xprog[0X
  (see [2XIsStraightLineProgram[0X     ([14XReference:     IsStraightLineProgram[0X)    and
  [2XIsStraightLineDecision[0X  ([14X4.1-1[0X)),  this function returns a string describing
  the  input  format  of  an equivalent straight line program or straight line
  decision  as  used in the [5XATLAS[0X of Group Representations, that is, the lines
  are of the form described in [2XScanStraightLineProgram[0X ([14X5.4-1[0X).
  
  A  list of strings that is given as the optional second argument [3Xoutputnames[0X
  is  interpreted  as  the  class  names  corresponding  to  the outputs; this
  argument  has  the  effect  that  appropriate  [10Xecho[0X statements appear in the
  result string.
  
  If  the string [10X"mtx"[0X is given as the second argument then the result has the
  format  used in the [10XC[0X-[5XMeatAxe[0X (see [Rin98]) rather than the format described
  in  Section [14X5.4[0X.  (Note that the [10XC[0X-[5XMeatAxe[0X format does not make sense if the
  argument [3Xoutputnames[0X is given, and that this format does not support [10Xinp[0X and
  [10Xoup[0X statements.)
  
  The  argument  [3Xprog[0X  must  not  be  a  black  box program (see [2XIsBBoxProgram[0X
  ([14X4.2-1[0X)).
  
  [4X---------------------------  Example  ----------------------------[0X
    [4Xgap> str:= "inp 2\nmu 1 2 3\nmu 3 1 2\niv 2 1\noup 2 1 2";;[0X
    [4Xgap> prg:= ScanStraightLineProgram( str, "string" );[0X
    [4Xrec( program := <straight line program> )[0X
    [4Xgap> prg:= prg.program;;[0X
    [4Xgap> Display( prg );[0X
    [4X# input:[0X
    [4Xr:= [ g1, g2 ];[0X
    [4X# program:[0X
    [4Xr[3]:= r[1]*r[2];[0X
    [4Xr[2]:= r[3]*r[1];[0X
    [4Xr[1]:= r[2]^-1;[0X
    [4X# return values:[0X
    [4X[ r[1], r[2] ][0X
    [4Xgap> StringOfResultOfStraightLineProgram( prg, [ "a", "b" ] );[0X
    [4X"[ (aba)^-1, aba ]"[0X
    [4Xgap> AtlasStringOfProgram( prg );[0X
    [4X"inp 2\nmu 1 2 3\nmu 3 1 2\niv 2 1\noup 2\n"[0X
    [4Xgap> prg:= StraightLineProgram( "(a^2b^3)^-1", [ "a", "b" ] );[0X
    [4X<straight line program>[0X
    [4Xgap> Print( AtlasStringOfProgram( prg ) );[0X
    [4Xinp 2[0X
    [4Xpwr 2 1 4[0X
    [4Xpwr 3 2 5[0X
    [4Xmu 4 5 3[0X
    [4Xiv 3 4[0X
    [4Xoup 1 4[0X
    [4Xgap> prg:= StraightLineProgram( [ [2,3], [ [3,1,1,4], [1,2,3,1] ] ], 2 );[0X
    [4X<straight line program>[0X
    [4Xgap> Print( AtlasStringOfProgram( prg ) );[0X
    [4Xinp 2[0X
    [4Xpwr 3 2 3[0X
    [4Xpwr 4 1 5[0X
    [4Xmu 3 5 4[0X
    [4Xpwr 2 1 6[0X
    [4Xmu 6 3 5[0X
    [4Xoup 2 4 5[0X
    [4Xgap> Print( AtlasStringOfProgram( prg, "mtx" ) );[0X
    [4X# inputs are expected in 1 2[0X
    [4Xzsm pwr3 2 3[0X
    [4Xzsm pwr4 1 5[0X
    [4Xzmu 3 5 4[0X
    [4Xzsm pwr2 1 6[0X
    [4Xzmu 6 3 5[0X
    [4Xecho "outputs are in 4 5"[0X
    [4Xgap> str:= "inp 2\nchor 1 2\nchor 2 3\nmu 1 2 3\nchor 3 5";;[0X
    [4Xgap> prg:= ScanStraightLineDecision( str );;[0X
    [4Xgap> AtlasStringOfProgram( prg.program );[0X
    [4X"inp 2\nchor 1 2\nchor 2 3\nmu 1 2 3\nchor 3 5\n"[0X
  [4X------------------------------------------------------------------[0X
  
  
  [1X5.5 Data Types Used in the [5XATLAS[0X[1X of Group Representations[0X
  
  Each representation or program that is administrated by the [5XAtlasRep[0X package
  belongs  to  a  unique  [13Xdata  type[0X.  Informally,  examples of data types are
  "permutation  representation", "matrix representation over the integers", or
  "straight line program for computing class representatives".
  
  The idea is that for each data type, there can be
  
  --    a column of its own in the output produced by [2XDisplayAtlasInfo[0X ([14X2.5-1[0X)
        when  called  without  arguments or with only argument a list of group
        names,
  
  --    a  line  format of its own for the output produced by [2XDisplayAtlasInfo[0X
        ([14X2.5-1[0X) when called with first argument a group name,
  
  --    an input format of its own for [2XAtlasProgram[0X ([14X2.5-3[0X),
  
  --    an input format of its own for [2XOneAtlasGeneratingSetInfo[0X ([14X2.5-4[0X), and
  
  --    specific  tests  for  the  data of this data type; these functions are
        used by the global tests described in Section [14X5.8[0X.
  
  Formally,  a  data  type is defined by a record whose components are used by
  the interface functions. The details are described in the following.
  
  [1X5.5-1 AGRDeclareDataType[0X
  
  [2X> AGRDeclareDataType( [0X[3Xkind, name, record[0X[2X ) _________________________[0Xfunction
  
  Let  [3Xkind[0X  be  one  of  the  strings [10X"rep"[0X or [10X"prg"[0X, and [3Xrecord[0X be a record.
  [2XAGRDeclareDataType[0X  declares  a new data type of representations (if [3Xkind[0X is
  [10X"rep"[0X)  or  of  programs  (if  [3Xkind[0X  is  [10X"prg"[0X).  For each group used in the
  [5XAtlasRep[0X  package,  the  record that contains the information about the data
  will have a component [3Xname[0X whose value is a list with the data about the new
  type. Examples of [3Xname[0X are [10X"perm"[0X, [10X"matff"[0X, and [10X"classes"[0X.
  
  [13XMandatory components[0X of [3Xrecord[0X are
  
  [8X[10XFilenameFormat[0X[0X
        This  defines  the format of the filenames containing data of the type
        in  question.  The value must be a list that can be used as the second
        argument  of  [2XAGRParseFilenameFormat[0X ([14X5.6-1[0X), such that only filenames
        of  the  type  in  question  match.  (It  is  not checked whether this
        "detection  function"  matches  exactly  one type, so one must be very
        careful here when declaring a new type.)
  
  [8X[10XAddFileInfo[0X[0X
        This  defines  the information stored in the table of contents for the
        data  of  the  type.  The  value  must  be a function that takes three
        arguments  (the current list of data for the type and the given group,
        a  list returned by [2XAGRParseFilenameFormat[0X ([14X5.6-1[0X) for the given type,
        and  a  filename).  This function adds the necessary parts of the data
        entry  to  the list, and returns [9Xtrue[0X if the data belongs to the type,
        otherwise  [9Xfalse[0X  is returned; note that the latter case occurs if the
        filename  matches  the format description but additional conditions on
        the parts of the name are not satisfied (for example integer parts may
        be required to be positive or prime powers).
  
  [8X[10XReadAndInterpretDefault[0X[0X
        This is the function that does the work for the default [10Xcontents[0X value
        of  the  [10XaccessFunctions[0X  component of [2XAtlasOfGroupRepresentationsInfo[0X
        ([14X5.1-5[0X),  see  Section [14X5.2[0X.  This function must take a path and return
        the [5XGAP[0X object given by this file.
  
  [8X[10XAddDescribingComponents[0X (for [10Xrep[0X only)[0X
        This  function takes two arguments, a record (that will be returned by
        [2XAtlasGenerators[0X   ([14X2.5-2[0X),   [2XOneAtlasGeneratingSetInfo[0X   ([14X2.5-4[0X),   or
        [2XAllAtlasGeneratingSetInfos[0X  ([14X2.5-5[0X))  and  the  type record [3Xrecord[0X. It
        sets  the components [10Xp[0X, [10Xdim[0X, [10Xid[0X, and [10Xring[0X that are promised for return
        values of the abovementioned three functions.
  
  [8X[10XDisplayGroup[0X (for [10Xrep[0X only)[0X
        This  defines  the  format  of  the  lines printed by [2XDisplayAtlasInfo[0X
        ([14X2.5-1[0X)  for  a given group. The value must be a function that takes a
        list  as  returned by the function given in the component [10XAddFileInfo[0X,
        and  returns  the  string  to  be  printed  for  the representation in
        question.
  
  [13XOptional components[0X of [3Xrecord[0X are
  
  [8X[10XDisplayOverviewInfo[0X[0X
        This   is   used   to   introduce  a  new  column  in  the  output  of
        [2XDisplayAtlasInfo[0X ([14X2.5-1[0X) when this is called without arguments or with
        a  list  of group names as its only argument. The value must be a list
        of length three, containing at its first position a string used as the
        header of the column, at its second position one of the strings [10X"r"[0X or
        [10X"l"[0X,  denoting  right or left aligned column entries, and at its third
        position  a  function  that  takes  two arguments (a list of tables of
        contents of the [5XAtlasRep[0X package and a group name), and returns a list
        of length two, containing the string to be printed as the column value
        and  [9Xtrue[0X  or  [9Xfalse[0X, depending on whether private data is involved or
        not. (The default is to print no column for the data type.)
  
  [8X[10XDisplayPRG[0X (for [10Xprg[0X only)[0X
        This is used in [2XDisplayAtlasInfo[0X ([14X2.5-1[0X) for [5XATLAS[0X programs. The value
        must  be  a  function  that  takes four arguments (a list of tables of
        contents  to  examine, the name of the given group, a list of integers
        or  [9Xtrue[0X for the required standardization, and a list of all available
        standardizations),  and  returns  the  list  of  lines (strings) to be
        printed as the information about the available programs of the current
        type  and  for  the  given  group.  (The default is to return an empty
        list.)
  
  [8X[10XAccessGroupCondition[0X (for [10Xrep[0X only)[0X
        This is used in [2XDisplayAtlasInfo[0X ([14X2.5-1[0X) and [2XOneAtlasGeneratingSetInfo[0X
        ([14X2.5-4[0X). The value must be a function that takes two arguments (a list
        as   returned   by  [2XAGRParseFilenameFormat[0X  ([14X5.6-1[0X),  and  a  list  of
        conditions), and returns [9Xtrue[0X or [9Xfalse[0X, depending on whether the first
        argument  satisfies  the conditions. (The default value is [2XReturnFalse[0X
        ([14XReference: ReturnFalse[0X).)
  
        The function must support conditions such as [10X[ IsPermGroup, true ][0X and
        [10X[  NrMovedPoints,  [ 5, 6 ] ][0X, in general a list of functions followed
        by  a  prescribed  value, a list of prescribed values, another (unary)
        function,  or the string [10X"minimal"[0X. For an overview of the interesting
        functions, see [2XDisplayAtlasInfo[0X ([14X2.5-1[0X).
  
  [8X[10XAccessPRG[0X (for [10Xprg[0X only)[0X
        This  is  used  in  [2XAtlasProgram[0X ([14X2.5-3[0X). The value must be a function
        that  takes three arguments (the record with the information about the
        given  group in the current table of contents, an integer or a list of
        integers  or  [9Xtrue[0X  for  the  required  standardization, and a list of
        conditions  given  by the optional arguments of [2XAtlasProgram[0X ([14X2.5-3[0X)),
        and  returns  either  [9Xfail[0X or a list that together with the group name
        forms  the  identifier  of a program that matches the conditions. (The
        default value is [2XReturnFail[0X ([14XReference: ReturnFail[0X).)
  
  [8X[10XAtlasProgram[0X (for [10Xprg[0X only)[0X
        This  is  used in [2XAtlasProgram[0X ([14X2.5-3[0X) to create the result value from
        the identifier. (The default value is [10XAtlasProgramDefault[0X, which works
        whenever  the  second entry of the identifier is the filename; this is
        not  the case for example if the program is the composition of several
        programs.)
  
  [8X[10XTOCEntryString[0X[0X
        This is used in [2XStoreAtlasTableOfContents[0X ([14X1.6-2[0X). The value must be a
        function  that  takes  two  arguments (the name [3Xname[0X of the type and a
        list  as  returned  by  [2XAGRParseFilenameFormat[0X  ([14X5.6-1[0X)  and returns a
        string  that  describes  the  appropriate  function call. (The default
        value is [10XTOCEntryStringDefault[0X.)
  
  [8X[10XPostprocessFileInfo[0X[0X
        This  is  used  in  the  construction  of  a  table  of  contents  via
        [2XReloadAtlasTableOfContents[0X  ([14X1.6-1[0X),  for  testing  or rearranging the
        data  of  the  current table of contents. The value must be a function
        that  takes two arguments, the table of contents record and the record
        in  it  that  belongs  to  one fixed group. (The default function does
        nothing.)
  
  [8X[10XSortTOCEntries[0X[0X
        This  is  used  in  the  construction  of  a  table  of  contents (see
        [2XReloadAtlasTableOfContents[0X  ([14X1.6-1[0X)),  for  sorting  the entries after
        they   have   been   added  and  after  the  value  of  the  component
        [10XPostprocessFileInfo[0X has been called. The value must be a function that
        takes  a  list  as  returned  by  [2XAGRParseFilenameFormat[0X  ([14X5.6-1[0X), and
        returns  the sorting key. (There is no default value, which means that
        no sorting is needed.)
  
  [8X[10XTestFileHeaders[0X (for [10Xrep[0X only)[0X
        This          is          used         in         the         function
        [2XAtlasOfGroupRepresentationsTestFileHeaders[0X  ([14X5.8-2[0X). The value must be
        a  function  that  takes  the  same  four arguments as [2XAGRFileContents[0X
        ([14X5.6-2[0X),  except that the first argument [10X"datagens"[0X can be replaced by
        [10X"local"[0X  and  that  the  third  argument  is  a  list  as  returned by
        [2XAGRParseFilenameFormat[0X  ([14X5.6-1[0X).  (The  default  value  is  [2XReturnTrue[0X
        ([14XReference: ReturnTrue[0X).)
  
  [8X[10XTestFiles[0X (for [10Xrep[0X only)[0X
        This  is  used  in  the  function [2XAtlasOfGroupRepresentationsTestFiles[0X
        ([14X5.8-4[0X).  The  format of the value and the default are the same as for
        the value of the component [10XTestFileHeaders[0X.
  
  [8X[10XTestWords[0X (for [10Xprg[0X only)[0X
        This  is  used  in  the  function [2XAtlasOfGroupRepresentationsTestWords[0X
        ([14X5.8-3[0X).  The value must be a function that takes five arguments where
        the  first four are the same arguments as for [2XAGRFileContents[0X ([14X5.6-2[0X),
        except  that the first argument [10X"dataword"[0X can be replaced by [10X"local"[0X,
        and  the  fifth  argument is [9Xtrue[0X or [9Xfalse[0X, indicating verbose mode or
        not.
  
  
  [1X5.6 Filenames Used in the [5XATLAS[0X[1X of Group Representations[0X
  
  The  data of each local [5XGAP[0X version of the [5XATLAS[0X of Group Representations is
  either private (see Chapter [14X3.[0X) or is stored in the two directories [11Xdatagens[0X
  and  [11Xdataword[0X.  In the following, we describe the format of filenames in the
  latter two directories, as a reference of the "official" part of the [5XATLAS[0X.
  
  In  the directory [11Xdatagens[0X, the generators for the [13Xrepresentations[0X available
  are  stored,  the  directory  [11Xdataword[0X  contains  the  [13Xprograms[0X  to  compute
  conjugacy  class representatives, generators of maximal subgroups, images of
  generators  under  automorphisms of a given group G from standard generators
  of G, and to check and compute standard generators (see Section [14X2.3[0X).
  
  The  name  of each data file in the [5XATLAS[0X of Group Representations describes
  the  contents  of  the  file.  This  section  lists  the  definitions of the
  filenames used.
  
  Each  filename consists of two parts, separated by a minus sign [10X-[0X. The first
  part is always of the form [3Xgroupname[0X[10XG[0X[3Xi[0X, where the integer [3Xi[0X denotes the [3Xi[0X-th
  set  of  standard  generators  for  the  group  G, say, with [5XATLAS[0X-file name
  [3Xgroupname[0X  (see [14X2.2[0X).  The translations of the name [3Xgroupname[0X to the name(s)
  used    within    [5XGAP[0X    is    given    by   the   component   [10XGAPnames[0X   of
  [2XAtlasOfGroupRepresentationsInfo[0X ([14X5.1-5[0X).
  
  The  filenames in the directory [11Xdataword[0X have one of the following forms. In
  each of these cases, the suffix [10XW[0X[3Xn[0X means that [3Xn[0X is the version number of the
  program.
  
  [8X[10X[3Xgroupname[0XG[3Xi[0X-cycW[3Xn[0X[0X[0X
        In this case, the file contains a straight line program that returns a
        list of representatives of generators of maximally cyclic subgroups of
        G. An example is [10XCo1G1-cycW1[0X.
  
  [8X[10X[3Xgroupname[0XG[3Xi[0X-cclsW[3Xn[0X[0X[0X
        In this case, the file contains a straight line program that returns a
        list   of   conjugacy  class  representatives  of  G.  An  example  is
        [10XRuG1-cclsW1[0X.
  
  [8X[10X[3Xgroupname[0XG[3Xi[0XcycW[3Xn[0X-cclsW[3Xm[0X[0X[0X
        In this case, the file contains a straight line program that takes the
        return value of the program in the file [3Xgroupname[0X[10XG[0X[3Xi[0X[10X-cycW[0X[3Xn[0X (see above),
        and returns a list of conjugacy class representatives of G. An example
        is [10XM11G1cycW1-cclsW1[0X.
  
  [8X[10X[3Xgroupname[0XG[3Xi[0X-max[3Xk[0XW[3Xn[0X[0X[0X
        In  this  case,  the  file contains a straight line program that takes
        generators  of  G  w.r.t. the  [3Xi[0X-th  set  of  standard generators, and
        returns  a list of generators (in general [13Xnot[0X standard generators) for
        a  subgroup  U in the [3Xk[0X-th class of maximal subgroups of G. An example
        is [10XJ1G1-max7W1[0X.
  
  [8X[10X[3Xgroupname[0XG[3Xi[0Xmax[3Xk[0XW[3Xn[0X-[3Xsubgroupname[0XG[3Xj[0XW[3Xm[0X[0X[0X
        In this case, the file contains a straight line program that takes the
        return  value  of  the  program  in  the  file [3Xgroupname[0X[10XG[0X[3Xi[0X[10X-max[0X[3Xk[0X[10XW[0X[3Xn[0X (see
        above),  which  are  generators  for a group U, say; [3Xsubgroupname[0X is a
        name  for U, and the return value is a list of standard generators for
        U, w.r.t. the [3Xj[0X-th set of standard generators. (Of course this implies
        that  the  groups  in  the  [3Xk[0X-th  class  of maximal subgroups of G are
        isomorphic  to  the  group  with  name  [3Xsubgroupname[0X.)  An  example is
        [10XJ1G1max1W1-L211G1W1[0X; the first class of maximal subgroups of the Janko
        group  J_1  consists of groups isomorphic to the linear group L_2(11),
        for which standard generators are defined.
  
  [8X[10X[3Xgroupname[0XG[3Xi[0X-a[3Xoutname[0XW[3Xn[0X[0X[0X
        In  this  case,  the  file contains a straight line program that takes
        generators  of  G  w.r.t. the  [3Xi[0X-th  set  of  standard generators, and
        returns the list of their images under the outer automorphism alpha of
        G  given  by the name [3Xoutname[0X; if this name is empty then alpha is the
        unique nontrivial outer automorphism of G; if it is a positive integer
        k  then  alpha is a generator of the unique cyclic order k subgroup of
        the outer automorphism group of G; if it is of the form [10X2_1[0X or [10X2a[0X, [10X4_2[0X
        or  [10X4b[0X,  [10X3_3[0X  or  [10X3c[0X  ...  then  alpha  generates  the cyclic group of
        automorphisms  induced on G by G.2_1, G.4_2, G.3_3 ...; finally, if it
        is  of  the  form  [3Xk[0X[10Xp[0X[3Xd[0X, with [3Xk[0X one of the above forms and [3Xd[0X an integer
        then  [3Xd[0X  denotes  the  number  of  dashes appended to the automorphism
        described by [3Xk[0X; if [3Xd[0X = 1 then [3Xd[0X can be omitted. Examples are [10XA5G1-aW1[0X,
        [10XL34G1-a2_1W1[0X,  [10XU43G1-a2_3pW1[0X,  and  [10XO8p3G1-a2_2p5W1[0X;  these file names
        describe  the outer order 2 automorphism of A_5 (induced by the action
        of  S_5) and the order 2 automorphisms of L_3(4), U_4(3), and O_8^+(3)
        induced   by   the   actions   of  L_3(4).2_1,  U_4(3).2_2^prime,  and
        O_8^+(3).2_2^primeprimeprimeprimeprime, respectively.
  
  [8X[10X[3Xgroupname[0XG[3Xi[0X-G[3Xj[0XW[3Xn[0X[0X[0X
        In  this  case,  the  file contains a straight line program that takes
        generators  of  G  w.r.t. the  [3Xi[0X-th  set  of  standard generators, and
        returns  standard  generators  of  G  w.r.t. the  [3Xj[0X-th set of standard
        generators. An example is [10XL35G1-G2W1[0X.
  
  [8X[10X[3Xgroupname[0XG[3Xi[0X-check[3Xn[0X[0X[0X
        In  this  case,  the file contains a straight line decision that takes
        generators  of  G,  and  returns [9Xtrue[0X if these generators are standard
        generators w.r.t. the [3Xi[0X-th standardization, and [9Xfalse[0X otherwise.
  
  [8X[10X[3Xgroupname[0XG[3Xi[0X-P[3Xn[0X[0X[0X
        In  this  case,  the file contains a straight line decision that takes
        some  group  elements, and returns [9Xtrue[0X if these elements are standard
        generators   for   [3XG[0X,   w.r.t. the  [3Xi[0X-th  standardization,  and  [9Xfalse[0X
        otherwise.
  
  [8X[10X[3Xgroupname[0XG[3Xi[0X-find[3Xn[0X[0X[0X
        In  this  case,  the  file  contains  a black box program that takes a
        group,  and returns (if it is successful) a set of standard generators
        for [3XG[0X, w.r.t. the [3Xi[0X-th standardization.
  
  [8X[10X[3Xgroupname[0XG[3Xi[0X-X[3Xdescr[0XW[3Xn[0X[0X[0X
        In  this  case,  the  file contains a straight line program that takes
        generators  of G w.r.t. the [3Xi[0X-th set of standard generators, and whose
        return value corresponds to [3Xdescr[0X. This format is used only in private
        extensions  (see Chapter [14X3.[0X), such a script can be accessed with [3Xdescr[0X
        as the third argument of [2XAtlasProgram[0X ([14X2.5-3[0X).
  
  The  filenames in the directory [11Xdatagens[0X have one of the following forms. In
  each  of  these  cases,  [3Xid[0X  is a (possibly empty) string that starts with a
  lowercase      alphabet     letter     (see [2XIsLowerAlphaChar[0X     ([14XReference:
  IsLowerAlphaChar[0X)),  and  [3Xm[0X  is  a  nonnegative  integer,  meaning  that the
  generators  are written w.r.t. the [3Xm[0X-th basis (the meaning is defined by the
  [5XATLAS[0X developers).
  
  [8X[10X[3Xgroupname[0XG[3Xi[0X-f[3Xq[0Xr[3Xdim[0X[3Xid[0XB[3Xm[0X.m[3Xnr[0X[0X[0X
        a file in [5XMeatAxe[0X text file format containing the [3Xnr[0X-th generator of a
        matrix  representation  over  the  field with [3Xq[0X elements, of dimension
        [3Xdim[0X. An example is [10XS5G1-f2r4aB0.m1[0X.
  
  [8X[10X[3Xgroupname[0XG[3Xi[0X-p[3Xn[0X[3Xid[0XB[3Xm[0X.m[3Xnr[0X[0X[0X
        a file in [5XMeatAxe[0X text file format containing the [3Xnr[0X-th generator of a
        permutation representation on [3Xn[0X points. An example is [10XM11G1-p11B0.m1[0X.
  
  [8X[10X[3Xgroupname[0XG[3Xi[0X-Ar[3Xdim[0X[3Xid[0XB[3Xm[0X.g[0X[0X
        a   [5XGAP[0X   readable   file   containing  all  generators  of  a  matrix
        representation  of  dimension  [3Xdim[0X  over an algebraic number field not
        specified further. An example is [10XA5G1-Ar3aB0.g[0X.
  
  [8X[10X[3Xgroupname[0XG[3Xi[0X-Zr[3Xdim[0X[3Xid[0XB[3Xm[0X.g[0X[0X
        a   [5XGAP[0X   readable   file   containing  all  generators  of  a  matrix
        representation  over  the  integers,  of  dimension [3Xdim[0X. An example is
        [10XA5G1-Zr4B0.g[0X.
  
  [8X[10X[3Xgroupname[0XG[3Xi[0X-Hr[3Xdim[0X[3Xid[0XB[3Xm[0X.g[0X[0X
        a   [5XGAP[0X   readable   file   containing  all  generators  of  a  matrix
        representation  over  a  quaternion  algebra  over an algebraic number
        field, of dimension [3Xdim[0X. An example is [10X2A6G1-Hr2aB0.g[0X.
  
  [8X[10X[3Xgroupname[0XG[3Xi[0X-Z[3Xn[0Xr[3Xdim[0X[3Xid[0XB[3Xm[0X.g[0X[0X
        a   [5XGAP[0X   readable   file   containing  all  generators  of  a  matrix
        representation  of  dimension  [3Xdim[0X over the ring of integers mod [3Xn[0X. An
        example is [10X2A8G1-Z4r4aB0.g[0X.
  
  [1X5.6-1 AGRParseFilenameFormat[0X
  
  [2X> AGRParseFilenameFormat( [0X[3Xstring, format[0X[2X ) _________________________[0Xfunction
  [6XReturns:[0X  a  list of strings and integers if [3Xstring[0X matches [3Xformat[0X, and [9Xfail[0X
            otherwise.
  
  Let  [3Xstring[0X  be a filename, and [3Xformat[0X be a list [ [ c_1, c_2, ..., c_n ], [
  f_1,  f_2, ..., f_n ] ] such that each entry c_i is a list of strings and of
  functions  that take a character as their argument and return [11Xtrue[0X or [11Xfalse[0X,
  and  such  that each entry f_i is a function for parsing a filename, such as
  the currently undocumented functions [10XParseForwards[0X and [10XParseBackwards[0X.
  
  [2XAGRParseFilenameFormat[0X  returns a list of strings and integers such that the
  concatenation  of  their  [2XString[0X ([14XReference: String[0X) values yields [3Xstring[0X if
  [3Xstring[0X  matches  [3Xformat[0X, and [9Xfail[0X otherwise. Matching is defined as follows.
  Splitting  [3Xstring[0X  at each minus character ([10X-[0X) yields m parts s_1, s_2, ...,
  s_m.  The string [3Xstring[0X matches [3Xformat[0X if s_i matches the conditions in c_i,
  for  1  <=  i  <=  n, in the sense that applying f_i to s_i and c_i yields a
  non-[9Xfail[0X result.
  
  [4X---------------------------  Example  ----------------------------[0X
    [4Xgap> format:= [ [ [ IsChar, "G", IsDigitChar ],[0X
    [4X>                 [ "p", IsDigitChar, IsLowerAlphaOrDigitChar,[0X
    [4X>                   "B", IsDigitChar, ".m", IsDigitChar ] ],[0X
    [4X>               [ ParseBackwards, ParseForwards ] ];;[0X
    [4Xgap> AGRParseFilenameFormat( "A6G1-p10B0.m1", format );[0X
    [4X[ "A6", "G", 1, "p", 10, "", "B", 0, ".m", 1 ][0X
    [4Xgap> AGRParseFilenameFormat( "A6G1-p15aB0.m1", format );[0X
    [4X[ "A6", "G", 1, "p", 15, "a", "B", 0, ".m", 1 ][0X
    [4Xgap> AGRParseFilenameFormat( "A6G1-f2r16B0.m1", format );[0X
    [4Xfail[0X
  [4X------------------------------------------------------------------[0X
  
  [1X5.6-2 AGRFileContents[0X
  
  [2X> AGRFileContents( [0X[3Xdirname, groupname, filename, type[0X[2X ) ____________[0Xfunction
  [6XReturns:[0X  the  [5XGAP[0X object obtained from reading and interpreting the file(s)
            with name(s) [3Xfilename[0X.
  
  Let  [3Xdirname[0X  and  [3Xgroupname[0X  be  strings, [3Xfilename[0X be a string or a list of
  strings,  and  [3Xtype[0X be a data type (see [2XAGRDeclareDataType[0X ([14X5.5-1[0X)). [3Xdirname[0X
  must  be  one  of  [10X"datagens"[0X,  [10X"dataword"[0X,  or the [3Xdirid[0X value of a private
  directory, see [2XAtlasOfGroupRepresentationsNotifyPrivateDirectory[0X ([14X3.1-1[0X). If
  [3Xgroupname[0X  is  the  [5XATLAS[0X-file  name  of a group G (see Section [14X2.2[0X), and if
  [3Xfilename[0X  is  either the name of an accessible file in the [3Xdirname[0X directory
  of  the  [5XATLAS[0X,  or a list of such filenames, with data concerning G and for
  the  data  type  [10Xtype[0X,  then  [2XAGRFileContents[0X  returns  the  contents of the
  corresponding  file(s),  in  the sense that the file(s) (or equivalent ones,
  see  Section [14X1.7-6[0X) is/are read, and the result is interpreted if necessary;
  otherwise [9Xfail[0X is returned.
  
  Note  that  if  [3Xfilename[0X  refers  to  file(s)  already stored in the [3Xdirname[0X
  directory  then [2XAGRFileContents[0X does [13Xnot[0X check whether the table of contents
  of the [5XATLAS[0X of Group Representations actually contains [3Xfilename[0X.
  
  
  [1X5.7 The Tables of Contents of the [5XATLAS[0X[1X of Group Representations[0X
  
  The  list  of  data  currently  available  is  stored  in  several [13Xtables of
  contents[0X,  one  for  the local [5XGAP[0X data, one for the data on remote servers,
  and  one  for  each  private  data  directory.  These tables of contents are
  created by [2XReloadAtlasTableOfContents[0X ([14X1.6-1[0X).
  
  It  is  assumed  that the local data directories contain only files that are
  also   available  on  servers.  Private  extensions  to  the  database  (cf.
  Section [14X1.8[0X and Chapter [14X3.[0X) cannot be handled by putting the data files into
  the local directories.
  
  Each  table  of contents is represented by a record whose components are the
  [5XATLAS[0X-file  names  of the groups (see Section [14X2.2[0X) and [10Xlastupdated[0X, a string
  describing  the date of the last update of this table of contents. The value
  for each group name is a record whose components are the names of those data
  types (see Section [14X5.5[0X) for which data are available.
  
  Note  that  the  name  mapping  between  the [5XATLAS[0X-file and [5XGAP[0X names of the
  groups     is     provided     by     the     [10Xgroupnames[0X     component    of
  [2XAtlasOfGroupRepresentationsInfo[0X  ([14X5.1-5[0X),  and  information  about  the base
  rings of matrix representations is provided by the [10Xringinfo[0X component. Group
  names  are  notified  with [2XAGRGNAN[0X ([14X5.7-1[0X), and base ring information can be
  notified  with  [2XAGRRNG[0X  ([14X5.7-2[0X); these two administrational functions may be
  useful for private extensions of the package (see Chapter [14X3.[0X).
  
  [1X5.7-1 AGRGNAN[0X
  
  [2X> AGRGNAN( [0X[3Xgapname, atlasname[, size][0X[2X ) ____________________________[0Xfunction
  
  Let [3Xgapname[0X be a string denoting a [5XGAP[0X group name, and [3Xatlasname[0X be a string
  denoting the corresponding [5XATLAS[0X-file name used in filenames of the [5XATLAS[0X of
  Group  Representations.  If  [3Xsize[0X  is given then it must be the order of the
  corresponding  group.  [10XAGRGNAN[0X  adds  the pair [10X[ [3Xgapname[0X, [3Xatlasname[0X ][0X or the
  triple [10X[ [3Xgapname[0X, [3Xatlasname[0X, [3Xsize[0X ][0X, respectively, to the list stored in the
  [10XGAPnames[0X  component  of  [2XAtlasOfGroupRepresentationsInfo[0X ([14X5.1-5[0X), making the
  [5XATLAS[0X data involving [3Xatlasname[0X accessible for the group with name [3Xgapname[0X.
  
  An  example  of  a  valid  call  is  [10XAGRGNAN("A6.2_2","PGL29",360)[0X, see also
  Section [14X3.3[0X.
  
  [1X5.7-2 AGRRNG[0X
  
  [2X> AGRRNG( [0X[3Xfilename, descr[0X[2X ) ________________________________________[0Xfunction
  
  Let  [3Xfilename[0X  be  a  string  denoting  the  name  of  a file containing the
  generators  of a matrix representation over a ring that is not determined by
  the  filename, and let [3Xdescr[0X be a string describing this ring [3XR[0X, say. [2XAGRRNG[0X
  adds  the  triple  [10X[ [3Xfilename[0X, [3Xdescr[0X, [3XR[0X ][0X to the list stored in the [10Xringinfo[0X
  component of [2XAtlasOfGroupRepresentationsInfo[0X ([14X5.1-5[0X).
  
  An example of a valid call is [10XAGRRNG("A5G1-Ar3aB0","Field([Sqrt(5)])")[0X.
  
  
  [1X5.8 Sanity Checks for the [5XATLAS[0X[1X of Group Representations[0X
  
  The  fact  that  the  [5XATLAS[0X  of Group Representations is designed as an open
  database   (see   Section [14X1.7-1[0X)  makes  it  especially  desirable  to  have
  consistency  checks  available  which  can be run automatically whenever new
  data  are  added  by the developers of the [5XATLAS[0X. The tests described in the
  following  can  also  be  used  for  private  extensions of the package (see
  Chapter [14X3.[0X).
  
  The   file  [11Xtst/testall.g[0X  of  the  package  contains  [2XReadTest[0X  ([14XReference:
  ReadTest[0X)  statements  for executing a collection of such sanity checks; one
  can  run  them  by starting [5XGAP[0X in the [11Xtst[0X directory, and then calling [10XRead(
  "testall.g" )[0X. If no problem occurs then [5XGAP[0X prints only lines starting with
  one of the following.
  
  [4X-----------------------------  Log  ------------------------------[0X
    [4X+ $Id:[0X
    [4X+ GAP4stones:[0X
  [4X------------------------------------------------------------------[0X
  
  The required space and time for running these tests depends on the amount of
  locally available data.
  
  The  examples  in this manual form a part of these tests, they are collected
  in the file [11Xtst/docxpl.tst[0X of the package.
  
  The    file    [11Xtst/atlasrep.tst[0X    contains    calls    to   the   functions
  [2XAtlasOfGroupRepresentationsTestGroupOrders[0X   ([14X5.8-1[0X),   which   checks   the
  consistency   of   the   stored   group   orders   and   the   actual  data,
  [2XAtlasOfGroupRepresentationsTestFileHeaders[0X   ([14X5.8-2[0X),   which   checks   the
  consistency  of  the  names of [5XMeatAxe[0X text files and the first lines of the
  files,   and   [2XAtlasOfGroupRepresentationsTestWords[0X  ([14X5.8-3[0X),  which  checks
  whether the available programs do what they promise.
  
  The      calls      to     [2XAtlasOfGroupRepresentationsTestFiles[0X     ([14X5.8-4[0X),
  [2XAtlasOfGroupRepresentationsTestClassScripts[0X           ([14X5.8-5[0X),           and
  [2XAGR_TestMinimalDegrees[0X  ([14X4.3-5[0X)  are  not  part of the tests that are run by
  reading [11Xtst/testall.g[0X.
  
  All these tests apply only to the [13Xlocal[0X table of contents (see Section [14X5.7[0X),
  that  is,  only  those data files are checked that are actually available in
  the  local  [5XGAP[0X installation. No files are fetched from servers during these
  tests.
  
  Further tests, such as the consistency of different versions of server data,
  exist but are not part of the distributed package.
  
  [1X5.8-1 AtlasOfGroupRepresentationsTestGroupOrders[0X
  
  [2X> AtlasOfGroupRepresentationsTestGroupOrders( [0X[3X[0X[2X ) ___________________[0Xfunction
  [6XReturns:[0X  [9Xfalse[0X if a contradiction was found, [9Xtrue[0X otherwise.
  
  This  function  checks  whether  the  group  orders  stored  in the [10XGAPnames[0X
  component  of  [2XAtlasOfGroupRepresentationsInfo[0X  ([14X5.1-5[0X)  coincide  with  the
  orders  computed  from  an  [5XATLAS[0X permutation representation of degree up to
  10^4,  from  the  character table or the table of marks with the given name,
  from  the  inner structure of the name (supported is a splitting of the name
  at  the first dot ([10X.[0X), where the two parts of the name are examined with the
  same  criteria in order to derive the group order). A message is printed for
  each  group  name  for  which  no  order  is  stored (and perhaps now can be
  stored),  for  which  the stored group order cannot be verified, for which a
  contradiction was found.
  
  [1X5.8-2 AtlasOfGroupRepresentationsTestFileHeaders[0X
  
  [2X> AtlasOfGroupRepresentationsTestFileHeaders( [0X[3X[tocid[, groupname]][0X[2X ) [0Xfunction
  [6XReturns:[0X  [9Xfalse[0X if an error occurs, otherwise [9Xtrue[0X.
  
  First  suppose  that  this  function is called with two arguments [3Xtocid[0X, the
  identifier  of a directory (see Section [2Xsect:Adding a Private Data Directory[0X
  ([14X3.1[0X)), and [3Xgroupname[0X, an [5XATLAS[0X-file name that occurs as a component name in
  the  table  of contents of the directory. The function checks for those data
  files  for  [3Xgroupname[0X in the [3Xtocid[0X directory that are in [5XMeatAxe[0X text format
  whether  the filename and the header line are consistent; it checks the data
  file  in [5XGAP[0X format whether the file name is consistent with the contents of
  the file.
  
  If  only  one argument [3Xtocid[0X is given then all representations available for
  [3Xgroupname[0X are checked with the three argument version.
  
  If  only  one  argument  [3Xtocid[0X  is  given  then  all available groups in the
  directory  with  identifier  [3Xtocid[0X  are  checked;  the contents of the local
  [10Xdataword[0X  directory  can  be  checked by entering [10X"local"[0X, which is also the
  default for [3Xtocid[0X.
  
  [1X5.8-3 AtlasOfGroupRepresentationsTestWords[0X
  
  [2X> AtlasOfGroupRepresentationsTestWords( [0X[3X[tocid[, groupname]][0X[2X ) _____[0Xfunction
  [6XReturns:[0X  [9Xfalse[0X if an error occurs, otherwise [9Xtrue[0X.
  
  Called       with       one       argument       [3Xtocid[0X,       a      string,
  [2XAtlasOfGroupRepresentationsTestWords[0X  processes all programs that are stored
  in  the  directory  with identifier [3Xtocid[0X (see Section [2Xsect:Adding a Private
  Data  Directory[0X ([14X3.1[0X)), using the function stored in the [10XTestWords[0X component
  of  the  data type in question. The contents of the local [11Xdataword[0X directory
  can be checked by entering [10X"local"[0X, which is also the default.
  
  If  the string [3Xgroupname[0X, an [5XATLAS[0X-file name that occurs as a component name
  in  the  table of contents of the directory, is given as the second argument
  then only the data files for this group are tested.
  
  [1X5.8-4 AtlasOfGroupRepresentationsTestFiles[0X
  
  [2X> AtlasOfGroupRepresentationsTestFiles( [0X[3X[tocid[, groupname]][0X[2X ) _____[0Xfunction
  [6XReturns:[0X  [9Xfalse[0X if an error occurs, otherwise [9Xtrue[0X.
  
  This  function  is an analogue of [2XAtlasOfGroupRepresentationsTestFileHeaders[0X
  ([14X5.8-2[0X).  It  checks whether reading [5XMeatAxe[0X text files with [2XScanMeatAxeFile[0X
  ([14X5.3-1[0X)  returns  non-[9Xfail[0X results. It does not check whether the first line
  of a [5XMeatAxe[0X text file is consistent with the filename, since this is tested
  by [2XAtlasOfGroupRepresentationsTestFileHeaders[0X ([14X5.8-2[0X).
  
  [1X5.8-5 AtlasOfGroupRepresentationsTestClassScripts[0X
  
  [2X> AtlasOfGroupRepresentationsTestClassScripts( [0X[3X[groupname][0X[2X ) _______[0Xfunction
  [6XReturns:[0X  [9Xfalse[0X if an error occurs, otherwise [9Xtrue[0X.
  
  First  suppose  that  [2XAtlasOfGroupRepresentationsTestClassScripts[0X  is called
  with    one    argument    [3Xgroupname[0X,   the   name   of   a   component   in
  [10XAtlasOfGroupRepresentationsInfo.TableOfContents.(  "local"  )[0X.  If  the  [5XGAP[0X
  table   library   contains  an  ordinary  character  table  with  [2XIdentifier[0X
  ([14XReference:   Identifier!for   character   tables[0X)   value   the   [5XGAP[0X  name
  corresponding  to  [3Xgroupname[0X  then  it is checked whether all those straight
  line   programs  for  this  group  that  return  class  representatives  are
  consistent  with  the character table in the sense that the class names used
  occur  for the table, and that the element orders and centralizer orders for
  the classes are correct.
  
  If  no  argument is given then all available groups are checked with the one
  argument version.
  
