////////////////////////////////////////////////////////
// Batch commands for particle and value operations
//
// This class allows for particle operations for
// analysing angles, masses, or making boost and
// rotations of TLorentzVectors/PParticles
//
// It is used for the PProjector to make histograms
// _inside_ the event loop without the need of an
// analysis macro
//
// The syntax is inspired by C++, but only a few
// rules of C++ have been implemented. Furthermore, the syntax
// has been simplified to make it more readable, and an interface
// to the particle input (and maybe to the database in a later step)
// has been foreseen
//  
// As usual we have assignments, operators, functions and methods
// Each operation can be seperated by a semicolon (;)
//
// A simple case is outlined in the following command
// _x = [p,1]->M();
// This means that the double _x (which is automatically constructed)
// is assigned to the mass of the particle [p,1]
// Particle in brackets are the only allowed use without instantiantion
// as they are (hopefully) filled by the input. The additional number 
// can be used for ordering information
//
// + and - operation
// This adds/subtracts PParticles or doubles:
// pp = [p,1] + [p,2];
// ...nothing else then the pp composite
// _x = pp->M();
// gives the invariant mass of the pp pair
// CAVEAT: Do _not_ use object name which are
// already assigned to particles in the data base, e.g.
// pi0=[pi0] is not allowed, use _pi0=[pi0] instead
// 
// Brackets: Objects can be nested:
// _x = ([p,1] + [p,2])->M();
// ...makes the same as the 2 lines above
//
// Build-in methods:
// M()              : Invariant mass of the object
// M2()             : Invariant mass^2 of the object
// Boost(obj)       : Boost into rest frame of "obj"
//   Example:
//   pp = p1->Boost([p,1] + [p,2]);
//   ...boost p1 in the rest frame of [p,1]+[p,2]
// Rot(obj)         : Rotate object such that obj
//                    would point to z-Direction
// Angle(obj)       : Opening angle between obj
// Theta()          : Theta of momentum
// Print()          : Dump 4momentum or double
//
// In addition, all browsable methods of the class PParticle
// can be used (functions without arguments)
//
// Example:
// obj->Px();
//
// Build-in functions:
// cos()
// fabs()
//
// In addition, the TFormula syntax can be used
//
// Example:
// val_new = (val + 1.2);
// val = (val * TMath::Pi());
//
// Conditions:
// if(arg)          : Interrupts the current chain if arg == 0
//
// A very complex example: Look for the helicity distribution
// of the e+e- pair in the eta Dalitz decay
// _eta=[eta]; _ep=[e+]; _em=[e-]; 
// _eta->Boost([p + p]); _em->Boost([p + p]); _ep->Boost([p + p]); 
// _ep->Rot(_eta); _em->Rot(_eta); _eta->Rot(_eta) ; 
// _ep->Boost(_eta); _em->Boost(_eta); dil=_ep+_em; 
// _ep->Rot(dil); _em->Rot(dil); dil->Rot(dil); _ep->Boost(dil); _em->Boost(dil) ; 
// s1= _ep->Theta(); _x = cos(s1)
//
//
//                    Author: I. Froehlich
//                    Written: 14.02.2008
//                    Revised: 
//
////////////////////////////////////////////////////////

//makeDataBase()->ListEntries(-1,1,"name,*batch_particle,*pid,*batch_value");

#include "PBatch.h"
#include "TString.h"
#include "PUtils.h"
#include "TObjArray.h"
#include "TObjString.h"
#include "PParticle.h"
#include "PStaticData.h"
#include "PChannelModel.h"

#include "TClass.h"
#include "TMethod.h"

#include <cmath>

Int_t PBatch::stack_num_pos = 0;
Int_t PBatch::stack_num_batch[MAX_STACK_GOSUB], 
    PBatch::stack_num_bulk[MAX_STACK_GOSUB], 
    PBatch::stack_num_command[MAX_STACK_GOSUB];

PBatch &fBatch() {
    static PBatch *ans = new PBatch();
    return *ans;
}

PBatch *makeGlobalBatch() {
    return &fBatch();
}

PBatch::PBatch() {

    makeStaticData();
    
    command_pointer = last_command_pointer = 0;
    method_pointer  = 0;

    fHisto1          = NULL;
    fHisto2          = NULL;
    fHisto3          = NULL;
    fGraph           = NULL;
    fGraph2D         = NULL;
    is_readonly      = 0;
    slicesx = slicesy = NULL;
    current_particle = NULL;

    batch_particle_param = makeDataBase()->GetParamTObj("batch_particle");
    batch_models_param   = makeDataBase()->GetParamTObj("batch_models");
    batch_value_param    = makeDataBase()->GetParamDouble("batch_value");
    pid_param            = makeDataBase()->GetParamInt("batch_pid");
    Int_t batch_position_param = makeDataBase()->GetParamInt("batch_position");

    if (batch_particle_param < 0) 
	batch_particle_param = makeDataBase()->MakeParamTObj("batch_particle", 
							     "PParticle storage for batch");

    if (batch_value_param < 0) 
	batch_value_param = makeDataBase()->MakeParamDouble("batch_value", 
							    "Value storage for batch");

    if (batch_models_param < 0) 
	batch_models_param = makeDataBase()->MakeParamTObj("batch_models",
							   "Storage for distribution objects");

    if (pid_param < 0) 
	pid_param = makeDataBase()->MakeParamInt("batch_pid", "PID for batch");

    if (batch_position_param < 0) 
	makeDataBase()->MakeParamInt("batch_position", "PID position for batch");

    batch_histogram_param = makeDataBase()->GetParamTObj("batch_histogram");
    if (batch_histogram_param < 0) 
	batch_histogram_param = makeDataBase()->MakeParamTObj("batch_histogram", "Histogram storage for batch");
    

    //This is used for the "goto"
    num_command_param = makeDataBase()->GetParamInt("num_command");    
    if (num_command_param < 0) 
	num_command_param = makeDataBase()->MakeParamInt("num_command", "Number of command for a label");
    num_batch_param = makeDataBase()->GetParamInt("num_batch");    
    if (num_batch_param < 0) 
	num_batch_param = makeDataBase()->MakeParamInt("num_batch", "Number of batch object for a label");
    num_bulk_param = makeDataBase()->GetParamInt("num_bulk");    
    if (num_bulk_param < 0) 
	num_bulk_param = makeDataBase()->MakeParamInt("num_bulk", "Number of bulk for a label");
    num_batch = num_bulk = -1;

    //for the branching
    if (makeDataBase()->GetParamInt("branch_idx") < 0) {
	makeDataBase()->MakeParamInt("branch_idx", "Index of the tree branch in PReaction");
    }
    
    //Used for "formore"
    stream_default_pos_param = makeDataBase()->GetParamInt(STREAM_DEFAULT_POS);
    if (stream_default_pos_param < 0)  
	stream_default_pos_param = makeDataBase()->MakeParamInt(STREAM_DEFAULT_POS, "Default position");
    stream_max_pos_param = makeDataBase()->GetParamInt(STREAM_MAX_POS);
    if (stream_max_pos_param < 0)  
	stream_max_pos_param = makeDataBase()->MakeParamInt(STREAM_MAX_POS, "Max position in stream");

    batch_update_param = makeDataBase()->GetParamInt("batch_update");
    if (batch_update_param < 0)
	makeDataBase()->MakeParamInt("batch_update", 
				     "If set this is a variable which must trigger an update"); 

    for (int i=0; i<MAX_COMMAND_POINTER; i++) error_flag[i] = 0;

    x = makeStaticData()->GetBatchValue("_x");
    y = makeStaticData()->GetBatchValue("_y");
    z = makeStaticData()->GetBatchValue("_z");
    eval_err_dumped = status = 0;
    varlist = NULL;
    file    = tmp_file = NULL;

    tree          = NULL;
    size_branches = NULL;
    key_branches  = NULL;
    locnum_branch = 0;
    else_position = -1;
}

