#include "QFramework/TQSampleVisitor.h"
#include "QFramework/TQSampleFolder.h"
#include "QFramework/TQFolder.h"
#include "QFramework/TQSample.h"
#include "QFramework/TQUtils.h"
#include "QFramework/TQToken.h"
#include "QFramework/TQIterator.h"
#include "QFramework/TQStringUtils.h"

// #define _DEBUG_
#include "QFramework/TQLibrary.h"

#include <iostream>
#include <fstream>
#include <sstream>
#include <cstdlib>

////////////////////////////////////////////////////////////////////////////////////////////////
//
// TQSampleVisitor:
//
// Base class for other classes that visit samples or sample folders, most notably
//   * TQSampleInitializer
//   * TQAnalysisSampleVisitor
//   * TQMultiChannelAnalysisSampleVisitor
//
////////////////////////////////////////////////////////////////////////////////////////////////

ClassImp(TQSampleVisitor)

TString TQSampleVisitor::statusSKIPPED(bool pretty){ if(pretty) return  TQStringUtils::makeBoldWhite("[ ")+TQStringUtils::makeBoldPink  ("SKIP")+TQStringUtils::makeBoldWhite(" ]"); else return "[ SKIP ]";}
TString TQSampleVisitor::statusOK(bool pretty){ if(pretty) return       TQStringUtils::makeBoldWhite("[ ")+TQStringUtils::makeBoldGreen (" OK ")+TQStringUtils::makeBoldWhite(" ]"); else return "[  OK  ]";}
TString TQSampleVisitor::statusFAILED(bool pretty){ if(pretty) return   TQStringUtils::makeBoldWhite("[ ")+TQStringUtils::makeBoldRed   ("FAIL")+TQStringUtils::makeBoldWhite(" ]"); else return "[ FAIL ]";}
TString TQSampleVisitor::statusWARN(bool pretty){ if(pretty) return     TQStringUtils::makeBoldWhite("[ ")+TQStringUtils::makeBoldYellow("WARN")+TQStringUtils::makeBoldWhite(" ]"); else return "[ WARN ]";}
TString TQSampleVisitor::statusSKIPPEDOK(bool pretty){ if(pretty) return  TQStringUtils::makeBoldWhite("[ ")+TQStringUtils::makeBoldGreen  ("SKIP")+TQStringUtils::makeBoldWhite(" ]"); else return "[ SKIP ]";}
TString TQSampleVisitor::statusRUNNING(bool pretty){ if(pretty) return  TQStringUtils::makeBoldWhite("[ ")+TQStringUtils::makeBoldWhite ("....")+TQStringUtils::makeBoldWhite(" ]"); else return "[ .... ]";}
TString TQSampleVisitor::statusPROGRESS(bool pretty, double fraction) { if(pretty) return TQStringUtils::makeBoldWhite("[ ")+TQStringUtils::makeBoldWhite (TQStringUtils::fixedWidth(TString::Format("%.0f%%",fraction*100.),4,'c') )+TQStringUtils::makeBoldWhite(" ]"); else return TString("[ ")+ (TQStringUtils::fixedWidth(TString::Format("%.0f%%",fraction*100.),4,'c') )+ (" ]");} // %% is escaped '%' character

//__________________________________________________________________________________|___________

TQSampleVisitor::TQSampleVisitor(const TString& name) :
  TNamed(name,name),
  fSampleColWidth(0.45*TQLibrary::getConsoleWidth()),
  fVerbose(false),
  fPrettyPrint(true),
  fUpdateLines(true)
{
  fVisitTraceID.Clear();
}


//__________________________________________________________________________________|___________

void TQSampleVisitor::setVerbose(bool verbose) {
  fVerbose = verbose;
}

//__________________________________________________________________________________|___________

void TQSampleVisitor::setPrettyPrint(bool pretty) {
  fPrettyPrint = pretty;
}

//__________________________________________________________________________________|___________

void TQSampleVisitor::setLineUpdates(bool allow) {
  fUpdateLines = allow;
}

//__________________________________________________________________________________|___________

bool TQSampleVisitor::setVisitTraceID(TString id) {

  if (id.IsNull()) {
    fVisitTraceID.Clear();
    return true;
  } else if (TQSampleFolder::isValidName(id)) {
    fVisitTraceID = id;
    return true;
  } else {
    return false;
  }
}


//__________________________________________________________________________________|___________

TString TQSampleVisitor::getVisitTraceID() const {
  return fVisitTraceID;
}

//__________________________________________________________________________________|___________

const char* TQSampleVisitor::getVisitTraceIDConst() const {
  return fVisitTraceID.Data();
}

//__________________________________________________________________________________|___________

TString TQSampleVisitor::getStatusString(int status, bool pretty, double progress) {
  if (status == visitSKIPPED)   return TQSampleVisitor::statusSKIPPED(pretty);
  if (status == visitOK)        return TQSampleVisitor::statusOK(pretty);
  if (status == visitFAILED)    return TQSampleVisitor::statusFAILED(pretty);
  if (status == visitWARN)      return TQSampleVisitor::statusWARN(pretty);
  if (status == visitSKIPPEDOK) return TQSampleVisitor::statusSKIPPEDOK(pretty);
  if (status == visitPROGRESS)  return TQSampleVisitor::statusPROGRESS(pretty,progress);
  return "";
}



//__________________________________________________________________________________|___________

