// @(#)root/base:$Id: 65b4f3646f4e5b2fa77218ba786b7fe4e16e27be $
// Author: Rene Brun   28/11/94

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/
#include <stdlib.h>

#include "Riostream.h"
#include "Strlen.h"
#include "TDirectory.h"
#include "TClassTable.h"
#include "TInterpreter.h"
#include "THashList.h"
#include "TBrowser.h"
#include "TROOT.h"
#include "TError.h"
#include "TClass.h"
#include "TRegexp.h"
#include "TSystem.h"
#include "TVirtualMutex.h"
#include "TThreadSlots.h"
#include "TMethod.h"

Bool_t TDirectory::fgAddDirectory = kTRUE;

const Int_t  kMaxLen = 2048;

//______________________________________________________________________________
//Begin_Html
/*
<img src="gif/tdirectory_classtree.gif">
*/
//End_Html

ClassImp(TDirectory)

//______________________________________________________________________________
//

//______________________________________________________________________________
   TDirectory::TDirectory() : TNamed(), fMother(0),fList(0),fContext(0)
{
//*-*-*-*-*-*-*-*-*-*-*-*Directory default constructor-*-*-*-*-*-*-*-*-*-*-*-*
//*-*                    =============================
}

//______________________________________________________________________________
TDirectory::TDirectory(const char *name, const char *title, Option_t * /*classname*/, TDirectory* initMotherDir)
   : TNamed(name, title), fMother(0), fList(0),fContext(0)
{
//*-*-*-*-*-*-*-*-*-*-*-* Create a new Directory *-*-*-*-*-*-*-*-*-*-*-*-*-*
//*-*                     ======================
//  A new directory with name,title is created in the current directory
//  The directory header information is immediately saved in the file
//  A new key is added in the parent directory
//
//  When this constructor is called from a class directly derived
//  from TDirectory, the third argument classname MUST be specified.
//  In this case, classname must be the name of the derived class.
//
//  Note that the directory name cannot contain slashes.
//
   if (initMotherDir==0) initMotherDir = gDirectory;

   if (strchr(name,'/')) {
      ::Error("TDirectory::TDirectory","directory name (%s) cannot contain a slash", name);
      gDirectory = 0;
      return;
   }
   if (strlen(GetName()) == 0) {
      ::Error("TDirectory::TDirectory","directory name cannot be \"\"");
      gDirectory = 0;
      return;
   }

   Build(initMotherDir ? initMotherDir->GetFile() : 0, initMotherDir);

   R__LOCKGUARD2(gROOTMutex);
}

//______________________________________________________________________________
TDirectory::TDirectory(const TDirectory &directory) : TNamed(directory)
{
   // Copy constructor.
   directory.Copy(*this);
}

//______________________________________________________________________________
TDirectory::~TDirectory()
{
   // -- Destructor.

   if (!gROOT) {
      delete fList;
      return; //when called by TROOT destructor
   }

   if (fList) {
      fList->Delete("slow");
      SafeDelete(fList);
   }

   CleanTargets();

   TDirectory* mom = GetMotherDir();

   if (mom) {
      mom->Remove(this);
   }

   if (gDebug) {
      Info("~TDirectory", "dtor called for %s", GetName());
   }
}

//______________________________________________________________________________
void TDirectory::AddDirectory(Bool_t add)
{
// Sets the flag controlling the automatic add objects like histograms, TGraph2D, etc
// in memory
//
// By default (fAddDirectory = kTRUE), these objects are automatically added
// to the list of objects in memory.
// Note that in the classes like TH1, TGraph2D supporting this facility,
// one object can be removed from its support directory
// by calling object->SetDirectory(0) or object->SetDirectory(dir) to add it
// to the list of objects in the directory dir.
//
//  NOTE that this is a static function. To call it, use;
//     TDirectory::AddDirectory

   fgAddDirectory = add;
}

//______________________________________________________________________________
Bool_t TDirectory::AddDirectoryStatus()
{
   //static function: see TDirectory::AddDirectory for more comments
   return fgAddDirectory;
}

//______________________________________________________________________________
void TDirectory::Append(TObject *obj, Bool_t replace /* = kFALSE */)
{
   // Append object to this directory.
   //
   // If replace is true:
   //   remove any existing objects with the same same (if the name is not ""

   if (obj == 0 || fList == 0) return;

   if (replace && obj->GetName() && obj->GetName()[0]) {
      TObject *old;
      while (0!=(old = GetList()->FindObject(obj->GetName()))) {
         Warning("Append","Replacing existing %s: %s (Potential memory leak).",
                 obj->IsA()->GetName(),obj->GetName());
         ROOT::DirAutoAdd_t func = old->IsA()->GetDirectoryAutoAdd();
         if (func) {
            func(old,0);
         } else {
            Remove(old);
         }
      }
   }

   fList->Add(obj);
   obj->SetBit(kMustCleanup);
}

//______________________________________________________________________________
void TDirectory::Browse(TBrowser *b)
{
   // Browse the content of the directory.

   if (b) {
      TObject *obj = 0;
      TIter nextin(fList);

      cd();

      //Add objects that are only in memory
      while ((obj = nextin())) {
         b->Add(obj, obj->GetName());
      }
   }
}

//______________________________________________________________________________
void TDirectory::Build(TFile* /*motherFile*/, TDirectory* motherDir)
{
//*-*-*-*-*-*-*-*-*-*-*-*Initialise directory to defaults*-*-*-*-*-*-*-*-*-*
//*-*                    ================================

   // If directory is created via default ctor (when dir is read from file)
   // don't add it here to the directory since its name is not yet known.
   // It will be added to the directory in TKey::ReadObj().

   if (motherDir && strlen(GetName()) != 0) motherDir->Append(this);

   fList       = new THashList(100,50);
   fMother     = motherDir;
   SetBit(kCanDelete);
}

//______________________________________________________________________________
void TDirectory::CleanTargets()
{
   // Clean the pointers to this object (gDirectory, TContext, etc.)

   while (fContext) {
      fContext->fDirectory = 0;
      fContext = fContext->fNext;
   }

   if (gDirectory == this) {
      TDirectory *cursav = GetMotherDir();
      if (cursav && cursav != this) {
         cursav->cd();
      } else {
         if (this == gROOT) {
            gDirectory = 0;
         } else {
            gROOT->cd();
         }
      }
   }
}

//______________________________________________________________________________
static TBuffer* R__CreateBuffer()
{
   // Fast execution of 'new TBufferFile(TBuffer::kWrite,10000), without having
   // a compile time circular dependency ... alternatively we could (should?)
   // introduce yet another abstract interface.

   typedef void (*tcling_callfunc_Wrapper_t)(void*, int, void**, void*);
   static tcling_callfunc_Wrapper_t creator = 0;
   if (creator == 0) {
      R__LOCKGUARD2(gROOTMutex);
      TClass *c = TClass::GetClass("TBufferFile");
      TMethod *m = c->GetMethodWithPrototype("TBufferFile","TBuffer::EMode,Int_t",kFALSE,ROOT::kExactMatch);
      creator = (tcling_callfunc_Wrapper_t)( m->InterfaceMethod() );
   }
   TBuffer::EMode mode = TBuffer::kWrite;
   Int_t size = 10000;
   void *args[] = { &mode, &size };
   TBuffer *result;
   creator(0,2,args,&result);
   return result;
}

//______________________________________________________________________________
TObject *TDirectory::CloneObject(const TObject *obj, Bool_t autoadd /* = kTRUE */)
{
   // Clone an object.
   // This function is called when the directory is not a TDirectoryFile.
   // This version has to load the I/O package, hence via CINT
   //
   // If autoadd is true and if the object class has a
   // DirectoryAutoAdd function, it will be called at the end of the
   // function with the parameter gDirector.  This usually means that
   // the object will be appended to the current ROOT directory.

   // if no default ctor return immediately (error issued by New())
   char *pobj = (char*)obj->IsA()->New();
   if (!pobj) {
     Fatal("CloneObject","Failed to create new object");
     return 0;
   }

   Int_t baseOffset = obj->IsA()->GetBaseClassOffset(TObject::Class());
   if (baseOffset==-1) {
      // cl does not inherit from TObject.
      // Since this is not supported in this function, the only reason we could reach this code
      // is because something is screwed up in the ROOT code.
      Fatal("CloneObject","Incorrect detection of the inheritance from TObject for class %s.\n",
            obj->IsA()->GetName());
   }
   TObject *newobj = (TObject*)(pobj+baseOffset);

   //create a buffer where the object will be streamed
   //We are forced to go via the I/O package (ie TBufferFile).
   //Invoking TBufferFile via CINT will automatically load the I/O library
   TBuffer *buffer = R__CreateBuffer();
   if (!buffer) {
      Fatal("CloneObject","Not able to create a TBuffer!");
      return 0;
   }
   buffer->MapObject(obj);  //register obj in map to handle self reference
   const_cast<TObject*>(obj)->Streamer(*buffer);

   // read new object from buffer
   buffer->SetReadMode();
   buffer->ResetMap();
   buffer->SetBufferOffset(0);
   buffer->MapObject(newobj);  //register obj in map to handle self reference
   newobj->Streamer(*buffer);
   newobj->ResetBit(kIsReferenced);
   newobj->ResetBit(kCanDelete);

   delete buffer;
   if (autoadd) {
      ROOT::DirAutoAdd_t func = obj->IsA()->GetDirectoryAutoAdd();
      if (func) {
         func(newobj,this);
      }
   }
   return newobj;
}

