//
// Programmer:    Craig Stuart Sapp <craig@ccrma.stanford.edu>
// Creation Date: Wed Jun 23 12:43:44 PDT 2010
// Last Modified: Wed Jun 23 12:43:47 PDT 2010
// Last Modified: Tue Dec 21 14:41:33 PST 2010 added instrument processing
// Last Modified: Mon Feb 28 14:59:17 PST 2011 added --jrp
// Last Modified: Mon Dec 12 16:39:02 PST 2011 added -p option
// Filename:      ...sig/examples/all/musefoot.cpp
// Web Address:   http://sig.sapp.org/examples/museinfo/musedata/musefoot.cpp
// Syntax:        C++; museinfo
//
// Description:   Add footers onto PostScript pages which have standard
//                 %!PS-Adobe-3.0 Document Structuring Conventions
//

#include "museinfo.h"
#include "Options.h"
#include "PerlRegularExpression.h"

#ifndef OLDCPP
   using namespace std;
#endif

class KeyValue {
   public:
      KeyValue(void) { 
         key.setSize(1);
         key[0] = '\0';
         key.setSize(0);
         value.setSize(1);
         value[0] = '\0';
         value.setSize(0);
      }
      Array<char> key;
      Array<char> value;
};
	 
#define LEFTSIDE 0
#define RIGHTSIDE 1
   
// function declarations
void      checkOptions(Options& opts, int argc, char* argv[]);
void      example(void);
void      usage(const char* command);
void      deleteData(Array<Array<char>*>& data);
void      appendString(Array<Array<char>*>& listing, 
                              Array<char>& lastone);
void      printData(ostream& out, Array<Array<char>* >& data);
void      getPostScriptFile(Array<Array<char>* >& postscript, 
                              Array<int>& pages,
                              const char* filename);
void      getPostScriptFile(Array<Array<char>* >& postscript, 
                              Array<int>& pages,
                              istream& input);
void      getFooterFile(Array<KeyValue>& data, const char* filename);
void      getFooterFile(Array<KeyValue>& data, istream& input);
void      getFooterFile(Array<KeyValue>& data, 
                              Array<Array<char>*>& postscript);
void      appendKeyValueInfo(Array<KeyValue>& data, Array<char>& dataline);
void      printFooterInfo(ostream& out, Array<KeyValue>& data);
int       getNextPage(int start, Array<int>& pages);
void      printPostScriptPage(Array<Array<char>*>& postscript, 
                              Array<KeyValue>& footerinfo, 
                              int startindex, int stopindex,
			      Array<double>& boundingbox, int shiftamount,
                              int pagecount);
void      printFooter(ostream& out, const char* pagelabel, 
                              Array<double>& boundingbox, 
                              Array<KeyValue>& footerinfo, int pagecount);
int       getFirstPage(Array<int>& pages);
void      addPostScriptHeaderInfo(ostream& out);
void      printLogoDefinition(ostream& out);
void      printLogoDefinitionJRP(ostream& out);
void      printLogoDefinitionCCARH(ostream& out);
void      printOverlayBox(ostream& out, double shade = 1.0);
void      printPreamble(ostream& out, int starti, int stopi, 
                              Array<Array<char>*>& postscript);
void      printColophonLogo(ostream& out, double lmargin);
void      getBoundingBox(Array<double>& boundingbox, 
                              Array<Array<char>*>& postscript, int minn, 
			      int maxx);
void      generateFooterText(ostream& out, Array<double>& boundingbox, 
                              Array<KeyValue>& footerinfo, 
			      const char* pagelabel, int pagecount);
void      getLeftRightFooterInfo(Array<KeyValue>& footerinfo, 
                              Array<int>& footerleft, Array<int>& footerright);
void      printFooterTextField(ostream& out, Array<char> data, 
                               const char* pagelabel, int side, int pagecount);
void      getDateString(char* datestring);
void      adjustInstrumentName(Array<char>& instrumentname, 
                               const char* instfile);
void      printLastPage(Array<Array<char>*>& postscript, 
                               Array<KeyValue>& footerinfo, int startindex, 
                               int stopindex, Array<double>& boundingbox, 
                               int page, int shiftamount, int pagecount);

// global variables
Options   options;             // database for command-line arguments
const char* footerfile = "";   // used with -f option
int       verboseQ = 0;        // used with -v option
int       embedQ   = 0;        // used with -e option
int       showboxQ = 0;        // used with -b option
int       jrpQ     = 0;        // used with --jrp option
int       overlayQ = 1;        // used with -O option
int       shiftQ   = 0;        // used with -s option
int       pageoffset = 0;      // used with -p option
int       debugQ   = 0;        // used with --debug option

char      datestring[1024] = {0};
Array<char> instrumentname;    // used with -i and -I
int       evenQ    = 0;        // used with -E option

///////////////////////////////////////////////////////////////////////////

int main(int argc, char* argv[]) {
   checkOptions(options, argc, argv);
   int numinputs = options.getArgCount();

   if (debugQ) {
      cerr << "NUMINPUTS = " << numinputs << endl;
   }

   getDateString(datestring);
   if (debugQ) {
      cerr << "DATESTRING = " << datestring << endl;
   }

   Array<Array<char>*> postscript;
   Array<int> pages;
   if (numinputs > 0) {
      getPostScriptFile(postscript, pages, options.getArg(1));
      // printData(cout, postscript);
   } else {
      getPostScriptFile(postscript, pages, cin);
   }

   if (debugQ) {
      cerr << "PAGECOUNT: " << pages.getSize() << endl;
   }
   int pagecount = pages.getSize();
   pagecount--; // last page is not really a page, just the file trailer

   Array<KeyValue> footerinfo;
   if (!embedQ) {
      getFooterFile(footerinfo, footerfile);
   } else {
      getFooterFile(footerinfo, postscript);
   }
   if (verboseQ) {
      printFooterInfo(cerr, footerinfo);
   }
   int preamblestopindex = getFirstPage(pages) - 1;

   int i;
   if (verboseQ) {
      for (i=0; i<pages.getSize(); i++) {
         cerr << "% Page " << i << "\tstarts at index: " << pages[i] << endl;
      }
   }

   Array<double> boundingbox;
   getBoundingBox(boundingbox, postscript, 0, postscript.getSize()-1);

   int oddQ = pages.getSize() % 2;
   oddQ = !oddQ;  // first "page" is the file header, not really a page.

   int startindex = -1;
   int stopindex  = -1;

   int shiftamount = 0;

   int preambleQ = 0;
   for (i=0; i<pages.getSize(); i++) {
      if (pages[i] < 0) {
         continue;
      }
      if (!preambleQ) {
         if (verboseQ) {
            cerr << "Printing preamble\n";
         }
         printPreamble(cout, 0, preamblestopindex, postscript);
         preambleQ = 1;
      }
      startindex = pages[i];
      stopindex = getNextPage(startindex, pages);
      if (stopindex < 0) {
         stopindex = postscript.getSize()-1;
      } else {
         stopindex = stopindex - 1; // don't print first line of next page
      }
	       
      if (verboseQ) {
         cerr << "Printing page: " << postscript[startindex]->getBase() << endl;
      }
      if (evenQ && oddQ && (i == pages.getSize()-1)) {
         break;
      }
      if (i <= 1) {
         shiftamount = 0;
      } else {
         shiftamount = -shiftQ;
      }
      printPostScriptPage(postscript, footerinfo, startindex, stopindex, 
               boundingbox, shiftamount, pagecount);
      // currently the last page must be the last one in the file.
   }

   if ((startindex >= 0) && (stopindex >= 0) && evenQ && oddQ) {
      if (stopindex <= 1) {
         shiftamount = 0;
      } else {
         shiftamount = -shiftQ;
      }
      printLastPage(postscript, footerinfo, startindex, stopindex, 
            boundingbox, pages.getSize(), shiftamount, pagecount);
   }

   deleteData(postscript);

   return 0;
}



///////////////////////////////////////////////////////////////////////////


//////////////////////////////
//
// getDateString --
//

void getDateString(char* datestring) {
   struct tm *current;
   time_t timenow;
   time(&timenow);
   current = localtime(&timenow);
   int month = current->tm_mon+1;
   int day = current->tm_mday;
   int year = current->tm_year+1900;
   sprintf(datestring, "%d", day);
   switch (month) {
      case  1: strcat(datestring, " Jan "); break;
      case  2: strcat(datestring, " Feb "); break;
      case  3: strcat(datestring, " Mar "); break;
      case  4: strcat(datestring, " Apr "); break;
      case  5: strcat(datestring, " May "); break;
      case  6: strcat(datestring, " Jun "); break;
      case  7: strcat(datestring, " Jul "); break;
      case  8: strcat(datestring, " Aug "); break;
      case  9: strcat(datestring, " Sep "); break;
      case 10: strcat(datestring, " Oct "); break;
      case 11: strcat(datestring, " Nov "); break;
      case 12: strcat(datestring, " Dec "); break;
   }

   char buffer2[1024] = {0};
   sprintf(buffer2, "%d", year);
   strcat(datestring, buffer2);
}




//////////////////////////////
//
// printPreamble --
//

void printPreamble(ostream& out, int starti, int stopi, 
      Array<Array<char>*>& postscript) {

   int len = strlen("%%EndProlog");
   PerlRegularExpression pre;

   int oldresourceQ = 0;

   int foundQ = 0;
   int j;
   for (j=starti; j<=stopi; j++) {
      if (pre.search(postscript[j]->getBase(), 
            "^%%BeginResource:\\s*CCARHFooter", "i")) {
         oldresourceQ = 1;
         continue;
      }
      if (pre.search(postscript[j]->getBase(), "^%%EndResource", "i")) {
         oldresourceQ = 0;
         continue;
      }
      if (oldresourceQ) {
         continue;
      }
      if (j>0) {
         if (pre.search(postscript[j]->getBase(), "^\\*$")) {
            if (pre.search(postscript[j-1]->getBase(), "^\\*$")) {
               // get rid of multiple blank lines
               continue;
            }
         }
      }

      if (strncmp(postscript[j]->getBase(), "%%EndProlog", len) == 0) {
         foundQ = 1;
         out << "\n%%BeginResource: CCARHFooter\n";
         addPostScriptHeaderInfo(out);
         out << "%%EndResource\n\n";
      }
      cout << postscript[j]->getBase() << '\n';
   }

   if (foundQ == 0) {
      out << "\n%%BeginResource: CCARHFooter\n";
      addPostScriptHeaderInfo(out);
      out << "%%EndResource\n\n";
   }

}



//////////////////////////////
//
// printLastPage -- search backwards for showpage or %%PageTrailer
//    print everyghing before that, then print a blank page, and the
//    the file trailer.
//

void printLastPage(Array<Array<char>*>& postscript, 
      Array<KeyValue>& footerinfo, int startindex, int stopindex,
      Array<double>& boundingbox, int page, int shiftamount, int pagecount) {

   PerlRegularExpression pre;

   int newstopindex = stopindex;
   int i;
   for (i=stopindex; i>=startindex; i--) {
      if (pre.search(postscript[i]->getBase(), "^%%PageTrailer\\s*$", "")) {
         newstopindex = i;
         break;
      }
      if (pre.search(postscript[i]->getBase(), "^%", "")) {
         continue;
      }
      if (pre.search(postscript[i]->getBase(), "[^%]*\\bshowpage\\b", "")) {
         newstopindex = i;
         break;
      }
   }

   printPostScriptPage(postscript, footerinfo, startindex, newstopindex, 
         boundingbox, shiftamount, pagecount);


   cout << "\n";  // guarentee newline ending previous content.

   cout << "%%Page " << page << " " << page << "\n";
 
   cout << "%%BeginPageSetup\n";
   cout << "%%PageBoundingBox:";

   // assuming boundingbox size is at least 4 elements...
   cout << " " << (int)(boundingbox[0] + 0.99999);
   cout << " " << (int)(boundingbox[1] + 0.99999);
   cout << " " << (int)(boundingbox[2] + 0.99999);
   cout << " " << (int)(boundingbox[3] + 0.99999);
   cout << "\n";

   cout << "%%PageHiResBoundingBox:";
   cout << " " << boundingbox[0];
   cout << " " << boundingbox[1];
   cout << " " << boundingbox[2];
   cout << " " << boundingbox[3];
   cout << "\n";

   cout << "%%EndPageSetup\n";

   cout << boundingbox[0] << " "
        << boundingbox[1] << " "
        << boundingbox[2] << " "
        << boundingbox[3] << " "
        << "DrawBlankPage\n";

   cout << "showpage\n";
   cout << "%%PageTrailer\n";

   if (newstopindex < stopindex) {
      for (i=newstopindex+1; i<=stopindex; i++) {
         cout << postscript[i]->getBase() << "\n";
      }
   }

}



//////////////////////////////
//
// printPostScriptPage -- print original data, but add a page footer
//     to the page as well.
//

void printPostScriptPage(Array<Array<char>*>& postscript, 
      Array<KeyValue>& footerinfo, int startindex, int stopindex,
      Array<double>& boundingbox, int shiftamount, int pagecount) {


   PerlRegularExpression pageinfo;


   char pagelabel[1024]   = {0};
   char pageordinal[1024] = {0};

   int i = startindex;
   if (pageinfo.search(postscript[i]->getBase(), 
            "^%%Page\\s+([^\\s]+)\\s+([^\\s]+)\\s*$", "")) {
      strcpy(pagelabel, pageinfo.getSubmatch(1));
      strcpy(pageordinal, pageinfo.getSubmatch(2));
   } else {
      cerr << "Error: Cannot find page marker on line:" << endl;
      cerr << postscript[i]->getBase() << endl;
      exit(1);
   }

   PerlRegularExpression pre;

   int oldfooterQ = 0;
   int didshiftQ = 0;

   for (i=startindex; i<=stopindex; i++) {


      if (pre.search(postscript[i]->getBase(), 
            "^%\\s*FOOTER\\s*:\\s*START", "")) {
         oldfooterQ = 1;
         continue;
      }
      if (pre.search(postscript[i]->getBase(), 
            "^%\\s*FOOTER\\s*:\\s*BEGIN", "")) {
         oldfooterQ = 1;
         continue;
      }
      if (pre.search(postscript[i]->getBase(), 
            "^%\\s*FOOTER\\s*:\\s*END", "")) {
         oldfooterQ = 0;
         continue;
      }
      if (pre.search(postscript[i]->getBase(), 
            "^%\\s*FOOTER\\s*:\\s*STOP", "")) {
         oldfooterQ = 0;
         continue;
      }
      if (oldfooterQ && pre.search(postscript[i]->getBase(), 
            "^%\\s*FOOTER", "")) {
         oldfooterQ = 0;
         continue;
      }
      if (oldfooterQ) {
         continue;
      }
	    
      if (pre.search(postscript[i]->getBase(), "^\\s*showpage", "")) {
         if (didshiftQ) {
            cout << "grestore %...end of vertical shift\n";
         }
         printFooter(cout, pagelabel, boundingbox, footerinfo, pagecount);
      }
      cout << postscript[i]->getBase() << endl;

      if (pre.search(postscript[i]->getBase(), "^[%]{2}EndPageSetup")) {
         if (shiftQ) {
            cout << "gsave 0 " << shiftamount << " translate\n";
            didshiftQ = 1;
         } else {
            cout << "% No page shifting\n";
         }
      }

   }

}



//////////////////////////////
//
// getBoundingBox -- look for bounding box in the header.  It will
//       say (atend), and if so, switch to the bottom of the file and
//       search upwards for the actual bounding box.
//

void getBoundingBox(Array<double>& boundingbox, 
      Array<Array<char>*>& postscript, int minn, int maxx) {
   boundingbox.setSize(4);
   boundingbox.setAll(-1);

   PerlRegularExpression pre;

   int i;
   int foundQ = 0;

   for (i=minn; i<=maxx; i++) {
      if (pre.search(postscript[i]->getBase(), "^%%EndComments")) {
         foundQ = 0;
         break;
      }
      if (pre.search(postscript[i]->getBase(), "^%%EndPageSetup")) {
         foundQ = 0;
         break;
      }
      if (!pre.search(postscript[i]->getBase(), "^%%HiResSystemBox:", "")) {
         continue;
      }
      foundQ = 1;
      break;
   }
 
   if (foundQ == 0) {
      // %%HiResSystemBox was not found, search for %%HiResBoundingBox instead
      for (i=0; i<=maxx; i++) {
         if (pre.search(postscript[i]->getBase(), "^%%EndComments")) {
            foundQ = 0;
            break;
         }
         if (pre.search(postscript[i]->getBase(), "^%%EndPageSetup")) {
            foundQ = 0;
            break;
         }
         if (!pre.search(postscript[i]->getBase(), "^%%HiResBoundingBox:","")) {
            continue;
         }
         foundQ = 1;
	 break;
      }
    }
 
   if (foundQ == 0) {
      // %%HiResBoundingBox was not found, search for %%BoundingBox instead
      for (i=0; i<=maxx; i++) {
         if (pre.search(postscript[i]->getBase(), "^%%EndComments", "")) {
            foundQ = 0;
            break;
         }
         if (pre.search(postscript[i]->getBase(), "^%%EndPageSetup")) {
            foundQ = 0;
            break;
         }
         if (!pre.search(postscript[i]->getBase(), "^%%BoundingBox:", "")) {
            continue;
         }
         foundQ = 1;
	 break;
      }
   }
 
   if (foundQ == 0) {
      // %%BoundingBox was not found, search for %%PageHiResSystemBox instead
      for (i=0; i<=maxx; i++) {
         if (pre.search(postscript[i]->getBase(), "^%%EndComments", "")) {
            foundQ = 0;
            break;
         }
         if (pre.search(postscript[i]->getBase(), "^%%EndPageSetup")) {
            foundQ = 0;
            break;
         }
         if(!pre.search(postscript[i]->getBase(),"^%%PageHiResSystemBox:","")) {
            continue;
         }
         foundQ = 1;
	 break;
      }
   }
 
   if (foundQ == 0) {
      // %%PageHiResBoundingBox was not found, search for %%PageHiResBoundingBox
      for (i=0; i<=maxx; i++) {
         if (pre.search(postscript[i]->getBase(), "^%%EndComments", "")) {
            foundQ = 0;
            break;
         }
         if (pre.search(postscript[i]->getBase(), "^%%EndPageSetup")) {
            foundQ = 0;
            break;
         }
         if(!pre.search(postscript[i]->getBase(),"^%%PageHiResBoundingBox:","")){
            continue;
         }
         foundQ = 1;
	 break;
      }
   }
 
   if (foundQ == 0) {
      // %%PageHiResBoundingBox was not found, search for %%PageBoundingBox 
      for (i=minn; i<=maxx; i++) {
         if (pre.search(postscript[i]->getBase(), "^%%EndComments", "")) {
            foundQ = 0;
            break;
         }
         if (pre.search(postscript[i]->getBase(), "^%%EndPageSetup")) {
            foundQ = 0;
            break;
         }
         if (!pre.search(postscript[i]->getBase(), "^%%PageBoundingBox:", "")) {
            continue;
         }
         foundQ = 1;
	 break;
      }
   }

   if (foundQ == 0) {
      cerr << "Error: could not find Bounding Box information in file." << endl;
      cerr << "The BoundingBox information is needed in order to place" << endl;
      cerr << "the footer at the bottom of the page." << endl;
      exit(1);
   }

   int topline = i;
   PerlRegularExpression keyfield;
   const char* key;

   if (pre.search(postscript[topline]->getBase(), "atend", "")) {
      // search backwards in file for actual information
      keyfield.search(postscript[topline]->getBase(), "^(%%[^:]+:)", "");
      key = keyfield.getSubmatch(1);
      for (i=maxx; i>=minn; i--) {
         if (!pre.search(postscript[i]->getBase(), key, "")) {
            continue;
         }
	 topline = i;
	 break;
      }
   }

   if (pre.search(postscript[topline]->getBase(), 
            ":\\s*\\{?\\s*([\\d.+-]+)\\s+([\\d.+-]+)\\s+([\\d.+-]+)\\s+([\\d.+-]+)\\s*\\}?\\s*$", "")) {
      boundingbox[0] = strtod(pre.getSubmatch(1), NULL);
      boundingbox[1] = strtod(pre.getSubmatch(2), NULL);
      boundingbox[2] = strtod(pre.getSubmatch(3), NULL);
      boundingbox[3] = strtod(pre.getSubmatch(4), NULL);
   } else {
      cerr << "Error: could not read bounding box info from line:" <<endl;
      cerr << postscript[i]->getBase() << endl;
      exit(1);
   }

   if (verboseQ) {
      cerr << "Bounding Box: "
           << boundingbox[0] << ", "
           << boundingbox[1] << ", "
           << boundingbox[2] << ", "
           << boundingbox[3] << endl;
   }
}



//////////////////////////////
//
// printFooter --
//

void printFooter(ostream& out, const char* pagelabel, 
      Array<double>& boundingbox, Array<KeyValue>& footerinfo, int pagecount) {
   out << "\n%FOOTER: BEGIN\n";
   if (overlayQ) {
      printOverlayBox(out);
   }
   generateFooterText(out, boundingbox, footerinfo, pagelabel, pagecount);
   double lmargin = boundingbox[0];
   printColophonLogo(out, lmargin);
   out << "%FOOTER: END\n\n";
}



//////////////////////////////
//
// generateFooterText --
//

