ROOT logo
//_HADES_CLASS_DESCRIPTION
/////////////////////////////////////////////////////////////
//
//  HTofTrb3Unpacker
//
//  Class for unpacking TRB3 data and filling
//    the Tof Raw category
//
//  Basic subevent decoding and eventual TDC corrections are
//  performed by decode function in the base class
//  see: /base/datasource/htrb3unpacker.h
//
/////////////////////////////////////////////////////////////

#include "hades.h"
#include "hcategory.h"
#include "hdebug.h"
#include "hevent.h"
#include "heventheader.h"
#include "hldsource.h"
#include "hldsubevt.h"
#include "hruntimedb.h"
#include "hspectrometer.h"
#include "htofdetector.h"
#include "htofraw.h"
#include "htofrawsim.h"
#include "htoftrb3lookup.h"
#include "htoftrb3unpacker.h"
#include "tofdef.h"
#include "htrbnetunpacker.h"

#include <iostream>

using namespace std;

ClassImp(HTofTrb3Unpacker)

// JAM: this little switch will enable that we also take single leading edges into account
//#define TOF_USE_LEADING_WITHOUT_TRAILING_EDGES 1

// JAM: this little switch will enable that we also take single trailing edges into account
//#define TOF_USE_TRAILING_WITHOUT_LEADING_EDGES 1

// switch on filtering of tdc messages with first time window as defined below
//#define TOF_USE_TIME_WINDOW 1

// first time window to filter out some unusable hits. units are nanoseconds relative to trigger (channel 0)
#define TOF_TIME_MIN -300.0
#define TOF_TIME_MAX  1500.0
// TODO: optionally put this into some parameter container.
Bool_t HTofTrb3Unpacker::fHasPrintedTDC = kFALSE;

HTofTrb3Unpacker::HTofTrb3Unpacker(vector<UInt_t>& ids) : HTrb3TdcUnpacker(ids),
    fLookup(0), fTimeRef(kTRUE), fTimeShift(0.) {
	// constructor
	pRawCat = NULL;
}

Bool_t HTofTrb3Unpacker::init(void) {
    // creates the raw category and gets the pointer to the TRB3 lookup table

    HTofDetector* det = (HTofDetector*) gHades->getSetup()->getDetector("Tof");
    if (!det) {
        Error("init", "No TOF Detector found.");
        return kFALSE;
    }

    if(gHades->getEmbeddingMode()==0) {
	pRawCat=gHades->getSetup()->getDetector("Tof")->buildCategory(catTofRaw);
    } else {
	pRawCat=((HTofDetector*)(gHades->getSetup()->getDetector("Tof")))->buildMatrixCategory("HTofRawSim",0.5F);
    }
    if (!pRawCat) return kFALSE;

    gHades->getCurrentEvent ()->addCategory (catTofRaw, pRawCat, "Tof");

    fLoc.set(3, 0, 0, 0);

    fLookup = (HTofTrb3Lookup*) (gHades->getRuntimeDb()->getContainer("TofTrb3Lookup"));
    if (!fLookup) {
        Error("init", "No Pointer to parameter container TofTrb3Lookup.");
        return kFALSE;
    }

    if (NULL == trbNetUnpacker) {
        if (gHades->getDataSource()) {
            HDataSource* source = gHades->getDataSource();
            if (source->InheritsFrom("HldSource")) {
                trbNetUnpacker =
                        ((HldSource *) gHades->getDataSource())->getTrbNetUnpacker();
            } else {
                Warning("init",
                        "DataSource not inherited from HldSource! trbNetUnpacker == 0 ");
            }
        } else {
            Warning("init",
                    "Could not retrieve DataSource! trbNetUnpacker == 0 ");
        }
    }

    if (!trbNetUnpacker->init()) {
        Error("init()", "Failed to initialize HTrbNetUnpacker!");
        return kFALSE;
    }

    return kTRUE;
}