//______________________________________________________________________________
TDirectory *&TDirectory::CurrentDirectory()
{
   // Return the current directory for the current thread.

   static TDirectory *currentDirectory = 0;
   if (!gThreadTsd)
      return currentDirectory;
   else
      return *(TDirectory**)(*gThreadTsd)(&currentDirectory,ROOT::kDirectoryThreadSlot);
}

//______________________________________________________________________________
TDirectory *TDirectory::GetDirectory(const char *apath,
                                     Bool_t printError, const char *funcname)
{
   // Find a directory using apath.
   // It apath is null or empty, returns "this" directory.
   // Otherwie use apath to find a directory.
   // The absolute path syntax is:
   //    file.root:/dir1/dir2
   // where file.root is the file and /dir1/dir2 the desired subdirectory
   // in the file. Relative syntax is relative to "this" directory. E.g:
   // ../aa.
   // Returns 0 in case path does not exist.
   // If printError is true, use Error with 'funcname' to issue an error message.

   Int_t nch = 0;
   if (apath) nch = strlen(apath);
   if (!nch) {
      return this;
   }

   if (funcname==0 || strlen(funcname)==0) funcname = "GetDirectory";

   TDirectory *result = this;

   char *path = new char[nch+1]; path[0] = 0;
   if (nch) strlcpy(path,apath,nch+1);
   char *s = (char*)strrchr(path, ':');
   if (s) {
      *s = '\0';
      R__LOCKGUARD2(gROOTMutex);
      TDirectory *f = (TDirectory *)gROOT->GetListOfFiles()->FindObject(path);
      if (!f && !strcmp(gROOT->GetName(), path)) f = gROOT;
      if (s) *s = ':';
      if (f) {
         result = f;
         if (s && *(s+1)) result = f->GetDirectory(s+1,printError,funcname);
         delete [] path; return result;
      } else {
         if (printError) Error(funcname, "No such file %s", path);
         delete [] path; return 0;
      }
   }

   // path starts with a slash (assumes current file)
   if (path[0] == '/') {
      TDirectory *td = gROOT;
      result = td->GetDirectory(path+1,printError,funcname);
      delete [] path; return result;
   }

   TObject *obj;
   char *slash = (char*)strchr(path,'/');
   if (!slash) {                     // we are at the lowest level
      if (!strcmp(path, "..")) {
         result = GetMotherDir();
         delete [] path; return result;
      }
      obj = Get(path);
      if (!obj) {
         if (printError) Error(funcname,"Unknown directory %s", path);
         delete [] path; return 0;
      }

      //Check return object is a directory
      if (!obj->InheritsFrom(TDirectory::Class())) {
         if (printError) Error(funcname,"Object %s is not a directory", path);
         delete [] path; return 0;
      }
      delete [] path; return (TDirectory*)obj;
   }

   TString subdir(path);
   slash = (char*)strchr(subdir.Data(),'/');
   *slash = 0;
   //Get object with path from current directory/file
   if (!strcmp(subdir, "..")) {
      TDirectory* mom = GetMotherDir();
      if (mom)
         result = mom->GetDirectory(slash+1,printError,funcname);
      delete [] path; return result;
   }
   obj = Get(subdir);
   if (!obj) {
      if (printError) Error(funcname,"Unknown directory %s", subdir.Data());
      delete [] path; return 0;
   }

   //Check return object is a directory
   if (!obj->InheritsFrom(TDirectory::Class())) {
      if (printError) Error(funcname,"Object %s is not a directory", subdir.Data());
      delete [] path; return 0;
   }
   result = ((TDirectory*)obj)->GetDirectory(slash+1,printError,funcname);
   delete [] path; return result;
}

//______________________________________________________________________________
Bool_t TDirectory::cd(const char *path)
{
   // Change current directory to "this" directory . Using path one can
   // change the current directory to "path". The absolute path syntax is:
   // file.root:/dir1/dir2
   // where file.root is the file and /dir1/dir2 the desired subdirectory
   // in the file. Relative syntax is relative to "this" directory. E.g:
   // ../aa. Returns kTRUE in case of success.

   return cd1(path);
}

//______________________________________________________________________________
Bool_t TDirectory::cd1(const char *apath)
{
   // Change current directory to "this" directory . Using path one can
   // change the current directory to "path". The absolute path syntax is:
   // file.root:/dir1/dir2
   // where file.root is the file and /dir1/dir2 the desired subdirectory
   // in the file. Relative syntax is relative to "this" directory. E.g:
   // ../aa. Returns kFALSE in case path does not exist.

   Int_t nch = 0;
   if (apath) nch = strlen(apath);
   if (!nch) {
      gDirectory = this;
      return kTRUE;
   }

   TDirectory *where = GetDirectory(apath,kTRUE,"cd");
   if (where) {
      where->cd();
      return kTRUE;
   }
   return kFALSE;
}

//______________________________________________________________________________
Bool_t TDirectory::Cd(const char *path)
{
   // Change current directory to "path". The absolute path syntax is:
   // file.root:/dir1/dir2
   // where file.root is the file and /dir1/dir2 the desired subdirectory
   // in the file. Relative syntax is relative to the current directory
   // gDirectory, e.g.: ../aa. Returns kTRUE in case of success.

   return Cd1(path);
}

//______________________________________________________________________________
Bool_t TDirectory::Cd1(const char *apath)
{
   // Change current directory to "path". The path syntax is:
   // file.root:/dir1/dir2
   // where file.root is the file and /dir1/dir2 the desired subdirectory
   // in the file. Returns kFALSE in case path does not exist.

   // null path is always true (i.e. stay in the current directory)
   Int_t nch = 0;
   if (apath) nch = strlen(apath);
   if (!nch) return kTRUE;

   TDirectory *where = gDirectory->GetDirectory(apath,kTRUE,"Cd");
   if (where) {
      where->cd();
      return kTRUE;
   }
   return kFALSE;
}

//______________________________________________________________________________
void TDirectory::Clear(Option_t *)
{
//*-*-*-*Delete all objects from a Directory list-*-*-*-*-*
//*-*    =======================================

   if (fList) fList->Clear();

}

//______________________________________________________________________________
void TDirectory::Close(Option_t *)
{
   // -- Delete all objects from memory and directory structure itself.

   if (!fList) {
      return;
   }

   // Save the directory key list and header
   Save();

   Bool_t fast = kTRUE;
   TObjLink *lnk = fList->FirstLink();
   while (lnk) {
      if (lnk->GetObject()->IsA() == TDirectory::Class()) {fast = kFALSE;break;}
      lnk = lnk->Next();
   }
   // Delete objects from directory list, this in turn, recursively closes all
   // sub-directories (that were allocated on the heap)
   // if this dir contains subdirs, we must use the slow option for Delete!
   // we must avoid "slow" as much as possible, in particular Delete("slow")
   // with a large number of objects (eg >10^5) would take for ever.
   {
      R__LOCKGUARD2(gROOTMutex);
      if (fast) fList->Delete();
      else      fList->Delete("slow");
   }

   CleanTargets();
}

//______________________________________________________________________________
void TDirectory::DeleteAll(Option_t *)
{
   // -- Delete all objects from memory.

   fList->Delete("slow");
}

//______________________________________________________________________________
void TDirectory::Delete(const char *namecycle)
{
//*-*-*-*-*-*-*-* Delete Objects or/and keys in a directory *-*-*-*-*-*-*-*
//*-*             =========================================
//   namecycle has the format name;cycle
//   namecycle = "" same as namecycle ="T*"
//   name  = * means all
//   cycle = * means all cycles (memory and keys)
//   cycle = "" or cycle = 9999 ==> apply to a memory object
//   When name=* use T* to delete subdirectories also
//
//   To delete one directory, you must specify the directory cycle,
//      eg.  file.Delete("dir1;1");
//
//   examples:
//     foo   : delete object named foo in memory
//     foo*  : delete all objects with a name starting with foo
//     foo;1 : delete cycle 1 of foo on file
//     foo;* : delete all cycles of foo on file and also from memory
//     *;2   : delete all objects on file having the cycle 2
//     *;*   : delete all objects from memory and file
//    T*;*   : delete all objects from memory and file and all subdirectories
//

   if (gDebug)
     Info("Delete","Call for this = %s namecycle = %s",
               GetName(), (namecycle ? namecycle : "null"));

   TDirectory::TContext ctxt(this);
   Short_t  cycle;
   char     name[kMaxLen];
   DecodeNameCycle(namecycle, name, cycle, kMaxLen);

   Int_t deleteall    = 0;
   Int_t deletetree   = 0;
   if(strcmp(name,"*") == 0)   deleteall = 1;
   if(strcmp(name,"*T") == 0){ deleteall = 1; deletetree = 1;}
   if(strcmp(name,"T*") == 0){ deleteall = 1; deletetree = 1;}
   if(namecycle==0 || !namecycle[0]){ deleteall = 1; deletetree = 1;}
   TRegexp re(name,kTRUE);
   TString s;
   Int_t deleteOK = 0;

//*-*---------------------Case of Object in memory---------------------
//                        ========================
   if (cycle >= 9999 ) {
      TNamed *idcur;
      TIter   next(fList);
      while ((idcur = (TNamed *) next())) {
         deleteOK = 0;
         s = idcur->GetName();
         if (deleteall || s.Index(re) != kNPOS) {
            deleteOK = 1;
            if (idcur->IsA() == TDirectory::Class()) {
               deleteOK = 2;
               if (!deletetree && deleteall) deleteOK = 0;
            }
         }
         if (deleteOK != 0) {
            fList->Remove(idcur);
            if (deleteOK==2) {
               // read subdirectories to correctly delete them
               if (deletetree)
                  ((TDirectory*) idcur)->ReadAll("dirs");
               idcur->Delete(deletetree ? "T*;*" : "*");
               delete idcur;
            } else
               idcur->Delete(name);
         }
      }
   }
}