bool TQSampleVisitor::callInitialize(TQSampleFolder * sampleFolder) {
  // call initialization of the sample visitor
  if (fVerbose) {
    int width = 50;

    std::cout << std::endl;
    std::cout << TQStringUtils::repeat('-', width) << std::endl;
    if(fPrettyPrint) std::cout << TQStringUtils::makeBoldWhite("Initializing...") << std::endl;
    else std::cout << "Initializing..." << std::endl;
    std::cout << TString::Format("%-20s: %s", "Visitor", ClassName()) << std::endl;
    std::cout << TString::Format("%-20s: %s", "Sample Folder",
                            sampleFolder->getPath().Data()) << std::endl;
    std::cout << TQStringUtils::repeat('-', width) << std::endl;

    std::cout << std::endl << std::endl;
  }

  TString message;
  int result = initialize(sampleFolder, message);

  if (fVerbose && fPrettyPrint) {
    std::cout << TQStringUtils::makeBoldWhite(TQStringUtils::fixedWidth("Sample",fSampleColWidth));
    std::cout << TQStringUtils::makeBoldWhite(TQStringUtils::fixedWidth("Status",8,"c"));
    std::cout << " ";
    std::cout << TQStringUtils::makeBoldWhite(message);
    std::cout << std::endl;
    std::cout << TQStringUtils::makeBoldWhite(TQStringUtils::repeat("=", TQLibrary::getConsoleWidth())) << std::endl;
  } else if(fVerbose){
    std::cout << (TQStringUtils::fixedWidth("Sample",fSampleColWidth));
    std::cout << (TQStringUtils::fixedWidth("Status",8,"c"));
    std::cout << " ";
    std::cout << (message);
    std::cout << std::endl;
    std::cout << (TQStringUtils::repeat("=", TQLibrary::getConsoleWidth())) << std::endl;
  }

  /* consider initialisation succeful if result was OK or WARN */
  return (result != visitFAILED);

}


//__________________________________________________________________________________|___________

int TQSampleVisitor::initialize(TQSampleFolder * /*sampleFolder*/, TString& message) {
  message.Append(TQStringUtils::fixedWidth("Info", 30));
  return visitOK;

}

//__________________________________________________________________________________|___________

TString TQSampleVisitor::printLine(TQSampleFolder* f, int level, bool isSample, const TString& bullet){
  // set the listing bullet ("+" for first visit, "-" for revisit)
  TString line = TString::Format("%*s%s ", level*2, "", bullet.Data());

  if (isSample) {
    line += f->getNameConst();
  } else {
    if(fPrettyPrint){
      line += TQStringUtils::makeBoldBlue(f->getNameConst());
    } else {
      line += (f->getNameConst());
    }
  }

  if(fUpdateLines || !isSample){
    std::cout << TQStringUtils::fixedWidth(line, fSampleColWidth, "l");

    if(isSample){
      std::cout << TQSampleVisitor::statusRUNNING(fPrettyPrint);
      std::cout << "\r";
      std::cout.flush();
    } else {
      std::cout << std::endl;
    }
  }
  return line;
}

//__________________________________________________________________________________|___________

void TQSampleVisitor::updateLine(const TString& line, const TString& message, int result, bool ignore, double progress){
  /* update status button */
  if(ignore){
    if (result != visitPROGRESS) std::cout << std::endl; //don't end this line for ignored progress indications
    return;
  } else {
    if (result == visitSKIPPED || result == visitOK || result == visitWARN || result == visitFAILED || result == visitSKIPPEDOK) {
      std::cout << TQStringUtils::fixedWidth(line, fSampleColWidth, "l") << this->getStatusString(result,fPrettyPrint) << " " << TQStringUtils::rtrim(message) << std::endl;
    } else if (result == visitLISTONLY) {
      std::cout << TQStringUtils::fixedWidth(line, fSampleColWidth, "l") << std::endl;
    } else if (result == visitIGNORE) {
      std::cout << TQStringUtils::fixedWidth(line, fSampleColWidth, "l") << std::endl;
    } else if (fUpdateLines && result == visitPROGRESS) {
      std::cout << TQStringUtils::fixedWidth(line, fSampleColWidth, "l") << this->getStatusString(result,fPrettyPrint,progress) << " " << message << "\r";
      std::cout.flush();
    }
  }
}



//__________________________________________________________________________________|___________

int TQSampleVisitor::visit(TQSampleFolder * sampleFolder, bool requireSelectionTag) {
  // visit the sample folder pointed to
  if(!sampleFolder) return 0;
	int nVisits = 0;
	try {
		this->callInitialize(sampleFolder);
		nVisits = this->callVisit(sampleFolder,0,requireSelectionTag);
		this->callFinalize();
	} catch (const std::bad_alloc& oom){
		Long64_t vsize = TQLibrary::getVirtualMemory();
		TQLibrary::recordMemory();
		if(vsize > 0){
		  //		  double mem = (double)vsize / 1024./1024.;
		  ERRORclass("machine ran out of memory while visiting sample folder '%s', current memory usage is %.3f MB",sampleFolder->getPath().Data(),vsize);
		} else {
		  ERRORclass("machine ran out of memory while visiting sample folder '%s' and unable to retrieve current memory usage (sorry!)",sampleFolder->getPath().Data());
		}
		nVisits=-1;
	}
  return nVisits;
}

//__________________________________________________________________________________|___________

void TQSampleVisitor::leaveTrace(TQSampleFolder* sampleFolder, TString prefix, int result, const TString& message){
  // leave a trace on the given sample folder
  TString resultStr = this->getStatusString(result,false);
  prefix.Append(this->getVisitTraceIDConst());
  if(!message.IsNull()){
    DEBUGclass("writing message");
    sampleFolder->setTagString(prefix+".message", TQStringUtils::compactify(message));
  }
  sampleFolder->setTagInteger(prefix + ".statusID", result);
  if(!resultStr.IsNull())
    sampleFolder->setTagString(prefix + ".status", resultStr);
}