Int_t PBatch::Execute(Int_t command_pos, Int_t retval) {

    //retval = kFALSE; //standard, can be overwritten for a foreach
    //cout << "command:" << command_pos << ":" << command_pointer << ":" << retval << endl;

    current_position = -1;
    locnum_old_command = -1;

    for (int i=command_pos; i<command_pointer; i++) {
	TObject  *res  = NULL;
	TObject  *res2 = NULL;
	TObject  *res3 = NULL;
	Double_t *val  = NULL;
	Double_t *val2 = NULL;
	Double_t *val3 = NULL;
	Double_t *val4 = NULL;
	
	current_position = i;

	//cout << "command:" << lst_command[i] << " num "<< i <<  endl;

	if (lst_command[i] == COMMAND_PLUS) {
	    //
	    //+ of pparticles or values
	    //
	    Bool_t found = kFALSE;
	    makeDataBase()->GetParamTObj(lst_key[1][i], batch_particle_param, &res);
	    makeDataBase()->GetParamTObj(lst_key[2][i], batch_particle_param, &res2);
	    makeDataBase()->GetParamTObj(lst_key_a[i],  batch_particle_param, &res3);
	
	    if (res && res2 && res3) {
		PParticle *a1 = (PParticle *) res;
		PParticle *a2 = (PParticle *) res2;
		PParticle *r  = (PParticle *) res3;
		*r = *a1;
		r->AddTmp(*a2);
		found = kTRUE;
	    } 
	
	    makeDataBase()->GetParamDouble(lst_key[1][i], batch_value_param, &val);
	    makeDataBase()->GetParamDouble(lst_key[2][i], batch_value_param, &val2);
	    makeDataBase()->GetParamDouble(lst_key_a[i],  batch_value_param, &val3);
	
	    if (val && val2 && val3) {
		*val3 = *val2 + *val;
		found = kTRUE;
	    }
	    if (!found) return retval;
	} else if (lst_command[i] == COMMAND_MINUS) {
	    //
	    //+ of pparticles or values
	    //
	    Bool_t found = kFALSE;
	    makeDataBase()->GetParamTObj(lst_key[1][i], batch_particle_param, &res);
	    makeDataBase()->GetParamTObj(lst_key[2][i], batch_particle_param, &res2);
	    makeDataBase()->GetParamTObj(lst_key_a[i],  batch_particle_param, &res3);
	
	    if (res && res2 && res3) {
		PParticle *a1 = (PParticle *) res;
		PParticle *a2 = (PParticle *) res2;
		PParticle *r  = (PParticle *) res3;
		*r = *a1 - *a2;
		found = kTRUE;
	    } 
	
	    makeDataBase()->GetParamDouble(lst_key[1][i], batch_value_param, &val);
	    makeDataBase()->GetParamDouble(lst_key[2][i], batch_value_param, &val2);
	    makeDataBase()->GetParamDouble(lst_key_a[i],  batch_value_param, &val3);
	
	    if (val && val2 && val3) {
		*val3 = *val - *val2;
		found = kTRUE;
	    }
	    if (!found) return found;
	} else if (lst_command[i] == COMMAND_MULT) { 
	    //
	    // Internal *=
	    //
	    Bool_t found = kFALSE;
	    makeDataBase()->GetParamDouble(lst_key[1][i], batch_value_param, &val);
	    makeDataBase()->GetParamDouble(lst_key[2][i], batch_value_param, &val2);
	    makeDataBase()->GetParamDouble(lst_key_a[i],  batch_value_param, &val3);	
	    if (val && val2 && val3) {
		*val3 = *val * *val2;
		found = kTRUE;
	    } 
	    if (!found) return found;
	} else if (lst_command[i] == COMMAND_DIV) { 
	    //
	    // Internal *=
	    //
	    Bool_t found = kFALSE;
	    makeDataBase()->GetParamDouble(lst_key[1][i], batch_value_param, &val);
	    makeDataBase()->GetParamDouble(lst_key[2][i], batch_value_param, &val2);
	    makeDataBase()->GetParamDouble(lst_key_a[i],  batch_value_param, &val3);	
	    if (val && val2 && val3) {
		*val3 = *val / *val2;
		found = kTRUE;
	    } 
	    if (!found) return found;
	} else if (lst_command[i] == COMMAND_EQUAL) {
	    //
	    // compare values (+/- 0.5)
	    //
	    Bool_t found = kFALSE;
	    makeDataBase()->GetParamDouble(lst_key[1][i], batch_value_param, &val);
	    makeDataBase()->GetParamDouble(lst_key[2][i], batch_value_param, &val2);
	    makeDataBase()->GetParamDouble(lst_key_a[i],  batch_value_param, &val3);
	
	    if (val && val2 && val3) {
		if (fabs(*val - *val2) < 0.5) 
		    *val3 = 1.;
		else 
		    *val3 = 0.;
		found = kTRUE;
	    }
	    if (!found) return retval;
	} else if (lst_command[i] == COMMAND_BOOST) { 
	    //
	    //boost pparticles
	    //
	    makeDataBase()->GetParamTObj(lst_key[1][i], batch_particle_param, &res);
	    if (!res) return retval;
	    PParticle *a1  = (PParticle *) res;
	    makeDataBase()->GetParamTObj(lst_key[2][i], batch_particle_param, &res);
	    if (!res) return retval;
	    PParticle *a2  = (PParticle *) res;
	
	    a1->Boost(-a2->BoostVector()) ;
	} else if (lst_command[i] == COMMAND_GETBEAM) { 
	    //
	    //read the beam from composite
	    //
	    makeDataBase()->GetParamTObj(lst_key[1][i], batch_particle_param, &res);
	    if (!res) {
		Warning("GetBeam()", "Composite not found");
		return retval;
	    }
	    PParticle *a1  = (PParticle *) res;
	    makeDataBase()->GetParamTObj(lst_key_a[i], batch_particle_param, &res);
	    if (!res) return retval;
	    PParticle *a2  = (PParticle *) res;
	    PParticle *a3  = a1->GetBeam();
	    if (!a3) {
		Warning("GetBeam()", "Beam not found");
		return retval;
	    }
	    *a2 = *a3;
	} else if (lst_command[i] == COMMAND_GETTARGET) { 
	    //
	    //read the target from composite
	    //
	    makeDataBase()->GetParamTObj(lst_key[1][i], batch_particle_param, &res);
	    if (!res) return retval;
	    PParticle *a1  = (PParticle *) res;
	    makeDataBase()->GetParamTObj(lst_key_a[i], batch_particle_param, &res);
	    if (!res) return retval;
	    PParticle *a2  = (PParticle *) res;
	    PParticle *a3  = a1->GetTarget();
	    if (!a3) {
		Warning("GetTarget()", "Target not found");
		return retval;
	    }
	    *a2 = *a3;
	} else if (lst_command[i] == COMMAND_ANGLE) { 
	    //
	    //angle between particle tracks
	    //
	    makeDataBase()->GetParamTObj(lst_key[1][i], batch_particle_param, &res);
	    if (!res) return retval;
	    PParticle *a1  = (PParticle *) res;
	    makeDataBase()->GetParamTObj (lst_key[2][i], batch_particle_param, &res);
	    if (!res) return retval;
	    PParticle *a2  = (PParticle *) res;
	    
	    Double_t angle = a1->Vect().Angle(a2->Vect());
	    
	    makeDataBase()->GetParamDouble(lst_key_a[i], batch_value_param, &val);
	    if (!val) {
		Warning("Angle()", "Result value not found");
		return kFALSE;
	    }
	    *val = angle;
	} else if (lst_command[i] == COMMAND_ROT) { 
	    //
	    //rotate
	    //
	    makeDataBase()->GetParamTObj(lst_key[1][i], batch_particle_param, &res);
	    if (!res) return retval;
	    PParticle *a1  = (PParticle *) res;
	    makeDataBase()->GetParamTObj(lst_key[2][i], batch_particle_param, &res);
	    if (!res) return retval;
	    PParticle *a2  = (PParticle *) res;
	    double tmp_phi   = a2->Phi();
	    double tmp_theta = a2->Theta();

	    a1->RotateZ(-tmp_phi);
	    a1->RotateY(-tmp_theta);	 
	} else if (lst_command[i] == COMMAND_IS) {
	    //
	    // '='
	    //
	    Bool_t found = kFALSE;
	    makeDataBase()->GetParamTObj(lst_key[1][i], batch_particle_param, &res);
	    makeDataBase()->GetParamTObj(lst_key_a[i], batch_particle_param, &res2);
	    if (res && res2) {
		PParticle *r   = (PParticle *) res2;
		PParticle *a1  = (PParticle *) res;
		//store PID, if old PParticle had already an pid, keep it
		Int_t pid  = r->ID();
		Double_t w = r->W();
		*r = *a1;
		if (pid) {
		    r->SetID(pid);
		    r->SetW(w);
		}
		found = kTRUE;
	    } 

	    makeDataBase()->GetParamDouble(lst_key_a[i],  batch_value_param, &val2);
	    makeDataBase()->GetParamDouble(lst_key[1][i], batch_value_param, &val);

	    if (val && val2) {
		*val2 = *val;
		found = kTRUE;
	    }
	    
	    if (!found) return retval;
	    Int_t *update;
	    if (makeDataBase()->GetParamInt(lst_key_a[i], batch_update_param, &update)) {
		if (*update == 1) {
		    locnum_old_command = i + 1;
		    return kUPDATE;
		}
	    }

	} else if (lst_command[i] == COMMAND_PUSH) {
	    //
	    // push()
	    //
	    makeDataBase()->GetParamTObj(lst_key[1][i], batch_particle_param, &res);
	    if (res) {
		current_particle = (PParticle *)res;
		//current_particle->Print();
		if (locnum_old_command < 0) locnum_old_command = i + 1;
		if (lst_key[2][i] == -1) {
		    //old version (function or empty method)
		    return retval | kPUSH;
		}
		locnum_branch = 0;
		makeDataBase()->GetParamDouble(lst_key[2][i], batch_value_param, &val);
		if (!val) return retval;
		locnum_branch = *val;
		return retval | kPUSHBRANCH;
	    }
	} else if (lst_command[i] == COMMAND_MASS2) {
	    //
	    // M2()
	    //
	    makeDataBase()->GetParamTObj(lst_key[1][i], batch_particle_param, &res);
	    if (!res) return retval;
	    PParticle *a1  = (PParticle *) res;
	    
	    makeDataBase()->GetParamDouble(lst_key_a[i], batch_value_param, &val);
	    if (!val) return retval;
	    *val = a1 -> M2();
	} else if (lst_command[i] == COMMAND_MASS) {
	    //
	    // M()
	    //
	    makeDataBase()->GetParamTObj(lst_key[1][i], batch_particle_param, &res);
	    if (!res) {
		return retval;
	    }
	    PParticle *a1  = (PParticle *) res;

	    makeDataBase()->GetParamDouble(lst_key_a[i], batch_value_param, &val);
	    if (!val) {
		Warning("M()", "Result value %s not found",
			makeDataBase()->GetName(lst_key_a[i]));
		return retval;
	    }
	    *val = a1 -> M();
	} else if (lst_command[i] == COMMAND_THETA) {
	    //
	    // Theta()
	    //
	    makeDataBase()->GetParamTObj(lst_key[1][i], batch_particle_param, &res);
	    if (!res) return retval;
	    PParticle *a1  = (PParticle *) res;
	    
	    makeDataBase()->GetParamDouble(lst_key_a[i], batch_value_param, &val);
	    if (!val) return retval;
	    *val = (a1 -> Theta());
	} else if (lst_command[i] == COMMAND_INTERNAL) {
	    //
	    // Pointer to PUtils/PParticle/PChannelModel
	    //
	    TObject *a1;
	    if (flag_command_int[i] == 0) {
		makeDataBase()->GetParamTObj(lst_key[1][i], batch_particle_param, &res);
		if (!res) return retval;
		a1 = (PParticle *) res;
	    }
	    else if (flag_command_int[i] == 1) {
		a1 = makePUtilsREngine();
	    } else {
		makeDataBase()->GetParamTObj(lst_key[1][i], batch_models_param, &res);
		if (!res) return retval;
		a1  = (PChannelModel *) res;
	    }

 	    Double_t *argval;

	    //First, we have to set the variables
	    methods[lst_command_int[i]]->ResetParam();
	    for (int j=0; j<4; j++) {
		//cout << lst_command_int[i] << ":" << j << endl;
		if (methods_arg_flags[j][lst_command_int[i]] == METHOD_RETURN_DOUBLE) {
		    //cout << lst_key[j+2][i] << ":" << batch_value_param << endl;
		    if (makeDataBase()->GetParamDouble(lst_key[j+2][i], batch_value_param, &argval)) { //j=1 is object
			if (!argval) {
			    Warning("Execute", "Double argument for key %i is NULL", lst_key[j+2][i]);
			    return retval;
			}
			//cout << argval << endl;
			methods[lst_command_int[i]]->SetParam(*argval);
		    } else {
			Warning("Execute","Double argument for key %i not found", lst_key[j+2][i]);
			return retval;
		    }
		} else if (methods_arg_flags[j][lst_command_int[i]] == METHOD_RETURN_INT) {
		    if (makeDataBase()->GetParamDouble(lst_key[j+2][i], batch_value_param, &argval)) { //j=1 is object
			if (!argval) {
			    Warning("Execute", "Int argument for key %i is NULL", lst_key[j+2][i]);
			    return retval;
			}
		    } else {
			Warning("Execute", "Int argument for key %i not found", lst_key[j+2][i]);
			return retval;
		    }
		    methods[lst_command_int[i]]->SetParam((Long_t)*argval);
		} 
	    }

	    //Execute internal
	    if (methods_flags[lst_command_int[i]] == METHOD_RETURN_DOUBLE) {
		makeDataBase()->GetParamDouble(lst_key_a[i], batch_value_param, &val);
		if (!val) return retval;
		methods[lst_command_int[i]]->Execute(a1, *val);
		//cout << "Double_t meth " << method_name[lst_command_int[i]] << " called, result " << *val << endl;
	    } else if (methods_flags[lst_command_int[i]] == METHOD_RETURN_INT) { //INT
		Long_t ret;
		makeDataBase()->GetParamDouble(lst_key_a[i], batch_value_param, &val);
		if (!val) return retval;
		methods[lst_command_int[i]]->Execute(a1, ret);
		//cout << "Int_t meth " << method_name[i] << " called, result " << ret << endl;
		(*val) = (Double_t) ret;
	    } else if (methods_flags[lst_command_int[i]] == METHOD_RETURN_PPARTICLE) { 
		//PParticle* ret2;//, *ret;
		makeDataBase()->GetParamTObj(lst_key_a[i], batch_particle_param, &res);
		if (!res) return retval;
		//ret2  = (PParticle * ) res;
		//methods[lst_command_int[i]]->Execute(a1,ret); //BUGBUG
		Fatal("Execute", "Return type PParticle* not yet working");
		//if (ret) *ret2 = * ret;
	    } else { //VOID
		methods[lst_command_int[i]]->Execute(a1);
		//cout << "void meth " << method_name[lst_command_int[i]] << " called" << endl;
		makeDataBase()->GetParamDouble(lst_key_a[i], batch_value_param, &val);
		if (val) (*val) = 0;
	    }

	} else if (lst_command[i] == COMMAND_PVALUE) {
	    //
	    // Reads the PValue ("PParticle.val")
	    // or the database entry
	    //
	    makeDataBase()->GetParamDouble(lst_key_a[i], batch_value_param, &val);
	    if (!val) {
		if (!error_flag[i]) {
		    error_flag[i] = 1;
		    Error("Execute", "Result object %s not found",
			      makeDataBase()->GetName(lst_key_a[i]));
		}
		return retval;
	    }	    
	    if (lst_key[3][i] == 0) { //PValue
		makeDataBase()->GetParamTObj(lst_key[1][i], batch_particle_param, &res);
		if (!res) return retval;
		PParticle *a1  = (PParticle *) res;
		if (!a1->GetValue(lst_key[2][i], val)) {
		    if (!error_flag[i]) {
			error_flag[i] = 1;
			Error("Execute", "PValue %i not set", lst_key[2][i]);
		    }
		    return retval;
		} 
	    } else { //database entry
		if (lst_key[3][i] < 0) {
		    makeDataBase()->GetParamDouble(lst_key[1][i], (-lst_key[3][i]) - 1, &val2);
		    if (!val2) {
			Error("Execute", "Connection to data base for double %i failed", (-lst_key[3][i]) - 1);
			return retval;
		    }
		    *val = *val2;		    
		} else {
		    Int_t *intval;
		    makeDataBase()->GetParamInt(lst_key[1][i], lst_key[3][i] - 1, &intval);
		    *val = (Double_t)*intval;
		} 
	    }
	} else if (lst_command[i] == COMMAND_BRANCH) {
	    //
	    // Returns the branch index
	    // 
	    //
	    makeDataBase()->GetParamDouble (lst_key_a[i], batch_value_param, &val);
	    if (!val) {
		if (!error_flag[i]) {
		    error_flag[i] = 1;
		    Error("Execute", "Result object %s not found",
			  makeDataBase()->GetName(lst_key_a[i]));
		}
		return retval;
	    }	    
	    *val = lst_key[2][i];
	} else if (lst_command[i] == COMMAND_PFORMULA) {
	    //
	    // Pointer to PFormula
	    //
	    Double_t pars[MAX_COMMAND_OPTIONS];
	    for (int j=0; j<lst_options_counter[i]; j++) {
		makeDataBase()->GetParamDouble(lst_key[j+1][i], batch_value_param, &val);
		if (!val) return retval;
		pars[j] = *val;
	    }
	    makeDataBase()->GetParamDouble(lst_key_a[i], batch_value_param, &val);
	    if (!val) return retval;
	    lst_form[i]->SetParameters(pars);
	    *val = lst_form[i]->Eval(1.);
	} else if (lst_command[i] == COMMAND_PRINT) {
	    //
	    // Dumps the value(s)
	    //
	    makeDataBase()->GetParamTObj(lst_key[1][i], batch_particle_param, &res);
	    if (res) {
		cout << "*******: " << makeDataBase()->GetName(lst_key[1][i]) << endl;
		PParticle *a1  = (PParticle *) res;
		//a1->Dump();
		a1->Print("scatter");
	    }
	    makeDataBase()->GetParamDouble(lst_key[1][i], batch_value_param, &val);
	    if (val) {
		cout << "*******: " << makeDataBase()->GetName(lst_key[1][i]) << endl;
		cout << *val << endl;
	    }
	} else if (lst_command[i] == COMMAND_COS) {
	    //
	    // Internal cos()
	    //
	    makeDataBase()->GetParamDouble(lst_key[1][i], batch_value_param, &val);
	    if (!val) {
		return retval;
	    }
 	    Double_t myres = cos(*val);
	    
 	    makeDataBase()->GetParamDouble(lst_key_a[i], batch_value_param, &val);

 	    if (!val) return retval;
 	    *val = myres;
	} else if (lst_command[i] == COMMAND_FABS) {
	    //
	    // Internal fabs()
	    //
	    makeDataBase()->GetParamDouble(lst_key[1][i], batch_value_param, &val);
	    if (!val) {
		return retval;
	    }
 	    Double_t myres = fabs(*val);
	    makeDataBase()->GetParamDouble(lst_key_a[i], batch_value_param, &val);
 	    if (!val) return retval;
 	    *val = myres;
	} else if (lst_command[i] == COMMAND_EVAL) {
	    //
	    // Eval the attached histogram and returns the value
	    //
	    Double_t myres  = 0.;
	    TH1 *my_fHisto1 = NULL;
	    TH2 *my_fHisto2 = NULL;
	    TH3 *my_fHisto3 = NULL;
	    TGraph   *my_fGraph   = NULL;
	    TGraph2D *my_fGraph2D = NULL;
	    
	    if (lst_key[1][i] == -1) {
		//no external histo
		my_fHisto1  = fHisto1;
		my_fHisto2  = fHisto2;
		my_fHisto3  = fHisto3;
		my_fGraph   = fGraph;
		my_fGraph2D = fGraph2D;
	    } else {
		TObject *ret;
		if (makeDataBase()->GetParamTObj(lst_key[1][i], batch_histogram_param, &ret)) {
		    if (((TH1*)ret)->GetDimension() == 1)
			my_fHisto1 = (TH1*)ret;
		    if (((TH1*)ret)->GetDimension() == 2)
			my_fHisto2 = (TH2*)ret;
		    if (((TH1*)ret)->GetDimension() == 3)
			my_fHisto3 = (TH3*)ret;
		}
	    }

	    //Eval()
	    if (lst_key[2][i] == -1 && lst_key[3][i] == -1 && lst_key[4][i] == -1) {
		if (!x) {
		    return retval;
		    }
		if (my_fHisto1) {
		    int bin = my_fHisto1->FindBin(*x);
		    myres = my_fHisto1->GetBinContent(bin);
		} else if (my_fHisto2) {
		    int bin = my_fHisto2->FindBin(*x,*y);
		    myres = my_fHisto2->GetBinContent(bin);
		} else if (my_fHisto3) {
		    int bin = my_fHisto3->FindBin(*x,*y,*z);
		    myres = my_fHisto3->GetBinContent(bin);
		} else if (my_fGraph) {
		    myres = my_fGraph->Eval(*x);
		} else if (my_fGraph2D) {
		    myres = my_fGraph2D->Interpolate(*x,*y);
		} else {
		    if (!eval_err_dumped) {
			eval_err_dumped = 1;
			Error("Execute", "Eval() called, but no object present");
		    }
		    return retval;
		}
	    } else  { //Eval(x,y,z)
		if (lst_key[2][i] != -1  && lst_key[3][i] == -1) { //1dim
		    makeDataBase()->GetParamDouble(lst_key[2][i], batch_value_param, &val2);
		    if (!val2) {
			return retval;
		    }
		    if (my_fHisto1) {
			int bin = my_fHisto1->FindBin(*val2);
			myres = my_fHisto1->GetBinContent(bin);
		    } else if (my_fGraph) {
			myres = my_fGraph->Eval(*x); 
		    } else {
			if (!eval_err_dumped) {
			    eval_err_dumped = 1;
			    Error("Execute", "Eval(x) called, but no TH1 or TGraph object present");
			}
			return retval;
		    }
		} else if (lst_key[2][i] != -1  && lst_key[3][i] != -1 && lst_key[4][i] == -1) { //2dim
		    makeDataBase()->GetParamDouble(lst_key[2][i], batch_value_param, &val2);
		    makeDataBase()->GetParamDouble(lst_key[3][i], batch_value_param, &val3);
		    if (!val2 || !val3) {
			return retval;
		    }
		    if (my_fHisto2) {
			int bin = my_fHisto2->FindBin(*val2, *val3);
			myres = my_fHisto2->GetBinContent(bin);
		    } else if (my_fGraph2D) {
		    myres = my_fGraph2D->Interpolate(*x, *y);
		    } else {
			if (!eval_err_dumped) {
			    eval_err_dumped = 1;
			    Error("Execute", "Eval(x,y) called, but no TH2 or TGraph2D object present");
			}
			return retval;
		    }
		} else  { //3dim
		    makeDataBase()->GetParamDouble(lst_key[2][i], batch_value_param, &val2);
		    makeDataBase()->GetParamDouble(lst_key[3][i], batch_value_param, &val3);
		    makeDataBase()->GetParamDouble(lst_key[4][i], batch_value_param, &val4);
		    
		    if (!val2 || !val3 || !val4) {
			return retval;
		    }
		    if (my_fHisto3) {
			int bin = my_fHisto3->FindBin(*val2, *val3, *val4);
			myres = my_fHisto3->GetBinContent(bin);
		    } else {
			if (!eval_err_dumped) {
			    eval_err_dumped = 1;
			    Error("Execute", "Eval(x,y,z) called, but no TH3 object present");
			}
			return retval;
		    }
		}
	    }

 	    makeDataBase()->GetParamDouble(lst_key_a[i], batch_value_param, &val);

 	    if (!val) return retval;
 	    *val = myres;
	} else if (lst_command[i] == COMMAND_GETRANDOM) {
	    //
	    // get a random number from the attached histogram
	    //
	    Double_t myres  = 0.;
	    TH1 *my_fHisto1 = NULL;
	    TH2 *my_fHisto2 = NULL;
	    TH3 *my_fHisto3 = NULL;
	    
	    if (lst_key[1][i] == -1) {
		//no external histo
		my_fHisto1 = fHisto1;
		my_fHisto2 = fHisto2;
		my_fHisto3 = fHisto3;
	    } else {
		TObject *ret;
		if (makeDataBase()->GetParamTObj(lst_key[1][i], batch_histogram_param, &ret)) {
		    if (((TH1*)ret)->GetDimension() == 1 )
			my_fHisto1 = (TH1*)ret;
		    if (((TH1*)ret)->GetDimension() == 2 )
			my_fHisto2 = (TH2*)ret;
		    if (((TH1*)ret)->GetDimension() == 3 )
			my_fHisto3 = (TH3*)ret;
		}
	    }

	    //GetRandom()
	    if (lst_key[2][i] == -1 && lst_key[3][i] == -1 && lst_key[4][i] == -1) {
		if (!x) {
		    return retval;
		    }
		if (my_fHisto1) {
		    myres = my_fHisto1->GetRandom();
		} else {
		    if (!eval_err_dumped) {
			eval_err_dumped = 1;
			Error("Execute", "GetRandom() called, but no 1-dimensional histogram object present");
		    }
		    return retval;
		}
	    } else  { //GetRandom(x,y,z)
		if (lst_key[2][i] != -1 && lst_key[3][i] == -1) { //1dim
		    makeDataBase()->GetParamDouble(lst_key[2][i], batch_value_param, &val2);
		    if (!val2) {
			return retval;
		    }
		    if (my_fHisto1) {
			myres = my_fHisto1->GetRandom();
			*val2 = myres;
		    } else {
			if (!eval_err_dumped) {
			    eval_err_dumped = 1;
			    Error("Execute", "GetRandom(x) called, but no TH1 object present");
			}
			return retval;
		    }
		} else if (lst_key[2][i] != -1 && lst_key[3][i] != -1 && lst_key[4][i] == -1) { //2dim
		    makeDataBase()->GetParamDouble(lst_key[2][i], batch_value_param, &val2);
		    makeDataBase()->GetParamDouble(lst_key[3][i], batch_value_param, &val3);
		    if (!val2 || !val3) {
			return retval;
		    }
		    if (my_fHisto2) {
			my_fHisto2->GetRandom2(*val2, *val3);
			myres = 0;
		    } else {
			if (!eval_err_dumped) {
			    eval_err_dumped = 1;
			    Error("Execute", "GetRandom(x,y) called, but no TH2 object present");
			}
			return retval;
		    }
		} else  { //3dim
		    makeDataBase()->GetParamDouble(lst_key[2][i], batch_value_param, &val2);
		    makeDataBase()->GetParamDouble(lst_key[3][i], batch_value_param, &val3);
		    makeDataBase()->GetParamDouble(lst_key[4][i], batch_value_param, &val4);
		    
		    if (!val2 || !val3 || !val4) {
			return retval;
		    }
		    if (my_fHisto3) {
			my_fHisto3->GetRandom3(*val2, *val3, *val4);
			myres = 0;
		    } else {
			if (!eval_err_dumped) {
			    eval_err_dumped = 1;
			    Error("Execute", "GetRandom(x,y,z) called, but no TH3 object present");
			}
			return retval;
		    }
		}
	    }

 	    makeDataBase()->GetParamDouble(lst_key_a[i], batch_value_param, &val);

 	    if (!val) return retval;
 	    *val = myres;
	} else if (lst_command[i] == COMMAND_GETRANDOMX) {
	    //
	    // get a random number from the attached histogram
	    //
	    Double_t myres=0.;
	    TH2 * my_fHisto2 = NULL;
	    
	    if (lst_key[1][i] == -1) {
		//no external histo
		my_fHisto2  = fHisto2;
	    } else {
		TObject *ret = NULL;
		if (makeDataBase()->GetParamTObj(lst_key[1][i], batch_histogram_param, &ret)) {
		    if (((TH1*)ret)->GetDimension() == 2)
			my_fHisto2 = (TH2*)ret;
		}
	    }
	    makeDataBase()->GetParamDouble(lst_key[2][i], batch_value_param, &val2);
	    if (!val2) {
		return retval;
	    }
	    if (my_fHisto2) {
		int n_x = my_fHisto2->GetNbinsX();
		int n_y = my_fHisto2->GetNbinsY();
		
		if (!slicesy) { //first time call
		    slicesy = new TH1D*[n_y];
		    for (int i=0; i<n_y; i++) {
			slicesy[i] = new TH1D(Form("%s_y_%i",my_fHisto2->GetName(), i), "Projected", n_x, 
					      my_fHisto2->GetXaxis()->GetXmin(), 
					      my_fHisto2->GetXaxis()->GetXmax());
			slicesy[i]->SetDirectory(0);
			for (int j=0; j<n_x; j++) {
			    slicesy[i]->SetBinContent(j+1, my_fHisto2->GetBinContent(j+1, i+1));
			}
		    }
		}
		int ypos = my_fHisto2->GetYaxis()->FindBin(*val2);
		makeDataBase()->GetParamDouble(lst_key_a[i], batch_value_param, &val);
		if (!val) return retval;
		if (ypos > 0 && ypos <= n_y) {
		    myres = slicesy[ypos-1]->GetRandom();
		    *val  = myres;
		} else {
		    *val  = 0;
		}
	    } else {
		if (!eval_err_dumped) {
		    eval_err_dumped = 1;
		    Error("Execute", "GetRandomX(y) called, but no TH2 object present");
		}
		return retval;
	    }
	} else if (lst_command[i] == COMMAND_GETRANDOMY) {
	    //
	    // get a random number from the attached histogram
	    //
	    Double_t myres  = 0.;
	    TH2 *my_fHisto2 = NULL;
	    
	    if (lst_key[1][i] == -1) {
		//no external histo
		my_fHisto2 = fHisto2;
	    } else {
		TObject *ret = NULL;
		if (makeDataBase()->GetParamTObj(lst_key[1][i], batch_histogram_param, &ret)) {
		    if (((TH1*)ret)->GetDimension() == 2)
			my_fHisto2 = (TH2*)ret;
		}
	    }
	    makeDataBase()->GetParamDouble(lst_key[2][i], batch_value_param, &val2);
	    if (!val2) {
		return retval;
	    }
	    if (my_fHisto2) {
		int n_x = my_fHisto2->GetNbinsX();
		int n_y = my_fHisto2->GetNbinsY();
		
		if (!slicesx) { //first time call
		    slicesx = new TH1D*[n_x];
		    for (int i=0; i<n_x; i++) {
			slicesx[i] = new TH1D(Form("%s_x_%i",my_fHisto2->GetName(), i), "Projected", n_y, 
					      my_fHisto2->GetYaxis()->GetXmin(), 
					      my_fHisto2->GetYaxis()->GetXmax());
			slicesx[i]->SetDirectory(0);
			for (int j=0; j<n_y; j++) {
			    slicesx[i]->SetBinContent(j+1, my_fHisto2->GetBinContent(i+1, j+1));
			}
		    }
		}
		int xpos = my_fHisto2->GetXaxis()->FindBin(*val2);
		makeDataBase()->GetParamDouble(lst_key_a[i], batch_value_param, &val);
		if (!val) return retval;
		if (xpos > 0 && xpos <= n_x) {
		    myres = slicesx[xpos-1]->GetRandom();
		    *val  = myres;
		} else {
		    *val  = 0;
		}
	    } else {
		if (!eval_err_dumped) {
		    eval_err_dumped = 1;
		    Error("Execute", "GetRandomY(x) called, but no TH2 object present");
		}
		return retval;
	    }
	} else if (lst_command[i] == COMMAND_IF) {
	    //
	    // if (....)
	    //
	    makeDataBase()->GetParamDouble(lst_key[1][i], batch_value_param, &val);
	    if (!val) {
		Warning("Execute", "if: argument not found");
		return retval;
	    }
 	    Double_t myres = *val;
	    
 	    makeDataBase()->GetParamDouble(lst_key_a[i], batch_value_param, &val);

 	    if (!val) return retval;
 	    *val = myres;
	    if (fabs(*val) == 0) return retval;
	} else if (lst_command[i] == COMMAND_P3M) {
	    //
	    // Constructor for PParticles (with mass)
	    //
	    makeDataBase()->GetParamTObj(lst_key_a[i],    batch_particle_param, &res);
	    makeDataBase()->GetParamDouble(lst_key[1][i], batch_value_param, &val);
	    makeDataBase()->GetParamDouble(lst_key[2][i], batch_value_param, &val2);
	    makeDataBase()->GetParamDouble(lst_key[3][i], batch_value_param, &val3);
	    makeDataBase()->GetParamDouble(lst_key[4][i], batch_value_param, &val4);

	    if (!res || !val || !val2 || !val3 || !val4) {
		return kTRUE;
	    }
	    
	    ((PParticle *) res)->SetPxPyPzE((*val),(*val2),(*val3),
					    sqrt((*val)*(*val)+(*val2)*(*val2)+
						 (*val3)*(*val3)+(*val4)*(*val4)));
	    
	} else if (lst_command[i] == COMMAND_P3E) {
	    //
	    // Constructor for PParticles (with energy)
	    //
	    makeDataBase()->GetParamTObj(lst_key_a[i],    batch_particle_param, &res);
	    makeDataBase()->GetParamDouble(lst_key[1][i], batch_value_param, &val);
	    makeDataBase()->GetParamDouble(lst_key[2][i], batch_value_param, &val2);
	    makeDataBase()->GetParamDouble(lst_key[3][i], batch_value_param, &val3);
	    makeDataBase()->GetParamDouble(lst_key[4][i], batch_value_param, &val4);

	    if (!res || !val || !val2 || !val3 || !val4) {
		return kTRUE;
	    }
	    
	    ((PParticle *) res)->SetPxPyPzE((*val),(*val2),(*val3),(*val4));
	    
	} else if (lst_command[i] == COMMAND_GOTO) {
	    //
	    // Goto
	    //
	    Bool_t labelfound = kTRUE;
	    if (!makeDataBase()->GetParamInt(lst_key[1][i], num_command_param, &locnum_command)) 
		labelfound = kFALSE;
	    makeDataBase()->GetParamInt(lst_key[1][i], num_batch_param, &locnum_batch);
	    makeDataBase()->GetParamInt(lst_key[1][i], num_bulk_param,  &locnum_bulk);
	    if ((locnum_command>=0) && (labelfound) && (locnum_batch < 0)) { //local batch
		i = locnum_command-1;
	    }
	    else if((locnum_command>=0) && (labelfound)) { //go back to PProjector
		return kGOTO;
	    }
	    if (!labelfound)
		Warning("Execute", "Label '%s' not found in goto command", makeDataBase()->GetName(lst_key[1][i]));
	} else if (lst_command[i] == COMMAND_GOSUB) {
	    //
	    // Gosub
	    //
	    //space left on stack?
	    if (stack_num_pos == MAX_STACK_GOSUB) {
		Warning("Execute", "Cannot call '%s': stack full (loop?)", makeDataBase()->GetName(lst_key[1][i]));
		return kFALSE;
	    }

	    Bool_t labelfound = kTRUE;
	    if (!makeDataBase()->GetParamInt(lst_key[1][i], num_command_param, &locnum_command)) 
		labelfound = kFALSE;
	    makeDataBase()->GetParamInt(lst_key[1][i], num_batch_param, &locnum_batch);
	    makeDataBase()->GetParamInt(lst_key[1][i], num_bulk_param,  &locnum_bulk);
	    if((locnum_command>=0) && (labelfound)) {
		stack_num_batch[stack_num_pos] = num_batch;
		stack_num_bulk[stack_num_pos]  = num_bulk;
		stack_num_command[stack_num_pos] = i;
		stack_num_pos++;
		if (locnum_batch < 0) { //local batch
		    i = locnum_command-1;
		}
		else  { //go back to PProjector
		    return kGOTO;
		}
	    }
	    if (!labelfound)
		Warning("Execute", "Label '%s' not found in goto command", makeDataBase()->GetName(lst_key[1][i]));
	} else if (lst_command[i] == COMMAND_RETURN) {
	    //
	    // Returns from gosub
	    //
	    //something on stack?
	    if (stack_num_pos == 0) {
		Warning("Execute", "Cannot return: stack empty");
		return kFALSE;
	    }
	    stack_num_pos--;
	    locnum_command = stack_num_command[stack_num_pos]+1;
	    locnum_batch   = stack_num_batch[stack_num_pos];
	    locnum_bulk    = stack_num_bulk[stack_num_pos];
	    if (locnum_batch < 0) { //local batch
		i = locnum_command-1;
	    }
	    else  { //go back to PProjector
		return kGOTO;
	    }
	} else if (lst_command[i] == COMMAND_ELSE) {
	    //
	    // Just return...
	    //
	    return retval | kELSE;
	} else if (lst_command[i] == COMMAND_EXIT) {
	    //
	    // Exit
	    //
	    locnum_command     = 999999999;
	    locnum_old_command = 999999999;
	    locnum_batch       = 999999999;
	    locnum_bulk        = num_bulk;
	    return kGOTO;
	} else if ((lst_command[i] == COMMAND_FORMORE) || (lst_command[i] == COMMAND_FOREACH)) {
	    //
	    // Build-in loops for PProjector
	    //
	    Int_t  stream_max;
	    if (!makeDataBase()->GetParamInt(lst_key[1][i], stream_max_pos_param, &stream_max)) {
		//cout << "particle not in stream" << endl;
		return kFALSE; //particle not in stream, abort
	    }

	    Int_t *stream_default;
	    if (!makeDataBase()->GetParamInt(lst_key[1][i], stream_default_pos_param, &stream_default)) {
		Int_t *dummy = new Int_t(1);
		stream_default = dummy;
		makeDataBase()->SetParamInt(lst_key[1][i], STREAM_DEFAULT_POS, dummy);
	    } else {
		(*stream_default)++;
	    }

	    if (lst_command[i] == COMMAND_FORMORE) {
		if ( (*stream_default) >= stream_max) { //Maximum reached, abort
		    //reset value:
		    (*stream_default) = 0;
		    return kFOREACHEND; 
		} 
	    } else { //FOREACH
		if ((*stream_default) > stream_max) { //Maximum reached, abort
 		    //reset value:
 		    (*stream_default) = 0;
 		    return kFOREACHEND; 
 		} else {
 		    retval = kFOREACH;
 		}
		if (locnum_old_command < 0) locnum_old_command = i; //Jump to the "foreach" command
	    }

	} else if (lst_command[i] == COMMAND_READLINE) {

	    if (readline_format_string[i]) {
		if (!file) {
		    Error("Execute", "readline called, but no file open");
		    return kFALSE;
		}
		char line[1000];
		if (!fgets(line, 1000, file)) return kEOF;
		Double_t my_readline_args[MAX_READLINE_ARGS];
		int r = sscanf(line, readline_format_string[i],
			       my_readline_args,   my_readline_args+1,
			       my_readline_args+2, my_readline_args+3,
			       my_readline_args+4, my_readline_args+5,
			       my_readline_args+6);

		if (r != readline_num_args[i]) {
		    Warning("Execute", "%i arguments expected, but only %i read", readline_num_args[i], r);
		    cout << "< " << readline_string[i] << endl;
		    cout << "> " << line;
		}
		for (int j=0; j<readline_num_args[i]; j++) {
		    *(*(readline_args[i]+j)) = my_readline_args[j];
		}
	    }

	} else if (lst_command[i] == COMMAND_ECHO) {
	    //
	    // echo blabla
	    //
	    char puffer[1000]; //I hope there will be never a string longer...
	    char format_puffer[1000]; //I hope there will be never a string longer...
	    unsigned int puffer_pointer = 0, format_puffer_pointer = 0;

	    if (!file)
		printf("<PBatch> "); 
	    Int_t seek_mode = 0;
	    for (unsigned int j=0; j<=strlen(echo_string[i]); j++) {
		char current = (*(echo_string[i]+j));
		if (current == '$')
		    seek_mode = 1;
		else {
		    //if (seek_mode && (((*(echo_string[i]+j)) == ' ')  ||  (*(echo_string[i]+j)) == '\0') ) {
		    if ((seek_mode==1) && (current!='%') && 
			(current!='#') && (current!='_') && (!isalnum(current))) {
			//end
			seek_mode = 0;
			puffer[puffer_pointer] = '\0';
			Double_t *x = makeStaticData()->GetBatchValue(puffer, 0);
			if (file) {
			    if (x) {
				if (format_puffer_pointer<2) 
				    fprintf(file, "%#g", *x);
				else {
				    format_puffer[format_puffer_pointer] = '\0';
				    char type = format_puffer[format_puffer_pointer-1];
				    if ((type == 'd') ||
					(type == 'i') ||
					(type == 'o') ||
					(type == 'x') ||
					(type == 'X')||
					(type == 'u'))
					fprintf(file, format_puffer, (int)*x);
				    else if (type == 'c')
					fprintf(file, format_puffer, (char)*x);
				    else
					fprintf(file, format_puffer, *x);			    
				}
			    }
			    else fprintf(file, "-");
			} else { 
			    if (x) {
				if (format_puffer_pointer<2) printf("%#g", *x);
				else {
				    format_puffer[format_puffer_pointer] = '\0';
				    char type = format_puffer[format_puffer_pointer-1];
				    if ((type == 'd') ||
					(type == 'i') ||
					(type == 'o') ||
					(type == 'x') ||
					(type == 'X')||
					(type == 'u'))
					printf(format_puffer, (int)*x);
				    else if (type == 'c')
					printf(format_puffer, (char)*x);
				    else
					printf(format_puffer, *x);
				}
			    }
			    else printf("[Error: %s not found]", puffer);
			}
			
			puffer_pointer = 0;
			format_puffer_pointer = 0;
		    }
		    if ((seek_mode==2) && (current=='%')) { //end format string
			seek_mode = 1;
		    }
		    else if ((seek_mode==1) && (current=='%')) { //found format string
			seek_mode = 2;
		    }
		    else if (seek_mode == 1) {
			puffer[puffer_pointer] = current;
			if (puffer_pointer < 1000) puffer_pointer++;
			else {
			    if (!file)
				printf("[Error: variable too large]");
			    seek_mode = 0;
			}
		    }
		    if (seek_mode == 2) {
			format_puffer[format_puffer_pointer] = current;
			
			if (format_puffer_pointer < 1000) format_puffer_pointer++;
			else {
			    if (!file)
				printf("[Error: format too large]");
			    seek_mode = 1;
			}
		    }
		    
		    if (!seek_mode) {
			if (file && (current != '\0')) fprintf(file,"%c",current);
			else printf("%c",current);
		    }
		}
	    }
	    if (file) 
		fprintf(file, "\n");
	    else {
		if (seek_mode == 2) printf("[Error: format string not closed]");
		printf("\n");
	    }
	}
    }

    return kTRUE | retval ;
}