Bool_t HTofTrb3Unpacker::reinit(void)
{
    // Called in the beginning of each run, used here to initialize TDC unpacker
    // if TDCs processors are not yet created, use parameter to instantiate them
    // if auto register TDC feature is used in setup of unpackers (by setting
    // setMinAddress()+setMaxAddress() manually)

    if (numTDC() == 0 )  // configure the tdcs only the first time we come here (do not if autoregister is used):
    {
	if (fMinAddress == 0 && fMaxAddress == 0)
	{
	    // here evaluate which subevents are configured in lookup table:
	    Int_t numTDC = fLookup->getSize();
	    Int_t offset = fLookup->getArrayOffset() ;
	    for (Int_t slot = 0; slot < numTDC; ++slot) {

		Int_t trbnetaddress = offset+slot;

		HTofTrb3LookupBoard* tdc = fLookup->getBoard(trbnetaddress);
		if(tdc){
		    Int_t nChan = tdc->getSize();
		    if (trbnetaddress) {
			Int_t tindex = addTDC(trbnetaddress,nChan);
			Info("reinit", "Added TDC 0x%04x with %d channels from HTofTrb3Lookup to map index %d",
			     trbnetaddress, nChan,tindex);
		    }
		}
	    }

	    // set the expected range for the automatic adding of TDC structures:

	    setMinAddress(fLookup->getArrayOffset());
	    setMaxAddress(fLookup->getArrayOffset() + fLookup->getSize());
	    fUseTDCFromLookup = kTRUE; // do not use auto register if set in
	    fHasPrintedTDC = kTRUE;

	} else {
            Info("reinit", "TDCs will be added in auto register mode between min address 0x%04x and max address 0x%04x!",fMinAddress,fMaxAddress);
	}
    }
    // we do not call reinit of superclass, since we do not use tdc calibration parameters in hydra anymore!
    return kTRUE;
}