//______________________________________________________________________________
void TDirectory::Draw(Option_t *option)
{
//*-*-*-*-*-*-*-*-*-*-*-*Fill Graphics Structure and Paint*-*-*-*-*-*-*-*-*-*
//*-*                    =================================
// Loop on all objects (memory or file) and all subdirectories
//

   fList->R__FOR_EACH(TObject,Draw)(option);
}

//______________________________________________________________________________
TObject *TDirectory::FindObject(const TObject *obj) const
{
   // Find object in the list of memory objects.

   return fList->FindObject(obj);
}

//______________________________________________________________________________
TObject *TDirectory::FindObject(const char *name) const
{
   // Find object by name in the list of memory objects.

   return fList->FindObject(name);
}

//______________________________________________________________________________
TObject *TDirectory::FindObjectAny(const char *aname) const
{
   // Find object by name in the list of memory objects of the current
   // directory or its sub-directories.
   // After this call the current directory is not changed.
   // To automatically set the current directory where the object is found,
   // use FindKeyAny(aname)->ReadObj().

   //object may be already in the list of objects in memory
   TObject *obj =  fList->FindObject(aname);
   if (obj) return obj;

   //try with subdirectories
   TIter next(fList);
   while( (obj = next()) ) {
      if (obj->IsA()->InheritsFrom(TDirectory::Class())) {
         TDirectory* subdir = static_cast<TDirectory*>(obj);
         TObject *subobj = subdir->TDirectory::FindObjectAny(aname); // Explicitly recurse into _this_ exact function.
         if (subobj) {
            return subobj;
         }
      }
   }
   return 0;
}

//______________________________________________________________________________
TObject *TDirectory::Get(const char *namecycle)
{
//  return pointer to object identified by namecycle
//
//   namecycle has the format name;cycle
//   name  = * is illegal, cycle = * is illegal
//   cycle = "" or cycle = 9999 ==> apply to a memory object
//
//   examples:
//     foo   : get object named foo in memory
//             if object is not in memory, try with highest cycle from file
//     foo;1 : get cycle 1 of foo on file
//
//  The retrieved object should in principle derive from TObject.
//  If not, the function TDirectory::GetObject should be called.
//  However, this function will still work for a non-TObject, providing that
//  the calling application cast the return type to the correct type (which
//  is the actual type of the object).
//
//  NOTE:
//  The method GetObject offer better protection and avoid the need
//  for any cast:
//      MyClass *obj;
//      directory->GetObject("some object",obj);
//      if (obj) { ... the object exist and inherits from MyClass ... }
//
//  VERY IMPORTANT NOTE:
//  In case the class of this object derives from TObject but not
//  as a first inheritance, one must use dynamic_cast<>().
//  Example 1: Normal case:
//      class MyClass : public TObject, public AnotherClass
//   then on return, one can do:
//      MyClass *obj = (MyClass*)directory->Get("some object of MyClass");
//
//  Example 2: Special case:
//      class MyClass : public AnotherClass, public TObject
//  then on return, one must do:
//      MyClass *obj = dynamic_cast<MyClass*>(directory->Get("some object of MyClass"));
//
//  Of course, dynamic_cast<> can also be used in the example 1.
//

   Short_t  cycle;
   char     name[kMaxLen];

   DecodeNameCycle(namecycle, name, cycle, kMaxLen);
   char *namobj = name;
   Int_t nch = strlen(name);
   for (Int_t i = nch-1; i > 0; i--) {
      if (name[i] == '/') {
         name[i] = 0;
         TDirectory* dirToSearch=GetDirectory(name);
         namobj = name + i + 1;
         name[i] = '/';
         return dirToSearch?dirToSearch->Get(namobj):0;
      }
   }

//*-*---------------------Case of Object in memory---------------------
//                        ========================
   TObject *idcur = fList->FindObject(namobj);
   if (idcur) {
      if (idcur==this && strlen(namobj)!=0) {
         // The object has the same name has the directory and
         // that's what we picked-up!  We just need to ignore
         // it ...
         idcur = 0;
      } else if (cycle == 9999) {
         return idcur;
      } else {
         if (idcur->InheritsFrom(TCollection::Class()))
            idcur->Delete();  // delete also list elements
         delete idcur;
         idcur = 0;
      }
   }
   return idcur;
}

//______________________________________________________________________________
void *TDirectory::GetObjectUnchecked(const char *namecycle)
{
// return pointer to object identified by namecycle.
// The returned object may or may not derive from TObject.
//
//   namecycle has the format name;cycle
//   name  = * is illegal, cycle = * is illegal
//   cycle = "" or cycle = 9999 ==> apply to a memory object
//
//  VERY IMPORTANT NOTE:
//  The calling application must cast the returned object to
//  the final type, e.g.
//      MyClass *obj = (MyClass*)directory->GetObject("some object of MyClass");

   return GetObjectChecked(namecycle,(TClass*)0);
}

//_________________________________________________________________________________
void *TDirectory::GetObjectChecked(const char *namecycle, const char* classname)
{
// See documentation of TDirectory::GetObjectCheck(const char *namecycle, const TClass *cl)

   return GetObjectChecked(namecycle,TClass::GetClass(classname));
}


//____________________________________________________________________________
void *TDirectory::GetObjectChecked(const char *namecycle, const TClass* expectedClass)
{
// return pointer to object identified by namecycle if and only if the actual
// object is a type suitable to be stored as a pointer to a "expectedClass"
// If expectedClass is null, no check is performed.
//
//   namecycle has the format name;cycle
//   name  = * is illegal, cycle = * is illegal
//   cycle = "" or cycle = 9999 ==> apply to a memory object
//
//  VERY IMPORTANT NOTE:
//  The calling application must cast the returned pointer to
//  the type described by the 2 arguments (i.e. cl):
//      MyClass *obj = (MyClass*)directory->GetObjectChecked("some object of MyClass","MyClass"));
//
//  Note: We recommend using the method TDirectory::GetObject:
//      MyClass *obj = 0;
//      directory->GetObject("some object inheriting from MyClass",obj);
//      if (obj) { ... we found what we are looking for ... }

   Short_t  cycle;
   char     name[kMaxLen];

   DecodeNameCycle(namecycle, name, cycle, kMaxLen);
   char *namobj = name;
   Int_t nch = strlen(name);
   for (Int_t i = nch-1; i > 0; i--) {
      if (name[i] == '/') {
         name[i] = 0;
         TDirectory* dirToSearch=GetDirectory(name);
         namobj = name + i + 1;
         name[i] = '/';
         if (dirToSearch) {
            return dirToSearch->GetObjectChecked(namobj, expectedClass);
         } else {
            return 0;
         }
      }
   }

//*-*---------------------Case of Object in memory---------------------
//                        ========================
   if (expectedClass==0 || expectedClass->IsTObject()) {
      TObject *objcur = fList->FindObject(namobj);
      if (objcur) {
         if (objcur==this && strlen(namobj)!=0) {
            // The object has the same name has the directory and
            // that's what we picked-up!  We just need to ignore
            // it ...
            objcur = 0;
         } else if (cycle == 9999) {
            // Check type
            if (expectedClass && objcur->IsA()->GetBaseClassOffset(expectedClass) == -1) return 0;
            else return objcur;
         } else {
            if (objcur->InheritsFrom(TCollection::Class()))
               objcur->Delete();  // delete also list elements
            delete objcur;
            objcur = 0;
         }
      }
   }

   return 0;
}

//______________________________________________________________________________
const char *TDirectory::GetPathStatic() const
{
   // Returns the full path of the directory. E.g. file:/dir1/dir2.
   // The returned path will be re-used by the next call to GetPath().

   static char *path = 0;
   const int kMAXDEPTH = 128;
   const TDirectory *d[kMAXDEPTH];
   const TDirectory *cur = this;
   int depth = 0, len = 0;

   d[depth++] = cur;
   len = strlen(cur->GetName()) + 1;  // +1 for the /

   while (cur->fMother && depth < kMAXDEPTH) {
      cur = (TDirectory *)cur->fMother;
      d[depth++] = cur;
      len += strlen(cur->GetName()) + 1;
   }

   if (path) delete [] path;
   path = new char[len+2];

   for (int i = depth-1; i >= 0; i--) {
      if (i == depth-1) {    // file or TROOT name
         strlcpy(path, d[i]->GetName(),len+2);
         strlcat(path, ":",len+2);
         if (i == 0) strlcat(path, "/",len+2);
      } else {
         strlcat(path, "/",len+2);
         strlcat(path, d[i]->GetName(),len+2);
      }
   }

   return path;
}

//______________________________________________________________________________
const char *TDirectory::GetPath() const
{
   // Returns the full path of the directory. E.g. file:/dir1/dir2.
   // The returned path will be re-used by the next call to GetPath().

   //
   TString* buf = &(const_cast<TDirectory*>(this)->fPathBuffer);

   FillFullPath(*buf);
   if (GetMotherDir()==0) // case of file
      buf->Append("/");

   return buf->Data();
}

//______________________________________________________________________________
void TDirectory::FillFullPath(TString& buf) const
{
   // recursive method to fill full path for directory

   TDirectory* mom = GetMotherDir();
   if (mom!=0) {
      mom->FillFullPath(buf);
      buf += "/";
      buf += GetName();
   } else {
      buf = GetName();
      buf +=":";
   }
}