Bool_t PBatch::AddCommand(const char *_command) {

    //cout << "AddCommand1:" << command << endl;
    char *command = PUtils::NewString(_command);
    PUtils::remove_spaces(&command);
    if (strlen(command) == 0) return kTRUE;
    Bool_t has_something  = kFALSE;
    int    curly_brackets = 0;

    for (unsigned int i=0; i<strlen(command); i++) {
	if ((command[i] != ' ') && (command[i] != ';'))
	    has_something = kTRUE;
	if (command[i]  == '{') curly_brackets++;
	if (command[i]  == '}') curly_brackets--;
	if ((command[i] == ';') && curly_brackets) command[i] = '\"'; //placeholder dummy
    }
    if (!has_something) return kTRUE;

    //cout << "AddCommand:" << command << endl;
    //First check if we have a composite command

    int is_composite = 0;

    for (UInt_t i=0; i<strlen(command); i++) {
	if (command[i]==';') is_composite = 1;
    }

    if (is_composite) {
	char *array[200];
	Int_t array_s = 200; //max products
	PUtils::Tokenize(command, ";", array, &array_s);

	for (int i=0; i<array_s; i++) {
	    AddCommand(array[i]);
	}
	return kTRUE;
    }

    //single command:

    //echo has the highest priority:
    if (!strncmp(command, "echo", 4)) {
	// 	    key_a = makeStaticData()->
	// 		MakeDirectoryEntry("batch_objects",command3);
	if (strlen(command) > 4) {
	    char *dummy = new char[strlen(command)-2];
	    strncpy(dummy, command+4, strlen(command)-4);
	    dummy[strlen(command)-4] = '\0';
	    if (tmp_file) file = tmp_file;
	    PUtils::remove_spaces(&dummy);
	    echo_string[command_pointer] = dummy;
	} else 
	    echo_string[command_pointer] = new char('\0');
	AddCommand(COMMAND_ECHO, -1, -1, -1);
	return kTRUE;
    }    
    
    //readline
    if (!strncmp(command, "readline", 8)) {
	if (strlen(command) > 8) {
	    char *dummy = new char[strlen(command)-6];
	    strncpy(dummy, command+8, strlen(command)-8);
	    dummy[strlen(command)-8] = '\0';
	    PUtils::remove_brackets(&dummy, '{', '}');
	    for (unsigned int i=0; i<strlen(dummy); i++) {
		if (dummy[i] == '\"') dummy[i] = ';';
	    }
	    if (tmp_file) file = tmp_file;
	    char puffer[1000]; //I hope there will be never a string longer...
	    unsigned int puffer_pointer = 0, dummy2_pointer = 0, args_pointer = 0;
	    char *dummy2 = new char[strlen(dummy)+20];
	    readline_args[command_pointer] = new Double_t*[MAX_READLINE_ARGS];
	    
	    Int_t seek_mode = 0;
	    for (unsigned int j=0; j<=strlen(dummy); j++) {
		char current = (*(dummy+j));
		if (current == '@') {
		    seek_mode = 1;
		    dummy2[dummy2_pointer]   = '%';
		    dummy2[dummy2_pointer+1] = 'l';
		    dummy2[dummy2_pointer+2] = 'e';
		    //dummy2[dummy2_pointer+3] = ' ';
		    dummy2_pointer += 3; 
		    if (dummy2_pointer > (strlen(dummy)+20)) {
			Fatal("AddCommand", "strlen for tmp string too short");
		    }
		} else {
		    if (seek_mode && ((!(current=='#') and !(current=='_') and !isalnum(current)))) {
			//end
			seek_mode = 0;
			puffer[puffer_pointer] = '\0';
			Info("Readline", "Write to batch variable '%s'", puffer);
			char *dummy3 = new char[strlen(puffer)+1];
			strcpy(dummy3, puffer);
			
			Double_t *x = makeStaticData()->GetBatchValue(dummy3, 1);
			if (x) {
			    if (args_pointer < MAX_READLINE_ARGS) {
				//push pointer on the list
				*((readline_args[command_pointer])+args_pointer) = x;
				args_pointer++;
			    } else {
				Error("AddCommand", "Readline: %s too many variables (>MAX_READLINE_ARGS)", dummy);
			    }
			} else 
			    Error("AddCommand", "Readline: puffer %s not initialized", puffer);
			    
			puffer_pointer = 0;
		    }
		    if (seek_mode) {
			puffer[puffer_pointer] = current;
			if (puffer_pointer < 1000) puffer_pointer++;
			else {
			    Error("AddCommand", "Readline: %s too large", dummy);
			    seek_mode = 0;
			}
		    }
		    
		    if (!seek_mode) {
			dummy2[dummy2_pointer] = dummy[j];
			dummy2_pointer++;
		    }
		}
	    }

	    readline_num_args[command_pointer] = args_pointer;
	    readline_string[command_pointer]   = dummy;
	    readline_format_string[command_pointer] = dummy2;
	} else {
	    readline_format_string[command_pointer] = new char('\0');
	}
	AddCommand(COMMAND_READLINE, -1, -1, -1);
	return kTRUE;
    }

    //first, check for a label
    for (UInt_t i=1; i<strlen(command); i++) {
	
	Bool_t ret = kFALSE;
	if (command[i] == ':') {
	    if (((i == (strlen(command))) ||  (command[i+1] != ':'))
		&&  ((i == 0) ||  (command[i-1] != ':'))) {
		//add new label
		char *label_name = new char[i+1];
		strncpy(label_name, command, i);
		label_name[i] = '\0';
		int key_a = makeStaticData()->
		    MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, command);
		if (key_a >= 0) {
		    Int_t *delme = new Int_t(command_pointer);
		    AddCommand(COMMAND_LABEL, key_a, -1, -1);
		    ret = AddCommand(command+i+1);
		    int key_l = GetKey(label_name, 1, 1);
		    if (key_l > 0) {
			makeDataBase()->SetParamInt(key_l, "num_command", delme);
			delme = new Int_t(num_batch);
			makeDataBase()->SetParamInt(key_l, "num_batch", delme);
			delme = new Int_t(num_bulk);
			makeDataBase()->SetParamInt(key_l, "num_bulk", delme);
		    }
		}
		return ret;
	    }
	}
    }

    //second thing: I check for a "=" operator

    int is_operator = 0;
    Bool_t found = kFALSE;
    char *prod[2];
    Int_t prod_s = 2; //max 2 products
    int key_a=-1, key1=-1, key2=-1;

    int numbrack = 0;
    for (UInt_t i=0; i<strlen(command); i++) {
	if (command[i]=='(' || command[i]==')') numbrack++;
	if (command[i]=='=' && !numbrack) {
	    if (i>0 && i<(strlen(command)-1) 
		&& command[i-1]!='<' && command[i-1]!='>' 
		&& command[i-1]!='*' && command[i-1]!='/' 
		&& command[i-1]!='-' && command[i-1]!='+' 
		&& command[i-1]!='=' && command[i+1]!='=') is_operator++;
	}
    }

    //cout << is_operator << endl;

    //let us copy the command first, because it might be modified
    //after the pointer is given to the data base
    char *command2 = new char[strlen(command)+1];
    strcpy(command2, command);
    command = command2;
    char *command3 = new char[strlen(command)+1];
    strcpy(command3, command);
    Int_t copy_ctor = 0;
    if (!is_operator) {
	//first the functions
	if (!strncmp(command,"goto",4) || !strncmp(command,"Goto",4)) {
	    key_a = makeStaticData()->
		MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, command3);
	    char *dummy = new char[strlen(command)-3];
	    strncpy(dummy, command+4, strlen(command)-4);
	    dummy[strlen(command)-4] = '\0';
	    key1 = GetKey(dummy, 1, 1);
	    if (AddCommand(COMMAND_GOTO, key_a, key1, -1)) 
		return kTRUE;
	    return kFALSE;
	}
	if (!strncmp(command,"gosub",5) || !strncmp(command,"Gosub",5)) {
	    key_a = makeStaticData()->
		MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, command3);
	    char *dummy = new char[strlen(command)-3];
	    strncpy(dummy, command+5, strlen(command)-5);
	    dummy[strlen(command)-5] = '\0';
	    key1 = GetKey(dummy, 1, 1);
	    if (AddCommand(COMMAND_GOSUB, key_a, key1, -1)) 
		return kTRUE;
	    return kFALSE;
	}
	if (!strncmp(command,"return",6) || !strncmp(command,"Return",6)) {
	    key_a = makeStaticData()->
		MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, command3);
	    if (AddCommand(COMMAND_RETURN, key_a, key1, -1)) {
		Double_t *delme =  new Double_t(0.);
		makeDataBase()->SetParamDouble(key_a, "batch_value", delme);
		return kTRUE;
	    }
	    return kFALSE;
	}
	if (!strncmp(command,"else",4) || !strncmp(command,"Else",4)) {
	    key_a = makeStaticData()->
		MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, command3);
	    if (AddCommand(COMMAND_ELSE, key_a, -1, -1)) {
		if (else_position > -1) {
		    Error("AddCommand", "Multiple use of 'else'");
		    return kFALSE;
		}
		else_position = command_pointer;
		Double_t *delme =  new Double_t(0.);
		makeDataBase()->SetParamDouble(key_a, "batch_value", delme);
		AddCommand(command+4); //just to make sure is the ';' is forgotten...
		return kTRUE;
	    }
	    return kFALSE;
	}
	if (!strncmp(command,"exit",4) || !strncmp(command,"Exit",4)) {
	    key_a = makeStaticData()->
		MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, command3);
	    if (AddCommand(COMMAND_EXIT, key_a, key1, -1)) {
		Double_t *delme =  new Double_t(0.);
		makeDataBase()->SetParamDouble(key_a, "batch_value", delme);
		return kTRUE;
	    }
	    return kFALSE;
	}
	if (!strncmp(command,"branch",6) || !strncmp(command,"Branch",6)) {
	    key_a = makeStaticData()->
		MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, command3);
	    char *dummy = new char[strlen(command)-5];
	    strncpy(dummy, command+6, strlen(command)-6);
	    dummy[strlen(command)-6] = '\0';
	    key1 = GetKey(dummy, 1, 1);
	    if (AddCommand(COMMAND_BRANCH, key_a, key1, -1)) {
		//check if we use this key already
		int used_id = -1;
		if (size_branches && key_branches) {
		    for (int br=0; br<*size_branches; br++) {
			if (key_branches[br] == key1) used_id = br;
		    }
		} else {
		    Error("AddCommand", "[%s] No access to branches (batch not attached to PReaction)", command);
		}
		if (used_id == -1) {
		    if (*size_branches != MAX_NUM_BRANCHES) {
			key_branches[*size_branches] = key1;
			used_id = (*size_branches);
			(*size_branches)++;
		    } else {
			Error("AddCommand", "[%s] MAX_NUM_BRANCHES reached", command);
		    }
		}
		lst_key[2][command_pointer-1] = used_id+1;  //new branches start with 1
		//    lst_key[3][command_pointer]=key3;
		Double_t *delme =  new Double_t(0.);
		makeDataBase()->SetParamDouble(key_a, "batch_value", delme);
		return kTRUE;
	    }
	    return kFALSE;
	}
	if (!strncmp(command,"formore",7) || !strncmp(command,"Formore",7)) {
	    key_a = makeStaticData()->
		MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, command3);
	    char *dummy = new char[strlen(command)-6];
	    strncpy(dummy, command+7, strlen(command)-7);
	    dummy[strlen(command)-7] = '\0';
	    if (strcmp(dummy, "(*)"))
		key1 = GetKey(dummy, 1, 1);
	    else
		key1 = GetKey((char *)"dummy", 1, 1);
	    if (AddCommand(COMMAND_FORMORE, key_a, key1, -1)) 
		return kTRUE;
	    return kFALSE;
	}
	if (!strncmp(command,"foreach",7) || !strncmp(command,"Foreach",7)) {
	    key_a = makeStaticData()->
		MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, command3);
	    char * dummy = new char[strlen(command)-6];
	    strncpy(dummy,command+7,strlen(command)-7);
	    dummy[strlen(command)-7]='\0';
	    if (strcmp(dummy,"(*)"))
		key1 = GetKey(dummy,1,1);
	    else
		key1 = GetKey((char *)"dummy",1,1);
	    if (AddCommand(COMMAND_FOREACH,key_a,key1,-1)) 
		return kTRUE;
	    return kFALSE;
	}
	if (!strncmp(command,"push",4) || !strncmp(command,"Push",4)) {
	    key_a = makeStaticData()->
		MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, command3);
	    char *dummy = new char[strlen(command)-3];
	    strncpy(dummy, command+4, strlen(command)-4);
	    dummy[strlen(command)-4] = '\0';
	    key1 = GetKey((char *)dummy, 1, 1);
	    TObject *delme2 = NULL;
	    makeDataBase()->GetParamTObj(key1, batch_particle_param, &delme2);
	    if (!delme2) {
		Warning("AddCommand", "[%s]: the object you want to push is not a particle", command);
		return kFALSE;
	    }
	    if (AddCommand(COMMAND_PUSH, key_a, key1, -1)) 
		return kTRUE;
	    return kFALSE;
	}
	if (!strncmp(command,"eval()",6) || !strncmp(command,"Eval()",6)) {
	    key_a = makeStaticData()->
		MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, command3);
	    if (AddCommand(COMMAND_EVAL, key_a, -1, -1)) {
		Double_t *delme =  new Double_t(0.);
		makeDataBase()->SetParamDouble(key_a, "batch_value", delme);
		is_readonly = 1;
		return kTRUE;
	    }
	    return kFALSE;
	} else if (!strncmp(command,"eval(",5) || !strncmp(command,"Eval(",5)) {
	    //Exists also as method!!!
	    char *prodx[10];
	    Int_t prodx_s = 10; //max 10 products (but problems catched below)

	    PUtils::Tokenize(command+5, ",", prodx, &prodx_s);
	    if (prodx_s > 3) {
		Warning("AddCommand", "Maximum 3 arguments for Eval()");
	    } 
	    *(prodx[prodx_s-1]+strlen(prodx[prodx_s-1])-1) = '\0'; //remove trailing )
	    
	    int key3=-1, key4=-1;
	    if (prodx_s > 0) 
		key2 = GetKey(prodx[0], 1, -1);
	    if (prodx_s > 1) 
		key3 = GetKey(prodx[1], 1, -1);
	    if (prodx_s > 2) 
		key4 = GetKey(prodx[2], 1, -1);
	    
	    key_a = makeStaticData()->
		MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, command3);
	    
	    if (AddCommand(COMMAND_EVAL, key_a, -1, key2, key3, key4)) {
		Double_t *delme =  new Double_t(0.);
		makeDataBase()->SetParamDouble(key_a, "batch_value", delme);
		is_readonly = 1;
		return kTRUE;
	    }
	    return kFALSE;
	} 

	if (!strncmp(command,"GetRandom()",11) || !strncmp(command,"getrandom()",11)) {
	    key_a = makeStaticData()->
		MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, command3);
	    if (AddCommand(COMMAND_GETRANDOM, key_a, -1, -1)) {
		Double_t *delme =  new Double_t(0.);
		makeDataBase()->SetParamDouble(key_a, "batch_value", delme);
		is_readonly = 1;
		return kTRUE;
	    }
	    return kFALSE;
	} else if (!strncmp(command,"GetRandom(",10) || !strncmp(command,"getrandom(",10)) {
	    //Exists also as method!!!
	    char *prodx[10];
	    Int_t prodx_s = 10; //max 10 products (but problems catched below)
	    
	    PUtils::Tokenize(command+10, ",", prodx, &prodx_s);
	    if (prodx_s > 3) {
		Warning("AddCommand", "Maximum 3 arguments for GetRandom()");
	    } 
	    *(prodx[prodx_s-1]+strlen(prodx[prodx_s-1])-1) = '\0'; //remove trailing )
	    
	    int key3=-1, key4=-1;
	    if (prodx_s > 0) 
		key2 = GetKey(prodx[0], 1, -1);
	    if (prodx_s > 1) 
		key3 = GetKey(prodx[1], 1, -1);
	    if (prodx_s > 2) 
		key4 = GetKey(prodx[2], 1, -1);
	    	    
	    key_a = makeStaticData()->
		MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, command3);
	    
	    if (AddCommand(COMMAND_GETRANDOM, key_a, -1, key2, key3, key4)) {
		Double_t *delme =  new Double_t(0.);
		makeDataBase()->SetParamDouble(key_a, "batch_value", delme);
		is_readonly = 1;
		return kTRUE;
	    }
	    return kFALSE;
	} 

	if (!strncmp(command,"GetRandomX",10) || !strncmp(command,"getrandomx",10)) {
	    key_a = makeStaticData()->
		MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, command3);
	    key2 = GetKey(command+10, 1, -1);
	    if (AddCommand(COMMAND_GETRANDOMX, key_a, -1, key2)) {
		Double_t *delme =  new Double_t(0.);
		makeDataBase()->SetParamDouble(key_a, "batch_value", delme);
		is_readonly = 1;
		return kTRUE;
	    }
	    return kFALSE;
	} 

	if (!strncmp(command,"GetRandomY",10) || !strncmp(command,"getrandomy",10)) {
	    key_a = makeStaticData()->
		MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, command3);
	    key2 = GetKey(command+10, 1, -1);
	    if (AddCommand(COMMAND_GETRANDOMY, key_a, -1, key2)) {
		Double_t *delme =  new Double_t(0.);
		makeDataBase()->SetParamDouble(key_a, "batch_value", delme);
		is_readonly = 1;
		return kTRUE;
	    }
	    return kFALSE;
	} 

	if (!strncmp(command,"cos(",4)) {
	    key_a = makeStaticData()->
		MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, command3);
	    key1 = GetKey(command+3, 1, -1);
	    if (AddCommand(COMMAND_COS, key_a, key1, -1)) {
		
		//final thing is to create the result
		Double_t *delme =  new Double_t(0.);
		makeDataBase()->SetParamDouble(key_a, "batch_value", delme);
		return kTRUE;
	    }
	    return kFALSE;
	}
	if (!strncmp(command,"fabs(",5)) {

	    key_a = makeStaticData()->
		MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, command3);

	    key1 = GetKey(command+4, 1, -1);
	    if (AddCommand(COMMAND_FABS, key_a, key1, -1)) {
		//final thing is to create the result
		Double_t *delme =  new Double_t(0.);
		makeDataBase()->SetParamDouble(key_a, "batch_value", delme);
		return kTRUE;
	    }
	    return kFALSE;
	}
	

	if (!strncmp(command,"if(",3) || !strncmp(command,"if ",3) || !strncmp(command,"ifx",3)) {

	    key_a = makeStaticData()->
		MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, command3);
	   
	    //check if the next char after () is a ';':
	    int bracket_pos=-1, bracket_pos2=-1, bracket_num=0, found_trailer=0;
	    for (unsigned int i=2; i<strlen(command); i++) {
		//cout << command[i] << ":" << bracket_num  << ":" << bracket_pos<< endl;
		if (command[i] != '(' && command[i] != ' ' && !bracket_num) i=strlen(command); //exit
		if (command[i] == '(' && bracket_pos == -1) {
		    bracket_pos = i;
		    bracket_num++;
		} else if (command[i] == '(') bracket_num++;

		if (command[i] == ')' && bracket_pos != -1 && bracket_pos2 == -1 && bracket_num==1) {
		    bracket_pos2 = i;
		} else if (bracket_pos2 != -1 && command[i] != ' ') found_trailer=1;
		else if (command[i] == ')') bracket_num--;
	    }

	    //cout << command << endl;
	    if (bracket_pos != -1 && bracket_pos2 != -1 && found_trailer) {
		command[bracket_pos2] = ';';
		command[bracket_pos] = ' ';
		command[2] = 'x';
		return AddCommand(command);
	    }
	    if (!strncmp(command,"if(",3))
		key1 = GetKey(command+2, 1, -1);
	    else
		key1 = GetKey(command+3, 1, -1);
	    if (AddCommand(COMMAND_IF, key_a, key1, -1)) {
		//final thing is to create the result
		Double_t *delme =  new Double_t(0.);
		makeDataBase()->SetParamDouble(key_a, "batch_value", delme);
		return kTRUE;
	    }
	    return kFALSE;
	}

	if (!strncmp(command,"P3M(",4)) {
	    char *prodx[4];
	    Int_t prodx_s = 4; //max 4 products

	    key_a = makeStaticData()->
		MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, command3);

	    PUtils::Tokenize(command+4, ",", prodx, &prodx_s);
	    if (prodx_s < 4) {
		Warning("AddCommand", "P3M needs 4 arguments");
	    }

	    *(prodx[3]+strlen(prodx[3])-1) = '\0'; //remove trailing )

	    key1 = GetKey(prodx[0], 1, -1);
	    key2 = GetKey(prodx[1], 1, -1);
	    int key3 = GetKey(prodx[2], 1, -1);
	    int key4 = GetKey(prodx[3], 1, -1);

	    if (AddCommand(COMMAND_P3M, key_a, key1, key2, key3, key4)) {
		//adding objects, if needed
		TObject *delme = NULL;
		makeDataBase()->GetParamTObj(key_a, batch_particle_param, &delme);
		if (!delme) {
		    delme = (TObject *) (new PParticle(0,0,0,0));
		    makeDataBase()->SetParamTObj (key_a, "batch_particle", delme);
		}
		Double_t *val = NULL;
		makeDataBase()->GetParamDouble(key1, batch_value_param, &val);
		if (!val) {
		    val = new Double_t(0.);
		    makeDataBase()->SetParamDouble(key1, "batch_value", val);
		}
		val = NULL;
		makeDataBase()->GetParamDouble(key2, batch_value_param, &val);
		if (!val) {
		    val = new Double_t(0.);
		    makeDataBase()->SetParamDouble(key2, "batch_value", val);
		}
		val = NULL;
		makeDataBase()->GetParamDouble(key3, batch_value_param, &val);
		if (!val) {
		    val = new Double_t(0.);
		    makeDataBase()->SetParamDouble(key3, "batch_value", val);
		}
		val = NULL;
		makeDataBase()->GetParamDouble(key4, batch_value_param, &val);
		if (!val) {
		    val = new Double_t(0.);
		    makeDataBase()->SetParamDouble(key4, "batch_value", val);
		}
		
		return kTRUE;
	    }
	    return kFALSE;
	}


	if (!strncmp(command,"P3E(",4)) {
	    char *prodx[4];
	    Int_t prodx_s = 4; //max 4 products

	    key_a = makeStaticData()->
		MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, command3);

	    PUtils::Tokenize(command+4, ",", prodx, &prodx_s);
	    if (prodx_s < 4) {
		Warning("AddCommand", "P3E needs 4 arguments");
	    }

	    *(prodx[3]+strlen(prodx[3])-1) = '\0'; //remove trailing )

	    key1 = GetKey(prodx[0], 1, -1);
	    key2 = GetKey(prodx[1], 1, -1);
	    int key3 = GetKey(prodx[2], 1, -1);
	    int key4 = GetKey(prodx[3], 1, -1);

	    if (AddCommand(COMMAND_P3E, key_a, key1, key2, key3, key4)) {
		//adding objects, if needed
		TObject *delme = NULL;
		makeDataBase()->GetParamTObj(key_a, batch_particle_param, &delme);
		if (!delme) {
		    delme = (TObject *) (new PParticle(0,0,0,0));
		    makeDataBase()->SetParamTObj(key_a, "batch_particle", delme);
		}
		Double_t *val = NULL;
		makeDataBase()->GetParamDouble(key1, batch_value_param, &val);
		if (!val) {
		    val = new Double_t(0.);
		    makeDataBase()->SetParamDouble(key1, "batch_value", val);
		}
		val = NULL;
		makeDataBase()->GetParamDouble(key2, batch_value_param, &val);
		if (!val) {
		    val = new Double_t(0.);
		    makeDataBase()->SetParamDouble(key2, "batch_value", val);
		}
		val = NULL;
		makeDataBase()->GetParamDouble(key3, batch_value_param, &val);
		if (!val) {
		    val = new Double_t(0.);
		    makeDataBase()->SetParamDouble(key3, "batch_value", val);
		}
		val = NULL;
		makeDataBase()->GetParamDouble(key4, batch_value_param, &val);
		if (!val) {
		    val = new Double_t(0.);
		    makeDataBase()->SetParamDouble(key4, "batch_value", val);
		}

		return kTRUE;
	    }
	    return kFALSE;
	}

	//Try operators like *= */ *- *+
	if (strstr(command, "*=")) {
	    PUtils::Tokenize(command, "*=", prod, &prod_s);
	    key1 = GetKey(prod[0], 1, -1);
	    key2 = GetKey(prod[1], 1, -1);
	    if (AddCommand(COMMAND_MULT, key1, key1, key2)) 
		return kTRUE;
	    return kFALSE;
	}
	if (strstr(command, "/=")) {
	    PUtils::Tokenize(command, "/=", prod, &prod_s);
	    key1 = GetKey(prod[0], 1, -1);
	    key2 = GetKey(prod[1], 1, -1);
	    if (AddCommand(COMMAND_DIV, key1, key1, key2)) 
		return kTRUE;
	    return kFALSE;
	}
	if (strstr(command, "+=")) {
	    PUtils::Tokenize(command, "+=", prod, &prod_s);
	    key1 = GetKey(prod[0], 1, -1);
	    key2 = GetKey(prod[1], 1, -1);
	    if (AddCommand(COMMAND_PLUS, key1, key1, key2)) 
		return kTRUE;
	    return kFALSE;
	}
	if (strstr(command, "-=")) {
	    PUtils::Tokenize(command, "-=", prod, &prod_s);
	    key1 = GetKey(prod[0], 1, -1);
	    key2 = GetKey(prod[1], 1, -1);
	    if (AddCommand(COMMAND_MINUS, key1, key1, key2)) 
		return kTRUE;
	    return kFALSE;
	}

	//Methods below here...
	//Only methods which are
	//not embedded in brackets are taken into account
	Int_t dot_version = 0, prev_dot_version = 0;
	Int_t method_position = -1;
	Int_t brack_counter = 0, total_brack_counter = 0;
	for (unsigned int i=0; i<(strlen(command)-1); i++) {
	    if (command[i] == '(') {
		brack_counter++;
		if (prev_dot_version)
		    total_brack_counter++;
	    }
	    if (command[i] == ')') brack_counter--;
	    if (brack_counter == 0) {
		if (command[i]=='.' && isalpha(command[i+1])) {
		    method_position = i;
		    dot_version     = 1;
		}
		if (command[i]=='-' && command[i+1]=='>') {
		    method_position = i;
		    dot_version     = 2;
		}
		if (total_brack_counter && prev_dot_version && ((command[i]!=' ') || (command[i]!=';')))
		    dot_version = 0; //must be something different
		prev_dot_version = dot_version;
	    }
	}

	brack_counter = 0;
	if (dot_version > 0) {
	    for (int i = method_position-1; i>=0; i--) {
		if (command[i]=='(' || command[i]=='[' || command[i]=='{') 
		    brack_counter--;
		if (command[i]==')' || command[i]==']' || command[i]=='}') 
		    brack_counter++;
		if (brack_counter==0 && ((command[i]==' ') || (command[i]=='+') || (command[i]=='-')))
		    dot_version = 0; //cases like "a + b.x"
	    }
	}

	if ((dot_version>0) && (!found)) {
	    //catch the cases where comparators are used
	    for (unsigned int i=0; i< (unsigned int)method_position; i++) {
		if ((command[i]=='~') || (command[i]=='=') || (command[i]=='<')  || (command[i]=='>'))
		    dot_version = 0;
	    }
	}

	if ((dot_version>0) && (!found)) {
	    char *prodx[2];
	    prodx[0] = new char[method_position+1];
	    strncpy(prodx[0], command, method_position);
	    prodx[0][method_position] = '\0';
	    
 	    key_a = makeStaticData()->
 		MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, command);

	    if (dot_version == 1) {
		prodx[1] = new char[strlen(command)-method_position];
		strncpy(prodx[1], command+method_position+1, strlen(command)-method_position-1);
		prodx[1][strlen(command)-method_position-1] = '\0';
	    } else {
		prodx[1] = new char[strlen(command)-method_position-1];
		strncpy(prodx[1], command+method_position+2, strlen(command)-method_position-2);
		prodx[1][strlen(command)-method_position-2] = '\0';
		
	    } 

	    if (!strcmp(prodx[1], "M2()")) {
		key1 = GetKey(prodx[0], 1, -1);
		if (key1 < 0) return kFALSE;
		if (AddCommand(COMMAND_MASS2, key_a, key1, -1)) 
		    found = kTRUE;
	    }
	    if (!strcmp(prodx[1], "M()")) {
		key1 = GetKey(prodx[0], 1, -1);
		if (AddCommand(COMMAND_MASS, key_a, key1, -1)) 
		    found = kTRUE;
	    }
	    if (!strcmp(prodx[1], "Theta()")) {
		key1 = GetKey(prodx[0], 1, -1);
		if (AddCommand(COMMAND_THETA, key_a, key1, -1)) 
		    found = kTRUE;
	    }
	    if (!strcmp(prodx[1], "Print()")) {
		key1 = GetKey(prodx[0], 1, -1);
		if (AddCommand(COMMAND_PRINT, key_a, key1, -1)) 
		    found = kTRUE;
	    }