Int_t HTofTrb3Unpacker::execute(void) {



    if (gHades->isCalibration()) {
        //calibration event
        return 1;
    }

    if (gHades->getCurrentEvent()->getHeader()->getId() == 0xe) {
        //scaler event
        return 1;
    }

    // if there is no data, do not try to analyze it
    // pSubEvt - make sure that there is something for decoding
    if (!pSubEvt)
        return 1;

    Int_t nEvt = gHades->getCurrentEvent()->getHeader()->getEventSeqNumber();

    // decodes the subevent and fill arrays, see: htrb3unpacker.h
    if (!decode()) {
        Error("decode",
                "subsubevent decoding failed!!! Evt Nr : %i SubEvtId: %x", nEvt,
                getSubEvtId());
        return -1;
    }

    // correct for reference time here!
    // we don't check for proper time reference correction
    // to avoid event skipping
    // this must be done better in future but now is a good workaround

    if (fTimeRef) {
        correctRefTimeCh(REFCHAN);
    }

    const Double_t timeUnit=1e9;


    for (UInt_t ntdc = 0; ntdc < numActiveTDC(); ntdc++) {
        HTrb3TdcUnpacker::TDC* tdc = getActiveTDC(ntdc);

        // check the lookup table
        HTofTrb3LookupBoard *board = fLookup->getBoard(tdc->getTrbAddr());
        if (!board) {
            if (debugFlag > 0)
                Warning("execute",
                        "Evt Nr : %i  SubEvId: %x (%i) unpacked but TDC Board 0x%x not in lookup table",
                        nEvt, getSubEvtId(), getSubEvtId(), tdc->getTrbAddr());
            continue;
        }

	// fill the raw category for RPC detector
        for (UInt_t i = 0; i < tdc->numChannels(); i++) {
            if(REFCHAN == i) continue;

	    HTrb3TdcUnpacker::ChannelRec& theRecord = tdc->getCh(i);

// ignore channels without rising hits already here
#ifndef TOF_USE_TRAILING_WITHOUT_LEADING_EDGES
            if (theRecord.rising_mult < 1)
                continue;
#endif
            HTofTrb3LookupChan *chan = board->getChannel(i);
            if (chan == 0) {
                Warning("execute", "Missing channel %u in lookup table", i);
                continue;
            }
            chan->getAddress(fLoc[0], fLoc[1], fLoc[2]);

	    // if channel not connected in lookup-table, ignore it
	    if (fLoc[0] < 0)  { // empty slot default is -1
		continue;
	    }
            /*
	    // exclude all not defined and broken channels
            if (!chan->isDefinedChannel() || chan->isBrokenChannel())
		continue;
            */

            //if (chan->getSide() == 'n' ) continue; // not connected

#ifdef TOF_USE_TIME_WINDOW
            // later we may get this from parameter container or other setup file. For the moment  fix it
            Double_t tmin = TOF_TIME_MIN;
            Double_t tmax = TOF_TIME_MAX;
#endif
            UInt_t lix = 0;
            for (lix = 0; lix < theRecord.rising_mult; ++lix) {
                Double_t tm0 = theRecord.rising_tm[lix] * timeUnit;
                if (debugFlag > 0)
                    Warning("execute", "JJJJ current hit leading: tm0:%e, apply time shift:%e", tm0, fTimeShift);
                tm0 +=fTimeShift;

#ifdef TOF_USE_TIME_WINDOW
                if ((tm0 < tmin) || (tm0 > tmax)) {
                    if (debugFlag > 0)
                        Warning("execute",
                                "JJJJ Rejecting leading hit outside tmin:%e or tmax:%e",
                                tmin, tmax);
                    continue; // leading edge outside the time window
                }

#endif
                // now look for corresponding trailing edge:
                if (lix < theRecord.falling_mult) {
                    Double_t tm1 = theRecord.falling_tm[lix] * timeUnit;
                    if (debugFlag > 0)
                        Warning("execute", "JJJJ current hit falling: tm1:%e, apply time shift:%e",
                                tm1, fTimeShift);
                    tm1 +=fTimeShift;


#ifdef TOF_USE_TIME_WINDOW
                    if ((tm1 < tmin) || (tm1 > tmax)) {
                        if (debugFlag > 0)
                            Warning("execute",
                                    "JJJJ Rejecting trailing hit outside tmin:%e or tmax:%e",
                                    tmin, tmax);

#ifdef TOF_USE_LEADING_WITHOUT_TRAILING_EDGES
                        tm1=0.0; // still we take incomplete leading edge
#else
                        continue; // skip both leading and trailing
#endif
                    } // if ((tm1 < tmin) || (tm1 > tmax))


#endif
                    //
                    // TODO: optional filter out hits that do not fulfill the time threshold parameter
                    //Double_t tot=tm1-tm0;
                    // however, this can be also done in subsequent calibrator object

/////// ACCEPTED HITS ARE HERE //////////////////////////////////
                    // regular case with leading/trailing edges of ChannelRec in order
                    if (addRawHit(tm0, tm1, chan) != 0)
                        continue; // we will skip this if this channel is not mapped to detector cell

////////// END ACCEPTED HITS/////////////////////////////////////
                } // if lix<theRecord.falling_mul
                else {
#ifdef TOF_USE_LEADING_WITHOUT_TRAILING_EDGES
                    // here we treat hist with only leading edges, no corresponding trailing edge
                    // such hit will deliver tot width of -1
                    if(addRawHit(tm0, 0.0, chan)!=0)
                    continue;
#endif
                }
            } // for lix

////////////// optional now check for single trailing edges?
#ifdef TOF_USE_TRAILING_WITHOUT_LEADING_EDGES

            for (UInt_t tix=lix; tix< theRecord.falling_mult; ++tix)
            {
                Double_t tm1=theRecord.falling_tm[tix] * timeUnit;

#ifdef TOF_USE_TIME_WINDOW
                    if ((tm1 < tmin) || (tm1 > tmax)) {

                        if (debugFlag > 0)
                            Warning("execute",
                                    "JJJJ Rejecting trailing hit outside tmin:%e or tmax:%e",
                                    tmin, tmax);
			continue;
#endif

                if(addRawHit(0.0, tm1, chan)!=0)
		    continue;
            }
             ////////////////////
#endif
/////////////// end single trailing edges


        } // loop over TDC channels
    } // loop over TDC
    return 1;
}

Int_t HTofTrb3Unpacker::addRawHit(Double_t t_leading, Double_t t_trailing,HTofTrb3LookupChan *chan)
{

    // from here we got access to TDC channel and should map it to RPC channel
    HTofRaw* raw = (HTofRaw*) pRawCat->getObject(fLoc);

    if (!raw) {
	raw = (HTofRaw *) pRawCat->getSlot(fLoc);
	if(gHades->getEmbeddingMode()==0) {
	    raw = new (raw) HTofRaw;
	} else{
	    raw=new (raw) HTofRawSim;
	}

	if(raw){
	    raw->setSector((Char_t)fLoc[0]);
	    raw->setModule((Char_t)fLoc[1]);
	    raw->setCell((Char_t)fLoc[2]);

	} else {
	    if (debugFlag > 0)
		Warning("addRawHit()", "Can't get slot sec=%i, column=%i, cell=%i",
			fLoc[0], fLoc[1],fLoc[2]);
	    return -1;
	}
    }

    Char_t side     = chan->getSide();

    if(side=='r') {
	raw->setRightTime(t_leading);
	raw->setRightCharge(t_trailing - t_leading);
    } else if (side=='l') {
	raw->setLeftTime(t_leading);
	raw->setLeftCharge(t_trailing - t_leading);
    }



    if (debugFlag > 1)
        Warning("addRawHit",
		"ADDING hit for sec:%d column:%d cell:%d tm0:%e tm1:%e",
		fLoc[0], fLoc[1], fLoc[2], t_leading, t_trailing);
    return 0;
}
 htoftrb3unpacker.cc:1
 htoftrb3unpacker.cc:2
 htoftrb3unpacker.cc:3
 htoftrb3unpacker.cc:4
 htoftrb3unpacker.cc:5
 htoftrb3unpacker.cc:6
 htoftrb3unpacker.cc:7
 htoftrb3unpacker.cc:8
 htoftrb3unpacker.cc:9
 htoftrb3unpacker.cc:10
 htoftrb3unpacker.cc:11
 htoftrb3unpacker.cc:12
 htoftrb3unpacker.cc:13
 htoftrb3unpacker.cc:14
 htoftrb3unpacker.cc:15
 htoftrb3unpacker.cc:16
 htoftrb3unpacker.cc:17
 htoftrb3unpacker.cc:18
 htoftrb3unpacker.cc:19
 htoftrb3unpacker.cc:20
 htoftrb3unpacker.cc:21
 htoftrb3unpacker.cc:22
 htoftrb3unpacker.cc:23
 htoftrb3unpacker.cc:24
 htoftrb3unpacker.cc:25
 htoftrb3unpacker.cc:26
 htoftrb3unpacker.cc:27
 htoftrb3unpacker.cc:28
 htoftrb3unpacker.cc:29
 htoftrb3unpacker.cc:30
 htoftrb3unpacker.cc:31
 htoftrb3unpacker.cc:32
 htoftrb3unpacker.cc:33
 htoftrb3unpacker.cc:34
 htoftrb3unpacker.cc:35
 htoftrb3unpacker.cc:36
 htoftrb3unpacker.cc:37
 htoftrb3unpacker.cc:38
 htoftrb3unpacker.cc:39
 htoftrb3unpacker.cc:40
 htoftrb3unpacker.cc:41
 htoftrb3unpacker.cc:42
 htoftrb3unpacker.cc:43
 htoftrb3unpacker.cc:44
 htoftrb3unpacker.cc:45
 htoftrb3unpacker.cc:46
 htoftrb3unpacker.cc:47
 htoftrb3unpacker.cc:48
 htoftrb3unpacker.cc:49
 htoftrb3unpacker.cc:50
 htoftrb3unpacker.cc:51
 htoftrb3unpacker.cc:52
 htoftrb3unpacker.cc:53
 htoftrb3unpacker.cc:54
 htoftrb3unpacker.cc:55
 htoftrb3unpacker.cc:56
 htoftrb3unpacker.cc:57
 htoftrb3unpacker.cc:58
 htoftrb3unpacker.cc:59
 htoftrb3unpacker.cc:60
 htoftrb3unpacker.cc:61
 htoftrb3unpacker.cc:62
 htoftrb3unpacker.cc:63
 htoftrb3unpacker.cc:64
 htoftrb3unpacker.cc:65
 htoftrb3unpacker.cc:66
 htoftrb3unpacker.cc:67
 htoftrb3unpacker.cc:68
 htoftrb3unpacker.cc:69
 htoftrb3unpacker.cc:70
 htoftrb3unpacker.cc:71
 htoftrb3unpacker.cc:72
 htoftrb3unpacker.cc:73
 htoftrb3unpacker.cc:74
 htoftrb3unpacker.cc:75
 htoftrb3unpacker.cc:76
 htoftrb3unpacker.cc:77
 htoftrb3unpacker.cc:78
 htoftrb3unpacker.cc:79
 htoftrb3unpacker.cc:80
 htoftrb3unpacker.cc:81
 htoftrb3unpacker.cc:82
 htoftrb3unpacker.cc:83
 htoftrb3unpacker.cc:84
 htoftrb3unpacker.cc:85
 htoftrb3unpacker.cc:86
 htoftrb3unpacker.cc:87
 htoftrb3unpacker.cc:88
 htoftrb3unpacker.cc:89
 htoftrb3unpacker.cc:90
 htoftrb3unpacker.cc:91
 htoftrb3unpacker.cc:92
 htoftrb3unpacker.cc:93
 htoftrb3unpacker.cc:94
 htoftrb3unpacker.cc:95
 htoftrb3unpacker.cc:96
 htoftrb3unpacker.cc:97
 htoftrb3unpacker.cc:98
 htoftrb3unpacker.cc:99
 htoftrb3unpacker.cc:100
 htoftrb3unpacker.cc:101
 htoftrb3unpacker.cc:102
 htoftrb3unpacker.cc:103
 htoftrb3unpacker.cc:104
 htoftrb3unpacker.cc:105
 htoftrb3unpacker.cc:106
 htoftrb3unpacker.cc:107
 htoftrb3unpacker.cc:108
 htoftrb3unpacker.cc:109
 htoftrb3unpacker.cc:110
 htoftrb3unpacker.cc:111
 htoftrb3unpacker.cc:112
 htoftrb3unpacker.cc:113
 htoftrb3unpacker.cc:114
 htoftrb3unpacker.cc:115
 htoftrb3unpacker.cc:116
 htoftrb3unpacker.cc:117
 htoftrb3unpacker.cc:118
 htoftrb3unpacker.cc:119
 htoftrb3unpacker.cc:120
 htoftrb3unpacker.cc:121
 htoftrb3unpacker.cc:122
 htoftrb3unpacker.cc:123
 htoftrb3unpacker.cc:124
 htoftrb3unpacker.cc:125
 htoftrb3unpacker.cc:126
 htoftrb3unpacker.cc:127
 htoftrb3unpacker.cc:128
 htoftrb3unpacker.cc:129
 htoftrb3unpacker.cc:130
 htoftrb3unpacker.cc:131
 htoftrb3unpacker.cc:132
 htoftrb3unpacker.cc:133
 htoftrb3unpacker.cc:134
 htoftrb3unpacker.cc:135
 htoftrb3unpacker.cc:136
 htoftrb3unpacker.cc:137
 htoftrb3unpacker.cc:138
 htoftrb3unpacker.cc:139
 htoftrb3unpacker.cc:140
 htoftrb3unpacker.cc:141
 htoftrb3unpacker.cc:142
 htoftrb3unpacker.cc:143
 htoftrb3unpacker.cc:144
 htoftrb3unpacker.cc:145
 htoftrb3unpacker.cc:146
 htoftrb3unpacker.cc:147
 htoftrb3unpacker.cc:148
 htoftrb3unpacker.cc:149
 htoftrb3unpacker.cc:150
 htoftrb3unpacker.cc:151
 htoftrb3unpacker.cc:152
 htoftrb3unpacker.cc:153
 htoftrb3unpacker.cc:154
 htoftrb3unpacker.cc:155
 htoftrb3unpacker.cc:156
 htoftrb3unpacker.cc:157
 htoftrb3unpacker.cc:158
 htoftrb3unpacker.cc:159
 htoftrb3unpacker.cc:160
 htoftrb3unpacker.cc:161
 htoftrb3unpacker.cc:162
 htoftrb3unpacker.cc:163
 htoftrb3unpacker.cc:164
 htoftrb3unpacker.cc:165
 htoftrb3unpacker.cc:166
 htoftrb3unpacker.cc:167
 htoftrb3unpacker.cc:168
 htoftrb3unpacker.cc:169
 htoftrb3unpacker.cc:170
 htoftrb3unpacker.cc:171
 htoftrb3unpacker.cc:172
 htoftrb3unpacker.cc:173
 htoftrb3unpacker.cc:174
 htoftrb3unpacker.cc:175
 htoftrb3unpacker.cc:176
 htoftrb3unpacker.cc:177
 htoftrb3unpacker.cc:178
 htoftrb3unpacker.cc:179
 htoftrb3unpacker.cc:180
 htoftrb3unpacker.cc:181
 htoftrb3unpacker.cc:182
 htoftrb3unpacker.cc:183
 htoftrb3unpacker.cc:184
 htoftrb3unpacker.cc:185
 htoftrb3unpacker.cc:186
 htoftrb3unpacker.cc:187
 htoftrb3unpacker.cc:188
 htoftrb3unpacker.cc:189
 htoftrb3unpacker.cc:190
 htoftrb3unpacker.cc:191
 htoftrb3unpacker.cc:192
 htoftrb3unpacker.cc:193
 htoftrb3unpacker.cc:194
 htoftrb3unpacker.cc:195
 htoftrb3unpacker.cc:196
 htoftrb3unpacker.cc:197
 htoftrb3unpacker.cc:198
 htoftrb3unpacker.cc:199
 htoftrb3unpacker.cc:200
 htoftrb3unpacker.cc:201
 htoftrb3unpacker.cc:202
 htoftrb3unpacker.cc:203
 htoftrb3unpacker.cc:204
 htoftrb3unpacker.cc:205
 htoftrb3unpacker.cc:206
 htoftrb3unpacker.cc:207
 htoftrb3unpacker.cc:208
 htoftrb3unpacker.cc:209
 htoftrb3unpacker.cc:210
 htoftrb3unpacker.cc:211
 htoftrb3unpacker.cc:212
 htoftrb3unpacker.cc:213
 htoftrb3unpacker.cc:214
 htoftrb3unpacker.cc:215
 htoftrb3unpacker.cc:216
 htoftrb3unpacker.cc:217
 htoftrb3unpacker.cc:218
 htoftrb3unpacker.cc:219
 htoftrb3unpacker.cc:220
 htoftrb3unpacker.cc:221
 htoftrb3unpacker.cc:222
 htoftrb3unpacker.cc:223
 htoftrb3unpacker.cc:224
 htoftrb3unpacker.cc:225
 htoftrb3unpacker.cc:226
 htoftrb3unpacker.cc:227
 htoftrb3unpacker.cc:228
 htoftrb3unpacker.cc:229
 htoftrb3unpacker.cc:230
 htoftrb3unpacker.cc:231
 htoftrb3unpacker.cc:232
 htoftrb3unpacker.cc:233
 htoftrb3unpacker.cc:234
 htoftrb3unpacker.cc:235
 htoftrb3unpacker.cc:236
 htoftrb3unpacker.cc:237
 htoftrb3unpacker.cc:238
 htoftrb3unpacker.cc:239
 htoftrb3unpacker.cc:240
 htoftrb3unpacker.cc:241
 htoftrb3unpacker.cc:242
 htoftrb3unpacker.cc:243
 htoftrb3unpacker.cc:244
 htoftrb3unpacker.cc:245
 htoftrb3unpacker.cc:246
 htoftrb3unpacker.cc:247
 htoftrb3unpacker.cc:248
 htoftrb3unpacker.cc:249
 htoftrb3unpacker.cc:250
 htoftrb3unpacker.cc:251
 htoftrb3unpacker.cc:252
 htoftrb3unpacker.cc:253
 htoftrb3unpacker.cc:254
 htoftrb3unpacker.cc:255
 htoftrb3unpacker.cc:256
 htoftrb3unpacker.cc:257
 htoftrb3unpacker.cc:258
 htoftrb3unpacker.cc:259
 htoftrb3unpacker.cc:260
 htoftrb3unpacker.cc:261
 htoftrb3unpacker.cc:262
 htoftrb3unpacker.cc:263
 htoftrb3unpacker.cc:264
 htoftrb3unpacker.cc:265
 htoftrb3unpacker.cc:266
 htoftrb3unpacker.cc:267
 htoftrb3unpacker.cc:268
 htoftrb3unpacker.cc:269
 htoftrb3unpacker.cc:270
 htoftrb3unpacker.cc:271
 htoftrb3unpacker.cc:272
 htoftrb3unpacker.cc:273
 htoftrb3unpacker.cc:274
 htoftrb3unpacker.cc:275
 htoftrb3unpacker.cc:276
 htoftrb3unpacker.cc:277
 htoftrb3unpacker.cc:278
 htoftrb3unpacker.cc:279
 htoftrb3unpacker.cc:280
 htoftrb3unpacker.cc:281
 htoftrb3unpacker.cc:282
 htoftrb3unpacker.cc:283
 htoftrb3unpacker.cc:284
 htoftrb3unpacker.cc:285
 htoftrb3unpacker.cc:286
 htoftrb3unpacker.cc:287
 htoftrb3unpacker.cc:288
 htoftrb3unpacker.cc:289
 htoftrb3unpacker.cc:290
 htoftrb3unpacker.cc:291
 htoftrb3unpacker.cc:292
 htoftrb3unpacker.cc:293
 htoftrb3unpacker.cc:294
 htoftrb3unpacker.cc:295
 htoftrb3unpacker.cc:296
 htoftrb3unpacker.cc:297
 htoftrb3unpacker.cc:298
 htoftrb3unpacker.cc:299
 htoftrb3unpacker.cc:300
 htoftrb3unpacker.cc:301
 htoftrb3unpacker.cc:302
 htoftrb3unpacker.cc:303
 htoftrb3unpacker.cc:304
 htoftrb3unpacker.cc:305
 htoftrb3unpacker.cc:306
 htoftrb3unpacker.cc:307
 htoftrb3unpacker.cc:308
 htoftrb3unpacker.cc:309
 htoftrb3unpacker.cc:310
 htoftrb3unpacker.cc:311
 htoftrb3unpacker.cc:312
 htoftrb3unpacker.cc:313
 htoftrb3unpacker.cc:314
 htoftrb3unpacker.cc:315
 htoftrb3unpacker.cc:316
 htoftrb3unpacker.cc:317
 htoftrb3unpacker.cc:318
 htoftrb3unpacker.cc:319
 htoftrb3unpacker.cc:320
 htoftrb3unpacker.cc:321
 htoftrb3unpacker.cc:322
 htoftrb3unpacker.cc:323
 htoftrb3unpacker.cc:324
 htoftrb3unpacker.cc:325
 htoftrb3unpacker.cc:326
 htoftrb3unpacker.cc:327
 htoftrb3unpacker.cc:328
 htoftrb3unpacker.cc:329
 htoftrb3unpacker.cc:330
 htoftrb3unpacker.cc:331
 htoftrb3unpacker.cc:332
 htoftrb3unpacker.cc:333
 htoftrb3unpacker.cc:334
 htoftrb3unpacker.cc:335
 htoftrb3unpacker.cc:336
 htoftrb3unpacker.cc:337
 htoftrb3unpacker.cc:338
 htoftrb3unpacker.cc:339
 htoftrb3unpacker.cc:340
 htoftrb3unpacker.cc:341
 htoftrb3unpacker.cc:342
 htoftrb3unpacker.cc:343
 htoftrb3unpacker.cc:344
 htoftrb3unpacker.cc:345
 htoftrb3unpacker.cc:346
 htoftrb3unpacker.cc:347
 htoftrb3unpacker.cc:348
 htoftrb3unpacker.cc:349
 htoftrb3unpacker.cc:350
 htoftrb3unpacker.cc:351
 htoftrb3unpacker.cc:352
 htoftrb3unpacker.cc:353
 htoftrb3unpacker.cc:354
 htoftrb3unpacker.cc:355
 htoftrb3unpacker.cc:356
 htoftrb3unpacker.cc:357
 htoftrb3unpacker.cc:358
 htoftrb3unpacker.cc:359
 htoftrb3unpacker.cc:360
 htoftrb3unpacker.cc:361
 htoftrb3unpacker.cc:362
 htoftrb3unpacker.cc:363
 htoftrb3unpacker.cc:364
 htoftrb3unpacker.cc:365
 htoftrb3unpacker.cc:366
 htoftrb3unpacker.cc:367
 htoftrb3unpacker.cc:368
 htoftrb3unpacker.cc:369
 htoftrb3unpacker.cc:370
 htoftrb3unpacker.cc:371
 htoftrb3unpacker.cc:372
 htoftrb3unpacker.cc:373
 htoftrb3unpacker.cc:374
 htoftrb3unpacker.cc:375
 htoftrb3unpacker.cc:376
 htoftrb3unpacker.cc:377
 htoftrb3unpacker.cc:378
 htoftrb3unpacker.cc:379
 htoftrb3unpacker.cc:380