ROOT logo
// $Id: ZGlass.cxx 2606 2011-12-07 23:11:39Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

#include "ZGlass.h"
#include "ZGlass.c7"

#include <Glasses/AList.h>
#include <Glasses/ZQueen.h>
#include <Glasses/ZKing.h>
#include <Glasses/ZMirFilter.h>
#include "Eye/Ray.h"
#include <Stones/ZComet.h>
#include <Gled/GThread.h>

//______________________________________________________________________
//
// Base class of Gled enabled classes.
// Provides infrastructure for integration with the Gled system.
//
// mGlassBits: collection of internal lens flags shared also with ZQueen.

ClassImp(ZGlass);

/**************************************************************************/

void ZGlass::_init()
{
  mSaturn = 0; mQueen = 0;
  mGlassBits = 0; mSaturnID=0;
  mGuard = 0;
  bMIRActive = true; bAcceptRefs = true;
  mRefCount = mMoonRefCount = mSunRefCount = mFireRefCount = mEyeRefCount = 0;
  mTimeStamp = mStampReqTring = 0;
  pspRayAbsorber  = 0;
  pspNameChangeCB = 0;

  bUseDispList  = false;
  bUseNameStack = true;
}

ZGlass::~ZGlass()
{
  delete pspNameChangeCB;
}

/**************************************************************************/

void ZGlass::queen_check_in(ZGlass* l)
{
  // Needed to be able to check-in lenses from inline functions without
  // including ZQueen.h.

  mQueen->CheckIn(l);
}

void ZGlass::set_link_or_die(ZGlass*& link, ZGlass* new_val, FID_t fid)
{
  if(link == new_val) return;
  if(link) link->DecRefCount(this);
  if(new_val) {
    try { new_val->IncRefCount(this); }
    catch(...) {
      if(link) { link = 0; StampLink(fid); }
      throw;
    }
  }
  link = new_val;
  StampLink(fid);
}

/**************************************************************************/

void ZGlass::reference_all()
{
  reference_links();
}

void ZGlass::unreference_all()
{
  unreference_links();
}

void ZGlass::reference_links()
{
  lppZGlass_t link_refs;
  CopyLinkRefs(link_refs);
  for(lppZGlass_i i=link_refs.begin(); i!=link_refs.end(); ++i) {
    if(**i) {
      try {
	(**i)->IncRefCount(this);
      }
      catch(Exc_t& exc) {
	**i = 0;
      }
    }
  }
}

void ZGlass::unreference_links() {
  lppZGlass_t link_refs;
  CopyLinkRefs(link_refs);
  for(lppZGlass_i i=link_refs.begin(); i!=link_refs.end(); ++i) {
    if(**i) {
      (**i)->DecRefCount(this);
    }
  }
}

/**************************************************************************/

Int_t ZGlass::remove_references_to(ZGlass* lens)
{
  // Removes link references to *lens*.
  // Virtual ... lists overrirde it but also call the link version
  // for unreferencing of links.
  // Emits Rays, but does NOT call DecRefCount: this is done by wrapper
  // RemoveReferencesTo() (and sometimes by ZQueen during lens delition).

  lppZGlass_t link_refs;
  CopyLinkRefs(link_refs);
  Int_t n = 0;
  for(lppZGlass_i i=link_refs.begin(); i!=link_refs.end(); ++i) {
    if(**i == lens) {
      **i = 0;
      ++n;
    }
  }
  if(n) StampLink();
  return n;
}

/**************************************************************************/
// Public methods
/**************************************************************************/

Int_t ZGlass::RebuildAllRefs(An_ID_Demangler* idd)
{
  return RebuildLinkRefs(idd);
}

/**************************************************************************/

TString ZGlass::Identify() const
{
  return TString(GForm("'%s'[%d]", mName.Data(), mSaturnID));
}

/**************************************************************************/

void ZGlass::WriteLock()
{
  if (mQueen) mQueen->SubjectWriteLock();
  ReadLock();
}

void ZGlass::WriteUnlock()
{
  ReadUnlock();
  if (mQueen) mQueen->SubjectWriteUnlock();
}


/**************************************************************************/

ZMIR* ZGlass::get_MIR()
{
  return GThread::MIR();
}