// 	    if (!strcmp(prodx[1],"Parent()")) {
// 		key1 = GetKey(prodx[0],1,0);
// 		if (AddCommand(COMMAND_PARENT,key_a,key1,-1)) 
// 		    found=kTRUE;
// 	    }
// 	    if (!strcmp(prodx[1],"ID()")) {
// 		key1 = GetKey(prodx[0],1,0);
// 		if (AddCommand(COMMAND_ID,key_a,key1,-1)) 
// 		    found=kTRUE;
// 	    }

	    //with arguments:
	    if (!strncmp(prodx[1], "Boost(", 6)) {
		key1 = GetKey(prodx[0],   1, -1);
		key2 = GetKey(prodx[1]+5, 1, -1);
		if (AddCommand(COMMAND_BOOST, key_a, key1, key2)) 
		    found = kTRUE;
	    }
	    if (!strncmp(prodx[1], "Angle(", 6)) {
		key1 = GetKey(prodx[0],   1, -1);
		key2 = GetKey(prodx[1]+5, 1, -1);
		if (AddCommand(COMMAND_ANGLE, key_a, key1, key2)) 
		    found = kTRUE;
	    }
	    if (!strncmp(prodx[1], "Rot(", 4)) {
		key1 = GetKey(prodx[0],   1, -1);
		key2 = GetKey(prodx[1]+3, 1, -1);
		if (AddCommand(COMMAND_ROT, key_a, key1, key2)) 
		    found = kTRUE;
	    }
	    if (!strncmp(prodx[1], "GetBeam(", 8)) {
		key1 = GetKey(prodx[0], 1, -1);
		if (AddCommand(COMMAND_GETBEAM, key_a, key1, -1)) 
		    found = kTRUE;
		TObject *delme = NULL;
		makeDataBase()->GetParamTObj(key_a, batch_particle_param, &delme);
		if (!delme) {
		    delme = (TObject *) (new PParticle(0,0,0,0));
		    makeDataBase()->SetParamTObj(key_a, "batch_particle", delme);
		}
	    }
	    if (!strncmp(prodx[1], "GetTarget(", 10)) {
		key1 = GetKey(prodx[0], 1, -1);
		if (AddCommand(COMMAND_GETTARGET, key_a, key1, -1)) 
		    found = kTRUE;
		TObject *delme = NULL;
		makeDataBase()->GetParamTObj(key_a, batch_particle_param, &delme);
		if (!delme) {
		    delme = (TObject *) (new PParticle(0,0,0,0));
		    makeDataBase()->SetParamTObj(key_a, "batch_particle", delme);
		}
	    }
	    if (!strncmp(prodx[1],"Push(",5) || !strncmp(prodx[1],"push(",5)) {
		key1 = GetKey(prodx[0],   1, -1);
		key2 = GetKey(prodx[1]+4, 1, -1);
		if (AddCommand(COMMAND_PUSH, key_a, key1, key2)) 
		    found = kTRUE;
	    }
	    if (!strncmp(prodx[1],"Eval(",5) || !strncmp(prodx[1],"eval(",5)) {
		key1 = GetKey(prodx[0], 1, -1);
		char *prodxx[4];
		Int_t prodxx_s = 4; //max 4 products (see test below)

		PUtils::Tokenize(prodx[1]+5, ",", prodxx, &prodxx_s);
		if (prodxx_s > 3) {
		    Warning("AddCommand", "[%s] Too many arguments for ->Eval()", command);
		} 

		*(prodxx[prodxx_s-1]+strlen(prodxx[prodxx_s-1])-1) = '\0'; //remove trailing )
		
		int key3=-1, key4=-1;
		if (prodxx_s > 0) 
		    key2 = GetKey(prodxx[0], 1, -1);
		if (prodxx_s > 1) 
		    key3 = GetKey(prodxx[1], 1, -1);
		if (prodxx_s > 2) 
		    key4 = GetKey(prodxx[2], 1, -1);
		//check if histogram is there...
		TObject *ret;
		if (!makeDataBase()->GetParamTObj(key1, batch_histogram_param, &ret)) {
		    Error("AddCommand", "[%s] Histogram '%s' not found in ->Eval()", command, prodx[0]);
		}
		if (((TH1*)ret)->GetDimension() !=prodxx_s) {
		    Error("AddCommand", "[%s] Histogram '%s' in ->Eval() has dimension %i, but it should have %i",
			  command, prodx[0], ((TH1*)ret)->GetDimension(), prodxx_s);
		}

		if (AddCommand(COMMAND_EVAL, key_a, key1, key2, key3, key4)) {
		    Double_t *delme = new Double_t(0.);
		    makeDataBase()->SetParamDouble(key_a, "batch_value", delme);
		}
		found = kTRUE;
	    }

	    //If there are no (), it could be an internal PValue
	    Int_t found_brackets = 0;
	    for (unsigned int j=0; j<strlen(prodx[1]); j++) {
		if (((prodx[1])[j] == ')') || ((prodx[1])[j] == '('))
		    found_brackets++;
	    }

	    if (!found_brackets) {
		int val_id = pdummy.StringToValueID(prodx[1]);
		int database_id = 0;
		if (val_id < 0) {
		    //check for database entry
		    //positive: param_int (+1)
		    //negative: param_double (-1)
		    database_id = makeDataBase()->GetParamInt(prodx[1]) -
			makeDataBase()->GetParamDouble(prodx[1]);
		    if (database_id == 0)
			Error("AddCommand", "[%s] The value %s is unknown", command, prodx[1]);
		} 
		if ((val_id>=0) || database_id){		    
		    if (strcmp(prodx[0],"*") == 0) { //dummy *
			key1 = GetKey((char *)"dummy", 1, 0);
		    } else {
			key1 = GetKey(prodx[0], 1, 0);
		    }
		    if (key1 >= 0) {
			AddCommand(COMMAND_PVALUE, key_a, key1, val_id, database_id);
			found = kTRUE;
		    } 
		}
	    }

	    //Try to get build-in method
	    if (!found) {
		if (*(prodx[0]) == '{') { //for pchannelmodels:
		    PUtils::remove_brackets(&prodx[0], '{', '}');
		    key1 = makeDataBase()->GetEntry(prodx[0]);
		    if (key1 >= 0) {
			Int_t handle = GetMethodHandle(prodx[1], 2);
			if (handle>=0) {	
			    //cout << "key1:" << key1 << " arg1:" << arg1 << " handle:" << handle << endl;
			    if (AddCommand(COMMAND_INTERNAL, key_a, key1, arg1, arg2, arg3, arg4))  {
				found = kTRUE;
				lst_command_int[command_pointer-1]  = handle;
				flag_command_int[command_pointer-1] = 2;
			    }
			} else {
			    Error("AddCommand", "[%s] The method [%s] is unknown", command, prodx[1]);
			    return kFALSE;
			}
		    } else {
			Error("AddCommand", "[%s] Model [%s] not found", command, prodx[0]);
		    }
		} else { //for pparticle:
		    Int_t handle = GetMethodHandle(prodx[1]);
		    if (handle >= 0) {		
			key1 = GetKey(prodx[0], 1, -1);
			if (AddCommand(COMMAND_INTERNAL, key_a, key1, arg1, arg2, arg3, arg4))  {
			    found = kTRUE;
			    lst_command_int[command_pointer-1]  = handle;
			    flag_command_int[command_pointer-1] = 0;
			}
		    }
		}
	    }

	    //Make another try using the PFormula
	    if (!found) {
		found = EvalPFormula(command);
		if (found) return kTRUE;
	    }
	    
	    if (!found) {
		Error("AddCommand", "[%s] The method ->%s is unknown", command, prodx[1]);
		return kFALSE;
	    } else {
		//final thing is to create the result
		Double_t *delme =  new Double_t(0.);
		makeDataBase()->SetParamDouble(key_a, "batch_value", delme);
		
		return kTRUE;
	    }
	} else {
	    //Warning("AddCommand","[%s] Unknown single command",command);
	    key_a=makeStaticData()->
		MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, command);
	    prod[1] = command; //continue and try the best...
	    //return kFALSE; //not yet done
	}
    } else if (is_operator > 1) {
	//equal
	if (strstr(command, "==")) {
	    for (UInt_t i=0; i<(strlen(command)-1); i++) {
#if 0
		if (command[i]=='=' && command[i+1]=='=' ) {
		    Info("AddCommand","[%s] the '==' is not exact for doubles - lets use '~'",
			 command);
		    command[i] = '~';
		    command[i+1] = ' ';

		}
#endif
	    }
	} else {
	    Error("AddCommand", "[%s] Too many ='s", command);
	    return kFALSE;
	}
    } else {
	PUtils::Tokenize(command, "=", prod, &prod_s);

	key_a = GetKey(prod[0], 2, 2);
	copy_ctor = 1;
    }
    
    found = kFALSE;
    
    if (!is_operator) {
	//look for the arguments
	if (CheckAndSplit(prod[1], '~', &key1, &key2)) {
	    if (AddCommand(COMMAND_EQUAL, key_a, key1, key2))
		found = kTRUE;
	} else if (CheckAndSplit(prod[1], '+', &key1, &key2)) {
	    if (AddCommand('+', key_a, key1, key2))
		found = kTRUE;
	} else if (CheckAndSplit(prod[1], '-', &key1, &key2)) {
	    if (AddCommand('-', key_a, key1, key2))
		found = kTRUE;
	}
    }

    if (!found && copy_ctor) {
	//copy ctor
	key1 = GetKey(prod[1],1,-1);
	key2 = -1;
	if (is_operator == 1) {
	    if (AddCommand(COMMAND_IS, key_a, key1, key2))
		found = kTRUE;
	} else
	    if (AddCommand(COMMAND_EQUAL, key_a, key1, key2))
		found = kTRUE;
//	GetKey(prod[0],0,1);

	Bool_t makenew = kFALSE;

	//is lvalue one of the "switching" functions?
	for (UInt_t i=0; i<strlen(prod[0]); i++) 
	    if (*(prod[0]+i) == ')' || *(prod[0]+i) == '(') {
		makenew = kTRUE;
	    }
	if (makenew) AddCommand(prod[0]);
    } else if (!found) {
	//if nothing helps, try to use the PFormula....
	found = EvalPFormula(command);
	if (found) return kTRUE;
	//....or the wrapper to PUtils
	Int_t handle = GetMethodHandle(command, 1);
	if (handle >= 0) {		
	    //cout << "found PUtils with " << command3<< endl;
	    key1 = makeStaticData()->
		MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, command3);
	    Double_t *delme = new Double_t(0.);
	    makeDataBase()->SetParamDouble(key1, "batch_value", delme);
	    //key1 = GetKey(command3,1,1);
	    if (AddCommand(COMMAND_INTERNAL, key_a, key1, arg1, arg2, arg3, arg4))  {
		found = kTRUE;
		lst_command_int[command_pointer-1]  = handle;
		flag_command_int[command_pointer-1] = 1;
	    }
	    return kTRUE;
	}
    }

    if (found) {
	
	//Now look to the arguments, in order to know
	//if the result object is a PParticle or a double

	Int_t is_obj_result_type   = 0;
	Int_t is_value_result_type = 0;

	Int_t num_args = 1;
	if (key2 > -1) num_args = 2;

	for (int pos=0; pos<num_args; pos++) {
	    //loop over 2 args
	    Int_t key = key1;
	    if (pos == 1) key = key2;
	    
	    if (key > -1) {
		Double_t *delme;
		if (makeDataBase()->GetParamDouble(key, "batch_value", &delme))
		    is_value_result_type++;
		TObject *delme2;
		if (makeDataBase()->GetParamTObj(key, "batch_particle", &delme2))
		    is_obj_result_type++;
		if (!is_value_result_type && !is_obj_result_type) {
		    //have to check if objects are there and what kind they are
		    //4momentum?
		    
		    Int_t type = CheckObjectType(key);
		    if (type < 0) {
			Error("AddCommand", "[%s] Object not identified: %s", command,
			      makeDataBase()->GetName(key));
			return kFALSE;
		    }
		    
		    if (type == IS_OBJECT) is_obj_result_type++;
		    else is_value_result_type++;
		}
	    }
	}

	//cout << key_a << ":" << is_value_result_type << ":"<< is_obj_result_type << endl;

	if (is_obj_result_type) {
	    TObject *delme;
	    if (!makeDataBase()->GetParamTObj(key_a, "batch_particle", &delme)) {
		PParticle *newparticle = new PParticle(0,0,0,0);
		//pid existing? If yes, use it
		Int_t oldpid = makeStaticData()->GetParticleIDByKey(key_a);
		if (oldpid >= 0) newparticle->SetID(oldpid);
		TObject *delme = (TObject *) newparticle;
		makeDataBase()->SetParamTObj(key_a, "batch_particle", delme);
	    }
	}
	if (is_value_result_type) {
	    Double_t *delme;
	    if (!makeDataBase()->GetParamDouble(key_a, "batch_value", &delme)) {
		delme = new Double_t (0.);
		makeDataBase()->SetParamDouble (key_a, "batch_value", delme);
		//some warning for the access to PFormula
		if (is_operator && (strcmp(prod[0],"t") == 0 || strcmp(prod[0],"x") == 0 
				    || strcmp(prod[0],"y") == 0 || strcmp(prod[0],"z") == 0)) {
		    Warning("AddCommand",
			    "[%s] The '%s' is a reserved keyword in TFormula. You might run into problems.",
			    command, prod[0]);
		}
	    }
	}
	return kTRUE;
    } //end found operator

    Error("AddCommand", "[%s] Syntax error", command);

    return kFALSE;
}

void PBatch::AddSpacePlaceholder(char *command) {
    int numbra=0, numcbra=0;
    for (unsigned int i=0; i<strlen(command); i++) {
	if (command[i] == '[') numbra++;
	if (command[i] == '{') numcbra++;
	if (command[i] == ']') numbra--;
	if (command[i] == '}') numcbra--;
	if (numbra && (command[i] == ' '))  command[i] ='#';
	if (numcbra && (command[i] == '+')) command[i] ='\\';
	if (numcbra && (command[i] == '-')) command[i] ='`';
	if (numcbra && (command[i] == '/')) command[i] ='@';
    }
}

void PBatch::RemoveSpacePlaceholder(char *command) {
    int numbra=0, numcbra=0;
    for (unsigned int i=0; i<strlen(command); i++) {
	if (command[i] == '[') numbra++;
	if (command[i] == '{') numcbra++;
	if (command[i] == ']') numbra--;
	if (command[i] == '}') numcbra--;
	if (numbra && (command[i] == '#'))   command[i] =' ';
	if (numcbra && (command[i] == '\\')) command[i] ='+';
	if (numcbra && (command[i] == '`'))  command[i] ='-';
	if (numcbra && (command[i] == '@'))  command[i] ='/';
    }
}

Int_t PBatch::EvalPFormula(char *command) {
    //This helper function evaluates a (possible)
    //PFormula command, and put the arguments on the stack
    //if this did not worked out, the stack is resetted
    AddSpacePlaceholder(command);

    //cout << "PFormula called:" << command << endl;
    PFormula *tmp = new PFormula(command,command);    
    Int_t worked_out = 1, num_params = 0;

    const char *mod_command = command;
    Int_t lst_key_tmp[MAX_COMMAND_OPTIONS]; //can be overwritten by "daughter" commands
    Int_t lst_options_counter_tmp = 0;

    for (int i=0; i<MAX_COMMAND_OPTIONS; i++) lst_key_tmp[i] = -1;

    while (tmp->error_code && num_params<(MAX_COMMAND_OPTIONS-1)) {
	
	//try to get the ugly guy
	//copy the error string first
	char *internal_command = new char[strlen(tmp->error_string.Data())+1];
	strcpy(internal_command, tmp->error_string.Data());

	//cout << "Internal command error: "<< internal_command << endl;
	//BUGBUG
	//if the error string is *exactly* the input command, something is wrong....
	if (strcmp(internal_command,command) == 0) {
	    delete(tmp);
	    RemoveSpacePlaceholder(command);
	    return 0;
	}

	//	mod_command = ...aus PFormula, after replacing	
	TString *op = new TString(tmp->chaine);
	//cout << "Chaine from TFormula: "<< op->Data() << endl;
	char opt[5];
	sprintf(opt, "[%i]", num_params);
	//op->ReplaceAll(tmp->error_string,opt);
	ReplaceAll(op, tmp->error_string, opt);
	mod_command = op->Data();
	//cout << "Modified command: "<< mod_command  << endl;

	delete(tmp);
	RemoveSpacePlaceholder(internal_command);
	Int_t key = GetKey(internal_command, 1, -1);
	if (key >= 0) lst_key_tmp[num_params+1] = key;
	lst_options_counter_tmp++;
	tmp = new PFormula(mod_command, mod_command);   
	num_params++;
    }

    if (tmp->error_code) worked_out = 0;

    if (worked_out) {
	lst_form[command_pointer] = tmp;
	lst_options_counter[command_pointer] = lst_options_counter_tmp;
	for (int i=0; i<MAX_COMMAND_OPTIONS; i++)
	    lst_key[i][command_pointer] = lst_key_tmp[i];
	RemoveSpacePlaceholder(command);	
	Int_t key_a = makeStaticData()->
	    MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, command);
	Double_t *delme =  new Double_t(0.);
	makeDataBase()->SetParamDouble(key_a, "batch_value", delme);
	lst_key_a[command_pointer] = key_a;
	//	lst_key[1][command_pointer]=key1;
	lst_command[command_pointer] = COMMAND_PFORMULA;
	command_pointer++;
    } else RemoveSpacePlaceholder(command);
    
    return worked_out;
}

void PBatch::ReplaceAll(TString *op, const char *oldstring, const char *newstring) {
    //Similar to TString::ReplaceAll, but checks also the following
    //char

    bool doloop = kTRUE;

    while (doloop) {
	const char *mystring = op->Data();
	doloop = kFALSE;

	for (int i=0; i<((int)strlen(mystring)-(int)strlen(oldstring)+1); i++) {
	    //loop over possible matching positions

	    Bool_t varname = kFALSE;

	    if (strncmp(oldstring, mystring+i, strlen(oldstring))==0) {

		if (i) { //not the first position
		    if (PUtils::ValidVariableName(mystring+i-1, strlen(oldstring)+1))
			varname = kTRUE;
		}
		
		if (mystring[i+strlen(oldstring)]) { //not the last
		    if (PUtils::ValidVariableName(mystring+i, strlen(oldstring)+1))
			varname = kTRUE;
		}
		
		// 	    if (strncmp(oldstring,mystring+i,strlen(oldstring))==0) {
		// 		//match
		// 		//cout << "match: " << mystring << ":" << oldstring <<  ":" << newstring << endl;
		// 		char nextchar = mystring[i+strlen(oldstring)];
		
		// 		if ((nextchar == '\0') || 
		// 		    (!isalpha(nextchar) && 
		// 		     (nextchar != '.') &&
		// 		     (nextchar != '-') &&
		// 		     (nextchar != '_')) || 
		// 		    ((nextchar == '-') && (mystring[i+strlen(oldstring)+1] != '>'))
		// 		    ) {
		if (!varname) {
		    op->Replace(i, strlen(oldstring), newstring, strlen(newstring));
		    i = strlen(mystring)+1;
		    doloop = kTRUE;  //yet another try
		}
	    }
	}
    }
}

Int_t PBatch::GetMethodHandle(char *name, Int_t flag) {
    //seeks for the internal method
    //returns a -1 if not found or invalid

    //BUGBUG: have to include overloading

    const TList *list = NULL;
    if (flag == 0)
	list = gROOT->GetClass("PParticle")->GetListOfAllPublicMethods();
    else if (flag == 1)
	list = gROOT->GetClass("PUtilsREngine")->GetListOfAllPublicMethods();
    else if (flag == 2)
	list = gROOT->GetClass("PChannelModel")->GetListOfAllPublicMethods();
    else Fatal("GetMethodHandle", "Unsupported flag");

    TIterator *iter = list->MakeIterator();
    TMethod *meth = NULL;
    int error = 0;

    while (error < 2) {
	if (error == 1) error = 2; //already 2nd turn
	while ((meth = (TMethod *) iter->Next())) {

	    UInt_t realname_len = 0;
	    for (;realname_len<strlen(name); realname_len++) 
		if (name[realname_len] == '(') break;
	    
	    if ((strncmp(meth->GetName(),name,realname_len) == 0) && 
		(strlen(meth->GetName()) == realname_len)) {
		//found name
		//cout << meth->GetReturnTypeName() << endl;
		if ((strcmp(meth->GetReturnTypeName(), "Double_t")   ==0 ) || 
		    (strcmp(meth->GetReturnTypeName(), "Int_t")      ==0 ) || 
		    (strcmp(meth->GetReturnTypeName(), "PParticle*") ==0 ) || 
		    (strcmp(meth->GetReturnTypeName(), "void")       ==0 )) {
		    
		    //Set handle and prepare the pointers		 
		    //is MethodCall existing?

		    for (int i=0; i<method_pointer; i++) {
			if (strcmp(method_name[i],meth->GetName()) == 0) {
			    //found old entry			 
			    CrackMethodArgs(name+realname_len+1);
			    return i;
			}
		    }
		    
		    if (method_pointer == MAX_COMMAND_TMETHODS) {
			Error("GetMethodHandle", "MAX_COMMAND_TMETHODS reached");
			return -1;
		    }
		    
		    arg1 = arg2 = arg3 = arg4 = -1;
		    Int_t numargs = 0;
		    TString argstring("");

		    methods_arg_flags[0][method_pointer]
			= methods_arg_flags[1][method_pointer]
			= methods_arg_flags[2][method_pointer]
			= methods_arg_flags[3][method_pointer] = -1;

		    if (meth->GetNargs() != 0) {
			TList      *arg_list = meth->GetListOfMethodArgs();
			TIterator  *arg_iter = arg_list->MakeIterator();
			TMethodArg *arg_meth;
			
			int j = 0;
			while ((arg_meth=(TMethodArg *) arg_iter->Next())) {
			    //set up the argument list
			    //cout << arg_meth->GetTypeName() << endl;
			    if (j == 4 && error == 2) {
				Error("GetMethodHandle", "More then 4 arguments, not yet supported");
				return -1;
			    }
			    if (strlen(argstring.Data()) > 0) argstring += TString(",");
			    if (strcmp(arg_meth->GetTypeName(),"Double_t") ==0 ) {
				methods_arg_flags[j][method_pointer] = METHOD_RETURN_DOUBLE;
				argstring += TString("Double_t");
			    }
			    else if (strcmp(arg_meth->GetTypeName(),"Int_t") ==0 ) {
				methods_arg_flags[j][method_pointer] = METHOD_RETURN_INT;
				argstring += TString("Int_t");
			    }
			    else if (strcmp(arg_meth->GetTypeName(),"void") ==0 )
				methods_arg_flags[j][method_pointer] = METHOD_RETURN_VOID;
			    else {
				Error("GetMethodHandle", "Method %s has a %s as an argument, not yet supported",
				      name,arg_meth->GetTypeName());
				return -1;
			    }
			    j++;
			}
			
			numargs = CrackMethodArgs(name+realname_len+1);						
		    }

		    methods[method_pointer] = new TMethodCall();
		    
		    //cout << numargs << ":" << meth->GetNargs() << endl;

		    if (numargs == meth->GetNargs()) {
			
			if (strcmp(meth->GetReturnTypeName(), "Double_t") ==0 )
			    methods_flags[method_pointer] = METHOD_RETURN_DOUBLE;
			else if (strcmp(meth->GetReturnTypeName(), "Int_t") ==0 )
			    methods_flags[method_pointer] = METHOD_RETURN_INT;
			else if (strcmp(meth->GetReturnTypeName(), "PParticle*") ==0 )
			    methods_flags[method_pointer] = METHOD_RETURN_PPARTICLE;
			else 
			    methods_flags[method_pointer] = METHOD_RETURN_VOID;
			
			char *new_name = new char[strlen(argstring.Data())+1];
			strcpy(new_name, argstring.Data());
			
			if (flag == 0)
			    methods[method_pointer]->InitWithPrototype(gROOT->GetClass("PParticle"),
								       meth->GetName(), new_name);
			else if (flag == 1)
			    methods[method_pointer]->InitWithPrototype(gROOT->GetClass("PUtilsREngine"),
								       meth->GetName(), new_name);
			else if (flag == 2)
			    methods[method_pointer]->InitWithPrototype(gROOT->GetClass("PChannelModel"),
								       meth->GetName(), new_name);
			new_name = new char[strlen(meth->GetName())+1];
			strcpy(new_name, meth->GetName());
			method_name[method_pointer] = new_name;
			method_pointer++;
			return method_pointer-1;
		    } else { 
			error = 3;
		    }
		  
		}  else {
		    if (!error) {
			error = 1; 
		    } else if (error == 2){
			//unsupported return type
			Error("GetMethodHandle", "Method %s has a return type %s, not yet supported",
			      name, meth->GetReturnTypeName());
		    }
		} // return is matching
	    } // found meth name

	} //meth iter
	if (!error) error = 2;
    } //while error

    if (error == 3) Error("GetMethodHandle", "Method %s does not match any prototype",
			  name);
    return -1;
}

