// @(#)root/netxng:$Id$
/*************************************************************************
 * Copyright (C) 1995-2013, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

////////////////////////////////////////////////////////////////////////////////
//                                                                            //
// TNetXNGFile                                                                //
//                                                                            //
// Authors: Justin Salmon, Lukasz Janyst                                      //
//          CERN, 2013                                                        //
//                                                                            //
// Enables access to XRootD files using the new client.                       //
//                                                                            //
////////////////////////////////////////////////////////////////////////////////

#include "TNetXNGFile.h"
#include "TEnv.h"
#include "TSystem.h"
#include "TTimeStamp.h"
#include "TVirtualPerfStats.h"
#include "TVirtualMonitoring.h"
#include <XrdCl/XrdClURL.hh>
#include <XrdCl/XrdClFile.hh>
#include <XrdCl/XrdClXRootDResponses.hh>
#include <XrdCl/XrdClDefaultEnv.hh>
#include <XrdVersion.hh>
#include <iostream>

//------------------------------------------------------------------------------
// Open handler for async open requests
//------------------------------------------------------------------------------
class TAsyncOpenHandler: public XrdCl::ResponseHandler
{
   public:
      //------------------------------------------------------------------------
      // Constructor
      //------------------------------------------------------------------------
      TAsyncOpenHandler(TNetXNGFile *file)
      {
         fFile = file;
         fFile->SetAsyncOpenStatus(TFile::kAOSInProgress);
      }

      //------------------------------------------------------------------------
      // Called when a response to open arrives
      //------------------------------------------------------------------------
      virtual void HandleResponse(XrdCl::XRootDStatus *status,
                                  XrdCl::AnyObject    *response)
      {
         if (status->IsOK())
         {
            fFile->SetAsyncOpenStatus(TFile::kAOSSuccess);
         }
         else
         {
            fFile->SetAsyncOpenStatus(TFile::kAOSFailure);
         }

         delete response;
         delete status;
         delete this;
      }

   private:
      TNetXNGFile *fFile;
};

//------------------------------------------------------------------------------
// Async readv handler
//------------------------------------------------------------------------------
class TAsyncReadvHandler: public XrdCl::ResponseHandler
{
   public:
      //------------------------------------------------------------------------
      // Constructor
      //------------------------------------------------------------------------
      TAsyncReadvHandler(std::vector<XrdCl::XRootDStatus*> *statuses,
                         Int_t                              statusIndex,
                         TSemaphore                        *semaphore):
         fStatuses(statuses), fStatusIndex(statusIndex), fSemaphore(semaphore) {}


      //------------------------------------------------------------------------
      // Handle readv response
      //------------------------------------------------------------------------
      virtual void HandleResponse(XrdCl::XRootDStatus *status,
                                  XrdCl::AnyObject    *response)
      {
         fStatuses->at(fStatusIndex) = status;
         fSemaphore->Post();
         delete response;
         delete this;
      }

   private:
      std::vector<XrdCl::XRootDStatus*> *fStatuses;    // Pointer to status vector
      Int_t                              fStatusIndex; // Index into status vector
      TSemaphore                        *fSemaphore;   // Synchronize the responses
};


ClassImp(TNetXNGFile);

//______________________________________________________________________________
TNetXNGFile::TNetXNGFile(const char *url,
                         Option_t   *mode,
                         const char *title,
                         Int_t       compress,
                         Int_t       /*netopt*/,
                         Bool_t      parallelopen) :
   TFile(url, "NET", title, compress)
{
   // Constructor
   //
   // param url:          URL of the entry-point server to be contacted
   // param mode:         initial file access mode
   // param title:        title of the file (shown by ROOT browser)
   // param compress:     compression level and algorithm
   // param netopt:       TCP window size in bytes (unused)
   // param parallelopen: open asynchronously

   using namespace XrdCl;

   // Remove any anchor from the url. It may have been used by the base TFile
   // constructor to setup a TArchiveFile but we should not pass it to the xroot
   // client as a part of the filename
   {
     TUrl urlnoanchor(url);
     urlnoanchor.SetAnchor("");
     fUrl = new URL(std::string(urlnoanchor.GetUrl()));
   }

   fFile        = new File();
   fInitCondVar = new XrdSysCondVar();
   fUrl->SetProtocol(std::string("root"));
   fQueryReadVParams = 1;
   fReadvIorMax = 2097136;
   fReadvIovMax = 1024;

   if (ParseOpenMode(mode, fOption, fMode, kTRUE)<0) {
      Error("Open", "could not parse open mode %s", mode);
      MakeZombie();
      return;
   }

   // Map ROOT and xrootd environment
   SetEnv();

   // Init the monitoring system
   if (gMonitoringWriter) {
      if (!fOpenPhases) {
         fOpenPhases = new TList;
         fOpenPhases->SetOwner();
      }
      gMonitoringWriter->SendFileOpenProgress(this, fOpenPhases, "xrdopen",
                                              kFALSE);
   }

   XRootDStatus status;
   if (parallelopen) {
      // Open the file asynchronously
      TAsyncOpenHandler *handler = new TAsyncOpenHandler(this);
      status = fFile->Open(fUrl->GetURL(), fMode, Access::None, handler);
      if (!status.IsOK()) {
         Error("Open", "%s", status.ToStr().c_str());
         MakeZombie();
      }
      return;
   }

   // Open the file synchronously
   status = fFile->Open(fUrl->GetURL(), fMode);
   if (!status.IsOK()) {
#if XrdVNUMBER >= 40000
      if( status.code == errRedirect )
         fNewUrl = status.GetErrorMessage().c_str();
      else
         Error("Open", "%s", status.ToStr().c_str());
#else
      Error("Open", "%s", status.ToStr().c_str());
#endif
      MakeZombie();
      return;
   }

   if( (fMode & OpenFlags::New) || (fMode & OpenFlags::Delete) ||
       (fMode & OpenFlags::Update) )
      fWritable = true;

   // Initialize the file
   bool create = false;
   if( (fMode & OpenFlags::New) || (fMode & OpenFlags::Delete) )
      create = true;
   TFile::Init(create);

   // Get the vector read limits
   GetVectorReadLimits();
}

//______________________________________________________________________________
TNetXNGFile::~TNetXNGFile()
{
   // Destructor

   if (IsOpen())
      Close();
   delete fFile;
   delete fUrl;
   delete fInitCondVar;
}

//______________________________________________________________________________
void TNetXNGFile::Init(Bool_t create)
{
   // Initialize the file. Makes sure that the file is really open before
   // calling TFile::Init. It may block.

   using namespace XrdCl;

   if (fInitDone) {
      if (gDebug > 1) Info("Init", "TFile::Init already called once");
      return;
   }

   // If the async open didn't return yet, wait for it
   if (!IsOpen() && fAsyncOpenStatus == kAOSInProgress) {
      fInitCondVar->Wait();
   }

   // Notify the monitoring system
   if (gMonitoringWriter)
      gMonitoringWriter->SendFileOpenProgress(this, fOpenPhases, "rootinit",
                                              kFALSE);

   // Initialize the file
   TFile::Init(create);

   // Notify the monitoring system
   if (gMonitoringWriter)
      gMonitoringWriter->SendFileOpenProgress(this, fOpenPhases, "endopen",
                                              kTRUE);

   // Get the vector read limits
   GetVectorReadLimits();
}

//______________________________________________________________________________
Long64_t TNetXNGFile::GetSize() const
{
   // Get the file size. Returns -1 in the case that the file could not be
   // stat'ed.

   using namespace XrdCl;

   // Check the file isn't a zombie or closed
   if (!IsUseable())
      return -1;

   bool forceStat = true;
   if( fMode == XrdCl::OpenFlags::Read )
      forceStat = false;

   StatInfo *info = 0;
   if( !fFile->Stat( forceStat, info ).IsOK() )
    return -1;
   Long64_t size = info->GetSize();
   delete info;
   return size;
}

//______________________________________________________________________________
Bool_t TNetXNGFile::IsOpen() const
{
   // Check if the file is open

   return fFile->IsOpen();
}

//______________________________________________________________________________
void TNetXNGFile::SetAsyncOpenStatus(EAsyncOpenStatus status)
{
   // Set the status of an asynchronous file open

   fAsyncOpenStatus = status;
   // Unblock Init() if it is waiting
   fInitCondVar->Signal();
}

