/*
 *  File:    SODLS10.cpp
 *  Author:  S Harry White
 *  Created: 2018-02-25
 *  Updated: 2022-01-27
 *    Tidy code.
 *  Updated: 2023-01-27
 *   Change outputFile from bufSize to outSize.
 */

/*
 *  Makes order 10 self-orthogonal diagonal Latin squares, (SODLS).
 *
 *  Uses techniques given in the 2017 paper:
 *
 *   ****************************************************************************
 *   *                                                                          *
 *   *   Fast Algorithm for Enumerating Diagonal Latin Squares of Small Order   *
 *   *                                 by                                       *
 *   *            Stepan Kochemazov, Eduard Vatutin, Oleg Zaikin                *
 *   *                                                                          *
 *   ****************************************************************************
 *
 */

#include "stdafx.h"
#include <conio.h>
#include <direct.h>
#include <errno.h>
#include <fcntl.h>
#include <io.h>
#include <share.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys\stat.h>
#include <time.h>
#include <Windows.h>

const bool F=false, T=true;
const int N=10, NN=N*N, Nd2=N/2, Nd2m1=Nd2-1, M=N-1, L=M-1,
          A=(1<<N)-1, B[]={ 1, 2, 4, 8, 16, 32, 64, 128, 256, 512 }, BM=1<<M, BMp1=BM+1;

int Q[N][N], G[NN], U[NN], rU[N], cU[N], bdU, fdU, qqU[BMp1], P[BMp1]; // Power of 2, the i of B[i]

//--------- SODLS fill order ----------
//
//0   0  1  2  3  4  5  6  7  8  9
//1  28 10 36 38 40 42 44 46 20 47
//2  29 37 11 50 52 54 56 22 58 59
//3  30 39 51 12 62 64 24 66 68 69
//4  31 41 53 63 13 26 72 74 76 77
//5  32 43 55 65 27 14 80 82 84 85
//6  33 45 57 25 73 81 15 88 90 91
//7  34 48 23 67 75 83 89 16 94 95
//8  35 21 60 70 78 86 92 99 17 96
//9  19 49 61 71 79 87 93 98 97 18

const int row[NN]={
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  // 0..9
  1, 2, 3, 4, 5, 6, 7, 8, 9, 9,  //10..19
  1, 8, 2, 7, 3, 6, 4, 5, 1, 2,  //20..29
  3, 4, 5, 6, 7, 8, 1, 2, 1, 3,  //30..39
  1, 4, 1, 5, 1, 6, 1, 1, 7, 9,  //40..49
  2, 3, 2, 4, 2, 5, 2, 6, 2, 2,  //50..59
  8, 9, 3, 4, 3, 5, 3, 7, 3, 3,  //60..69
  8, 9, 4, 6, 4, 7, 4, 4, 8, 9,  //70..79
  5, 6, 5, 7, 5, 5, 8, 9, 6, 7,  //80..89
  6, 6, 8, 9, 7, 7, 8, 9, 9, 8   //90..99
},

col[NN]={
  0, 1, 2, 3, 4, 5, 6, 7, 8, 9,  // 0..9
  1, 2, 3, 4, 5, 6, 7, 8, 9, 0,  //10..19
  8, 1, 7, 2, 6, 3, 5, 4, 0, 0,  //20..29
  0, 0, 0, 0, 0, 0, 2, 1, 3, 1,  //30..39
  4, 1, 5, 1, 6, 1, 7, 9, 1, 1,  //40..49
  3, 2, 4, 2, 5, 2, 6, 2, 8, 9,  //50..59
  2, 2, 4, 3, 5, 3, 7, 3, 8, 9,  //60..69
  3, 3, 6, 4, 7, 4, 8, 9, 4, 4,  //70..79
  6, 5, 7, 5, 8, 9, 5, 5, 7, 6,  //80..89
  8, 9, 6, 6, 8, 9, 9, 8, 7, 7   //90..99
},

opp[NN]={ // fill order opposite: number at [c][r] of number at [r][c] 
  0, 28, 29, 30, 31, 32, 33, 34, 35, 19,  // 0..9
 10, 11, 12, 13, 14, 15, 16, 17, 18,  9,  //10..19
 21, 20, 23, 22, 25, 24, 27, 26,  1,  2,  //20..29
  3,  4,  5,  6,  7,  8, 37, 36, 39, 38,  //30..39
 41, 40, 43, 42, 45, 44, 48, 49, 46, 47,  //40..49
 51, 50, 53, 52, 55, 54, 57, 56, 60, 61,  //50..59
 58, 59, 63, 62, 65, 64, 67, 66, 70, 71,  //60..69
 68, 69, 73, 72, 75, 74, 78, 79, 76, 77,  //70..79
 81, 80, 83, 82, 86, 87, 84, 85, 89, 88,  //80..89
 92, 93, 90, 91, 99, 98, 97, 96, 95, 94   //90..99
};
//=================================================== input ===================================================

void clearLine(int c) { while (c!='\n') c=getchar(); }
//   ---------

int getInt() { int n=0; scanf_s("%d", &n); clearLine(getchar()); return n; }
//  -------

bool getY() {
//   ----
  int c; do { c=getchar(); } while ((c==' ')|(c=='\t')|(c=='\n'));
  clearLine(c); return (c=='Y')|(c=='y');
}

const int bufSize=1024, outSize=bufSize+50;
bool getFileName(char *buf, int size) {
//   -----------
  int c, i=0; char *s=buf; do { c=getchar(); } while ((c==' ')|(c=='\t')|(c=='\n')); *s=c;
  while (i++<size) if ((*++s=getchar())=='\n') break;
  if (*s!='\n') { printf("\nFile name too long.\n"); clearLine(*s); return F; }
  while ((*--s==' ')||(*s=='\t')); /* strip trailing whitespace */ *++s='\0'; return T;
} // getFileName

void check_txt(char *buf, const int size) {
//   ---------
  char *s=buf; bool txt=F; while (*s++!='\0');
  while (--s!=buf) if (*s=='.') { txt=(*++s=='t')&&(*++s=='x')&&(*++s=='t')&&(*++s=='\0'); break; }
  if (!txt) strcat_s(buf, size, ".txt");
} // check_txt

FILE *openInput(char *msg) {
//    ---------
  FILE *rfp=NULL; char buf[bufSize], *rFname=NULL;
  do {
    printf("\n%s", msg);
    if (getFileName(buf, bufSize-4)) { rFname=buf; break; } // reserve 4 to add .txt
    printf("\a\nCan't read the file name. Try again? y (yes) or n (no) "); if (!getY()) break;
  } while (T);
  if (rFname!=NULL) {
    check_txt(buf, bufSize);
    if (fopen_s(&rfp, rFname, "r")!=0) {
      const int msgSize=bufSize+50; char msg[msgSize];
      sprintf_s(msg, msgSize, "\a\nCan't open for read %s", buf); perror(msg);
    }
  }
  return rfp;
} // openInput

bool inputBDorSODLS(int Q[N][N], bool *bd, FILE *rfp) {
//   --------------
  for (int r=0; r<N; ++r) for (int c=0; c<N; ++c) Q[r][c]=-1; int x=-1, y=-1; bool ok=F;
  if (fscanf_s(rfp, "%d %d", &x, &y)==2) {
    ok=T; Q[0][0]=0;
    if ((x==0)&(y==1)) {
      Q[0][1]=1; *bd=F;
      for (int c=2; c<N; ++c) { if (fscanf_s(rfp, "%d", &x)!=1) { ok=F; break; } Q[0][c]=x; }
      if (ok) {
        for (int r=1; r<N; ++r) {
          for (int c=0; c<N; ++c) { if (fscanf_s(rfp, "%d", &x)!=1) { ok=F; break; } Q[r][c]=x; }
          if (!ok) break;
        }
      }
      if (ok) for (int r=0; r<N; ++r) {
        for (int c=0; c<N; ++c) {
          const int v=Q[r][c]; if ((v<0)|(v>=N)) { printf("\aError: Bad value %d in file.\n", v); ok=F; break; }
        }
        if (!ok) break;
      }
    } else {
      int f; if (x==0) { x=y; f=2; } else f=3;
      if ((x>=2)&(x<=9)) {
        Q[1][1]=x; if (f==3) Q[2][2]=y;
        for (int r=f; r<N; ++r) { if (fscanf_s(rfp, "%d", &x)!=1) { ok=F; break; } Q[r][r]=x; }
        if (ok) for (int r=0; r<N; ++r) {
          const int v=Q[r][r]; if ((v<0)|(v>=N)) { printf("\aError: Bad value %d in file.\n", v); ok=F; break; }
        }
        if (ok) *bd=T;
      } else ok=F;
    }
  }
  if (!ok) printf("\aError: Can't read valid diagonal or SODLS from file.\n"); return ok;
} // inputBDorSODLS
//=================================================== output ====================================================

void printElapsedTime(time_t startTime, const char *c) {
//   ---------------- 
  const int et=(int)difftime(time(NULL), startTime);
  /* if (et>0) */ printf("%selapsed time %d:%02d:%02d\n", c, et/3600, et%3600/60, et%60);
} // printElapsedTime

char outputFile[outSize];
FILE *openOutput() {
//    ----------
  int sub=0; FILE *wfp=NULL; const int baseSize=bufSize+25; char baseName[baseSize], buf[outSize];
  sprintf_s(baseName, baseSize, "SODLS%d", N); sprintf_s(buf, outSize, "%s.txt", baseName);
  do {
    if (_access_s(buf, 00)==ENOENT) break; sprintf_s(buf, outSize, "%s_%d.txt", baseName, ++sub);
  } while (T);
  if (fopen_s(&wfp, buf, "w")==0) {
    printf(".. writing SODLS to file %s\n", buf); sprintf_s(outputFile, outSize, "%s", buf);
  } else {
    char msg[outSize+50]; sprintf_s(msg, outSize+50, "\a\nCan't open for write %s", buf); perror(msg);
  }
  return wfp;
} // openOutput

bool printSODLSx(int Q[N][N], FILE *wfp) {
//   -----------
  for (int i=0; i<N; i++) {
    if (Q[i][0]<0) { if (!fprintf(wfp, ".")) return F; }
    else { if (!fprintf(wfp, "%d", Q[i][0])) return F; }
    for (int j=1; j<N; j++)
      if (Q[i][j]<0) { if (!fprintf(wfp, " .")) return F; }
      else { if (!fprintf(wfp, " %d", Q[i][j])) return F; }
    if (fputc('\n', wfp)==EOF) return F;
  }
  const bool ok=fputc('\n', wfp)!=EOF; fflush(wfp); return ok;
} // printSODLSx

bool printSODLS(int s[N][N], FILE *wfp) {
//   ----------
  for (int i=0; i<N; i++) {
    if (!fprintf(wfp, "%d", s[i][0])) return F;
    for (int j=1; j<N; j++) if (!fprintf(wfp, " %d", s[i][j])) return F;
    if (fputc('\n', wfp)==EOF) return F;
  }
  const bool ok=fputc('\n', wfp)!=EOF; fflush(wfp); return ok;
} // printSODLS
//================================================ make =================================================