ZMIR* ZGlass::assert_MIR_presence(const Exc_t& header, int what)
{
  ZMIR* mir = GThread::MIR();

  if (mir == 0)
    throw header + "must be called via a MIR.";

  if ((what & MC_IsFlare) && mir->HasRecipient())
    throw header + "must be called via a flared MIR.";

  if ((what & MC_IsBeam) && !mir->HasRecipient())
    throw header + "must be called via a beamed MIR.";

  if ((what & MC_HasResultReq) && !mir->HasResultReq())
    throw header + "must be called with a result request set.";

  if ((what & MC_IsDetached) && !mir->ShouldExeDetached())
    throw header + "must be called in a deteched thread.";

  return mir;
}

ZMIR* ZGlass::suggest_MIR_presence(const Exc_t& header, int what)
{
  ZMIR* mir = GThread::MIR();

  if (mir == 0)
  {
    ISwarn(header + "should be called via a MIR.");
    return 0;
  }

  if ((what & MC_IsFlare) && mir->HasRecipient())
    ISwarn(header + "should be called via a flared MIR.");

  if ((what & MC_IsBeam) && !mir->HasRecipient())
    ISwarn(header + "should be called via a beamed MIR.");

  if ((what & MC_HasResultReq) && !mir->HasResultReq())
    ISwarn(header + "should be called with a result request set.");

  if ((what & MC_IsDetached) && !mir->ShouldExeDetached())
    ISwarn(header + "must be called in a deteched thread.");

  return mir;
}

void ZGlass::warn_caller(const TString& warning)
{
  ZMIR* mir = GThread::MIR();
  if (mir && mir->fCaller) {
    auto_ptr<ZMIR> wrn( mir->fCaller->S_Warning(warning.Data()) );
    wrn->SetRecipient(mir->fCaller->HostingSaturn());
    mSaturn->ShootMIR(wrn);
  } else {
    ISwarn(warning);
  }
}

/**************************************************************************/

void ZGlass::SetName(const Text_t* n)
{
  static const Exc_t _eh("ZGlass::SetName ");

  if (CheckBit(kFixedNameBit)) {
    Stamp(FID());
    throw _eh + "lens has FixedName bit set.";
  }
  TString name(n);
  if (pspNameChangeCB != 0)
  {
    for (set<NameChangeCB*>::iterator i = pspNameChangeCB->begin();
	i != pspNameChangeCB->end(); ++i)
    {
	(*i)->name_change_cb(this, name);
    }
  }
  mName = name.Data();
  Stamp(FID());

  if (mQueen == this) {
    ZMIR* mir = get_MIR();
    if(mir && ! mir->HasRecipient()) mQueen->BasicQueenChange(*mir);
  }
}

void ZGlass::SetTitle(const Text_t* t)
{
  mTitle = t;
  Stamp(FID());

  if (mQueen == this) {
    ZMIR* mir = get_MIR();
    if(mir && ! mir->HasRecipient()) mQueen->BasicQueenChange(*mir);
  }
}

/**************************************************************************/

ZMirFilter* ZGlass::GetGuard()
{
  return mGuard.get();
}

void ZGlass::SetGuard(ZMirFilter* guard)
{
  // Might want to read-lock if LOCK_SET_METHS is true in project7.
  set_link_or_die(mGuard.ref_link(), guard, FID());
}

/**************************************************************************/

void ZGlass::UpdateGlassView()
{
  if(mQueen && mSaturn->AcceptsRays()) {
    auto_ptr<Ray> ray
      (Ray::PtrCtor(this, RayNS::RQN_change, mTimeStamp, FID()));
    mQueen->EmitRay(ray);
  }
}

void ZGlass::UpdateAllViews()
{
  if(mQueen && mSaturn->AcceptsRays()) {
    auto_ptr<Ray> ray
      (Ray::PtrCtor(this, RayNS::RQN_change, mTimeStamp, FID_t(0,0)));
    mQueen->EmitRay(ray);
  }
}

void ZGlass::ReTriangulate()
{
  mStampReqTring = Stamp();
}

void ZGlass::RebuildRnrScheme()
{
  Stamp(FID_t(0,0), 0x1);
}

/**************************************************************************/

bool ZGlass::IsSunSpace()
{
  // Returns true if this lens is in local Saturn's sun-space.

  ZKing* sk = mSaturn->GetKing();
  return (mSaturnID >= sk->GetMinID() && mSaturnID <= sk->GetMaxID());
}

bool ZGlass::IsSunOrFireSpace()
{
  // Returns true if this lens is in local Saturn's sun or fire-space.

  return (mSaturnID >= mSaturn->GetKing()->GetMinID());
}