//______________________________________________________________________________
TDirectory *TDirectory::mkdir(const char *name, const char *title)
{
   // Create a sub-directory and return a pointer to the created directory.
   // Returns 0 in case of error.
   // Returns 0 if a directory with the same name already exists.
   // Note that the directory name may be of the form "a/b/c" to create a hierarchy of directories.
   // In this case, the function returns the pointer to the "a" directory if the operation is successful.
   //
   // For example the step to the steps to create first a/b/c and then a/b/d without receiving
   // and errors are:
   //    TFile * file = new TFile("afile","RECREATE");
   //    file->mkdir("a");
   //    file->cd("a");
   //    gDirectory->mkdir("b");
   //    gDirectory->cd("b");
   //    gDirectory->mkdir("d");

   if (!name || !title || !name[0]) return 0;
   if (!title[0]) title = name;
   TDirectory *newdir = 0;
   if (const char *slash = strchr(name,'/')) {
      Long_t size = Long_t(slash-name);
      char *workname = new char[size+1];
      strncpy(workname, name, size);
      workname[size] = 0;
      TDirectory *tmpdir;
      GetObject(workname,tmpdir);
      if (!tmpdir) {
         tmpdir = mkdir(workname,title);
         if (!tmpdir) return 0;
      }
      delete[] workname;
      if (!tmpdir) return 0;
      if (!newdir) newdir = tmpdir;
      tmpdir->mkdir(slash+1);
      return newdir;
   }

   TDirectory::TContext ctxt(this);

   newdir = new TDirectory(name, title, "", this);

   return newdir;
}

//______________________________________________________________________________
void TDirectory::ls(Option_t *option) const
{
   // List Directory contents.
   //
   //  Indentation is used to identify the directory tree
   //  Subdirectories are listed first, then objects in memory.
   //
   //  The option can has the following format:
   //     [<regexp>]
   //  The <regexp> will be used to match the name of the objects.
   //  By default memory and disk objects are listed.
   //

   TROOT::IndentLevel();
   TROOT::IncreaseDirLevel();

   TString opta = option;
   TString opt  = opta.Strip(TString::kBoth);
   Bool_t memobj  = kTRUE;
   TString reg = "*";
   if (opt.BeginsWith("-m")) {
      if (opt.Length() > 2)
         reg = opt(2,opt.Length());
   } else if (opt.BeginsWith("-d")) {
      memobj  = kFALSE;
      if (opt.Length() > 2)
         reg = opt(2,opt.Length());
   } else if (!opt.IsNull())
      reg = opt;

   TRegexp re(reg, kTRUE);

   if (memobj) {
      TObject *obj;
      TIter nextobj(fList);
      while ((obj = (TObject *) nextobj())) {
         TString s = obj->GetName();
         if (s.Index(re) == kNPOS) continue;
         obj->ls(option);            //*-* Loop on all the objects in memory
      }
   }
   TROOT::DecreaseDirLevel();
}

//______________________________________________________________________________
void TDirectory::Paint(Option_t *option)
{
   // Paint all objects in the directory.

   fList->R__FOR_EACH(TObject,Paint)(option);
}

//______________________________________________________________________________
void TDirectory::Print(Option_t *option) const
{
   // Print all objects in the directory.

   fList->R__FOR_EACH(TObject,Print)(option);
}

//______________________________________________________________________________
void TDirectory::pwd() const
{
   // Print the path of the directory.

   Printf("%s", GetPath());
}

//______________________________________________________________________________
void TDirectory::RecursiveRemove(TObject *obj)
{
   // Recursively remove object from a Directory.

   fList->RecursiveRemove(obj);
}

//______________________________________________________________________________
TObject *TDirectory::Remove(TObject* obj)
{
   // Remove an object from the in-memory list.

   TObject *p = 0;
   if (fList) {
      p = fList->Remove(obj);
   }
   return p;
}

//______________________________________________________________________________
void TDirectory::rmdir(const char *name)
{
   // Removes subdirectory from the directory
   // When directory is deleted, all keys in all subdirectories will be
   // read first and deleted from file (if exists)
   // Equivalent call is Delete("name;*");

   if ((name==0) || (*name==0)) return;

   TString mask(name);
   mask+=";*";
   Delete(mask);
}

//______________________________________________________________________________
Int_t TDirectory::SaveObjectAs(const TObject *obj, const char *filename, Option_t *option) const
{
   // Save object in filename,
   // if filename is 0 or "", a file with "objectname.root" is created.
   // The name of the key is the object name.
   // If the operation is successful, it returns the number of bytes written to the file
   // otherwise it returns 0.
   // By default a message is printed. Use option "q" to not print the message.

   if (!obj) return 0;
   Int_t nbytes = 0;
   TString fname = filename;
   if (!filename || !filename[0]) {
      fname.Form("%s.root",obj->GetName());
   }
   TString cmd;
   cmd.Form("TFile::Open(\"%s\",\"recreate\");",fname.Data());
   {
      TContext ctxt; // The TFile::Open will change the current directory.
      TDirectory *local = (TDirectory*)gROOT->ProcessLine(cmd);
      if (!local) return 0;
      nbytes = obj->Write();
      delete local;
   }
   TString opt(option);
   opt.ToLower();
   if (!opt.Contains("q")) {
      if (!gSystem->AccessPathName(fname.Data())) obj->Info("SaveAs", "ROOT file %s has been created", fname.Data());
   }
   return nbytes;
}

//______________________________________________________________________________
void TDirectory::SetName(const char* newname)
{
   // Set the name for directory
   // If the directory name is changed after the directory was written once,
   // ROOT currently would NOT change the name of correspondent key in the
   // mother directory.
   // DO NOT use this method to 'rename a directory'.
   // Renaming a directory is currently NOT supported.

   TNamed::SetName(newname);
}

//______________________________________________________________________________
void TDirectory::EncodeNameCycle(char *buffer, const char *name, Short_t cycle)
{
   // Encode the name and cycle into buffer like: "aap;2".

   if (cycle == 9999)
      strcpy(buffer, name);
   else
      sprintf(buffer, "%s;%d", name, cycle);
}

//______________________________________________________________________________
void TDirectory::DecodeNameCycle(const char *buffer, char *name, Short_t &cycle,
                                 const size_t namesize)
{
   // Decode a namecycle "aap;2" into name "aap" and cycle "2". Destination
   // buffer size for name (including string terminator) should be specified in
   // namesize.

   size_t len = 0;
   const char *ni = strchr(buffer, ';');

   if (ni) {
      // Found ';'
      len = ni - buffer;
      ++ni;
   } else {
      // No ';' found
      len = strlen(buffer);
      ni = &buffer[len];
   }

   if (namesize) {
      if (len > namesize-1ul) len = namesize-1;  // accommodate string terminator
   } else {
      ::Warning("TDirectory::DecodeNameCycle",
         "Using unsafe version: invoke this metod by specifying the buffer size");
   }

   strncpy(name, buffer, len);
   name[len] = '\0';

   if (*ni == '*')
      cycle = 10000;
   else if (isdigit(*ni))
      cycle = atoi(ni);
   else
      cycle = 9999;
}

//______________________________________________________________________________
void TDirectory::RegisterContext(TContext *ctxt) {
   // Register a TContext pointing to this TDirectory object

   R__LOCKGUARD2(gROOTMutex);
   if (fContext) {
      TContext *current = fContext;
      while(current->fNext) {
         current = current->fNext;
      }
      current->fNext = ctxt;
      ctxt->fPrevious = current;
   } else {
      fContext = ctxt;
   }
}

//______________________________________________________________________________
Int_t TDirectory::WriteTObject(const TObject *obj, const char *name, Option_t * /*option*/, Int_t /*bufsize*/)
{
   // See TDirectoryFile::WriteTObject for details

   const char *objname = "no name specified";
   if (name) objname = name;
   else if (obj) objname = obj->GetName();
   Error("WriteTObject","The current directory (%s) is not associated with a file. The object (%s) has not been written.",GetName(),objname);
   return 0;
}

//______________________________________________________________________________
void TDirectory::UnregisterContext(TContext *ctxt) {
   // UnRegister a TContext pointing to this TDirectory object

   R__LOCKGUARD2(gROOTMutex);
   if (ctxt==fContext) {
      fContext = ctxt->fNext;
      if (fContext) fContext->fPrevious = 0;
      ctxt->fPrevious = ctxt->fNext = 0;
   } else {
      TContext *next = ctxt->fNext;
      ctxt->fPrevious->fNext = next;
      if (next) next->fPrevious = ctxt->fPrevious;
      ctxt->fPrevious = ctxt->fNext = 0;
   }
}