void generateFooterText(ostream& out, Array<double>& boundingbox, 
      Array<KeyValue>& footerinfo, const char* pagelabel, int pagecount) {
   double lmargin = boundingbox[0];
   double rmargin = boundingbox[2];
   if (lmargin > 100) {
      lmargin = 72;
   }
   if (rmargin < 512) {
      rmargin = 540;
   }
   Array<int> footerleft;
   Array<int> footerright;
   getLeftRightFooterInfo(footerinfo, footerleft, footerright);
   double logooffset = 28;
   PerlRegularExpression pre;
   const char* fontstring = "/Times-Roman findfont 9 scalefont setfont";

   out << "\n";
   int i;
   for (i=0; i<footerleft.getSize(); i++) {
      if (footerleft[i] < 0) {
         continue;
      }
      if (pre.search(footerinfo[footerleft[i]].key.getBase(), "^\\s*$", "")) {
         continue;
      }
      out << lmargin << " " << logooffset << " add ";
      // out << "0.5 cm 4 add " << (i-1)*10 << " add moveto" << "\n";
      out << "0.5 cm 4 add " << (i)*10 << " add moveto" << "\n";
      printFooterTextField(out, footerinfo[footerleft[i]].value, 
            pagelabel, LEFTSIDE, pagecount);
      out << "\n";
   }

   for (i=0; i<footerright.getSize(); i++) {
      if (footerright[i] < 0) {
         continue;
      }
      if (pre.search(footerinfo[footerright[i]].key.getBase(), "^\\s*$", "")) {
         continue;
      }
      out << fontstring << "\n";
      out << rmargin;
      out << " 0.5 cm 4 add " << (i)*10 << " add " << "\n";
      printFooterTextField(out, footerinfo[footerright[i]].value, pagelabel,
            RIGHTSIDE, pagecount);
      out << "\n";
   }

   // do same for right footers

}



//////////////////////////////
//
// printFooterTextField -- data is copied not referenced
//   change (C) to copyright mark: \\343
//   change %P to page number
//   change %D to todays date  
//   change %I to instrument 
//   change --- into an em-dash
//   change -- into an en-dash
//

void printFooterTextField(ostream& out, Array<char> data, 
      const char* pagelabel, int side, int pagecount) {

   data.setSize(data.getSize()+1);
   data[data.getSize()-1] = '\0';
   const char* fontstring = "/Times-Roman findfont 9 scalefont setfont";

   PerlRegularExpression pre;
   PerlRegularExpression pre2;

   pre.sar(data, "---", "\\320", "g");    // em-dash
   pre.sar(data, "--", "\\261", "g");     // en-dash
   pre.sar(data, "\\(", "\\(", "g");      // start parenthesis
   pre.sar(data, "\\)", "\\)", "g");      // end parenthesis

   char buffer[1024] = {0};
   if (pageoffset != 0) {
      int pagenum = atoi(pagelabel);
      sprintf(buffer, "%d", pagenum + pageoffset);
      pre.sar(data, "%P", buffer, "gi");
      // might want to think about page offsets working for roman numerals...
      pre.sar(data, "%P", pagelabel, "gi");  // page number
   } else {
      pre.sar(data, "%P", pagelabel, "gi");  // page number
   }

   sprintf(buffer, "%d", pagecount);
   pre.sar(data, "%C", buffer, "gi");

   pre.sar(data, "%D", datestring, "gi"); // today's date
   pre.sar(data, "%I", instrumentname.getBase(), "gi");  // instrument name

   // process accented characters
   pre.sar(data, "æ", "\\361", "g");   // ae ligature;
   pre.sar(data, "Ø", "\\351", "g");   // O slash
   pre.sar(data, "Æ", "\\341", "g");   // AE ligature
   // \310 = umlaut accent
   // \312 = ring accent
   // \313 = cedilla accent
   // \315 = double acute accent
   // \316 = lower hook accent
   // \317 = haceck accent
   // \301 = grave accent
   // \302 = acute accent
   // \303 = circumflex accent
   // \304 = tilde accent
   // \305 = macron accent
   // \306 = u accent
   // \307 = upper dot accent
   // \270 = lower single quote
   // \271 = lower double quote
   // \272 = upper double quote
   // \273 = right-pointing double arrow quote
   // \274 = elipsis
   // \275 = perthousandth
   // \277 = upsidedown question mark
   // \261 = en-dash
   // \262 = dagger
   // \263 = double dagger
   // \264 = center dot
   // \266 = paragraph
   // \267 = bold center dot
   // \250 = circle x
   // \251 = tick
   // \252 = left upper quote
   // \253 = left-pointing double arrow quote
   // \254 = left-pointing single arrow quote
   // \255 = right-pointing single arrow quote
   // \256 = fi ligature
   // \257 = fl ligature
   // \241 = upside down !
   // \242 = cent sign
   // \243 = pound sign
   // \244 = slash; diagonal
   // \245 = yen sign
   // \246 = florin sign
   // \247 = section 
   // \341 = AE ligature
   // \342 = a superscript
   // \350 = L slash
   // \351 = O slash
   // \352 = OE ligature
   // \353 = o superscript
   // \361 = ae ligature
   // \365 = i with no dot
   // \370 = l slash
   // \371 = o slash
   // \372 = oe ligature
   // \373 = sz ligature
   // 
   
   
   // accented characters are difficult to implement in PostScript (apparently)
   // so just remove the accent for now:
   pre.sar(data, "é", "e", "g");  
   pre.sar(data, "à", "a", "g");  
  
  
   

   const char* ptr1;
   const char* ptr2;
 
   if (pre.search(data, "(.*)\\\\\\(C\\\\\\)(.*)$", "i")) {
      ptr1 = pre.getSubmatch(1);
      ptr2 = pre.getSubmatch(2);
      if (strlen(ptr1) > 0) {
         out << fontstring;
         out << "\n(" << ptr1 << ") show\n";
      }
      out << "/Symbol findfont 9 scalefont setfont (\\343) show\n";
      if (!pre2.search(ptr2, "^\\s*$", "")) {
         out << fontstring << "\n";
         out << "(" << ptr2 << ") show\n";
      }
   } else {
      if (side == LEFTSIDE) {
         out << fontstring << "\n";
         out << "(" << data.getBase() << ")"; 
         out << "show\n";
      } else {
         out << "(" << data.getBase() << ")"; 
         out << "showright\n";
      }
   }


}



//////////////////////////////
//
// getLeftRightFooterInfo --  Footers have three lines
//   3 on the left (FOOT1, FOOT2, FOOT3) and three on 
//   the right (FOOT1R, FOOT2R, FOOT3R).  Make two arrays
//   which have pointers to those lines in the footerinfo structure,
//   using an index of -1 if there is no info for a particular line.
//

void getLeftRightFooterInfo(Array<KeyValue>& footerinfo, 
      Array<int>& footerleft, Array<int>& footerright) {

   footerleft.setSize(3);
   footerleft.allowGrowth(0);
   footerleft.setAll(-1);
   footerright.setSize(3);
   footerright.allowGrowth(0);
   footerright.setAll(-1);

   int i;

   for (i=0; i<footerinfo.getSize(); i++) {
      if (strcmp(footerinfo[i].key.getBase(), "FOOT1") == 0) {
         footerleft[0] = i;
      } else if (strcmp(footerinfo[i].key.getBase(), "FOOT2") == 0) {
         footerleft[1] = i;
      } else if (strcmp(footerinfo[i].key.getBase(), "FOOT3") == 0) {
         footerleft[2] = i;

      } else if (strcmp(footerinfo[i].key.getBase(), "FOOT1R") == 0) {
         footerright[0] = i;
      } else if (strcmp(footerinfo[i].key.getBase(), "FOOT2R") == 0) {
         footerright[1] = i;
      } else if (strcmp(footerinfo[i].key.getBase(), "FOOT3R") == 0) {
         footerright[2] = i;
      } else {
         // cerr << "UNKNOWN FOOTER KEY: " << footerinfo[i].key.getBase() << endl;
      }
	       
   }
}



//////////////////////////////
//
// printOverLayBox -- print a rectangle in the region where the 
//    page footer will be place -- so that any text below it will 
//    note be overstricken.
//    default value: shade = 1.0;
//

void printOverlayBox(ostream& out, double shade) {
   out << shade << " headerbottom" << "\n";


}



//////////////////////////////
//
// printColophonLogo --
//

void printColophonLogo(ostream& out, double lmargin) {
   if (lmargin > 100) {
      // don't use an extra-wide left margin
      lmargin = 72;
   }
   out << "gsave\n";
   out << lmargin << " 20 translate\n";
   out << "CCARHcolophon\n";
   out << "grestore\n";
}



//////////////////////////////
//
// addPostScriptHeaderInfo --
//

void addPostScriptHeaderInfo(ostream& out) {
   out <<  "/cm   {28.3464566929 mul} bind def /inch {72.0000000000 mul} bind def\n";
   out <<  "/bobo {0.5 cm} bind def /boto {2.0 cm} bind def\n";
   out <<  "/tobo {11 inch 1.5 cm sub} bind def /toto {11 inch 0.5 cm sub} bind def\n";
   out <<  "/headerbottom { gsave newpath\n";
   out <<  "0 bobo moveto 8.5 inch bobo lineto 8.5 inch boto lineto 0 boto lineto\n";
   out <<  "closepath setgray fill grestore } def\n";
   out <<  "/headertop { gsave newpath\n";
   out <<  "0 toto moveto 8.5 inch toto lineto 8.5 inch tobo lineto 0 tobo lineto\n";
   out <<  "closepath setgray fill grestore } def\n";
   out <<  "/showright { dup stringwidth pop 4 -1 roll exch sub 3 -1 roll moveto show } def\n";
   if (evenQ) {
      out << "/DrawBlankPage {\n";
      out << "% Input to DrawBlankPage: bounding box coordinates: x1 y1 x2 y2\n";
      out << "   gsave\n";
      out << "   /y2 exch def      % bounding box, upper right y position\n";
      out << "   /x2 exch def      % bounding box, upper right x position\n";
      out << "   /y1 exch def      % bounding box, lower left y position\n";
      out << "   /x1 exch def      % bounding box, lower left x position\n";
      out << "   /xlen x2 x1 sub def\n";
      out << "   /ylen y2 y1 sub def\n";
      out << "   /angle ylen xlen atan -1 mul def\n";
      out << "   /fontsz xlen dup mul ylen dup mul add sqrt 0.12 mul def\n";
      out << "   % 0.12 is an empirical value derived from \"BLANK PAGE\"\n";
      out << "   % It could be calulated from the bounding box and string length...\n";
      out << "   /centerx xlen 0.5 mul x1 add def\n";
      out << "   /centery ylen 0.5 mul y1 add def\n";
      out << "   /HeleveticaBold fontsz selectfont\n";
      out << "   /mystring (BLANK PAGE) def\n";
      out << "   /strlen mystring stringwidth pop def\n";
      out << "   /strhei gsave 0 0 moveto mystring false charpath flattenpath pathbbox\n";
      out << "      exch pop exch sub exch pop grestore def\n";
      out << "   centerx centery translate\n";
      out << "   angle rotate\n";
      out << "   0 0 moveto\n";
      out << "   0.95 0.95 0.95 setrgbcolor\n";
      out << "   strlen -0.5 mul strhei -0.5 mul moveto\n";
      out << "   mystring show\n";
      out << "   grestore\n";
      out << "} bind def\n";
   }
   printLogoDefinition(out);
}



//////////////////////////////
//
// printLogoDefinition --
//

void printLogoDefinition(ostream& out) {
   if (jrpQ) {
      printLogoDefinitionJRP(out);
   } else {
      printLogoDefinitionCCARH(out);
   }
}