Int_t PBatch::CrackMethodArgs(char *name) {
    //Input: the arg string including the trailing ")"
    arg1 = arg2 = arg3 = arg4 = -1;

    //cout << "CrackMethodArgs:" << name << endl;
    //nested objects should not be cracked!
    //workaround: replace , by "

    Int_t numbrack = 0;
    for (UInt_t i=0; i<strlen(name); i++) {
	if ((name[i]=='(') || (name[i]=='[')) numbrack++;
	if ((name[i]==')') || (name[i]==']')) numbrack--;
	if ((name[i]==',') && (numbrack>0)) name[i]='"';
    }

    char *prodx[4];
    Int_t prodx_s = 4; //max 4 args
    
    PUtils::Tokenize(name, ",", prodx, &prodx_s);
    *(prodx[prodx_s-1]+strlen(prodx[prodx_s-1])-1) = '\0'; //remove trailing )

    if (!prodx_s) return 0;    

    numbrack = 0;
    for (UInt_t i=0; i<strlen(name); i++) {
	if ((name[i]=='(') || (name[i]=='[')) numbrack++;
	if ((name[i]==')') || (name[i]==']')) numbrack--;
	if ((name[i]=='"') && (numbrack>0)) name[i]=',';
    }
    
    arg1 = GetKey(prodx[0], 1, -1);
    if (arg1 < 0) return 0;
    if (prodx_s > 1) arg2 = GetKey(prodx[1], 1, -1);
    if (prodx_s > 2) arg3 = GetKey(prodx[2], 1, -1);
    if (prodx_s > 3) arg4 = GetKey(prodx[3], 1, -1);

    return prodx_s;
}

Int_t PBatch::CheckObjectType(Int_t key) {

    Int_t *ii;
    if (makeDataBase()->GetParamInt (key, pid_param, &ii))
	return IS_OBJECT;

    return -1;
}

Bool_t PBatch::AddCommand(char command, int key_a, int key1, int key2, int key3, int key4, int key5) {

    if (command == '=' && key_a==key1)
	return kTRUE; //filter nonsense

    if (command_pointer == MAX_COMMAND_POINTER) {
	Error ("AddCommand","MAX_COMMAND_POINTER reached");
	return kFALSE;
    }

    lst_command[command_pointer] = command;
    lst_key_a[command_pointer]   = key_a;
    lst_key[1][command_pointer]  = key1;
    lst_key[2][command_pointer]  = key2;
    lst_key[3][command_pointer]  = key3;
    lst_key[4][command_pointer]  = key4;
    lst_key[5][command_pointer]  = key5;

    command_pointer++;

    return kTRUE;
}

Bool_t PBatch::GetArguments(const char *a, char *name, char **function, char **arg1, char **arg2) {
    //looks for syntax like f(a,b);
    
    char *prod[2];
    Int_t prod_s = 2; //max 2 products

    PUtils::Tokenize(name, a, prod, &prod_s);

    if (prod[1] == NULL) {
	*function = NULL;
	prod[1] = prod[0];	
    }

    *(prod[1]+strlen(prod[1])-1) = '\0';
    //kill ")"

    int komma = 0;

    for (UInt_t i=0; i<strlen(prod[1]); i++) {
	if (*(prod[1]+i) == ',') komma++;
    }
    
    if (komma > 1) {
	Error("AddCommand", "[%s] Too many kommas", prod[1]);
	return kFALSE;
    }

    if (komma) {
	char *prodx[2];
	Int_t prodx_s = 2; //max 2 products
	
	PUtils::Tokenize(prod[1], ",", prodx, &prodx_s);
	*arg1 = prodx[0];
	*arg2 = prodx[1];
    } else {
	*arg1 = prod[1];
	*arg2 = NULL;
    }

    return kTRUE;
}

Int_t PBatch::GetDelimPosition(char *arg, char delim, Int_t *yes) {
    
    Int_t brackets = 0, 
	split_pos = -1,
	found_something = 0;
    for (UInt_t i=0; i<strlen(arg); i++) {
	if ((arg[i]=='(') || (arg[i]=='[')) brackets++;
	if ((arg[i]==')') || (arg[i]==']')) brackets--;
	if ((arg[i]==delim) && (brackets==0)) {
	    split_pos = i;
	    if (arg[i+1]=='>' || !found_something) split_pos=-1;
	    //...skip -> and - in the beginning
	    else if (yes) (*yes)++;
	}
	if (arg[i]!=' ') found_something++;
    }

    return split_pos;
}

Bool_t PBatch::CheckAndSplit(char *arg, char delim, int *key1, int *key2) {

    int yes = 0, 
	split_pos = -1;
    
    char *arg2 = new char[strlen(arg)+1];
    strcpy(arg2, arg);
    arg = arg2;

    if (strstr(arg, "->")) return kFALSE;
    if (strstr(arg, "{"))  return kFALSE;

    split_pos = GetDelimPosition(arg, delim, &yes);
    if (!split_pos) return kFALSE;  //nothing to split

    //look if the "-" is a fake minus, e.g. "a < -0.5"
    for (int i=split_pos-1; i>=0; i--) {
	if (arg[i] != ' ') {
	    if (arg[i] == '<' || arg[i] == '>' || arg[i] == '=' 
		|| arg[i] == ':'|| arg[i] == ',') {
		return kFALSE; 
	    }
	    i = -1;	    
	}
    }

    if (!yes) {
	return kFALSE; 
    }

    char *prod[2];
    
    prod[0] = new char[split_pos+1];
    prod[1] = new char[strlen(arg)-split_pos+1];
    strncpy(prod[0], arg, split_pos);
    *(prod[0]+split_pos) = '\0';
    strncpy(prod[1], arg+split_pos+1, strlen(arg)-split_pos-1);
    *(prod[1]+strlen(arg)-split_pos-1) = '\0';

    *key1 = GetKey(prod[0], 1, -1);
    *key2 = GetKey(prod[1], 1, -1);

    return kTRUE;
}

Int_t PBatch::GetKey(char *name, int fl, int makeflag) {

    //makeflag=0  : Pure GetKey, just take the key from DB
    //              no AddCommand()
    //makeflag=1  : put our object into the DB in any case
    //              this is the case for lvalues
    //              e.g. obj = ....
    //              (but see also SetVarList)
    //makeflag=2  : Same as above, but it must be a valid variable name
    //makeflag=-1 : put into DB only if we have a composite object
    //              This is the case if we find () or + or - 
    //              e.g. obj->...
    //              make AddCommand
    //fl=2        : Take SetVarList into account

    //cout << "getKey" << name << ":" << makeflag <<  endl;
  
    //do we contain ()?
    //int br = 0;
    //int found_br = 0;

    //remove brackets if fl==1
    PUtils::remove_spaces(&name);
    if (fl) {
     	//found_br =  PUtils::remove_brackets(&name,'(',')' );
	PUtils::remove_brackets(&name, '(', ')');
    }
    PUtils::remove_spaces(&name);

    Int_t key = -1; 

    if (strlen(name) == 0) return -1;

    //first check for file-input
    if (name[0] == '[' && name[strlen(name)-1]==']' && strlen(name)>2) {
	//found [] at the very begin & end
		
	//further look to the content
	//if we find any additional brackets, it is a composite object!
	Int_t num_brackets = 0;
	for (UInt_t i=1; i<(strlen(name)-1); i++) {
	    if (name[i] == '[' || name[i]==']') num_brackets++;
	}

	if (!num_brackets) {

	    key = makeStaticData()->
		MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, name);
	    
	    char *function, *arg1, *arg2;
	    GetArguments("[", /* "]", */ name, &function, &arg1, &arg2);
	   	    
	    if (!arg1) { 
		Error("AddCommand", "[%s] Argument not found", name);
		return kFALSE;
	    }
	   
	    Int_t pid = 0; //DUMMY

	    if (strcmp(arg1, "*")) {
		//no Joker
		pid = makeStaticData()->GetParticleID(arg1);
		if (pid==0)  { 
		    Error("AddCommand", "[%s] Unknown particle %s", name, arg1);
		    return kFALSE;
		}
	    }
	    
	    Int_t *ii = new int(pid);  //never destructed, but called only once!
	   	
	    if (!makeDataBase()->SetParamInt (key, "batch_pid", ii)) {
		delete ii;
		return kFALSE;
	    }
	    
	    Int_t number = -999;
	    
	    if (arg2) { //try to get number
		Int_t *delme = new Int_t(number);
		Int_t numkey = -999;
		//First, let's check for a variable
		if (arg2[0] == '$') {
		    if (PUtils::ValidVariableName(arg2+1)) {
			numkey = makeDataBase()->GetEntry(arg2+1);
			if (numkey > 0) {
			    Double_t *val = NULL;
			    if (!makeDataBase()->GetParamDouble(numkey, batch_value_param, &val)) {
				numkey = -1;
			    } else {
				Int_t *result = new Int_t(1);
				makeDataBase()->SetParamInt(numkey, "batch_update", result);   
			    }
			}
		    } 
		    if (numkey < 0) {
			Error("AddCommand", "[%s] Unknown variable '%s'", name, arg2);
		    } 
		    *delme = -1000 - numkey; //-999 means not found!
		} else if (PUtils::IsInt(arg2)) {
		    sscanf(arg2, "%i", &number);
		    *delme = number;
		    if (strcmp(arg2,"+") == 0) { 
			*delme = -111;
			status = 1;
		    }
		} else 
		    Error("AddCommand", "[%s] Unknown value '%s'", name, arg2);
		makeDataBase()->SetParamInt(key, "batch_position", delme);
	    }
	    makeflag = 0;
	}
    } //END file input

    if (makeflag==-1 && PUtils::ValidVariableName(name)) {
	//cancel AddCommand
	makeflag = 0;
    }

    if (makeflag==2 && !PUtils::ValidVariableName(name)) {
	//cancel AddCommand
	makeflag = 0;
	Error("GetKey", "[%s] is not a valid variable name", name);
    }
    if (makeflag == 2) 
	makeflag = 1;
    if (makeflag == -1) 
	AddCommand(name);

    if (makeflag) {
	if ((varlist == NULL) || (fl!=2)) {
	    key = makeStaticData()->
		MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, name);
	} else {
	    for (unsigned int j=0; j<((strlen(varlist) - strlen(name))); j++) {
		if ((strncmp(varlist+j,name,strlen(name)) == 0) && 
		    varlist[j+strlen(name)] == ';') {
		    key = makeStaticData()->
			MakeDirectoryEntry("batch_objects", NBATCH_NAME, LBATCH_NAME, name);
		}
	    }
	    if (key < 0) 
		Error("AddCommand",
		      "[%s] is not an allowed object name, the list in this context is [%s] ",
		      name, varlist);
	}
    } else if (key < 0) {
	key = makeDataBase()->GetEntry(name);
    }
    if (key < 0) {
	Error("AddCommand", "[%s] Unknown object", name);
    }
    
    return key;
}

void PBatch::Print(const Option_t *) const {

    cout << "Command list: res <=== arg{key,name}" << endl;

    for (int i=0;i<command_pointer;i++) {

// 	if (lst_command[i] == COMMAND_PFORMULA) {

// 	    cout << makeDataBase()->GetName(lst_key_a[i]) 
// 		 << " <" << lst_command[i] << "> ";
// 	    for (int j=0;j<lst_options_counter[i];j++) {
// 		cout << makeDataBase()->GetName(lst_key[j+1][i])  << " ";
// 	    }
// 	    cout << endl;
// 	} else 
	{
	    
	    if (lst_command[i] == COMMAND_PFORMULA) 
		cout << "[PFormula]  :";
	    if (lst_command[i] == COMMAND_MASS) 
		cout << "->M()       :";
	    if (lst_command[i] == COMMAND_MASS2) 
		cout << "->M2()      :";
	    if (lst_command[i] == COMMAND_IF) 
		cout << "if          :";
	    if (lst_command[i] == COMMAND_PLUS) 
		cout << "+           :";
	    if (lst_command[i] == COMMAND_MINUS) 
		cout << "-           :";
	    if (lst_command[i] == COMMAND_EQUAL) 
		cout << "~           :";
	    if (lst_command[i] == COMMAND_IS) 
		cout << "=           :";
	    if (lst_command[i] == COMMAND_COS) 
		cout << "cos()       :";
	    if (lst_command[i] == COMMAND_BOOST) 
		cout << "->Boost()   :";
	    if (lst_command[i] == COMMAND_GETBEAM) 
		cout << "->GetBeam() :";
	    if (lst_command[i] == COMMAND_GETTARGET) 
		cout << "->GetTarget():";
	    if (lst_command[i] == COMMAND_FABS) 
		cout << "fabs()      :";
	    if (lst_command[i] == COMMAND_PRINT) 
		cout << "->Print()   :";
	    if (lst_command[i] == COMMAND_ROT) 
		cout << "->Rot()     :";
	    if (lst_command[i] == COMMAND_THETA) 
		cout << "->Theta()   :";
	    if (lst_command[i] == COMMAND_INTERNAL) 
		cout << "[internal]  :";
	    if (lst_command[i] == COMMAND_EVAL) 
		cout << "Eval()      :";
	    if (lst_command[i] == COMMAND_GETRANDOM) 
		cout << "GetRandom() :";
	    if (lst_command[i] == COMMAND_ANGLE) 
		cout << "->Angle()   :";
	    if (lst_command[i] == COMMAND_P3M) 
		cout << "P3M()       :";
	    if (lst_command[i] == COMMAND_P3E) 
		cout << "P3E()       :";
	    if (lst_command[i] == COMMAND_PVALUE) 
		cout << ".val        :";
	    if (lst_command[i] == COMMAND_LABEL) 
		cout << "label:      :";
	    if (lst_command[i] == COMMAND_GOTO) 
		cout << "goto        :";
	    if (lst_command[i] == COMMAND_GOSUB) 
		cout << "gosub       :";
	    if (lst_command[i] == COMMAND_RETURN) 
		cout << "return      :";
	    if (lst_command[i] == COMMAND_EXIT) 
		cout << "exit        :";
	    if (lst_command[i] == COMMAND_FORMORE) 
		cout << "formore     :";
	    if (lst_command[i] == COMMAND_FOREACH) 
		cout << "foreach     :";
	    if (lst_command[i] == COMMAND_ECHO) 
		cout << "echo        :";
	    if (lst_command[i] == COMMAND_READLINE) 
		cout << "readline    :";
	    if (lst_command[i] == COMMAND_PUSH) 
		cout << "push        :";
	    if (lst_command[i] == COMMAND_BRANCH) 
		cout << "branch      :";
	    if (lst_command[i] == COMMAND_ELSE) 
		cout << "else        :";

	    if (lst_key_a[i] > -1) {
		cout << makeDataBase()->GetName(lst_key_a[i]);
	    }

	    if (lst_key[1][i] > -1) {
 		cout << " <=== {" << lst_key[1][i] 
		     << "=" << makeDataBase()->GetName(lst_key[1][i]) 
		     << "}";
	    }

	    if (lst_key[2][i] > -1) {
 		cout << ",{" << lst_key[2][i] 
		     << "=" << makeDataBase()->GetName(lst_key[2][i]) 
		     << "}";
	    }

	    if (lst_key[3][i] > -1) {
 		cout << ",{" << lst_key[3][i] 
		     << "=" << makeDataBase()->GetName(lst_key[3][i]) 
		     << "}";
	    }

	    if (lst_key[4][i] > -1) {
 		cout << ",{" << lst_key[4][i] 
		     << "=" << makeDataBase()->GetName(lst_key[4][i]) 
		     << "}";
	    }

	    cout << endl;
	}
    }
}