/**************************************************************************/

Short_t ZGlass::IncRefCount(ZGlass* from)
{
  // Called to notify *this* that *from* desires to reference it.
  // Throws an exception if the reference is not allowed by *this*
  // lens or its queen.

  static const Exc_t _eh("ZGlass::IncRefCount ");

  if(mQueen && from->mQueen) {
    mQueen->SubjectRefCntLock();
    // !!! Here ask queen if it's OK
    if(!bAcceptRefs) {
      mQueen->SubjectRefCntUnlock();
      throw(_eh + "lens not accepting references.");
    }
    switch(from->mQueen->GetKing()->GetLightType()) {
    case ZKing::LT_Moon: ++mMoonRefCount; break;
    case ZKing::LT_Sun:  ++mSunRefCount;  break;
    case ZKing::LT_Fire:
    default:		 ++mFireRefCount; break;
    }
    ++mRefCount;
    ++mReverseRefs[from];
    mQueen->SubjectRefCntUnlock();
    // Stamp(FID());
  }
  return mRefCount;
}

void ZGlass::dec_ref_count(hpZGlass2Int_i& i, UShort_t n)
{
  switch(i->first->mQueen->GetKing()->GetLightType()) {
  case ZKing::LT_Moon: mMoonRefCount -= n; break;
  case ZKing::LT_Sun:  mSunRefCount  -= n; break;
  case ZKing::LT_Fire:
  default:	       mFireRefCount -= n; break;
  }
  mRefCount -= n;
  i->second -= n;
}

Short_t ZGlass::DecRefCount(ZGlass* from, UShort_t n)
{
  // Called to notify *this* that it is no longer referenced by lens from.

  static const Exc_t _eh("ZGlass::DecRefCount ");

  if (mQueen && from->mQueen)
  {
    mQueen->SubjectRefCntLock();

    hpZGlass2Int_i i = mReverseRefs.find(from);
    if (i == mReverseRefs.end()) {
      mQueen->SubjectRefCntUnlock();
      ISerr(_eh + Identify() + " not referenced by " + from->Identify() + ".");
      return mRefCount;
    }
    if (n > i->second) {
      ISwarn(_eh + GForm("%s, called by %s: mismatch %d > %d.", Identify().Data(),
			 from->Identify().Data(), n, i->second));
      n = i->second;
    }

    dec_ref_count(i, n);

    if (i->second <= 0) mReverseRefs.erase(i);
    if (mRefCount == 0 && mQueen) mQueen->ZeroRefCount(this);
    mQueen->SubjectRefCntUnlock();
    // Stamp(FID());
  }
  return mRefCount;
}

Short_t ZGlass::IncEyeRefCount()
{
  return __sync_add_and_fetch(&mEyeRefCount, 1);
}

Short_t ZGlass::DecEyeRefCount()
{
  return __sync_sub_and_fetch(&mEyeRefCount, 1);
}

/**************************************************************************/

void ZGlass::ClearLinks()
{
  lppZGlass_t link_refs;
  CopyLinkRefs(link_refs);
  int n = 0;
  for(lppZGlass_i i=link_refs.begin(); i!=link_refs.end(); ++i) {
    if(**i) {
      (**i)->DecRefCount(this);
      **i = 0;
      ++n;
    }
  }
  if(n) StampLink();
}

void ZGlass::ClearAllReferences()
{
  ClearLinks();
}

Int_t ZGlass::RemoveReferencesTo(ZGlass* lens)
{
  Int_t n = remove_references_to(lens);
  if(n) lens->DecRefCount(this, n);
  return n;
}

/**************************************************************************/

ZGlass* ZGlass::GetLinkByName(const TString& link_name)
{
  // Returns glass pointed to by link with name link_name.
  // Attempts link_name == LinkMemberName and
  // link_name == Class::LinkMemberName.
  // Throws an exception (TString) if link does not exist.
  // In principle could have a map link-name->link-specs.

  // Should go in reverse direction !!!!
  // Locking doesn't make much sense.

  static const Exc_t _eh("ZGlass::GetLinkByName ");

  lLinkRep_t lr; CopyLinkReps(lr);
  for(lLinkRep_i i=lr.begin(); i!=lr.end(); ++i) {
    if(link_name == i->fLinkInfo->fName || link_name == i->fLinkInfo->FullName())
      return i->fLinkRef;
  }
  throw(_eh + GForm("link '%s' does not exist in '%s' (id=%u)",
		    link_name.Data(), GetName(), GetSaturnID()));
}