//__________________________________________________________________________________|___________

int TQSampleVisitor::getStatusID(TQSampleFolder* sampleFolder, TString prefix){
  // read statusID of the given sample folder
  prefix.Append(this->getVisitTraceIDConst());
  return sampleFolder->getTagIntegerDefault(prefix + ".statusID", -1);
}

//__________________________________________________________________________________|___________

bool TQSampleVisitor::checkRestrictionTag(TQSampleFolder* sf) {
  // test if upwards or downwards of the sample folder a restriction tag has been
  // set to select this path to be processed in the current run.
  if (!sf) return false;
  //search up and downwards for a selection tag
  return (sf->getTagBoolDefault(TString("~")+TQSampleFolder::restrictSelectionTagName, false) ||
           sf->getTagBoolDefault(TQSampleFolder::restrictSelectionTagName+TString("~"), false));
}

//__________________________________________________________________________________|___________

int TQSampleVisitor::callVisit(TQSampleFolder * sampleFolder, int level, bool requireSelectionTag) {
  // Returns the number of sample folders visited.

  /* skip this visit of sample folder is invalid */
  if (!sampleFolder) return 0;

  if (requireSelectionTag) { //if we should only visit explicitly marked TQSampleFolders we need to check for the presence of the corresponding tag somewhere up/down the folder hierarchy
    DEBUGclassargs(this->GetName(),"Checking selection tag requirement for TQSampleFolder '%s'",sampleFolder->GetName());
    if (! TQSampleVisitor::checkRestrictionTag(sampleFolder) ) {
      DEBUGclassargs(this->GetName(),"Skipping sample folder '%s' as it doesn't seem to be selected",sampleFolder->GetName());
      return 0; //we ignore this folder as it is not selected
    }
  }

  /* check if we visit a sample or a sample folder */
  TQSample* sample = dynamic_cast<TQSample*>(sampleFolder);
  bool isSample = (bool)(sample) && (!sample->hasSubSamples());

  //Debugging option
  if (sampleFolder->hasTagString("asv.initialize.dumpTopTo")) {
    TQUtils::dumpTop(sampleFolder->getTagStringDefault("asv.initialize.dumpTopTo",".") , TString::Format("%ld_initialize_%s",TQUtils::getCurrentTime(),sampleFolder->getName().Data()) , TString::Format("%s\n-----------------------------\n",sampleFolder->getPath().Data()));
  }
  TQLibrary::recordMemory();

  /* print details */
  //TString line;
  int result;
  int nVisits = 0;
  TString message;
  /* decide whether to visit as sample or as folder */
  if (isSample) {
     /* visit as sample */
      DEBUGclassargs(this->GetName(),"visiting as sample");
      if (fVerbose) fStatusLine = this->printLine(sampleFolder,level,true,"+");
      result = visitSample(sample, message);
      nVisits += (result == visitOK);
      this->leaveTrace(sampleFolder,".sv.visit.",result,message);
      if (fVerbose) this->updateLine(fStatusLine,message,result);
      DEBUGclassargs(this->GetName(),"revisiting as sample");
      result = revisitSample(sample, message);
      this->leaveTrace(sampleFolder,".sv.revisit.",result,message);
  } else {
    /* visit as folder */
    DEBUGclassargs(this->GetName(),"visiting as folder");
    if (fVerbose) fStatusLine = this->printLine(sampleFolder,level,false,"+");
    result = visitFolder(sampleFolder, message);
    this->leaveTrace(sampleFolder,".sv.visit.",result,message);
    /* next: visit all sub sample folders (if not disabled) */
    if(result != visitFAILED && result != visitSKIPPED && result != visitSKIPPEDOK){
      TQSampleFolderIterator itr(sampleFolder->getListOfSampleFolders("?"),true);
      while (itr.hasNext()) {
        // the next element (might be a sample folder)
        TQSampleFolder * element = itr.readNext();
        // consider only TQSampleFolders
        if (element){
          // visit the TQSampleFolder recursively
          nVisits += this->callVisit(element, level + 1, requireSelectionTag);
        }
      }
    }
    DEBUGclassargs(this->GetName(),"revisiting as folder");
    if (fVerbose) fStatusLine = this->printLine(sampleFolder,level,false,"-");
    result = revisitFolder(sampleFolder, message);
    this->leaveTrace(sampleFolder,".sv.revisit.",result,message);
  }
  if (sampleFolder->hasTagString("sv.finalize.dumpTopTo")) {
    TQUtils::dumpTop(sampleFolder->getTagStringDefault("sv.finalize.dumpTopTo",".") , TString::Format("%ld_finalize_%s",TQUtils::getCurrentTime(),sampleFolder->getName().Data()) , TString::Format("%s\n-----------------------------\n",sampleFolder->getPath().Data()));
  }
  TQLibrary::recordMemory();

  return (result == visitOK || result == visitWARN || result == visitIGNORE || result == visitLISTONLY) ? nVisits : 0;
}


//__________________________________________________________________________________|___________

int TQSampleVisitor::visitFolder(TQSampleFolder * sampleFolder, TString& /*message*/) {
  (void)sampleFolder; //silence compiler warning (unused parameter)
  DEBUGclassargs(this->GetName(),"Visiting folder '%s'", sampleFolder? sampleFolder->getPath().Data() : "");
  return visitLISTONLY;
}


//__________________________________________________________________________________|___________