//______________________________________________________________________________
void TDirectory::TContext::CdNull()
{
   // Set the current directory to null.
   // This is called from the TContext destructor.  Since the destructor is
   // inline, we do not want to have it directly use a global variable.

   gDirectory = 0;
}
 TDirectory.cxx:1
 TDirectory.cxx:2
 TDirectory.cxx:3
 TDirectory.cxx:4
 TDirectory.cxx:5
 TDirectory.cxx:6
 TDirectory.cxx:7
 TDirectory.cxx:8
 TDirectory.cxx:9
 TDirectory.cxx:10
 TDirectory.cxx:11
 TDirectory.cxx:12
 TDirectory.cxx:13
 TDirectory.cxx:14
 TDirectory.cxx:15
 TDirectory.cxx:16
 TDirectory.cxx:17
 TDirectory.cxx:18
 TDirectory.cxx:19
 TDirectory.cxx:20
 TDirectory.cxx:21
 TDirectory.cxx:22
 TDirectory.cxx:23
 TDirectory.cxx:24
 TDirectory.cxx:25
 TDirectory.cxx:26
 TDirectory.cxx:27
 TDirectory.cxx:28
 TDirectory.cxx:29
 TDirectory.cxx:30
 TDirectory.cxx:31
 TDirectory.cxx:32
 TDirectory.cxx:33
 TDirectory.cxx:34
 TDirectory.cxx:35
 TDirectory.cxx:36
 TDirectory.cxx:37
 TDirectory.cxx:38
 TDirectory.cxx:39
 TDirectory.cxx:40
 TDirectory.cxx:41
 TDirectory.cxx:42
 TDirectory.cxx:43
 TDirectory.cxx:44
 TDirectory.cxx:45
 TDirectory.cxx:46
 TDirectory.cxx:47
 TDirectory.cxx:48
 TDirectory.cxx:49
 TDirectory.cxx:50
 TDirectory.cxx:51
 TDirectory.cxx:52
 TDirectory.cxx:53
 TDirectory.cxx:54
 TDirectory.cxx:55
 TDirectory.cxx:56
 TDirectory.cxx:57
 TDirectory.cxx:58
 TDirectory.cxx:59
 TDirectory.cxx:60
 TDirectory.cxx:61
 TDirectory.cxx:62
 TDirectory.cxx:63
 TDirectory.cxx:64
 TDirectory.cxx:65
 TDirectory.cxx:66
 TDirectory.cxx:67
 TDirectory.cxx:68
 TDirectory.cxx:69
 TDirectory.cxx:70
 TDirectory.cxx:71
 TDirectory.cxx:72
 TDirectory.cxx:73
 TDirectory.cxx:74
 TDirectory.cxx:75
 TDirectory.cxx:76
 TDirectory.cxx:77
 TDirectory.cxx:78
 TDirectory.cxx:79
 TDirectory.cxx:80
 TDirectory.cxx:81
 TDirectory.cxx:82
 TDirectory.cxx:83
 TDirectory.cxx:84
 TDirectory.cxx:85
 TDirectory.cxx:86
 TDirectory.cxx:87
 TDirectory.cxx:88
 TDirectory.cxx:89
 TDirectory.cxx:90
 TDirectory.cxx:91
 TDirectory.cxx:92
 TDirectory.cxx:93
 TDirectory.cxx:94
 TDirectory.cxx:95
 TDirectory.cxx:96
 TDirectory.cxx:97
 TDirectory.cxx:98
 TDirectory.cxx:99
 TDirectory.cxx:100
 TDirectory.cxx:101
 TDirectory.cxx:102
 TDirectory.cxx:103
 TDirectory.cxx:104
 TDirectory.cxx:105
 TDirectory.cxx:106
 TDirectory.cxx:107
 TDirectory.cxx:108
 TDirectory.cxx:109
 TDirectory.cxx:110
 TDirectory.cxx:111
 TDirectory.cxx:112
 TDirectory.cxx:113
 TDirectory.cxx:114
 TDirectory.cxx:115
 TDirectory.cxx:116
 TDirectory.cxx:117
 TDirectory.cxx:118
 TDirectory.cxx:119
 TDirectory.cxx:120
 TDirectory.cxx:121
 TDirectory.cxx:122
 TDirectory.cxx:123
 TDirectory.cxx:124
 TDirectory.cxx:125
 TDirectory.cxx:126
 TDirectory.cxx:127
 TDirectory.cxx:128
 TDirectory.cxx:129
 TDirectory.cxx:130
 TDirectory.cxx:131
 TDirectory.cxx:132
 TDirectory.cxx:133
 TDirectory.cxx:134
 TDirectory.cxx:135
 TDirectory.cxx:136
 TDirectory.cxx:137
 TDirectory.cxx:138
 TDirectory.cxx:139
 TDirectory.cxx:140
 TDirectory.cxx:141
 TDirectory.cxx:142
 TDirectory.cxx:143
 TDirectory.cxx:144
 TDirectory.cxx:145
 TDirectory.cxx:146
 TDirectory.cxx:147
 TDirectory.cxx:148
 TDirectory.cxx:149
 TDirectory.cxx:150
 TDirectory.cxx:151
 TDirectory.cxx:152
 TDirectory.cxx:153
 TDirectory.cxx:154
 TDirectory.cxx:155
 TDirectory.cxx:156
 TDirectory.cxx:157
 TDirectory.cxx:158
 TDirectory.cxx:159
 TDirectory.cxx:160
 TDirectory.cxx:161
 TDirectory.cxx:162
 TDirectory.cxx:163
 TDirectory.cxx:164
 TDirectory.cxx:165
 TDirectory.cxx:166
 TDirectory.cxx:167
 TDirectory.cxx:168
 TDirectory.cxx:169
 TDirectory.cxx:170
 TDirectory.cxx:171
 TDirectory.cxx:172
 TDirectory.cxx:173
 TDirectory.cxx:174
 TDirectory.cxx:175
 TDirectory.cxx:176
 TDirectory.cxx:177
 TDirectory.cxx:178
 TDirectory.cxx:179
 TDirectory.cxx:180
 TDirectory.cxx:181
 TDirectory.cxx:182
 TDirectory.cxx:183
 TDirectory.cxx:184
 TDirectory.cxx:185
 TDirectory.cxx:186
 TDirectory.cxx:187
 TDirectory.cxx:188
 TDirectory.cxx:189
 TDirectory.cxx:190
 TDirectory.cxx:191
 TDirectory.cxx:192
 TDirectory.cxx:193
 TDirectory.cxx:194
 TDirectory.cxx:195
 TDirectory.cxx:196
 TDirectory.cxx:197
 TDirectory.cxx:198
 TDirectory.cxx:199
 TDirectory.cxx:200
 TDirectory.cxx:201
 TDirectory.cxx:202
 TDirectory.cxx:203
 TDirectory.cxx:204
 TDirectory.cxx:205
 TDirectory.cxx:206
 TDirectory.cxx:207
 TDirectory.cxx:208
 TDirectory.cxx:209
 TDirectory.cxx:210
 TDirectory.cxx:211
 TDirectory.cxx:212
 TDirectory.cxx:213
 TDirectory.cxx:214
 TDirectory.cxx:215
 TDirectory.cxx:216
 TDirectory.cxx:217
 TDirectory.cxx:218
 TDirectory.cxx:219
 TDirectory.cxx:220
 TDirectory.cxx:221
 TDirectory.cxx:222
 TDirectory.cxx:223
 TDirectory.cxx:224
 TDirectory.cxx:225
 TDirectory.cxx:226
 TDirectory.cxx:227
 TDirectory.cxx:228
 TDirectory.cxx:229
 TDirectory.cxx:230
 TDirectory.cxx:231
 TDirectory.cxx:232
 TDirectory.cxx:233
 TDirectory.cxx:234
 TDirectory.cxx:235
 TDirectory.cxx:236
 TDirectory.cxx:237
 TDirectory.cxx:238
 TDirectory.cxx:239
 TDirectory.cxx:240
 TDirectory.cxx:241
 TDirectory.cxx:242
 TDirectory.cxx:243
 TDirectory.cxx:244
 TDirectory.cxx:245
 TDirectory.cxx:246
 TDirectory.cxx:247
 TDirectory.cxx:248
 TDirectory.cxx:249
 TDirectory.cxx:250
 TDirectory.cxx:251
 TDirectory.cxx:252
 TDirectory.cxx:253
 TDirectory.cxx:254
 TDirectory.cxx:255
 TDirectory.cxx:256
 TDirectory.cxx:257
 TDirectory.cxx:258
 TDirectory.cxx:259
 TDirectory.cxx:260
 TDirectory.cxx:261
 TDirectory.cxx:262
 TDirectory.cxx:263
 TDirectory.cxx:264
 TDirectory.cxx:265
 TDirectory.cxx:266
 TDirectory.cxx:267
 TDirectory.cxx:268
 TDirectory.cxx:269
 TDirectory.cxx:270
 TDirectory.cxx:271
 TDirectory.cxx:272
 TDirectory.cxx:273
 TDirectory.cxx:274
 TDirectory.cxx:275
 TDirectory.cxx:276
 TDirectory.cxx:277
 TDirectory.cxx:278
 TDirectory.cxx:279
 TDirectory.cxx:280
 TDirectory.cxx:281
 TDirectory.cxx:282
 TDirectory.cxx:283
 TDirectory.cxx:284
 TDirectory.cxx:285
 TDirectory.cxx:286
 TDirectory.cxx:287
 TDirectory.cxx:288
 TDirectory.cxx:289
 TDirectory.cxx:290
 TDirectory.cxx:291
 TDirectory.cxx:292
 TDirectory.cxx:293
 TDirectory.cxx:294
 TDirectory.cxx:295
 TDirectory.cxx:296
 TDirectory.cxx:297
 TDirectory.cxx:298
 TDirectory.cxx:299
 TDirectory.cxx:300
 TDirectory.cxx:301
 TDirectory.cxx:302
 TDirectory.cxx:303
 TDirectory.cxx:304
 TDirectory.cxx:305
 TDirectory.cxx:306
 TDirectory.cxx:307
 TDirectory.cxx:308
 TDirectory.cxx:309
 TDirectory.cxx:310
 TDirectory.cxx:311
 TDirectory.cxx:312
 TDirectory.cxx:313
 TDirectory.cxx:314
 TDirectory.cxx:315
 TDirectory.cxx:316
 TDirectory.cxx:317
 TDirectory.cxx:318
 TDirectory.cxx:319
 TDirectory.cxx:320
 TDirectory.cxx:321
 TDirectory.cxx:322
 TDirectory.cxx:323
 TDirectory.cxx:324
 TDirectory.cxx:325
 TDirectory.cxx:326
 TDirectory.cxx:327
 TDirectory.cxx:328
 TDirectory.cxx:329
 TDirectory.cxx:330
 TDirectory.cxx:331
 TDirectory.cxx:332
 TDirectory.cxx:333
 TDirectory.cxx:334
 TDirectory.cxx:335
 TDirectory.cxx:336
 TDirectory.cxx:337
 TDirectory.cxx:338
 TDirectory.cxx:339
 TDirectory.cxx:340
 TDirectory.cxx:341
 TDirectory.cxx:342
 TDirectory.cxx:343
 TDirectory.cxx:344
 TDirectory.cxx:345
 TDirectory.cxx:346
 TDirectory.cxx:347
 TDirectory.cxx:348
 TDirectory.cxx:349
 TDirectory.cxx:350
 TDirectory.cxx:351
 TDirectory.cxx:352
 TDirectory.cxx:353
 TDirectory.cxx:354
 TDirectory.cxx:355
 TDirectory.cxx:356
 TDirectory.cxx:357
 TDirectory.cxx:358
 TDirectory.cxx:359
 TDirectory.cxx:360
 TDirectory.cxx:361
 TDirectory.cxx:362
 TDirectory.cxx:363
 TDirectory.cxx:364
 TDirectory.cxx:365
 TDirectory.cxx:366
 TDirectory.cxx:367
 TDirectory.cxx:368
 TDirectory.cxx:369
 TDirectory.cxx:370
 TDirectory.cxx:371
 TDirectory.cxx:372
 TDirectory.cxx:373
 TDirectory.cxx:374
 TDirectory.cxx:375
 TDirectory.cxx:376
 TDirectory.cxx:377
 TDirectory.cxx:378
 TDirectory.cxx:379
 TDirectory.cxx:380
 TDirectory.cxx:381
 TDirectory.cxx:382
 TDirectory.cxx:383
 TDirectory.cxx:384
 TDirectory.cxx:385
 TDirectory.cxx:386
 TDirectory.cxx:387
 TDirectory.cxx:388
 TDirectory.cxx:389
 TDirectory.cxx:390
 TDirectory.cxx:391
 TDirectory.cxx:392
 TDirectory.cxx:393
 TDirectory.cxx:394
 TDirectory.cxx:395
 TDirectory.cxx:396
 TDirectory.cxx:397
 TDirectory.cxx:398
 TDirectory.cxx:399
 TDirectory.cxx:400
 TDirectory.cxx:401
 TDirectory.cxx:402
 TDirectory.cxx:403
 TDirectory.cxx:404
 TDirectory.cxx:405
 TDirectory.cxx:406
 TDirectory.cxx:407
 TDirectory.cxx:408
 TDirectory.cxx:409
 TDirectory.cxx:410
 TDirectory.cxx:411
 TDirectory.cxx:412
 TDirectory.cxx:413
 TDirectory.cxx:414
 TDirectory.cxx:415
 TDirectory.cxx:416
 TDirectory.cxx:417
 TDirectory.cxx:418
 TDirectory.cxx:419
 TDirectory.cxx:420
 TDirectory.cxx:421
 TDirectory.cxx:422
 TDirectory.cxx:423
 TDirectory.cxx:424
 TDirectory.cxx:425
 TDirectory.cxx:426
 TDirectory.cxx:427
 TDirectory.cxx:428
 TDirectory.cxx:429
 TDirectory.cxx:430
 TDirectory.cxx:431
 TDirectory.cxx:432
 TDirectory.cxx:433
 TDirectory.cxx:434
 TDirectory.cxx:435
 TDirectory.cxx:436
 TDirectory.cxx:437
 TDirectory.cxx:438
 TDirectory.cxx:439
 TDirectory.cxx:440
 TDirectory.cxx:441
 TDirectory.cxx:442
 TDirectory.cxx:443
 TDirectory.cxx:444
 TDirectory.cxx:445
 TDirectory.cxx:446
 TDirectory.cxx:447
 TDirectory.cxx:448
 TDirectory.cxx:449
 TDirectory.cxx:450
 TDirectory.cxx:451
 TDirectory.cxx:452
 TDirectory.cxx:453
 TDirectory.cxx:454
 TDirectory.cxx:455
 TDirectory.cxx:456
 TDirectory.cxx:457
 TDirectory.cxx:458
 TDirectory.cxx:459
 TDirectory.cxx:460
 TDirectory.cxx:461
 TDirectory.cxx:462
 TDirectory.cxx:463
 TDirectory.cxx:464
 TDirectory.cxx:465
 TDirectory.cxx:466
 TDirectory.cxx:467
 TDirectory.cxx:468
 TDirectory.cxx:469
 TDirectory.cxx:470
 TDirectory.cxx:471
 TDirectory.cxx:472
 TDirectory.cxx:473
 TDirectory.cxx:474
 TDirectory.cxx:475
 TDirectory.cxx:476
 TDirectory.cxx:477
 TDirectory.cxx:478
 TDirectory.cxx:479
 TDirectory.cxx:480
 TDirectory.cxx:481
 TDirectory.cxx:482
 TDirectory.cxx:483
 TDirectory.cxx:484
 TDirectory.cxx:485
 TDirectory.cxx:486
 TDirectory.cxx:487
 TDirectory.cxx:488
 TDirectory.cxx:489
 TDirectory.cxx:490
 TDirectory.cxx:491
 TDirectory.cxx:492
 TDirectory.cxx:493
 TDirectory.cxx:494
 TDirectory.cxx:495
 TDirectory.cxx:496
 TDirectory.cxx:497
 TDirectory.cxx:498
 TDirectory.cxx:499
 TDirectory.cxx:500
 TDirectory.cxx:501
 TDirectory.cxx:502
 TDirectory.cxx:503
 TDirectory.cxx:504
 TDirectory.cxx:505
 TDirectory.cxx:506
 TDirectory.cxx:507
 TDirectory.cxx:508
 TDirectory.cxx:509
 TDirectory.cxx:510
 TDirectory.cxx:511
 TDirectory.cxx:512
 TDirectory.cxx:513
 TDirectory.cxx:514
 TDirectory.cxx:515
 TDirectory.cxx:516
 TDirectory.cxx:517
 TDirectory.cxx:518
 TDirectory.cxx:519
 TDirectory.cxx:520
 TDirectory.cxx:521
 TDirectory.cxx:522
 TDirectory.cxx:523
 TDirectory.cxx:524
 TDirectory.cxx:525
 TDirectory.cxx:526
 TDirectory.cxx:527
 TDirectory.cxx:528
 TDirectory.cxx:529
 TDirectory.cxx:530
 TDirectory.cxx:531
 TDirectory.cxx:532
 TDirectory.cxx:533
 TDirectory.cxx:534
 TDirectory.cxx:535
 TDirectory.cxx:536
 TDirectory.cxx:537
 TDirectory.cxx:538
 TDirectory.cxx:539
 TDirectory.cxx:540
 TDirectory.cxx:541
 TDirectory.cxx:542
 TDirectory.cxx:543
 TDirectory.cxx:544
 TDirectory.cxx:545
 TDirectory.cxx:546
 TDirectory.cxx:547
 TDirectory.cxx:548
 TDirectory.cxx:549
 TDirectory.cxx:550
 TDirectory.cxx:551
 TDirectory.cxx:552
 TDirectory.cxx:553
 TDirectory.cxx:554
 TDirectory.cxx:555
 TDirectory.cxx:556
 TDirectory.cxx:557
 TDirectory.cxx:558
 TDirectory.cxx:559
 TDirectory.cxx:560
 TDirectory.cxx:561
 TDirectory.cxx:562
 TDirectory.cxx:563
 TDirectory.cxx:564
 TDirectory.cxx:565
 TDirectory.cxx:566
 TDirectory.cxx:567
 TDirectory.cxx:568
 TDirectory.cxx:569
 TDirectory.cxx:570
 TDirectory.cxx:571
 TDirectory.cxx:572
 TDirectory.cxx:573
 TDirectory.cxx:574
 TDirectory.cxx:575
 TDirectory.cxx:576
 TDirectory.cxx:577
 TDirectory.cxx:578
 TDirectory.cxx:579
 TDirectory.cxx:580
 TDirectory.cxx:581
 TDirectory.cxx:582
 TDirectory.cxx:583
 TDirectory.cxx:584
 TDirectory.cxx:585
 TDirectory.cxx:586
 TDirectory.cxx:587
 TDirectory.cxx:588
 TDirectory.cxx:589
 TDirectory.cxx:590
 TDirectory.cxx:591
 TDirectory.cxx:592
 TDirectory.cxx:593
 TDirectory.cxx:594
 TDirectory.cxx:595
 TDirectory.cxx:596
 TDirectory.cxx:597
 TDirectory.cxx:598
 TDirectory.cxx:599
 TDirectory.cxx:600
 TDirectory.cxx:601
 TDirectory.cxx:602
 TDirectory.cxx:603
 TDirectory.cxx:604
 TDirectory.cxx:605
 TDirectory.cxx:606
 TDirectory.cxx:607
 TDirectory.cxx:608
 TDirectory.cxx:609
 TDirectory.cxx:610
 TDirectory.cxx:611
 TDirectory.cxx:612
 TDirectory.cxx:613
 TDirectory.cxx:614
 TDirectory.cxx:615
 TDirectory.cxx:616
 TDirectory.cxx:617
 TDirectory.cxx:618
 TDirectory.cxx:619
 TDirectory.cxx:620
 TDirectory.cxx:621
 TDirectory.cxx:622
 TDirectory.cxx:623
 TDirectory.cxx:624
 TDirectory.cxx:625
 TDirectory.cxx:626
 TDirectory.cxx:627
 TDirectory.cxx:628
 TDirectory.cxx:629
 TDirectory.cxx:630
 TDirectory.cxx:631
 TDirectory.cxx:632
 TDirectory.cxx:633
 TDirectory.cxx:634
 TDirectory.cxx:635
 TDirectory.cxx:636
 TDirectory.cxx:637
 TDirectory.cxx:638
 TDirectory.cxx:639
 TDirectory.cxx:640
 TDirectory.cxx:641
 TDirectory.cxx:642
 TDirectory.cxx:643
 TDirectory.cxx:644
 TDirectory.cxx:645
 TDirectory.cxx:646
 TDirectory.cxx:647
 TDirectory.cxx:648
 TDirectory.cxx:649
 TDirectory.cxx:650
 TDirectory.cxx:651
 TDirectory.cxx:652
 TDirectory.cxx:653
 TDirectory.cxx:654
 TDirectory.cxx:655
 TDirectory.cxx:656
 TDirectory.cxx:657
 TDirectory.cxx:658
 TDirectory.cxx:659
 TDirectory.cxx:660
 TDirectory.cxx:661
 TDirectory.cxx:662
 TDirectory.cxx:663
 TDirectory.cxx:664
 TDirectory.cxx:665
 TDirectory.cxx:666
 TDirectory.cxx:667
 TDirectory.cxx:668
 TDirectory.cxx:669
 TDirectory.cxx:670
 TDirectory.cxx:671
 TDirectory.cxx:672
 TDirectory.cxx:673
 TDirectory.cxx:674
 TDirectory.cxx:675
 TDirectory.cxx:676
 TDirectory.cxx:677
 TDirectory.cxx:678
 TDirectory.cxx:679
 TDirectory.cxx:680
 TDirectory.cxx:681
 TDirectory.cxx:682
 TDirectory.cxx:683
 TDirectory.cxx:684
 TDirectory.cxx:685
 TDirectory.cxx:686
 TDirectory.cxx:687
 TDirectory.cxx:688
 TDirectory.cxx:689
 TDirectory.cxx:690
 TDirectory.cxx:691
 TDirectory.cxx:692
 TDirectory.cxx:693
 TDirectory.cxx:694
 TDirectory.cxx:695
 TDirectory.cxx:696
 TDirectory.cxx:697
 TDirectory.cxx:698
 TDirectory.cxx:699
 TDirectory.cxx:700
 TDirectory.cxx:701
 TDirectory.cxx:702
 TDirectory.cxx:703
 TDirectory.cxx:704
 TDirectory.cxx:705
 TDirectory.cxx:706
 TDirectory.cxx:707
 TDirectory.cxx:708
 TDirectory.cxx:709
 TDirectory.cxx:710
 TDirectory.cxx:711
 TDirectory.cxx:712
 TDirectory.cxx:713
 TDirectory.cxx:714
 TDirectory.cxx:715
 TDirectory.cxx:716
 TDirectory.cxx:717
 TDirectory.cxx:718
 TDirectory.cxx:719
 TDirectory.cxx:720
 TDirectory.cxx:721
 TDirectory.cxx:722
 TDirectory.cxx:723
 TDirectory.cxx:724
 TDirectory.cxx:725
 TDirectory.cxx:726
 TDirectory.cxx:727
 TDirectory.cxx:728
 TDirectory.cxx:729
 TDirectory.cxx:730
 TDirectory.cxx:731
 TDirectory.cxx:732
 TDirectory.cxx:733
 TDirectory.cxx:734
 TDirectory.cxx:735
 TDirectory.cxx:736
 TDirectory.cxx:737
 TDirectory.cxx:738
 TDirectory.cxx:739
 TDirectory.cxx:740
 TDirectory.cxx:741
 TDirectory.cxx:742
 TDirectory.cxx:743
 TDirectory.cxx:744
 TDirectory.cxx:745
 TDirectory.cxx:746
 TDirectory.cxx:747
 TDirectory.cxx:748
 TDirectory.cxx:749
 TDirectory.cxx:750
 TDirectory.cxx:751
 TDirectory.cxx:752
 TDirectory.cxx:753
 TDirectory.cxx:754
 TDirectory.cxx:755
 TDirectory.cxx:756
 TDirectory.cxx:757
 TDirectory.cxx:758
 TDirectory.cxx:759
 TDirectory.cxx:760
 TDirectory.cxx:761
 TDirectory.cxx:762
 TDirectory.cxx:763
 TDirectory.cxx:764
 TDirectory.cxx:765
 TDirectory.cxx:766
 TDirectory.cxx:767
 TDirectory.cxx:768
 TDirectory.cxx:769
 TDirectory.cxx:770
 TDirectory.cxx:771
 TDirectory.cxx:772
 TDirectory.cxx:773
 TDirectory.cxx:774
 TDirectory.cxx:775
 TDirectory.cxx:776
 TDirectory.cxx:777
 TDirectory.cxx:778
 TDirectory.cxx:779
 TDirectory.cxx:780
 TDirectory.cxx:781
 TDirectory.cxx:782
 TDirectory.cxx:783
 TDirectory.cxx:784
 TDirectory.cxx:785
 TDirectory.cxx:786
 TDirectory.cxx:787
 TDirectory.cxx:788
 TDirectory.cxx:789
 TDirectory.cxx:790
 TDirectory.cxx:791
 TDirectory.cxx:792
 TDirectory.cxx:793
 TDirectory.cxx:794
 TDirectory.cxx:795
 TDirectory.cxx:796
 TDirectory.cxx:797
 TDirectory.cxx:798
 TDirectory.cxx:799
 TDirectory.cxx:800
 TDirectory.cxx:801
 TDirectory.cxx:802
 TDirectory.cxx:803
 TDirectory.cxx:804
 TDirectory.cxx:805
 TDirectory.cxx:806
 TDirectory.cxx:807
 TDirectory.cxx:808
 TDirectory.cxx:809
 TDirectory.cxx:810
 TDirectory.cxx:811
 TDirectory.cxx:812
 TDirectory.cxx:813
 TDirectory.cxx:814
 TDirectory.cxx:815
 TDirectory.cxx:816
 TDirectory.cxx:817
 TDirectory.cxx:818
 TDirectory.cxx:819
 TDirectory.cxx:820
 TDirectory.cxx:821
 TDirectory.cxx:822
 TDirectory.cxx:823
 TDirectory.cxx:824
 TDirectory.cxx:825
 TDirectory.cxx:826
 TDirectory.cxx:827
 TDirectory.cxx:828
 TDirectory.cxx:829
 TDirectory.cxx:830
 TDirectory.cxx:831
 TDirectory.cxx:832
 TDirectory.cxx:833
 TDirectory.cxx:834
 TDirectory.cxx:835
 TDirectory.cxx:836
 TDirectory.cxx:837
 TDirectory.cxx:838
 TDirectory.cxx:839
 TDirectory.cxx:840
 TDirectory.cxx:841
 TDirectory.cxx:842
 TDirectory.cxx:843
 TDirectory.cxx:844
 TDirectory.cxx:845
 TDirectory.cxx:846
 TDirectory.cxx:847
 TDirectory.cxx:848
 TDirectory.cxx:849
 TDirectory.cxx:850
 TDirectory.cxx:851
 TDirectory.cxx:852
 TDirectory.cxx:853
 TDirectory.cxx:854
 TDirectory.cxx:855
 TDirectory.cxx:856
 TDirectory.cxx:857
 TDirectory.cxx:858
 TDirectory.cxx:859
 TDirectory.cxx:860
 TDirectory.cxx:861
 TDirectory.cxx:862
 TDirectory.cxx:863
 TDirectory.cxx:864
 TDirectory.cxx:865
 TDirectory.cxx:866
 TDirectory.cxx:867
 TDirectory.cxx:868
 TDirectory.cxx:869
 TDirectory.cxx:870
 TDirectory.cxx:871
 TDirectory.cxx:872
 TDirectory.cxx:873
 TDirectory.cxx:874
 TDirectory.cxx:875
 TDirectory.cxx:876
 TDirectory.cxx:877
 TDirectory.cxx:878
 TDirectory.cxx:879
 TDirectory.cxx:880
 TDirectory.cxx:881
 TDirectory.cxx:882
 TDirectory.cxx:883
 TDirectory.cxx:884
 TDirectory.cxx:885
 TDirectory.cxx:886
 TDirectory.cxx:887
 TDirectory.cxx:888
 TDirectory.cxx:889
 TDirectory.cxx:890
 TDirectory.cxx:891
 TDirectory.cxx:892
 TDirectory.cxx:893
 TDirectory.cxx:894
 TDirectory.cxx:895
 TDirectory.cxx:896
 TDirectory.cxx:897
 TDirectory.cxx:898
 TDirectory.cxx:899
 TDirectory.cxx:900
 TDirectory.cxx:901
 TDirectory.cxx:902
 TDirectory.cxx:903
 TDirectory.cxx:904
 TDirectory.cxx:905
 TDirectory.cxx:906
 TDirectory.cxx:907
 TDirectory.cxx:908
 TDirectory.cxx:909
 TDirectory.cxx:910
 TDirectory.cxx:911
 TDirectory.cxx:912
 TDirectory.cxx:913
 TDirectory.cxx:914
 TDirectory.cxx:915
 TDirectory.cxx:916
 TDirectory.cxx:917
 TDirectory.cxx:918
 TDirectory.cxx:919
 TDirectory.cxx:920
 TDirectory.cxx:921
 TDirectory.cxx:922
 TDirectory.cxx:923
 TDirectory.cxx:924
 TDirectory.cxx:925
 TDirectory.cxx:926
 TDirectory.cxx:927
 TDirectory.cxx:928
 TDirectory.cxx:929
 TDirectory.cxx:930
 TDirectory.cxx:931
 TDirectory.cxx:932
 TDirectory.cxx:933
 TDirectory.cxx:934
 TDirectory.cxx:935
 TDirectory.cxx:936
 TDirectory.cxx:937
 TDirectory.cxx:938
 TDirectory.cxx:939
 TDirectory.cxx:940
 TDirectory.cxx:941
 TDirectory.cxx:942
 TDirectory.cxx:943
 TDirectory.cxx:944
 TDirectory.cxx:945
 TDirectory.cxx:946
 TDirectory.cxx:947
 TDirectory.cxx:948
 TDirectory.cxx:949
 TDirectory.cxx:950
 TDirectory.cxx:951
 TDirectory.cxx:952
 TDirectory.cxx:953
 TDirectory.cxx:954
 TDirectory.cxx:955
 TDirectory.cxx:956
 TDirectory.cxx:957
 TDirectory.cxx:958
 TDirectory.cxx:959
 TDirectory.cxx:960
 TDirectory.cxx:961
 TDirectory.cxx:962
 TDirectory.cxx:963
 TDirectory.cxx:964
 TDirectory.cxx:965
 TDirectory.cxx:966
 TDirectory.cxx:967
 TDirectory.cxx:968
 TDirectory.cxx:969
 TDirectory.cxx:970
 TDirectory.cxx:971
 TDirectory.cxx:972
 TDirectory.cxx:973
 TDirectory.cxx:974
 TDirectory.cxx:975
 TDirectory.cxx:976
 TDirectory.cxx:977
 TDirectory.cxx:978
 TDirectory.cxx:979
 TDirectory.cxx:980
 TDirectory.cxx:981
 TDirectory.cxx:982
 TDirectory.cxx:983
 TDirectory.cxx:984
 TDirectory.cxx:985
 TDirectory.cxx:986
 TDirectory.cxx:987
 TDirectory.cxx:988
 TDirectory.cxx:989
 TDirectory.cxx:990
 TDirectory.cxx:991
 TDirectory.cxx:992
 TDirectory.cxx:993
 TDirectory.cxx:994
 TDirectory.cxx:995
 TDirectory.cxx:996
 TDirectory.cxx:997
 TDirectory.cxx:998
 TDirectory.cxx:999
 TDirectory.cxx:1000
 TDirectory.cxx:1001
 TDirectory.cxx:1002
 TDirectory.cxx:1003
 TDirectory.cxx:1004
 TDirectory.cxx:1005
 TDirectory.cxx:1006
 TDirectory.cxx:1007
 TDirectory.cxx:1008
 TDirectory.cxx:1009
 TDirectory.cxx:1010
 TDirectory.cxx:1011
 TDirectory.cxx:1012
 TDirectory.cxx:1013
 TDirectory.cxx:1014
 TDirectory.cxx:1015
 TDirectory.cxx:1016
 TDirectory.cxx:1017
 TDirectory.cxx:1018
 TDirectory.cxx:1019
 TDirectory.cxx:1020
 TDirectory.cxx:1021
 TDirectory.cxx:1022
 TDirectory.cxx:1023
 TDirectory.cxx:1024
 TDirectory.cxx:1025
 TDirectory.cxx:1026
 TDirectory.cxx:1027
 TDirectory.cxx:1028
 TDirectory.cxx:1029
 TDirectory.cxx:1030
 TDirectory.cxx:1031
 TDirectory.cxx:1032
 TDirectory.cxx:1033
 TDirectory.cxx:1034
 TDirectory.cxx:1035
 TDirectory.cxx:1036
 TDirectory.cxx:1037
 TDirectory.cxx:1038
 TDirectory.cxx:1039
 TDirectory.cxx:1040
 TDirectory.cxx:1041
 TDirectory.cxx:1042
 TDirectory.cxx:1043
 TDirectory.cxx:1044
 TDirectory.cxx:1045
 TDirectory.cxx:1046
 TDirectory.cxx:1047
 TDirectory.cxx:1048
 TDirectory.cxx:1049
 TDirectory.cxx:1050
 TDirectory.cxx:1051
 TDirectory.cxx:1052
 TDirectory.cxx:1053
 TDirectory.cxx:1054
 TDirectory.cxx:1055
 TDirectory.cxx:1056
 TDirectory.cxx:1057
 TDirectory.cxx:1058
 TDirectory.cxx:1059
 TDirectory.cxx:1060
 TDirectory.cxx:1061
 TDirectory.cxx:1062
 TDirectory.cxx:1063
 TDirectory.cxx:1064
 TDirectory.cxx:1065
 TDirectory.cxx:1066
 TDirectory.cxx:1067
 TDirectory.cxx:1068
 TDirectory.cxx:1069
 TDirectory.cxx:1070
 TDirectory.cxx:1071
 TDirectory.cxx:1072
 TDirectory.cxx:1073
 TDirectory.cxx:1074
 TDirectory.cxx:1075
 TDirectory.cxx:1076
 TDirectory.cxx:1077
 TDirectory.cxx:1078
 TDirectory.cxx:1079
 TDirectory.cxx:1080
 TDirectory.cxx:1081
 TDirectory.cxx:1082
 TDirectory.cxx:1083
 TDirectory.cxx:1084
 TDirectory.cxx:1085
 TDirectory.cxx:1086
 TDirectory.cxx:1087
 TDirectory.cxx:1088
 TDirectory.cxx:1089
 TDirectory.cxx:1090
 TDirectory.cxx:1091
 TDirectory.cxx:1092
 TDirectory.cxx:1093
 TDirectory.cxx:1094
 TDirectory.cxx:1095
 TDirectory.cxx:1096
 TDirectory.cxx:1097
 TDirectory.cxx:1098
 TDirectory.cxx:1099
 TDirectory.cxx:1100
 TDirectory.cxx:1101
 TDirectory.cxx:1102
 TDirectory.cxx:1103
 TDirectory.cxx:1104
 TDirectory.cxx:1105
 TDirectory.cxx:1106
 TDirectory.cxx:1107
 TDirectory.cxx:1108
 TDirectory.cxx:1109
 TDirectory.cxx:1110
 TDirectory.cxx:1111
 TDirectory.cxx:1112
 TDirectory.cxx:1113
 TDirectory.cxx:1114
 TDirectory.cxx:1115
 TDirectory.cxx:1116
 TDirectory.cxx:1117
 TDirectory.cxx:1118
 TDirectory.cxx:1119
 TDirectory.cxx:1120
 TDirectory.cxx:1121
 TDirectory.cxx:1122
 TDirectory.cxx:1123
 TDirectory.cxx:1124
 TDirectory.cxx:1125
 TDirectory.cxx:1126
 TDirectory.cxx:1127
 TDirectory.cxx:1128
 TDirectory.cxx:1129
 TDirectory.cxx:1130
 TDirectory.cxx:1131
 TDirectory.cxx:1132
 TDirectory.cxx:1133
 TDirectory.cxx:1134
 TDirectory.cxx:1135
 TDirectory.cxx:1136
 TDirectory.cxx:1137
 TDirectory.cxx:1138
 TDirectory.cxx:1139
 TDirectory.cxx:1140
 TDirectory.cxx:1141
 TDirectory.cxx:1142
 TDirectory.cxx:1143
 TDirectory.cxx:1144
 TDirectory.cxx:1145
 TDirectory.cxx:1146
 TDirectory.cxx:1147
 TDirectory.cxx:1148
 TDirectory.cxx:1149
 TDirectory.cxx:1150
 TDirectory.cxx:1151
 TDirectory.cxx:1152
 TDirectory.cxx:1153
 TDirectory.cxx:1154
 TDirectory.cxx:1155
 TDirectory.cxx:1156
 TDirectory.cxx:1157
 TDirectory.cxx:1158
 TDirectory.cxx:1159
 TDirectory.cxx:1160
 TDirectory.cxx:1161
 TDirectory.cxx:1162
 TDirectory.cxx:1163
 TDirectory.cxx:1164
 TDirectory.cxx:1165
 TDirectory.cxx:1166
 TDirectory.cxx:1167
 TDirectory.cxx:1168
 TDirectory.cxx:1169
 TDirectory.cxx:1170
 TDirectory.cxx:1171
 TDirectory.cxx:1172
 TDirectory.cxx:1173
 TDirectory.cxx:1174
 TDirectory.cxx:1175
 TDirectory.cxx:1176
 TDirectory.cxx:1177
 TDirectory.cxx:1178
 TDirectory.cxx:1179
 TDirectory.cxx:1180
 TDirectory.cxx:1181
 TDirectory.cxx:1182
 TDirectory.cxx:1183
 TDirectory.cxx:1184
 TDirectory.cxx:1185
 TDirectory.cxx:1186
 TDirectory.cxx:1187
 TDirectory.cxx:1188
 TDirectory.cxx:1189
 TDirectory.cxx:1190
 TDirectory.cxx:1191
 TDirectory.cxx:1192
 TDirectory.cxx:1193
 TDirectory.cxx:1194
 TDirectory.cxx:1195
 TDirectory.cxx:1196
 TDirectory.cxx:1197
 TDirectory.cxx:1198
 TDirectory.cxx:1199
 TDirectory.cxx:1200
 TDirectory.cxx:1201
 TDirectory.cxx:1202
 TDirectory.cxx:1203
 TDirectory.cxx:1204
 TDirectory.cxx:1205
 TDirectory.cxx:1206
 TDirectory.cxx:1207
 TDirectory.cxx:1208
 TDirectory.cxx:1209
 TDirectory.cxx:1210
 TDirectory.cxx:1211
 TDirectory.cxx:1212
 TDirectory.cxx:1213
 TDirectory.cxx:1214
 TDirectory.cxx:1215
 TDirectory.cxx:1216
 TDirectory.cxx:1217
 TDirectory.cxx:1218