void printLogoDefinitionJRP(ostream& out) {
   out << "\%BoundingBox: 0 0 89 35\n";
   out << "/CCARHcolophon { /mo /moveto load def /li /lineto load def /cv /curveto\n";
   out << "load def /cp /closepath load def /f /fill load def \n";
   out << "gsave -1 -10 translate 0 setgray 0\n";
   out << "setlinewidth 3.9375 33.8994 mo 3.9375 15.7588 li 3.9375 12.5625 3.8291\n";
   out << "9.97559 3.6123 7.99707 cv 3.39551 5.98535 2.96191 4.23242 2.31152 2.73633\n";
   out << "cv 1.66113 1.23926 0.890625 0.328125 0 0 cv 0 0.398438 li 0.779297 1.39648\n";
   out << "1.41504 2.58887 1.90723 3.97559 cv 2.39355 5.33105 2.73633 6.82813 2.93555\n";
   out << "8.46387 cv 3.12891 10.0859 3.22559 12.1729 3.22559 14.7295 cv 3.22559\n";
   out << "28.6865 li 3.22559 30.3389 3.14648 31.5234 2.98828 32.2402 cv 2.81836\n";
   out << "32.958 2.51367 33.4414 2.07422 33.6904 cv 2.07422 34.1807 li 2.90625\n";
   out << "34.0254 3.52734 33.9316 3.9375 33.8994 cv cp f newpath 6.48633 34.1807 mo\n";
   out << "6.48633 33.7607 li 6.0293 33.542 5.71875 33.082 5.55469 32.3809 cv 5.39063\n";
   out << "31.6641 5.30859 30.5498 5.30859 29.0381 cv 5.30859 16.0156 li 5.30859\n";
   out << "13.8652 5.35254 12.3535 5.44043 11.4805 cv 5.5166 10.6074 5.66016 9.86719\n";
   out << "5.87109 9.25977 cv 5.46094 9.25977 5.14453 9.11133 4.92188 8.81445 cv\n";
   out << "4.6875 8.50391 4.39746 7.80176 4.05176 6.71094 cv 4.25098 7.66113 4.3916\n";
   out << "8.72168 4.47363 9.89063 cv 4.5498 10.9971 4.58789 12.8672 4.58789 15.501\n";
   out << "cv 4.58789 33.8994 li 5.0625 33.9316 5.69531 34.0254 6.48633 34.1807 cv\n";
   out << "cp f newpath 8.44629 33.9951 mo 8.44629 15.4678 li 8.06836 15.4678 li\n";
   out << "7.92188 15.4678 7.69043 15.4326 7.37402 15.3623 cv 7.10449 15.292 6.78809\n";
   out << "15.2568 6.4248 15.2568 cv 6.4248 15.5732 li 6.7998 15.6553 7.11035 16.0244\n";
   out << "7.35645 16.6807 cv 7.60254 17.3369 7.72559 18.6025 7.72559 20.4775 cv\n";
   out << "7.72559 29.5127 li 7.72559 32.0674 7.29199 33.5264 6.4248 33.8896 cv\n";
   out << "6.4248 34.2061 li 6.7998 34.124 7.47363 34.0537 8.44629 33.9951 cv cp f\n";
   out << "newpath 9.34277 15.4678 mo 9.08789 15.4678 li 9.08789 33.9951 li 9.43945\n";
   out << "33.9951 9.81445 34.0244 10.2129 34.083 cv 10.6699 34.165 11.042 34.2061\n";
   out << "11.3291 34.2061 cv 12.1318 34.2061 12.7295 33.7139 13.1221 32.7295 cv\n";
   out << "13.5146 31.7568 13.7109 30.5557 13.7109 29.126 cv 13.7109 26.7002 13.1982\n";
   out << "25.1475 12.1729 24.4678 cv 12.6826 24.3271 13.0313 23.7158 13.377 23.2471\n";
   out << "cv 13.9189 22.5078 14.2573 21.5439 14.9238 20.2002 cv 16.0664 17.8799\n";
   out << "17.1929 16.0459 17.9136 16.0459 cv 18.0601 16.0459 18.2095 16.1455\n";
   out << "18.3618 16.3447 cv 18.397 16.0283 li 18.1626 15.4189 17.8374 15.1143\n";
   out << "17.4214 15.1143 cv 16.9761 15.1143 16.5103 15.4482 16.0239 16.1162\n";
   out << "cv 15.5669 16.749 14.9883 18.1611 14.0801 20.0127 cv 12.9902 22.2627\n";
   out << "11.8418 24.2217 10.8105 24.2217 cv 11.4492 23.8232 12.3135 22.4814\n";
   out << "13.4033 20.1963 cv 14.1709 18.6025 14.8828 16.9424 15.3457 16.2158 cv\n";
   out << "15.8145 15.4893 16.1499 14.6221 16.5776 14.6221 cv 16.5776 14.6221 li\n";
   out << "16.3784 14.4814 16.1821 14.2529 15.9888 14.2529 cv 15.4204 14.2529\n";
   out << "14.7773 15.2197 14.3613 15.7939 cv 14.1387 16.1104 13.9072 16.5967\n";
   out << "13.5645 17.2471 cv 13.2217 17.8975 13.0137 18.8408 12.5332 19.8721\n";
   out << "cv 11.8301 21.3721 11.2207 22.6104 10.8809 23.1494 cv 10.5176 23.7002\n";
   out << "10.1631 24.0869 9.81738 24.3096 cv 9.81738 20.1436 li 9.81738 17.3428\n";
   out << "10.2393 15.8193 11.083 15.5732 cv 11.083 15.2568 li 10.3799 15.3975\n";
   out << "9.7998 15.4678 9.34277 15.4678 cv cp f newpath 1 setgray 9.81738 29.1611\n";
   out << "mo 9.81738 25.3467 li 10.1631 25.1709 10.5381 25.083 10.9424 25.083 cv\n";
   out << "12.2607 25.083 12.9199 26.4541 12.9199 29.1963 cv 12.9199 31.7627 12.2666\n";
   out << "33.0459 10.96 33.0459 cv 10.5381 33.0459 10.21 32.876 9.97559 32.5361\n";
   out << "cv 9.87012 32.0674 9.81738 30.9424 9.81738 29.1611 cv cp f 0 setgray\n";
   out << "newpath 13.7988 25.3643 mo 14.1797 26.5713 14.3701 27.9014 14.3701 29.3545\n";
   out << "cv 14.3701 30.6787 14.1504 32.0088 13.7109 33.3447 cv 14.7188 32.4893\n";
   out << "15.2227 31.1416 15.2227 29.3018 cv 15.2227 27.4385 14.748 26.126 13.7988\n";
   out << "25.3643 cv cp f newpath 19.4531 33.9248 mo 19.4531 15.3975 li 19.1631\n";
   out << "15.3975 li 18.7881 15.3975 18.2314 15.3271 17.4932 15.1865 cv 17.4932\n";
   out << "15.5029 li 17.7979 15.5732 18.0791 15.9189 18.3369 16.54 cv 18.5947\n";
   out << "17.1611 18.7236 18.4561 18.7236 20.4248 cv 18.7236 28.9854 li 18.7236\n";
   out << "30.6143 18.6328 31.7686 18.4512 32.4482 cv 18.2695 33.1279 17.9502 33.585\n";
   out << "17.4932 33.8193 cv 17.4932 34.1357 li 18.2725 34.0186 18.9258 33.9482\n";
   out << "19.4531 33.9248 cv cp f newpath 20.7363 15.3975 mo 20.0947 15.3975 li\n";
   out << "20.0947 33.9248 li 20.2412 33.9248 20.3555 33.9307 20.4375 33.9424 cv\n";
   out << "20.7715 33.9658 21.0938 34.0068 21.4043 34.0654 cv 21.6094 34.1123 21.835\n";
   out << "34.1357 22.0811 34.1357 cv 23.124 34.1357 23.8916 33.5908 24.3838 32.501\n";
   out << "cv 24.8701 31.3994 25.1133 30.0283 25.1133 28.3877 cv 25.1133 26.7119\n";
   out << "24.8467 25.376 24.3135 24.3799 cv 23.7803 23.3604 23.0859 22.8506 22.2305\n";
   out << "22.8506 cv 21.7559 22.8506 21.2813 23.0146 20.8066 23.3428 cv 20.8066\n";
   out << "20.2139 li 20.8066 18.6787 20.915 17.5479 21.1318 16.8213 cv 21.3428\n";
   out << "16.0713 21.6914 15.6318 22.1777 15.5029 cv 22.1777 15.1865 li 21.9316\n";
   out << "15.2568 21.627 15.3096 21.2637 15.3447 cv 20.7363 15.3975 li cp f newpath\n";
   out << "1 setgray 20.8066 28.4932 mo 20.8066 24.6611 li 21.2109 24.3213 21.6445\n";
   out << "24.1514 22.1074 24.1514 cv 22.8516 24.1514 23.4082 24.5615 23.7773 25.3818\n";
   out << "cv 24.1465 26.2139 24.3311 27.2451 24.3311 28.4756 cv 24.3311 29.7529\n";
   out << "24.1465 30.8135 23.7773 31.6572 cv 23.4082 32.501 22.8311 32.9229 22.0459\n";
   out << "32.9229 cv 21.6123 32.9229 21.2959 32.7881 21.0967 32.5186 cv 20.9033\n";
   out << "32.2373 20.8066 30.8955 20.8066 28.4932 cv cp f newpath 0 setgray 24.7969\n";
   out << "23.5889 mo 25.4355 24.9014 25.7549 26.4717 25.7549 28.2998 cv 25.7549\n";
   out << "30.2217 25.4355 31.8916 24.7969 33.3096 cv 25.9746 32.3604 26.5635 30.7432\n";
   out << "26.5635 28.458 cv 26.5635 26.2197 25.9746 24.5967 24.7969 23.5889 cv cp f\n";
   out << "newpath 7.65088 13.9238 mo 7.65088 14.0859 li 9.94873 14.0859 li 9.94873\n";
   out << "13.9238 li 9.75488 13.9238 li 9.53613 13.9238 9.37646 13.8516 9.27637\n";
   out << "13.707 cv 9.21289 13.6133 9.18115 13.3887 9.18115 13.0313 cv 9.18115\n";
   out << "10.1172 li 9.18115 9.66992 9.13721 9.30469 9.04883 9.02734 cv 8.96045\n";
   out << "8.74805 8.80811 8.50586 8.59229 8.30078 cv 8.37598 8.09375 8.11475 7.99023\n";
   out << "7.80908 7.99023 cv 7.56104 7.99023 7.36621 8.05859 7.22363 8.19531 cv\n";
   out << "7.08105 8.33008 7.01025 8.48633 7.01025 8.66211 cv 7.01025 8.80664 7.04297\n";
   out << "8.91406 7.10889 8.98828 cv 7.1958 9.07813 7.29736 9.125 7.41357 9.125 cv\n";
   out << "7.49805 9.125 7.57373 9.09375 7.64063 9.03125 cv 7.7085 8.9707 7.79297\n";
   out << "8.80664 7.896 8.53906 cv 7.95654 8.38086 8.03418 8.30273 8.12939 8.30273\n";
   out << "cv 8.20068 8.30273 8.26709 8.35156 8.32861 8.44727 cv 8.39063 8.54492\n";
   out << "8.42188 8.71484 8.42188 8.96094 cv 8.42188 13.0313 li 8.42188 13.332\n";
   out << "8.40479 13.5313 8.37061 13.6289 cv 8.34424 13.7012 8.28906 13.7656\n";
   out << "8.20459 13.8184 cv 8.09131 13.8887 7.97119 13.9238 7.84473 13.9238\n";
   out << "cv 7.65088 13.9238 li cp f newpath 12.021 12.2715 mo 12.5693 12.2715\n";
   out << "13.0098 12.0391 13.3423 11.5762 cv 13.624 11.1816 13.7651 10.7266 13.7651\n";
   out << "10.2148 cv 13.7651 9.85352 13.6875 9.48828 13.5317 9.11914 cv 13.3765\n";
   out << "8.75 13.1621 8.47266 12.8896 8.28516 cv 12.6162 8.09766 12.3125 8.00391\n";
   out << "11.9775 8.00391 cv 11.4316 8.00391 10.998 8.24609 10.6763 8.72852 cv\n";
   out << "10.4048 9.13477 10.269 9.5918 10.269 10.0996 cv 10.269 10.4688 10.3511\n";
   out << "10.8359 10.5166 11.2012 cv 10.6807 11.5645 10.8979 11.834 11.167 12.0098\n";
   out << "cv 11.4355 12.1836 11.7207 12.2715 12.021 12.2715 cv cp f 1 setgray\n";
   out << "newpath 11.8984 11.9844 mo 11.7588 11.9844 11.6182 11.9395 11.4771\n";
   out << "11.8457 cv 11.3359 11.7539 11.2222 11.5918 11.1353 11.3613 cv 11.0483\n";
   out << "11.1289 11.0049 10.832 11.0049 10.4688 cv 11.0049 9.88281 11.1099 9.37695\n";
   out << "11.3188 8.95313 cv 11.5288 8.52734 11.8047 8.31641 12.1475 8.31641\n";
   out << "cv 12.4033 8.31641 12.6143 8.43164 12.7803 8.66797 cv 12.9468 8.90039\n";
   out << "13.0298 9.30469 13.0298 9.875 cv 13.0298 10.5898 12.8911 11.1523 12.6143\n";
   out << "11.5625 cv 12.4272 11.8438 12.1885 11.9844 11.8984 11.9844 cv cp f 0\n";
   out << "setgray newpath 16.6406 12.2715 mo 16.6406 10.9004 li 16.5103 10.9004 li\n";
   out << "16.4102 11.3301 16.2813 11.623 16.1245 11.7793 cv 15.9673 11.9336 15.7681\n";
   out << "12.0117 15.5254 12.0117 cv 15.3408 12.0117 15.1919 11.957 15.0786 11.8496\n";
   out << "cv 14.9648 11.7402 14.9082 11.6211 14.9082 11.4883 cv 14.9082 11.3242\n";
   out << "14.9507 11.1836 15.0347 11.0664 cv 15.1167 10.9453 15.2827 10.8184\n";
   out << "15.5332 10.6836 cv 16.1108 10.373 li 16.646 10.082 16.9136 9.69922\n";
   out << "16.9136 9.22461 cv 16.9136 8.85938 16.7891 8.56445 16.5396 8.33984 cv\n";
   out << "16.291 8.11523 16.0117 8.00391 15.7031 8.00391 cv 15.4819 8.00391 15.2285\n";
   out << "8.04688 14.9438 8.13477 cv 14.8569 8.16406 14.7856 8.17969 14.7305 8.17969\n";
   out << "cv 14.6699 8.17969 14.6221 8.14063 14.5879 8.06445 cv 14.4575 8.06445\n";
   out << "li 14.4575 9.50195 li 14.5879 9.50195 li 14.6616 9.0918 14.8027 8.7832\n";
   out << "15.0112 8.57422 cv 15.2192 8.36719 15.4526 8.26367 15.7114 8.26367 cv\n";
   out << "15.8931 8.26367 16.041 8.32227 16.1563 8.44141 cv 16.2705 8.55859 16.3281\n";
   out << "8.70313 16.3281 8.86914 cv 16.3281 9.07227 16.2642 9.24023 16.1362\n";
   out << "9.37891 cv 16.0083 9.51563 15.7534 9.69141 15.3711 9.90234 cv 14.9888\n";
   out << "10.1133 14.7383 10.3027 14.6196 10.4727 cv 14.501 10.6406 14.4414 10.8516\n";
   out << "14.4414 11.1055 cv 14.4414 11.4375 14.5435 11.7129 14.7485 11.9375 cv\n";
   out << "14.9521 12.1582 15.2168 12.2715 15.541 12.2715 cv 15.6836 12.2715 15.8564\n";
   out << "12.2363 16.0591 12.1699 cv 16.1938 12.125 16.2832 12.1035 16.3281 12.1035\n";
   out << "cv 16.3706 12.1035 16.4033 12.1133 16.4272 12.1348 cv 16.4507 12.1543\n";
   out << "16.4785 12.2012 16.5103 12.2715 cv 16.6406 12.2715 li cp f newpath 20.6592\n";
   out << "12.2715 mo 20.6592 7.09375 li 20.6592 6.83594 20.6748 6.66992 20.7065\n";
   out << "6.59766 cv 20.7383 6.52344 20.7871 6.4668 20.855 6.42578 cv 20.9219\n";
   out << "6.38477 21.0532 6.36523 21.2485 6.36523 cv 21.2485 6.20117 li 19.4209\n";
   out << "6.20117 li 19.4209 6.36523 li 19.4961 6.36523 li 19.644 6.36523 19.7559\n";
   out << "6.38867 19.8325 6.43555 cv 19.8853 6.4668 19.9272 6.52539 19.959 6.60742\n";
   out << "cv 19.9907 6.69141 20.0063 6.85352 20.0063 7.09375 cv 20.0063 8.82617 li\n";
   out << "19.7666 8.50977 19.5566 8.29297 19.3774 8.17773 cv 19.1982 8.06055 19.0122\n";
   out << "8.00391 18.8198 8.00391 cv 18.4692 8.00391 18.1558 8.17969 17.8809 8.53516\n";
   out << "cv 17.605 8.88867 17.4673 9.36328 17.4673 9.95898 cv 17.4673 10.6406\n";
   out << "17.6494 11.1973 18.0132 11.627 cv 18.377 12.0566 18.8159 12.2715 19.3301\n";
   out << "12.2715 cv 19.4805 12.2715 19.6187 12.2461 19.7456 12.2012 cv 19.8721\n";
   out << "12.1523 19.9854 12.082 20.0854 11.9902 cv 20.2383 12.0703 20.3848 12.166\n";
   out << "20.5244 12.2715 cv 20.6592 12.2715 li cp f newpath 1 setgray 20.0063\n";
   out << "9.10156 mo 20.0063 10.9922 li 20.0063 11.2109 19.9805 11.3848 19.9297\n";
   out << "11.5098 cv 19.8774 11.6367 19.7861 11.7441 19.6543 11.832 cv 19.5225\n";
   out << "11.9199 19.3735 11.9629 19.2075 11.9629 cv 18.9121 11.9629 18.6592\n";
   out << "11.8242 18.4482 11.5449 cv 18.2373 11.2676 18.1318 10.8457 18.1318\n";
   out << "10.2793 cv 18.1318 9.73828 18.2388 9.32617 18.4536 9.04492 cv 18.6689\n";
   out << "8.76367 18.9282 8.62305 19.2314 8.62305 cv 19.3867 8.62305 19.5254 8.66016\n";
   out << "19.6465 8.73438 cv 19.7676 8.81055 19.8877 8.93164 20.0063 9.10156 cv cp\n";
   out << "f newpath 0 setgray 24.6772 12.1523 mo 24.6772 9.71289 li 24.6772 9.24805\n";
   out << "24.687 8.96289 24.707 8.85742 cv 24.7266 8.75391 24.7583 8.68164 24.8022\n";
   out << "8.64063 cv 24.8452 8.59961 24.896 8.58008 24.9541 8.58008 cv 25.0361\n";
   out << "8.58008 25.1284 8.60352 25.231 8.6543 cv 25.2866 8.5 li 24.2026 8.00391\n";
   out << "li 24.0249 8.00391 li 24.0249 8.85547 li 23.7139 8.48047 23.4766 8.24609\n";
   out << "23.313 8.14844 cv 23.1494 8.05273 22.9766 8.00391 22.7949 8.00391 cv\n";
   out << "22.5918 8.00391 22.4155 8.06836 22.2666 8.19922 cv 22.1177 8.33008 22.0142\n";
   out << "8.49609 21.9561 8.70313 cv 21.8984 8.90625 21.8691 9.19727 21.8691 9.57227\n";
   out << "cv 21.8691 11.3691 li 21.8691 11.5605 21.8506 11.6914 21.814 11.7656\n";
   out << "cv 21.7769 11.8379 21.7222 11.8945 21.6494 11.9336 cv 21.5771 11.9746\n";
   out << "21.4463 11.9922 21.2563 11.9902 cv 21.2563 12.1523 li 22.5259 12.1523\n";
   out << "li 22.5259 9.45898 li 22.5259 9.08203 22.5845 8.83594 22.7017 8.7207 cv\n";
   out << "22.8188 8.60156 22.9609 8.54492 23.127 8.54492 cv 23.2402 8.54492 23.3687\n";
   out << "8.58398 23.5127 8.66211 cv 23.6563 8.74219 23.8271 8.89258 24.0249 9.11523\n";
   out << "cv 24.0249 11.3965 li 24.0249 11.625 23.9873 11.7793 23.9116 11.8594 cv\n";
   out << "23.8369 11.9395 23.6807 11.9824 23.4434 11.9902 cv 23.4434 12.1523 li\n";
   out << "24.6772 12.1523 li cp f newpath 26.8013 12.2715 mo 26.8013 9.03711 li\n";
   out << "26.8013 8.7832 26.8174 8.61719 26.8511 8.5332 cv 26.8833 8.44922 26.9321\n";
   out << "8.38672 26.9966 8.3457 cv 27.0615 8.30469 27.1797 8.28516 27.3511\n";
   out << "8.28516 cv 27.3511 8.12695 li 25.5908 8.12695 li 25.5908 8.28516 li\n";
   out << "25.7676 8.28516 25.8862 8.30273 25.9468 8.3418 cv 26.0078 8.37891\n";
   out << "26.0557 8.44336 26.0913 8.53125 cv 26.1265 8.61914 26.1445 8.78711\n";
   out << "26.1445 9.03711 cv 26.1445 10.5879 li 26.1445 11.0234 26.1328 11.3066\n";
   out << "26.1089 11.4355 cv 26.0908 11.5293 26.0615 11.5938 26.022 11.6309 cv\n";
   out << "25.9824 11.668 25.9287 11.6855 25.8599 11.6855 cv 25.7861 11.6855 25.6963\n";
   out << "11.6641 25.5908 11.6211 cv 25.5356 11.7793 li 26.6274 12.2715 li 26.8013\n";
   out << "12.2715 li cp f newpath 26.4731 14.375 mo 26.5835 14.375 26.6777 14.332\n";
   out << "26.7559 14.2461 cv 26.8335 14.1602 26.8726 14.0547 26.8726 13.9316\n";
   out << "cv 26.8726 13.8086 26.8335 13.7031 26.7559 13.6152 cv 26.6777 13.5273\n";
   out << "26.5835 13.4844 26.4731 13.4844 cv 26.3623 13.4844 26.2671 13.5273 26.188\n";
   out << "13.6152 cv 26.1089 13.7031 26.0693 13.8086 26.0693 13.9316 cv 26.0693\n";
   out << "14.0547 26.1084 14.1602 26.1865 14.2461 cv 26.2637 14.332 26.3594 14.375\n";
   out << "26.4731 14.375 cv cp f newpath 28.8579 11.418 mo 29.2822 11.9863 29.687\n";
   out << "12.2715 30.0723 12.2715 cv 30.27 12.2715 30.4399 12.2148 30.5825 12.1055\n";
   out << "cv 30.7246 11.9961 30.8379 11.8145 30.9224 11.5625 cv 30.9805 11.3867\n";
   out << "31.0093 11.1172 31.0093 10.7539 cv 31.0093 9.03711 li 31.0093 8.78125\n";
   out << "31.0278 8.60742 31.0649 8.51758 cv 31.0938 8.44336 31.1406 8.38672\n";
   out << "31.2051 8.3457 cv 31.2695 8.30469 31.3892 8.28516 31.563 8.28516 cv\n";
   out << "31.563 8.12695 li 29.7715 8.12695 li 29.7715 8.28516 li 29.8467 8.28516\n";
   out << "li 30.0156 8.28516 30.1338 8.3125 30.2002 8.37109 cv 30.2681 8.42773\n";
   out << "30.3145 8.51172 30.3408 8.62305 cv 30.3516 8.66797 30.3569 8.80469 30.3569\n";
   out << "9.03711 cv 30.3569 10.6836 li 30.3569 11.0508 30.314 11.3164 30.2285\n";
   out << "11.4824 cv 30.1426 11.6465 29.998 11.7305 29.7954 11.7305 cv 29.4814\n";
   out << "11.7305 29.1689 11.5391 28.8579 11.1582 cv 28.8579 9.03711 li 28.8579\n";
   out << "8.76367 28.8726 8.5957 28.9014 8.53125 cv 28.9385 8.44531 28.9888 8.38281\n";
   out << "29.0532 8.34375 cv 29.1182 8.30469 29.2495 8.28516 29.4473 8.28516 cv\n";
   out << "29.4473 8.12695 li 27.6558 8.12695 li 27.6558 8.28516 li 27.7349 8.28516\n";
   out << "li 27.9194 8.28516 28.0435 8.33594 28.1084 8.44141 cv 28.1729 8.54492\n";
   out << "28.2051 8.74219 28.2051 9.03711 cv 28.2051 10.5313 li 28.2051 11.0137\n";
   out << "28.1958 11.3086 28.1753 11.4141 cv 28.1563 11.5195 28.1255 11.5898 28.085\n";
   out << "11.6289 cv 28.0435 11.666 27.9893 11.6855 27.9204 11.6855 cv 27.8467\n";
   out << "11.6855 27.7583 11.6641 27.6558 11.6211 cv 27.5962 11.7793 li 28.688\n";
   out << "12.2715 li 28.8579 12.2715 li 28.8579 11.418 li cp f newpath 39.0977\n";
   out << "8.12695 mo 37.666 8.12695 li 35.8506 10.9121 li 35.7158 10.9063 35.6064\n";
   out << "10.9043 35.522 10.9043 cv 35.4878 10.9043 35.4512 10.9043 35.4116 10.9063\n";
   out << "cv 35.3721 10.9082 35.3311 10.9102 35.2891 10.9121 cv 35.2891 9.18164 li\n";
   out << "35.2891 8.80664 35.3257 8.57227 35.3994 8.48242 cv 35.5 8.35352 35.6499\n";
   out << "8.28906 35.8506 8.28906 cv 36.0601 8.28906 li 36.0601 8.12695 li 33.7622\n";
   out << "8.12695 li 33.7622 8.28906 li 33.9639 8.28906 li 34.1904 8.28906 34.353\n";
   out << "8.37109 34.4502 8.53516 cv 34.5059 8.625 34.5332 8.8418 34.5332 9.18164\n";
   out << "cv 34.5332 13.0313 li 34.5332 13.4063 34.4966 13.6387 34.4229 13.7305\n";
   out << "cv 34.3198 13.8574 34.167 13.9238 33.9639 13.9238 cv 33.7622 13.9238 li\n";
   out << "33.7622 14.0859 li 35.7158 14.0859 li 36.2856 14.0859 36.7051 14.0391\n";
   out << "36.9761 13.9473 cv 37.2456 13.8555 37.4751 13.6855 37.6641 13.4375 cv\n";
   out << "37.8521 13.1895 37.9468 12.8945 37.9468 12.5527 cv 37.9468 12.1855 37.8389\n";
   out << "11.8672 37.6245 11.5977 cv 37.4092 11.3281 37.0767 11.1387 36.6255 11.0273\n";
   out << "cv 37.7329 9.31836 li 37.9863 8.92383 38.2036 8.66406 38.3857 8.53516 cv\n";
   out << "38.5674 8.40625 38.8047 8.32422 39.0977 8.28906 cv 39.0977 8.12695 li cp\n";
   out << "f newpath 1 setgray 35.2891 11.1895 mo 35.3389 11.1895 35.3823 11.1895\n";
   out << "35.4194 11.1875 cv 35.4561 11.1855 35.4868 11.1855 35.5103 11.1855 cv\n";
   out << "36.022 11.1855 36.4072 11.3086 36.6675 11.5547 cv 36.9268 11.8008 37.0566\n";
   out << "12.1133 37.0566 12.4941 cv 37.0566 12.8672 36.9521 13.1699 36.7422 13.4023\n";
   out << "cv 36.5327 13.6348 36.2554 13.752 35.9097 13.752 cv 35.7568 13.752 35.5498\n";
   out << "13.7227 35.2891 13.668 cv 35.2891 11.1895 li cp f newpath 0 setgray\n";
   out << "39.8887 10.6367 mo 39.8857 10.0391 40.0166 9.56836 40.2803 9.23047 cv\n";
   out << "40.5439 8.88867 40.8535 8.7207 41.2095 8.7207 cv 41.4468 8.7207 41.6528\n";
   out << "8.79297 41.8281 8.9375 cv 42.0039 9.08203 42.1509 9.33008 42.2695 9.68164\n";
   out << "cv 42.3921 9.59375 li 42.3369 9.19336 42.1758 8.82813 41.9097 8.49805\n";
   out << "cv 41.6436 8.16797 41.3096 8.00391 40.9092 8.00391 cv 40.4741 8.00391\n";
   out << "40.1011 8.19141 39.792 8.56836 cv 39.4814 8.94531 39.3271 9.45117 39.3271\n";
   out << "10.0859 cv 39.3271 10.7754 39.4858 11.3125 39.8032 11.6973 cv 40.1211\n";
   out << "12.082 40.52 12.2754 41 12.2754 cv 41.4063 12.2754 41.7397 12.127 42.0005\n";
   out << "11.8281 cv 42.2617 11.5313 42.3921 11.1328 42.3921 10.6367 cv 39.8887\n";
   out << "10.6367 li cp f newpath 1 setgray 39.8887 10.8906 mo 41.5654 10.8906 li\n";
   out << "41.5522 11.1484 41.5249 11.3301 41.4824 11.4355 cv 41.4165 11.5996 41.3184\n";
   out << "11.7285 41.1875 11.8223 cv 41.0576 11.916 40.9209 11.9629 40.7783 11.9629\n";
   out << "cv 40.5596 11.9629 40.3638 11.8691 40.1909 11.6797 cv 40.0181 11.4902\n";
   out << "39.9175 11.2266 39.8887 10.8906 cv cp f newpath 0 setgray 45.2158 12.2715\n";
   out << "mo 45.2158 10.9004 li 45.085 10.9004 li 44.9854 11.3301 44.8564 11.623\n";
   out << "44.7002 11.7793 cv 44.543 11.9336 44.3433 12.0117 44.1006 12.0117 cv\n";
   out << "43.916 12.0117 43.7671 11.957 43.6538 11.8496 cv 43.5405 11.7402 43.4839\n";
   out << "11.6211 43.4839 11.4883 cv 43.4839 11.3242 43.5259 11.1836 43.6104 11.0664\n";
   out << "cv 43.6919 10.9453 43.8584 10.8184 44.1089 10.6836 cv 44.6865 10.373\n";
   out << "li 45.2217 10.082 45.4893 9.69922 45.4893 9.22461 cv 45.4893 8.85938\n";
   out << "45.3643 8.56445 45.1152 8.33984 cv 44.8662 8.11523 44.5869 8.00391\n";
   out << "44.2788 8.00391 cv 44.0571 8.00391 43.8042 8.04688 43.5195 8.13477 cv\n";
   out << "43.4321 8.16406 43.3613 8.17969 43.3057 8.17969 cv 43.2451 8.17969 43.1978\n";
   out << "8.14063 43.1636 8.06445 cv 43.0327 8.06445 li 43.0327 9.50195 li 43.1636\n";
   out << "9.50195 li 43.2373 9.0918 43.3784 8.7832 43.5864 8.57422 cv 43.7949\n";
   out << "8.36719 44.0283 8.26367 44.2866 8.26367 cv 44.4688 8.26367 44.6172\n";
   out << "8.32227 44.7314 8.44141 cv 44.8467 8.55859 44.9033 8.70313 44.9033\n";
   out << "8.86914 cv 44.9033 9.07227 44.8389 9.24023 44.7119 9.37891 cv 44.583\n";
   out << "9.51563 44.3286 9.69141 43.9463 9.90234 cv 43.564 10.1133 43.3135 10.3027\n";
   out << "43.1948 10.4727 cv 43.0762 10.6406 43.0171 10.8516 43.0171 11.1055 cv\n";
   out << "43.0171 11.4375 43.1191 11.7129 43.3232 11.9375 cv 43.5278 12.1582\n";
   out << "43.7925 12.2715 44.1167 12.2715 cv 44.2588 12.2715 44.4316 12.2363\n";
   out << "44.6348 12.1699 cv 44.7686 12.125 44.8584 12.1035 44.9033 12.1035 cv\n";
   out << "44.9463 12.1035 44.9795 12.1133 45.0029 12.1348 cv 45.0264 12.1543\n";
   out << "45.0537 12.2012 45.085 12.2715 cv 45.2158 12.2715 li cp f newpath\n";
   out << "46.6357 10.6367 mo 46.6338 10.0391 46.7637 9.56836 47.0273 9.23047 cv\n";
   out << "47.291 8.88867 47.6006 8.7207 47.957 8.7207 cv 48.1943 8.7207 48.4004\n";
   out << "8.79297 48.5752 8.9375 cv 48.751 9.08203 48.8984 9.33008 49.0166 9.68164\n";
   out << "cv 49.1396 9.59375 li 49.084 9.19336 48.9229 8.82813 48.6572 8.49805\n";
   out << "cv 48.3906 8.16797 48.0576 8.00391 47.6563 8.00391 cv 47.2217 8.00391\n";
   out << "46.8486 8.19141 46.5391 8.56836 cv 46.2295 8.94531 46.0742 9.45117\n";
   out << "46.0742 10.0859 cv 46.0742 10.7754 46.2334 11.3125 46.5508 11.6973\n";
   out << "cv 46.8682 12.082 47.2676 12.2754 47.7471 12.2754 cv 48.1533 12.2754\n";
   out << "48.4873 12.127 48.748 11.8281 cv 49.0088 11.5313 49.1396 11.1328 49.1396\n";
   out << "10.6367 cv 46.6357 10.6367 li cp f newpath 1 setgray 46.6357 10.8906\n";
   out << "mo 48.3135 10.8906 li 48.2998 11.1484 48.2725 11.3301 48.2295 11.4355\n";
   out << "cv 48.1641 11.5996 48.0654 11.7285 47.9346 11.8223 cv 47.8047 11.916\n";
   out << "47.6689 11.9629 47.5264 11.9629 cv 47.3076 11.9629 47.1104 11.8691\n";
   out << "46.9385 11.6797 cv 46.7656 11.4902 46.665 11.2266 46.6357 10.8906 cv cp\n";
   out << "f newpath 0 setgray 51.6748 8.70703 mo 51.3027 8.38672 51.0693 8.20313\n";
   out << "50.9746 8.15234 cv 50.833 8.08008 50.6807 8.04297 50.5205 8.04297 cv\n";
   out << "50.2695 8.04297 50.0635 8.13867 49.9014 8.32813 cv 49.7383 8.51953\n";
   out << "49.6572 8.76953 49.6572 9.08008 cv 49.6572 9.27539 49.6973 9.44531\n";
   out << "49.7764 9.58984 cv 49.8838 9.78906 50.0723 9.97656 50.3398 10.1523 cv\n";
   out << "50.6074 10.3281 51.0518 10.541 51.6748 10.7949 cv 51.6748 10.9531 li\n";
   out << "51.6748 11.3535 51.6182 11.6289 51.5029 11.7793 cv 51.3877 11.9277 51.2217\n";
   out << "12.002 51.0029 12.002 cv 50.8369 12.002 50.7041 11.9531 50.6064 11.8535\n";
   out << "cv 50.5068 11.7539 50.4561 11.6387 50.4561 11.5098 cv 50.4639 11.2559\n";
   out << "li 50.4639 11.1211 50.4326 11.0156 50.3711 10.9434 cv 50.3096 10.8691\n";
   out << "50.2285 10.834 50.1279 10.834 cv 50.0303 10.834 49.9502 10.8711 49.8887\n";
   out << "10.9473 cv 49.8271 11.0234 49.7959 11.1289 49.7959 11.2598 cv 49.7959\n";
   out << "11.5117 49.9121 11.7441 50.1436 11.9551 cv 50.376 12.166 50.7021 12.2715\n";
   out << "51.1211 12.2715 cv 51.4424 12.2715 51.7061 12.2109 51.9121 12.0898 cv\n";
   out << "52.0674 12 52.1826 11.8574 52.2568 11.6641 cv 52.3037 11.5371 52.3271\n";
   out << "11.2793 52.3271 10.8906 cv 52.3271 9.52344 li 52.3271 9.14063 52.334\n";
   out << "8.9043 52.3467 8.81836 cv 52.3604 8.73242 52.3818 8.67383 52.4121 8.64453\n";
   out << "cv 52.4424 8.61523 52.4775 8.60156 52.5166 8.60156 cv 52.5596 8.60156\n";
   out << "52.5967 8.61133 52.6279 8.63281 cv 52.6826 8.66992 52.79 8.77734 52.9482\n";
   out << "8.95313 cv 52.9482 8.70703 li 52.6533 8.26758 52.3701 8.04688 52.1025\n";
   out << "8.04688 cv 51.9727 8.04688 51.8701 8.09766 51.7939 8.19727 cv 51.7168\n";
   out << "8.29688 51.6768 8.4668 51.6748 8.70703 cv cp f newpath 1 setgray 51.6748\n";
   out << "8.99219 mo 51.6748 10.5254 li 51.2764 10.3496 51.0195 10.2246 50.9033\n";
   out << "10.1523 cv 50.6953 10.0234 50.5459 9.88867 50.4561 9.74805 cv 50.3662\n";
   out << "9.60742 50.3223 9.45313 50.3223 9.28711 cv 50.3223 9.07617 50.3789\n";
   out << "8.90039 50.4922 8.76172 cv 50.6055 8.62305 50.7354 8.55273 50.8838\n";
   out << "8.55273 cv 51.084 8.55273 51.3477 8.69922 51.6748 8.99219 cv cp f newpath\n";
   out << "0 setgray 54.2773 12.2715 mo 54.2773 11.3652 li 54.5811 11.9688 54.8916\n";
   out << "12.2715 55.21 12.2715 cv 55.3555 12.2715 55.4756 12.2207 55.5703 12.123\n";
   out << "cv 55.665 12.0254 55.7129 11.9121 55.7129 11.7832 cv 55.7129 11.668\n";
   out << "55.6787 11.5723 55.6104 11.4922 cv 55.542 11.4141 55.46 11.375 55.3643\n";
   out << "11.375 cv 55.2725 11.375 55.1689 11.4238 55.0537 11.5254 cv 54.9404\n";
   out << "11.627 54.8545 11.6777 54.7998 11.6777 cv 54.752 11.6777 54.7002 11.6484\n";
   out << "54.6455 11.5898 cv 54.5264 11.4688 54.4033 11.2715 54.2773 10.9961 cv\n";
   out << "54.2773 9.06641 li 54.2773 8.84375 54.3018 8.67578 54.3525 8.5625 cv\n";
   out << "54.3867 8.48242 54.4473 8.41602 54.5342 8.36328 cv 54.6211 8.31055 54.7471\n";
   out << "8.28516 54.9102 8.28516 cv 54.9102 8.12695 li 53.0557 8.12695 li 53.0557\n";
   out << "8.28516 li 53.2393 8.28516 53.377 8.31641 53.4658 8.38086 cv 53.5322\n";
   out << "8.42773 53.5791 8.50195 53.6045 8.60547 cv 53.6182 8.6543 53.624 8.79688\n";
   out << "53.624 9.03125 cv 53.624 10.5918 li 53.624 11.0605 53.6162 11.3398 53.5986\n";
   out << "11.4297 cv 53.5811 11.5176 53.5498 11.584 53.5039 11.625 cv 53.458 11.666\n";
   out << "53.4004 11.6855 53.332 11.6855 cv 53.25 11.6855 53.1572 11.6641 53.0557\n";
   out << "11.6211 cv 53.0156 11.7793 li 54.1104 12.2715 li 54.2773 12.2715 li cp f\n";
   out << "newpath 58.9912 9.65625 mo 58.8936 9.125 58.7031 8.7168 58.418 8.43164\n";
   out << "cv 58.1338 8.14648 57.8184 8.00391 57.4727 8.00391 cv 57.0615 8.00391\n";
   out << "56.7031 8.19531 56.3975 8.58008 cv 56.0908 8.96289 55.9385 9.48047 55.9385\n";
   out << "10.1348 cv 55.9385 10.7676 56.1074 11.2813 56.4463 11.6777 cv 56.7852\n";
   out << "12.0723 57.1924 12.2715 57.667 12.2715 cv 58.0225 12.2715 58.3154 12.166\n";
   out << "58.5449 11.957 cv 58.7744 11.7461 58.8887 11.5293 58.8887 11.3047 cv\n";
   out << "58.8887 11.1914 58.8564 11.1016 58.792 11.0332 cv 58.7275 10.9648 58.6377\n";
   out << "10.9297 58.5205 10.9297 cv 58.3652 10.9297 58.248 10.9863 58.1689 11.0977\n";
   out << "cv 58.124 11.1582 58.0947 11.2754 58.0801 11.4492 cv 58.0654 11.6211\n";
   out << "58.0127 11.7539 57.9199 11.8438 cv 57.8271 11.9316 57.7002 11.9766\n";
   out << "57.5361 11.9766 cv 57.2725 11.9766 57.0596 11.8672 56.8994 11.6504 cv\n";
   out << "56.6865 11.3633 56.5791 10.9844 56.5791 10.5137 cv 56.5791 10.0313\n";
   out << "56.6846 9.60742 56.8975 9.24023 cv 57.1094 8.87305 57.3965 8.68945\n";
   out << "57.7578 8.68945 cv 58.0166 8.68945 58.248 8.78711 58.4541 8.98438 cv\n";
   out << "58.5986 9.11719 58.7393 9.36328 58.877 9.7168 cv 58.9912 9.65625 li cp\n";
   out << "f newpath 60.5732 14.375 mo 60.5732 11.4316 li 60.8662 11.7891 61.0986\n";
   out << "12.0176 61.2695 12.1191 cv 61.4404 12.2207 61.6123 12.2715 61.7842 12.2715\n";
   out << "cv 61.9893 12.2715 62.166 12.207 62.3135 12.082 cv 62.4619 11.9551 62.5713\n";
   out << "11.7578 62.6416 11.4883 cv 62.6924 11.3008 62.7178 10.957 62.7178 10.4609\n";
   out << "cv 62.7178 9.03711 li 62.7178 8.78125 62.7354 8.60742 62.7725 8.51367 cv\n";
   out << "62.7988 8.44336 62.8438 8.38672 62.9072 8.3457 cv 62.9697 8.30469 63.0869\n";
   out << "8.28516 63.2549 8.28516 cv 63.2549 8.12695 li 61.4756 8.12695 li 61.4756\n";
   out << "8.28516 li 61.5586 8.28516 li 61.7275 8.28516 61.8447 8.3125 61.9111\n";
   out << "8.37109 cv 61.9766 8.42773 62.0225 8.51172 62.0488 8.62305 cv 62.0566\n";
   out << "8.66992 62.0605 8.80859 62.0605 9.03711 cv 62.0605 10.4609 li 62.0605\n";
   out << "10.9004 62.04 11.1875 61.999 11.3262 cv 61.958 11.4629 61.8936 11.5664\n";
   out << "61.8037 11.6348 cv 61.7139 11.7051 61.6064 11.7383 61.4795 11.7383 cv\n";
   out << "61.3506 11.7383 61.2158 11.7012 61.0762 11.625 cv 60.9365 11.5488 60.7686\n";
   out << "11.3945 60.5732 11.1641 cv 60.5732 9.03711 li 60.5732 8.75977 60.5879\n";
   out << "8.58984 60.6143 8.52148 cv 60.6436 8.45508 60.6943 8.39844 60.7695 8.35352\n";
   out << "cv 60.8447 8.30664 60.9746 8.28516 61.1592 8.28516 cv 61.1592 8.12695\n";
   out << "li 59.3633 8.12695 li 59.3633 8.28516 li 59.5244 8.28516 59.6514 8.3125\n";
   out << "59.7432 8.36914 cv 59.7959 8.39648 59.8379 8.45313 59.8701 8.53516 cv\n";
   out << "59.9014 8.61719 59.917 8.7832 59.917 9.03711 cv 59.917 12.6797 li 59.917\n";
   out << "13.1387 59.9072 13.4219 59.8877 13.5273 cv 59.8682 13.6328 59.8369 13.7051\n";
   out << "59.7969 13.7422 cv 59.7549 13.7813 59.7002 13.8008 59.6318 13.8008 cv\n";
   out << "59.5771 13.8008 59.4873 13.7754 59.3633 13.7305 cv 59.3076 13.8828 li\n";
   out << "60.3916 14.375 li 60.5732 14.375 li cp f newpath 66.9932 10.918 mo 66.9932\n";
   out << "9.18164 li 66.9932 8.80664 67.0303 8.57227 67.1025 8.48242 cv 67.2041\n";
   out << "8.35352 67.3564 8.28906 67.5576 8.28906 cv 67.7627 8.28906 li 67.7627\n";
   out << "8.12695 li 65.4658 8.12695 li 65.4658 8.28906 li 65.668 8.28906 li 65.8955\n";
   out << "8.28906 66.0576 8.37109 66.1533 8.53516 cv 66.2061 8.625 66.2334 8.8418\n";
   out << "66.2334 9.18164 cv 66.2334 13.0313 li 66.2334 13.4063 66.1982 13.6387\n";
   out << "66.1279 13.7305 cv 66.0225 13.8574 65.8701 13.9238 65.668 13.9238 cv\n";
   out << "65.4658 13.9238 li 65.4658 14.0859 li 67.4307 14.0859 li 67.9111 14.0859\n";
   out << "68.29 14.0313 68.5674 13.9199 cv 68.8428 13.8105 69.0771 13.625 69.2666\n";
   out << "13.3652 cv 69.4561 13.1035 69.5518 12.7949 69.5518 12.4375 cv 69.5518\n";
   out << "11.9512 69.4072 11.5547 69.1182 11.252 cv 68.8311 10.9453 68.4209 10.7949\n";
   out << "67.8936 10.7949 cv 67.7646 10.7949 67.626 10.8047 67.4756 10.8242 cv\n";
   out << "67.3252 10.8457 67.165 10.875 66.9932 10.918 cv cp f newpath 1 setgray\n";
   out << "66.9932 11.168 mo 67.1318 11.1387 67.2568 11.1152 67.3643 11.1016 cv\n";
   out << "67.4717 11.0859 67.5654 11.0801 67.6416 11.0801 cv 67.915 11.0801 68.1514\n";
   out << "11.1973 68.3506 11.4336 cv 68.5498 11.6699 68.6494 11.9746 68.6494 12.3496\n";
   out << "cv 68.6494 12.6074 68.6025 12.8477 68.5068 13.0684 cv 68.4131 13.2891\n";
   out << "68.2783 13.4551 68.1045 13.5645 cv 67.9307 13.6738 67.7314 13.7305 67.5107\n";
   out << "13.7305 cv 67.376 13.7305 67.2041 13.7012 66.9932 13.6465 cv 66.9932\n";
   out << "11.168 li cp f newpath 0 setgray 71.1494 12.2715 mo 71.1494 11.3652 li\n";
   out << "71.4541 11.9688 71.7646 12.2715 72.083 12.2715 cv 72.2275 12.2715 72.3486\n";
   out << "12.2207 72.4424 12.123 cv 72.5381 12.0254 72.585 11.9121 72.585 11.7832\n";
   out << "cv 72.585 11.668 72.5518 11.5723 72.4814 11.4922 cv 72.4131 11.4141 72.333\n";
   out << "11.375 72.2373 11.375 cv 72.1455 11.375 72.042 11.4238 71.9268 11.5254 cv\n";
   out << "71.8115 11.627 71.7275 11.6777 71.6709 11.6777 cv 71.624 11.6777 71.5732\n";
   out << "11.6484 71.5166 11.5898 cv 71.3994 11.4688 71.2764 11.2715 71.1494 10.9961\n";
   out << "cv 71.1494 9.06641 li 71.1494 8.84375 71.1748 8.67578 71.2256 8.5625\n";
   out << "cv 71.2588 8.48242 71.3193 8.41602 71.4072 8.36328 cv 71.4932 8.31055\n";
   out << "71.6182 8.28516 71.7822 8.28516 cv 71.7822 8.12695 li 69.9268 8.12695\n";
   out << "li 69.9268 8.28516 li 70.1123 8.28516 70.249 8.31641 70.3389 8.38086 cv\n";
   out << "70.4053 8.42773 70.4521 8.50195 70.4775 8.60547 cv 70.4893 8.6543 70.4971\n";
   out << "8.79688 70.4971 9.03125 cv 70.4971 10.5918 li 70.4971 11.0605 70.4873\n";
   out << "11.3398 70.4697 11.4297 cv 70.4541 11.5176 70.4229 11.584 70.376 11.625\n";
   out << "cv 70.3291 11.666 70.2725 11.6855 70.2041 11.6855 cv 70.1221 11.6855\n";
   out << "70.0303 11.6641 69.9268 11.6211 cv 69.8877 11.7793 li 70.9834 12.2715\n";
   out << "li 71.1494 12.2715 li cp f newpath 74.5596 12.2715 mo 75.1084 12.2715\n";
   out << "75.5479 12.0391 75.8799 11.5762 cv 76.1631 11.1816 76.3037 10.7266\n";
   out << "76.3037 10.2148 cv 76.3037 9.85352 76.2256 9.48828 76.0693 9.11914 cv\n";
   out << "75.915 8.75 75.7002 8.47266 75.4268 8.28516 cv 75.1533 8.09766 74.8506\n";
   out << "8.00391 74.5146 8.00391 cv 73.9697 8.00391 73.5361 8.24609 73.2139\n";
   out << "8.72852 cv 72.9424 9.13477 72.8076 9.5918 72.8076 10.0996 cv 72.8076\n";
   out << "10.4688 72.8896 10.8359 73.0537 11.2012 cv 73.2178 11.5645 73.4365 11.834\n";
   out << "73.7041 12.0098 cv 73.9736 12.1836 74.2588 12.2715 74.5596 12.2715 cv cp\n";
   out << "f newpath 1 setgray 74.4365 11.9844 mo 74.2959 11.9844 74.1553 11.9395\n";
   out << "74.0146 11.8457 cv 73.874 11.7539 73.7588 11.5918 73.6729 11.3613 cv\n";
   out << "73.585 11.1289 73.542 10.832 73.542 10.4688 cv 73.542 9.88281 73.6475\n";
   out << "9.37695 73.8564 8.95313 cv 74.0674 8.52734 74.3428 8.31641 74.6865 8.31641\n";
   out << "cv 74.9404 8.31641 75.1514 8.43164 75.3193 8.66797 cv 75.4834 8.90039\n";
   out << "75.5674 9.30469 75.5674 9.875 cv 75.5674 10.5898 75.4287 11.1523 75.1514\n";
   out << "11.5625 cv 74.9658 11.8438 74.7256 11.9844 74.4365 11.9844 cv cp f newpath\n";
   out << "0 setgray 78.0947 12.2715 mo 78.0947 8.21875 li 78.0947 7.53125 77.9619\n";
   out << "7.01953 77.6982 6.68555 cv 77.4346 6.35156 77.0928 6.18359 76.6709 6.18359\n";
   out << "cv 76.4307 6.18359 76.2529 6.23242 76.1377 6.33008 cv 76.0205 6.42578\n";
   out << "75.9619 6.52539 75.9619 6.62891 cv 75.9619 6.73047 75.9951 6.81836\n";
   out << "76.0596 6.89258 cv 76.124 6.96484 76.2002 7.00195 76.2881 7.00195 cv\n";
   out << "76.3564 7.00195 76.4268 6.98242 76.4971 6.94531 cv 76.542 6.92383 76.6279\n";
   out << "6.84961 76.7568 6.72266 cv 76.8838 6.5957 76.9912 6.53125 77.0791 6.53125\n";
   out << "cv 77.1416 6.53125 77.2021 6.55859 77.2646 6.61328 cv 77.3252 6.66602\n";
   out << "77.3701 6.75781 77.3975 6.88477 cv 77.4287 7.01172 77.4424 7.28906\n";
   out << "77.4424 7.71289 cv 77.4424 10.5781 li 77.4424 11.0215 77.4307 11.3047\n";
   out << "77.4072 11.4316 cv 77.3877 11.5273 77.3604 11.5938 77.3193 11.6309 cv\n";
   out << "77.2803 11.668 77.2256 11.6855 77.1572 11.6855 cv 77.083 11.6855 76.9932\n";
   out << "11.6641 76.8877 11.6211 cv 76.833 11.7793 li 77.9248 12.2715 li 78.0947\n";
   out << "12.2715 li cp f newpath 77.7549 14.3809 mo 77.8682 14.3809 77.9639 14.3359\n";
   out << "78.0439 14.248 cv 78.1221 14.1602 78.1611 14.0527 78.1611 13.9277 cv\n";
   out << "78.1611 13.8047 78.1221 13.6992 78.0439 13.6113 cv 77.9639 13.5234\n";
   out << "77.8682 13.4785 77.7549 13.4785 cv 77.6436 13.4785 77.5498 13.5234\n";
   out << "77.4697 13.6113 cv 77.3916 13.6992 77.3506 13.8047 77.3506 13.9277 cv\n";
   out << "77.3506 14.0527 77.3916 14.1602 77.4697 14.248 cv 77.5498 14.3359 77.6436\n";
   out << "14.3809 77.7549 14.3809 cv cp f newpath 79.6963 10.6367 mo 79.6943 10.0391\n";
   out << "79.8232 9.56836 80.0869 9.23047 cv 80.3506 8.88867 80.6611 8.7207 81.0166\n";
   out << "8.7207 cv 81.2549 8.7207 81.46 8.79297 81.6357 8.9375 cv 81.8115 9.08203\n";
   out << "81.958 9.33008 82.0771 9.68164 cv 82.2002 9.59375 li 82.1436 9.19336\n";
   out << "81.9834 8.82813 81.7178 8.49805 cv 81.4521 8.16797 81.1182 8.00391\n";
   out << "80.7178 8.00391 cv 80.2822 8.00391 79.9092 8.19141 79.5986 8.56836 cv\n";
   out << "79.29 8.94531 79.1357 9.45117 79.1357 10.0859 cv 79.1357 10.7754 79.2939\n";
   out << "11.3125 79.6104 11.6973 cv 79.9287 12.082 80.3291 12.2754 80.8076 12.2754\n";
   out << "cv 81.2139 12.2754 81.5479 12.127 81.8076 11.8281 cv 82.0693 11.5313\n";
   out << "82.2002 11.1328 82.2002 10.6367 cv 79.6963 10.6367 li cp f newpath\n";
   out << "1 setgray 79.6963 10.8906 mo 81.374 10.8906 li 81.3604 11.1484 81.333\n";
   out << "11.3301 81.29 11.4355 cv 81.2256 11.5996 81.126 11.7285 80.9971 11.8223 cv\n";
   out << "80.8643 11.916 80.7295 11.9629 80.5869 11.9629 cv 80.3662 11.9629 80.1729\n";
   out << "11.8691 79.999 11.6797 cv 79.8252 11.4902 79.7256 11.2266 79.6963 10.8906\n";
   out << "cv cp f newpath 0 setgray 85.7607 9.65625 mo 85.6611 9.125 85.4717 8.7168\n";
   out << "85.1865 8.43164 cv 84.9014 8.14648 84.585 8.00391 84.2412 8.00391 cv\n";
   out << "83.8291 8.00391 83.4717 8.19531 83.165 8.58008 cv 82.8604 8.96289 82.7061\n";
   out << "9.48047 82.7061 10.1348 cv 82.7061 10.7676 82.876 11.2813 83.2139 11.6777\n";
   out << "cv 83.5537 12.0723 83.96 12.2715 84.4346 12.2715 cv 84.79 12.2715 85.083\n";
   out << "12.166 85.3135 11.957 cv 85.542 11.7461 85.6572 11.5293 85.6572 11.3047\n";
   out << "cv 85.6572 11.1914 85.624 11.1016 85.5596 11.0332 cv 85.4951 10.9648\n";
   out << "85.4053 10.9297 85.2881 10.9297 cv 85.1338 10.9297 85.0166 10.9863\n";
   out << "84.9365 11.0977 cv 84.8916 11.1582 84.8623 11.2754 84.8486 11.4492\n";
   out << "cv 84.833 11.6211 84.7803 11.7539 84.6885 11.8438 cv 84.5947 11.9316\n";
   out << "84.4678 11.9766 84.3037 11.9766 cv 84.04 11.9766 83.8291 11.8672 83.667\n";
   out << "11.6504 cv 83.4541 11.3633 83.3467 10.9844 83.3467 10.5137 cv 83.3467\n";
   out << "10.0313 83.4521 9.60742 83.665 9.24023 cv 83.8779 8.87305 84.1631 8.68945\n";
   out << "84.5264 8.68945 cv 84.7842 8.68945 85.0166 8.78711 85.2217 8.98438 cv\n";
   out << "85.3662 9.11719 85.5068 9.36328 85.6455 9.7168 cv 85.7607 9.65625 li cp f\n";
   out << "newpath 87.3291 13.4746 mo 87.3291 12.1523 li 88.1768 12.1523 li 88.1768\n";
   out << "11.8438 li 87.3291 11.8438 li 87.3291 9.23438 li 87.3291 8.97266 87.3623\n";
   out << "8.79688 87.4307 8.70703 cv 87.499 8.61523 87.585 8.57031 87.6904 8.57031\n";
   out << "cv 87.7764 8.57031 87.8604 8.59961 87.9424 8.66016 cv 88.0244 8.7207\n";
   out << "88.0869 8.80859 88.1338 8.92578 cv 88.2861 8.92578 li 88.1943 8.63867\n";
   out << "88.0654 8.42383 87.8955 8.27734 cv 87.7275 8.13281 87.5537 8.06055\n";
   out << "87.374 8.06055 cv 87.2529 8.06055 87.1338 8.09766 87.0166 8.17188 cv\n";
   out << "86.9014 8.24805 86.8154 8.35352 86.7607 8.49414 cv 86.7041 8.63281\n";
   out << "86.6768 8.84766 86.6768 9.13672 cv 86.6768 11.8438 li 86.1045 11.8438\n";
   out << "li 86.1045 11.9902 li 86.249 12.0527 86.3955 12.1621 86.5498 12.3164\n";
   out << "cv 86.7002 12.4707 86.835 12.6523 86.9541 12.8633 cv 87.0146 12.9746\n";
   out << "87.0986 13.1777 87.2061 13.4746 cv 87.3291 13.4746 li cp f grestore } def\n";
   out << "\n";
}