ClassImp(PBatch)

 PBatch.cc:1
 PBatch.cc:2
 PBatch.cc:3
 PBatch.cc:4
 PBatch.cc:5
 PBatch.cc:6
 PBatch.cc:7
 PBatch.cc:8
 PBatch.cc:9
 PBatch.cc:10
 PBatch.cc:11
 PBatch.cc:12
 PBatch.cc:13
 PBatch.cc:14
 PBatch.cc:15
 PBatch.cc:16
 PBatch.cc:17
 PBatch.cc:18
 PBatch.cc:19
 PBatch.cc:20
 PBatch.cc:21
 PBatch.cc:22
 PBatch.cc:23
 PBatch.cc:24
 PBatch.cc:25
 PBatch.cc:26
 PBatch.cc:27
 PBatch.cc:28
 PBatch.cc:29
 PBatch.cc:30
 PBatch.cc:31
 PBatch.cc:32
 PBatch.cc:33
 PBatch.cc:34
 PBatch.cc:35
 PBatch.cc:36
 PBatch.cc:37
 PBatch.cc:38
 PBatch.cc:39
 PBatch.cc:40
 PBatch.cc:41
 PBatch.cc:42
 PBatch.cc:43
 PBatch.cc:44
 PBatch.cc:45
 PBatch.cc:46
 PBatch.cc:47
 PBatch.cc:48
 PBatch.cc:49
 PBatch.cc:50
 PBatch.cc:51
 PBatch.cc:52
 PBatch.cc:53
 PBatch.cc:54
 PBatch.cc:55
 PBatch.cc:56
 PBatch.cc:57
 PBatch.cc:58
 PBatch.cc:59
 PBatch.cc:60
 PBatch.cc:61
 PBatch.cc:62
 PBatch.cc:63
 PBatch.cc:64
 PBatch.cc:65
 PBatch.cc:66
 PBatch.cc:67
 PBatch.cc:68
 PBatch.cc:69
 PBatch.cc:70
 PBatch.cc:71
 PBatch.cc:72
 PBatch.cc:73
 PBatch.cc:74
 PBatch.cc:75
 PBatch.cc:76
 PBatch.cc:77
 PBatch.cc:78
 PBatch.cc:79
 PBatch.cc:80
 PBatch.cc:81
 PBatch.cc:82
 PBatch.cc:83
 PBatch.cc:84
 PBatch.cc:85
 PBatch.cc:86
 PBatch.cc:87
 PBatch.cc:88
 PBatch.cc:89
 PBatch.cc:90
 PBatch.cc:91
 PBatch.cc:92
 PBatch.cc:93
 PBatch.cc:94
 PBatch.cc:95
 PBatch.cc:96
 PBatch.cc:97
 PBatch.cc:98
 PBatch.cc:99
 PBatch.cc:100
 PBatch.cc:101
 PBatch.cc:102
 PBatch.cc:103
 PBatch.cc:104
 PBatch.cc:105
 PBatch.cc:106
 PBatch.cc:107
 PBatch.cc:108
 PBatch.cc:109
 PBatch.cc:110
 PBatch.cc:111
 PBatch.cc:112
 PBatch.cc:113
 PBatch.cc:114
 PBatch.cc:115
 PBatch.cc:116
 PBatch.cc:117
 PBatch.cc:118
 PBatch.cc:119
 PBatch.cc:120
 PBatch.cc:121
 PBatch.cc:122
 PBatch.cc:123
 PBatch.cc:124
 PBatch.cc:125
 PBatch.cc:126
 PBatch.cc:127
 PBatch.cc:128
 PBatch.cc:129
 PBatch.cc:130
 PBatch.cc:131
 PBatch.cc:132
 PBatch.cc:133
 PBatch.cc:134
 PBatch.cc:135
 PBatch.cc:136
 PBatch.cc:137
 PBatch.cc:138
 PBatch.cc:139
 PBatch.cc:140
 PBatch.cc:141
 PBatch.cc:142
 PBatch.cc:143
 PBatch.cc:144
 PBatch.cc:145
 PBatch.cc:146
 PBatch.cc:147
 PBatch.cc:148
 PBatch.cc:149
 PBatch.cc:150
 PBatch.cc:151
 PBatch.cc:152
 PBatch.cc:153
 PBatch.cc:154
 PBatch.cc:155
 PBatch.cc:156
 PBatch.cc:157
 PBatch.cc:158
 PBatch.cc:159
 PBatch.cc:160
 PBatch.cc:161
 PBatch.cc:162
 PBatch.cc:163
 PBatch.cc:164
 PBatch.cc:165
 PBatch.cc:166
 PBatch.cc:167
 PBatch.cc:168
 PBatch.cc:169
 PBatch.cc:170
 PBatch.cc:171
 PBatch.cc:172
 PBatch.cc:173
 PBatch.cc:174
 PBatch.cc:175
 PBatch.cc:176
 PBatch.cc:177
 PBatch.cc:178
 PBatch.cc:179
 PBatch.cc:180
 PBatch.cc:181
 PBatch.cc:182
 PBatch.cc:183
 PBatch.cc:184
 PBatch.cc:185
 PBatch.cc:186
 PBatch.cc:187
 PBatch.cc:188
 PBatch.cc:189
 PBatch.cc:190
 PBatch.cc:191
 PBatch.cc:192
 PBatch.cc:193
 PBatch.cc:194
 PBatch.cc:195
 PBatch.cc:196
 PBatch.cc:197
 PBatch.cc:198
 PBatch.cc:199
 PBatch.cc:200
 PBatch.cc:201
 PBatch.cc:202
 PBatch.cc:203
 PBatch.cc:204
 PBatch.cc:205
 PBatch.cc:206
 PBatch.cc:207
 PBatch.cc:208
 PBatch.cc:209
 PBatch.cc:210
 PBatch.cc:211
 PBatch.cc:212
 PBatch.cc:213
 PBatch.cc:214
 PBatch.cc:215
 PBatch.cc:216
 PBatch.cc:217
 PBatch.cc:218
 PBatch.cc:219
 PBatch.cc:220
 PBatch.cc:221
 PBatch.cc:222
 PBatch.cc:223
 PBatch.cc:224
 PBatch.cc:225
 PBatch.cc:226
 PBatch.cc:227
 PBatch.cc:228
 PBatch.cc:229
 PBatch.cc:230
 PBatch.cc:231
 PBatch.cc:232
 PBatch.cc:233
 PBatch.cc:234
 PBatch.cc:235
 PBatch.cc:236
 PBatch.cc:237
 PBatch.cc:238
 PBatch.cc:239
 PBatch.cc:240
 PBatch.cc:241
 PBatch.cc:242
 PBatch.cc:243
 PBatch.cc:244
 PBatch.cc:245
 PBatch.cc:246
 PBatch.cc:247
 PBatch.cc:248
 PBatch.cc:249
 PBatch.cc:250
 PBatch.cc:251
 PBatch.cc:252
 PBatch.cc:253
 PBatch.cc:254
 PBatch.cc:255
 PBatch.cc:256
 PBatch.cc:257
 PBatch.cc:258
 PBatch.cc:259
 PBatch.cc:260
 PBatch.cc:261
 PBatch.cc:262
 PBatch.cc:263
 PBatch.cc:264
 PBatch.cc:265
 PBatch.cc:266
 PBatch.cc:267
 PBatch.cc:268
 PBatch.cc:269
 PBatch.cc:270
 PBatch.cc:271
 PBatch.cc:272
 PBatch.cc:273
 PBatch.cc:274
 PBatch.cc:275
 PBatch.cc:276
 PBatch.cc:277
 PBatch.cc:278
 PBatch.cc:279
 PBatch.cc:280
 PBatch.cc:281
 PBatch.cc:282
 PBatch.cc:283
 PBatch.cc:284
 PBatch.cc:285
 PBatch.cc:286
 PBatch.cc:287
 PBatch.cc:288
 PBatch.cc:289
 PBatch.cc:290
 PBatch.cc:291
 PBatch.cc:292
 PBatch.cc:293
 PBatch.cc:294
 PBatch.cc:295
 PBatch.cc:296
 PBatch.cc:297
 PBatch.cc:298
 PBatch.cc:299
 PBatch.cc:300
 PBatch.cc:301
 PBatch.cc:302
 PBatch.cc:303
 PBatch.cc:304
 PBatch.cc:305
 PBatch.cc:306
 PBatch.cc:307
 PBatch.cc:308
 PBatch.cc:309
 PBatch.cc:310
 PBatch.cc:311
 PBatch.cc:312
 PBatch.cc:313
 PBatch.cc:314
 PBatch.cc:315
 PBatch.cc:316
 PBatch.cc:317
 PBatch.cc:318
 PBatch.cc:319
 PBatch.cc:320
 PBatch.cc:321
 PBatch.cc:322
 PBatch.cc:323
 PBatch.cc:324
 PBatch.cc:325
 PBatch.cc:326
 PBatch.cc:327
 PBatch.cc:328
 PBatch.cc:329
 PBatch.cc:330
 PBatch.cc:331
 PBatch.cc:332
 PBatch.cc:333
 PBatch.cc:334
 PBatch.cc:335
 PBatch.cc:336
 PBatch.cc:337
 PBatch.cc:338
 PBatch.cc:339
 PBatch.cc:340
 PBatch.cc:341
 PBatch.cc:342
 PBatch.cc:343
 PBatch.cc:344
 PBatch.cc:345
 PBatch.cc:346
 PBatch.cc:347
 PBatch.cc:348
 PBatch.cc:349
 PBatch.cc:350
 PBatch.cc:351
 PBatch.cc:352
 PBatch.cc:353
 PBatch.cc:354
 PBatch.cc:355
 PBatch.cc:356
 PBatch.cc:357
 PBatch.cc:358
 PBatch.cc:359
 PBatch.cc:360
 PBatch.cc:361
 PBatch.cc:362
 PBatch.cc:363
 PBatch.cc:364
 PBatch.cc:365
 PBatch.cc:366
 PBatch.cc:367
 PBatch.cc:368
 PBatch.cc:369
 PBatch.cc:370
 PBatch.cc:371
 PBatch.cc:372
 PBatch.cc:373
 PBatch.cc:374
 PBatch.cc:375
 PBatch.cc:376
 PBatch.cc:377
 PBatch.cc:378
 PBatch.cc:379
 PBatch.cc:380
 PBatch.cc:381
 PBatch.cc:382
 PBatch.cc:383
 PBatch.cc:384
 PBatch.cc:385
 PBatch.cc:386
 PBatch.cc:387
 PBatch.cc:388
 PBatch.cc:389
 PBatch.cc:390
 PBatch.cc:391
 PBatch.cc:392
 PBatch.cc:393
 PBatch.cc:394
 PBatch.cc:395
 PBatch.cc:396
 PBatch.cc:397
 PBatch.cc:398
 PBatch.cc:399
 PBatch.cc:400
 PBatch.cc:401
 PBatch.cc:402
 PBatch.cc:403
 PBatch.cc:404
 PBatch.cc:405
 PBatch.cc:406
 PBatch.cc:407
 PBatch.cc:408
 PBatch.cc:409
 PBatch.cc:410
 PBatch.cc:411
 PBatch.cc:412
 PBatch.cc:413
 PBatch.cc:414
 PBatch.cc:415
 PBatch.cc:416
 PBatch.cc:417
 PBatch.cc:418
 PBatch.cc:419
 PBatch.cc:420
 PBatch.cc:421
 PBatch.cc:422
 PBatch.cc:423
 PBatch.cc:424
 PBatch.cc:425
 PBatch.cc:426
 PBatch.cc:427
 PBatch.cc:428
 PBatch.cc:429
 PBatch.cc:430
 PBatch.cc:431
 PBatch.cc:432
 PBatch.cc:433
 PBatch.cc:434
 PBatch.cc:435
 PBatch.cc:436
 PBatch.cc:437
 PBatch.cc:438
 PBatch.cc:439
 PBatch.cc:440
 PBatch.cc:441
 PBatch.cc:442
 PBatch.cc:443
 PBatch.cc:444
 PBatch.cc:445
 PBatch.cc:446
 PBatch.cc:447
 PBatch.cc:448
 PBatch.cc:449
 PBatch.cc:450
 PBatch.cc:451
 PBatch.cc:452
 PBatch.cc:453
 PBatch.cc:454
 PBatch.cc:455
 PBatch.cc:456
 PBatch.cc:457
 PBatch.cc:458
 PBatch.cc:459
 PBatch.cc:460
 PBatch.cc:461
 PBatch.cc:462
 PBatch.cc:463
 PBatch.cc:464
 PBatch.cc:465
 PBatch.cc:466
 PBatch.cc:467
 PBatch.cc:468
 PBatch.cc:469
 PBatch.cc:470
 PBatch.cc:471
 PBatch.cc:472
 PBatch.cc:473
 PBatch.cc:474
 PBatch.cc:475
 PBatch.cc:476
 PBatch.cc:477
 PBatch.cc:478
 PBatch.cc:479
 PBatch.cc:480
 PBatch.cc:481
 PBatch.cc:482
 PBatch.cc:483
 PBatch.cc:484
 PBatch.cc:485
 PBatch.cc:486
 PBatch.cc:487
 PBatch.cc:488
 PBatch.cc:489
 PBatch.cc:490
 PBatch.cc:491
 PBatch.cc:492
 PBatch.cc:493
 PBatch.cc:494
 PBatch.cc:495
 PBatch.cc:496
 PBatch.cc:497
 PBatch.cc:498
 PBatch.cc:499
 PBatch.cc:500
 PBatch.cc:501
 PBatch.cc:502
 PBatch.cc:503
 PBatch.cc:504
 PBatch.cc:505
 PBatch.cc:506
 PBatch.cc:507
 PBatch.cc:508
 PBatch.cc:509
 PBatch.cc:510
 PBatch.cc:511
 PBatch.cc:512
 PBatch.cc:513
 PBatch.cc:514
 PBatch.cc:515
 PBatch.cc:516
 PBatch.cc:517
 PBatch.cc:518
 PBatch.cc:519
 PBatch.cc:520
 PBatch.cc:521
 PBatch.cc:522
 PBatch.cc:523
 PBatch.cc:524
 PBatch.cc:525
 PBatch.cc:526
 PBatch.cc:527
 PBatch.cc:528
 PBatch.cc:529
 PBatch.cc:530
 PBatch.cc:531
 PBatch.cc:532
 PBatch.cc:533
 PBatch.cc:534
 PBatch.cc:535
 PBatch.cc:536
 PBatch.cc:537
 PBatch.cc:538
 PBatch.cc:539
 PBatch.cc:540
 PBatch.cc:541
 PBatch.cc:542
 PBatch.cc:543
 PBatch.cc:544
 PBatch.cc:545
 PBatch.cc:546
 PBatch.cc:547
 PBatch.cc:548
 PBatch.cc:549
 PBatch.cc:550
 PBatch.cc:551
 PBatch.cc:552
 PBatch.cc:553
 PBatch.cc:554
 PBatch.cc:555
 PBatch.cc:556
 PBatch.cc:557
 PBatch.cc:558
 PBatch.cc:559
 PBatch.cc:560
 PBatch.cc:561
 PBatch.cc:562
 PBatch.cc:563
 PBatch.cc:564
 PBatch.cc:565
 PBatch.cc:566
 PBatch.cc:567
 PBatch.cc:568
 PBatch.cc:569
 PBatch.cc:570
 PBatch.cc:571
 PBatch.cc:572
 PBatch.cc:573
 PBatch.cc:574
 PBatch.cc:575
 PBatch.cc:576
 PBatch.cc:577
 PBatch.cc:578
 PBatch.cc:579
 PBatch.cc:580
 PBatch.cc:581
 PBatch.cc:582
 PBatch.cc:583
 PBatch.cc:584
 PBatch.cc:585
 PBatch.cc:586
 PBatch.cc:587
 PBatch.cc:588
 PBatch.cc:589
 PBatch.cc:590
 PBatch.cc:591
 PBatch.cc:592
 PBatch.cc:593
 PBatch.cc:594
 PBatch.cc:595
 PBatch.cc:596
 PBatch.cc:597
 PBatch.cc:598
 PBatch.cc:599
 PBatch.cc:600
 PBatch.cc:601
 PBatch.cc:602
 PBatch.cc:603
 PBatch.cc:604
 PBatch.cc:605
 PBatch.cc:606
 PBatch.cc:607
 PBatch.cc:608
 PBatch.cc:609
 PBatch.cc:610
 PBatch.cc:611
 PBatch.cc:612
 PBatch.cc:613
 PBatch.cc:614
 PBatch.cc:615
 PBatch.cc:616
 PBatch.cc:617
 PBatch.cc:618
 PBatch.cc:619
 PBatch.cc:620
 PBatch.cc:621
 PBatch.cc:622
 PBatch.cc:623
 PBatch.cc:624
 PBatch.cc:625
 PBatch.cc:626
 PBatch.cc:627
 PBatch.cc:628
 PBatch.cc:629
 PBatch.cc:630
 PBatch.cc:631
 PBatch.cc:632
 PBatch.cc:633
 PBatch.cc:634
 PBatch.cc:635
 PBatch.cc:636
 PBatch.cc:637
 PBatch.cc:638
 PBatch.cc:639
 PBatch.cc:640
 PBatch.cc:641
 PBatch.cc:642
 PBatch.cc:643
 PBatch.cc:644
 PBatch.cc:645
 PBatch.cc:646
 PBatch.cc:647
 PBatch.cc:648
 PBatch.cc:649
 PBatch.cc:650
 PBatch.cc:651
 PBatch.cc:652
 PBatch.cc:653
 PBatch.cc:654
 PBatch.cc:655
 PBatch.cc:656
 PBatch.cc:657
 PBatch.cc:658
 PBatch.cc:659
 PBatch.cc:660
 PBatch.cc:661
 PBatch.cc:662
 PBatch.cc:663
 PBatch.cc:664
 PBatch.cc:665
 PBatch.cc:666
 PBatch.cc:667
 PBatch.cc:668
 PBatch.cc:669
 PBatch.cc:670
 PBatch.cc:671
 PBatch.cc:672
 PBatch.cc:673
 PBatch.cc:674
 PBatch.cc:675
 PBatch.cc:676
 PBatch.cc:677
 PBatch.cc:678
 PBatch.cc:679
 PBatch.cc:680
 PBatch.cc:681
 PBatch.cc:682
 PBatch.cc:683
 PBatch.cc:684
 PBatch.cc:685
 PBatch.cc:686
 PBatch.cc:687
 PBatch.cc:688
 PBatch.cc:689
 PBatch.cc:690
 PBatch.cc:691
 PBatch.cc:692
 PBatch.cc:693
 PBatch.cc:694
 PBatch.cc:695
 PBatch.cc:696
 PBatch.cc:697
 PBatch.cc:698
 PBatch.cc:699
 PBatch.cc:700
 PBatch.cc:701
 PBatch.cc:702
 PBatch.cc:703
 PBatch.cc:704
 PBatch.cc:705
 PBatch.cc:706
 PBatch.cc:707
 PBatch.cc:708
 PBatch.cc:709
 PBatch.cc:710
 PBatch.cc:711
 PBatch.cc:712
 PBatch.cc:713
 PBatch.cc:714
 PBatch.cc:715
 PBatch.cc:716
 PBatch.cc:717
 PBatch.cc:718
 PBatch.cc:719
 PBatch.cc:720
 PBatch.cc:721
 PBatch.cc:722
 PBatch.cc:723
 PBatch.cc:724
 PBatch.cc:725
 PBatch.cc:726
 PBatch.cc:727
 PBatch.cc:728
 PBatch.cc:729
 PBatch.cc:730
 PBatch.cc:731
 PBatch.cc:732
 PBatch.cc:733
 PBatch.cc:734
 PBatch.cc:735
 PBatch.cc:736
 PBatch.cc:737
 PBatch.cc:738
 PBatch.cc:739
 PBatch.cc:740
 PBatch.cc:741
 PBatch.cc:742
 PBatch.cc:743
 PBatch.cc:744
 PBatch.cc:745
 PBatch.cc:746
 PBatch.cc:747
 PBatch.cc:748
 PBatch.cc:749
 PBatch.cc:750
 PBatch.cc:751
 PBatch.cc:752
 PBatch.cc:753
 PBatch.cc:754
 PBatch.cc:755
 PBatch.cc:756
 PBatch.cc:757
 PBatch.cc:758
 PBatch.cc:759
 PBatch.cc:760
 PBatch.cc:761
 PBatch.cc:762
 PBatch.cc:763
 PBatch.cc:764
 PBatch.cc:765
 PBatch.cc:766
 PBatch.cc:767
 PBatch.cc:768
 PBatch.cc:769
 PBatch.cc:770
 PBatch.cc:771
 PBatch.cc:772
 PBatch.cc:773
 PBatch.cc:774
 PBatch.cc:775
 PBatch.cc:776
 PBatch.cc:777
 PBatch.cc:778
 PBatch.cc:779
 PBatch.cc:780
 PBatch.cc:781
 PBatch.cc:782
 PBatch.cc:783
 PBatch.cc:784
 PBatch.cc:785
 PBatch.cc:786
 PBatch.cc:787
 PBatch.cc:788
 PBatch.cc:789
 PBatch.cc:790
 PBatch.cc:791
 PBatch.cc:792
 PBatch.cc:793
 PBatch.cc:794
 PBatch.cc:795
 PBatch.cc:796
 PBatch.cc:797
 PBatch.cc:798
 PBatch.cc:799
 PBatch.cc:800
 PBatch.cc:801
 PBatch.cc:802
 PBatch.cc:803
 PBatch.cc:804
 PBatch.cc:805
 PBatch.cc:806
 PBatch.cc:807
 PBatch.cc:808
 PBatch.cc:809
 PBatch.cc:810
 PBatch.cc:811
 PBatch.cc:812
 PBatch.cc:813
 PBatch.cc:814
 PBatch.cc:815
 PBatch.cc:816
 PBatch.cc:817
 PBatch.cc:818
 PBatch.cc:819
 PBatch.cc:820
 PBatch.cc:821
 PBatch.cc:822
 PBatch.cc:823
 PBatch.cc:824
 PBatch.cc:825
 PBatch.cc:826
 PBatch.cc:827
 PBatch.cc:828
 PBatch.cc:829
 PBatch.cc:830
 PBatch.cc:831
 PBatch.cc:832
 PBatch.cc:833
 PBatch.cc:834
 PBatch.cc:835
 PBatch.cc:836
 PBatch.cc:837
 PBatch.cc:838
 PBatch.cc:839
 PBatch.cc:840
 PBatch.cc:841
 PBatch.cc:842
 PBatch.cc:843
 PBatch.cc:844
 PBatch.cc:845
 PBatch.cc:846
 PBatch.cc:847
 PBatch.cc:848
 PBatch.cc:849
 PBatch.cc:850
 PBatch.cc:851
 PBatch.cc:852
 PBatch.cc:853
 PBatch.cc:854
 PBatch.cc:855
 PBatch.cc:856
 PBatch.cc:857
 PBatch.cc:858
 PBatch.cc:859
 PBatch.cc:860
 PBatch.cc:861
 PBatch.cc:862
 PBatch.cc:863
 PBatch.cc:864
 PBatch.cc:865
 PBatch.cc:866
 PBatch.cc:867
 PBatch.cc:868
 PBatch.cc:869
 PBatch.cc:870
 PBatch.cc:871
 PBatch.cc:872
 PBatch.cc:873
 PBatch.cc:874
 PBatch.cc:875
 PBatch.cc:876
 PBatch.cc:877
 PBatch.cc:878
 PBatch.cc:879
 PBatch.cc:880
 PBatch.cc:881
 PBatch.cc:882
 PBatch.cc:883
 PBatch.cc:884
 PBatch.cc:885
 PBatch.cc:886
 PBatch.cc:887
 PBatch.cc:888
 PBatch.cc:889
 PBatch.cc:890
 PBatch.cc:891
 PBatch.cc:892
 PBatch.cc:893
 PBatch.cc:894
 PBatch.cc:895
 PBatch.cc:896
 PBatch.cc:897
 PBatch.cc:898
 PBatch.cc:899
 PBatch.cc:900
 PBatch.cc:901
 PBatch.cc:902
 PBatch.cc:903
 PBatch.cc:904
 PBatch.cc:905
 PBatch.cc:906
 PBatch.cc:907
 PBatch.cc:908
 PBatch.cc:909
 PBatch.cc:910
 PBatch.cc:911
 PBatch.cc:912
 PBatch.cc:913
 PBatch.cc:914
 PBatch.cc:915
 PBatch.cc:916
 PBatch.cc:917
 PBatch.cc:918
 PBatch.cc:919
 PBatch.cc:920
 PBatch.cc:921
 PBatch.cc:922
 PBatch.cc:923
 PBatch.cc:924
 PBatch.cc:925
 PBatch.cc:926
 PBatch.cc:927
 PBatch.cc:928
 PBatch.cc:929
 PBatch.cc:930
 PBatch.cc:931
 PBatch.cc:932
 PBatch.cc:933
 PBatch.cc:934
 PBatch.cc:935
 PBatch.cc:936
 PBatch.cc:937
 PBatch.cc:938
 PBatch.cc:939
 PBatch.cc:940
 PBatch.cc:941
 PBatch.cc:942
 PBatch.cc:943
 PBatch.cc:944
 PBatch.cc:945
 PBatch.cc:946
 PBatch.cc:947
 PBatch.cc:948
 PBatch.cc:949
 PBatch.cc:950
 PBatch.cc:951
 PBatch.cc:952
 PBatch.cc:953
 PBatch.cc:954
 PBatch.cc:955
 PBatch.cc:956
 PBatch.cc:957
 PBatch.cc:958
 PBatch.cc:959
 PBatch.cc:960
 PBatch.cc:961
 PBatch.cc:962
 PBatch.cc:963
 PBatch.cc:964
 PBatch.cc:965
 PBatch.cc:966
 PBatch.cc:967
 PBatch.cc:968
 PBatch.cc:969
 PBatch.cc:970
 PBatch.cc:971
 PBatch.cc:972
 PBatch.cc:973
 PBatch.cc:974
 PBatch.cc:975
 PBatch.cc:976
 PBatch.cc:977
 PBatch.cc:978
 PBatch.cc:979
 PBatch.cc:980
 PBatch.cc:981
 PBatch.cc:982
 PBatch.cc:983
 PBatch.cc:984
 PBatch.cc:985
 PBatch.cc:986
 PBatch.cc:987
 PBatch.cc:988
 PBatch.cc:989
 PBatch.cc:990
 PBatch.cc:991
 PBatch.cc:992
 PBatch.cc:993
 PBatch.cc:994
 PBatch.cc:995
 PBatch.cc:996
 PBatch.cc:997
 PBatch.cc:998
 PBatch.cc:999
 PBatch.cc:1000
 PBatch.cc:1001
 PBatch.cc:1002
 PBatch.cc:1003
 PBatch.cc:1004
 PBatch.cc:1005
 PBatch.cc:1006
 PBatch.cc:1007
 PBatch.cc:1008
 PBatch.cc:1009
 PBatch.cc:1010
 PBatch.cc:1011
 PBatch.cc:1012
 PBatch.cc:1013
 PBatch.cc:1014
 PBatch.cc:1015
 PBatch.cc:1016
 PBatch.cc:1017
 PBatch.cc:1018
 PBatch.cc:1019
 PBatch.cc:1020
 PBatch.cc:1021
 PBatch.cc:1022
 PBatch.cc:1023
 PBatch.cc:1024
 PBatch.cc:1025
 PBatch.cc:1026
 PBatch.cc:1027
 PBatch.cc:1028
 PBatch.cc:1029
 PBatch.cc:1030
 PBatch.cc:1031
 PBatch.cc:1032
 PBatch.cc:1033
 PBatch.cc:1034
 PBatch.cc:1035
 PBatch.cc:1036
 PBatch.cc:1037
 PBatch.cc:1038
 PBatch.cc:1039
 PBatch.cc:1040
 PBatch.cc:1041
 PBatch.cc:1042
 PBatch.cc:1043
 PBatch.cc:1044
 PBatch.cc:1045
 PBatch.cc:1046
 PBatch.cc:1047
 PBatch.cc:1048
 PBatch.cc:1049
 PBatch.cc:1050
 PBatch.cc:1051
 PBatch.cc:1052
 PBatch.cc:1053
 PBatch.cc:1054
 PBatch.cc:1055
 PBatch.cc:1056
 PBatch.cc:1057
 PBatch.cc:1058
 PBatch.cc:1059
 PBatch.cc:1060
 PBatch.cc:1061
 PBatch.cc:1062
 PBatch.cc:1063
 PBatch.cc:1064
 PBatch.cc:1065
 PBatch.cc:1066
 PBatch.cc:1067
 PBatch.cc:1068
 PBatch.cc:1069
 PBatch.cc:1070
 PBatch.cc:1071
 PBatch.cc:1072
 PBatch.cc:1073
 PBatch.cc:1074
 PBatch.cc:1075
 PBatch.cc:1076
 PBatch.cc:1077
 PBatch.cc:1078
 PBatch.cc:1079
 PBatch.cc:1080
 PBatch.cc:1081
 PBatch.cc:1082
 PBatch.cc:1083
 PBatch.cc:1084
 PBatch.cc:1085
 PBatch.cc:1086
 PBatch.cc:1087
 PBatch.cc:1088
 PBatch.cc:1089
 PBatch.cc:1090
 PBatch.cc:1091
 PBatch.cc:1092
 PBatch.cc:1093
 PBatch.cc:1094
 PBatch.cc:1095
 PBatch.cc:1096
 PBatch.cc:1097
 PBatch.cc:1098
 PBatch.cc:1099
 PBatch.cc:1100
 PBatch.cc:1101
 PBatch.cc:1102
 PBatch.cc:1103
 PBatch.cc:1104
 PBatch.cc:1105
 PBatch.cc:1106
 PBatch.cc:1107
 PBatch.cc:1108
 PBatch.cc:1109
 PBatch.cc:1110
 PBatch.cc:1111
 PBatch.cc:1112
 PBatch.cc:1113
 PBatch.cc:1114
 PBatch.cc:1115
 PBatch.cc:1116
 PBatch.cc:1117
 PBatch.cc:1118
 PBatch.cc:1119
 PBatch.cc:1120
 PBatch.cc:1121
 PBatch.cc:1122
 PBatch.cc:1123
 PBatch.cc:1124
 PBatch.cc:1125
 PBatch.cc:1126
 PBatch.cc:1127
 PBatch.cc:1128
 PBatch.cc:1129
 PBatch.cc:1130
 PBatch.cc:1131
 PBatch.cc:1132
 PBatch.cc:1133
 PBatch.cc:1134
 PBatch.cc:1135
 PBatch.cc:1136
 PBatch.cc:1137
 PBatch.cc:1138
 PBatch.cc:1139
 PBatch.cc:1140
 PBatch.cc:1141
 PBatch.cc:1142
 PBatch.cc:1143
 PBatch.cc:1144
 PBatch.cc:1145
 PBatch.cc:1146
 PBatch.cc:1147
 PBatch.cc:1148
 PBatch.cc:1149
 PBatch.cc:1150
 PBatch.cc:1151
 PBatch.cc:1152
 PBatch.cc:1153
 PBatch.cc:1154
 PBatch.cc:1155
 PBatch.cc:1156
 PBatch.cc:1157
 PBatch.cc:1158
 PBatch.cc:1159
 PBatch.cc:1160
 PBatch.cc:1161
 PBatch.cc:1162
 PBatch.cc:1163
 PBatch.cc:1164
 PBatch.cc:1165
 PBatch.cc:1166
 PBatch.cc:1167
 PBatch.cc:1168
 PBatch.cc:1169
 PBatch.cc:1170
 PBatch.cc:1171
 PBatch.cc:1172
 PBatch.cc:1173
 PBatch.cc:1174
 PBatch.cc:1175
 PBatch.cc:1176
 PBatch.cc:1177
 PBatch.cc:1178
 PBatch.cc:1179
 PBatch.cc:1180
 PBatch.cc:1181
 PBatch.cc:1182
 PBatch.cc:1183
 PBatch.cc:1184
 PBatch.cc:1185
 PBatch.cc:1186
 PBatch.cc:1187
 PBatch.cc:1188
 PBatch.cc:1189
 PBatch.cc:1190
 PBatch.cc:1191
 PBatch.cc:1192
 PBatch.cc:1193
 PBatch.cc:1194
 PBatch.cc:1195
 PBatch.cc:1196
 PBatch.cc:1197
 PBatch.cc:1198
 PBatch.cc:1199
 PBatch.cc:1200
 PBatch.cc:1201
 PBatch.cc:1202
 PBatch.cc:1203
 PBatch.cc:1204
 PBatch.cc:1205
 PBatch.cc:1206
 PBatch.cc:1207
 PBatch.cc:1208
 PBatch.cc:1209
 PBatch.cc:1210
 PBatch.cc:1211
 PBatch.cc:1212
 PBatch.cc:1213
 PBatch.cc:1214
 PBatch.cc:1215
 PBatch.cc:1216
 PBatch.cc:1217
 PBatch.cc:1218
 PBatch.cc:1219
 PBatch.cc:1220
 PBatch.cc:1221
 PBatch.cc:1222
 PBatch.cc:1223
 PBatch.cc:1224
 PBatch.cc:1225
 PBatch.cc:1226
 PBatch.cc:1227
 PBatch.cc:1228
 PBatch.cc:1229
 PBatch.cc:1230
 PBatch.cc:1231
 PBatch.cc:1232
 PBatch.cc:1233
 PBatch.cc:1234
 PBatch.cc:1235
 PBatch.cc:1236
 PBatch.cc:1237
 PBatch.cc:1238
 PBatch.cc:1239
 PBatch.cc:1240
 PBatch.cc:1241
 PBatch.cc:1242
 PBatch.cc:1243
 PBatch.cc:1244
 PBatch.cc:1245
 PBatch.cc:1246
 PBatch.cc:1247
 PBatch.cc:1248
 PBatch.cc:1249
 PBatch.cc:1250
 PBatch.cc:1251
 PBatch.cc:1252
 PBatch.cc:1253
 PBatch.cc:1254
 PBatch.cc:1255
 PBatch.cc:1256
 PBatch.cc:1257
 PBatch.cc:1258
 PBatch.cc:1259
 PBatch.cc:1260
 PBatch.cc:1261
 PBatch.cc:1262
 PBatch.cc:1263
 PBatch.cc:1264
 PBatch.cc:1265
 PBatch.cc:1266
 PBatch.cc:1267
 PBatch.cc:1268
 PBatch.cc:1269
 PBatch.cc:1270
 PBatch.cc:1271
 PBatch.cc:1272
 PBatch.cc:1273
 PBatch.cc:1274
 PBatch.cc:1275
 PBatch.cc:1276
 PBatch.cc:1277
 PBatch.cc:1278
 PBatch.cc:1279
 PBatch.cc:1280
 PBatch.cc:1281
 PBatch.cc:1282
 PBatch.cc:1283
 PBatch.cc:1284
 PBatch.cc:1285
 PBatch.cc:1286
 PBatch.cc:1287
 PBatch.cc:1288
 PBatch.cc:1289
 PBatch.cc:1290
 PBatch.cc:1291
 PBatch.cc:1292
 PBatch.cc:1293
 PBatch.cc:1294
 PBatch.cc:1295
 PBatch.cc:1296
 PBatch.cc:1297
 PBatch.cc:1298
 PBatch.cc:1299
 PBatch.cc:1300
 PBatch.cc:1301
 PBatch.cc:1302
 PBatch.cc:1303
 PBatch.cc:1304
 PBatch.cc:1305
 PBatch.cc:1306
 PBatch.cc:1307
 PBatch.cc:1308
 PBatch.cc:1309
 PBatch.cc:1310
 PBatch.cc:1311
 PBatch.cc:1312
 PBatch.cc:1313
 PBatch.cc:1314
 PBatch.cc:1315
 PBatch.cc:1316
 PBatch.cc:1317
 PBatch.cc:1318
 PBatch.cc:1319
 PBatch.cc:1320
 PBatch.cc:1321
 PBatch.cc:1322
 PBatch.cc:1323
 PBatch.cc:1324
 PBatch.cc:1325
 PBatch.cc:1326
 PBatch.cc:1327
 PBatch.cc:1328
 PBatch.cc:1329
 PBatch.cc:1330
 PBatch.cc:1331
 PBatch.cc:1332
 PBatch.cc:1333
 PBatch.cc:1334
 PBatch.cc:1335
 PBatch.cc:1336
 PBatch.cc:1337
 PBatch.cc:1338
 PBatch.cc:1339
 PBatch.cc:1340
 PBatch.cc:1341
 PBatch.cc:1342
 PBatch.cc:1343
 PBatch.cc:1344
 PBatch.cc:1345
 PBatch.cc:1346
 PBatch.cc:1347
 PBatch.cc:1348
 PBatch.cc:1349
 PBatch.cc:1350
 PBatch.cc:1351
 PBatch.cc:1352
 PBatch.cc:1353
 PBatch.cc:1354
 PBatch.cc:1355
 PBatch.cc:1356
 PBatch.cc:1357
 PBatch.cc:1358
 PBatch.cc:1359
 PBatch.cc:1360
 PBatch.cc:1361
 PBatch.cc:1362
 PBatch.cc:1363
 PBatch.cc:1364
 PBatch.cc:1365
 PBatch.cc:1366
 PBatch.cc:1367
 PBatch.cc:1368
 PBatch.cc:1369
 PBatch.cc:1370
 PBatch.cc:1371
 PBatch.cc:1372
 PBatch.cc:1373
 PBatch.cc:1374
 PBatch.cc:1375
 PBatch.cc:1376
 PBatch.cc:1377
 PBatch.cc:1378
 PBatch.cc:1379
 PBatch.cc:1380
 PBatch.cc:1381
 PBatch.cc:1382
 PBatch.cc:1383
 PBatch.cc:1384
 PBatch.cc:1385
 PBatch.cc:1386
 PBatch.cc:1387
 PBatch.cc:1388
 PBatch.cc:1389
 PBatch.cc:1390
 PBatch.cc:1391
 PBatch.cc:1392
 PBatch.cc:1393
 PBatch.cc:1394
 PBatch.cc:1395
 PBatch.cc:1396
 PBatch.cc:1397
 PBatch.cc:1398
 PBatch.cc:1399
 PBatch.cc:1400
 PBatch.cc:1401
 PBatch.cc:1402
 PBatch.cc:1403
 PBatch.cc:1404
 PBatch.cc:1405
 PBatch.cc:1406
 PBatch.cc:1407
 PBatch.cc:1408
 PBatch.cc:1409
 PBatch.cc:1410
 PBatch.cc:1411
 PBatch.cc:1412
 PBatch.cc:1413
 PBatch.cc:1414
 PBatch.cc:1415
 PBatch.cc:1416
 PBatch.cc:1417
 PBatch.cc:1418
 PBatch.cc:1419
 PBatch.cc:1420
 PBatch.cc:1421
 PBatch.cc:1422
 PBatch.cc:1423
 PBatch.cc:1424
 PBatch.cc:1425
 PBatch.cc:1426
 PBatch.cc:1427
 PBatch.cc:1428
 PBatch.cc:1429
 PBatch.cc:1430
 PBatch.cc:1431
 PBatch.cc:1432
 PBatch.cc:1433
 PBatch.cc:1434
 PBatch.cc:1435
 PBatch.cc:1436
 PBatch.cc:1437
 PBatch.cc:1438
 PBatch.cc:1439
 PBatch.cc:1440
 PBatch.cc:1441
 PBatch.cc:1442
 PBatch.cc:1443
 PBatch.cc:1444
 PBatch.cc:1445
 PBatch.cc:1446
 PBatch.cc:1447
 PBatch.cc:1448
 PBatch.cc:1449
 PBatch.cc:1450
 PBatch.cc:1451
 PBatch.cc:1452
 PBatch.cc:1453
 PBatch.cc:1454
 PBatch.cc:1455
 PBatch.cc:1456
 PBatch.cc:1457
 PBatch.cc:1458
 PBatch.cc:1459
 PBatch.cc:1460
 PBatch.cc:1461
 PBatch.cc:1462
 PBatch.cc:1463
 PBatch.cc:1464
 PBatch.cc:1465
 PBatch.cc:1466
 PBatch.cc:1467
 PBatch.cc:1468
 PBatch.cc:1469
 PBatch.cc:1470
 PBatch.cc:1471
 PBatch.cc:1472
 PBatch.cc:1473
 PBatch.cc:1474
 PBatch.cc:1475
 PBatch.cc:1476
 PBatch.cc:1477
 PBatch.cc:1478
 PBatch.cc:1479
 PBatch.cc:1480
 PBatch.cc:1481
 PBatch.cc:1482
 PBatch.cc:1483
 PBatch.cc:1484
 PBatch.cc:1485
 PBatch.cc:1486
 PBatch.cc:1487
 PBatch.cc:1488
 PBatch.cc:1489
 PBatch.cc:1490
 PBatch.cc:1491
 PBatch.cc:1492
 PBatch.cc:1493
 PBatch.cc:1494
 PBatch.cc:1495
 PBatch.cc:1496
 PBatch.cc:1497
 PBatch.cc:1498
 PBatch.cc:1499
 PBatch.cc:1500
 PBatch.cc:1501
 PBatch.cc:1502
 PBatch.cc:1503
 PBatch.cc:1504
 PBatch.cc:1505
 PBatch.cc:1506
 PBatch.cc:1507
 PBatch.cc:1508
 PBatch.cc:1509
 PBatch.cc:1510
 PBatch.cc:1511
 PBatch.cc:1512
 PBatch.cc:1513
 PBatch.cc:1514
 PBatch.cc:1515
 PBatch.cc:1516
 PBatch.cc:1517
 PBatch.cc:1518
 PBatch.cc:1519
 PBatch.cc:1520
 PBatch.cc:1521
 PBatch.cc:1522
 PBatch.cc:1523
 PBatch.cc:1524
 PBatch.cc:1525
 PBatch.cc:1526
 PBatch.cc:1527
 PBatch.cc:1528
 PBatch.cc:1529
 PBatch.cc:1530
 PBatch.cc:1531
 PBatch.cc:1532
 PBatch.cc:1533
 PBatch.cc:1534
 PBatch.cc:1535
 PBatch.cc:1536
 PBatch.cc:1537
 PBatch.cc:1538
 PBatch.cc:1539
 PBatch.cc:1540
 PBatch.cc:1541
 PBatch.cc:1542
 PBatch.cc:1543
 PBatch.cc:1544
 PBatch.cc:1545
 PBatch.cc:1546
 PBatch.cc:1547
 PBatch.cc:1548
 PBatch.cc:1549
 PBatch.cc:1550
 PBatch.cc:1551
 PBatch.cc:1552
 PBatch.cc:1553
 PBatch.cc:1554
 PBatch.cc:1555
 PBatch.cc:1556
 PBatch.cc:1557
 PBatch.cc:1558
 PBatch.cc:1559
 PBatch.cc:1560
 PBatch.cc:1561
 PBatch.cc:1562
 PBatch.cc:1563
 PBatch.cc:1564
 PBatch.cc:1565
 PBatch.cc:1566
 PBatch.cc:1567
 PBatch.cc:1568
 PBatch.cc:1569
 PBatch.cc:1570
 PBatch.cc:1571
 PBatch.cc:1572
 PBatch.cc:1573
 PBatch.cc:1574
 PBatch.cc:1575
 PBatch.cc:1576
 PBatch.cc:1577
 PBatch.cc:1578
 PBatch.cc:1579
 PBatch.cc:1580
 PBatch.cc:1581
 PBatch.cc:1582
 PBatch.cc:1583
 PBatch.cc:1584
 PBatch.cc:1585
 PBatch.cc:1586
 PBatch.cc:1587
 PBatch.cc:1588
 PBatch.cc:1589
 PBatch.cc:1590
 PBatch.cc:1591
 PBatch.cc:1592
 PBatch.cc:1593
 PBatch.cc:1594
 PBatch.cc:1595
 PBatch.cc:1596
 PBatch.cc:1597
 PBatch.cc:1598
 PBatch.cc:1599
 PBatch.cc:1600
 PBatch.cc:1601
 PBatch.cc:1602
 PBatch.cc:1603
 PBatch.cc:1604
 PBatch.cc:1605
 PBatch.cc:1606
 PBatch.cc:1607
 PBatch.cc:1608
 PBatch.cc:1609
 PBatch.cc:1610
 PBatch.cc:1611
 PBatch.cc:1612
 PBatch.cc:1613
 PBatch.cc:1614
 PBatch.cc:1615
 PBatch.cc:1616
 PBatch.cc:1617
 PBatch.cc:1618
 PBatch.cc:1619
 PBatch.cc:1620
 PBatch.cc:1621
 PBatch.cc:1622
 PBatch.cc:1623
 PBatch.cc:1624
 PBatch.cc:1625
 PBatch.cc:1626
 PBatch.cc:1627
 PBatch.cc:1628
 PBatch.cc:1629
 PBatch.cc:1630
 PBatch.cc:1631
 PBatch.cc:1632
 PBatch.cc:1633
 PBatch.cc:1634
 PBatch.cc:1635
 PBatch.cc:1636
 PBatch.cc:1637
 PBatch.cc:1638
 PBatch.cc:1639
 PBatch.cc:1640
 PBatch.cc:1641
 PBatch.cc:1642
 PBatch.cc:1643
 PBatch.cc:1644
 PBatch.cc:1645
 PBatch.cc:1646
 PBatch.cc:1647
 PBatch.cc:1648
 PBatch.cc:1649
 PBatch.cc:1650
 PBatch.cc:1651
 PBatch.cc:1652
 PBatch.cc:1653
 PBatch.cc:1654
 PBatch.cc:1655
 PBatch.cc:1656
 PBatch.cc:1657
 PBatch.cc:1658
 PBatch.cc:1659
 PBatch.cc:1660
 PBatch.cc:1661
 PBatch.cc:1662
 PBatch.cc:1663
 PBatch.cc:1664
 PBatch.cc:1665
 PBatch.cc:1666
 PBatch.cc:1667
 PBatch.cc:1668
 PBatch.cc:1669
 PBatch.cc:1670
 PBatch.cc:1671
 PBatch.cc:1672
 PBatch.cc:1673
 PBatch.cc:1674
 PBatch.cc:1675
 PBatch.cc:1676
 PBatch.cc:1677
 PBatch.cc:1678
 PBatch.cc:1679
 PBatch.cc:1680
 PBatch.cc:1681
 PBatch.cc:1682
 PBatch.cc:1683
 PBatch.cc:1684
 PBatch.cc:1685
 PBatch.cc:1686
 PBatch.cc:1687
 PBatch.cc:1688
 PBatch.cc:1689
 PBatch.cc:1690
 PBatch.cc:1691
 PBatch.cc:1692
 PBatch.cc:1693
 PBatch.cc:1694
 PBatch.cc:1695
 PBatch.cc:1696
 PBatch.cc:1697
 PBatch.cc:1698
 PBatch.cc:1699
 PBatch.cc:1700
 PBatch.cc:1701
 PBatch.cc:1702
 PBatch.cc:1703
 PBatch.cc:1704
 PBatch.cc:1705
 PBatch.cc:1706
 PBatch.cc:1707
 PBatch.cc:1708
 PBatch.cc:1709
 PBatch.cc:1710
 PBatch.cc:1711
 PBatch.cc:1712
 PBatch.cc:1713
 PBatch.cc:1714
 PBatch.cc:1715
 PBatch.cc:1716
 PBatch.cc:1717
 PBatch.cc:1718
 PBatch.cc:1719
 PBatch.cc:1720
 PBatch.cc:1721
 PBatch.cc:1722
 PBatch.cc:1723
 PBatch.cc:1724
 PBatch.cc:1725
 PBatch.cc:1726
 PBatch.cc:1727
 PBatch.cc:1728
 PBatch.cc:1729
 PBatch.cc:1730
 PBatch.cc:1731
 PBatch.cc:1732
 PBatch.cc:1733
 PBatch.cc:1734
 PBatch.cc:1735
 PBatch.cc:1736
 PBatch.cc:1737
 PBatch.cc:1738
 PBatch.cc:1739
 PBatch.cc:1740
 PBatch.cc:1741
 PBatch.cc:1742
 PBatch.cc:1743
 PBatch.cc:1744
 PBatch.cc:1745
 PBatch.cc:1746
 PBatch.cc:1747
 PBatch.cc:1748
 PBatch.cc:1749
 PBatch.cc:1750
 PBatch.cc:1751
 PBatch.cc:1752
 PBatch.cc:1753
 PBatch.cc:1754
 PBatch.cc:1755
 PBatch.cc:1756
 PBatch.cc:1757
 PBatch.cc:1758
 PBatch.cc:1759
 PBatch.cc:1760
 PBatch.cc:1761
 PBatch.cc:1762
 PBatch.cc:1763
 PBatch.cc:1764
 PBatch.cc:1765
 PBatch.cc:1766
 PBatch.cc:1767
 PBatch.cc:1768
 PBatch.cc:1769
 PBatch.cc:1770
 PBatch.cc:1771
 PBatch.cc:1772
 PBatch.cc:1773
 PBatch.cc:1774
 PBatch.cc:1775
 PBatch.cc:1776
 PBatch.cc:1777
 PBatch.cc:1778
 PBatch.cc:1779
 PBatch.cc:1780
 PBatch.cc:1781
 PBatch.cc:1782
 PBatch.cc:1783
 PBatch.cc:1784
 PBatch.cc:1785
 PBatch.cc:1786
 PBatch.cc:1787
 PBatch.cc:1788
 PBatch.cc:1789
 PBatch.cc:1790
 PBatch.cc:1791
 PBatch.cc:1792
 PBatch.cc:1793
 PBatch.cc:1794
 PBatch.cc:1795
 PBatch.cc:1796
 PBatch.cc:1797
 PBatch.cc:1798
 PBatch.cc:1799
 PBatch.cc:1800
 PBatch.cc:1801
 PBatch.cc:1802
 PBatch.cc:1803
 PBatch.cc:1804
 PBatch.cc:1805
 PBatch.cc:1806
 PBatch.cc:1807
 PBatch.cc:1808
 PBatch.cc:1809
 PBatch.cc:1810
 PBatch.cc:1811
 PBatch.cc:1812
 PBatch.cc:1813
 PBatch.cc:1814
 PBatch.cc:1815
 PBatch.cc:1816
 PBatch.cc:1817
 PBatch.cc:1818
 PBatch.cc:1819
 PBatch.cc:1820
 PBatch.cc:1821
 PBatch.cc:1822
 PBatch.cc:1823
 PBatch.cc:1824
 PBatch.cc:1825
 PBatch.cc:1826
 PBatch.cc:1827
 PBatch.cc:1828
 PBatch.cc:1829
 PBatch.cc:1830
 PBatch.cc:1831
 PBatch.cc:1832
 PBatch.cc:1833
 PBatch.cc:1834
 PBatch.cc:1835
 PBatch.cc:1836
 PBatch.cc:1837
 PBatch.cc:1838
 PBatch.cc:1839
 PBatch.cc:1840
 PBatch.cc:1841
 PBatch.cc:1842
 PBatch.cc:1843
 PBatch.cc:1844
 PBatch.cc:1845
 PBatch.cc:1846
 PBatch.cc:1847
 PBatch.cc:1848
 PBatch.cc:1849
 PBatch.cc:1850
 PBatch.cc:1851
 PBatch.cc:1852
 PBatch.cc:1853
 PBatch.cc:1854
 PBatch.cc:1855
 PBatch.cc:1856
 PBatch.cc:1857
 PBatch.cc:1858
 PBatch.cc:1859
 PBatch.cc:1860
 PBatch.cc:1861
 PBatch.cc:1862
 PBatch.cc:1863
 PBatch.cc:1864
 PBatch.cc:1865
 PBatch.cc:1866
 PBatch.cc:1867
 PBatch.cc:1868
 PBatch.cc:1869
 PBatch.cc:1870
 PBatch.cc:1871
 PBatch.cc:1872
 PBatch.cc:1873
 PBatch.cc:1874
 PBatch.cc:1875
 PBatch.cc:1876
 PBatch.cc:1877
 PBatch.cc:1878
 PBatch.cc:1879
 PBatch.cc:1880
 PBatch.cc:1881
 PBatch.cc:1882
 PBatch.cc:1883
 PBatch.cc:1884
 PBatch.cc:1885
 PBatch.cc:1886
 PBatch.cc:1887
 PBatch.cc:1888
 PBatch.cc:1889
 PBatch.cc:1890
 PBatch.cc:1891
 PBatch.cc:1892
 PBatch.cc:1893
 PBatch.cc:1894
 PBatch.cc:1895
 PBatch.cc:1896
 PBatch.cc:1897
 PBatch.cc:1898
 PBatch.cc:1899
 PBatch.cc:1900
 PBatch.cc:1901
 PBatch.cc:1902
 PBatch.cc:1903
 PBatch.cc:1904
 PBatch.cc:1905
 PBatch.cc:1906
 PBatch.cc:1907
 PBatch.cc:1908
 PBatch.cc:1909
 PBatch.cc:1910
 PBatch.cc:1911
 PBatch.cc:1912
 PBatch.cc:1913
 PBatch.cc:1914
 PBatch.cc:1915
 PBatch.cc:1916
 PBatch.cc:1917
 PBatch.cc:1918
 PBatch.cc:1919
 PBatch.cc:1920
 PBatch.cc:1921
 PBatch.cc:1922
 PBatch.cc:1923
 PBatch.cc:1924
 PBatch.cc:1925
 PBatch.cc:1926
 PBatch.cc:1927
 PBatch.cc:1928
 PBatch.cc:1929
 PBatch.cc:1930
 PBatch.cc:1931
 PBatch.cc:1932
 PBatch.cc:1933
 PBatch.cc:1934
 PBatch.cc:1935
 PBatch.cc:1936
 PBatch.cc:1937
 PBatch.cc:1938
 PBatch.cc:1939
 PBatch.cc:1940
 PBatch.cc:1941
 PBatch.cc:1942
 PBatch.cc:1943
 PBatch.cc:1944
 PBatch.cc:1945
 PBatch.cc:1946
 PBatch.cc:1947
 PBatch.cc:1948
 PBatch.cc:1949
 PBatch.cc:1950
 PBatch.cc:1951
 PBatch.cc:1952
 PBatch.cc:1953
 PBatch.cc:1954
 PBatch.cc:1955
 PBatch.cc:1956
 PBatch.cc:1957
 PBatch.cc:1958
 PBatch.cc:1959
 PBatch.cc:1960
 PBatch.cc:1961
 PBatch.cc:1962
 PBatch.cc:1963
 PBatch.cc:1964
 PBatch.cc:1965
 PBatch.cc:1966
 PBatch.cc:1967
 PBatch.cc:1968
 PBatch.cc:1969
 PBatch.cc:1970
 PBatch.cc:1971
 PBatch.cc:1972
 PBatch.cc:1973
 PBatch.cc:1974
 PBatch.cc:1975
 PBatch.cc:1976
 PBatch.cc:1977
 PBatch.cc:1978
 PBatch.cc:1979
 PBatch.cc:1980
 PBatch.cc:1981
 PBatch.cc:1982
 PBatch.cc:1983
 PBatch.cc:1984
 PBatch.cc:1985
 PBatch.cc:1986
 PBatch.cc:1987
 PBatch.cc:1988
 PBatch.cc:1989
 PBatch.cc:1990
 PBatch.cc:1991
 PBatch.cc:1992
 PBatch.cc:1993
 PBatch.cc:1994
 PBatch.cc:1995
 PBatch.cc:1996
 PBatch.cc:1997
 PBatch.cc:1998
 PBatch.cc:1999
 PBatch.cc:2000
 PBatch.cc:2001
 PBatch.cc:2002
 PBatch.cc:2003
 PBatch.cc:2004
 PBatch.cc:2005
 PBatch.cc:2006
 PBatch.cc:2007
 PBatch.cc:2008
 PBatch.cc:2009
 PBatch.cc:2010
 PBatch.cc:2011
 PBatch.cc:2012
 PBatch.cc:2013
 PBatch.cc:2014
 PBatch.cc:2015
 PBatch.cc:2016
 PBatch.cc:2017
 PBatch.cc:2018
 PBatch.cc:2019
 PBatch.cc:2020
 PBatch.cc:2021
 PBatch.cc:2022
 PBatch.cc:2023
 PBatch.cc:2024
 PBatch.cc:2025
 PBatch.cc:2026
 PBatch.cc:2027
 PBatch.cc:2028
 PBatch.cc:2029
 PBatch.cc:2030
 PBatch.cc:2031
 PBatch.cc:2032
 PBatch.cc:2033
 PBatch.cc:2034
 PBatch.cc:2035
 PBatch.cc:2036
 PBatch.cc:2037
 PBatch.cc:2038
 PBatch.cc:2039
 PBatch.cc:2040
 PBatch.cc:2041
 PBatch.cc:2042
 PBatch.cc:2043
 PBatch.cc:2044
 PBatch.cc:2045
 PBatch.cc:2046
 PBatch.cc:2047
 PBatch.cc:2048
 PBatch.cc:2049
 PBatch.cc:2050
 PBatch.cc:2051
 PBatch.cc:2052
 PBatch.cc:2053
 PBatch.cc:2054
 PBatch.cc:2055
 PBatch.cc:2056
 PBatch.cc:2057
 PBatch.cc:2058
 PBatch.cc:2059
 PBatch.cc:2060
 PBatch.cc:2061
 PBatch.cc:2062
 PBatch.cc:2063
 PBatch.cc:2064
 PBatch.cc:2065
 PBatch.cc:2066
 PBatch.cc:2067
 PBatch.cc:2068
 PBatch.cc:2069
 PBatch.cc:2070
 PBatch.cc:2071
 PBatch.cc:2072
 PBatch.cc:2073
 PBatch.cc:2074
 PBatch.cc:2075
 PBatch.cc:2076
 PBatch.cc:2077
 PBatch.cc:2078
 PBatch.cc:2079
 PBatch.cc:2080
 PBatch.cc:2081
 PBatch.cc:2082
 PBatch.cc:2083
 PBatch.cc:2084
 PBatch.cc:2085
 PBatch.cc:2086
 PBatch.cc:2087
 PBatch.cc:2088
 PBatch.cc:2089
 PBatch.cc:2090
 PBatch.cc:2091
 PBatch.cc:2092
 PBatch.cc:2093
 PBatch.cc:2094
 PBatch.cc:2095
 PBatch.cc:2096
 PBatch.cc:2097
 PBatch.cc:2098
 PBatch.cc:2099
 PBatch.cc:2100
 PBatch.cc:2101
 PBatch.cc:2102
 PBatch.cc:2103
 PBatch.cc:2104
 PBatch.cc:2105
 PBatch.cc:2106
 PBatch.cc:2107
 PBatch.cc:2108
 PBatch.cc:2109
 PBatch.cc:2110
 PBatch.cc:2111
 PBatch.cc:2112
 PBatch.cc:2113
 PBatch.cc:2114
 PBatch.cc:2115
 PBatch.cc:2116
 PBatch.cc:2117
 PBatch.cc:2118
 PBatch.cc:2119
 PBatch.cc:2120
 PBatch.cc:2121
 PBatch.cc:2122
 PBatch.cc:2123
 PBatch.cc:2124
 PBatch.cc:2125
 PBatch.cc:2126
 PBatch.cc:2127
 PBatch.cc:2128
 PBatch.cc:2129
 PBatch.cc:2130
 PBatch.cc:2131
 PBatch.cc:2132
 PBatch.cc:2133
 PBatch.cc:2134
 PBatch.cc:2135
 PBatch.cc:2136
 PBatch.cc:2137
 PBatch.cc:2138
 PBatch.cc:2139
 PBatch.cc:2140
 PBatch.cc:2141
 PBatch.cc:2142
 PBatch.cc:2143
 PBatch.cc:2144
 PBatch.cc:2145
 PBatch.cc:2146
 PBatch.cc:2147
 PBatch.cc:2148
 PBatch.cc:2149
 PBatch.cc:2150
 PBatch.cc:2151
 PBatch.cc:2152
 PBatch.cc:2153
 PBatch.cc:2154
 PBatch.cc:2155
 PBatch.cc:2156
 PBatch.cc:2157
 PBatch.cc:2158
 PBatch.cc:2159
 PBatch.cc:2160
 PBatch.cc:2161
 PBatch.cc:2162
 PBatch.cc:2163
 PBatch.cc:2164
 PBatch.cc:2165
 PBatch.cc:2166
 PBatch.cc:2167
 PBatch.cc:2168
 PBatch.cc:2169
 PBatch.cc:2170
 PBatch.cc:2171
 PBatch.cc:2172
 PBatch.cc:2173
 PBatch.cc:2174
 PBatch.cc:2175
 PBatch.cc:2176
 PBatch.cc:2177
 PBatch.cc:2178
 PBatch.cc:2179
 PBatch.cc:2180
 PBatch.cc:2181
 PBatch.cc:2182
 PBatch.cc:2183
 PBatch.cc:2184
 PBatch.cc:2185
 PBatch.cc:2186
 PBatch.cc:2187
 PBatch.cc:2188
 PBatch.cc:2189
 PBatch.cc:2190
 PBatch.cc:2191
 PBatch.cc:2192
 PBatch.cc:2193
 PBatch.cc:2194
 PBatch.cc:2195
 PBatch.cc:2196
 PBatch.cc:2197
 PBatch.cc:2198
 PBatch.cc:2199
 PBatch.cc:2200
 PBatch.cc:2201
 PBatch.cc:2202
 PBatch.cc:2203
 PBatch.cc:2204
 PBatch.cc:2205
 PBatch.cc:2206
 PBatch.cc:2207
 PBatch.cc:2208
 PBatch.cc:2209
 PBatch.cc:2210
 PBatch.cc:2211
 PBatch.cc:2212
 PBatch.cc:2213
 PBatch.cc:2214
 PBatch.cc:2215
 PBatch.cc:2216
 PBatch.cc:2217
 PBatch.cc:2218
 PBatch.cc:2219
 PBatch.cc:2220
 PBatch.cc:2221
 PBatch.cc:2222
 PBatch.cc:2223
 PBatch.cc:2224
 PBatch.cc:2225
 PBatch.cc:2226
 PBatch.cc:2227
 PBatch.cc:2228
 PBatch.cc:2229
 PBatch.cc:2230
 PBatch.cc:2231
 PBatch.cc:2232
 PBatch.cc:2233
 PBatch.cc:2234
 PBatch.cc:2235
 PBatch.cc:2236
 PBatch.cc:2237
 PBatch.cc:2238
 PBatch.cc:2239
 PBatch.cc:2240
 PBatch.cc:2241
 PBatch.cc:2242
 PBatch.cc:2243
 PBatch.cc:2244
 PBatch.cc:2245
 PBatch.cc:2246
 PBatch.cc:2247
 PBatch.cc:2248
 PBatch.cc:2249
 PBatch.cc:2250
 PBatch.cc:2251
 PBatch.cc:2252
 PBatch.cc:2253
 PBatch.cc:2254
 PBatch.cc:2255
 PBatch.cc:2256
 PBatch.cc:2257
 PBatch.cc:2258
 PBatch.cc:2259
 PBatch.cc:2260
 PBatch.cc:2261
 PBatch.cc:2262
 PBatch.cc:2263
 PBatch.cc:2264
 PBatch.cc:2265
 PBatch.cc:2266
 PBatch.cc:2267
 PBatch.cc:2268
 PBatch.cc:2269
 PBatch.cc:2270
 PBatch.cc:2271
 PBatch.cc:2272
 PBatch.cc:2273
 PBatch.cc:2274
 PBatch.cc:2275
 PBatch.cc:2276
 PBatch.cc:2277
 PBatch.cc:2278
 PBatch.cc:2279
 PBatch.cc:2280
 PBatch.cc:2281
 PBatch.cc:2282
 PBatch.cc:2283
 PBatch.cc:2284
 PBatch.cc:2285
 PBatch.cc:2286
 PBatch.cc:2287
 PBatch.cc:2288
 PBatch.cc:2289
 PBatch.cc:2290
 PBatch.cc:2291
 PBatch.cc:2292
 PBatch.cc:2293
 PBatch.cc:2294
 PBatch.cc:2295
 PBatch.cc:2296
 PBatch.cc:2297
 PBatch.cc:2298
 PBatch.cc:2299
 PBatch.cc:2300
 PBatch.cc:2301
 PBatch.cc:2302
 PBatch.cc:2303
 PBatch.cc:2304
 PBatch.cc:2305
 PBatch.cc:2306
 PBatch.cc:2307
 PBatch.cc:2308
 PBatch.cc:2309
 PBatch.cc:2310
 PBatch.cc:2311
 PBatch.cc:2312
 PBatch.cc:2313
 PBatch.cc:2314
 PBatch.cc:2315
 PBatch.cc:2316
 PBatch.cc:2317
 PBatch.cc:2318
 PBatch.cc:2319
 PBatch.cc:2320
 PBatch.cc:2321
 PBatch.cc:2322
 PBatch.cc:2323
 PBatch.cc:2324
 PBatch.cc:2325
 PBatch.cc:2326
 PBatch.cc:2327
 PBatch.cc:2328
 PBatch.cc:2329
 PBatch.cc:2330
 PBatch.cc:2331
 PBatch.cc:2332
 PBatch.cc:2333
 PBatch.cc:2334
 PBatch.cc:2335
 PBatch.cc:2336
 PBatch.cc:2337
 PBatch.cc:2338
 PBatch.cc:2339
 PBatch.cc:2340
 PBatch.cc:2341
 PBatch.cc:2342
 PBatch.cc:2343
 PBatch.cc:2344
 PBatch.cc:2345
 PBatch.cc:2346
 PBatch.cc:2347
 PBatch.cc:2348
 PBatch.cc:2349
 PBatch.cc:2350
 PBatch.cc:2351
 PBatch.cc:2352
 PBatch.cc:2353
 PBatch.cc:2354
 PBatch.cc:2355
 PBatch.cc:2356
 PBatch.cc:2357
 PBatch.cc:2358
 PBatch.cc:2359
 PBatch.cc:2360
 PBatch.cc:2361
 PBatch.cc:2362
 PBatch.cc:2363
 PBatch.cc:2364
 PBatch.cc:2365
 PBatch.cc:2366
 PBatch.cc:2367
 PBatch.cc:2368
 PBatch.cc:2369
 PBatch.cc:2370
 PBatch.cc:2371
 PBatch.cc:2372
 PBatch.cc:2373
 PBatch.cc:2374
 PBatch.cc:2375
 PBatch.cc:2376
 PBatch.cc:2377
 PBatch.cc:2378
 PBatch.cc:2379
 PBatch.cc:2380
 PBatch.cc:2381
 PBatch.cc:2382
 PBatch.cc:2383
 PBatch.cc:2384
 PBatch.cc:2385
 PBatch.cc:2386
 PBatch.cc:2387
 PBatch.cc:2388
 PBatch.cc:2389
 PBatch.cc:2390
 PBatch.cc:2391
 PBatch.cc:2392
 PBatch.cc:2393
 PBatch.cc:2394
 PBatch.cc:2395
 PBatch.cc:2396
 PBatch.cc:2397
 PBatch.cc:2398
 PBatch.cc:2399
 PBatch.cc:2400
 PBatch.cc:2401
 PBatch.cc:2402
 PBatch.cc:2403
 PBatch.cc:2404
 PBatch.cc:2405
 PBatch.cc:2406
 PBatch.cc:2407
 PBatch.cc:2408
 PBatch.cc:2409
 PBatch.cc:2410
 PBatch.cc:2411
 PBatch.cc:2412
 PBatch.cc:2413
 PBatch.cc:2414
 PBatch.cc:2415
 PBatch.cc:2416
 PBatch.cc:2417
 PBatch.cc:2418
 PBatch.cc:2419
 PBatch.cc:2420
 PBatch.cc:2421
 PBatch.cc:2422
 PBatch.cc:2423
 PBatch.cc:2424
 PBatch.cc:2425
 PBatch.cc:2426
 PBatch.cc:2427
 PBatch.cc:2428
 PBatch.cc:2429
 PBatch.cc:2430
 PBatch.cc:2431
 PBatch.cc:2432
 PBatch.cc:2433
 PBatch.cc:2434
 PBatch.cc:2435
 PBatch.cc:2436
 PBatch.cc:2437
 PBatch.cc:2438
 PBatch.cc:2439
 PBatch.cc:2440
 PBatch.cc:2441
 PBatch.cc:2442
 PBatch.cc:2443
 PBatch.cc:2444
 PBatch.cc:2445
 PBatch.cc:2446
 PBatch.cc:2447
 PBatch.cc:2448
 PBatch.cc:2449
 PBatch.cc:2450
 PBatch.cc:2451
 PBatch.cc:2452
 PBatch.cc:2453
 PBatch.cc:2454
 PBatch.cc:2455
 PBatch.cc:2456
 PBatch.cc:2457
 PBatch.cc:2458
 PBatch.cc:2459
 PBatch.cc:2460
 PBatch.cc:2461
 PBatch.cc:2462
 PBatch.cc:2463
 PBatch.cc:2464
 PBatch.cc:2465
 PBatch.cc:2466
 PBatch.cc:2467
 PBatch.cc:2468
 PBatch.cc:2469
 PBatch.cc:2470
 PBatch.cc:2471
 PBatch.cc:2472
 PBatch.cc:2473
 PBatch.cc:2474
 PBatch.cc:2475
 PBatch.cc:2476
 PBatch.cc:2477
 PBatch.cc:2478
 PBatch.cc:2479
 PBatch.cc:2480
 PBatch.cc:2481
 PBatch.cc:2482
 PBatch.cc:2483
 PBatch.cc:2484
 PBatch.cc:2485
 PBatch.cc:2486
 PBatch.cc:2487
 PBatch.cc:2488
 PBatch.cc:2489
 PBatch.cc:2490
 PBatch.cc:2491
 PBatch.cc:2492
 PBatch.cc:2493
 PBatch.cc:2494
 PBatch.cc:2495
 PBatch.cc:2496
 PBatch.cc:2497
 PBatch.cc:2498
 PBatch.cc:2499
 PBatch.cc:2500
 PBatch.cc:2501
 PBatch.cc:2502
 PBatch.cc:2503
 PBatch.cc:2504
 PBatch.cc:2505
 PBatch.cc:2506
 PBatch.cc:2507
 PBatch.cc:2508
 PBatch.cc:2509
 PBatch.cc:2510
 PBatch.cc:2511
 PBatch.cc:2512
 PBatch.cc:2513
 PBatch.cc:2514
 PBatch.cc:2515
 PBatch.cc:2516
 PBatch.cc:2517
 PBatch.cc:2518
 PBatch.cc:2519
 PBatch.cc:2520
 PBatch.cc:2521
 PBatch.cc:2522
 PBatch.cc:2523
 PBatch.cc:2524
 PBatch.cc:2525
 PBatch.cc:2526
 PBatch.cc:2527
 PBatch.cc:2528
 PBatch.cc:2529
 PBatch.cc:2530
 PBatch.cc:2531
 PBatch.cc:2532
 PBatch.cc:2533
 PBatch.cc:2534
 PBatch.cc:2535
 PBatch.cc:2536
 PBatch.cc:2537
 PBatch.cc:2538
 PBatch.cc:2539
 PBatch.cc:2540
 PBatch.cc:2541
 PBatch.cc:2542
 PBatch.cc:2543
 PBatch.cc:2544
 PBatch.cc:2545
 PBatch.cc:2546
 PBatch.cc:2547
 PBatch.cc:2548
 PBatch.cc:2549
 PBatch.cc:2550
 PBatch.cc:2551
 PBatch.cc:2552
 PBatch.cc:2553
 PBatch.cc:2554
 PBatch.cc:2555
 PBatch.cc:2556
 PBatch.cc:2557
 PBatch.cc:2558
 PBatch.cc:2559
 PBatch.cc:2560
 PBatch.cc:2561
 PBatch.cc:2562
 PBatch.cc:2563
 PBatch.cc:2564
 PBatch.cc:2565
 PBatch.cc:2566
 PBatch.cc:2567
 PBatch.cc:2568
 PBatch.cc:2569
 PBatch.cc:2570
 PBatch.cc:2571
 PBatch.cc:2572
 PBatch.cc:2573
 PBatch.cc:2574
 PBatch.cc:2575
 PBatch.cc:2576
 PBatch.cc:2577
 PBatch.cc:2578
 PBatch.cc:2579
 PBatch.cc:2580
 PBatch.cc:2581
 PBatch.cc:2582
 PBatch.cc:2583
 PBatch.cc:2584
 PBatch.cc:2585
 PBatch.cc:2586
 PBatch.cc:2587
 PBatch.cc:2588
 PBatch.cc:2589
 PBatch.cc:2590
 PBatch.cc:2591
 PBatch.cc:2592
 PBatch.cc:2593
 PBatch.cc:2594
 PBatch.cc:2595
 PBatch.cc:2596
 PBatch.cc:2597
 PBatch.cc:2598
 PBatch.cc:2599
 PBatch.cc:2600
 PBatch.cc:2601
 PBatch.cc:2602
 PBatch.cc:2603
 PBatch.cc:2604
 PBatch.cc:2605
 PBatch.cc:2606
 PBatch.cc:2607
 PBatch.cc:2608
 PBatch.cc:2609
 PBatch.cc:2610
 PBatch.cc:2611
 PBatch.cc:2612
 PBatch.cc:2613
 PBatch.cc:2614
 PBatch.cc:2615
 PBatch.cc:2616
 PBatch.cc:2617
 PBatch.cc:2618
 PBatch.cc:2619
 PBatch.cc:2620
 PBatch.cc:2621
 PBatch.cc:2622
 PBatch.cc:2623
 PBatch.cc:2624
 PBatch.cc:2625
 PBatch.cc:2626
 PBatch.cc:2627
 PBatch.cc:2628
 PBatch.cc:2629
 PBatch.cc:2630
 PBatch.cc:2631
 PBatch.cc:2632
 PBatch.cc:2633
 PBatch.cc:2634
 PBatch.cc:2635
 PBatch.cc:2636
 PBatch.cc:2637
 PBatch.cc:2638
 PBatch.cc:2639
 PBatch.cc:2640
 PBatch.cc:2641
 PBatch.cc:2642
 PBatch.cc:2643
 PBatch.cc:2644
 PBatch.cc:2645
 PBatch.cc:2646
 PBatch.cc:2647
 PBatch.cc:2648
 PBatch.cc:2649
 PBatch.cc:2650
 PBatch.cc:2651
 PBatch.cc:2652
 PBatch.cc:2653
 PBatch.cc:2654
 PBatch.cc:2655
 PBatch.cc:2656
 PBatch.cc:2657
 PBatch.cc:2658
 PBatch.cc:2659
 PBatch.cc:2660
 PBatch.cc:2661
 PBatch.cc:2662
 PBatch.cc:2663
 PBatch.cc:2664
 PBatch.cc:2665
 PBatch.cc:2666
 PBatch.cc:2667
 PBatch.cc:2668
 PBatch.cc:2669
 PBatch.cc:2670
 PBatch.cc:2671
 PBatch.cc:2672
 PBatch.cc:2673
 PBatch.cc:2674
 PBatch.cc:2675
 PBatch.cc:2676
 PBatch.cc:2677
 PBatch.cc:2678
 PBatch.cc:2679
 PBatch.cc:2680
 PBatch.cc:2681
 PBatch.cc:2682
 PBatch.cc:2683
 PBatch.cc:2684
 PBatch.cc:2685
 PBatch.cc:2686
 PBatch.cc:2687
 PBatch.cc:2688
 PBatch.cc:2689
 PBatch.cc:2690
 PBatch.cc:2691
 PBatch.cc:2692
 PBatch.cc:2693
 PBatch.cc:2694
 PBatch.cc:2695
 PBatch.cc:2696
 PBatch.cc:2697
 PBatch.cc:2698
 PBatch.cc:2699
 PBatch.cc:2700
 PBatch.cc:2701
 PBatch.cc:2702
 PBatch.cc:2703
 PBatch.cc:2704
 PBatch.cc:2705
 PBatch.cc:2706
 PBatch.cc:2707
 PBatch.cc:2708
 PBatch.cc:2709
 PBatch.cc:2710
 PBatch.cc:2711
 PBatch.cc:2712
 PBatch.cc:2713
 PBatch.cc:2714
 PBatch.cc:2715
 PBatch.cc:2716
 PBatch.cc:2717
 PBatch.cc:2718
 PBatch.cc:2719
 PBatch.cc:2720
 PBatch.cc:2721
 PBatch.cc:2722
 PBatch.cc:2723
 PBatch.cc:2724
 PBatch.cc:2725
 PBatch.cc:2726
 PBatch.cc:2727
 PBatch.cc:2728
 PBatch.cc:2729
 PBatch.cc:2730
 PBatch.cc:2731
 PBatch.cc:2732
 PBatch.cc:2733
 PBatch.cc:2734
 PBatch.cc:2735
 PBatch.cc:2736
 PBatch.cc:2737
 PBatch.cc:2738
 PBatch.cc:2739
 PBatch.cc:2740
 PBatch.cc:2741
 PBatch.cc:2742
 PBatch.cc:2743
 PBatch.cc:2744
 PBatch.cc:2745
 PBatch.cc:2746
 PBatch.cc:2747
 PBatch.cc:2748
 PBatch.cc:2749
 PBatch.cc:2750
 PBatch.cc:2751
 PBatch.cc:2752
 PBatch.cc:2753
 PBatch.cc:2754
 PBatch.cc:2755
 PBatch.cc:2756
 PBatch.cc:2757
 PBatch.cc:2758
 PBatch.cc:2759
 PBatch.cc:2760
 PBatch.cc:2761
 PBatch.cc:2762
 PBatch.cc:2763
 PBatch.cc:2764
 PBatch.cc:2765
 PBatch.cc:2766
 PBatch.cc:2767
 PBatch.cc:2768
 PBatch.cc:2769
 PBatch.cc:2770
 PBatch.cc:2771
 PBatch.cc:2772
 PBatch.cc:2773
 PBatch.cc:2774
 PBatch.cc:2775
 PBatch.cc:2776
 PBatch.cc:2777
 PBatch.cc:2778
 PBatch.cc:2779
 PBatch.cc:2780
 PBatch.cc:2781
 PBatch.cc:2782
 PBatch.cc:2783
 PBatch.cc:2784
 PBatch.cc:2785
 PBatch.cc:2786
 PBatch.cc:2787
 PBatch.cc:2788
 PBatch.cc:2789
 PBatch.cc:2790
 PBatch.cc:2791
 PBatch.cc:2792
 PBatch.cc:2793
 PBatch.cc:2794
 PBatch.cc:2795
 PBatch.cc:2796
 PBatch.cc:2797
 PBatch.cc:2798
 PBatch.cc:2799
 PBatch.cc:2800
 PBatch.cc:2801
 PBatch.cc:2802
 PBatch.cc:2803
 PBatch.cc:2804
 PBatch.cc:2805
 PBatch.cc:2806
 PBatch.cc:2807
 PBatch.cc:2808
 PBatch.cc:2809
 PBatch.cc:2810
 PBatch.cc:2811
 PBatch.cc:2812
 PBatch.cc:2813
 PBatch.cc:2814
 PBatch.cc:2815
 PBatch.cc:2816
 PBatch.cc:2817
 PBatch.cc:2818
 PBatch.cc:2819
 PBatch.cc:2820
 PBatch.cc:2821
 PBatch.cc:2822
 PBatch.cc:2823
 PBatch.cc:2824
 PBatch.cc:2825
 PBatch.cc:2826
 PBatch.cc:2827
 PBatch.cc:2828
 PBatch.cc:2829
 PBatch.cc:2830
 PBatch.cc:2831
 PBatch.cc:2832
 PBatch.cc:2833
 PBatch.cc:2834
 PBatch.cc:2835
 PBatch.cc:2836
 PBatch.cc:2837
 PBatch.cc:2838
 PBatch.cc:2839
 PBatch.cc:2840
 PBatch.cc:2841
 PBatch.cc:2842
 PBatch.cc:2843
 PBatch.cc:2844
 PBatch.cc:2845
 PBatch.cc:2846
 PBatch.cc:2847
 PBatch.cc:2848
 PBatch.cc:2849
 PBatch.cc:2850
 PBatch.cc:2851
 PBatch.cc:2852
 PBatch.cc:2853
 PBatch.cc:2854
 PBatch.cc:2855
 PBatch.cc:2856
 PBatch.cc:2857
 PBatch.cc:2858
 PBatch.cc:2859
 PBatch.cc:2860
 PBatch.cc:2861
 PBatch.cc:2862
 PBatch.cc:2863
 PBatch.cc:2864
 PBatch.cc:2865
 PBatch.cc:2866
 PBatch.cc:2867
 PBatch.cc:2868
 PBatch.cc:2869
 PBatch.cc:2870
 PBatch.cc:2871
 PBatch.cc:2872
 PBatch.cc:2873
 PBatch.cc:2874
 PBatch.cc:2875
 PBatch.cc:2876
 PBatch.cc:2877
 PBatch.cc:2878
 PBatch.cc:2879
 PBatch.cc:2880
 PBatch.cc:2881
 PBatch.cc:2882
 PBatch.cc:2883
 PBatch.cc:2884
 PBatch.cc:2885
 PBatch.cc:2886
 PBatch.cc:2887
 PBatch.cc:2888
 PBatch.cc:2889
 PBatch.cc:2890
 PBatch.cc:2891
 PBatch.cc:2892
 PBatch.cc:2893
 PBatch.cc:2894
 PBatch.cc:2895
 PBatch.cc:2896
 PBatch.cc:2897
 PBatch.cc:2898
 PBatch.cc:2899
 PBatch.cc:2900
 PBatch.cc:2901
 PBatch.cc:2902
 PBatch.cc:2903
 PBatch.cc:2904
 PBatch.cc:2905
 PBatch.cc:2906
 PBatch.cc:2907
 PBatch.cc:2908
 PBatch.cc:2909
 PBatch.cc:2910
 PBatch.cc:2911
 PBatch.cc:2912
 PBatch.cc:2913
 PBatch.cc:2914
 PBatch.cc:2915
 PBatch.cc:2916
 PBatch.cc:2917
 PBatch.cc:2918
 PBatch.cc:2919
 PBatch.cc:2920
 PBatch.cc:2921
 PBatch.cc:2922
 PBatch.cc:2923
 PBatch.cc:2924
 PBatch.cc:2925
 PBatch.cc:2926
 PBatch.cc:2927
 PBatch.cc:2928
 PBatch.cc:2929
 PBatch.cc:2930
 PBatch.cc:2931
 PBatch.cc:2932
 PBatch.cc:2933
 PBatch.cc:2934
 PBatch.cc:2935
 PBatch.cc:2936
 PBatch.cc:2937
 PBatch.cc:2938
 PBatch.cc:2939
 PBatch.cc:2940
 PBatch.cc:2941
 PBatch.cc:2942
 PBatch.cc:2943
 PBatch.cc:2944
 PBatch.cc:2945
 PBatch.cc:2946
 PBatch.cc:2947
 PBatch.cc:2948
 PBatch.cc:2949
 PBatch.cc:2950
 PBatch.cc:2951
 PBatch.cc:2952
 PBatch.cc:2953
 PBatch.cc:2954
 PBatch.cc:2955
 PBatch.cc:2956
 PBatch.cc:2957
 PBatch.cc:2958
 PBatch.cc:2959
 PBatch.cc:2960
 PBatch.cc:2961
 PBatch.cc:2962
 PBatch.cc:2963
 PBatch.cc:2964
 PBatch.cc:2965
 PBatch.cc:2966
 PBatch.cc:2967
 PBatch.cc:2968
 PBatch.cc:2969
 PBatch.cc:2970
 PBatch.cc:2971
 PBatch.cc:2972
 PBatch.cc:2973
 PBatch.cc:2974
 PBatch.cc:2975
 PBatch.cc:2976
 PBatch.cc:2977
 PBatch.cc:2978
 PBatch.cc:2979
 PBatch.cc:2980
 PBatch.cc:2981
 PBatch.cc:2982
 PBatch.cc:2983
 PBatch.cc:2984
 PBatch.cc:2985
 PBatch.cc:2986
 PBatch.cc:2987
 PBatch.cc:2988
 PBatch.cc:2989
 PBatch.cc:2990
 PBatch.cc:2991
 PBatch.cc:2992
 PBatch.cc:2993
 PBatch.cc:2994
 PBatch.cc:2995
 PBatch.cc:2996
 PBatch.cc:2997
 PBatch.cc:2998
 PBatch.cc:2999
 PBatch.cc:3000
 PBatch.cc:3001
 PBatch.cc:3002
 PBatch.cc:3003
 PBatch.cc:3004
 PBatch.cc:3005
 PBatch.cc:3006
 PBatch.cc:3007
 PBatch.cc:3008
 PBatch.cc:3009
 PBatch.cc:3010
 PBatch.cc:3011
 PBatch.cc:3012
 PBatch.cc:3013
 PBatch.cc:3014
 PBatch.cc:3015
 PBatch.cc:3016
 PBatch.cc:3017
 PBatch.cc:3018
 PBatch.cc:3019
 PBatch.cc:3020
 PBatch.cc:3021
 PBatch.cc:3022
 PBatch.cc:3023
 PBatch.cc:3024
 PBatch.cc:3025
 PBatch.cc:3026
 PBatch.cc:3027
 PBatch.cc:3028
 PBatch.cc:3029
 PBatch.cc:3030
 PBatch.cc:3031
 PBatch.cc:3032
 PBatch.cc:3033
 PBatch.cc:3034
 PBatch.cc:3035
 PBatch.cc:3036
 PBatch.cc:3037
 PBatch.cc:3038
 PBatch.cc:3039
 PBatch.cc:3040
 PBatch.cc:3041
 PBatch.cc:3042
 PBatch.cc:3043
 PBatch.cc:3044
 PBatch.cc:3045
 PBatch.cc:3046
 PBatch.cc:3047
 PBatch.cc:3048
 PBatch.cc:3049
 PBatch.cc:3050
 PBatch.cc:3051
 PBatch.cc:3052
 PBatch.cc:3053
 PBatch.cc:3054
 PBatch.cc:3055
 PBatch.cc:3056
 PBatch.cc:3057
 PBatch.cc:3058
 PBatch.cc:3059
 PBatch.cc:3060
 PBatch.cc:3061
 PBatch.cc:3062
 PBatch.cc:3063
 PBatch.cc:3064
 PBatch.cc:3065
 PBatch.cc:3066
 PBatch.cc:3067
 PBatch.cc:3068
 PBatch.cc:3069
 PBatch.cc:3070
 PBatch.cc:3071
 PBatch.cc:3072
 PBatch.cc:3073
 PBatch.cc:3074
 PBatch.cc:3075
 PBatch.cc:3076
 PBatch.cc:3077
 PBatch.cc:3078
 PBatch.cc:3079
 PBatch.cc:3080
 PBatch.cc:3081
 PBatch.cc:3082
 PBatch.cc:3083
 PBatch.cc:3084
 PBatch.cc:3085
 PBatch.cc:3086
 PBatch.cc:3087
 PBatch.cc:3088
 PBatch.cc:3089
 PBatch.cc:3090
 PBatch.cc:3091
 PBatch.cc:3092
 PBatch.cc:3093
 PBatch.cc:3094
 PBatch.cc:3095
 PBatch.cc:3096
 PBatch.cc:3097
 PBatch.cc:3098
 PBatch.cc:3099
 PBatch.cc:3100
 PBatch.cc:3101
 PBatch.cc:3102
 PBatch.cc:3103
 PBatch.cc:3104
 PBatch.cc:3105
 PBatch.cc:3106
 PBatch.cc:3107
 PBatch.cc:3108
 PBatch.cc:3109
 PBatch.cc:3110
 PBatch.cc:3111
 PBatch.cc:3112
 PBatch.cc:3113
 PBatch.cc:3114
 PBatch.cc:3115
 PBatch.cc:3116
 PBatch.cc:3117
 PBatch.cc:3118
 PBatch.cc:3119
 PBatch.cc:3120
 PBatch.cc:3121
 PBatch.cc:3122
 PBatch.cc:3123
 PBatch.cc:3124
 PBatch.cc:3125
 PBatch.cc:3126
 PBatch.cc:3127
 PBatch.cc:3128
 PBatch.cc:3129
 PBatch.cc:3130
 PBatch.cc:3131
 PBatch.cc:3132
 PBatch.cc:3133
 PBatch.cc:3134
 PBatch.cc:3135
 PBatch.cc:3136
 PBatch.cc:3137
 PBatch.cc:3138
 PBatch.cc:3139
 PBatch.cc:3140
 PBatch.cc:3141
 PBatch.cc:3142
 PBatch.cc:3143
 PBatch.cc:3144
 PBatch.cc:3145
 PBatch.cc:3146
 PBatch.cc:3147
 PBatch.cc:3148
 PBatch.cc:3149
 PBatch.cc:3150
 PBatch.cc:3151
 PBatch.cc:3152
 PBatch.cc:3153
 PBatch.cc:3154
 PBatch.cc:3155
 PBatch.cc:3156
 PBatch.cc:3157
 PBatch.cc:3158
 PBatch.cc:3159
 PBatch.cc:3160
 PBatch.cc:3161
 PBatch.cc:3162
 PBatch.cc:3163
 PBatch.cc:3164
 PBatch.cc:3165
 PBatch.cc:3166
 PBatch.cc:3167