ZGlass* ZGlass::FindLensByPath(const TString& url, bool throwp)
{
  static const Exc_t _eh("ZGlass::FindLensByPath ");
  using namespace GledNS;

  list<url_token> tokens;
  tokenize_url(url, tokens);
  ZGlass* g = this;
  try {
    for(list<url_token>::iterator i=tokens.begin(); i!=tokens.end(); ++i) {
      assert(g != 0);
      switch (i->type()) {
      case url_token::link_sel: {
	ZGlass* lnk = g->GetLinkByName(*i);
	if(lnk == 0)
	  throw(_eh + "link '" + *i + "' of lens '" + g->Identify() + "' not set.");
	g = lnk;
	break;
      }
      case url_token::list_sel: {
	AList* l = g->AsAList();
	if(l == 0) {
	  throw(_eh + "url element '" + g->Identify() + "' is not a list.");
	}
	ZGlass* elm = l->GetElementByName(*i);
	if(elm == 0)
	  throw(_eh + "list " + g->Identify() + " does not have element '" + *i + "'.");
	g = elm;
	break;
      }
      default:
	throw(_eh + "unknown token type.");
	break;
      }
    }
  }
  catch(Exc_t& exc) {
    if(throwp) {
      ISerr(exc);
      throw;
    } else
      return 0;
  }
  return g;
}

/**************************************************************************/
// RayAbsorber

void ZGlass::register_ray_absorber(RayAbsorber* ra)
{
  GMutexHolder rdlck(mReadMutex);
  if(pspRayAbsorber == 0)
    pspRayAbsorber = new set<RayAbsorber*>;
  pspRayAbsorber->insert(ra);
}

void ZGlass::unregister_ray_absorber(RayAbsorber* ra)
{
  GMutexHolder rdlck(mReadMutex);
  if(pspRayAbsorber != 0)
    pspRayAbsorber->erase(ra);
}

/**************************************************************************/
// YNameChangeCB

void ZGlass::register_name_change_cb(ZGlass::NameChangeCB* nccb)
{
  if (CheckBit(kFixedNameBit)) return;
  GMutexHolder rdlck(mReadMutex);
  if (pspNameChangeCB == 0)
    pspNameChangeCB = new set<NameChangeCB*>;
  pspNameChangeCB->insert(nccb);
}

void ZGlass::unregister_name_change_cb(ZGlass::NameChangeCB* nccb)
{
  GMutexHolder rdlck(mReadMutex);
  if (pspNameChangeCB != 0) {
    pspNameChangeCB->erase(nccb);
    if (pspNameChangeCB->empty()) {
      delete pspNameChangeCB;
      pspNameChangeCB = 0;
    }
  } 
}

/**************************************************************************/
// Stamping

TimeStamp_t ZGlass::Stamp(FID_t fid, UChar_t eye_bits)
{
  TimeStamp_t stamp = ++mTimeStamp;
  IF_ZGLASS_CHANGE_RAY(this, RayNS::RQN_change, stamp, fid, eye_bits) {
    ZGLASS_SEND_RAY;
  }
  return stamp;
}

TimeStamp_t ZGlass::StampLink(FID_t fid)
{
  TimeStamp_t stamp = ++mTimeStamp;
  IF_ZGLASS_RAY(this, RayNS::RQN_link_change, stamp, fid,
		Ray::EB_StructuralChange) {
    ZGLASS_SEND_RAY;
  }
  return stamp;
}

/**************************************************************************/

void ZGlass::SetUseDLRec(Bool_t state)
{
  {
    GLensReadHolder rdlck(this);
    if(bUseDispList != state)
      SetUseDispList(state);
  }
  AList* l = AsAList();
  if(l != 0) {
    lpZGlass_t c; l->CopyList(c);
    for(lpZGlass_i i=c.begin(); i!=c.end(); ++i) {
      if((*i)->mQueen == mQueen)
	(*i)->SetUseDLRec(state);
    }
  }
}

/**************************************************************************/
/**************************************************************************/
// ZLinkBase
/**************************************************************************/
/**************************************************************************/

ID_t ZLinkBase::get_id()
{
  return (ID_t) ((char*)_lens - (char*)0);
}

void ZLinkBase::set_id(ID_t id)
{
  char* ptr = 0; ptr += id;
  _lens = (ZGlass*)ptr;
}


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