void printLogoDefinitionCCARH(ostream& out) {
   out <<  "\%BoundingBox: 0 0 25 24\n";
   out <<  "\%HiResBoundingBox: 0 0 24.0977 23.5040\n";
   out <<  "\%CropBox: 0 0 24.0977 23.5040\n";
   out <<  "/CCARHcolophon { /mo /moveto load def /li /lineto load def /cv /curveto\n";
   out <<  "load def /cp /closepath load def /f  /fill load def gsave 0.0 setgray\n";
   out <<  "24.0977 23.5040 translate -1 1 scale 180 rotate -24.0977 0 translate\n";
   out <<  "newpath 0 0 mo 0 23.5039 li 24.0977 23.5039 li 24.0977 0 li cp clip\n";
   out <<  "newpath 21.3477 11.9219 mo 21.189 11.8672 21.0112 11.625 20.8896 11.5137\n";
   out <<  "cv 20.6719 11.3135 20.9517 11.166 21.0781 11.0498 cv 21.2515 10.8906\n";
   out <<  "21.5469 10.5244 21.8047 10.5518 cv 21.9932 10.6787 22.0732 10.9258\n";
   out <<  "22.2573 11.0693 cv 22.5488 11.2949 22.5112 11.4033 22.2407 11.6104 cv\n";
   out <<  "22.0796 11.7344 21.4888 12.4023 21.3477 11.9219 cv cp false setoverprint\n";
   out <<  "f 16.1987 5.13184 mo 16.2178 5.11719 16.2305 5.09473 16.2402 5.07031 cv\n";
   out <<  "16.3706 5.05762 16.3784 5.16699 16.4893 5.17383 cv 16.8193 4.87207 17.1455\n";
   out <<  "4.57031 17.4238 4.21875 cv 17.5898 4.00977 18.2222 3.2998 18.2344 3.03516\n";
   out <<  "cv 18.1978 2.94043 18.1108 2.89453 18.0464 2.82715 cv 18.0347 2.75977\n";
   out <<  "18.0605 2.73145 18.0679 2.68262 cv 18.3223 2.68262 18.6709 3.06152\n";
   out <<  "18.8979 3.18066 cv 18.9019 3.5332 18.1074 3.81152 18.0259 4.17773 cv\n";
   out <<  "18.2827 4.55664 18.7036 4.77344 19.064 5.0498 cv 19.2939 5.00098 19.8232\n";
   out <<  "4.30371 19.749 4.05273 cv 19.6465 3.98926 19.3799 3.90137 19.563 3.74121\n";
   out <<  "cv 19.7935 3.73242 20.2363 4.16699 20.4551 4.28125 cv 20.415 4.42676\n";
   out <<  "19.5083 5.41309 19.417 5.40234 cv 19.3872 5.625 19.061 5.95898 18.9395\n";
   out <<  "6.14941 cv 18.6724 6.56934 18.8379 6.57422 18.7734 7.00098 cv 18.6694\n";
   out <<  "7.02832 18.0186 6.59375 18.0059 6.48242 cv 17.9863 6.32129 18.334\n";
   out <<  "6.07324 18.4204 5.95605 cv 18.5801 5.74023 18.8428 5.55859 18.9395\n";
   out <<  "5.31934 cv 18.6665 5.05469 18.0869 4.68066 17.7144 4.59277 cv 17.4517\n";
   out <<  "4.70313 17.1392 5.31445 17.0298 5.56836 cv 17.043 5.67969 17.2114 5.63574\n";
   out <<  "17.1953 5.77637 cv 17.1675 5.79688 17.1533 5.83105 17.1333 5.85938 cv\n";
   out <<  "16.9624 5.81641 16.1982 5.2959 16.1987 5.13184 cv cp f 18.1914 17.2578\n";
   out <<  "mo 18.2017 17.2529 18.2109 17.2471 18.2202 17.2412 cv 18.21 17.25 18.2007\n";
   out <<  "17.2559 18.1914 17.2578 cv cp f 14.5166 4.03223 mo 14.3486 4.10352 13.3726\n";
   out <<  "3.89844 13.3125 3.69922 cv 13.3452 3.5625 13.5361 3.64063 13.645 3.6582 cv\n";
   out <<  "13.9556 3.25293 13.9087 2.67578 14.1846 2.26758 cv 14.188 1.9834 14.561\n";
   out <<  "1.27051 14.4341 1.02148 cv 14.3604 .920898 14.166 .943359 14.04 .896484\n";
   out <<  "cv 14.04 .833984 14.04 .772461 14.04 .708984 cv 14.2393 .651367 14.6763\n";
   out <<  ".776367 14.8901 .813477 cv 15.3232 .888672 15.7041 1.04199 16.1152 1.1875\n";
   out <<  "cv 16.2563 1.58984 16.3784 1.74805 16.1206 2.12695 cv 15.9355 2.40137\n";
   out <<  "15.668 2.58105 15.3057 2.59863 cv 15.3809 2.97461 15.583 3.30176 15.7578\n";
   out <<  "3.63379 cv 15.832 3.77832 15.9063 3.92383 15.9795 4.06836 cv 16.1621\n";
   out <<  "4.41992 16.147 4.14355 16.3647 4.34375 cv 16.3647 4.39844 16.3647 4.4541\n";
   out <<  "16.3647 4.50879 cv 15.9697 4.55371 15.7476 4.42188 15.4092 4.36426 cv\n";
   out <<  "15.3687 3.98926 14.8911 2.71973 14.5381 2.62012 cv 14.335 2.78906 14.334\n";
   out <<  "3.54492 14.2261 3.80371 cv 14.2861 3.86133 14.4072 3.85742 14.5166 3.86523\n";
   out <<  "cv 14.5166 3.9209 14.5166 3.97656 14.5166 4.03223 cv cp 15.0151 1.10449\n";
   out <<  "mo 14.9214 1.50586 14.6387 1.91016 14.6411 2.34961 cv 14.8555 2.52441\n";
   out <<  "15.2041 2.45215 15.4307 2.3291 cv 15.5977 1.89063 15.707 1.16699 15.0151\n";
   out <<  "1.10449 cv cp f .0239258 13.2715 mo -.0605469 12.9033 .108887 12.5498\n";
   out <<  ".0493164 12.1924 cv -.0327148 11.7012 .0253906 11.042 .106445 10.5518 cv\n";
   out <<  ".250488 9.7168 .408691 8.87402 .688477 8.08105 cv .877441 7.55176 1.13232\n";
   out <<  "6.98926 1.39404 6.48242 cv 1.38428 6.0625 1.73047 5.84082 1.92529 5.53516\n";
   out <<  "cv 2.16943 5.15137 2.39893 4.7168 2.76465 4.44727 cv 2.92188 3.76758\n";
   out <<  "3.76221 3.40039 4.22021 2.85742 cv 4.42041 2.62012 4.67236 2.50586\n";
   out <<  "4.92383 2.30859 cv 5.18359 2.10742 5.74268 1.86621 5.87891 1.58105 cv\n";
   out <<  "6.12988 1.5791 7.47998 1.0957 7.51904 .875977 cv 7.67969 .950195 8.21582\n";
   out <<  ".714844 8.39111 .667969 cv 8.68115 .59082 9.0083 .439453 9.28418 .31543\n";
   out <<  "cv 9.60156 .202148 10.0532 .338867 10.4072 .212891 cv 10.9258 .0283203\n";
   out <<  "11.4917 .0869141 12.0259 .107422 cv 12.1289 0 12.7749 -.0283203 12.9038\n";
   out <<  ".0283203 cv 13.1646 .143555 13.7148 .0859375 14.0474 .141602 cv 14.376\n";
   out <<  ".196289 14.7847 .222656 15.1187 .293945 cv 15.5313 .385742 15.9189\n";
   out <<  ".667969 16.3647 .667969 cv 16.5483 .860352 17.0947 1.01758 17.3408\n";
   out <<  "1.10449 cv 17.5977 1.19434 18.1045 1.40039 18.2544 1.64453 cv 18.6831\n";
   out <<  "1.70313 18.8599 2.10254 19.1919 2.30566 cv 19.5845 2.5459 19.9141 2.87109\n";
   out <<  "20.2686 3.18066 cv 20.2334 3.39551 20.8125 3.84473 20.9951 3.92773 cv\n";
   out <<  "21.1328 4.31348 21.4473 4.65625 21.7031 4.9707 cv 22.2739 5.6709 22.8364\n";
   out <<  "6.6377 23.0581 7.51172 cv 23.1152 7.73828 23.3711 8.40625 23.5288 8.55859\n";
   out <<  "cv 23.5698 8.73047 23.5684 8.90723 23.6997 9.06543 cv 23.8955 9.30078\n";
   out <<  "23.7207 9.7793 23.8496 10.0518 cv 23.9341 10.2285 23.8901 10.3848\n";
   out <<  "23.8833 10.5713 cv 23.874 10.8389 24.0713 10.9199 24.0342 11.1924 cv\n";
   out <<  "23.981 11.5859 24.1367 12.0176 24.0884 12.4199 cv 24.04 12.8477 24.0352\n";
   out <<  "13.29 23.9956 13.7295 cv 23.9634 14.0938 23.8394 14.5303 23.7729 14.8848\n";
   out <<  "cv 23.7012 15.2686 23.4063 15.7285 23.4038 16.0957 cv 23.0811 16.5508\n";
   out <<  "22.7925 17.0996 22.5527 17.6113 cv 22.3999 17.9473 22.1523 18.2354 21.9717\n";
   out <<  "18.5664 cv 21.8765 18.7402 21.7744 18.9268 21.5562 18.9609 cv 21.5195\n";
   out <<  "19.127 21.2778 19.4434 21.1548 19.5254 cv 20.9946 19.6318 20.6445 20.2813\n";
   out <<  "20.4863 20.29 cv 20.2803 20.3018 19.563 20.9551 19.4297 21.123 cv 19.2949\n";
   out <<  "21.2969 19.1777 21.3408 18.96 21.3701 cv 18.8569 21.543 18.7036 21.6748\n";
   out <<  "18.5317 21.7754 cv 18.3452 21.8838 18.1934 21.9736 18.0229 22.0898 cv\n";
   out <<  "17.8423 22.2148 17.5415 22.1826 17.3818 22.3242 cv 16.7993 22.8525\n";
   out <<  "15.7852 22.6699 15.2227 23.1758 cv 14.3022 23.2363 13.3677 23.6143\n";
   out <<  "12.4546 23.4727 cv 12.1069 23.4199 11.8403 23.4854 11.5068 23.4258 cv\n";
   out <<  "11.1938 23.3691 10.8496 23.3027 10.5386 23.2852 cv 9.729 23.2412 8.99951\n";
   out <<  "22.9307 8.19922 22.7559 cv 7.43457 22.5889 6.73438 22.04 6.01807 21.6875\n";
   out <<  "cv 5.33447 21.3516 4.64453 20.9512 4.12256 20.3643 cv 3.9248 20.1416\n";
   out <<  "3.00732 19.5742 3.03418 19.2725 cv 2.65674 19.1904 2.50488 18.665 2.26123\n";
   out <<  "18.4268 cv 2.05762 18.2266 1.74609 17.8096 1.68457 17.5078 cv .60498\n";
   out <<  "16.3359 .363281 14.7754 .0239258 13.2715 cv cp .854004 10.1572 mo .769043\n";
   out <<  "10.5254 .520996 11.2471 .563477 11.5898 cv .525879 12.1514 .716797 12.7324\n";
   out <<  ".635254 13.2832 cv .600586 13.5254 .699707 14.2461 .82666 14.457 cv\n";
   out <<  "1.09082 14.8955 1.04297 15.375 1.3291 15.8037 cv 1.58984 16.1963 1.68994\n";
   out <<  "16.7119 1.89209 17.1338 cv 2.11035 17.5928 2.57422 18.0127 2.91797 18.3789\n";
   out <<  "cv 3.24268 18.7246 3.50732 19.0947 3.84473 19.4385 cv 4.23389 19.8438\n";
   out <<  "4.66211 20.2021 5.0874 20.583 cv 5.35254 20.8203 5.8291 21.0586 6.16797\n";
   out <<  "21.2236 cv 6.5459 21.4072 6.94189 21.7637 7.37354 21.8467 cv 6.36621\n";
   out <<  "21.1885 6.98584 20.0605 7.61719 19.4531 cv 8.09961 18.9893 8.83496 19.0391\n";
   out <<  "9.45068 19.0439 cv 9.78076 19.3818 9.69189 19.7197 9.40869 20.1445 cv\n";
   out <<  "9.33301 20.1299 9.22998 20.1436 9.20166 20.083 cv 9.18066 19.8887 9.30762\n";
   out <<  "19.8428 9.30566 19.667 cv 9.11279 19.3574 8.48584 19.2715 8.18066 19.4258\n";
   out <<  "cv 7.81201 19.6133 7.70264 19.9463 7.53174 20.2822 cv 7.27637 20.7852\n";
   out <<  "7.55078 21.1299 7.76855 21.5566 cv 8.00781 21.6553 8.24219 21.7783\n";
   out <<  "8.50684 21.7939 cv 8.77832 21.8105 8.88818 21.5889 9.11816 21.5977 cv\n";
   out <<  "9.17529 21.6377 9.21533 21.6953 9.20166 21.8057 cv 8.91113 21.9795 8.5874\n";
   out <<  "22.2402 8.2251 22.1299 cv 8.12988 22.1016 7.70459 21.9824 7.62354 22.0137\n";
   out <<  "cv 8.354 22.4736 9.26807 22.6924 10.0864 22.7627 cv 10.877 22.8301 11.7007\n";
   out <<  "23.127 12.5083 23.0156 cv 12.8657 22.9668 13.126 23.0898 13.499 22.9893 cv\n";
   out <<  "13.7593 23.0244 14.1968 22.915 14.4546 22.8438 cv 14.7881 22.752 15.1011\n";
   out <<  "22.6357 15.4468 22.5654 cv 15.6289 22.5283 16.1499 22.4697 16.2817 22.3457\n";
   out <<  "cv 15.793 22.3047 15.1064 20.8906 14.6411 21.0791 cv 14.5264 21.4365\n";
   out <<  "14.9102 21.9043 14.7866 22.2627 cv 14.8892 22.3174 15.1211 22.1445\n";
   out <<  "15.1392 22.3457 cv 15.0518 22.541 13.9385 22.7305 13.9561 22.4902 cv\n";
   out <<  "14.04 22.4492 14.1108 22.3965 14.2056 22.3662 cv 14.3364 21.9795 14.1602\n";
   out <<  "21.3965 14.1221 20.9961 cv 14.103 20.792 14.061 20.5928 14.04 20.3936 cv\n";
   out <<  "14.0156 20.1787 13.8735 19.8545 13.894 19.6465 cv 13.7646 19.6025 13.4746\n";
   out <<  "19.7393 13.3745 19.6045 cv 13.4673 19.2861 14.1133 19.4844 14.2676 19.2725\n";
   out <<  "cv 13.8247 19.249 13.4165 19.4629 12.98 19.501 cv 12.6099 19.5332 12.3003\n";
   out <<  "19.457 11.9419 19.418 cv 11.2109 19.3389 10.5034 19.3398 9.76172 19.1895\n";
   out <<  "cv 9.29199 18.7109 8.42871 18.7744 7.92236 18.3184 cv 7.80371 18.2119\n";
   out <<  "7.00439 17.5957 6.93799 17.6113 cv 6.94971 17.4111 6.05518 16.8721 5.89551\n";
   out <<  "16.6914 cv 5.69385 16.4648 5.53369 16.1816 5.2915 15.9902 cv 4.67041 15.5\n";
   out <<  "4.53613 14.7471 4.40479 14.0195 cv 4.39307 13.9834 4.30615 14.0215 4.30078\n";
   out <<  "13.9775 cv 4.354 13.5557 4.21338 12.9434 4.10742 12.5303 cv 4.0415 12.2715\n";
   out <<  "4.04346 11.5146 4.11426 11.2578 cv 4.30762 10.832 4.10254 10.3809 4.20898\n";
   out <<  "9.94824 cv 4.31885 9.50098 4.26465 9.07031 4.40479 8.62109 cv 4.53174\n";
   out <<  "8.20898 4.58789 7.93457 4.87988 7.72559 cv 5.03271 7.61523 5.16357 7.45215\n";
   out <<  "5.33887 7.375 cv 5.41357 7.02344 5.60889 7.16016 5.8374 6.95898 cv 5.91113\n";
   out <<  "6.56055 6.41992 6.04004 6.77197 5.95508 cv 7.19482 5.85254 7.15186 5.31152\n";
   out <<  "7.47803 5.21582 cv 7.53809 5.23242 7.49072 5.35449 7.58154 5.33984 cv\n";
   out <<  "7.86621 5.31934 8.08252 4.96094 8.3291 4.8623 cv 8.65381 4.73242 9.00684\n";
   out <<  "4.71191 9.32471 4.57227 cv 10.0332 4.25879 10.8457 4.19629 11.583 4.06934\n";
   out <<  "cv 11.9971 3.99805 12.5298 4.0752 12.9331 4.14355 cv 13.3838 4.21973\n";
   out <<  "13.8179 4.25977 14.2593 4.42383 cv 14.4453 4.49316 14.6216 4.59863\n";
   out <<  "14.7451 4.75879 cv 14.9893 4.78809 15.1328 4.79785 15.3467 4.92676 cv\n";
   out <<  "15.645 5.10547 16.0825 5.50586 16.4268 5.50586 cv 16.4404 5.59668 17.0645\n";
   out <<  "6.10742 17.1333 6.16992 cv 17.333 6.41992 17.7124 6.47656 17.8394 6.79297\n";
   out <<  "cv 18.1401 6.91699 18.4243 7.2627 18.5942 7.48145 cv 18.7715 7.71094\n";
   out <<  "19.0532 7.81152 19.1611 8.09473 cv 19.3613 8.61816 19.9194 9.34277\n";
   out <<  "19.895 9.89648 cv 19.8818 10.1982 20.0664 10.5205 20.0811 10.8428 cv\n";
   out <<  "20.0923 11.0781 20.0698 11.3291 20.0752 11.5684 cv 20.1006 12.8828\n";
   out <<  "20.1953 14.1016 19.6299 15.3232 cv 19.4429 15.7275 19.1021 16.3467\n";
   out <<  "18.687 16.5586 cv 18.5293 16.6387 18.333 17.1406 18.2202 17.2412 cv\n";
   out <<  "18.2109 17.2471 18.2017 17.2529 18.1914 17.2578 cv 18.2007 17.2559 18.21\n";
   out <<  "17.25 18.2202 17.2412 cv 18.3994 17.124 18.439 16.8672 18.6904 16.8223 cv\n";
   out <<  "18.8564 16.9473 18.9414 17.334 19.0874 17.5127 cv 19.2197 17.6748 19.3105\n";
   out <<  "17.8525 19.4146 18.0322 cv 19.6401 18.4219 20.0811 18.9551 20.4761 19.168\n";
   out <<  "cv 20.6025 19.1904 20.6172 19.1025 20.7251 19.1064 cv 20.8145 19.1006\n";
   out <<  "20.7935 19.2041 20.8706 19.21 cv 20.8726 19.0303 21.3921 18.4766 21.5303\n";
   out <<  "18.334 cv 21.7363 18.1221 21.8184 17.7822 21.9717 17.5078 cv 22.0903\n";
   out <<  "17.2949 22.3799 17.1816 22.4692 16.9883 cv 22.4692 16.623 22.6533 16.4141\n";
   out <<  "22.7227 16.0693 cv 22.7656 15.8564 22.8877 15.5664 23.0098 15.3896 cv\n";
   out <<  "23.2827 14.9922 23.291 14.3037 23.3306 13.8223 cv 23.3765 13.2725 23.646\n";
   out <<  "12.748 23.5249 12.1953 cv 23.4565 11.8818 23.522 11.5996 23.5239 11.2861\n";
   out <<  "cv 23.5249 11.0977 23.4038 11.0088 23.3828 10.8213 cv 23.3398 10.4287\n";
   out <<  "23.2559 10.0908 23.1953 9.7002 cv 23.144 9.35547 22.9067 9.06836 22.8638\n";
   out <<  "8.72461 cv 22.7749 8.03125 22.3423 7.58398 22.1357 6.93164 cv 21.9482\n";
   out <<  "6.34082 21.5039 5.4209 21.0581 5.04883 cv 20.8638 4.88672 20.9121 4.71973\n";
   out <<  "20.71 4.52539 cv 20.4746 4.29785 20.3911 3.97949 20.1074 3.81543 cv\n";
   out <<  "19.811 3.64258 19.7236 3.40137 19.498 3.17773 cv 19.3237 3.00586 19.1235\n";
   out <<  "2.93848 19.0132 2.7334 cv 18.7832 2.30859 17.9805 2.2168 17.7549 1.79102\n";
   out <<  "cv 17.6807 1.65234 17.3408 1.45996 17.1953 1.33203 cv 16.9907 1.36719\n";
   out <<  "16.7749 1.24023 16.604 1.17676 cv 16.1328 1.00293 15.5801 .760742\n";
   out <<  "15.0771 .647461 cv 14.5215 .521484 13.8774 .486328 13.3125 .501953\n";
   out <<  "cv 12.7485 .513672 12.2129 .360352 11.6445 .394531 cv 11.2383 .418945\n";
   out <<  "10.8638 .583008 10.4702 .668945 cv 10.1631 .736328 9.87207 .668945 9.5874\n";
   out <<  ".763672 cv 9.13037 .916016 8.64209 .954102 8.18408 1.10449 cv 8.15527\n";
   out <<  "1.49609 8.37598 1.80859 8.43311 2.18359 cv 8.36279 2.19727 8.32617\n";
   out <<  "2.24316 8.22559 2.22559 cv 8.12256 2.13379 8.10156 1.96191 8.01709\n";
   out <<  "1.85156 cv 6.89795 1.68945 6.72754 3.16699 7.28076 3.79785 cv 7.67969\n";
   out <<  "4.25293 8.07568 4.31641 8.63184 4.08203 cv 8.83789 3.99512 9.12354 3.29199\n";
   out <<  "9.32568 3.4502 cv 9.55811 3.85352 8.72656 4.68066 8.39111 4.80762 cv\n";
   out <<  "7.74707 5.05078 7.0625 4.81348 6.81396 4.14551 cv 6.69531 3.82813 6.61475\n";
   out <<  "3.63379 6.56494 3.30566 cv 6.51416 2.98438 6.67822 2.74902 6.66846 2.43262\n";
   out <<  "cv 6.87256 2.25 6.9043 1.95508 7.104 1.76855 cv 7.31055 1.5752 7.58057\n";
   out <<  "1.43164 7.81006 1.25 cv 7.15234 1.51465 6.56299 1.80859 5.94092 2.16309 cv\n";
   out <<  "5.4834 2.4248 4.71875 2.70605 4.50879 3.24219 cv 4.54541 3.24805 4.6123\n";
   out <<  "3.18457 4.6333 3.24219 cv 4.7251 3.40527 5.11572 3.89551 5.13135 4.07324\n";
   out <<  "cv 5.0791 4.13867 5.02148 4.19922 4.92383 4.21875 cv 4.67236 4.09277\n";
   out <<  "4.6499 3.74219 4.31348 4.02148 cv 4.09229 4.20508 3.91846 4.47754 3.80273\n";
   out <<  "4.7373 cv 3.97559 5.26074 4.42578 6.66211 5.30811 6.19629 cv 5.61377\n";
   out <<  "6.03516 5.98242 5.91797 6.05225 5.52539 cv 6.08398 5.34863 6.1582 4.92773\n";
   out <<  "6.37793 5.21582 cv 6.22363 5.61914 6.28223 5.92969 6.05371 6.33203 cv\n";
   out <<  "5.94873 6.5166 5.7793 6.71387 5.57813 6.80566 cv 5.16113 6.99609 4.56641\n";
   out <<  "7 4.28027 6.62695 cv 4.11182 6.39941 3.85986 6.29102 3.72559 6.00977 cv\n";
   out <<  "3.57275 5.69043 3.48877 5.34277 3.50195 4.98828 cv 3.52637 4.30078 3.9165\n";
   out <<  "3.7373 4.40479 3.28418 cv 3.82178 3.3584 3.24121 4.4209 2.86816 4.7793 cv\n";
   out <<  "2.7334 5.2666 2.21875 5.59082 2.01709 6.06738 cv 1.84814 6.4668 1.58008\n";
   out <<  "6.90137 1.52734 7.3252 cv 1.47217 7.7627 1.15771 8.07227 1.14111 8.5332\n";
   out <<  "cv 1.13135 8.79688 .992676 9 .937012 9.24316 cv .869141 9.54492 .925293\n";
   out <<  "9.85547 .854004 10.1572 cv cp 4.86182 9.86621 mo 4.3916 10.3623 4.74707\n";
   out <<  "11.6514 4.67432 12.2744 cv 4.60742 12.4541 4.78174 12.7773 4.75586 12.9902\n";
   out <<  "cv 4.70117 13.4346 4.83984 13.6387 4.90283 14.0605 cv 4.96289 14.4541\n";
   out <<  "4.94727 14.7539 5.19238 15.0586 cv 5.29932 15.1924 5.64551 15.6426 5.81689\n";
   out <<  "15.6592 cv 6.25781 15.3047 6.02832 14.4541 6.48096 14.123 cv 6.48096\n";
   out <<  "13.6719 6.24365 13.583 5.99609 13.2461 cv 5.8457 13.042 5.79395 12.71\n";
   out <<  "5.69238 12.4824 cv 5.75977 12.1523 5.57813 11.2891 5.98291 11.1328 cv\n";
   out <<  "5.97949 10.8008 6.23779 10.5928 6.29443 10.2822 cv 6.34619 10.2949 6.63672\n";
   out <<  "10.0371 6.64746 9.99121 cv 6.39307 9.70215 6.22461 9.54004 6.01611 9.23828\n";
   out <<  "cv 5.78369 8.90039 5.60889 8.58008 5.33887 8.24707 cv 4.63135 8.24707\n";
   out <<  "4.9209 9.43945 4.86182 9.86621 cv cp 5.54688 7.97656 mo 5.56787 8.27734\n";
   out <<  "7.57129 8.11816 7.83154 8.10156 cv 7.50928 6.72656 9.53076 6.40137 10.4058\n";
   out <<  "6.19141 cv 10.5083 5.97754 10.4521 5.86914 10.6025 5.66602 cv 10.6909\n";
   out <<  "5.54785 10.7715 5.4248 10.8433 5.29492 cv 10.9546 5.09375 11.1914 4.9248\n";
   out <<  "11.2163 4.67578 cv 11.0146 4.37695 9.82568 4.89453 9.53809 4.92773 cv\n";
   out <<  "9.17285 4.9707 8.87793 5.19531 8.54102 5.32031 cv 8.35059 5.39063 7.98242\n";
   out <<  "5.47656 7.83252 5.60059 cv 7.35498 5.99805 6.76074 6.27441 6.38818 6.81445\n";
   out <<  "cv 6.27881 6.97363 6.05664 7.40918 5.8374 7.45801 cv 5.83936 7.56055\n";
   out <<  "5.62061 7.90625 5.54688 7.97656 cv cp 6.51074 15.1084 mo 6.37354 15.3525\n";
   out <<  "6.13086 15.6064 6.12842 15.9092 cv 6.29639 16.0205 6.44385 15.917 6.59375\n";
   out <<  "15.8408 cv 6.78418 15.7441 7.00391 15.8047 7.20898 15.8096 cv 7.54102\n";
   out <<  "15.8184 7.92188 15.7725 8.10059 15.4521 cv 8.04492 15.0664 8.2124 14.7441\n";
   out <<  "8.18408 14.3926 cv 7.69531 14.5391 7.45557 14.1699 7.04199 14.1025 cv\n";
   out <<  "6.93506 14.4932 6.70068 14.7715 6.51074 15.1084 cv cp 7.66504 8.5166 mo\n";
   out <<  "7.33105 8.4541 6.31445 8.34375 6.04541 8.6416 cv 6.01953 8.91504 6.86279\n";
   out <<  "9.97559 7.14697 9.79395 cv 7.32031 9.68262 7.95703 9.72168 7.75586 9.33984\n";
   out <<  "cv 7.58887 9.02148 7.75586 8.83887 7.66504 8.5166 cv cp 6.64893 10.918\n";
   out <<  "mo 6.37256 11.1543 6.26221 11.5889 6.25293 11.9639 cv 6.24268 12.3525\n";
   out <<  "6.55566 13.0186 6.82617 13.2793 cv 7.18457 13.626 7.57227 13.9658 8.12207\n";
   out <<  "13.8945 cv 8.36963 13.71 8.42725 13.8213 8.70313 13.749 cv 8.85547 13.71\n";
   out <<  "8.91357 13.4785 9.09814 13.5205 cv 9.27441 13.3232 9.97119 13.2402 9.99023\n";
   out <<  "13.002 cv 9.41602 12.9688 8.35791 13.6035 7.83154 13.251 cv 7.79004 13.207\n";
   out <<  "7.81494 13.1133 7.83154 13.0635 cv 8.4917 12.9795 9.1875 12.8916 9.82471\n";
   out <<  "12.7324 cv 9.12549 12.7314 8.38818 12.7451 7.66504 12.7939 cv 7.62207\n";
   out <<  "12.7061 7.50732 12.6885 7.49805 12.5664 cv 7.9502 12.4688 8.47314 12.457\n";
   out <<  "8.95215 12.5039 cv 9.05469 12.5137 9.96045 12.4785 9.99023 12.4199 cv\n";
   out <<  "9.96582 12.2168 8.62061 12.2773 8.49023 12.2588 cv 8.26318 12.2275 7.24609\n";
   out <<  "12.4297 7.3125 11.9844 cv 7.68701 11.668 9.84473 12.4219 9.99023 11.9434\n";
   out <<  "cv 9.32813 11.5947 8.33936 11.9121 7.62305 11.6943 cv 7.63623 11.624\n";
   out <<  "7.59668 11.501 7.64355 11.4658 cv 7.92773 11.4668 10.2388 11.8076 10.3438\n";
   out <<  "11.5273 cv 10.0908 11.2168 9.40088 11.4121 9.06836 11.3359 cv 8.68701\n";
   out <<  "11.25 8.12695 11.1318 7.72656 11.1748 cv 7.68408 11.0869 7.58545 10.9883\n";
   out <<  "7.64355 10.8633 cv 8.01709 10.8896 9.83447 11.3818 10.0732 11.1123 cv\n";
   out <<  "10.0659 10.999 8.86963 10.8516 8.66406 10.834 cv 8.47754 10.8184 7.85986\n";
   out <<  "10.6729 8.3291 10.4688 cv 8.66455 10.5967 9.09619 10.6289 9.47119 10.7178\n";
   out <<  "cv 9.51074 10.6357 7.65283 9.89844 7.39209 10.3408 cv 7.30127 10.4951\n";
   out <<  "7.02686 10.3877 6.89063 10.5723 cv 6.80762 10.6855 6.75781 10.8242\n";
   out <<  "6.64893 10.918 cv cp 7.58936 16.2148 mo 7.30322 16.2051 6.51514 16.042\n";
   out <<  "6.29443 16.3037 cv 6.30469 16.6191 7.05029 17.1729 7.29102 17.3828 cv\n";
   out <<  "7.78857 17.8184 8.39355 18.001 8.93164 18.3379 cv 9.28174 18.5596 9.82568\n";
   out <<  "18.7217 10.2188 18.7949 cv 10.9111 18.9258 11.75 19.168 12.4609 19.0234\n";
   out <<  "cv 12.6499 18.6787 12.0449 18.5801 12.0259 18.2549 cv 11.8398 18.1006\n";
   out <<  "11.6777 17.9189 11.5474 17.7148 cv 11.5664 17.5977 11.5386 17.4941\n";
   out <<  "11.4639 17.4043 cv 11.3154 17.4404 11.1699 17.4893 11.0283 17.5488 cv\n";
   out <<  "10.8403 17.5225 10.6538 17.5293 10.4683 17.5703 cv 10.1768 17.4473 9.93701\n";
   out <<  "17.5547 9.69971 17.3203 cv 9.29102 17.2637 8.88281 16.8857 8.65967 16.582\n";
   out <<  "cv 8.62061 16.5303 8.38721 16.165 8.3291 16.1582 cv 8.03955 16.042 7.87939\n";
   out <<  "16.2256 7.58936 16.2148 cv cp 8.22363 8.2041 mo 8.19189 8.49023 8.15771\n";
   out <<  "8.7959 8.12207 9.09766 cv 8.39307 9.44141 8.60596 9.84668 9.09814 9.9082\n";
   out <<  "cv 9.11865 9.6377 8.72119 9.59473 8.68262 9.36816 cv 8.59131 8.85059\n";
   out <<  "9.10303 9.4209 9.16016 9.49219 cv 9.38281 9.77734 9.60498 10.4189\n";
   out <<  "10.0317 10.4893 cv 10.0415 9.80078 8.86816 9.43359 8.95215 8.72461 cv\n";
   out <<  "9.00391 8.72754 9.0166 8.69141 9.05615 8.68262 cv 9.42871 8.8418 9.5791\n";
   out <<  "9.44434 9.88672 9.7207 cv 9.89111 9.76074 9.86279 9.7666 9.86572 9.80469\n";
   out <<  "cv 10.1445 9.85449 10.4502 10.5918 10.5713 10.5518 cv 10.6367 10.2285\n";
   out <<  "9.98096 9.37598 9.7207 9.20215 cv 9.61621 8.95313 9.49658 8.73535 9.30566\n";
   out <<  "8.54492 cv 9.14209 8.38184 9.34814 8.13379 9.52979 8.29297 cv 9.74023\n";
   out <<  "8.47656 10.9541 10.7637 11.2363 10.6143 cv 11.332 10.5986 11.3125 10.4688\n";
   out <<  "11.3608 10.4063 cv 11.2744 10.1777 10.9038 10.0566 10.9038 9.8252 cv\n";
   out <<  "10.668 9.61914 10.5259 9.34863 10.3682 9.09473 cv 10.1934 8.8125 9.52393\n";
   out <<  "8.25195 9.6582 7.89355 cv 9.97559 7.77637 10.2861 8.52246 10.438 8.7041 cv\n";
   out <<  "10.6948 9.0127 11.0459 9.73145 11.4229 9.8877 cv 11.4863 9.72949 11.2559\n";
   out <<  "9.69824 11.3188 9.47168 cv 10.8369 9.22168 10.1924 8.32715 9.96973 7.79004\n";
   out <<  "cv 10.0166 7.72656 10.0405 7.63965 10.1563 7.64453 cv 10.4814 8.14746\n";
   out <<  "10.8501 8.72754 11.2983 9.13965 cv 11.4375 8.67676 10.4834 8.18066\n";
   out <<  "10.4258 7.79004 cv 10.4604 7.70703 10.5229 7.65137 10.6543 7.66504 cv\n";
   out <<  "10.894 7.90234 11.1362 8.2041 11.2842 8.49023 cv 11.3481 8.61426 11.3306\n";
   out <<  "8.90918 11.5684 8.87012 cv 11.7939 8.60938 11.2622 7.46582 11.1533 7.1875\n";
   out <<  "cv 10.9702 6.97852 10.6909 6.85156 10.4238 6.7998 cv 10.2393 6.76367\n";
   out <<  "9.77002 6.91016 9.65186 6.83105 cv 9.3833 6.65039 8.7417 7.43262 8.55762\n";
   out <<  "7.54102 cv 8.48877 7.81836 8.25391 7.92773 8.22363 8.2041 cv cp 9.32568\n";
   out <<  "14.04 mo 9.18359 14.293 8.92725 14.4424 8.68262 14.5801 cv 8.40039 15.1963\n";
   out <<  "8.7124 15.7217 9.09521 16.1914 cv 9.83496 17.0986 11.2012 17.3164 12.0459\n";
   out <<  "16.3242 cv 12.1079 15.8984 12.3433 15.3887 12.3081 14.9678 cv 12.2871\n";
   out <<  "14.7295 12.5273 14.4316 12.4819 14.2275 cv 12.4546 14.1855 12.4243 14.1465\n";
   out <<  "12.3364 14.1641 cv 12.2744 14.2197 12.2646 14.3281 12.2544 14.4346 cv\n";
   out <<  "12.1934 14.4365 12.1172 14.4229 12.0879 14.4551 cv 11.8359 14.9111 11.9067\n";
   out <<  "15.6172 11.6304 16.1162 cv 11.1479 16.1514 11.4834 15.3184 11.6724 15.1816\n";
   out <<  "cv 11.6895 14.9521 12.0015 14.3555 11.9209 14.1641 cv 11.6191 14.1348\n";
   out <<  "11.2095 15.9365 11.0283 16.1992 cv 10.9512 16.2285 10.7832 16.2412\n";
   out <<  "10.7588 16.1582 cv 10.6709 16.0234 11.1084 15.2451 11.2163 15.1611\n";
   out <<  "cv 11.1528 14.8203 11.4619 14.5137 11.5068 14.1855 cv 11.0024 14.1523\n";
   out <<  "10.9683 16.29 10.4058 16.2197 cv 10.1558 16.0557 10.5303 15.2891 10.7051\n";
   out <<  "15.1807 cv 10.8022 15.1201 11.1509 14.1357 11.0493 14.0605 cv 11.0239\n";
   out <<  "14.0596 10.7642 14.4043 10.7588 14.4141 cv 10.7588 14.9619 10.29 15.541\n";
   out <<  "10.1768 16.0957 cv 10.0938 16.1475 9.96191 16.0977 9.92773 16.0332 cv\n";
   out <<  "10.0083 15.7246 9.97314 15.375 10.2397 15.0986 cv 10.3599 14.666 10.749\n";
   out <<  "14.2656 10.7793 13.8115 cv 10.5479 13.8018 10.125 14.7119 10.0732 14.9121\n";
   out <<  "cv 9.69385 15.0303 9.86035 15.6709 9.40869 15.7012 cv 8.95215 15.4326\n";
   out <<  "10.4268 14.1211 10.4468 13.666 cv 10.1577 13.6348 10.0801 14.2842 9.78271\n";
   out <<  "14.3301 cv 9.72314 14.5586 9.18408 15.2012 8.93164 15.1816 cv 8.59619\n";
   out <<  "14.7549 10.1602 13.9287 10.1768 13.4795 cv 9.91895 13.4795 9.63184 13.9629\n";
   out <<  "9.32568 14.04 cv cp 11.6104 5.00781 mo 11.3032 4.94531 10.7998 6.11719\n";
   out <<  "10.6963 6.33691 cv 10.8555 6.51465 11.0288 6.65039 11.2778 6.66895 cv\n";
   out <<  "11.3813 6.77832 11.4131 6.95313 11.5889 6.98047 cv 11.8462 6.69824\n";
   out <<  "12.0156 6.40234 12.2544 6.12891 cv 12.2813 5.87695 11.7568 5.22168\n";
   out <<  "11.6104 5.00781 cv cp 10.8628 12.0674 mo 10.96 12.457 11.2617 12.8203\n";
   out <<  "11.6162 12.9746 cv 12.2207 13.2373 12.3916 13.1006 12.8584 12.6416 cv\n";
   out <<  "13.2114 12.2949 13.146 11.4619 12.6763 11.2314 cv 12.4639 11.127 12.3418\n";
   out <<  "10.9473 12.0894 10.9102 cv 11.77 10.8613 11.5239 11.0615 11.2363 11.1328\n";
   out <<  "cv 11.0415 11.4209 10.8428 11.6797 10.8628 12.0674 cv cp 13.2085 4.61328\n";
   out <<  "mo 13.1191 4.66016 11.521 4.30859 11.8945 4.76367 cv 12.1294 5.05078\n";
   out <<  "12.583 5.45996 12.6689 5.81738 cv 12.8447 5.92969 13.0928 5.83594 13.271\n";
   out <<  "5.77637 cv 13.4253 5.89941 13.5527 5.90039 13.7798 5.89844 cv 14.0605\n";
   out <<  "5.89551 14.2446 5.94629 14.5034 6.10059 cv 14.7056 6.22168 14.9292 6.24512\n";
   out <<  "15.1099 6.41602 cv 15.2734 6.57129 15.3506 6.79199 15.5269 6.90039 cv\n";
   out <<  "16.0962 7.25 15.7993 7.98242 16.6763 7.70703 cv 16.9404 7.86035 17.1821\n";
   out <<  "7.59668 17.4434 7.7041 cv 17.5913 7.76563 17.8623 7.77637 18.0259 7.70703\n";
   out <<  "cv 18.1724 7.29297 17.1953 6.74512 16.9463 6.56445 cv 16.7441 6.42969\n";
   out <<  "16.6533 6.17871 16.3857 6.08789 cv 16.353 5.86035 16.0386 5.88086\n";
   out <<  "15.9287 5.67188 cv 15.4165 5.68066 14.9468 4.94043 14.4341 4.96582\n";
   out <<  "cv 14.0625 5.13477 14.1831 4.85254 13.8623 4.78027 cv 13.7402 4.77148\n";
   out <<  "13.6196 4.77832 13.499 4.80078 cv 13.4131 4.7207 13.3164 4.6582 13.2085\n";
   out <<  "4.61328 cv cp 11.7974 17.1963 mo 11.9463 17.4414 12.2129 17.8125 12.3989\n";
   out <<  "18.0264 cv 12.5171 18.1631 12.6431 18.6934 12.8354 18.6914 cv 13.0049\n";
   out <<  "18.5508 12.9336 18.166 13.188 18.1094 cv 13.2905 17.8135 13.564 17.6338\n";
   out <<  "13.583 17.2998 cv 13.2363 17.1719 12.6387 16.8711 12.5854 16.4697 cv\n";
   out <<  "12.3882 16.4697 11.916 17.0117 11.7974 17.1963 cv cp 12.1494 8.03906 mo\n";
   out <<  "12.1362 8.07422 12.1436 8.72168 12.2114 8.72461 cv 12.3711 8.77637 12.6909\n";
   out <<  "7.75586 12.6895 7.62402 cv 13.355 7.38574 12.3438 9.06836 12.3364 9.26465\n";
   out <<  "cv 12.6289 9.31836 12.814 8.60938 12.8145 8.41309 cv 13.0161 8.11719\n";
   out <<  "13.2397 7.77637 13.3745 7.43652 cv 13.4692 7.39258 13.6563 7.41309\n";
   out <<  "13.707 7.47852 cv 13.7393 7.69824 13.1958 8.30859 13.0923 8.56543 cv\n";
   out <<  "12.9468 8.92285 12.7061 9.29785 12.5854 9.7002 cv 12.6289 9.74609 12.6543\n";
   out <<  "9.81152 12.752 9.80469 cv 12.9082 9.53418 13.7583 7.3418 14.1846 7.45801\n";
   out <<  "cv 14.2417 7.59863 14.1831 7.78711 14.0859 7.97656 cv 13.9561 8.22949\n";
   out <<  "13.7578 8.48535 13.6743 8.63477 cv 13.4355 9.06641 13.0586 9.5791 12.98\n";
   out <<  "10.0742 cv 13.2344 10.0439 13.6934 8.76953 13.8369 8.52637 cv 13.9365\n";
   out <<  "8.35645 13.9966 8.15527 14.0859 7.97656 cv 14.1152 7.91699 14.1484\n";
   out <<  "7.85938 14.187 7.80664 cv 14.3086 7.6416 14.5034 7.73242 14.4565 7.9248 cv\n";
   out <<  "14.3975 8.1709 14.2305 8.37891 14.1431 8.61523 cv 14.0669 8.82129 13.8306\n";
   out <<  "9.05762 13.8315 9.28516 cv 13.668 9.43262 13.3042 10.0029 13.3125 10.2197\n";
   out <<  "cv 13.6958 10.168 13.9658 9.40332 14.0928 9.12109 cv 14.1772 8.93262\n";
   out <<  "14.6514 7.90723 14.8076 7.91504 cv 15.2251 7.93359 14.6455 8.73438\n";
   out <<  "14.5947 8.85449 cv 14.3862 9.35059 14.0156 9.72949 13.9355 10.2822 cv\n";
   out <<  "14.1899 10.0898 14.6172 8.7832 14.9736 8.80762 cv 15.4736 8.84277 14.3354\n";
   out <<  "10.0605 14.4546 10.1152 cv 14.6279 10.002 14.7432 9.81152 14.8901 9.67969\n";
   out <<  "cv 15.0342 9.65527 15.1841 9.59668 15.2534 9.45703 cv 15.4429 9.0752\n";
   out <<  "15.2769 8.46484 15.4927 8.10156 cv 15.3262 7.87109 15.3306 7.60352\n";
   out <<  "15.1372 7.3916 cv 14.9751 7.21484 15.084 7.08691 14.8447 6.95215 cv\n";
   out <<  "14.707 6.8877 14.5703 6.82031 14.4341 6.75195 cv 14.0991 6.55078 13.6714\n";
   out <<  "6.45313 13.271 6.52344 cv 12.9375 6.41895 12.7129 6.74023 12.4399 6.85547\n";
   out <<  "cv 12.1279 7.27441 12.145 7.57031 12.1494 8.03906 cv cp 12.6895 14.8086\n";
   out <<  "mo 12.7935 15.1191 12.9263 15.8408 12.8555 16.1582 cv 13.1611 16.4551\n";
   out <<  "13.4722 16.71 13.8672 16.8301 cv 14.1245 16.9092 14.6802 16.9727 14.8994\n";
   out <<  "16.8252 cv 15.146 16.6592 15.2393 16.7705 15.46 16.5127 cv 15.5786 16.3643\n";
   out <<  "15.7007 16.2188 15.8247 16.0752 cv 15.9458 16.0518 16.1621 15.373 16.166\n";
   out <<  "15.2334 cv 16.1792 14.8682 15.9185 14.6328 15.8667 14.3096 cv 15.5688\n";
   out <<  "14.165 15.3384 13.7861 14.9941 13.749 cv 14.9941 13.6113 14.687 13.4531\n";
   out <<  "14.5791 13.5 cv 14.7988 13.8076 15.0137 14.127 15.3057 14.3721 cv 15.3589\n";
   out <<  "14.625 15.6836 14.5625 15.6377 14.8711 cv 15.5581 14.8945 15.5078 14.9482\n";
   out <<  "15.3887 14.9326 cv 15.145 14.6348 14.8579 14.3682 14.6416 14.0742 cv\n";
   out <<  "14.5244 13.915 14.2266 13.417 14.0181 13.417 cv 14.2524 13.8809 14.6201\n";
   out <<  "14.252 14.9155 14.6738 cv 15.0391 14.8506 15.3896 15.0996 15.3887 15.3477\n";
   out <<  "cv 15.3726 15.3525 15.3647 15.3652 15.3677 15.3896 cv 15.2646 15.4561\n";
   out <<  "15.1606 15.3682 15.0571 15.3691 cv 14.8628 15.1084 14.0747 13.6221\n";
   out <<  "13.7485 13.6455 cv 13.7373 13.9336 14.2451 14.4688 14.4243 14.6719 cv\n";
   out <<  "14.5767 14.8447 15.0728 15.3896 15.1187 15.5967 cv 15.0498 15.7041 14.9795\n";
   out <<  "15.8379 14.7866 15.7637 cv 14.4331 15.0576 13.8594 14.5137 13.499 13.832\n";
   out <<  "cv 13.4243 13.8203 13.3604 13.7969 13.2925 13.832 cv 13.2627 14.1367\n";
   out <<  "13.9624 14.6426 14.0713 14.9717 cv 14.1611 15.2461 14.9458 15.7813 14.7866\n";
   out <<  "16.0957 cv 14.3101 16.1709 14.1348 15.3711 13.8521 15.1816 cv 13.729\n";
   out <<  "14.8906 13.2803 14.0332 12.959 14.0195 cv 12.9336 14.3262 13.6597 15.2266\n";
   out <<  "13.8521 15.4307 cv 13.9258 15.6631 14.686 16.2402 14.1221 16.2822 cv\n";
   out <<  "13.8237 15.8105 13.0425 15.0986 13.0425 14.5176 cv 12.8906 14.5176 12.9292\n";
   out <<  "14.3262 12.752 14.3516 cv 12.7383 14.5342 12.8848 14.5527 12.98 14.6631 cv\n";
   out <<  "13.0146 14.9004 13.1626 15.082 13.2759 15.291 cv 13.3999 15.5205 13.8682\n";
   out <<  "16.124 13.8315 16.3857 cv 13.1304 16.5117 13.2378 14.8154 12.6895 14.8086\n";
   out <<  "cv cp 13.9976 17.5078 mo 13.8042 18.0068 13.1841 18.4863 13.1465 19.0234\n";
   out <<  "cv 13.4575 19.2236 14.3135 18.7959 14.6411 18.7266 cv 15.1982 18.6084\n";
   out <<  "15.939 18.2686 16.4375 17.9707 cv 17.3716 17.4102 18.2881 16.6377 18.7939\n";
   out <<  "15.6387 cv 18.7788 15.6348 18.7695 15.6211 18.7734 15.5967 cv 18.2485\n";
   out <<  "15.2871 17.5264 15.8096 16.9878 15.5146 cv 16.627 15.9883 16.4136 16.6035\n";
   out <<  "15.896 16.9277 cv 15.5962 17.1152 15.3022 17.3057 14.9531 17.3828 cv\n";
   out <<  "14.6392 17.4531 14.3062 17.4072 13.9976 17.5078 cv cp 14.9321 11.1953\n";
   out <<  "mo 14.7593 11.0938 13.6592 11.1807 14.0415 11.4014 cv 14.5376 11.6865\n";
   out <<  "16.6406 10.8467 16.8428 11.5068 cv 16.7017 11.7422 15.5815 11.6484 15.3477\n";
   out <<  "11.5898 cv 15.0244 11.7402 14.3467 11.6963 13.9771 11.6943 cv 13.9761\n";
   out <<  "11.7842 13.9644 11.8857 14.0181 11.9219 cv 14.561 11.7715 15.1899 11.8242\n";
   out <<  "15.7368 11.8232 cv 15.8501 11.8223 17.0825 11.6943 16.7178 12.0674 cv\n";
   out <<  "16.3296 11.9961 15.9297 12.084 15.5391 12.0684 cv 15.2886 12.0586 14.9639\n";
   out <<  "12.2051 14.7246 12.0879 cv 14.5713 12.248 13.7002 12 13.9771 12.3994 cv\n";
   out <<  "14.437 12.5273 15.1069 12.292 15.5762 12.2744 cv 15.7642 12.2695 16.8501\n";
   out <<  "12.0781 16.8008 12.3584 cv 16.7524 12.6396 14.48 12.6172 14.2056 12.6904\n";
   out <<  "cv 14.1963 12.8057 14.1782 12.8389 14.2466 12.8975 cv 14.3501 12.9287\n";
   out <<  "14.5713 12.7881 14.7041 12.7939 cv 14.8872 12.8018 15.0698 12.8135 15.25\n";
   out <<  "12.7168 cv 15.375 12.6484 15.7964 12.71 15.9497 12.7109 cv 16.2754 12.7109\n";
   out <<  "16.5317 12.7373 16.8628 12.6484 cv 17.4023 13.1934 15.1294 12.833 15.1392\n";
   out <<  "13.1055 cv 15.7822 13.5234 16.4917 13.6016 17.1333 13.168 cv 17.5098\n";
   out <<  "12.916 17.9121 12.2148 17.8198 11.7324 cv 17.7153 11.1836 17.6675 10.333\n";
   out <<  "16.9883 10.0732 cv 16.3091 9.81348 15.5156 9.92871 14.9116 10.4277 cv\n";
   out <<  "15.2632 10.3887 15.6865 10.2959 16.0313 10.3047 cv 16.3984 10.3135 16.4077\n";
   out <<  "10.627 16.0264 10.5957 cv 15.8169 10.5791 15.3872 10.6494 15.2026 10.7295\n";
   out <<  "cv 14.9229 10.8506 14.6089 10.5352 14.3711 10.6973 cv 14.3086 11.0986\n";
   out <<  "15.2661 10.8545 15.4512 10.8428 cv 15.7109 10.8232 16.2944 10.6846\n";
   out <<  "16.5308 10.7383 cv 16.7622 10.791 16.665 11.0488 16.4893 11.0918 cv\n";
   out <<  "16.1567 10.9092 15.2793 11.0957 14.9321 11.1953 cv cp 14.4961 19.501 mo\n";
   out <<  "14.4219 19.7373 14.4893 20.585 14.6211 20.7881 cv 15.647 20.8691 15.4644\n";
   out <<  "19.4336 14.4961 19.501 cv cp 15.5342 18.7949 mo 15.3076 18.9014 14.6006\n";
   out <<  "19.0029 14.4751 19.21 cv 14.8037 19.165 15.1421 19.1289 15.5342 19.1475\n";
   out <<  "cv 15.8706 19.5313 16.1328 19.9248 15.7627 20.4346 cv 15.6621 20.4189\n";
   out <<  "15.4199 20.6836 15.3677 20.7676 cv 15.668 21.0586 15.9395 21.3242 16.2607\n";
   out <<  "21.5977 cv 16.1704 21.9092 16.9033 21.9004 17.0298 21.9307 cv 17.0391\n";
   out <<  "21.9775 17.0703 22.0361 17.0298 22.0752 cv 17.4673 22.0137 17.8403 21.5625\n";
   out <<  "18.2568 21.4072 cv 18.4551 21.334 18.6226 21.2568 18.7715 21.1006 cv\n";
   out <<  "18.9883 20.873 19.1289 20.8857 19.376 20.7471 cv 19.5435 20.6514 19.8994\n";
   out <<  "20.3701 19.9683 20.1768 cv 20.0352 19.9922 20.7729 19.5869 20.7046\n";
   out <<  "19.376 cv 20.4956 19.5137 20.3584 19.7217 20.1021 19.8125 cv 19.7334\n";
   out <<  "19.541 19.502 18.9336 19.2095 18.5674 cv 18.938 18.959 18.5186 19.2051\n";
   out <<  "18.2344 19.584 cv 18.4346 19.752 18.541 19.9961 18.6973 20.2002 cv 18.7734\n";
   out <<  "20.3057 18.8682 20.3906 18.981 20.4561 cv 19.0557 20.3496 19.2983 20.2959\n";
   out <<  "19.3345 20.4766 cv 19.2148 20.6748 18.605 21.1221 18.3999 21.2031 cv\n";
   out <<  "18.2314 21.1309 18.3564 20.9404 18.4409 20.8711 cv 18.3306 20.5566\n";
   out <<  "18.0972 20.3184 17.9297 20.0371 cv 17.6572 19.5791 17.2427 19.0098\n";
   out <<  "16.8008 18.6914 cv 16.709 18.7236 16.5703 18.8604 16.4688 18.7529 cv\n";
   out <<  "16.4434 18.5713 16.9004 18.2549 17.0298 18.1719 cv 17.0601 18.1816 li\n";
   out <<  "17.0601 18.1816 li 17.0498 18.1514 li 17.0981 18.123 17.1191 18.0674\n";
   out <<  "17.2163 18.0889 cv 17.4971 18.4102 17.6108 18.8984 17.9629 19.1475 cv\n";
   out <<  "18.3745 19.0352 18.6997 18.5547 19.0225 18.3174 cv 18.7959 18.0527 18.6152\n";
   out <<  "17.7422 18.3584 17.5078 cv 18.0679 17.4463 18.0869 17.7441 17.8394 17.5283\n";
   out <<  "cv 17.6392 17.791 17.2671 17.8838 17.0498 18.1299 cv 17.019 18.1201 li\n";
   out <<  "17.0298 18.1514 li 16.6606 18.1133 15.8794 18.6338 15.5342 18.7949 cv\n";
   out <<  "cp 16.1362 8.30957 mo 16.0293 8.48047 15.5874 9.56543 16.0532 9.57617\n";
   out <<  "cv 16.2925 9.58105 16.2817 9.27832 16.5889 9.32129 cv 16.8076 9.35254\n";
   out <<  "16.9849 9.51953 17.2163 9.47168 cv 17.2817 8.97168 17.7632 8.66406\n";
   out <<  "17.8179 8.20508 cv 17.6143 8.02637 16.3887 8.19141 16.1362 8.30957 cv\n";
   out <<  "cp 16.3857 13.8945 mo 16.123 14.0654 16.6338 14.9082 16.6763 15.1816\n";
   out <<  "cv 17.2295 15.2021 17.9995 15.2793 18.6069 15.2441 cv 18.4141 14.7559\n";
   out <<  "18.0093 14.3398 17.7354 13.915 cv 17.5234 13.5879 17.4277 13.6875 17.1006\n";
   out <<  "13.8545 cv 16.8579 13.9785 16.6377 13.8652 16.3857 13.8945 cv cp 17.7559\n";
   out <<  "9.32617 mo 17.4819 9.94238 17.9653 10.2393 18.3208 10.7139 cv 18.5435\n";
   out <<  "11.0098 18.5298 11.8096 18.4204 12.1504 cv 18.3511 12.3652 18.3501\n";
   out <<  "12.667 18.2485 12.8594 cv 18.1519 13.042 17.8169 13.4609 17.9219 13.666\n";
   out <<  "cv 17.9814 13.7031 18.0757 13.7061 18.1504 13.7285 cv 18.3164 13.9883\n";
   out <<  "18.4712 14.2813 18.6904 14.5381 cv 18.7007 14.6885 18.8169 15.2383\n";
   out <<  "19.0225 15.2441 cv 19.3599 15.1064 19.5732 13.7998 19.6108 13.4443 cv\n";
   out <<  "19.6733 12.8545 19.626 12.2578 19.6841 11.6631 cv 19.7153 11.3418 19.644\n";
   out <<  "10.9258 19.5269 10.624 cv 19.4673 10.501 19.4512 10.373 19.479 10.2402\n";
   out <<  "cv 19.3657 10.168 19.2988 10.0654 19.2783 9.93164 cv 19.2358 9.45605\n";
   out <<  "19.1011 9.02051 18.7324 8.62109 cv 18.7622 8.45801 18.6567 7.98145\n";
   out <<  "18.4204 7.99805 cv 18.3628 8.48242 17.9429 8.89648 17.7559 9.32617 cv\n";
   out <<  "cp f 10.7588 3.99023 mo 10.4023 3.88965 10.0928 4.13574 9.82471 3.99023\n";
   out <<  "cv 9.80371 3.81641 10.0923 3.22461 10.2217 3.09766 cv 10.3931 2.92773\n";
   out <<  "10.5044 2.51367 10.5923 2.28809 cv 10.7104 1.98438 10.8462 1.69824\n";
   out <<  "10.9639 1.41309 cv 11.0127 1.2959 11.1689 .679688 11.2778 .647461 cv\n";
   out <<  "11.334 .606445 11.459 .634766 11.5474 .626953 cv 11.5869 1.17773 12.0605\n";
   out <<  "1.66699 12.0664 2.2041 cv 12.3071 2.68164 12.4653 3.56445 13.064 3.5957\n";
   out <<  "cv 13.0576 3.66602 13.0791 3.76367 13.0425 3.80371 cv 12.6768 3.75684\n";
   out <<  "12.5366 3.93457 12.1914 3.90723 cv 12.0068 3.49902 11.9307 2.84668\n";
   out <<  "11.6304 2.5166 cv 11.3481 2.59473 10.9937 2.59863 10.7588 2.72363 cv\n";
   out <<  "10.707 3.07422 10.5288 3.29688 10.5303 3.69922 cv 10.582 3.83301 10.7793\n";
   out <<  "3.7373 10.8828 3.7832 cv 10.8857 3.89551 10.8149 3.93555 10.7588 3.99023\n";
   out <<  "cv cp 11.2778 1.43652 mo 11.1563 1.54492 10.959 2.12598 10.9448 2.28809 cv\n";
   out <<  "11.1602 2.2998 11.3604 2.32715 11.5474 2.26758 cv 11.5303 2.1748 11.3179\n";
   out <<  "1.42578 11.2778 1.43652 cv cp f 10.5093 22.5947 mo 10.4668 22.7305 9.62207\n";
   out <<  "22.6016 9.5127 22.5527 cv 9.47949 22.2822 10.0317 21.8877 10.1353 21.6602\n";
   out <<  "cv 10.5654 20.9414 11.0493 20.2568 11.4854 19.542 cv 11.5654 19.5518\n";
   out <<  "11.6499 19.5586 11.7134 19.584 cv 11.875 20.2109 11.9263 20.8545 12.0625\n";
   out <<  "21.4883 cv 12.1348 21.8262 12.2095 22.1699 12.3511 22.4863 cv 12.3901\n";
   out <<  "22.5732 12.6992 22.7881 12.6895 22.8232 cv 12.5947 22.9678 11.9712\n";
   out <<  "22.8584 11.8379 22.8643 cv 11.7148 22.3994 11.6855 21.8408 11.5474\n";
   out <<  "21.3906 cv 11.2954 21.3623 11.0171 21.3896 10.6963 21.3906 cv 10.4526\n";
   out <<  "21.5107 10.1934 22.1777 10.1982 22.4287 cv 10.249 22.5371 10.5337 22.4111\n";
   out <<  "10.5093 22.5947 cv cp 11.3398 20.2061 mo 11.1958 20.5127 10.9844 20.751\n";
   out <<  "10.8628 21.0791 cv 11.0493 21.1484 11.2925 21.1611 11.5269 21.1826 cv\n";
   out <<  "11.4678 20.875 11.4375 20.5381 11.3818 20.2275 cv 11.3765 20.2109 11.3638\n";
   out <<  "20.2031 11.3398 20.2061 cv cp f 11.5684 12.3994 mo 11.54 12.1299 11.2124\n";
   out <<  "11.9561 11.5303 11.7119 cv 11.833 11.4795 12.0718 11.5322 12.4399 11.5488\n";
   out <<  "cv 12.5459 11.6279 12.6719 11.7559 12.5449 11.9014 cv 12.3853 11.8975\n";
   out <<  "12.248 11.7734 12.0879 11.8389 cv 12.168 11.9658 12.3384 12.0029 12.4609\n";
   out <<  "12.0879 cv 12.5308 12.2051 12.5083 12.4258 12.4399 12.5244 cv 12.1211\n";
   out <<  "12.6494 11.8149 12.4766 11.5684 12.3994 cv cp f 4.64795 20.1104 mo 4.24561\n";
   out <<  "19.8662 3.72363 19.3105 3.86719 18.7842 cv 4.06055 18.0742 4.41846 17.5391\n";
   out <<  "5.13623 17.3115 cv 5.62646 17.1553 6.58643 16.9941 6.83398 17.6523 cv\n";
   out <<  "6.76074 17.7705 6.67725 17.8809 6.58496 17.9854 cv 6.5791 18.1074 6.55029\n";
   out <<  "18.2256 6.50195 18.3379 cv 6.40918 18.3545 6.37793 18.3105 6.29443 18.3174\n";
   out <<  "cv 6.25781 17.7549 6.38916 17.6357 5.7334 17.5283 cv 4.95801 17.4043\n";
   out <<  "4.89795 17.999 4.50879 18.4629 cv 4.49658 19.0771 4.41602 19.4912 5.08203\n";
   out <<  "19.8057 cv 5.30176 19.9092 5.55176 19.9639 5.78174 19.8584 cv 5.99121\n";
   out <<  "19.7627 6.33594 19.9199 6.06006 20.0137 cv 5.56738 20.1826 5.16895 20.4268\n";
   out <<  "4.64795 20.1104 cv cp f 1.83008 12.6484 mo 1.47363 12.3135 1.54053 12.3301\n";
   out <<  "1.64307 11.9434 cv 1.75146 11.8906 2.28662 11.5342 2.28662 11.4023 cv\n";
   out <<  "2.56543 11.3779 2.80713 11.8057 2.98877 11.9727 cv 3.33252 12.29 2.97314\n";
   out <<  "12.3467 2.75049 12.5596 cv 2.35938 12.9355 2.2627 13.0586 1.83008 12.6484\n";
//  out <<  "cv cp f .453952 setlinewidth 1 setlinecap 0 setlinejoin 4 setmiterlimit\n";
   out <<  "cv cp f 0.0 setlinewidth 1 setlinecap 0 setlinejoin 4 setmiterlimit\n";
   out <<  "[] 0 setdash true setstrokeadjust 17.0601 18.1816 mo 17.0459 18.1602\n";
   out <<  "17.0347 18.1406 17.019 18.1201 cv grestore } def\n";
}