//______________________________________________________________________________
void TNetXNGFile::Close(const Option_t */*option*/)
{
   // Close the file
   //
   // param option: if == "R", all TProcessIDs referenced by this file are
   //               deleted (is this valid in xrootd context?)

   TFile::Close();

   XrdCl::XRootDStatus status = fFile->Close();
   if (!status.IsOK()) {
      Error("Close", "%s", status.ToStr().c_str());
      MakeZombie();
   }
}

//______________________________________________________________________________
Int_t TNetXNGFile::ReOpen(Option_t *modestr)
{
   // Reopen the file with the new access mode
   //
   // param mode: the new access mode
   // returns:    0 in case the mode was successfully modified, 1 in case
   //             the mode did not change (was already as requested or wrong
   //             input arguments) and -1 in case of failure, in which case
   //             the file cannot be used anymore

   using namespace XrdCl;
   TString newOpt;
   OpenFlags::Flags mode;

   Int_t parseres = ParseOpenMode(modestr, newOpt, mode, kFALSE);

   // Only Read and Update are valid modes
   if (parseres<0 || (mode != OpenFlags::Read && mode != OpenFlags::Update)) {
      Error("ReOpen", "mode must be either READ or UPDATE, not %s", modestr);
      return 1;
   }

   // The mode is not really changing
   if (mode == fMode || (mode == OpenFlags::Update
                         && fMode == OpenFlags::New)) {
      return 1;
   }

   fFile->Close();
   fOption = newOpt;
   fMode = mode;

   XRootDStatus st = fFile->Open(fUrl->GetURL(), fMode);
   if (!st.IsOK()) {
      Error("ReOpen", "%s", st.ToStr().c_str());
      return 1;
   }

   return 0;
}

//______________________________________________________________________________
Bool_t TNetXNGFile::ReadBuffer(char *buffer, Int_t length)
{
   // Read a data chunk of the given size
   //
   // param buffer: a pointer to a buffer big enough to hold the data
   // param length: number of bytes to be read
   // returns:      kTRUE in case of failure

   return ReadBuffer(buffer, GetRelOffset(), length);
}

//______________________________________________________________________________
Bool_t TNetXNGFile::ReadBuffer(char *buffer, Long64_t position, Int_t length)
{
   // Read a data chunk of the given size, starting from the given offset
   //
   // param buffer:   a pointer to a buffer big enough to hold the data
   // param position: offset from the beginning of the file
   // param length:   number of bytes to be read
   // returns:        kTRUE in case of failure

   using namespace XrdCl;
   if (gDebug > 0)
      Info("ReadBuffer", "offset: %lld length: %d", position, length);

   // Check the file isn't a zombie or closed
   if (!IsUseable())
      return kTRUE;

   // Try to read from cache
   SetOffset(position);
   Int_t status;
   if ((status = ReadBufferViaCache(buffer, length))) {
      if (status == 2)
         return kTRUE;
      return kFALSE;
   }

   Double_t start = 0;
   if (gPerfStats) start = TTimeStamp();

   // Read the data
   uint32_t bytesRead = 0;
   XRootDStatus st = fFile->Read(fOffset, length, buffer, bytesRead);
   if (gDebug > 0)
      Info("ReadBuffer", "%s bytes read: %d", st.ToStr().c_str(), bytesRead);

   if (!st.IsOK()) {
      Error("ReadBuffer", "%s", st.ToStr().c_str());
      return kTRUE;
   }

   // Bump the globals
   fOffset     += bytesRead;
   fBytesRead  += bytesRead;
   fgBytesRead += bytesRead;
   fReadCalls  ++;
   fgReadCalls ++;

   if (gPerfStats)
      gPerfStats->FileReadEvent(this, (Int_t)bytesRead, start);

   if (gMonitoringWriter)
      gMonitoringWriter->SendFileReadProgress(this);

   return kFALSE;
}

//______________________________________________________________________________
Bool_t TNetXNGFile::ReadBuffers(char *buffer, Long64_t *position, Int_t *length,
      Int_t nbuffs)
{
   // Read scattered data chunks in one operation
   //
   // param buffer:   a pointer to a buffer big enough to hold all of the
   //                 requested data
   // param position: position[i] is the seek position of chunk i of len
   //                 length[i]
   // param length:   length[i] is the length of the chunk at offset
   //                 position[i]
   // param nbuffs:   number of chunks
   // returns:        kTRUE in case of failure

   using namespace XrdCl;

   // Check the file isn't a zombie or closed
   if (!IsUseable())
      return kTRUE;

   std::vector<ChunkList>      chunkLists;
   ChunkList                   chunks;
   std::vector<XRootDStatus*> *statuses;
   TSemaphore                 *semaphore;
   Int_t                       totalBytes = 0;
   Long64_t                    offset     = 0;
   char                       *cursor     = buffer;

   Double_t start = 0;
   if (gPerfStats) start = TTimeStamp();

   if (fArchiveOffset)
      for (Int_t i = 0; i < nbuffs; i++)
         position[i] += fArchiveOffset;

   // Build a list of chunks. Put the buffers in the ChunkInfo's
   for (Int_t i = 0; i < nbuffs; ++i) {
      totalBytes += length[i];

      // If the length is bigger than max readv size, split into smaller chunks
      if (length[i] > fReadvIorMax) {
         Int_t nsplit = length[i] / fReadvIorMax;
         Int_t rem    = length[i] % fReadvIorMax;
         Int_t j;

         // Add as many max-size chunks as are divisible
         for (j = 0; j < nsplit; ++j) {
            offset = position[i] + (j * fReadvIorMax);
            chunks.push_back(ChunkInfo(offset, fReadvIorMax, cursor));
            cursor += fReadvIorMax;
         }

         // Add the remainder
         offset = position[i] + (j * fReadvIorMax);
         chunks.push_back(ChunkInfo(offset, rem, cursor));
         cursor += rem;
      } else {
         chunks.push_back(ChunkInfo(position[i], length[i], cursor));
         cursor += length[i];
      }

      // If there are more than or equal to max chunks, make another chunk list
      if ((Int_t) chunks.size() == fReadvIovMax) {
         chunkLists.push_back(chunks);
         chunks = ChunkList();
      } else if ((Int_t) chunks.size() > fReadvIovMax) {
         chunkLists.push_back(ChunkList(chunks.begin(),
                                        chunks.begin() + fReadvIovMax));
         chunks = ChunkList(chunks.begin() + fReadvIovMax, chunks.end());
      }
   }

   // Push back the last chunk list
   if( !chunks.empty() )
      chunkLists.push_back(chunks);

   TAsyncReadvHandler *handler;
   XRootDStatus        status;
   semaphore = new TSemaphore(0);
   statuses  = new std::vector<XRootDStatus*>(chunkLists.size());

   // Read asynchronously but wait for all responses
   std::vector<ChunkList>::iterator it;
   for (it = chunkLists.begin(); it != chunkLists.end(); ++it)
   {
      handler = new TAsyncReadvHandler(statuses, it - chunkLists.begin(),
                                       semaphore);
      status = fFile->VectorRead(*it, 0, handler);

      if (!status.IsOK()) {
         Error("ReadBuffers", "%s", status.ToStr().c_str());
         return kTRUE;
      }
   }

   // Wait for all responses
   for (it = chunkLists.begin(); it != chunkLists.end(); ++it) {
      semaphore->Wait();
   }

   // Check for errors
   for (it = chunkLists.begin(); it != chunkLists.end(); ++it) {
      XRootDStatus *st = statuses->at(it - chunkLists.begin());

      if (!st->IsOK()) {
         Error("ReadBuffers", "%s", st->ToStr().c_str());
         for( ; it != chunkLists.end(); ++it )
         {
            st = statuses->at( it - chunkLists.begin() );
            delete st;
         }
         delete statuses;
         delete semaphore;

         return kTRUE;
      }
      delete st;
   }

   // Bump the globals
   fBytesRead  += totalBytes;
   fgBytesRead += totalBytes;
   fReadCalls  ++;
   fgReadCalls ++;

   if (gPerfStats) {
      fOffset = position[0];
      gPerfStats->FileReadEvent(this, totalBytes, start);
   }

   if (gMonitoringWriter)
      gMonitoringWriter->SendFileReadProgress(this);

   delete statuses;
   delete semaphore;
   return kFALSE;
}