bool isMagic(int Q[N][N]) {
//   -------
  const int NN=N*N, magicSum=(N/2)*(NN-1); int M[N][N], sumX, sumY, sumXY=0, sumYX=0;
  bool numberUsed[N*N]; for (int i=0; i<NN; i++) numberUsed[i]=F;
  for (int r=0; r<N; ++r) for (int c=0; c<N; ++c) M[r][c]=N*Q[r][c]+Q[c][r];
  for (int i=0; i< N; i++) {
    sumX=0; sumY=0;
    for (int j=0; j<N; j++) { const int t=M[i][j]; numberUsed[t]=T; sumX+=t; sumY+=M[j][i]; }
    if ((sumX!=magicSum)|(sumY!=magicSum)) return F; sumXY+=M[i][N-i-1]; sumYX+=M[i][i];
  }
  for (int i=1; i<=NN; i++) if (!numberUsed[i]) return F; return ((sumXY==magicSum)&(sumYX==magicSum));
} // isMagic

void initializeG(const int bv0) {
//   -----------
   int rU[N], cU[N], fdU=U[9], qqU[BMp1];  rU[0]=A; cU[0]=1; 
   for (int i=1; i<N; ++i) { rU[i]=B[Q[i][i]]; cU[i]=B[Q[0][i]]|B[Q[i][i]]; }

   for (int i=0; i<BMp1; ++i) qqU[i]=0;
   qqU[U[0]]|=U[0]; for (int i=10; i<19; ++i) qqU[U[i]]|=U[i];
   U[19]=bv0; rU[row[19]]|=bv0; cU[col[19]]|=bv0; qqU[U[19]]|=U[9]; qqU[U[9]]|=U[19]; fdU|=bv0;

   for (int i=20; i<27; ++i) {
     G[i]=A^(rU[row[i]]|cU[col[i]]|fdU); while ((G[i]&-G[i])!=U[i]) G[i]&=(G[i]-1);
     rU[row[i]]|=U[i]; cU[col[i]]|=U[i]; fdU|=U[i]; qqU[U[i]]|=U[opp[i]];
   }
   rU[row[27]]|=U[27]; cU[col[27]]|=U[27]; qqU[U[27]]|=U[26];

   for (int i=28; i<35; ++i) {
     G[i]=A^(rU[row[i]]|cU[col[i]]|qqU[U[opp[i]]]); while ((G[i]&-G[i])!=U[i]) G[i]&=(G[i]-1);
     rU[row[i]]|=U[i]; cU[col[i]]|=U[i]; qqU[U[i]]|=U[opp[i]]; qqU[U[opp[i]]]|=U[i];
   }
   rU[row[35]]|=U[35]; qqU[U[35]]|=U[8]; qqU[U[8]]|=U[35];

   for (int i=36; i<94; ++i) {
     if (i<opp[i]) {
       if (col[i]!=M) {
         G[i]=A^(rU[row[i]]|cU[col[i]]); while ((G[i]&-G[i])!=U[i]) { G[i]&=(G[i]-1); } rU[row[i]]|=U[i];
       }
       cU[col[i]]|=U[i];
    } else {
      if (row[i]!=M) {
        G[i]=A^(rU[row[i]]|cU[col[i]]|qqU[U[opp[i]]]);
        while ((G[i]&-G[i])!=U[i]) G[i]&=(G[i]-1); cU[col[i]]|=U[i];
      }
      rU[row[i]]|=U[i]; qqU[U[i]]|=U[opp[i]]; qqU[U[opp[i]]]|=U[i];
    }
  }
  G[94]=A^(rU[row[94]]|cU[col[94]]);
} // initializeG

bool initSODLSls(int *v0) {
//   -----------
  for (int c=0; c<N; ++c)
    if (Q[0][c]!=c) { printf("\aError: first row is not in natural order.\n"); return F; }
  //for (int r=0; r<N; ++r) { rU[r]=0; cU[r]=0; qqU[r]=0; } bdU=0; fdU=0;

  for (int r=0; r<N; ++r) {
    for (int c=0; c<N; ++c) {
      const int u=Q[r][c], v=Q[c][r];
      if (rU[r]&B[u]) { printf("\aError: row %d duplicate %d\n", r+1, u); return F; }
      if (cU[c]&B[u]) { printf("\aError: column %d duplicate %d\n", c+1, u); return F; }
      if (qqU[B[u]]&B[v]) { printf("\aError: duplicate pair %d,%d\n", u, v); return F; }
      if ((c!=M)||((c==M)&&((r==0)||(r==M)))) rU[r]|=B[u];
      if ((r!=M)||((r==M)&&((c==0)||(c==M)))) cU[c]|=B[u]; qqU[B[u]]|=B[v];
    }
    const int b=Q[r][r], f=Q[r][M-r];
    if (bdU&B[b]) { printf("\aError: \\diag duplicate %d\n", b); return F; } bdU|=B[b];
    if (fdU&B[f]) { printf("\aError: /diag duplicate %d\n", f); return F; } if (r!=5) fdU|=B[f];
  }
  
  if (isMagic(Q)) {
    int i; for (i=0; i<NN; ++i) U[i]=B[Q[row[i]][col[i]]]; cU[0]^=U[35];
    i=94; cU[col[i]]^=U[i]; qqU[U[i]]^=U[opp[i]];
    for (i=95; i<NN; ++i)
      { if (col[i]!=M) rU[row[i]]^=U[i]; if (row[i]!=M) cU[col[i]]^=U[i]; qqU[U[i]]^=U[opp[i]]; }
    *v0=Q[M][0]; initializeG(B[*v0]); printf("\nSODLS in:\n"); printSODLS(Q, stdout); return T;
  }
  printf("\aError: Input square is not a SODLS.\n"); return F;
} // initSODLSls

bool getStart(int *v) {
//   --------
  int choices[N], num=0; for (int i=1; i<M; ++i) if (i!=Q[M][M]) choices[num++]=i;
  char buf[100], t[10]; sprintf_s(buf, 100, "Last /diagonal value, (");
  for (int i=0; i<(num-1); ++i) { sprintf_s(t, 10, "%d, ", choices[i]); strcat_s(buf, 100, t); }
  sprintf_s(t, 10, "or %d)? ", choices[num-1]); strcat_s(buf, 100, t);
  printf("%s", buf); int x=getInt(); bool ok=F;
  for (int i=0; i<num; ++i) if (x==choices[i]) { ok=T; break; }
  if (ok) { *v=x; printf("\nSODLS of:\n"); Q[M][0]=x; printSODLSx(Q, stdout); }
  else printf("\aError: Bad value %d\n", x); return ok;
} // getStart

bool initSODLSbd() { // natural first row, bd already filled
//   -----------
  for (int i=0; i<N; ++i) { rU[i]=0; qqU[B[i]]=B[i]; } // qqU of \diagonal
  for (int c=0; c<N; ++c) { Q[0][c]=c; U[c]=B[c]; rU[0]|=B[c]; cU[c]=B[c]; } bdU=1;
  for (int r=1; r<N; ++r) { int v=Q[r][r];
    if (cU[r]&B[v]) { printf("\aError: column %d duplicate %d\n", r+1, v); return F; }
    if (bdU&B[v]) { printf("\aError: \\diagonal duplicate %d\n", v); return F; }
     rU[r]=B[v]; cU[r]|=B[v]; bdU|=B[v]; U[r+M]=B[v]; 
   }
  fdU=U[M]; return T;
} // initSODLSbd

bool initSODLS(const int bd, int *v0) { return bd ? initSODLSbd()&&getStart(v0) : initSODLSls(v0); }
//   ---------

bool makeSODLS1(FILE *wfp) {
//  -----------
  bool hit=F;
  U[95]=rU[row[95]]^A; // rl
  if (!(cU[col[95]]&U[95])) {
    cU[col[94]]|=U[94]; cU[col[95]]|=U[95];

    U[96]=cU[col[96]]^A; // cl
    if (!(rU[row[96]]&U[96])) {
      rU[row[96]]|=U[96];

      U[97]=cU[col[97]]^A; // cl
      if (!((rU[row[97]]&U[97])||(U[97]&qqU[U[96]]))) {
        rU[row[97]]|=U[97]; qqU[U[97]]|=U[96]; qqU[U[96]]|=U[97];

        U[98]=rU[row[98]]^A; // rl
        if (!((cU[col[98]]&U[98])||(U[98]&qqU[U[95]]))) {
          cU[col[98]]|=U[98]; qqU[U[98]]|=U[95]; qqU[U[95]]|=U[98];

          U[99]=rU[row[99]]^A; // rl
          if (!((cU[col[99]]&U[99])||(U[99]&qqU[U[94]]))) {

            for (int j=N; j<NN; ++j) Q[row[j]][col[j]]=P[U[j]];
            hit=printSODLS(Q, wfp);
          }
          cU[col[98]]^=U[98]; qqU[U[98]]^=U[95]; qqU[U[95]]^=U[98];
        }
        rU[row[97]]^=U[97]; qqU[U[97]]^=U[96]; qqU[U[96]]^=U[97];
      }
      rU[row[96]]^=U[96];
    }
    cU[col[94]]^=U[94]; cU[col[95]]^=U[95];
  } 
  return hit;
} // makeSODLS1