//////////////////////////////
//
// getNextPage --
//

int getNextPage(int start, Array& pages) {
   int min = 1000000;
   int i;
   for (i=0; i<pages.getSize(); i++) {
      if (pages[i] < 0) {
         continue;
      }
      if (pages[i] - start <= 0) {
         continue;
      }
      if (pages[i] < min) {
         min = pages[i];
      }
   }
   if (min < 1000000) {
      return min;
   } else {
      return -1;
   }
}



//////////////////////////////
//
// getFirstPage -- 
//

int getFirstPage(Array& pages) {
   int i;
   int min = 10000000;
   for (i=0; i<pages.getSize(); i++) {
      if (pages[i] < 0) {
         continue;
      }
      if (min > pages[i]) {
         min = pages[i];
      }
   }

   if (min < 1000000) {
      return min;
   } else {
      return 0;
   }

}



//////////////////////////////
//
// printFooterInfo --
//

void printFooterInfo(ostream& out, Array& data) {
   int i;
   for (i=0; i<data.getSize(); i++) {
      out << data[i].key.getBase() << "\t" << data[i].value.getBase() << endl;
   }
}



//////////////////////////////
//
// printData --
//

void printData(ostream& out, Array*>& data) {
   int i;
   for (i=0; i<data.getSize(); i++) {
      out <<data[i]->getBase() << '\n';
   }
   out << flush;
}