int TQSampleVisitor::visitSample(TQSample * sample, TString& message) {
  DEBUGclassargs(this->GetName(),"Entering function");
  /* stop if the sample given is invalid */
  if (!sample) return visitFAILED;

  int result = visitFAILED;
  int nEntries = -1;
  TString msg = "";
   /* try to open tree */
  TQToken * treeToken = sample->getTreeToken();

  if (treeToken) {
    result = visitOK;
    nEntries = ((TTree*)treeToken->getContent())->GetEntries();
    sample->returnTreeToken(treeToken);
  } else {
    result = visitFAILED;
    msg = "failed to load tree";
  }

  message.Append(" ");

  /* print tree location */
  TString treeLocation = sample->getTreeLocation();
  if (treeLocation.Length() > 40) {
    if (treeLocation.Length() > 43) {
      treeLocation.Remove(0, treeLocation.Length() - 37);
      treeLocation.Prepend("...");
    } else {
      treeLocation.Remove(0, treeLocation.Length() - 40);
    }
  }

  message.Append(TQStringUtils::fixedWidth(treeLocation, 40, true));

  /* print the n events bin */
  int nEventsBin;
  if (sample->getTagInteger(".init.neventsbin", nEventsBin)) {
    message.Append(TQStringUtils::fixedWidth(TString::Format("%d", nEventsBin), 12)); }
  else {
    message.Append(TQStringUtils::fixedWidth("--", 12)); }

  /* print number of entries in the tree */
  if (nEntries >= 0) {
    message.Append(TQStringUtils::fixedWidth(TString::Format("%d", nEntries), 12)); }
  else {
    message.Append(TQStringUtils::fixedWidth("--", 12)); }

  /* print normalisation factor */
  message.Append(TQStringUtils::fixedWidth(TString::Format("%.3f", sample->getNormalisation()), 12));

  /* print cross section */
  double xSec;
  if (sample->getTagDouble("xsection", xSec)) {
    message.Append(TQStringUtils::fixedWidth(TString::Format("%.3f", xSec), 12)); }
  else {
    message.Append(TQStringUtils::fixedWidth("--", 12)); }

  /* print k factor */
  double kFactor;
  if (sample->getTagDouble("kfactor", kFactor)) {
    message.Append(TQStringUtils::fixedWidth(TString::Format("%.3f", kFactor), 12)); }
  else {
    message.Append(TQStringUtils::fixedWidth("--", 12)); }

  /* print (error) message */
  message.Append(TQStringUtils::fixedWidth(msg, 30));

  return result;

}


//__________________________________________________________________________________|___________


int TQSampleVisitor::revisitSample(TQSample * /*sample*/, TString& /*message*/) {
  return visitIGNORE;
}


//__________________________________________________________________________________|___________


int TQSampleVisitor::revisitFolder(TQSampleFolder * /*sampleFolder*/, TString& /*message*/) {
  return visitIGNORE;
}


//__________________________________________________________________________________|___________

bool TQSampleVisitor::callFinalize() {
  // call finalization of the sample visitor
  int result = finalize();
  return (result != visitFAILED);
}

//__________________________________________________________________________________|___________

int TQSampleVisitor::finalize() {
  // finalize method (virtual)
  return visitLISTONLY;
}

//__________________________________________________________________________________|___________

TQSampleVisitor::~TQSampleVisitor() {
  // destructor
}

//__________________________________________________________________________________|___________

void TQSampleVisitor::stamp(TQTaggable* obj) const {
  // stamp an object as visited
  obj->setTagInteger(TString::Format(".%s.timestamp.machine",this->getVisitTraceIDConst()),TQUtils::getCurrentTime());
  obj->setTagString(TString::Format(".%s.timestamp.human",this->getVisitTraceIDConst()),TQUtils::getTimeStamp());
  obj->setTagBool(TString::Format(".%s.visited",this->getVisitTraceIDConst()),true);
}

//__________________________________________________________________________________|___________

void TQSampleVisitor::unstamp(TQTaggable* obj) const {
  // stamp an object as visited
  obj->removeTag(TString::Format(".%s.timestamp.machine",this->getVisitTraceIDConst()));
  obj->removeTag(TString::Format(".%s.timestamp.human",this->getVisitTraceIDConst()));
  obj->removeTag(TString::Format(".%s.visited",this->getVisitTraceIDConst()));
}

//__________________________________________________________________________________|___________

bool TQSampleVisitor::checkVisit(TQTaggable* obj) const {
  // check if an object has been visited (i.e. stamped) by this visitor
  return obj ? obj->getTagBoolDefault(TString::Format(".%s.visited",this->getVisitTraceIDConst()),false) : false;
}

//__________________________________________________________________________________|___________

bool TQSampleVisitor::checkVisitFriends(TQSampleFolder* obj) const {
  // check if all friends of a SampleFolder (including itself) have been visited
  // (i.e. stamped) by this visitor. Returns true if all have been visited and
  // false if any one or more have not been visited yet.
  if (!obj) {
    ERRORfunc("SampleFolder provided is a Null pointer!");
    return false;
  }
  updateFriends(obj);
  std::shared_ptr<std::set<TQSampleFolder*>> friends = obj->getFriends();
  if (!friends) {
    throw std::runtime_error( TString::Format("Could not obtain set of Friend SampleFolders (got Null pointer) for SF at path '%s'",obj->getPath().Data() ).Data() );
  }
  for (auto sf : (*friends)) {
    if (!sf) continue;
    if (!this->checkVisit(sf)) {
      DEBUGfunc("SampleFolder '%s' has not been visited yet!",sf->getPath().Data());      
      return false;
    }
  }
  DEBUGfunc("SampleFolder '%s' has already been visited yet!",obj->getPath().Data());      
  return true;
}

//__________________________________________________________________________________|___________