//______________________________________________________________________________
Bool_t TNetXNGFile::WriteBuffer(const char *buffer, Int_t length)
{
   // Write a data chunk
   //
   // param buffer: the data to be written
   // param length: the size of the buffer
   // returns:      kTRUE in case of failure

   using namespace XrdCl;

   // Check the file isn't a zombie or closed
   if (!IsUseable())
      return kTRUE;

   if (!fWritable) {
      if (gDebug > 1)
         Info("WriteBuffer", "file not writable");
      return kTRUE;
   }

   // Check the write cache
   Int_t status;
   if ((status = WriteBufferViaCache(buffer, length))) {
      if (status == 2)
         return kTRUE;
      return kFALSE;
   }

   // Write the data
   XRootDStatus st = fFile->Write(fOffset, length, buffer);
   if (!st.IsOK()) {
      Error("WriteBuffer", "%s", st.ToStr().c_str());
      return kTRUE;
   }

   // Bump the globals
   fOffset      += length;
   fBytesWrite  += length;
   fgBytesWrite += length;

   return kFALSE;
}

//_____________________________________________________________________________
void TNetXNGFile::Flush()
{
   if (!IsUseable())
      return;

   if (!fWritable) {
      if (gDebug > 1)
         Info("Flush", "file not writable - do nothing");
      return;
   }

   FlushWriteCache();

   //
   // Flush via the remote xrootd
   XrdCl::XRootDStatus status = fFile->Sync();
   if( !status.IsOK() )
      Error("Flush", "%s", status.ToStr().c_str());

   if (gDebug > 1)
      Info("Flush", "XrdClient::Sync succeeded.");
}

//______________________________________________________________________________
void TNetXNGFile::Seek(Long64_t offset, ERelativeTo position)
{
   // Set the position within the file
   //
   // param offset:   the new offset relative to position
   // param position: the relative position, either kBeg, kCur or kEnd

   SetOffset(offset, position);
}

//______________________________________________________________________________
Int_t TNetXNGFile::ParseOpenMode(Option_t *in, TString &modestr,
                                 XrdCl::OpenFlags::Flags &mode,
                                 Bool_t assumeRead)
{
   // Parse a file open mode given as a string into a canonically formatted
   // output mode string and an integer code that the xroot client can use
   //
   // param    in:         the file open mode as a string (in)
   //          modestr:    open mode string after parsing (out)
   //          mode:       correctly parsed option mode code (out)
   //          assumeRead: if the open mode is not recognised assume read (in)
   // returns:             0 in case the mode was successfully parsed,
   //                     -1 in case of failure

   using namespace XrdCl;
   modestr = ToUpper(TString(in));

   if (modestr == "NEW" || modestr == "CREATE")  mode = OpenFlags::New;
   else if (modestr == "RECREATE")               mode = OpenFlags::Delete;
   else if (modestr == "UPDATE")                 mode = OpenFlags::Update;
   else if (modestr == "READ")                   mode = OpenFlags::Read;
   else {
      if (!assumeRead) {
         return -1;
      }
      modestr = "READ";
      mode = OpenFlags::Read;
   }

   return 0;
}

//______________________________________________________________________________
Bool_t TNetXNGFile::IsUseable() const
{
   // Check the file is open and isn't a zombie

   if (IsZombie()) {
      Error("TNetXNGFile", "Object is in 'zombie' state");
      return kFALSE;
   }

   if (!IsOpen()) {
      Error("TNetXNGFile", "The remote file is not open");
      return kFALSE;
   }

   return kTRUE;
}

//______________________________________________________________________________
Bool_t TNetXNGFile::GetVectorReadLimits()
{
   // Find the server-specific readv config params. Returns kFALSE in case of
   // error, kTRUE otherwise.

   using namespace XrdCl;

   // Check the file isn't a zombie or closed
   if (!IsUseable())
      return kFALSE;

   if (!fQueryReadVParams)
      return kTRUE;

#if XrdVNUMBER >= 40000
   std::string dataServerStr;
   if( !fFile->GetProperty( "DataServer", dataServerStr ) )
      return kFALSE;
   URL dataServer(dataServerStr);
#else
   URL dataServer(fFile->GetDataServer());
#endif
   FileSystem fs(dataServer);
   Buffer  arg;
   Buffer *response;
   arg.FromString(std::string("readv_ior_max readv_iov_max"));

   XRootDStatus status = fs.Query(QueryCode::Config, arg, response);
   if (!status.IsOK())
      return kFALSE;

   Ssiz_t from = 0;
   TString token;

   std::vector<TString> resps;
   while (TString(response->ToString()).Tokenize(token, from, "\n"))
      resps.push_back(token);

   if (resps.size() != 2)
      return kFALSE;

   if (resps[0].IsDigit())
      fReadvIorMax = resps[0].Atoi();

   if (resps[1].IsDigit())
      fReadvIovMax = resps[1].Atoi();

   delete response;

   // this is to workaround a dCache bug reported here:
   // https://sft.its.cern.ch/jira/browse/ROOT-6639
   if( fReadvIovMax == 0x7FFFFFFF )
   {
     fReadvIovMax = 1024;
     fReadvIorMax = 2097136;
   }

   return kTRUE;
}