//////////////////////////////
//
// deleteData -- 
//

void deleteData(Array*>& data) {
   int i;
   for (i=0; i<data.getSize(); i++) {
      delete data[i];
      data[i] = NULL;
   }
   data.setSize(0);
}



//////////////////////////////
//
// appendString -- 
//

void appendString(Array*>& listing, Array& lastone) {
   int index = listing.getSize();
   listing.setSize(index+1);

   Array<char>* temp = new Array<char>;
   int size = lastone.getSize();
   temp->setSize(size+1);

   char* ptr1 = temp->getBase();
   char* ptr2 = lastone.getBase();
   int i;

   for (i=0; i<lastone.getSize(); i++) {
      ptr1[i] = ptr2[i];
   }

   (*temp)[size] = '\0';
   temp->setSize(size);
   listing[index] = temp;
}



//////////////////////////////
//
// getFooterFile --
//

void getFooterFile(Array& data, const char* filename) {
   #ifndef OLDCPP
      ifstream input(filename, ios::in);
   #else
      ifstream input(filename, ios::in | ios::nocreate);
   #endif

   getFooterFile(data, input);
}

// %=@START:	FOOTER
// %=@FOOT1: 	Josquin Research Project
// %=@FOOT2: 	Josquin des Prez
// %=@FOOT3: 	NJE 27.21: La Bernardina
// %=@FOOT1R:	Chanson
// %=@FOOT2R:	28 Feb 2011
// %=@FOOT3R:	page %P
// %=@LOGO: JRP
// %=@END:	FOOTER