//
// There are 2 program modes:
//
//  bd-make SODLS from an input \diagonal and a last /diagonal value
//  ls-continue making SODLS with the \diagonal and the last /diagonal value of an input SODLS
//
// Two main functions, makeSODLSbd and makeSODLSls, are used. They are identical except for a branch to
// a "resume" label in makeSODLSls. Function makeSODLSls is 10% slower than makeSODLSbd.
//
// Using a single function, with an optional branch to "resume", runs 45% slower for bd, 31% slower for ls!!
//
int makeSODLSls(FILE *wfp) {
//  -----------
  int v0=-1; if (!initSODLS(F, &v0)) return 0; int count=0, bv0=B[v0]; time_t startTime=time(NULL); goto resume;

  U[19]=bv0; rU[row[19]]|=bv0; cU[col[19]]|=bv0; qqU[U[19]]|=U[9]; qqU[U[9]]|=U[19]; fdU|=bv0; // fd

  for (G[20]=A^(rU[row[20]]|cU[col[20]]|fdU); G[20]!=0; G[20]&=(G[20]-1)) { // fd
  U[20]=(G[20]&-G[20]); rU[row[20]]|=U[20]; cU[col[20]]|=U[20]; fdU|=U[20];

  for (G[21]=A^(rU[row[21]]|cU[col[21]]|fdU); G[21]!=0; G[21]&=(G[21]-1)) { // fd
  U[21]=(G[21]&-G[21]); rU[row[21]]|=U[21]; cU[col[21]]|=U[21]; fdU|=U[21]; qqU[U[21]]|=U[20]; qqU[U[20]]|=U[21];

  for (G[22]=A^(rU[row[22]]|cU[col[22]]|fdU); G[22]!=0; G[22]&=(G[22]-1)) { // fd
  U[22]=(G[22]&-G[22]); rU[row[22]]|=U[22]; cU[col[22]]|=U[22]; fdU|=U[22];

  for (G[23]=A^(rU[row[23]]|cU[col[23]]|fdU); G[23]!=0; G[23]&=(G[23]-1)) { // fd
  U[23]=(G[23]&-G[23]); rU[row[23]]|=U[23]; cU[col[23]]|=U[23]; fdU|=U[23]; qqU[U[23]]|=U[22]; qqU[U[22]]|=U[23];

  for (G[24]=A^(rU[row[24]]|cU[col[24]]|fdU); G[24]!=0; G[24]&=(G[24]-1)) { // fd
  U[24]=(G[24]&-G[24]); rU[row[24]]|=U[24]; cU[col[24]]|=U[24]; fdU|=U[24];

  for (G[25]=A^(rU[row[25]]|cU[col[25]]|fdU); G[25]!=0; G[25]&=(G[25]-1)) { // fd
  U[25]=(G[25]&-G[25]); rU[row[25]]|=U[25]; cU[col[25]]|=U[25]; fdU|=U[25]; qqU[U[25]]|=U[24]; qqU[U[24]]|=U[25];

  for (G[26]=A^(rU[row[26]]|cU[col[26]]|fdU); G[26]!=0; G[26]&=(G[26]-1)) { // fd
  U[26]=(G[26]&-G[26]); fdU|=U[26];

       U[27]=fdU^A; if ((rU[row[27]]&U[27])||(cU[col[27]]&U[27])) { fdU^=U[26]; continue; }
       rU[row[27]]|=U[27]; cU[col[27]]|=U[27]; qqU[U[27]]|=U[26];
       rU[row[26]]|=U[26]; cU[col[26]]|=U[26]; qqU[U[26]]|=U[27];

  for (G[28]=A^(rU[row[28]]|cU[col[28]]|qqU[U[1]]); G[28]!=0; G[28]&=(G[28]-1)) { // cd
  U[28]=(G[28]&-G[28]); rU[row[28]]|=U[28]; cU[col[28]]|=U[28];
  qqU[U[28]]|=U[1]; qqU[U[1]]|=U[28];

  for (G[29]=A^(rU[row[29]]|cU[col[29]]|qqU[U[2]]); G[29]!=0; G[29]&=(G[29]-1)) { // cd
  U[29]=(G[29]&-G[29]); rU[row[29]]|=U[29]; cU[col[29]]|=U[29];
  qqU[U[29]]|=U[2]; qqU[U[2]]|=U[29];

  for (G[30]=A^(rU[row[30]]|cU[col[30]]|qqU[U[3]]); G[30]!=0; G[30]&=(G[30]-1)) { // cd
  U[30]=(G[30]&-G[30]); rU[row[30]]|=U[30]; cU[col[30]]|=U[30];
  qqU[U[30]]|=U[3]; qqU[U[3]]|=U[30];

  for (G[31]=A^(rU[row[31]]|cU[col[31]]|qqU[U[4]]); G[31]!=0; G[31]&=(G[31]-1)) { // cd
  U[31]=(G[31]&-G[31]); rU[row[31]]|=U[31]; cU[col[31]]|=U[31];
  qqU[U[31]]|=U[4]; qqU[U[4]]|=U[31];

  for (G[32]=A^(rU[row[32]]|cU[col[32]]|qqU[U[5]]); G[32]!=0; G[32]&=(G[32]-1)) { // cd
  U[32]=(G[32]&-G[32]); rU[row[32]]|=U[32]; cU[col[32]]|=U[32];
  qqU[U[32]]|=U[5]; qqU[U[5]]|=U[32];

  for (G[33]=A^(rU[row[33]]|cU[col[33]]|qqU[U[6]]); G[33]!=0; G[33]&=(G[33]-1)) { // cd
  U[33]=(G[33]&-G[33]); rU[row[33]]|=U[33]; cU[col[33]]|=U[33];
  qqU[U[33]]|=U[6]; qqU[U[6]]|=U[33];

  for (G[34]=A^(rU[row[34]]|cU[col[34]]|qqU[U[7]]); G[34]!=0; G[34]&=(G[34]-1)) { // cd, cl
  U[34]=(G[34]&-G[34]); cU[col[34]]|=U[34];

      U[35]=cU[col[35]]^A; if ((rU[row[35]]&U[35])||(U[35]&qqU[U[8]])
                                ||((U[8]==U[34])&&(U[7]==U[35]))) { cU[col[34]]^=U[34]; continue; }
      rU[row[35]]|=U[35]; qqU[U[35]]|=U[8]; qqU[U[8]]|=U[35];
      rU[row[34]]|=U[34]; qqU[U[34]]|=U[7]; qqU[U[7]]|=U[34];

  for (G[36]=A^(rU[row[36]]|cU[col[36]]); G[36]!=0; G[36]&=(G[36]-1)) { // rd
  U[36]=(G[36]&-G[36]); rU[row[36]]|=U[36]; cU[col[36]]|=U[36];

  for (G[37]=A^(rU[row[37]]|cU[col[37]]|qqU[U[36]]); G[37]!=0; G[37]&=(G[37]-1)) { // cd
  U[37]=(G[37]&-G[37]); rU[row[37]]|=U[37]; cU[col[37]]|=U[37]; qqU[U[37]]|=U[36]; qqU[U[36]]|=U[37];

  for (G[38]=A^(rU[row[38]]|cU[col[38]]); G[38]!=0; G[38]&=(G[38]-1)) { // rd
  U[38]=(G[38]&-G[38]); rU[row[38]]|=U[38]; cU[col[38]]|=U[38];
 
  for (G[39]=A^(rU[row[39]]|cU[col[39]]|qqU[U[38]]); G[39]!=0; G[39]&=(G[39]-1)) { // cd
  U[39]=(G[39]&-G[39]); rU[row[39]]|=U[39]; cU[col[39]]|=U[39]; qqU[U[39]]|=U[38]; qqU[U[38]]|=U[39];

  for (G[40]=A^(rU[row[40]]|cU[col[40]]); G[40]!=0; G[40]&=(G[40]-1)) { // rd
  U[40]=(G[40]&-G[40]); rU[row[40]]|=U[40]; cU[col[40]]|=U[40];

  for (G[41]=A^(rU[row[41]]|cU[col[41]]|qqU[U[40]]); G[41]!=0; G[41]&=(G[41]-1)) { // cd
  U[41]=(G[41]&-G[41]); rU[row[41]]|=U[41]; cU[col[41]]|=U[41]; qqU[U[41]]|=U[40]; qqU[U[40]]|=U[41];

  for (G[42]=A^(rU[row[42]]|cU[col[42]]); G[42]!=0; G[42]&=(G[42]-1)) { // rd
  U[42]=(G[42]&-G[42]); rU[row[42]]|=U[42]; cU[col[42]]|=U[42];

  for (G[43]=A^(rU[row[43]]|cU[col[43]]|qqU[U[42]]); G[43]!=0; G[43]&=(G[43]-1)) { // cd
  U[43]=(G[43]&-G[43]); rU[row[43]]|=U[43]; cU[col[43]]|=U[43]; qqU[U[43]]|=U[42]; qqU[U[42]]|=U[43];

  for (G[44]=A^(rU[row[44]]|cU[col[44]]); G[44]!=0; G[44]&=(G[44]-1)) { // rd
  U[44]=(G[44]&-G[44]); rU[row[44]]|=U[44]; cU[col[44]]|=U[44];
  
  for (G[45]=A^(rU[row[45]]|cU[col[45]]|qqU[U[44]]); G[45]!=0; G[45]&=(G[45]-1)) { // cd
  U[45]=(G[45]&-G[45]); rU[row[45]]|=U[45]; cU[col[45]]|=U[45]; qqU[U[45]]|=U[44]; qqU[U[44]]|=U[45];

  for (G[46]=A^(rU[row[46]]|cU[col[46]]); G[46]!=0; G[46]&=(G[46]-1)) { // rd, rl
  U[46]=(G[46]&-G[46]); rU[row[46]]|=U[46];

      U[47]=rU[row[47]]^A; if (cU[col[47]]&U[47]) { rU[row[46]]^=U[46]; continue; }
      cU[col[47]]|=U[47]; cU[col[46]]|=U[46];

  for (G[48]=A^(rU[row[48]]|cU[col[48]]|qqU[U[46]]); G[48]!=0; G[48]&=(G[48]-1)) { // cd, cl
  U[48]=(G[48]&-G[48]); cU[col[48]]|=U[48];

      U[49]=cU[col[49]]^A; if ((rU[row[49]]&U[49])||(U[49]&qqU[U[47]])
                                ||((U[47]==U[48])&&(U[46]==U[49]))) { cU[col[48]]^=U[48]; continue; }
      rU[row[48]]|=U[48]; qqU[U[48]]|=U[46]; qqU[U[46]]|=U[48];
      rU[row[49]]|=U[49]; qqU[U[49]]|=U[47]; qqU[U[47]]|=U[49];

  for (G[50]=A^(rU[row[50]]|cU[col[50]]); G[50]!=0; G[50]&=(G[50]-1)) { // rd
  U[50]=(G[50]&-G[50]); rU[row[50]]|=U[50]; cU[col[50]]|=U[50];
 
  for (G[51]=A^(rU[row[51]]|cU[col[51]]|qqU[U[50]]); G[51]!=0; G[51]&=(G[51]-1)) { // cd
  U[51]=(G[51]&-G[51]); rU[row[51]]|=U[51]; cU[col[51]]|=U[51]; qqU[U[51]]|=U[50]; qqU[U[50]]|=U[51];

  for (G[52]=A^(rU[row[52]]|cU[col[52]]); G[52]!=0; G[52]&=(G[52]-1)) { // rd
  U[52]=(G[52]&-G[52]); rU[row[52]]|=U[52]; cU[col[52]]|=U[52];

  for (G[53]=A^(rU[row[53]]|cU[col[53]]|qqU[U[52]]); G[53]!=0; G[53]&=(G[53]-1)) { // cd
  U[53]=(G[53]&-G[53]); rU[row[53]]|=U[53]; cU[col[53]]|=U[53]; qqU[U[53]]|=U[52]; qqU[U[52]]|=U[53];

  for (G[54]=A^(rU[row[54]]|cU[col[54]]); G[54]!=0; G[54]&=(G[54]-1)) { // rd
  U[54]=(G[54]&-G[54]); rU[row[54]]|=U[54]; cU[col[54]]|=U[54];

  for (G[55]=A^(rU[row[55]]|cU[col[55]]|qqU[U[54]]); G[55]!=0; G[55]&=(G[55]-1)) { // cd
  U[55]=(G[55]&-G[55]); rU[row[55]]|=U[55]; cU[col[55]]|=U[55]; qqU[U[55]]|=U[54]; qqU[U[54]]|=U[55];

  for (G[56]=A^(rU[row[56]]|cU[col[56]]); G[56]!=0; G[56]&=(G[56]-1)) { // rd
  U[56]=(G[56]&-G[56]); rU[row[56]]|=U[56]; cU[col[56]]|=U[56];
  
  for (G[57]=A^(rU[row[57]]|cU[col[57]]|qqU[U[56]]); G[57]!=0; G[57]&=(G[57]-1)) { // cd
  U[57]=(G[57]&-G[57]); rU[row[57]]|=U[57]; cU[col[57]]|=U[57]; qqU[U[57]]|=U[56]; qqU[U[56]]|=U[57];

  for (G[58]=A^(rU[row[58]]|cU[col[58]]); G[58]!=0; G[58]&=(G[58]-1)) { // rd, rl
  U[58]=(G[58]&-G[58]); rU[row[58]]|=U[58];

      U[59]=rU[row[59]]^A; if (cU[col[59]]&U[59]) { rU[row[58]]^=U[58]; continue; }
      cU[col[59]]|=U[59]; cU[col[58]]|=U[58];

  for (G[60]=A^(rU[row[60]]|cU[col[60]]|qqU[U[58]]); G[60]!=0; G[60]&=(G[60]-1)) { // cd, cl
  U[60]=(G[60]&-G[60]); cU[col[60]]|=U[60];

      U[61]=cU[col[61]]^A; if ((rU[row[61]]&U[61])||(U[61]&qqU[U[59]])
                                ||((U[59]==U[60])&&(U[58]==U[61]))) { cU[col[60]]^=U[60]; continue; }
      rU[row[60]]|=U[60]; qqU[U[60]]|=U[58]; qqU[U[58]]|=U[60];
      rU[row[61]]|=U[61]; qqU[U[61]]|=U[59]; qqU[U[59]]|=U[61];

  for (G[62]=A^(rU[row[62]]|cU[col[62]]); G[62]!=0; G[62]&=(G[62]-1)) { // rd
  U[62]=(G[62]&-G[62]); rU[row[62]]|=U[62]; cU[col[62]]|=U[62];

  for (G[63]=A^(rU[row[63]]|cU[col[63]]|qqU[U[62]]); G[63]!=0; G[63]&=(G[63]-1)) { // cd
  U[63]=(G[63]&-G[63]); rU[row[63]]|=U[63]; cU[col[63]]|=U[63]; qqU[U[63]]|=U[62]; qqU[U[62]]|=U[63];

  for (G[64]=A^(rU[row[64]]|cU[col[64]]); G[64]!=0; G[64]&=(G[64]-1)) { // rd
  U[64]=(G[64]&-G[64]); rU[row[64]]|=U[64]; cU[col[64]]|=U[64];

  for (G[65]=A^(rU[row[65]]|cU[col[65]]|qqU[U[64]]); G[65]!=0; G[65]&=(G[65]-1)) { // cd
  U[65]=(G[65]&-G[65]); rU[row[65]]|=U[65]; cU[col[65]]|=U[65]; qqU[U[65]]|=U[64]; qqU[U[64]]|=U[65];

  for (G[66]=A^(rU[row[66]]|cU[col[66]]); G[66]!=0; G[66]&=(G[66]-1)) { // rd
  U[66]=(G[66]&-G[66]); rU[row[66]]|=U[66]; cU[col[66]]|=U[66];
  
  for (G[67]=A^(rU[row[67]]|cU[col[67]]|qqU[U[66]]); G[67]!=0; G[67]&=(G[67]-1)) { // cd
  U[67]=(G[67]&-G[67]); rU[row[67]]|=U[67]; cU[col[67]]|=U[67]; qqU[U[67]]|=U[66]; qqU[U[66]]|=U[67];

  for (G[68]=A^(rU[row[68]]|cU[col[68]]); G[68]!=0; G[68]&=(G[68]-1)) { // rd, rl
  U[68]=(G[68]&-G[68]); rU[row[68]]|=U[68];

      U[69]=rU[row[69]]^A; if (cU[col[69]]&U[69]) { rU[row[68]]^=U[68]; continue; }
      cU[col[69]]|=U[69]; cU[col[68]]|=U[68];

  for (G[70]=A^(rU[row[70]]|cU[col[70]]|qqU[U[68]]); G[70]!=0; G[70]&=(G[70]-1)) { // cd, cl
  U[70]=(G[70]&-G[70]); cU[col[70]]|=U[70];

      U[71]=cU[col[71]]^A; if ((rU[row[71]]&U[71])||(U[71]&qqU[U[69]])
                                ||((U[69]==U[70])&&(U[68]==U[71]))) { cU[col[70]]^=U[70]; continue; }
      rU[row[70]]|=U[70]; qqU[U[70]]|=U[68]; qqU[U[68]]|=U[70];
      rU[row[71]]|=U[71]; qqU[U[71]]|=U[69]; qqU[U[69]]|=U[71];

  for (G[72]=A^(rU[row[72]]|cU[col[72]]); G[72]!=0; G[72]&=(G[72]-1)) { // rd
  U[72]=(G[72]&-G[72]); rU[row[72]]|=U[72]; cU[col[72]]|=U[72];

  for (G[73]=A^(rU[row[73]]|cU[col[73]]|qqU[U[72]]); G[73]!=0; G[73]&=(G[73]-1)) { // cd
  U[73]=(G[73]&-G[73]); rU[row[73]]|=U[73]; cU[col[73]]|=U[73]; qqU[U[73]]|=U[72]; qqU[U[72]]|=U[73];

  for (G[74]=A^(rU[row[74]]|cU[col[74]]); G[74]!=0; G[74]&=(G[74]-1)) { // rd
  U[74]=(G[74]&-G[74]); rU[row[74]]|=U[74]; cU[col[74]]|=U[74];
  
  for (G[75]=A^(rU[row[75]]|cU[col[75]]|qqU[U[74]]); G[75]!=0; G[75]&=(G[75]-1)) { // cd
  U[75]=(G[75]&-G[75]); rU[row[75]]|=U[75]; cU[col[75]]|=U[75]; qqU[U[75]]|=U[74]; qqU[U[74]]|=U[75];

  for (G[76]=A^(rU[row[76]]|cU[col[76]]); G[76]!=0; G[76]&=(G[76]-1)) { // rd, rl
  U[76]=(G[76]&-G[76]); rU[row[76]]|=U[76];

      U[77]=rU[row[77]]^A; if (cU[col[77]]&U[77]) { rU[row[76]]^=U[76]; continue; }
      cU[col[77]]|=U[77]; cU[col[76]]|=U[76];

  for (G[78]=A^(rU[row[78]]|cU[col[78]]|qqU[U[76]]); G[78]!=0; G[78]&=(G[78]-1)) { // cd, cl
  U[78]=(G[78]&-G[78]); cU[col[78]]|=U[78];

      U[79]=cU[col[79]]^A; if ((rU[row[79]]&U[79])||(U[79]&qqU[U[77]])
                                ||((U[77]==U[78])&&(U[76]==U[79]))) { cU[col[78]]^=U[78]; continue; }
      rU[row[78]]|=U[78]; qqU[U[78]]|=U[76]; qqU[U[76]]|=U[78];
      rU[row[79]]|=U[79]; qqU[U[79]]|=U[77]; qqU[U[77]]|=U[79];

  for (G[80]=A^(rU[row[80]]|cU[col[80]]); G[80]!=0; G[80]&=(G[80]-1)) { // rd
  U[80]=(G[80]&-G[80]); rU[row[80]]|=U[80]; cU[col[80]]|=U[80];

  for (G[81]=A^(rU[row[81]]|cU[col[81]]|qqU[U[80]]); G[81]!=0; G[81]&=(G[81]-1)) { // cd
  U[81]=(G[81]&-G[81]); rU[row[81]]|=U[81]; cU[col[81]]|=U[81]; qqU[U[81]]|=U[80]; qqU[U[80]]|=U[81];

  for (G[82]=A^(rU[row[82]]|cU[col[82]]); G[82]!=0; G[82]&=(G[82]-1)) { // rd
  U[82]=(G[82]&-G[82]); rU[row[82]]|=U[82]; cU[col[82]]|=U[82];
  
  for (G[83]=A^(rU[row[83]]|cU[col[83]]|qqU[U[82]]); G[83]!=0; G[83]&=(G[83]-1)) { // cd
  U[83]=(G[83]&-G[83]); rU[row[83]]|=U[83]; cU[col[83]]|=U[83]; qqU[U[83]]|=U[82]; qqU[U[82]]|=U[83];

  for (G[84]=A^(rU[row[84]]|cU[col[84]]); G[84]!=0; G[84]&=(G[84]-1)) { // rd, rl
  U[84]=(G[84]&-G[84]); rU[row[84]]|=U[84];

      U[85]=rU[row[85]]^A; if (cU[col[85]]&U[85]) { rU[row[84]]^=U[84]; continue; }
      cU[col[85]]|=U[85]; cU[col[84]]|=U[84];

  for (G[86]=A^(rU[row[86]]|cU[col[86]]|qqU[U[84]]); G[86]!=0; G[86]&=(G[86]-1)) { // cd, cl
  U[86]=(G[86]&-G[86]); cU[col[86]]|=U[86];

      U[87]=cU[col[87]]^A; if ((rU[row[87]]&U[87])||(U[87]&qqU[U[85]])
                                ||((U[85]==U[86])&&(U[84]==U[87]))) { cU[col[86]]^=U[86]; continue; }
      rU[row[86]]|=U[86]; qqU[U[86]]|=U[84]; qqU[U[84]]|=U[86];
      rU[row[87]]|=U[87]; qqU[U[87]]|=U[85]; qqU[U[85]]|=U[87];

  for (G[88]=A^(rU[row[88]]|cU[col[88]]); G[88]!=0; G[88]&=(G[88]-1)) { // rd
  U[88]=(G[88]&-G[88]); rU[row[88]]|=U[88]; cU[col[88]]|=U[88];
  
  for (G[89]=A^(rU[row[89]]|cU[col[89]]|qqU[U[88]]); G[89]!=0; G[89]&=(G[89]-1)) { // cd
  U[89]=(G[89]&-G[89]); rU[row[89]]|=U[89]; cU[col[89]]|=U[89]; qqU[U[89]]|=U[88]; qqU[U[88]]|=U[89];

  for (G[90]=A^(rU[row[90]]|cU[col[90]]); G[90]!=0; G[90]&=(G[90]-1)) { // rd, rl
  U[90]=(G[90]&-G[90]); rU[row[90]]|=U[90];

      U[91]=rU[row[91]]^A; if (cU[col[91]]&U[91]) { rU[row[90]]^=U[90]; continue; }
      cU[col[91]]|=U[91]; cU[col[90]]|=U[90];

  for (G[92]=A^(rU[row[92]]|cU[col[92]]|qqU[U[90]]); G[92]!=0; G[92]&=(G[92]-1)) { // cd, cl
  U[92]=(G[92]&-G[92]); cU[col[92]]|=U[92];

      U[93]=cU[col[93]]^A; if ((rU[row[93]]&U[93])||(U[93]&qqU[U[91]])
                                ||((U[91]==U[92])&&(U[90]==U[93]))) { cU[col[92]]^=U[92]; continue; }
      rU[row[92]]|=U[92]; qqU[U[92]]|=U[90]; qqU[U[90]]|=U[92];
      rU[row[93]]|=U[93]; qqU[U[93]]|=U[91]; qqU[U[91]]|=U[93];

  for (G[94]=A^(rU[row[94]]|cU[col[94]]); G[94]!=0; G[94]&=(G[94]-1)) { // rd 
  U[94]=(G[94]&-G[94]); rU[row[94]]|=U[94];

      if (makeSODLS1(wfp)) {
        ++count; printf("%d ", count); printElapsedTime(startTime, " "); printSODLS(Q, stdout);
      }
resume:
  rU[row[94]]^=U[94];
  }
  rU[row[93]]^=U[93]; qqU[U[93]]^=U[91]; qqU[U[91]]^=U[93];
  rU[row[92]]^=U[92]; cU[col[92]]^=U[92]; qqU[U[92]]^=U[90]; qqU[U[90]]^=U[92];
  } // cd, cl
  cU[col[91]]^=U[91]; rU[row[90]]^=U[90]; cU[col[90]]^=U[90];
  } // rd, rl
  rU[row[89]]^=U[89]; cU[col[89]]^=U[89]; qqU[U[89]]^=U[88]; qqU[U[88]]^=U[89];
  } // cd
  rU[row[88]]^=U[88]; cU[col[88]]^=U[88];
  } // rd
  rU[row[87]]^=U[87]; qqU[U[87]]^=U[85]; qqU[U[85]]^=U[87];
  rU[row[86]]^=U[86]; cU[col[86]]^=U[86]; qqU[U[86]]^=U[84]; qqU[U[84]]^=U[86];
  } // cd, cl
  cU[col[85]]^=U[85]; rU[row[84]]^=U[84]; cU[col[84]]^=U[84];
  } // rd, rl
  rU[row[83]]^=U[83]; cU[col[83]]^=U[83]; qqU[U[83]]^=U[82]; qqU[U[82]]^=U[83];
  } // cd
  rU[row[82]]^=U[82]; cU[col[82]]^=U[82];
  } // rd
  rU[row[81]]^=U[81]; cU[col[81]]^=U[81]; qqU[U[81]]^=U[80]; qqU[U[80]]^=U[81];
  } // cd
  rU[row[80]]^=U[80]; cU[col[80]]^=U[80]; 
  } // rd
  rU[row[79]]^=U[79]; qqU[U[79]]^=U[77]; qqU[U[77]]^=U[79];
  rU[row[78]]^=U[78]; cU[col[78]]^=U[78]; qqU[U[78]]^=U[76]; qqU[U[76]]^=U[78];
  } // cd, cl
  cU[col[77]]^=U[77]; rU[row[76]]^=U[76]; cU[col[76]]^=U[76];
  } // rd, rl
  rU[row[75]]^=U[75]; cU[col[75]]^=U[75]; qqU[U[75]]^=U[74]; qqU[U[74]]^=U[75];
  } // cd
  rU[row[74]]^=U[74]; cU[col[74]]^=U[74];
  } // rd
  rU[row[73]]^=U[73]; cU[col[73]]^=U[73]; qqU[U[73]]^=U[72]; qqU[U[72]]^=U[73];
  } // cd
  rU[row[72]]^=U[72]; cU[col[72]]^=U[72]; 
  } // rd
  rU[row[71]]^=U[71]; qqU[U[71]]^=U[69]; qqU[U[69]]^=U[71];
  rU[row[70]]^=U[70]; cU[col[70]]^=U[70]; qqU[U[70]]^=U[68]; qqU[U[68]]^=U[70];
  } // cd, cl
  cU[col[69]]^=U[69]; rU[row[68]]^=U[68]; cU[col[68]]^=U[68];
  } // rd, rl
  rU[row[67]]^=U[67]; cU[col[67]]^=U[67]; qqU[U[67]]^=U[66]; qqU[U[66]]^=U[67];
  } // cd
  rU[row[66]]^=U[66]; cU[col[66]]^=U[66];
  } // rd
  rU[row[65]]^=U[65]; cU[col[65]]^=U[65]; qqU[U[65]]^=U[64]; qqU[U[64]]^=U[65];
  } // cd
  rU[row[64]]^=U[64]; cU[col[64]]^=U[64]; 
  } // rd
  rU[row[63]]^=U[63]; cU[col[63]]^=U[63]; qqU[U[63]]^=U[62]; qqU[U[62]]^=U[63];
  } // cd
  rU[row[62]]^=U[62]; cU[col[62]]^=U[62];
  } // rd
  rU[row[61]]^=U[61]; qqU[U[61]]^=U[59]; qqU[U[59]]^=U[61];
  rU[row[60]]^=U[60]; cU[col[60]]^=U[60]; qqU[U[60]]^=U[58]; qqU[U[58]]^=U[60];
  } // cd, cl
  cU[col[59]]^=U[59]; rU[row[58]]^=U[58]; cU[col[58]]^=U[58];
  } // rd, rl
  rU[row[57]]^=U[57]; cU[col[57]]^=U[57]; qqU[U[57]]^=U[56]; qqU[U[56]]^=U[57];
  } // cd
  rU[row[56]]^=U[56]; cU[col[56]]^=U[56];
  } // rd
  rU[row[55]]^=U[55]; cU[col[55]]^=U[55]; qqU[U[55]]^=U[54]; qqU[U[54]]^=U[55];
  } // cd
  rU[row[54]]^=U[54]; cU[col[54]]^=U[54]; 
  } // rd
  rU[row[53]]^=U[53]; cU[col[53]]^=U[53]; qqU[U[53]]^=U[52]; qqU[U[52]]^=U[53];
  } // cd
  rU[row[52]]^=U[52]; cU[col[52]]^=U[52];
  } // rd
  rU[row[51]]^=U[51]; cU[col[51]]^=U[51]; qqU[U[51]]^=U[50]; qqU[U[50]]^=U[51];
  } // cd
  rU[row[50]]^=U[50]; cU[col[50]]^=U[50];
  } // rd
  rU[row[49]]^=U[49]; qqU[U[49]]^=U[47]; qqU[U[47]]^=U[49];
  rU[row[48]]^=U[48]; cU[col[48]]^=U[48]; qqU[U[48]]^=U[46]; qqU[U[46]]^=U[48];
  } // cd, cl
  cU[col[47]]^=U[47]; rU[row[46]]^=U[46]; cU[col[46]]^=U[46];
  } // rd, rl
  rU[row[45]]^=U[45]; cU[col[45]]^=U[45]; qqU[U[45]]^=U[44]; qqU[U[44]]^=U[45];
  } // cd
  rU[row[44]]^=U[44]; cU[col[44]]^=U[44];
  } // rd
  rU[row[43]]^=U[43]; cU[col[43]]^=U[43]; qqU[U[43]]^=U[42]; qqU[U[42]]^=U[43];
  } // cd
  rU[row[42]]^=U[42]; cU[col[42]]^=U[42]; 
  } // rd
  rU[row[41]]^=U[41]; cU[col[41]]^=U[41]; qqU[U[41]]^=U[40]; qqU[U[40]]^=U[41];
  } // cd
  rU[row[40]]^=U[40]; cU[col[40]]^=U[40];
  } // rd
  rU[row[39]]^=U[39]; cU[col[39]]^=U[39]; qqU[U[39]]^=U[38]; qqU[U[38]]^=U[39];
  } // cd
  rU[row[38]]^=U[38]; cU[col[38]]^=U[38];
  } // rd
  rU[row[37]]^=U[37]; cU[col[37]]^=U[37]; qqU[U[37]]^=U[36]; qqU[U[36]]^=U[37];
  } // cd
  rU[row[36]]^=U[36]; cU[col[36]]^=U[36];
  } // rd
  rU[row[35]]^=U[35]; qqU[U[35]]^=U[8]; qqU[U[8]]^=U[35];
  rU[row[34]]^=U[34]; cU[col[34]]^=U[34]; qqU[U[34]]^=U[7]; qqU[U[7]]^=U[34];
  } // cd
  rU[row[33]]^=U[33]; cU[col[33]]^=U[33]; qqU[U[33]]^=U[6]; qqU[U[6]]^=U[33];
  } // rd
  rU[row[32]]^=U[32]; cU[col[32]]^=U[32]; qqU[U[32]]^=U[5]; qqU[U[5]]^=U[32];
  } // cd
  rU[row[31]]^=U[31]; cU[col[31]]^=U[31]; qqU[U[31]]^=U[4]; qqU[U[4]]^=U[31];
  } // rd
  rU[row[30]]^=U[30]; cU[col[30]]^=U[30]; qqU[U[30]]^=U[3]; qqU[U[3]]^=U[30];
  } // cd
  rU[row[29]]^=U[29]; cU[col[29]]^=U[29]; qqU[U[29]]^=U[2]; qqU[U[2]]^=U[29];
  } // cd
  rU[row[28]]^=U[28]; cU[col[28]]^=U[28]; qqU[U[28]]^=U[1]; qqU[U[1]]^=U[28];
  } // cd
  rU[row[26]]^=U[26]; cU[col[26]]^=U[26]; fdU^=U[26]; qqU[U[26]]^=U[27];
  rU[row[27]]^=U[27]; cU[col[27]]^=U[27]; qqU[U[27]]^=U[26];
  } // fd, fE
  rU[row[25]]^=U[25]; cU[col[25]]^=U[25]; fdU^=U[25]; qqU[U[25]]^=U[24]; qqU[U[24]]^=U[25];
  } // fd
  rU[row[24]]^=U[24]; cU[col[24]]^=U[24]; fdU^=U[24];
  } // fd
  rU[row[23]]^=U[23]; cU[col[23]]^=U[23]; fdU^=U[23]; qqU[U[23]]^=U[22]; qqU[U[22]]^=U[23];
  } // fd
  rU[row[22]]^=U[22]; cU[col[22]]^=U[22]; fdU^=U[22];
  } // fd
  rU[row[21]]^=U[21]; cU[col[21]]^=U[21]; fdU^=U[21]; qqU[U[21]]^=U[20]; qqU[U[20]]^=U[21];
  } // fd
  rU[row[20]]^=U[20]; cU[col[20]]^=U[20]; fdU^=U[20];
  } // fd
  return count;
} // makeSODLSls