//______________________________________________________________________________
void TNetXNGFile::SetEnv()
{
   // Map ROOT and xrootd environment variables

   XrdCl::Env *env  = XrdCl::DefaultEnv::GetEnv();
   const char *cenv = 0;
   TString     val;

   val = gEnv->GetValue("NetXNG.ConnectionWindow",     "");
   if (val.Length() > 0 && (!(cenv = gSystem->Getenv("XRD_CONNECTIONWINDOW"))
                            || strlen(cenv) <= 0))
      env->PutInt("ConnectionWindow", val.Atoi());

   val = gEnv->GetValue("NetXNG.ConnectionRetry",      "");
   if (val.Length() > 0 && (!(cenv = gSystem->Getenv("XRD_CONNECTIONRETRY"))
                            || strlen(cenv) <= 0))
      env->PutInt("RequestTimeout", val.Atoi());

   val = gEnv->GetValue("NetXNG.RequestTimeout",       "");
   if (val.Length() > 0 && (!(cenv = gSystem->Getenv("XRD_REQUESTTIMEOUT"))
                            || strlen(cenv) <= 0))
      env->PutInt("RequestTimeout", val.Atoi());

   val = gEnv->GetValue("NetXNG.SubStreamsPerChannel", "");
   if (val.Length() > 0 && (!(cenv = gSystem->Getenv("XRD_SUBSTREAMSPERCHANNEL"))
                            || strlen(cenv) <= 0))
      env->PutInt("SubStreamsPerChannel", val.Atoi());

   val = gEnv->GetValue("NetXNG.TimeoutResolution",    "");
   if (val.Length() > 0 && (!(cenv = gSystem->Getenv("XRD_TIMEOUTRESOLUTION"))
                            || strlen(cenv) <= 0))
      env->PutInt("TimeoutResolution", val.Atoi());

   val = gEnv->GetValue("NetXNG.StreamErrorWindow",    "");
   if (val.Length() > 0 && (!(cenv = gSystem->Getenv("XRD_STREAMERRORWINDOW"))
                            || strlen(cenv) <= 0))
      env->PutInt("StreamErrorWindow", val.Atoi());

   val = gEnv->GetValue("NetXNG.RunForkHandler",       "");
   if (val.Length() > 0 && (!(cenv = gSystem->Getenv("XRD_RUNFORKHANDLER"))
                            || strlen(cenv) <= 0))
      env->PutInt("RunForkHandler", val.Atoi());

   val = gEnv->GetValue("NetXNG.RedirectLimit",        "");
   if (val.Length() > 0 && (!(cenv = gSystem->Getenv("XRD_REDIRECTLIMIT"))
                            || strlen(cenv) <= 0))
      env->PutInt("RedirectLimit", val.Atoi());

   val = gEnv->GetValue("NetXNG.WorkerThreads",        "");
   if (val.Length() > 0 && (!(cenv = gSystem->Getenv("XRD_WORKERTHREADS"))
                            || strlen(cenv) <= 0))
      env->PutInt("WorkerThreads", val.Atoi());

   val = gEnv->GetValue("NetXNG.CPChunkSize",          "");
   if (val.Length() > 0 && (!(cenv = gSystem->Getenv("XRD_CPCHUNKSIZE"))
                            || strlen(cenv) <= 0))
      env->PutInt("CPChunkSize", val.Atoi());

   val = gEnv->GetValue("NetXNG.CPParallelChunks",     "");
   if (val.Length() > 0 && (!(cenv = gSystem->Getenv("XRD_CPPARALLELCHUNKS"))
                            || strlen(cenv) <= 0))
      env->PutInt("CPParallelChunks", val.Atoi());

   val = gEnv->GetValue("NetXNG.PollerPreference",     "");
   if (val.Length() > 0 && (!(cenv = gSystem->Getenv("XRD_POLLERPREFERENCE"))
                            || strlen(cenv) <= 0))
      env->PutString("PollerPreference", val.Data());

   val = gEnv->GetValue("NetXNG.ClientMonitor",        "");
   if (val.Length() > 0 && (!(cenv = gSystem->Getenv("XRD_CLIENTMONITOR"))
                            || strlen(cenv) <= 0))
      env->PutString("ClientMonitor", val.Data());

   val = gEnv->GetValue("NetXNG.ClientMonitorParam",   "");
   if (val.Length() > 0 && (!(cenv = gSystem->Getenv("XRD_CLIENTMONITORPARAM"))
                            || strlen(cenv) <= 0))
      env->PutString("ClientMonitorParam", val.Data());

   fQueryReadVParams = gEnv->GetValue("NetXNG.QueryReadVParams", 1);
   env->PutInt( "MultiProtocol", gEnv->GetValue("TFile.CrossProtocolRedirects", 1));

   // Old style netrc file
   TString netrc;
   netrc.Form("%s/.rootnetrc", gSystem->HomeDirectory());
   gSystem->Setenv("XrdSecNETRC", netrc.Data());

   // For authentication
   val = gEnv->GetValue("XSec.Pwd.ALogFile",     "");
   if (val.Length() > 0)
      gSystem->Setenv("XrdSecPWDALOGFILE",     val.Data());

   val = gEnv->GetValue("XSec.Pwd.ServerPuk",    "");
   if (val.Length() > 0)
      gSystem->Setenv("XrdSecPWDSRVPUK",       val.Data());

   val = gEnv->GetValue("XSec.GSI.CAdir",        "");
   if (val.Length() > 0)
      gSystem->Setenv("XrdSecGSICADIR",        val.Data());

   val = gEnv->GetValue("XSec.GSI.CRLdir",       "");
   if (val.Length() > 0)
      gSystem->Setenv("XrdSecGSICRLDIR",       val.Data());

   val = gEnv->GetValue("XSec.GSI.CRLextension", "");
   if (val.Length() > 0)
      gSystem->Setenv("XrdSecGSICRLEXT",       val.Data());

   val = gEnv->GetValue("XSec.GSI.UserCert",     "");
   if (val.Length() > 0)
      gSystem->Setenv("XrdSecGSIUSERCERT",     val.Data());

   val = gEnv->GetValue("XSec.GSI.UserKey",      "");
   if (val.Length() > 0)
      gSystem->Setenv("XrdSecGSIUSERKEY",      val.Data());

   val = gEnv->GetValue("XSec.GSI.UserProxy",    "");
   if (val.Length() > 0)
      gSystem->Setenv("XrdSecGSIUSERPROXY",    val.Data());

   val = gEnv->GetValue("XSec.GSI.ProxyValid",   "");
   if (val.Length() > 0)
      gSystem->Setenv("XrdSecGSIPROXYVALID",   val.Data());

   val = gEnv->GetValue("XSec.GSI.ProxyKeyBits", "");
   if (val.Length() > 0)
      gSystem->Setenv("XrdSecGSIPROXYKEYBITS", val.Data());

   val = gEnv->GetValue("XSec.GSI.ProxyForward", "0");
   if (val.Length() > 0 && (!(cenv = gSystem->Getenv("XrdSecGSIPROXYDEPLEN"))
                            || strlen(cenv) <= 0))
      gSystem->Setenv("XrdSecGSIPROXYDEPLEN",  val.Data());

   val = gEnv->GetValue("XSec.GSI.CheckCRL",     "1");
   if (val.Length() > 0 && (!(cenv = gSystem->Getenv("XrdSecGSICRLCHECK"))
                            || strlen(cenv) <= 0))
      gSystem->Setenv("XrdSecGSICRLCHECK",     val.Data());

   val = gEnv->GetValue("XSec.GSI.DelegProxy",   "0");
   if (val.Length() > 0 && (!(cenv = gSystem->Getenv("XrdSecGSIDELEGPROXY"))
                            || strlen(cenv) <= 0))
      gSystem->Setenv("XrdSecGSIDELEGPROXY",   val.Data());

   val = gEnv->GetValue("XSec.GSI.SignProxy",    "1");
   if (val.Length() > 0 && (!(cenv = gSystem->Getenv("XrdSecGSISIGNPROXY"))
                            || strlen(cenv) <= 0))
      gSystem->Setenv("XrdSecGSISIGNPROXY",    val.Data());

   val = gEnv->GetValue("XSec.Pwd.AutoLogin",    "1");
   if (val.Length() > 0 && (!(cenv = gSystem->Getenv("XrdSecPWDAUTOLOG"))
                            || strlen(cenv) <= 0))
      gSystem->Setenv("XrdSecPWDAUTOLOG",      val.Data());

   val = gEnv->GetValue("XSec.Pwd.VerifySrv",    "1");
   if (val.Length() > 0 && (!(cenv = gSystem->Getenv("XrdSecPWDVERIFYSRV"))
                            || strlen(cenv) <= 0))
      gSystem->Setenv("XrdSecPWDVERIFYSRV",    val.Data());
}

 TNetXNGFile.cxx:1
 TNetXNGFile.cxx:2
 TNetXNGFile.cxx:3
 TNetXNGFile.cxx:4
 TNetXNGFile.cxx:5
 TNetXNGFile.cxx:6
 TNetXNGFile.cxx:7
 TNetXNGFile.cxx:8
 TNetXNGFile.cxx:9
 TNetXNGFile.cxx:10
 TNetXNGFile.cxx:11
 TNetXNGFile.cxx:12
 TNetXNGFile.cxx:13
 TNetXNGFile.cxx:14
 TNetXNGFile.cxx:15
 TNetXNGFile.cxx:16
 TNetXNGFile.cxx:17
 TNetXNGFile.cxx:18
 TNetXNGFile.cxx:19
 TNetXNGFile.cxx:20
 TNetXNGFile.cxx:21
 TNetXNGFile.cxx:22
 TNetXNGFile.cxx:23
 TNetXNGFile.cxx:24
 TNetXNGFile.cxx:25
 TNetXNGFile.cxx:26
 TNetXNGFile.cxx:27
 TNetXNGFile.cxx:28
 TNetXNGFile.cxx:29
 TNetXNGFile.cxx:30
 TNetXNGFile.cxx:31
 TNetXNGFile.cxx:32
 TNetXNGFile.cxx:33
 TNetXNGFile.cxx:34
 TNetXNGFile.cxx:35
 TNetXNGFile.cxx:36
 TNetXNGFile.cxx:37
 TNetXNGFile.cxx:38
 TNetXNGFile.cxx:39
 TNetXNGFile.cxx:40
 TNetXNGFile.cxx:41
 TNetXNGFile.cxx:42
 TNetXNGFile.cxx:43
 TNetXNGFile.cxx:44
 TNetXNGFile.cxx:45
 TNetXNGFile.cxx:46
 TNetXNGFile.cxx:47
 TNetXNGFile.cxx:48
 TNetXNGFile.cxx:49
 TNetXNGFile.cxx:50
 TNetXNGFile.cxx:51
 TNetXNGFile.cxx:52
 TNetXNGFile.cxx:53
 TNetXNGFile.cxx:54
 TNetXNGFile.cxx:55
 TNetXNGFile.cxx:56
 TNetXNGFile.cxx:57
 TNetXNGFile.cxx:58
 TNetXNGFile.cxx:59
 TNetXNGFile.cxx:60
 TNetXNGFile.cxx:61
 TNetXNGFile.cxx:62
 TNetXNGFile.cxx:63
 TNetXNGFile.cxx:64
 TNetXNGFile.cxx:65
 TNetXNGFile.cxx:66
 TNetXNGFile.cxx:67
 TNetXNGFile.cxx:68
 TNetXNGFile.cxx:69
 TNetXNGFile.cxx:70
 TNetXNGFile.cxx:71
 TNetXNGFile.cxx:72
 TNetXNGFile.cxx:73
 TNetXNGFile.cxx:74
 TNetXNGFile.cxx:75
 TNetXNGFile.cxx:76
 TNetXNGFile.cxx:77
 TNetXNGFile.cxx:78
 TNetXNGFile.cxx:79
 TNetXNGFile.cxx:80
 TNetXNGFile.cxx:81
 TNetXNGFile.cxx:82
 TNetXNGFile.cxx:83
 TNetXNGFile.cxx:84
 TNetXNGFile.cxx:85
 TNetXNGFile.cxx:86
 TNetXNGFile.cxx:87
 TNetXNGFile.cxx:88
 TNetXNGFile.cxx:89
 TNetXNGFile.cxx:90
 TNetXNGFile.cxx:91
 TNetXNGFile.cxx:92
 TNetXNGFile.cxx:93
 TNetXNGFile.cxx:94
 TNetXNGFile.cxx:95
 TNetXNGFile.cxx:96
 TNetXNGFile.cxx:97
 TNetXNGFile.cxx:98
 TNetXNGFile.cxx:99
 TNetXNGFile.cxx:100
 TNetXNGFile.cxx:101
 TNetXNGFile.cxx:102
 TNetXNGFile.cxx:103
 TNetXNGFile.cxx:104
 TNetXNGFile.cxx:105
 TNetXNGFile.cxx:106
 TNetXNGFile.cxx:107
 TNetXNGFile.cxx:108
 TNetXNGFile.cxx:109
 TNetXNGFile.cxx:110
 TNetXNGFile.cxx:111
 TNetXNGFile.cxx:112
 TNetXNGFile.cxx:113
 TNetXNGFile.cxx:114
 TNetXNGFile.cxx:115
 TNetXNGFile.cxx:116
 TNetXNGFile.cxx:117
 TNetXNGFile.cxx:118
 TNetXNGFile.cxx:119
 TNetXNGFile.cxx:120
 TNetXNGFile.cxx:121
 TNetXNGFile.cxx:122
 TNetXNGFile.cxx:123
 TNetXNGFile.cxx:124
 TNetXNGFile.cxx:125
 TNetXNGFile.cxx:126
 TNetXNGFile.cxx:127
 TNetXNGFile.cxx:128
 TNetXNGFile.cxx:129
 TNetXNGFile.cxx:130
 TNetXNGFile.cxx:131
 TNetXNGFile.cxx:132
 TNetXNGFile.cxx:133
 TNetXNGFile.cxx:134
 TNetXNGFile.cxx:135
 TNetXNGFile.cxx:136
 TNetXNGFile.cxx:137
 TNetXNGFile.cxx:138
 TNetXNGFile.cxx:139
 TNetXNGFile.cxx:140
 TNetXNGFile.cxx:141
 TNetXNGFile.cxx:142
 TNetXNGFile.cxx:143
 TNetXNGFile.cxx:144
 TNetXNGFile.cxx:145
 TNetXNGFile.cxx:146
 TNetXNGFile.cxx:147
 TNetXNGFile.cxx:148
 TNetXNGFile.cxx:149
 TNetXNGFile.cxx:150
 TNetXNGFile.cxx:151
 TNetXNGFile.cxx:152
 TNetXNGFile.cxx:153
 TNetXNGFile.cxx:154
 TNetXNGFile.cxx:155
 TNetXNGFile.cxx:156
 TNetXNGFile.cxx:157
 TNetXNGFile.cxx:158
 TNetXNGFile.cxx:159
 TNetXNGFile.cxx:160
 TNetXNGFile.cxx:161
 TNetXNGFile.cxx:162
 TNetXNGFile.cxx:163
 TNetXNGFile.cxx:164
 TNetXNGFile.cxx:165
 TNetXNGFile.cxx:166
 TNetXNGFile.cxx:167
 TNetXNGFile.cxx:168
 TNetXNGFile.cxx:169
 TNetXNGFile.cxx:170
 TNetXNGFile.cxx:171
 TNetXNGFile.cxx:172
 TNetXNGFile.cxx:173
 TNetXNGFile.cxx:174
 TNetXNGFile.cxx:175
 TNetXNGFile.cxx:176
 TNetXNGFile.cxx:177
 TNetXNGFile.cxx:178
 TNetXNGFile.cxx:179
 TNetXNGFile.cxx:180
 TNetXNGFile.cxx:181
 TNetXNGFile.cxx:182
 TNetXNGFile.cxx:183
 TNetXNGFile.cxx:184
 TNetXNGFile.cxx:185
 TNetXNGFile.cxx:186
 TNetXNGFile.cxx:187
 TNetXNGFile.cxx:188
 TNetXNGFile.cxx:189
 TNetXNGFile.cxx:190
 TNetXNGFile.cxx:191
 TNetXNGFile.cxx:192
 TNetXNGFile.cxx:193
 TNetXNGFile.cxx:194
 TNetXNGFile.cxx:195
 TNetXNGFile.cxx:196
 TNetXNGFile.cxx:197
 TNetXNGFile.cxx:198
 TNetXNGFile.cxx:199
 TNetXNGFile.cxx:200
 TNetXNGFile.cxx:201
 TNetXNGFile.cxx:202
 TNetXNGFile.cxx:203
 TNetXNGFile.cxx:204
 TNetXNGFile.cxx:205
 TNetXNGFile.cxx:206
 TNetXNGFile.cxx:207
 TNetXNGFile.cxx:208
 TNetXNGFile.cxx:209
 TNetXNGFile.cxx:210
 TNetXNGFile.cxx:211
 TNetXNGFile.cxx:212
 TNetXNGFile.cxx:213
 TNetXNGFile.cxx:214
 TNetXNGFile.cxx:215
 TNetXNGFile.cxx:216
 TNetXNGFile.cxx:217
 TNetXNGFile.cxx:218
 TNetXNGFile.cxx:219
 TNetXNGFile.cxx:220
 TNetXNGFile.cxx:221
 TNetXNGFile.cxx:222
 TNetXNGFile.cxx:223
 TNetXNGFile.cxx:224
 TNetXNGFile.cxx:225
 TNetXNGFile.cxx:226
 TNetXNGFile.cxx:227
 TNetXNGFile.cxx:228
 TNetXNGFile.cxx:229
 TNetXNGFile.cxx:230
 TNetXNGFile.cxx:231
 TNetXNGFile.cxx:232
 TNetXNGFile.cxx:233
 TNetXNGFile.cxx:234
 TNetXNGFile.cxx:235
 TNetXNGFile.cxx:236
 TNetXNGFile.cxx:237
 TNetXNGFile.cxx:238
 TNetXNGFile.cxx:239
 TNetXNGFile.cxx:240
 TNetXNGFile.cxx:241
 TNetXNGFile.cxx:242
 TNetXNGFile.cxx:243
 TNetXNGFile.cxx:244
 TNetXNGFile.cxx:245
 TNetXNGFile.cxx:246
 TNetXNGFile.cxx:247
 TNetXNGFile.cxx:248
 TNetXNGFile.cxx:249
 TNetXNGFile.cxx:250
 TNetXNGFile.cxx:251
 TNetXNGFile.cxx:252
 TNetXNGFile.cxx:253
 TNetXNGFile.cxx:254
 TNetXNGFile.cxx:255
 TNetXNGFile.cxx:256
 TNetXNGFile.cxx:257
 TNetXNGFile.cxx:258
 TNetXNGFile.cxx:259
 TNetXNGFile.cxx:260
 TNetXNGFile.cxx:261
 TNetXNGFile.cxx:262
 TNetXNGFile.cxx:263
 TNetXNGFile.cxx:264
 TNetXNGFile.cxx:265
 TNetXNGFile.cxx:266
 TNetXNGFile.cxx:267
 TNetXNGFile.cxx:268
 TNetXNGFile.cxx:269
 TNetXNGFile.cxx:270
 TNetXNGFile.cxx:271
 TNetXNGFile.cxx:272
 TNetXNGFile.cxx:273
 TNetXNGFile.cxx:274
 TNetXNGFile.cxx:275
 TNetXNGFile.cxx:276
 TNetXNGFile.cxx:277
 TNetXNGFile.cxx:278
 TNetXNGFile.cxx:279
 TNetXNGFile.cxx:280
 TNetXNGFile.cxx:281
 TNetXNGFile.cxx:282
 TNetXNGFile.cxx:283
 TNetXNGFile.cxx:284
 TNetXNGFile.cxx:285
 TNetXNGFile.cxx:286
 TNetXNGFile.cxx:287
 TNetXNGFile.cxx:288
 TNetXNGFile.cxx:289
 TNetXNGFile.cxx:290
 TNetXNGFile.cxx:291
 TNetXNGFile.cxx:292
 TNetXNGFile.cxx:293
 TNetXNGFile.cxx:294
 TNetXNGFile.cxx:295
 TNetXNGFile.cxx:296
 TNetXNGFile.cxx:297
 TNetXNGFile.cxx:298
 TNetXNGFile.cxx:299
 TNetXNGFile.cxx:300
 TNetXNGFile.cxx:301
 TNetXNGFile.cxx:302
 TNetXNGFile.cxx:303
 TNetXNGFile.cxx:304
 TNetXNGFile.cxx:305
 TNetXNGFile.cxx:306
 TNetXNGFile.cxx:307
 TNetXNGFile.cxx:308
 TNetXNGFile.cxx:309
 TNetXNGFile.cxx:310
 TNetXNGFile.cxx:311
 TNetXNGFile.cxx:312
 TNetXNGFile.cxx:313
 TNetXNGFile.cxx:314
 TNetXNGFile.cxx:315
 TNetXNGFile.cxx:316
 TNetXNGFile.cxx:317
 TNetXNGFile.cxx:318
 TNetXNGFile.cxx:319
 TNetXNGFile.cxx:320
 TNetXNGFile.cxx:321
 TNetXNGFile.cxx:322
 TNetXNGFile.cxx:323
 TNetXNGFile.cxx:324
 TNetXNGFile.cxx:325
 TNetXNGFile.cxx:326
 TNetXNGFile.cxx:327
 TNetXNGFile.cxx:328
 TNetXNGFile.cxx:329
 TNetXNGFile.cxx:330
 TNetXNGFile.cxx:331
 TNetXNGFile.cxx:332
 TNetXNGFile.cxx:333
 TNetXNGFile.cxx:334
 TNetXNGFile.cxx:335
 TNetXNGFile.cxx:336
 TNetXNGFile.cxx:337
 TNetXNGFile.cxx:338
 TNetXNGFile.cxx:339
 TNetXNGFile.cxx:340
 TNetXNGFile.cxx:341
 TNetXNGFile.cxx:342
 TNetXNGFile.cxx:343
 TNetXNGFile.cxx:344
 TNetXNGFile.cxx:345
 TNetXNGFile.cxx:346
 TNetXNGFile.cxx:347
 TNetXNGFile.cxx:348
 TNetXNGFile.cxx:349
 TNetXNGFile.cxx:350
 TNetXNGFile.cxx:351
 TNetXNGFile.cxx:352
 TNetXNGFile.cxx:353
 TNetXNGFile.cxx:354
 TNetXNGFile.cxx:355
 TNetXNGFile.cxx:356
 TNetXNGFile.cxx:357
 TNetXNGFile.cxx:358
 TNetXNGFile.cxx:359
 TNetXNGFile.cxx:360
 TNetXNGFile.cxx:361
 TNetXNGFile.cxx:362
 TNetXNGFile.cxx:363
 TNetXNGFile.cxx:364
 TNetXNGFile.cxx:365
 TNetXNGFile.cxx:366
 TNetXNGFile.cxx:367
 TNetXNGFile.cxx:368
 TNetXNGFile.cxx:369
 TNetXNGFile.cxx:370
 TNetXNGFile.cxx:371
 TNetXNGFile.cxx:372
 TNetXNGFile.cxx:373
 TNetXNGFile.cxx:374
 TNetXNGFile.cxx:375
 TNetXNGFile.cxx:376
 TNetXNGFile.cxx:377
 TNetXNGFile.cxx:378
 TNetXNGFile.cxx:379
 TNetXNGFile.cxx:380
 TNetXNGFile.cxx:381
 TNetXNGFile.cxx:382
 TNetXNGFile.cxx:383
 TNetXNGFile.cxx:384
 TNetXNGFile.cxx:385
 TNetXNGFile.cxx:386
 TNetXNGFile.cxx:387
 TNetXNGFile.cxx:388
 TNetXNGFile.cxx:389
 TNetXNGFile.cxx:390
 TNetXNGFile.cxx:391
 TNetXNGFile.cxx:392
 TNetXNGFile.cxx:393
 TNetXNGFile.cxx:394
 TNetXNGFile.cxx:395
 TNetXNGFile.cxx:396
 TNetXNGFile.cxx:397
 TNetXNGFile.cxx:398
 TNetXNGFile.cxx:399
 TNetXNGFile.cxx:400
 TNetXNGFile.cxx:401
 TNetXNGFile.cxx:402
 TNetXNGFile.cxx:403
 TNetXNGFile.cxx:404
 TNetXNGFile.cxx:405
 TNetXNGFile.cxx:406
 TNetXNGFile.cxx:407
 TNetXNGFile.cxx:408
 TNetXNGFile.cxx:409
 TNetXNGFile.cxx:410
 TNetXNGFile.cxx:411
 TNetXNGFile.cxx:412
 TNetXNGFile.cxx:413
 TNetXNGFile.cxx:414
 TNetXNGFile.cxx:415
 TNetXNGFile.cxx:416
 TNetXNGFile.cxx:417
 TNetXNGFile.cxx:418
 TNetXNGFile.cxx:419
 TNetXNGFile.cxx:420
 TNetXNGFile.cxx:421
 TNetXNGFile.cxx:422
 TNetXNGFile.cxx:423
 TNetXNGFile.cxx:424
 TNetXNGFile.cxx:425
 TNetXNGFile.cxx:426
 TNetXNGFile.cxx:427
 TNetXNGFile.cxx:428
 TNetXNGFile.cxx:429
 TNetXNGFile.cxx:430
 TNetXNGFile.cxx:431
 TNetXNGFile.cxx:432
 TNetXNGFile.cxx:433
 TNetXNGFile.cxx:434
 TNetXNGFile.cxx:435
 TNetXNGFile.cxx:436
 TNetXNGFile.cxx:437
 TNetXNGFile.cxx:438
 TNetXNGFile.cxx:439
 TNetXNGFile.cxx:440
 TNetXNGFile.cxx:441
 TNetXNGFile.cxx:442
 TNetXNGFile.cxx:443
 TNetXNGFile.cxx:444
 TNetXNGFile.cxx:445
 TNetXNGFile.cxx:446
 TNetXNGFile.cxx:447
 TNetXNGFile.cxx:448
 TNetXNGFile.cxx:449
 TNetXNGFile.cxx:450
 TNetXNGFile.cxx:451
 TNetXNGFile.cxx:452
 TNetXNGFile.cxx:453
 TNetXNGFile.cxx:454
 TNetXNGFile.cxx:455
 TNetXNGFile.cxx:456
 TNetXNGFile.cxx:457
 TNetXNGFile.cxx:458
 TNetXNGFile.cxx:459
 TNetXNGFile.cxx:460
 TNetXNGFile.cxx:461
 TNetXNGFile.cxx:462
 TNetXNGFile.cxx:463
 TNetXNGFile.cxx:464
 TNetXNGFile.cxx:465
 TNetXNGFile.cxx:466
 TNetXNGFile.cxx:467
 TNetXNGFile.cxx:468
 TNetXNGFile.cxx:469
 TNetXNGFile.cxx:470
 TNetXNGFile.cxx:471
 TNetXNGFile.cxx:472
 TNetXNGFile.cxx:473
 TNetXNGFile.cxx:474
 TNetXNGFile.cxx:475
 TNetXNGFile.cxx:476
 TNetXNGFile.cxx:477
 TNetXNGFile.cxx:478
 TNetXNGFile.cxx:479
 TNetXNGFile.cxx:480
 TNetXNGFile.cxx:481
 TNetXNGFile.cxx:482
 TNetXNGFile.cxx:483
 TNetXNGFile.cxx:484
 TNetXNGFile.cxx:485
 TNetXNGFile.cxx:486
 TNetXNGFile.cxx:487
 TNetXNGFile.cxx:488
 TNetXNGFile.cxx:489
 TNetXNGFile.cxx:490
 TNetXNGFile.cxx:491
 TNetXNGFile.cxx:492
 TNetXNGFile.cxx:493
 TNetXNGFile.cxx:494
 TNetXNGFile.cxx:495
 TNetXNGFile.cxx:496
 TNetXNGFile.cxx:497
 TNetXNGFile.cxx:498
 TNetXNGFile.cxx:499
 TNetXNGFile.cxx:500
 TNetXNGFile.cxx:501
 TNetXNGFile.cxx:502
 TNetXNGFile.cxx:503
 TNetXNGFile.cxx:504
 TNetXNGFile.cxx:505
 TNetXNGFile.cxx:506
 TNetXNGFile.cxx:507
 TNetXNGFile.cxx:508
 TNetXNGFile.cxx:509
 TNetXNGFile.cxx:510
 TNetXNGFile.cxx:511
 TNetXNGFile.cxx:512
 TNetXNGFile.cxx:513
 TNetXNGFile.cxx:514
 TNetXNGFile.cxx:515
 TNetXNGFile.cxx:516
 TNetXNGFile.cxx:517
 TNetXNGFile.cxx:518
 TNetXNGFile.cxx:519
 TNetXNGFile.cxx:520
 TNetXNGFile.cxx:521
 TNetXNGFile.cxx:522
 TNetXNGFile.cxx:523
 TNetXNGFile.cxx:524
 TNetXNGFile.cxx:525
 TNetXNGFile.cxx:526
 TNetXNGFile.cxx:527
 TNetXNGFile.cxx:528
 TNetXNGFile.cxx:529
 TNetXNGFile.cxx:530
 TNetXNGFile.cxx:531
 TNetXNGFile.cxx:532
 TNetXNGFile.cxx:533
 TNetXNGFile.cxx:534
 TNetXNGFile.cxx:535
 TNetXNGFile.cxx:536
 TNetXNGFile.cxx:537
 TNetXNGFile.cxx:538
 TNetXNGFile.cxx:539
 TNetXNGFile.cxx:540
 TNetXNGFile.cxx:541
 TNetXNGFile.cxx:542
 TNetXNGFile.cxx:543
 TNetXNGFile.cxx:544
 TNetXNGFile.cxx:545
 TNetXNGFile.cxx:546
 TNetXNGFile.cxx:547
 TNetXNGFile.cxx:548
 TNetXNGFile.cxx:549
 TNetXNGFile.cxx:550
 TNetXNGFile.cxx:551
 TNetXNGFile.cxx:552
 TNetXNGFile.cxx:553
 TNetXNGFile.cxx:554
 TNetXNGFile.cxx:555
 TNetXNGFile.cxx:556
 TNetXNGFile.cxx:557
 TNetXNGFile.cxx:558
 TNetXNGFile.cxx:559
 TNetXNGFile.cxx:560
 TNetXNGFile.cxx:561
 TNetXNGFile.cxx:562
 TNetXNGFile.cxx:563
 TNetXNGFile.cxx:564
 TNetXNGFile.cxx:565
 TNetXNGFile.cxx:566
 TNetXNGFile.cxx:567
 TNetXNGFile.cxx:568
 TNetXNGFile.cxx:569
 TNetXNGFile.cxx:570
 TNetXNGFile.cxx:571
 TNetXNGFile.cxx:572
 TNetXNGFile.cxx:573
 TNetXNGFile.cxx:574
 TNetXNGFile.cxx:575
 TNetXNGFile.cxx:576
 TNetXNGFile.cxx:577
 TNetXNGFile.cxx:578
 TNetXNGFile.cxx:579
 TNetXNGFile.cxx:580
 TNetXNGFile.cxx:581
 TNetXNGFile.cxx:582
 TNetXNGFile.cxx:583
 TNetXNGFile.cxx:584
 TNetXNGFile.cxx:585
 TNetXNGFile.cxx:586
 TNetXNGFile.cxx:587
 TNetXNGFile.cxx:588
 TNetXNGFile.cxx:589
 TNetXNGFile.cxx:590
 TNetXNGFile.cxx:591
 TNetXNGFile.cxx:592
 TNetXNGFile.cxx:593
 TNetXNGFile.cxx:594
 TNetXNGFile.cxx:595
 TNetXNGFile.cxx:596
 TNetXNGFile.cxx:597
 TNetXNGFile.cxx:598
 TNetXNGFile.cxx:599
 TNetXNGFile.cxx:600
 TNetXNGFile.cxx:601
 TNetXNGFile.cxx:602
 TNetXNGFile.cxx:603
 TNetXNGFile.cxx:604
 TNetXNGFile.cxx:605
 TNetXNGFile.cxx:606
 TNetXNGFile.cxx:607
 TNetXNGFile.cxx:608
 TNetXNGFile.cxx:609
 TNetXNGFile.cxx:610
 TNetXNGFile.cxx:611
 TNetXNGFile.cxx:612
 TNetXNGFile.cxx:613
 TNetXNGFile.cxx:614
 TNetXNGFile.cxx:615
 TNetXNGFile.cxx:616
 TNetXNGFile.cxx:617
 TNetXNGFile.cxx:618
 TNetXNGFile.cxx:619
 TNetXNGFile.cxx:620
 TNetXNGFile.cxx:621
 TNetXNGFile.cxx:622
 TNetXNGFile.cxx:623
 TNetXNGFile.cxx:624
 TNetXNGFile.cxx:625
 TNetXNGFile.cxx:626
 TNetXNGFile.cxx:627
 TNetXNGFile.cxx:628
 TNetXNGFile.cxx:629
 TNetXNGFile.cxx:630
 TNetXNGFile.cxx:631
 TNetXNGFile.cxx:632
 TNetXNGFile.cxx:633
 TNetXNGFile.cxx:634
 TNetXNGFile.cxx:635
 TNetXNGFile.cxx:636
 TNetXNGFile.cxx:637
 TNetXNGFile.cxx:638
 TNetXNGFile.cxx:639
 TNetXNGFile.cxx:640
 TNetXNGFile.cxx:641
 TNetXNGFile.cxx:642
 TNetXNGFile.cxx:643
 TNetXNGFile.cxx:644
 TNetXNGFile.cxx:645
 TNetXNGFile.cxx:646
 TNetXNGFile.cxx:647
 TNetXNGFile.cxx:648
 TNetXNGFile.cxx:649
 TNetXNGFile.cxx:650
 TNetXNGFile.cxx:651
 TNetXNGFile.cxx:652
 TNetXNGFile.cxx:653
 TNetXNGFile.cxx:654
 TNetXNGFile.cxx:655
 TNetXNGFile.cxx:656
 TNetXNGFile.cxx:657
 TNetXNGFile.cxx:658
 TNetXNGFile.cxx:659
 TNetXNGFile.cxx:660
 TNetXNGFile.cxx:661
 TNetXNGFile.cxx:662
 TNetXNGFile.cxx:663
 TNetXNGFile.cxx:664
 TNetXNGFile.cxx:665
 TNetXNGFile.cxx:666
 TNetXNGFile.cxx:667
 TNetXNGFile.cxx:668
 TNetXNGFile.cxx:669
 TNetXNGFile.cxx:670
 TNetXNGFile.cxx:671
 TNetXNGFile.cxx:672
 TNetXNGFile.cxx:673
 TNetXNGFile.cxx:674
 TNetXNGFile.cxx:675
 TNetXNGFile.cxx:676
 TNetXNGFile.cxx:677
 TNetXNGFile.cxx:678
 TNetXNGFile.cxx:679
 TNetXNGFile.cxx:680
 TNetXNGFile.cxx:681
 TNetXNGFile.cxx:682
 TNetXNGFile.cxx:683
 TNetXNGFile.cxx:684
 TNetXNGFile.cxx:685
 TNetXNGFile.cxx:686
 TNetXNGFile.cxx:687
 TNetXNGFile.cxx:688
 TNetXNGFile.cxx:689
 TNetXNGFile.cxx:690
 TNetXNGFile.cxx:691
 TNetXNGFile.cxx:692
 TNetXNGFile.cxx:693
 TNetXNGFile.cxx:694
 TNetXNGFile.cxx:695
 TNetXNGFile.cxx:696
 TNetXNGFile.cxx:697
 TNetXNGFile.cxx:698
 TNetXNGFile.cxx:699
 TNetXNGFile.cxx:700
 TNetXNGFile.cxx:701
 TNetXNGFile.cxx:702
 TNetXNGFile.cxx:703
 TNetXNGFile.cxx:704
 TNetXNGFile.cxx:705
 TNetXNGFile.cxx:706
 TNetXNGFile.cxx:707
 TNetXNGFile.cxx:708
 TNetXNGFile.cxx:709
 TNetXNGFile.cxx:710
 TNetXNGFile.cxx:711
 TNetXNGFile.cxx:712
 TNetXNGFile.cxx:713
 TNetXNGFile.cxx:714
 TNetXNGFile.cxx:715
 TNetXNGFile.cxx:716
 TNetXNGFile.cxx:717
 TNetXNGFile.cxx:718
 TNetXNGFile.cxx:719
 TNetXNGFile.cxx:720
 TNetXNGFile.cxx:721
 TNetXNGFile.cxx:722
 TNetXNGFile.cxx:723
 TNetXNGFile.cxx:724
 TNetXNGFile.cxx:725
 TNetXNGFile.cxx:726
 TNetXNGFile.cxx:727
 TNetXNGFile.cxx:728
 TNetXNGFile.cxx:729
 TNetXNGFile.cxx:730
 TNetXNGFile.cxx:731
 TNetXNGFile.cxx:732
 TNetXNGFile.cxx:733
 TNetXNGFile.cxx:734
 TNetXNGFile.cxx:735
 TNetXNGFile.cxx:736
 TNetXNGFile.cxx:737
 TNetXNGFile.cxx:738
 TNetXNGFile.cxx:739
 TNetXNGFile.cxx:740
 TNetXNGFile.cxx:741
 TNetXNGFile.cxx:742
 TNetXNGFile.cxx:743
 TNetXNGFile.cxx:744
 TNetXNGFile.cxx:745
 TNetXNGFile.cxx:746
 TNetXNGFile.cxx:747
 TNetXNGFile.cxx:748
 TNetXNGFile.cxx:749
 TNetXNGFile.cxx:750
 TNetXNGFile.cxx:751
 TNetXNGFile.cxx:752
 TNetXNGFile.cxx:753
 TNetXNGFile.cxx:754
 TNetXNGFile.cxx:755
 TNetXNGFile.cxx:756
 TNetXNGFile.cxx:757
 TNetXNGFile.cxx:758
 TNetXNGFile.cxx:759
 TNetXNGFile.cxx:760
 TNetXNGFile.cxx:761
 TNetXNGFile.cxx:762
 TNetXNGFile.cxx:763
 TNetXNGFile.cxx:764
 TNetXNGFile.cxx:765
 TNetXNGFile.cxx:766
 TNetXNGFile.cxx:767
 TNetXNGFile.cxx:768
 TNetXNGFile.cxx:769
 TNetXNGFile.cxx:770
 TNetXNGFile.cxx:771
 TNetXNGFile.cxx:772
 TNetXNGFile.cxx:773
 TNetXNGFile.cxx:774
 TNetXNGFile.cxx:775
 TNetXNGFile.cxx:776
 TNetXNGFile.cxx:777
 TNetXNGFile.cxx:778
 TNetXNGFile.cxx:779
 TNetXNGFile.cxx:780
 TNetXNGFile.cxx:781
 TNetXNGFile.cxx:782
 TNetXNGFile.cxx:783
 TNetXNGFile.cxx:784
 TNetXNGFile.cxx:785
 TNetXNGFile.cxx:786
 TNetXNGFile.cxx:787
 TNetXNGFile.cxx:788
 TNetXNGFile.cxx:789
 TNetXNGFile.cxx:790
 TNetXNGFile.cxx:791
 TNetXNGFile.cxx:792
 TNetXNGFile.cxx:793
 TNetXNGFile.cxx:794
 TNetXNGFile.cxx:795
 TNetXNGFile.cxx:796
 TNetXNGFile.cxx:797
 TNetXNGFile.cxx:798
 TNetXNGFile.cxx:799
 TNetXNGFile.cxx:800
 TNetXNGFile.cxx:801
 TNetXNGFile.cxx:802
 TNetXNGFile.cxx:803
 TNetXNGFile.cxx:804
 TNetXNGFile.cxx:805
 TNetXNGFile.cxx:806
 TNetXNGFile.cxx:807
 TNetXNGFile.cxx:808
 TNetXNGFile.cxx:809
 TNetXNGFile.cxx:810
 TNetXNGFile.cxx:811
 TNetXNGFile.cxx:812
 TNetXNGFile.cxx:813
 TNetXNGFile.cxx:814
 TNetXNGFile.cxx:815
 TNetXNGFile.cxx:816
 TNetXNGFile.cxx:817
 TNetXNGFile.cxx:818
 TNetXNGFile.cxx:819
 TNetXNGFile.cxx:820
 TNetXNGFile.cxx:821
 TNetXNGFile.cxx:822
 TNetXNGFile.cxx:823
 TNetXNGFile.cxx:824
 TNetXNGFile.cxx:825
 TNetXNGFile.cxx:826
 TNetXNGFile.cxx:827
 TNetXNGFile.cxx:828
 TNetXNGFile.cxx:829
 TNetXNGFile.cxx:830
 TNetXNGFile.cxx:831
 TNetXNGFile.cxx:832
 TNetXNGFile.cxx:833
 TNetXNGFile.cxx:834
 TNetXNGFile.cxx:835
 TNetXNGFile.cxx:836
 TNetXNGFile.cxx:837
 TNetXNGFile.cxx:838
 TNetXNGFile.cxx:839
 TNetXNGFile.cxx:840
 TNetXNGFile.cxx:841
 TNetXNGFile.cxx:842
 TNetXNGFile.cxx:843
 TNetXNGFile.cxx:844
 TNetXNGFile.cxx:845
 TNetXNGFile.cxx:846
 TNetXNGFile.cxx:847
 TNetXNGFile.cxx:848
 TNetXNGFile.cxx:849
 TNetXNGFile.cxx:850
 TNetXNGFile.cxx:851
 TNetXNGFile.cxx:852
 TNetXNGFile.cxx:853
 TNetXNGFile.cxx:854
 TNetXNGFile.cxx:855
 TNetXNGFile.cxx:856
 TNetXNGFile.cxx:857
 TNetXNGFile.cxx:858
 TNetXNGFile.cxx:859
 TNetXNGFile.cxx:860
 TNetXNGFile.cxx:861
 TNetXNGFile.cxx:862
 TNetXNGFile.cxx:863
 TNetXNGFile.cxx:864
 TNetXNGFile.cxx:865
 TNetXNGFile.cxx:866
 TNetXNGFile.cxx:867
 TNetXNGFile.cxx:868
 TNetXNGFile.cxx:869
 TNetXNGFile.cxx:870
 TNetXNGFile.cxx:871
 TNetXNGFile.cxx:872
 TNetXNGFile.cxx:873
 TNetXNGFile.cxx:874
 TNetXNGFile.cxx:875
 TNetXNGFile.cxx:876
 TNetXNGFile.cxx:877
 TNetXNGFile.cxx:878
 TNetXNGFile.cxx:879
 TNetXNGFile.cxx:880
 TNetXNGFile.cxx:881
 TNetXNGFile.cxx:882
 TNetXNGFile.cxx:883
 TNetXNGFile.cxx:884
 TNetXNGFile.cxx:885
 TNetXNGFile.cxx:886
 TNetXNGFile.cxx:887
 TNetXNGFile.cxx:888
 TNetXNGFile.cxx:889
 TNetXNGFile.cxx:890
 TNetXNGFile.cxx:891
 TNetXNGFile.cxx:892
 TNetXNGFile.cxx:893
 TNetXNGFile.cxx:894
 TNetXNGFile.cxx:895
 TNetXNGFile.cxx:896
 TNetXNGFile.cxx:897
 TNetXNGFile.cxx:898
 TNetXNGFile.cxx:899
 TNetXNGFile.cxx:900
 TNetXNGFile.cxx:901
 TNetXNGFile.cxx:902
 TNetXNGFile.cxx:903
 TNetXNGFile.cxx:904
 TNetXNGFile.cxx:905
 TNetXNGFile.cxx:906
 TNetXNGFile.cxx:907
 TNetXNGFile.cxx:908
 TNetXNGFile.cxx:909
 TNetXNGFile.cxx:910