void TQSampleVisitor::updateFriends(TQSampleFolder* sf) {
  if (!sf) return;
  if (sf->countFriends() > 0) {DEBUGclass("Already has friends..."); return;}
  sf->findFriends();
  return;
}
 TQSampleVisitor.cxx:1
 TQSampleVisitor.cxx:2
 TQSampleVisitor.cxx:3
 TQSampleVisitor.cxx:4
 TQSampleVisitor.cxx:5
 TQSampleVisitor.cxx:6
 TQSampleVisitor.cxx:7
 TQSampleVisitor.cxx:8
 TQSampleVisitor.cxx:9
 TQSampleVisitor.cxx:10
 TQSampleVisitor.cxx:11
 TQSampleVisitor.cxx:12
 TQSampleVisitor.cxx:13
 TQSampleVisitor.cxx:14
 TQSampleVisitor.cxx:15
 TQSampleVisitor.cxx:16
 TQSampleVisitor.cxx:17
 TQSampleVisitor.cxx:18
 TQSampleVisitor.cxx:19
 TQSampleVisitor.cxx:20
 TQSampleVisitor.cxx:21
 TQSampleVisitor.cxx:22
 TQSampleVisitor.cxx:23
 TQSampleVisitor.cxx:24
 TQSampleVisitor.cxx:25
 TQSampleVisitor.cxx:26
 TQSampleVisitor.cxx:27
 TQSampleVisitor.cxx:28
 TQSampleVisitor.cxx:29
 TQSampleVisitor.cxx:30
 TQSampleVisitor.cxx:31
 TQSampleVisitor.cxx:32
 TQSampleVisitor.cxx:33
 TQSampleVisitor.cxx:34
 TQSampleVisitor.cxx:35
 TQSampleVisitor.cxx:36
 TQSampleVisitor.cxx:37
 TQSampleVisitor.cxx:38
 TQSampleVisitor.cxx:39
 TQSampleVisitor.cxx:40
 TQSampleVisitor.cxx:41
 TQSampleVisitor.cxx:42
 TQSampleVisitor.cxx:43
 TQSampleVisitor.cxx:44
 TQSampleVisitor.cxx:45
 TQSampleVisitor.cxx:46
 TQSampleVisitor.cxx:47
 TQSampleVisitor.cxx:48
 TQSampleVisitor.cxx:49
 TQSampleVisitor.cxx:50
 TQSampleVisitor.cxx:51
 TQSampleVisitor.cxx:52
 TQSampleVisitor.cxx:53
 TQSampleVisitor.cxx:54
 TQSampleVisitor.cxx:55
 TQSampleVisitor.cxx:56
 TQSampleVisitor.cxx:57
 TQSampleVisitor.cxx:58
 TQSampleVisitor.cxx:59
 TQSampleVisitor.cxx:60
 TQSampleVisitor.cxx:61
 TQSampleVisitor.cxx:62
 TQSampleVisitor.cxx:63
 TQSampleVisitor.cxx:64
 TQSampleVisitor.cxx:65
 TQSampleVisitor.cxx:66
 TQSampleVisitor.cxx:67
 TQSampleVisitor.cxx:68
 TQSampleVisitor.cxx:69
 TQSampleVisitor.cxx:70
 TQSampleVisitor.cxx:71
 TQSampleVisitor.cxx:72
 TQSampleVisitor.cxx:73
 TQSampleVisitor.cxx:74
 TQSampleVisitor.cxx:75
 TQSampleVisitor.cxx:76
 TQSampleVisitor.cxx:77
 TQSampleVisitor.cxx:78
 TQSampleVisitor.cxx:79
 TQSampleVisitor.cxx:80
 TQSampleVisitor.cxx:81
 TQSampleVisitor.cxx:82
 TQSampleVisitor.cxx:83
 TQSampleVisitor.cxx:84
 TQSampleVisitor.cxx:85
 TQSampleVisitor.cxx:86
 TQSampleVisitor.cxx:87
 TQSampleVisitor.cxx:88
 TQSampleVisitor.cxx:89
 TQSampleVisitor.cxx:90
 TQSampleVisitor.cxx:91
 TQSampleVisitor.cxx:92
 TQSampleVisitor.cxx:93
 TQSampleVisitor.cxx:94
 TQSampleVisitor.cxx:95
 TQSampleVisitor.cxx:96
 TQSampleVisitor.cxx:97
 TQSampleVisitor.cxx:98
 TQSampleVisitor.cxx:99
 TQSampleVisitor.cxx:100
 TQSampleVisitor.cxx:101
 TQSampleVisitor.cxx:102
 TQSampleVisitor.cxx:103
 TQSampleVisitor.cxx:104
 TQSampleVisitor.cxx:105
 TQSampleVisitor.cxx:106
 TQSampleVisitor.cxx:107
 TQSampleVisitor.cxx:108
 TQSampleVisitor.cxx:109
 TQSampleVisitor.cxx:110
 TQSampleVisitor.cxx:111
 TQSampleVisitor.cxx:112
 TQSampleVisitor.cxx:113
 TQSampleVisitor.cxx:114
 TQSampleVisitor.cxx:115
 TQSampleVisitor.cxx:116
 TQSampleVisitor.cxx:117
 TQSampleVisitor.cxx:118
 TQSampleVisitor.cxx:119
 TQSampleVisitor.cxx:120
 TQSampleVisitor.cxx:121
 TQSampleVisitor.cxx:122
 TQSampleVisitor.cxx:123
 TQSampleVisitor.cxx:124
 TQSampleVisitor.cxx:125
 TQSampleVisitor.cxx:126
 TQSampleVisitor.cxx:127
 TQSampleVisitor.cxx:128
 TQSampleVisitor.cxx:129
 TQSampleVisitor.cxx:130
 TQSampleVisitor.cxx:131
 TQSampleVisitor.cxx:132
 TQSampleVisitor.cxx:133
 TQSampleVisitor.cxx:134
 TQSampleVisitor.cxx:135
 TQSampleVisitor.cxx:136
 TQSampleVisitor.cxx:137
 TQSampleVisitor.cxx:138
 TQSampleVisitor.cxx:139
 TQSampleVisitor.cxx:140
 TQSampleVisitor.cxx:141
 TQSampleVisitor.cxx:142
 TQSampleVisitor.cxx:143
 TQSampleVisitor.cxx:144
 TQSampleVisitor.cxx:145
 TQSampleVisitor.cxx:146
 TQSampleVisitor.cxx:147
 TQSampleVisitor.cxx:148
 TQSampleVisitor.cxx:149
 TQSampleVisitor.cxx:150
 TQSampleVisitor.cxx:151
 TQSampleVisitor.cxx:152
 TQSampleVisitor.cxx:153
 TQSampleVisitor.cxx:154
 TQSampleVisitor.cxx:155
 TQSampleVisitor.cxx:156
 TQSampleVisitor.cxx:157
 TQSampleVisitor.cxx:158
 TQSampleVisitor.cxx:159
 TQSampleVisitor.cxx:160
 TQSampleVisitor.cxx:161
 TQSampleVisitor.cxx:162
 TQSampleVisitor.cxx:163
 TQSampleVisitor.cxx:164
 TQSampleVisitor.cxx:165
 TQSampleVisitor.cxx:166
 TQSampleVisitor.cxx:167
 TQSampleVisitor.cxx:168
 TQSampleVisitor.cxx:169
 TQSampleVisitor.cxx:170
 TQSampleVisitor.cxx:171
 TQSampleVisitor.cxx:172
 TQSampleVisitor.cxx:173
 TQSampleVisitor.cxx:174
 TQSampleVisitor.cxx:175
 TQSampleVisitor.cxx:176
 TQSampleVisitor.cxx:177
 TQSampleVisitor.cxx:178
 TQSampleVisitor.cxx:179
 TQSampleVisitor.cxx:180
 TQSampleVisitor.cxx:181
 TQSampleVisitor.cxx:182
 TQSampleVisitor.cxx:183
 TQSampleVisitor.cxx:184
 TQSampleVisitor.cxx:185
 TQSampleVisitor.cxx:186
 TQSampleVisitor.cxx:187
 TQSampleVisitor.cxx:188
 TQSampleVisitor.cxx:189
 TQSampleVisitor.cxx:190
 TQSampleVisitor.cxx:191
 TQSampleVisitor.cxx:192
 TQSampleVisitor.cxx:193
 TQSampleVisitor.cxx:194
 TQSampleVisitor.cxx:195
 TQSampleVisitor.cxx:196
 TQSampleVisitor.cxx:197
 TQSampleVisitor.cxx:198
 TQSampleVisitor.cxx:199
 TQSampleVisitor.cxx:200
 TQSampleVisitor.cxx:201
 TQSampleVisitor.cxx:202
 TQSampleVisitor.cxx:203
 TQSampleVisitor.cxx:204
 TQSampleVisitor.cxx:205
 TQSampleVisitor.cxx:206
 TQSampleVisitor.cxx:207
 TQSampleVisitor.cxx:208
 TQSampleVisitor.cxx:209
 TQSampleVisitor.cxx:210
 TQSampleVisitor.cxx:211
 TQSampleVisitor.cxx:212
 TQSampleVisitor.cxx:213
 TQSampleVisitor.cxx:214
 TQSampleVisitor.cxx:215
 TQSampleVisitor.cxx:216
 TQSampleVisitor.cxx:217
 TQSampleVisitor.cxx:218
 TQSampleVisitor.cxx:219
 TQSampleVisitor.cxx:220
 TQSampleVisitor.cxx:221
 TQSampleVisitor.cxx:222
 TQSampleVisitor.cxx:223
 TQSampleVisitor.cxx:224
 TQSampleVisitor.cxx:225
 TQSampleVisitor.cxx:226
 TQSampleVisitor.cxx:227
 TQSampleVisitor.cxx:228
 TQSampleVisitor.cxx:229
 TQSampleVisitor.cxx:230
 TQSampleVisitor.cxx:231
 TQSampleVisitor.cxx:232
 TQSampleVisitor.cxx:233
 TQSampleVisitor.cxx:234
 TQSampleVisitor.cxx:235
 TQSampleVisitor.cxx:236
 TQSampleVisitor.cxx:237
 TQSampleVisitor.cxx:238
 TQSampleVisitor.cxx:239
 TQSampleVisitor.cxx:240
 TQSampleVisitor.cxx:241
 TQSampleVisitor.cxx:242
 TQSampleVisitor.cxx:243
 TQSampleVisitor.cxx:244
 TQSampleVisitor.cxx:245
 TQSampleVisitor.cxx:246
 TQSampleVisitor.cxx:247
 TQSampleVisitor.cxx:248
 TQSampleVisitor.cxx:249
 TQSampleVisitor.cxx:250
 TQSampleVisitor.cxx:251
 TQSampleVisitor.cxx:252
 TQSampleVisitor.cxx:253
 TQSampleVisitor.cxx:254
 TQSampleVisitor.cxx:255
 TQSampleVisitor.cxx:256
 TQSampleVisitor.cxx:257
 TQSampleVisitor.cxx:258
 TQSampleVisitor.cxx:259
 TQSampleVisitor.cxx:260
 TQSampleVisitor.cxx:261
 TQSampleVisitor.cxx:262
 TQSampleVisitor.cxx:263
 TQSampleVisitor.cxx:264
 TQSampleVisitor.cxx:265
 TQSampleVisitor.cxx:266
 TQSampleVisitor.cxx:267
 TQSampleVisitor.cxx:268
 TQSampleVisitor.cxx:269
 TQSampleVisitor.cxx:270
 TQSampleVisitor.cxx:271
 TQSampleVisitor.cxx:272
 TQSampleVisitor.cxx:273
 TQSampleVisitor.cxx:274
 TQSampleVisitor.cxx:275
 TQSampleVisitor.cxx:276
 TQSampleVisitor.cxx:277
 TQSampleVisitor.cxx:278
 TQSampleVisitor.cxx:279
 TQSampleVisitor.cxx:280
 TQSampleVisitor.cxx:281
 TQSampleVisitor.cxx:282
 TQSampleVisitor.cxx:283
 TQSampleVisitor.cxx:284
 TQSampleVisitor.cxx:285
 TQSampleVisitor.cxx:286
 TQSampleVisitor.cxx:287
 TQSampleVisitor.cxx:288
 TQSampleVisitor.cxx:289
 TQSampleVisitor.cxx:290
 TQSampleVisitor.cxx:291
 TQSampleVisitor.cxx:292
 TQSampleVisitor.cxx:293
 TQSampleVisitor.cxx:294
 TQSampleVisitor.cxx:295
 TQSampleVisitor.cxx:296
 TQSampleVisitor.cxx:297
 TQSampleVisitor.cxx:298
 TQSampleVisitor.cxx:299
 TQSampleVisitor.cxx:300
 TQSampleVisitor.cxx:301
 TQSampleVisitor.cxx:302
 TQSampleVisitor.cxx:303
 TQSampleVisitor.cxx:304
 TQSampleVisitor.cxx:305
 TQSampleVisitor.cxx:306
 TQSampleVisitor.cxx:307
 TQSampleVisitor.cxx:308
 TQSampleVisitor.cxx:309
 TQSampleVisitor.cxx:310
 TQSampleVisitor.cxx:311
 TQSampleVisitor.cxx:312
 TQSampleVisitor.cxx:313
 TQSampleVisitor.cxx:314
 TQSampleVisitor.cxx:315
 TQSampleVisitor.cxx:316
 TQSampleVisitor.cxx:317
 TQSampleVisitor.cxx:318
 TQSampleVisitor.cxx:319
 TQSampleVisitor.cxx:320
 TQSampleVisitor.cxx:321
 TQSampleVisitor.cxx:322
 TQSampleVisitor.cxx:323
 TQSampleVisitor.cxx:324
 TQSampleVisitor.cxx:325
 TQSampleVisitor.cxx:326
 TQSampleVisitor.cxx:327
 TQSampleVisitor.cxx:328
 TQSampleVisitor.cxx:329
 TQSampleVisitor.cxx:330
 TQSampleVisitor.cxx:331
 TQSampleVisitor.cxx:332
 TQSampleVisitor.cxx:333
 TQSampleVisitor.cxx:334
 TQSampleVisitor.cxx:335
 TQSampleVisitor.cxx:336
 TQSampleVisitor.cxx:337
 TQSampleVisitor.cxx:338
 TQSampleVisitor.cxx:339
 TQSampleVisitor.cxx:340
 TQSampleVisitor.cxx:341
 TQSampleVisitor.cxx:342
 TQSampleVisitor.cxx:343
 TQSampleVisitor.cxx:344
 TQSampleVisitor.cxx:345
 TQSampleVisitor.cxx:346
 TQSampleVisitor.cxx:347
 TQSampleVisitor.cxx:348
 TQSampleVisitor.cxx:349
 TQSampleVisitor.cxx:350
 TQSampleVisitor.cxx:351
 TQSampleVisitor.cxx:352
 TQSampleVisitor.cxx:353
 TQSampleVisitor.cxx:354
 TQSampleVisitor.cxx:355
 TQSampleVisitor.cxx:356
 TQSampleVisitor.cxx:357
 TQSampleVisitor.cxx:358
 TQSampleVisitor.cxx:359
 TQSampleVisitor.cxx:360
 TQSampleVisitor.cxx:361
 TQSampleVisitor.cxx:362
 TQSampleVisitor.cxx:363
 TQSampleVisitor.cxx:364
 TQSampleVisitor.cxx:365
 TQSampleVisitor.cxx:366
 TQSampleVisitor.cxx:367
 TQSampleVisitor.cxx:368
 TQSampleVisitor.cxx:369
 TQSampleVisitor.cxx:370
 TQSampleVisitor.cxx:371
 TQSampleVisitor.cxx:372
 TQSampleVisitor.cxx:373
 TQSampleVisitor.cxx:374
 TQSampleVisitor.cxx:375
 TQSampleVisitor.cxx:376
 TQSampleVisitor.cxx:377
 TQSampleVisitor.cxx:378
 TQSampleVisitor.cxx:379
 TQSampleVisitor.cxx:380
 TQSampleVisitor.cxx:381
 TQSampleVisitor.cxx:382
 TQSampleVisitor.cxx:383
 TQSampleVisitor.cxx:384
 TQSampleVisitor.cxx:385
 TQSampleVisitor.cxx:386
 TQSampleVisitor.cxx:387
 TQSampleVisitor.cxx:388
 TQSampleVisitor.cxx:389
 TQSampleVisitor.cxx:390
 TQSampleVisitor.cxx:391
 TQSampleVisitor.cxx:392
 TQSampleVisitor.cxx:393
 TQSampleVisitor.cxx:394
 TQSampleVisitor.cxx:395
 TQSampleVisitor.cxx:396
 TQSampleVisitor.cxx:397
 TQSampleVisitor.cxx:398
 TQSampleVisitor.cxx:399
 TQSampleVisitor.cxx:400
 TQSampleVisitor.cxx:401
 TQSampleVisitor.cxx:402
 TQSampleVisitor.cxx:403
 TQSampleVisitor.cxx:404
 TQSampleVisitor.cxx:405
 TQSampleVisitor.cxx:406
 TQSampleVisitor.cxx:407
 TQSampleVisitor.cxx:408
 TQSampleVisitor.cxx:409
 TQSampleVisitor.cxx:410
 TQSampleVisitor.cxx:411
 TQSampleVisitor.cxx:412
 TQSampleVisitor.cxx:413
 TQSampleVisitor.cxx:414
 TQSampleVisitor.cxx:415
 TQSampleVisitor.cxx:416
 TQSampleVisitor.cxx:417
 TQSampleVisitor.cxx:418
 TQSampleVisitor.cxx:419
 TQSampleVisitor.cxx:420
 TQSampleVisitor.cxx:421
 TQSampleVisitor.cxx:422
 TQSampleVisitor.cxx:423
 TQSampleVisitor.cxx:424
 TQSampleVisitor.cxx:425
 TQSampleVisitor.cxx:426
 TQSampleVisitor.cxx:427
 TQSampleVisitor.cxx:428
 TQSampleVisitor.cxx:429
 TQSampleVisitor.cxx:430
 TQSampleVisitor.cxx:431
 TQSampleVisitor.cxx:432
 TQSampleVisitor.cxx:433
 TQSampleVisitor.cxx:434
 TQSampleVisitor.cxx:435
 TQSampleVisitor.cxx:436
 TQSampleVisitor.cxx:437
 TQSampleVisitor.cxx:438
 TQSampleVisitor.cxx:439
 TQSampleVisitor.cxx:440
 TQSampleVisitor.cxx:441
 TQSampleVisitor.cxx:442
 TQSampleVisitor.cxx:443
 TQSampleVisitor.cxx:444
 TQSampleVisitor.cxx:445
 TQSampleVisitor.cxx:446
 TQSampleVisitor.cxx:447
 TQSampleVisitor.cxx:448
 TQSampleVisitor.cxx:449
 TQSampleVisitor.cxx:450
 TQSampleVisitor.cxx:451
 TQSampleVisitor.cxx:452
 TQSampleVisitor.cxx:453
 TQSampleVisitor.cxx:454
 TQSampleVisitor.cxx:455
 TQSampleVisitor.cxx:456
 TQSampleVisitor.cxx:457
 TQSampleVisitor.cxx:458
 TQSampleVisitor.cxx:459
 TQSampleVisitor.cxx:460
 TQSampleVisitor.cxx:461
 TQSampleVisitor.cxx:462
 TQSampleVisitor.cxx:463
 TQSampleVisitor.cxx:464
 TQSampleVisitor.cxx:465
 TQSampleVisitor.cxx:466
 TQSampleVisitor.cxx:467
 TQSampleVisitor.cxx:468
 TQSampleVisitor.cxx:469
 TQSampleVisitor.cxx:470
 TQSampleVisitor.cxx:471
 TQSampleVisitor.cxx:472
 TQSampleVisitor.cxx:473
 TQSampleVisitor.cxx:474
 TQSampleVisitor.cxx:475
 TQSampleVisitor.cxx:476
 TQSampleVisitor.cxx:477
 TQSampleVisitor.cxx:478
 TQSampleVisitor.cxx:479
 TQSampleVisitor.cxx:480
 TQSampleVisitor.cxx:481
 TQSampleVisitor.cxx:482
 TQSampleVisitor.cxx:483
 TQSampleVisitor.cxx:484
 TQSampleVisitor.cxx:485
 TQSampleVisitor.cxx:486
 TQSampleVisitor.cxx:487
 TQSampleVisitor.cxx:488
 TQSampleVisitor.cxx:489
 TQSampleVisitor.cxx:490
 TQSampleVisitor.cxx:491
 TQSampleVisitor.cxx:492
 TQSampleVisitor.cxx:493
 TQSampleVisitor.cxx:494
 TQSampleVisitor.cxx:495
 TQSampleVisitor.cxx:496
 TQSampleVisitor.cxx:497
 TQSampleVisitor.cxx:498
 TQSampleVisitor.cxx:499
 TQSampleVisitor.cxx:500
 TQSampleVisitor.cxx:501
 TQSampleVisitor.cxx:502
 TQSampleVisitor.cxx:503
 TQSampleVisitor.cxx:504
 TQSampleVisitor.cxx:505
 TQSampleVisitor.cxx:506
 TQSampleVisitor.cxx:507
 TQSampleVisitor.cxx:508
 TQSampleVisitor.cxx:509
 TQSampleVisitor.cxx:510
 TQSampleVisitor.cxx:511
 TQSampleVisitor.cxx:512
 TQSampleVisitor.cxx:513
 TQSampleVisitor.cxx:514
 TQSampleVisitor.cxx:515
 TQSampleVisitor.cxx:516
 TQSampleVisitor.cxx:517
 TQSampleVisitor.cxx:518
 TQSampleVisitor.cxx:519
 TQSampleVisitor.cxx:520
 TQSampleVisitor.cxx:521
 TQSampleVisitor.cxx:522
 TQSampleVisitor.cxx:523
 TQSampleVisitor.cxx:524
 TQSampleVisitor.cxx:525
 TQSampleVisitor.cxx:526
 TQSampleVisitor.cxx:527
 TQSampleVisitor.cxx:528
 TQSampleVisitor.cxx:529
 TQSampleVisitor.cxx:530
 TQSampleVisitor.cxx:531