void getFooterFile(Array& data, Array*>& postscript) {
   // find the first footer section 
   PerlRegularExpression pre;
   SSTREAM datastream;
   int found = 0;
   int i;
   for (i=0; i<postscript.getSize(); i++) {
      if (strncmp(postscript[i]->getBase(), "%=", 2) != 0) {
         continue;
      }
      if ((!found) && pre.search(postscript[i]->getBase(), 
            "^%=@START:\\s*FOOTER\\s*$", "")) {
         found = 1;
         datastream << postscript[i]->getBase()+2;
         datastream << "\n";
         continue;
      }
      if (!found) {
         continue;
      }
      if (pre.search(postscript[i]->getBase(), 
            "^%=@END:\\s*FOOTER\\s*$", "")) {
         found = 0;
         datastream << postscript[i]->getBase()+2;
         datastream << "\n";
         continue;
      }
      datastream << postscript[i]->getBase()+2;
      datastream << "\n";
   }

//   datastream << ends;
//cerr << "\% STRING IS: " << datastream.CSTRING << endl;
   getFooterFile(data, datastream);
}


void getFooterFile(Array& data, istream& input) {
   data.setSize(1000);
   data.setGrowth(1000); // there is a bug if the array grows...
                         // because null string is not actually stored
                         // directly in the content (it is faked at
                         // the end after the storage location).
   data.setSize(1);

   Array<char> dataline;
   dataline.setSize(1000);
   dataline.setAll(0);
   dataline.setGrowth(500000);
   dataline.setSize(0);
   int character;
   char value;
   int  isnewline;
   char lastvalue = 0;

   while (!input.eof()) {
      character = input.get();
      if (input.eof()) {
         // end of file found without a newline termination on last line.
         if (dataline.getSize() > 0) {
            appendKeyValueInfo(data, dataline);
            dataline.setSize(0);
            break;
         }
      }
      value = (char)character;
      if ((value == 0x0d) || (value == 0x0a)) {
         isnewline = 1;
      } else {
         isnewline = 0;
      }

      if (isnewline && (value == 0x0a) && (lastvalue == 0x0d)) {
         // ignore the second newline character in a dos-style newline.
         lastvalue = value;
         continue;
      } else {
         lastvalue = value;
      }

      if (isnewline) {
         appendKeyValueInfo(data, dataline);
         dataline.setSize(0);
      } else {
         dataline.append(value);
      }
   }

}