int makeSODLSbd(FILE *wfp) {
//  -----------
  int v0=-1; if (!initSODLS(T, &v0)) return 0; int count=0, bv0=B[v0]; time_t startTime=time(NULL);

  U[19]=bv0; rU[row[19]]|=bv0; cU[col[19]]|=bv0; qqU[U[19]]|=U[9]; qqU[U[9]]|=U[19]; fdU|=bv0; // fd

  for (G[20]=A^(rU[row[20]]|cU[col[20]]|fdU); G[20]!=0; G[20]&=(G[20]-1)) { // fd
  U[20]=(G[20]&-G[20]); rU[row[20]]|=U[20]; cU[col[20]]|=U[20]; fdU|=U[20];

  for (G[21]=A^(rU[row[21]]|cU[col[21]]|fdU); G[21]!=0; G[21]&=(G[21]-1)) { // fd
  U[21]=(G[21]&-G[21]); rU[row[21]]|=U[21]; cU[col[21]]|=U[21]; fdU|=U[21]; qqU[U[21]]|=U[20]; qqU[U[20]]|=U[21];

  for (G[22]=A^(rU[row[22]]|cU[col[22]]|fdU); G[22]!=0; G[22]&=(G[22]-1)) { // fd
  U[22]=(G[22]&-G[22]); rU[row[22]]|=U[22]; cU[col[22]]|=U[22]; fdU|=U[22];

  for (G[23]=A^(rU[row[23]]|cU[col[23]]|fdU); G[23]!=0; G[23]&=(G[23]-1)) { // fd
  U[23]=(G[23]&-G[23]); rU[row[23]]|=U[23]; cU[col[23]]|=U[23]; fdU|=U[23]; qqU[U[23]]|=U[22]; qqU[U[22]]|=U[23];

  for (G[24]=A^(rU[row[24]]|cU[col[24]]|fdU); G[24]!=0; G[24]&=(G[24]-1)) { // fd
  U[24]=(G[24]&-G[24]); rU[row[24]]|=U[24]; cU[col[24]]|=U[24]; fdU|=U[24];

  for (G[25]=A^(rU[row[25]]|cU[col[25]]|fdU); G[25]!=0; G[25]&=(G[25]-1)) { // fd
  U[25]=(G[25]&-G[25]); rU[row[25]]|=U[25]; cU[col[25]]|=U[25]; fdU|=U[25]; qqU[U[25]]|=U[24]; qqU[U[24]]|=U[25];

  for (G[26]=A^(rU[row[26]]|cU[col[26]]|fdU); G[26]!=0; G[26]&=(G[26]-1)) { // fd
  U[26]=(G[26]&-G[26]); fdU|=U[26];

       U[27]=fdU^A; if ((rU[row[27]]&U[27])||(cU[col[27]]&U[27])) { fdU^=U[26]; continue; }
       rU[row[27]]|=U[27]; cU[col[27]]|=U[27]; qqU[U[27]]|=U[26];
       rU[row[26]]|=U[26]; cU[col[26]]|=U[26]; qqU[U[26]]|=U[27];

  for (G[28]=A^(rU[row[28]]|cU[col[28]]|qqU[U[1]]); G[28]!=0; G[28]&=(G[28]-1)) { // cd
  U[28]=(G[28]&-G[28]); rU[row[28]]|=U[28]; cU[col[28]]|=U[28];
  qqU[U[28]]|=U[1]; qqU[U[1]]|=U[28];

  for (G[29]=A^(rU[row[29]]|cU[col[29]]|qqU[U[2]]); G[29]!=0; G[29]&=(G[29]-1)) { // cd
  U[29]=(G[29]&-G[29]); rU[row[29]]|=U[29]; cU[col[29]]|=U[29];
  qqU[U[29]]|=U[2]; qqU[U[2]]|=U[29];

  for (G[30]=A^(rU[row[30]]|cU[col[30]]|qqU[U[3]]); G[30]!=0; G[30]&=(G[30]-1)) { // cd
  U[30]=(G[30]&-G[30]); rU[row[30]]|=U[30]; cU[col[30]]|=U[30];
  qqU[U[30]]|=U[3]; qqU[U[3]]|=U[30];

  for (G[31]=A^(rU[row[31]]|cU[col[31]]|qqU[U[4]]); G[31]!=0; G[31]&=(G[31]-1)) { // cd
  U[31]=(G[31]&-G[31]); rU[row[31]]|=U[31]; cU[col[31]]|=U[31];
  qqU[U[31]]|=U[4]; qqU[U[4]]|=U[31];

  for (G[32]=A^(rU[row[32]]|cU[col[32]]|qqU[U[5]]); G[32]!=0; G[32]&=(G[32]-1)) { // cd
  U[32]=(G[32]&-G[32]); rU[row[32]]|=U[32]; cU[col[32]]|=U[32];
  qqU[U[32]]|=U[5]; qqU[U[5]]|=U[32];

  for (G[33]=A^(rU[row[33]]|cU[col[33]]|qqU[U[6]]); G[33]!=0; G[33]&=(G[33]-1)) { // cd
  U[33]=(G[33]&-G[33]); rU[row[33]]|=U[33]; cU[col[33]]|=U[33];
  qqU[U[33]]|=U[6]; qqU[U[6]]|=U[33];

  for (G[34]=A^(rU[row[34]]|cU[col[34]]|qqU[U[7]]); G[34]!=0; G[34]&=(G[34]-1)) { // cd, cl
  U[34]=(G[34]&-G[34]); cU[col[34]]|=U[34];

      U[35]=cU[col[35]]^A; if ((rU[row[35]]&U[35])||(U[35]&qqU[U[8]])
                                ||((U[8]==U[34])&&(U[7]==U[35]))) { cU[col[34]]^=U[34]; continue; }
      rU[row[35]]|=U[35]; qqU[U[35]]|=U[8]; qqU[U[8]]|=U[35];
      rU[row[34]]|=U[34]; qqU[U[34]]|=U[7]; qqU[U[7]]|=U[34];

  for (G[36]=A^(rU[row[36]]|cU[col[36]]); G[36]!=0; G[36]&=(G[36]-1)) { // rd
  U[36]=(G[36]&-G[36]); rU[row[36]]|=U[36]; cU[col[36]]|=U[36];

  for (G[37]=A^(rU[row[37]]|cU[col[37]]|qqU[U[36]]); G[37]!=0; G[37]&=(G[37]-1)) { // cd
  U[37]=(G[37]&-G[37]); rU[row[37]]|=U[37]; cU[col[37]]|=U[37]; qqU[U[37]]|=U[36]; qqU[U[36]]|=U[37];

  for (G[38]=A^(rU[row[38]]|cU[col[38]]); G[38]!=0; G[38]&=(G[38]-1)) { // rd
  U[38]=(G[38]&-G[38]); rU[row[38]]|=U[38]; cU[col[38]]|=U[38];
 
  for (G[39]=A^(rU[row[39]]|cU[col[39]]|qqU[U[38]]); G[39]!=0; G[39]&=(G[39]-1)) { // cd
  U[39]=(G[39]&-G[39]); rU[row[39]]|=U[39]; cU[col[39]]|=U[39]; qqU[U[39]]|=U[38]; qqU[U[38]]|=U[39];

  for (G[40]=A^(rU[row[40]]|cU[col[40]]); G[40]!=0; G[40]&=(G[40]-1)) { // rd
  U[40]=(G[40]&-G[40]); rU[row[40]]|=U[40]; cU[col[40]]|=U[40];

  for (G[41]=A^(rU[row[41]]|cU[col[41]]|qqU[U[40]]); G[41]!=0; G[41]&=(G[41]-1)) { // cd
  U[41]=(G[41]&-G[41]); rU[row[41]]|=U[41]; cU[col[41]]|=U[41]; qqU[U[41]]|=U[40]; qqU[U[40]]|=U[41];

  for (G[42]=A^(rU[row[42]]|cU[col[42]]); G[42]!=0; G[42]&=(G[42]-1)) { // rd
  U[42]=(G[42]&-G[42]); rU[row[42]]|=U[42]; cU[col[42]]|=U[42];

  for (G[43]=A^(rU[row[43]]|cU[col[43]]|qqU[U[42]]); G[43]!=0; G[43]&=(G[43]-1)) { // cd
  U[43]=(G[43]&-G[43]); rU[row[43]]|=U[43]; cU[col[43]]|=U[43]; qqU[U[43]]|=U[42]; qqU[U[42]]|=U[43];

  for (G[44]=A^(rU[row[44]]|cU[col[44]]); G[44]!=0; G[44]&=(G[44]-1)) { // rd
  U[44]=(G[44]&-G[44]); rU[row[44]]|=U[44]; cU[col[44]]|=U[44];
  
  for (G[45]=A^(rU[row[45]]|cU[col[45]]|qqU[U[44]]); G[45]!=0; G[45]&=(G[45]-1)) { // cd
  U[45]=(G[45]&-G[45]); rU[row[45]]|=U[45]; cU[col[45]]|=U[45]; qqU[U[45]]|=U[44]; qqU[U[44]]|=U[45];

  for (G[46]=A^(rU[row[46]]|cU[col[46]]); G[46]!=0; G[46]&=(G[46]-1)) { // rd, rl
  U[46]=(G[46]&-G[46]); rU[row[46]]|=U[46];

      U[47]=rU[row[47]]^A; if (cU[col[47]]&U[47]) { rU[row[46]]^=U[46]; continue; }
      cU[col[47]]|=U[47]; cU[col[46]]|=U[46];

  for (G[48]=A^(rU[row[48]]|cU[col[48]]|qqU[U[46]]); G[48]!=0; G[48]&=(G[48]-1)) { // cd, cl
  U[48]=(G[48]&-G[48]); cU[col[48]]|=U[48];

      U[49]=cU[col[49]]^A; if ((rU[row[49]]&U[49])||(U[49]&qqU[U[47]])
                                ||((U[47]==U[48])&&(U[46]==U[49]))) { cU[col[48]]^=U[48]; continue; }
      rU[row[48]]|=U[48]; qqU[U[48]]|=U[46]; qqU[U[46]]|=U[48];
      rU[row[49]]|=U[49]; qqU[U[49]]|=U[47]; qqU[U[47]]|=U[49];

  for (G[50]=A^(rU[row[50]]|cU[col[50]]); G[50]!=0; G[50]&=(G[50]-1)) { // rd
  U[50]=(G[50]&-G[50]); rU[row[50]]|=U[50]; cU[col[50]]|=U[50];
 
  for (G[51]=A^(rU[row[51]]|cU[col[51]]|qqU[U[50]]); G[51]!=0; G[51]&=(G[51]-1)) { // cd
  U[51]=(G[51]&-G[51]); rU[row[51]]|=U[51]; cU[col[51]]|=U[51]; qqU[U[51]]|=U[50]; qqU[U[50]]|=U[51];

  for (G[52]=A^(rU[row[52]]|cU[col[52]]); G[52]!=0; G[52]&=(G[52]-1)) { // rd
  U[52]=(G[52]&-G[52]); rU[row[52]]|=U[52]; cU[col[52]]|=U[52];

  for (G[53]=A^(rU[row[53]]|cU[col[53]]|qqU[U[52]]); G[53]!=0; G[53]&=(G[53]-1)) { // cd
  U[53]=(G[53]&-G[53]); rU[row[53]]|=U[53]; cU[col[53]]|=U[53]; qqU[U[53]]|=U[52]; qqU[U[52]]|=U[53];

  for (G[54]=A^(rU[row[54]]|cU[col[54]]); G[54]!=0; G[54]&=(G[54]-1)) { // rd
  U[54]=(G[54]&-G[54]); rU[row[54]]|=U[54]; cU[col[54]]|=U[54];

  for (G[55]=A^(rU[row[55]]|cU[col[55]]|qqU[U[54]]); G[55]!=0; G[55]&=(G[55]-1)) { // cd
  U[55]=(G[55]&-G[55]); rU[row[55]]|=U[55]; cU[col[55]]|=U[55]; qqU[U[55]]|=U[54]; qqU[U[54]]|=U[55];

  for (G[56]=A^(rU[row[56]]|cU[col[56]]); G[56]!=0; G[56]&=(G[56]-1)) { // rd
  U[56]=(G[56]&-G[56]); rU[row[56]]|=U[56]; cU[col[56]]|=U[56];
  
  for (G[57]=A^(rU[row[57]]|cU[col[57]]|qqU[U[56]]); G[57]!=0; G[57]&=(G[57]-1)) { // cd
  U[57]=(G[57]&-G[57]); rU[row[57]]|=U[57]; cU[col[57]]|=U[57]; qqU[U[57]]|=U[56]; qqU[U[56]]|=U[57];

  for (G[58]=A^(rU[row[58]]|cU[col[58]]); G[58]!=0; G[58]&=(G[58]-1)) { // rd, rl
  U[58]=(G[58]&-G[58]); rU[row[58]]|=U[58];

      U[59]=rU[row[59]]^A; if (cU[col[59]]&U[59]) { rU[row[58]]^=U[58]; continue; }
      cU[col[59]]|=U[59]; cU[col[58]]|=U[58];

  for (G[60]=A^(rU[row[60]]|cU[col[60]]|qqU[U[58]]); G[60]!=0; G[60]&=(G[60]-1)) { // cd, cl
  U[60]=(G[60]&-G[60]); cU[col[60]]|=U[60];

      U[61]=cU[col[61]]^A; if ((rU[row[61]]&U[61])||(U[61]&qqU[U[59]])
                                ||((U[59]==U[60])&&(U[58]==U[61]))) { cU[col[60]]^=U[60]; continue; }
      rU[row[60]]|=U[60]; qqU[U[60]]|=U[58]; qqU[U[58]]|=U[60];
      rU[row[61]]|=U[61]; qqU[U[61]]|=U[59]; qqU[U[59]]|=U[61];

  for (G[62]=A^(rU[row[62]]|cU[col[62]]); G[62]!=0; G[62]&=(G[62]-1)) { // rd
  U[62]=(G[62]&-G[62]); rU[row[62]]|=U[62]; cU[col[62]]|=U[62];

  for (G[63]=A^(rU[row[63]]|cU[col[63]]|qqU[U[62]]); G[63]!=0; G[63]&=(G[63]-1)) { // cd
  U[63]=(G[63]&-G[63]); rU[row[63]]|=U[63]; cU[col[63]]|=U[63]; qqU[U[63]]|=U[62]; qqU[U[62]]|=U[63];

  for (G[64]=A^(rU[row[64]]|cU[col[64]]); G[64]!=0; G[64]&=(G[64]-1)) { // rd
  U[64]=(G[64]&-G[64]); rU[row[64]]|=U[64]; cU[col[64]]|=U[64];

  for (G[65]=A^(rU[row[65]]|cU[col[65]]|qqU[U[64]]); G[65]!=0; G[65]&=(G[65]-1)) { // cd
  U[65]=(G[65]&-G[65]); rU[row[65]]|=U[65]; cU[col[65]]|=U[65]; qqU[U[65]]|=U[64]; qqU[U[64]]|=U[65];

  for (G[66]=A^(rU[row[66]]|cU[col[66]]); G[66]!=0; G[66]&=(G[66]-1)) { // rd
  U[66]=(G[66]&-G[66]); rU[row[66]]|=U[66]; cU[col[66]]|=U[66];
  
  for (G[67]=A^(rU[row[67]]|cU[col[67]]|qqU[U[66]]); G[67]!=0; G[67]&=(G[67]-1)) { // cd
  U[67]=(G[67]&-G[67]); rU[row[67]]|=U[67]; cU[col[67]]|=U[67]; qqU[U[67]]|=U[66]; qqU[U[66]]|=U[67];

  for (G[68]=A^(rU[row[68]]|cU[col[68]]); G[68]!=0; G[68]&=(G[68]-1)) { // rd, rl
  U[68]=(G[68]&-G[68]); rU[row[68]]|=U[68];

      U[69]=rU[row[69]]^A; if (cU[col[69]]&U[69]) { rU[row[68]]^=U[68]; continue; }
      cU[col[69]]|=U[69]; cU[col[68]]|=U[68];

  for (G[70]=A^(rU[row[70]]|cU[col[70]]|qqU[U[68]]); G[70]!=0; G[70]&=(G[70]-1)) { // cd, cl
  U[70]=(G[70]&-G[70]); cU[col[70]]|=U[70];

      U[71]=cU[col[71]]^A; if ((rU[row[71]]&U[71])||(U[71]&qqU[U[69]])
                                ||((U[69]==U[70])&&(U[68]==U[71]))) { cU[col[70]]^=U[70]; continue; }
      rU[row[70]]|=U[70]; qqU[U[70]]|=U[68]; qqU[U[68]]|=U[70];
      rU[row[71]]|=U[71]; qqU[U[71]]|=U[69]; qqU[U[69]]|=U[71];

  for (G[72]=A^(rU[row[72]]|cU[col[72]]); G[72]!=0; G[72]&=(G[72]-1)) { // rd
  U[72]=(G[72]&-G[72]); rU[row[72]]|=U[72]; cU[col[72]]|=U[72];

  for (G[73]=A^(rU[row[73]]|cU[col[73]]|qqU[U[72]]); G[73]!=0; G[73]&=(G[73]-1)) { // cd
  U[73]=(G[73]&-G[73]); rU[row[73]]|=U[73]; cU[col[73]]|=U[73]; qqU[U[73]]|=U[72]; qqU[U[72]]|=U[73];

  for (G[74]=A^(rU[row[74]]|cU[col[74]]); G[74]!=0; G[74]&=(G[74]-1)) { // rd
  U[74]=(G[74]&-G[74]); rU[row[74]]|=U[74]; cU[col[74]]|=U[74];
  
  for (G[75]=A^(rU[row[75]]|cU[col[75]]|qqU[U[74]]); G[75]!=0; G[75]&=(G[75]-1)) { // cd
  U[75]=(G[75]&-G[75]); rU[row[75]]|=U[75]; cU[col[75]]|=U[75]; qqU[U[75]]|=U[74]; qqU[U[74]]|=U[75];

  for (G[76]=A^(rU[row[76]]|cU[col[76]]); G[76]!=0; G[76]&=(G[76]-1)) { // rd, rl
  U[76]=(G[76]&-G[76]); rU[row[76]]|=U[76];

      U[77]=rU[row[77]]^A; if (cU[col[77]]&U[77]) { rU[row[76]]^=U[76]; continue; }
      cU[col[77]]|=U[77]; cU[col[76]]|=U[76];

  for (G[78]=A^(rU[row[78]]|cU[col[78]]|qqU[U[76]]); G[78]!=0; G[78]&=(G[78]-1)) { // cd, cl
  U[78]=(G[78]&-G[78]); cU[col[78]]|=U[78];

      U[79]=cU[col[79]]^A; if ((rU[row[79]]&U[79])||(U[79]&qqU[U[77]])
                                ||((U[77]==U[78])&&(U[76]==U[79]))) { cU[col[78]]^=U[78]; continue; }
      rU[row[78]]|=U[78]; qqU[U[78]]|=U[76]; qqU[U[76]]|=U[78];
      rU[row[79]]|=U[79]; qqU[U[79]]|=U[77]; qqU[U[77]]|=U[79];

  for (G[80]=A^(rU[row[80]]|cU[col[80]]); G[80]!=0; G[80]&=(G[80]-1)) { // rd
  U[80]=(G[80]&-G[80]); rU[row[80]]|=U[80]; cU[col[80]]|=U[80];

  for (G[81]=A^(rU[row[81]]|cU[col[81]]|qqU[U[80]]); G[81]!=0; G[81]&=(G[81]-1)) { // cd
  U[81]=(G[81]&-G[81]); rU[row[81]]|=U[81]; cU[col[81]]|=U[81]; qqU[U[81]]|=U[80]; qqU[U[80]]|=U[81];

  for (G[82]=A^(rU[row[82]]|cU[col[82]]); G[82]!=0; G[82]&=(G[82]-1)) { // rd
  U[82]=(G[82]&-G[82]); rU[row[82]]|=U[82]; cU[col[82]]|=U[82];
  
  for (G[83]=A^(rU[row[83]]|cU[col[83]]|qqU[U[82]]); G[83]!=0; G[83]&=(G[83]-1)) { // cd
  U[83]=(G[83]&-G[83]); rU[row[83]]|=U[83]; cU[col[83]]|=U[83]; qqU[U[83]]|=U[82]; qqU[U[82]]|=U[83];

  for (G[84]=A^(rU[row[84]]|cU[col[84]]); G[84]!=0; G[84]&=(G[84]-1)) { // rd, rl
  U[84]=(G[84]&-G[84]); rU[row[84]]|=U[84];

      U[85]=rU[row[85]]^A; if (cU[col[85]]&U[85]) { rU[row[84]]^=U[84]; continue; }
      cU[col[85]]|=U[85]; cU[col[84]]|=U[84];

  for (G[86]=A^(rU[row[86]]|cU[col[86]]|qqU[U[84]]); G[86]!=0; G[86]&=(G[86]-1)) { // cd, cl
  U[86]=(G[86]&-G[86]); cU[col[86]]|=U[86];

      U[87]=cU[col[87]]^A; if ((rU[row[87]]&U[87])||(U[87]&qqU[U[85]])
                                ||((U[85]==U[86])&&(U[84]==U[87]))) { cU[col[86]]^=U[86]; continue; }
      rU[row[86]]|=U[86]; qqU[U[86]]|=U[84]; qqU[U[84]]|=U[86];
      rU[row[87]]|=U[87]; qqU[U[87]]|=U[85]; qqU[U[85]]|=U[87];

  for (G[88]=A^(rU[row[88]]|cU[col[88]]); G[88]!=0; G[88]&=(G[88]-1)) { // rd
  U[88]=(G[88]&-G[88]); rU[row[88]]|=U[88]; cU[col[88]]|=U[88];
  
  for (G[89]=A^(rU[row[89]]|cU[col[89]]|qqU[U[88]]); G[89]!=0; G[89]&=(G[89]-1)) { // cd
  U[89]=(G[89]&-G[89]); rU[row[89]]|=U[89]; cU[col[89]]|=U[89]; qqU[U[89]]|=U[88]; qqU[U[88]]|=U[89];

  for (G[90]=A^(rU[row[90]]|cU[col[90]]); G[90]!=0; G[90]&=(G[90]-1)) { // rd, rl
  U[90]=(G[90]&-G[90]); rU[row[90]]|=U[90];

      U[91]=rU[row[91]]^A; if (cU[col[91]]&U[91]) { rU[row[90]]^=U[90]; continue; }
      cU[col[91]]|=U[91]; cU[col[90]]|=U[90];

  for (G[92]=A^(rU[row[92]]|cU[col[92]]|qqU[U[90]]); G[92]!=0; G[92]&=(G[92]-1)) { // cd, cl
  U[92]=(G[92]&-G[92]); cU[col[92]]|=U[92];

      U[93]=cU[col[93]]^A; if ((rU[row[93]]&U[93])||(U[93]&qqU[U[91]])
                                ||((U[91]==U[92])&&(U[90]==U[93]))) { cU[col[92]]^=U[92]; continue; }
      rU[row[92]]|=U[92]; qqU[U[92]]|=U[90]; qqU[U[90]]|=U[92];
      rU[row[93]]|=U[93]; qqU[U[93]]|=U[91]; qqU[U[91]]|=U[93];

  for (G[94]=A^(rU[row[94]]|cU[col[94]]); G[94]!=0; G[94]&=(G[94]-1)) { // rd 
  U[94]=(G[94]&-G[94]); rU[row[94]]|=U[94];

      if (makeSODLS1(wfp)) {
        ++count; printf("%d ", count); printElapsedTime(startTime, " "); printSODLS(Q, stdout);
      }

  rU[row[94]]^=U[94];
  }
  rU[row[93]]^=U[93]; qqU[U[93]]^=U[91]; qqU[U[91]]^=U[93];
  rU[row[92]]^=U[92]; cU[col[92]]^=U[92]; qqU[U[92]]^=U[90]; qqU[U[90]]^=U[92];
  } // cd, cl
  cU[col[91]]^=U[91]; rU[row[90]]^=U[90]; cU[col[90]]^=U[90];
  } // rd, rl
  rU[row[89]]^=U[89]; cU[col[89]]^=U[89]; qqU[U[89]]^=U[88]; qqU[U[88]]^=U[89];
  } // cd
  rU[row[88]]^=U[88]; cU[col[88]]^=U[88];
  } // rd
  rU[row[87]]^=U[87]; qqU[U[87]]^=U[85]; qqU[U[85]]^=U[87];
  rU[row[86]]^=U[86]; cU[col[86]]^=U[86]; qqU[U[86]]^=U[84]; qqU[U[84]]^=U[86];
  } // cd, cl
  cU[col[85]]^=U[85]; rU[row[84]]^=U[84]; cU[col[84]]^=U[84];
  } // rd, rl
  rU[row[83]]^=U[83]; cU[col[83]]^=U[83]; qqU[U[83]]^=U[82]; qqU[U[82]]^=U[83];
  } // cd
  rU[row[82]]^=U[82]; cU[col[82]]^=U[82];
  } // rd
  rU[row[81]]^=U[81]; cU[col[81]]^=U[81]; qqU[U[81]]^=U[80]; qqU[U[80]]^=U[81];
  } // cd
  rU[row[80]]^=U[80]; cU[col[80]]^=U[80]; 
  } // rd
  rU[row[79]]^=U[79]; qqU[U[79]]^=U[77]; qqU[U[77]]^=U[79];
  rU[row[78]]^=U[78]; cU[col[78]]^=U[78]; qqU[U[78]]^=U[76]; qqU[U[76]]^=U[78];
  } // cd, cl
  cU[col[77]]^=U[77]; rU[row[76]]^=U[76]; cU[col[76]]^=U[76];
  } // rd, rl
  rU[row[75]]^=U[75]; cU[col[75]]^=U[75]; qqU[U[75]]^=U[74]; qqU[U[74]]^=U[75];
  } // cd
  rU[row[74]]^=U[74]; cU[col[74]]^=U[74];
  } // rd
  rU[row[73]]^=U[73]; cU[col[73]]^=U[73]; qqU[U[73]]^=U[72]; qqU[U[72]]^=U[73];
  } // cd
  rU[row[72]]^=U[72]; cU[col[72]]^=U[72]; 
  } // rd
  rU[row[71]]^=U[71]; qqU[U[71]]^=U[69]; qqU[U[69]]^=U[71];
  rU[row[70]]^=U[70]; cU[col[70]]^=U[70]; qqU[U[70]]^=U[68]; qqU[U[68]]^=U[70];
  } // cd, cl
  cU[col[69]]^=U[69]; rU[row[68]]^=U[68]; cU[col[68]]^=U[68];
  } // rd, rl
  rU[row[67]]^=U[67]; cU[col[67]]^=U[67]; qqU[U[67]]^=U[66]; qqU[U[66]]^=U[67];
  } // cd
  rU[row[66]]^=U[66]; cU[col[66]]^=U[66];
  } // rd
  rU[row[65]]^=U[65]; cU[col[65]]^=U[65]; qqU[U[65]]^=U[64]; qqU[U[64]]^=U[65];
  } // cd
  rU[row[64]]^=U[64]; cU[col[64]]^=U[64]; 
  } // rd
  rU[row[63]]^=U[63]; cU[col[63]]^=U[63]; qqU[U[63]]^=U[62]; qqU[U[62]]^=U[63];
  } // cd
  rU[row[62]]^=U[62]; cU[col[62]]^=U[62];
  } // rd
  rU[row[61]]^=U[61]; qqU[U[61]]^=U[59]; qqU[U[59]]^=U[61];
  rU[row[60]]^=U[60]; cU[col[60]]^=U[60]; qqU[U[60]]^=U[58]; qqU[U[58]]^=U[60];
  } // cd, cl
  cU[col[59]]^=U[59]; rU[row[58]]^=U[58]; cU[col[58]]^=U[58];
  } // rd, rl
  rU[row[57]]^=U[57]; cU[col[57]]^=U[57]; qqU[U[57]]^=U[56]; qqU[U[56]]^=U[57];
  } // cd
  rU[row[56]]^=U[56]; cU[col[56]]^=U[56];
  } // rd
  rU[row[55]]^=U[55]; cU[col[55]]^=U[55]; qqU[U[55]]^=U[54]; qqU[U[54]]^=U[55];
  } // cd
  rU[row[54]]^=U[54]; cU[col[54]]^=U[54]; 
  } // rd
  rU[row[53]]^=U[53]; cU[col[53]]^=U[53]; qqU[U[53]]^=U[52]; qqU[U[52]]^=U[53];
  } // cd
  rU[row[52]]^=U[52]; cU[col[52]]^=U[52];
  } // rd
  rU[row[51]]^=U[51]; cU[col[51]]^=U[51]; qqU[U[51]]^=U[50]; qqU[U[50]]^=U[51];
  } // cd
  rU[row[50]]^=U[50]; cU[col[50]]^=U[50];
  } // rd
  rU[row[49]]^=U[49]; qqU[U[49]]^=U[47]; qqU[U[47]]^=U[49];
  rU[row[48]]^=U[48]; cU[col[48]]^=U[48]; qqU[U[48]]^=U[46]; qqU[U[46]]^=U[48];
  } // cd, cl
  cU[col[47]]^=U[47]; rU[row[46]]^=U[46]; cU[col[46]]^=U[46];
  } // rd, rl
  rU[row[45]]^=U[45]; cU[col[45]]^=U[45]; qqU[U[45]]^=U[44]; qqU[U[44]]^=U[45];
  } // cd
  rU[row[44]]^=U[44]; cU[col[44]]^=U[44];
  } // rd
  rU[row[43]]^=U[43]; cU[col[43]]^=U[43]; qqU[U[43]]^=U[42]; qqU[U[42]]^=U[43];
  } // cd
  rU[row[42]]^=U[42]; cU[col[42]]^=U[42]; 
  } // rd
  rU[row[41]]^=U[41]; cU[col[41]]^=U[41]; qqU[U[41]]^=U[40]; qqU[U[40]]^=U[41];
  } // cd
  rU[row[40]]^=U[40]; cU[col[40]]^=U[40];
  } // rd
  rU[row[39]]^=U[39]; cU[col[39]]^=U[39]; qqU[U[39]]^=U[38]; qqU[U[38]]^=U[39];
  } // cd
  rU[row[38]]^=U[38]; cU[col[38]]^=U[38];
  } // rd
  rU[row[37]]^=U[37]; cU[col[37]]^=U[37]; qqU[U[37]]^=U[36]; qqU[U[36]]^=U[37];
  } // cd
  rU[row[36]]^=U[36]; cU[col[36]]^=U[36];
  } // rd
  rU[row[35]]^=U[35]; qqU[U[35]]^=U[8]; qqU[U[8]]^=U[35];
  rU[row[34]]^=U[34]; cU[col[34]]^=U[34]; qqU[U[34]]^=U[7]; qqU[U[7]]^=U[34];
  } // cd
  rU[row[33]]^=U[33]; cU[col[33]]^=U[33]; qqU[U[33]]^=U[6]; qqU[U[6]]^=U[33];
  } // rd
  rU[row[32]]^=U[32]; cU[col[32]]^=U[32]; qqU[U[32]]^=U[5]; qqU[U[5]]^=U[32];
  } // cd
  rU[row[31]]^=U[31]; cU[col[31]]^=U[31]; qqU[U[31]]^=U[4]; qqU[U[4]]^=U[31];
  } // rd
  rU[row[30]]^=U[30]; cU[col[30]]^=U[30]; qqU[U[30]]^=U[3]; qqU[U[3]]^=U[30];
  } // cd
  rU[row[29]]^=U[29]; cU[col[29]]^=U[29]; qqU[U[29]]^=U[2]; qqU[U[2]]^=U[29];
  } // cd
  rU[row[28]]^=U[28]; cU[col[28]]^=U[28]; qqU[U[28]]^=U[1]; qqU[U[1]]^=U[28];
  } // cd
  rU[row[26]]^=U[26]; cU[col[26]]^=U[26]; fdU^=U[26]; qqU[U[26]]^=U[27];
  rU[row[27]]^=U[27]; cU[col[27]]^=U[27]; qqU[U[27]]^=U[26];
  } // fd, fE
  rU[row[25]]^=U[25]; cU[col[25]]^=U[25]; fdU^=U[25]; qqU[U[25]]^=U[24]; qqU[U[24]]^=U[25];
  } // fd
  rU[row[24]]^=U[24]; cU[col[24]]^=U[24]; fdU^=U[24];
  } // fd
  rU[row[23]]^=U[23]; cU[col[23]]^=U[23]; fdU^=U[23]; qqU[U[23]]^=U[22]; qqU[U[22]]^=U[23];
  } // fd
  rU[row[22]]^=U[22]; cU[col[22]]^=U[22]; fdU^=U[22];
  } // fd
  rU[row[21]]^=U[21]; cU[col[21]]^=U[21]; fdU^=U[21]; qqU[U[21]]^=U[20]; qqU[U[20]]^=U[21];
  } // fd
  rU[row[20]]^=U[20]; cU[col[20]]^=U[20]; fdU^=U[20];
  } // fd
  return count;
} // makeSODLSbd
//=========================================== main ===========================================

void outputLocalTime() {
//   ----------------
  time_t startTime=time(NULL);
  struct tm local;  localtime_s(&local, &startTime); char dateTime[100];
  size_t slen=strftime(dateTime, 100, "%A %Y-%m-%d %X %Z\n\0", &local); printf(dateTime);
} // outputLocalTime

int main() {
//  ----
  int count=0; bool ok=F; outputLocalTime(); for (int i=0; i<N; ++i) P[B[i]]=i;
  FILE *rfp=openInput("File name? ");
  if (rfp!=NULL) {
    FILE *wfp=openOutput();
    if (wfp!=NULL) {
      time_t startTime=time(NULL); bool bd=F; ok=inputBDorSODLS(Q, &bd, rfp); fclose(rfp);
      if (ok) count=bd ? makeSODLSbd(wfp) : makeSODLSls(wfp);
      printf("Number of SODLS %d\n", count); printElapsedTime(startTime, "\n");
      fclose(wfp); if (count==0) remove(outputFile);
    } else fclose(rfp);
  }
  printf("\nPress a key to close the console");
  while (!_kbhit()) Sleep(250); return ok ? EXIT_SUCCESS : EXIT_FAILURE;
} // main