//////////////////////////////
//
// appendKeyValueInfo --
//

void appendKeyValueInfo(Array& data, Array& dataline) {
   int lastindex = data.getSize()-1;
   int newindex = lastindex+1;

   dataline.setSize(dataline.getSize()+1);
   dataline[dataline.getSize()-1] = '\0';
   dataline.setSize(dataline.getSize()-1);

   PerlRegularExpression pre;
   if (pre.search(dataline, "^\\s*$", "")) {
      // ignore blank lines
      return;
   }

   if (pre.search(dataline, "^@LOGO:.*JRP", "i")) {
      jrpQ = 1;
   }

   Array<char> pkey;
   Array<char> pvalue;
  
   int len;
   const char* pt1 = "";
   const char* pt2 = "";
   if (pre.search(dataline, "^@([^\\s:]+)\\s*:\\s*(.*)\\s*$", "")){
      pt1 = pre.getSubmatch(1);
      pkey.setSize(strlen(pt1)+1);
      strcpy(pkey.getBase(), pt1);
      pt1 = pkey.getBase();

      pt2 = pre.getSubmatch(2);
      pvalue.setSize(strlen(pt2)+1);
      strcpy(pvalue.getBase(), pt2);
      pt2 = pvalue.getBase();

      data.setSize(data.getSize()+1);
      data.setSize(lastindex+2);
      len = strlen(pt1);
      data[newindex].key.setSize(len+1);
      strcpy(data[newindex].key.getBase(), pt1);
      data[newindex].key.setSize(len);

      len = strlen(pt2);
      data[newindex].value.setSize(len+1);
      strcpy(data[newindex].value.getBase(), pt2);
      data[newindex].value.setSize(len);
   } else {
      // append data line to previous value
      if (pre.search(dataline.getBase(), "^\\s*(.*)\\s$", "")) {
         const char* ptr3 = pre.getSubmatch(1);
         len = strlen(ptr3);
         char space = '\n';
         char nullchar = '\0';
         data[lastindex].value.append(space);
         data[lastindex].value.append(nullchar);
         
         data[lastindex].value.setSize(data[lastindex].value.getSize()+len+1);
         strcat(data[lastindex].value.getBase(), ptr3);
         data[lastindex].value.setSize(data[lastindex].value.getSize()-1);
      }
   }
}



//////////////////////////////
//
// getPostScriptFile -- return the contents of a PostScript file.
//

void getPostScriptFile(Array<Array<char>*>& postscript, Array<int>& pages,
   const char* filename) {
   #ifndef OLDCPP
      ifstream input(filename, ios::in);
   #else
      ifstream input(filename, ios::in | ios::nocreate);
   #endif
	  
   getPostScriptFile(postscript, pages, input);
}


void getPostScriptFile(Array<Array<char>*>& postscript, Array<int>& pages,
   istream& input) {

   pages.setSize(1000000);
   pages.setAll(-1);
   pages.setSize(0);
   int maxpage = 0;

   postscript.setSize(1000000);
   postscript.setGrowth(5000000);
   postscript.setSize(0);

   Array<char> dataline;
   dataline.setSize(100000);
   dataline.setGrowth(500000);
   dataline.setSize(0);
   int character;
   char value;
   int  isnewline;
   char lastvalue = 0;

   while (!input.eof()) {
      character = input.get();
      if (input.eof()) {
         // end of file found without a newline termination on last line.
         if (dataline.getSize() > 0) {
            appendString(postscript, dataline);
            dataline.setSize(0);
            break;
         }
      }
      value = (char)character;
      if ((value == 0x0d) || (value == 0x0a)) {
         isnewline = 1;
      } else {
         isnewline = 0;
      }

      if (isnewline && (value == 0x0a) && (lastvalue == 0x0d)) {
         // ignore the second newline character in a dos-style newline.
         lastvalue = value;
         continue;
      } else {
         lastvalue = value;
      }

      if (isnewline) {
         appendString(postscript, dataline);
         dataline.setSize(0);
      } else {
         dataline.append(value);
      }
   }



   PerlRegularExpression pre;
   // %%Page label ordinal
   int i;
   int pagenum = 0;
   for (i=0; i<postscript.getSize(); i++) {
      if (pre.search(postscript[i]->getBase(), 
            "^%%Page\\s+([^\\s]+)\\s+([^\\s]+)\\s*$", "")) {
         pagenum = atol(pre.getSubmatch(2));
         if (pagenum > maxpage) {
            maxpage = pagenum;
            pages.setSize(pagenum+1);
         }
         pages[pagenum] = i;
      }
   }

}



//////////////////////////////
//
// checkOptions -- validate and process command-line options.
//

void checkOptions(Options& opts, int argc, char* argv[]) {
   opts.define("b|box=b",         "show system bounding box");
   opts.define("f|footer=s:",     "footer definition file");
   opts.define("s|shift=i:0",     "vertical shift in point after first pg");
   opts.define("v|verbose=b",     "print verbose messages");
   opts.define("e|embedded-footer|ef=b", "footer file is embedded in input");
   opts.define("p|page-offset=i:0", "page offset (one less than start page)");
   opts.define("O|no-overlay=b", "do not write overlay box");
   opts.define("i|instrument-file|instruments=s", "instrument definition file");
   opts.define("I|instrument-name=s",     "instrument name");
   opts.define("E|even=b",        "force even number of pages");

   opts.define("debug=b");              // determine bad input line num
   opts.define("author=b");             // author of program
   opts.define("version=b");            // compilation info
   opts.define("example=b");            // example usages
   opts.define("h|help=b");             // short description
   opts.process(argc, argv);
   
   // handle basic options:
   if (opts.getBoolean("author")) {
      cout << "Written by Craig Stuart Sapp, "
           << "craig@ccrma.stanford.edu, June 2010" << endl;
      exit(0);
   } else if (opts.getBoolean("version")) {
      cout << argv[0] << ", version: 23 June 2010" << endl;
      cout << "compiled: " << __DATE__ << endl;
      cout << MUSEINFO_VERSION << endl;
      exit(0);
   } else if (opts.getBoolean("help")) {
      usage(opts.getCommand());
      exit(0);
   } else if (opts.getBoolean("example")) {
      example();
      exit(0);
   }

   if (!opts.getString("footer")) {
      cerr << "Error: footer definition file required as input" << endl;
      exit(1);
   }

   overlayQ   =!opts.getBoolean("no-overlay");
   shiftQ     = opts.getInteger("shift");
   footerfile = opts.getString("footer");
   verboseQ   = opts.getBoolean("verbose");
   embedQ     = opts.getBoolean("ef");
   showboxQ   = opts.getBoolean("box");
   evenQ      = opts.getBoolean("even");
   pageoffset = opts.getInteger("page-offset");
   debugQ     = opts.getBoolean("debug");

   if (opts.getBoolean("instrument-name")) {
      instrumentname.setSize(strlen(opts.getString("instrument-name")) + 1);
      strcpy(instrumentname.getBase(), opts.getString("instrument-name"));
      if (opts.getBoolean("instrument-file")) {
         adjustInstrumentName(instrumentname, opts.getString("instrument-file"));
      } else if (opts.getBoolean("footer")) {
         adjustInstrumentName(instrumentname, opts.getString("footer"));
      }
   } else {
      instrumentname.setSize(1);
      instrumentname[0] = '\0';
   }

}



//////////////////////////////
//
// adjustInstrumentName -- Reads a file searching for content
// such as:
//
// @START: PARTLIST
// @PART:  fl      Flauto traverso
// @PART:  vn1     Violino 1
// @PART:  vn2     Violino 2
// @PART:  va      Viola
// @PART:  bc      Violoncello/Basso continuo
// @END: PARTLIST
//
// If the instrument name input is "fl" then output from this function
// it will be "Flauto traverso".
//

void adjustInstrumentName(Array& instrumentname, const char* instfile) {
   ifstream inputfile;
   inputfile.open(instfile);
   if (!inputfile.is_open()) {
      cerr << "Error: cannot open file: " << instfile << endl;
      exit(1);
   }

   PerlRegularExpression pre;
   PerlRegularExpression pre2;

   const char* searchpat = "^\\s*@\\s*PART\\s*:\\s*([^\\s]+)\\s*(.*)\\s*$";
   char buffer[1024] = {0};
   while (!inputfile.eof()) {
      inputfile.getline(buffer, 1024);
      if (pre.search(buffer, searchpat, "i")) {
         if (strcmp(instrumentname.getBase(), pre.getSubmatch(1)) == 0) {
            pre2.sar(instrumentname, instrumentname.getBase(), 
                  pre.getSubmatch(2), "");
            return;
         }
      }
   }
}



//////////////////////////////
//
// example -- example usage of the program
//

void example(void) {
   cout <<
   "                                                                         \n"
   << endl;
}



//////////////////////////////
//
// usage -- gives the usage statement for the program
//

void usage(const char* command) {
   cout <<
   "                                                                         \n"
   << endl;
}


// md5sum: c798a4328dff299a84bf168c88cd9719 musefoot.cpp [20110304]