////////////////////////////////////////////////////////
//  
// Adapted TFormula
//  
// Changes (and the reason why) are marked with 
// <PLUTOCHANGE>  .... </PLUTOCHANGE>
//
////////////////////////////////////////////////////////

#include <math.h>

#include "Riostream.h"
#include "TROOT.h"
#include "TClass.h"
#include "TFormula.h"
#include "TMath.h"
#include "TRandom.h"
#include "TFunction.h"
#include "TMethodCall.h"
#include "TObjString.h"
#include "TError.h"
#include "v5/TFormulaPrimitive.h"

#ifdef WIN32
#pragma optimize("",off)
#endif

#include "PFormula.h"
#include <iostream>

using namespace std;

static Int_t  gMAXOP=1000, gMAXPAR=1000, gMAXCONST=1000;
const  Int_t  gMAXSTRINGFOUND = 10;
const  UInt_t kOptimizationError = BIT(19);


PFormula::PFormula() : ROOT::v5::TFormula() {
}

// #if ROOTVER > 4
#if 1

//PFormula::PFormula(const char *name,const char *expression) : TFormula(name,expression) {
PFormula::PFormula(const char *name, const char *expression) : ROOT::v5::TFormula()
{
    
    fNdim   = 0;
    fNpar   = 0;
    fNoper  = 0;
    fNconst = 0;
    fNumber = 0;
    fExpr   = 0;
    //   fOper   = 0;
    fConst  = 0;
    fParams = 0;
    fNstring= 0;
    fNames  = 0;
    fNval   = 0;
    //
    //MI change
    fNOperOptimized = 0;
    fExprOptimized  = 0;
    fOperOptimized  = 0;
    fOperOffset     = 0;
    fPredefined     = 0;
    fOptimal        = (ROOT::v5::TFormulaPrimitive::TFuncG)&TFormula::EvalParOld;

    if (!expression || !*expression) {
	Error("TFormula", "expression may not be 0 or have 0 length");
	return;
    }

    //eliminate blanks in expression

    Int_t i,j,nch;
    nch = strlen(expression);
    char *expr = new char[nch+1];
    j = 0;
    for (i=0;i<nch;i++) {       
	if (expression[i] == ' ') continue;
	if (i > 0 && (expression[i] == '*') && (expression[i-1] == '*')) {
	    expr[j-1] = '^';
	    continue;
	}
	expr[j] = expression[i]; j++;
    }
    expr[j] = 0;

    Bool_t gausNorm   = kFALSE;
    Bool_t landauNorm = kFALSE;
    Bool_t linear = kFALSE;

    if (j) {
	TString chaine = expr;
	//special case for functions for linear fitting
	if (chaine.Contains("++"))
	    linear = kTRUE;
	// special case for normalized gaus
	if (chaine.Contains("gausn")) {
	    gausNorm = kTRUE;
	    chaine.ReplaceAll("gausn","gaus");
	}
	// special case for normalized landau
	if (chaine.Contains("landaun")) {
	    landauNorm = kTRUE;
	    chaine.ReplaceAll("landaun","landau");
	}
	SetTitle(chaine.Data());
    }
    delete [] expr;

    if (linear)    SetBit(kLinear);

    // <PLUTOCHANGE>

    chaine = GetTitle();
    //Int_t lc,valeur,err;
    Int_t lc,valeur;
    TString ctemp;

    //*-*- Substitution of some operators to C++ style
    //*-*  ===========================================
    Bool_t inString = false;
    for (i=1; i<=chaine.Length(); i++) {
	lc =chaine.Length();
	if (chaine(i-1,1) == "\"") inString = !inString;
	if (inString) continue;
	if (chaine(i-1,2) == "**") {
	    chaine = chaine(0,i-1) + "^" + chaine(i+1,lc-i-1);
	    i=0;
	} else if (chaine(i-1,2) == "++") {
	    chaine = chaine(0,i) + chaine(i+1,lc-i-1);
	    i=0;
	} else if (chaine(i-1,2) == "+-" || chaine(i-1,2) == "-+") {
	    chaine = chaine(0,i-1) + "-" + chaine(i+1,lc-i-1);
	    i=0;
	} else if (chaine(i-1,2) == "--") {
	    chaine = chaine(0,i-1) + "+" + chaine(i+1,lc-i-1);
	    i=0;
	} else if (chaine(i-1,2) == "->") {
	    chaine = chaine(0,i-1) + "." + chaine(i+1,lc-i-1);
	    i=0;
	} else if (chaine(i-1,1) == "[") {
	    for (j=1;j<=chaine.Length()-i;j++) {
		if (chaine(j+i-1,1) == "]" || j+i > chaine.Length()) break;
	    }
	    ctemp = chaine(i,j-1);
	    valeur=0;
	    sscanf(ctemp.Data(),"%d",&valeur);
	    if (valeur >= fNpar) fNpar = valeur+1;
	} else if (chaine(i-1,1) == " ") {
	    chaine = chaine(0,i-1)+chaine(i,lc-i);
	    i=0;
	}
    }

    // </PLUTOCHANGE>
   
    if (Compile()) return;

    if (gausNorm)   SetBit(kNormalized);
    if (landauNorm) SetBit(kNormalized);

    //*-*- Store formula in linked list of formula in ROOT

    TFormula *old = (TFormula*)gROOT->GetListOfFunctions()->FindObject(name);
    if (old) {
	gROOT->GetListOfFunctions()->Remove(old);
    }
    if (strcmp(name,"x")==0 || strcmp(name,"y")==0 ||
	strcmp(name,"z")==0 || strcmp(name,"t")==0 )
	{
	    Error("TFormula","The name \'%s\' is reserved as a TFormula variable name.\n"
		  "\tThis function will not be registered in the list of functions",name);
	} else {
	gROOT->GetListOfFunctions()->Add(this);
    }


}

void PFormula::Analyze(const char *schain, Int_t &err, Int_t offset)
{

    Int_t valeur,find,n,i,j,k,lchain,nomb,virgule,inter,nest;
    Int_t compt,compt2,compt3,compt4;
    Bool_t inString;
    Double_t vafConst;
    ULong_t vafConst2;
    Bool_t parenthese;
    TString s,chaine_error,chaine1ST;
    TString s1,s2,s3,ctemp;
    TString chaine = schain;
    TFormula *oldformula;
    Int_t modulo,plus,puiss10,puiss10bis,moins,multi,divi,puiss,et,ou,petit,grand,egal,diff,peteg,grdeg,etx,oux,rshift,lshift;
    char t;
    TString slash("/"), escapedSlash("\\/");
    Int_t inter2 = 0;
    SetNumber(0);
    Int_t actionCode,actionParam;
    Int_t err_hint = 0;

    //*-*- Verify correct matching of parenthesis and remove unnecessary parenthesis.
    //*-*  ========================================================================
    lchain = chaine.Length();
    //if (chaine(lchain-2,2) == "^2") chaine = "sq(" + chaine(0,lchain-2) + ")";
    parenthese = kTRUE;
    lchain = chaine.Length();
    while (parenthese && lchain>0 && err==0){
	compt  = 0;
	compt2 = 0;
	inString = false;
	lchain = chaine.Length();
	if (lchain==0) err=4;
	else {
	    for (i=1; i<=lchain; ++i) {
		if (chaine(i-1,1) == "\"") inString = !inString;
		if (!inString) {
		    if (chaine(i-1,1) == "[") compt2++;
		    if (chaine(i-1,1) == "]") compt2--;
		    if (chaine(i-1,1) == "(") compt++;
		    if (chaine(i-1,1) == ")") compt--;
		}
		if (compt < 0) err = 40; // more open parentheses than close parentheses
		if (compt2< 0) err = 42; // more ] than [
		if (compt==0 && (i!=lchain || lchain==1)) parenthese = kFALSE;
		// if (lchain<3 && chaine(0,1)!="(" && chaine(lchain-1,1)!=")") parenthese = kFALSE;
	    }
	    if (compt > 0) err = 41; // more ( than )
	    if (compt2> 0) err = 43; // more [ than ]
	    if (parenthese) chaine = chaine(1,lchain-2);
	}
    } // while parantheses

    if (lchain==0) err=4; // empty string
    modulo=plus=moins=multi=divi=puiss=et=ou=petit=grand=egal=diff=peteg=grdeg=etx=oux=rshift=lshift=0;

    //*-*- Look for simple operators
    //*-*  =========================

    if (err==0) {
	compt = compt2 = compt3 = compt4 = 0;puiss10=0;puiss10bis = 0;
	inString = false;
	j = lchain;
	Bool_t isdecimal = 1; // indicates whether the left part is decimal.

	for (i=1;i<=lchain; i++) {

	    puiss10=puiss10bis=0;
	    if (i>2) {
		t = chaine[i-3];
		isdecimal = isdecimal && (strchr("0123456789.",t)!=0);
		if (isdecimal) {
		    if ( chaine[i-2] == 'e' ) puiss10 = 1;
		} else if ( strchr("+-/[]()&|><=!*/%^\\",t) ) {
		    isdecimal = 1; // reset after delimiter
		}
	    }
	    if (j>2) {
		if (chaine[j-2] == 'e') {
		    Bool_t isrightdecimal = 1;

		    for(k=j-3; k>=0 && isrightdecimal; --k) {
			t = chaine[k];
			isrightdecimal = isrightdecimal && (strchr("0123456789.",t)!=0);
			if (!isrightdecimal) {
			    if (strchr("+-/[]()&|><=!*/%^\\",t)!=0) {
				puiss10bis = 1;
			    }
			}
		    }
		    if (k<0 && isrightdecimal)  puiss10bis = 1;
		}
	    }
	    if (puiss10 && (i<=lchain)) {
		t = chaine[i];
		puiss10 = (strchr("0123456789.",t)!=0);
	    }
	    if (puiss10bis && (j<=lchain)) {
		t = chaine[j];
		puiss10bis = (strchr("0123456789.",t)!=0);
	    }

	    if (chaine(i-1,1) == "\"") inString = !inString;
	    if (inString) continue;
	    if (chaine(i-1,1) == "[") compt2++;
	    if (chaine(i-1,1) == "]") compt2--;
	    if (chaine(i-1,1) == "(") compt++;
	    if (chaine(i-1,1) == ")") compt--;
	    if (chaine(j-1,1) == "[") compt3++;
	    if (chaine(j-1,1) == "]") compt3--;
	    if (chaine(j-1,1) == "(") compt4++;
	    if (chaine(j-1,1) == ")") compt4--;
	    if (chaine(i-1,2)=="&&" && !inString && compt==0 && compt2==0 && et==0) {et=i;puiss=0;}
	    if (chaine(i-1,2)=="||" && compt==0 && compt2==0 && ou==0) {puiss10=0; ou=i;}
	    if (chaine(i-1,1)=="&"  && compt==0 && compt2==0 && etx==0) {etx=i;puiss=0;}
	    if (chaine(i-1,1)=="|"  && compt==0 && compt2==0 && oux==0) {puiss10=0; oux=i;}
	    if (chaine(i-1,2)==">>" && compt==0 && compt2==0 && rshift==0) {puiss10=0; rshift=i;}
	    if (chaine(i-1,1)==">"  && compt==0 && compt2==0 && rshift==0 && grand==0)
		{puiss10=0; grand=i;}
	    if (chaine(i-1,2)=="<<" && compt==0 && compt2==0 && lshift==0) {puiss10=0; lshift=i;}
	    if (chaine(i-1,1)=="<"  && compt==0 && compt2==0 && lshift==0 && petit==0)
		{puiss10=0; petit=i;
		    // Check whether or not we have a template names! (actually this can
		    // only happen in TTreeFormula.
		    for(int ip = i,depth=0; ip < lchain; ++ip) {
			char c = chaine(ip);
			// The characteres allowed in the template parameter are alpha-numerical characters,
			// underscores, comma, <, > and scope operator.
			if (isalnum(c) || c=='_' || c==',') continue;
			if (c==':' && chaine(ip+1)==':') { ++ip; continue; }
			if (c=='<') { ++depth; continue; }
			if (c=='>') {
			    if (depth) { --depth; continue; }
			    else {
				// We reach the end of the template parameter.
				petit = 0;
				i = ip+1;
				break;
			    }
			}
			// Character not authorized within a template parameter
			break;
		    }
		    if (petit==0) {
			// We found a template parameter and modified i
			continue; // the for(int i ,...)
		    }
		}
	    if ((chaine(i-1,2)=="<=" || chaine(i-1,2)=="=<") && compt==0 && compt2==0
		&& peteg==0) {peteg=i; puiss10=0; petit=0;}
	    if ((chaine(i-1,2)=="=>" || chaine(i-1,2)==">=") && compt==0 && compt2==0
		&& grdeg==0) {puiss10=0; grdeg=i; grand=0;}
	    if (chaine(i-1,2) == "==" && compt == 0 && compt2 == 0 && egal == 0) {puiss10=0; egal=i;}
	    if (chaine(i-1,2) == "!=" && compt == 0 && compt2 == 0 && diff == 0) {puiss10=0; diff=i;}
	    if (i>1 && chaine(i-1,1) == "+" && compt == 0 && compt2 == 0 && puiss10==0) plus=i;
	    if (chaine(j-1,1) == "-" && chaine(j-2,1) != "*" && chaine(j-2,1) != "/"
		&& chaine(j-2,1)!="^" && compt3==0 && compt4==0 && moins==0 && puiss10bis==0) moins=j;
	    if (chaine(i-1,1)=="%" && compt==0 && compt2==0 && modulo==0) {puiss10=0; modulo=i;}
	    if (chaine(i-1,1)=="*" && compt==0 && compt2==0 && multi==0)  {puiss10=0; multi=i;}
	    if (chaine(j-1,1)=="/" && chaine(j-2,1)!="\\"
		&& compt4==0 && compt3==0 && divi==0)
		{
		    puiss10=0; divi=j;
		}
	    if (chaine(j-1,1)=="^" && compt4==0 && compt3==0 && puiss==0) {puiss10=0; puiss=j;}

	    j--;
	}

	//*-*- If operator found, analyze left and right part of the statement
	//*-*  ===============================================================

	actionParam = 0;
	if (ou != 0) {    //check for ||
	    if (ou==1 || ou==lchain-1) {
		err=5;
		chaine_error="||";
	    }
	    else {
		ctemp = chaine(0,ou-1);
		Analyze(ctemp.Data(),err,offset); if (err) return;

		fExpr[fNoper] = "|| checkpoint";
		actionCode = kBoolOptimize;
		actionParam = 2;
		SetAction(fNoper,actionCode, actionParam);
		Int_t optloc = fNoper++;

		ctemp = chaine(ou+1,lchain-ou-1);
		Analyze(ctemp.Data(),err,offset); if (err) return;
		fExpr[fNoper] = "||";
		actionCode = kOr;
		SetAction(fNoper,actionCode, 0);

		SetAction( optloc, GetAction(optloc), GetActionParam(optloc) + (fNoper-optloc) * 10);
		fNoper++;
	    }
	} else if (et!=0) {
	    if (et==1 || et==lchain-1) {
		err=5;
		chaine_error="&&";
	    }
	    else {
		ctemp = chaine(0,et-1);
		Analyze(ctemp.Data(),err,offset); if (err) return;

		fExpr[fNoper] = "&& checkpoint";
		actionCode = kBoolOptimize;
		actionParam = 1;
		SetAction(fNoper,actionCode,actionParam);

		Int_t optloc = fNoper++;

		ctemp = chaine(et+1,lchain-et-1);
		Analyze(ctemp.Data(),err,offset); if (err) return;
		fExpr[fNoper] = "&&";
		actionCode = kAnd;
		SetAction(fNoper,actionCode,0);

		SetAction(optloc, GetAction(optloc), GetActionParam(optloc) + (fNoper-optloc) * 10);
		fNoper++;
	    }
	} else if (oux!=0) {
	    if (oux==1 || oux==lchain) {
		err=5;
		chaine_error="|";
	    }
	    else {
		ctemp = chaine(0,oux-1);
		Analyze(ctemp.Data(),err,offset); if (err) return;
		ctemp = chaine(oux,lchain-oux);
		Analyze(ctemp.Data(),err,offset); if (err) return;
		fExpr[fNoper] = "|";
		actionCode = kBitOr;
		SetAction(fNoper,actionCode,actionParam);
		fNoper++;
	    }
	} else if (etx!=0) {
	    if (etx==1 || etx==lchain) {
		err=5;
		chaine_error="&";
	    }
	    else {
		ctemp = chaine(0,etx-1);
		Analyze(ctemp.Data(),err,offset); if (err) return;
		ctemp = chaine(etx,lchain-etx);
		Analyze(ctemp.Data(),err,offset); if (err) return;
		fExpr[fNoper] = "&";
		actionCode = kBitAnd;
		SetAction(fNoper,actionCode,actionParam);
		fNoper++;
	    }
	} else if (petit != 0) {
	    if (petit==1 || petit==lchain) {
		err=5;
		chaine_error="<";
	    }
	    else {
		ctemp = chaine(0,petit-1);
		Analyze(ctemp.Data(),err,offset); if (err) return;
		ctemp = chaine(petit,lchain-petit);
		Analyze(ctemp.Data(),err,offset); if (err) return;
		fExpr[fNoper] = "<";
		actionCode = kLess;
		SetAction(fNoper,actionCode,actionParam);
		fNoper++;
	    }
	} else if (grand != 0) {
	    if (grand==1 || grand==lchain) {
		err=5;
		chaine_error=">";
	    }
	    else {
		ctemp = chaine(0,grand-1);
		Analyze(ctemp.Data(),err,offset); if (err) return;
		ctemp = chaine(grand,lchain-grand);
		Analyze(ctemp.Data(),err,offset); if (err) return;
		fExpr[fNoper] = ">";
		actionCode = kGreater;
		SetAction(fNoper,actionCode,actionParam);
		fNoper++;
	    }
	} else if (peteg != 0) {
	    if (peteg==1 || peteg==lchain-1) {
		err=5;
		chaine_error="<=";
	    }
	    else {
		ctemp = chaine(0,peteg-1);
		Analyze(ctemp.Data(),err,offset); if (err) return;
		ctemp = chaine(peteg+1,lchain-peteg-1);
		Analyze(ctemp.Data(),err,offset); if (err) return;
		fExpr[fNoper] = "<=";
		actionCode = kLessThan;
		SetAction(fNoper,actionCode,actionParam);
		fNoper++;
	    }
	} else if (grdeg != 0) {
	    if (grdeg==1 || grdeg==lchain-1) {
		err=5;
		chaine_error="=>";
	    }
	    else {
		ctemp = chaine(0,grdeg-1);
		Analyze(ctemp.Data(),err,offset); if (err) return;
		ctemp = chaine(grdeg+1,lchain-grdeg-1);
		Analyze(ctemp.Data(),err,offset); if (err) return;
		fExpr[fNoper] = ">=";
		actionCode = kGreaterThan;
		SetAction(fNoper,actionCode,actionParam);
		fNoper++;
	    }
	} else if (egal != 0) {
	    if (egal==1 || egal==lchain-1) {
		err=5;
		chaine_error="==";
	    }
	    else {
		ctemp = chaine(0,egal-1);
		Analyze(ctemp.Data(),err,offset); if (err) return;
		ctemp = chaine(egal+1,lchain-egal-1);
		Analyze(ctemp.Data(),err,offset); if (err) return;
		fExpr[fNoper] = "==";
		actionCode = kEqual;
		SetAction(fNoper,actionCode,actionParam);
		fNoper++;
	    }
	} else if (diff != 0) {
	    if (diff==1 || diff==lchain-1) {
		err=5;
		chaine_error = "!=";
	    }
	    else {
		ctemp = chaine(0,diff-1);
		Analyze(ctemp.Data(),err,offset); if (err) return;
		ctemp = chaine(diff+1,lchain-diff-1);
		Analyze(ctemp.Data(),err,offset); if (err) return;
		fExpr[fNoper] = "!=";
		actionCode = kNotEqual;
		SetAction(fNoper,actionCode,actionParam);
		fNoper++;
	    }
	} else if (plus != 0) {
	    if (plus==lchain) {
		err=5;
		chaine_error = "+";
	    }
	    else {
		ctemp = chaine(0,plus-1);
		Analyze(ctemp.Data(),err,offset); if (err) return;
		ctemp = chaine(plus,lchain-plus);
		Analyze(ctemp.Data(),err,offset); if (err) return;
		fExpr[fNoper] = "+";
		actionCode = kAdd;
		SetAction(fNoper,actionCode,actionParam);
		fNoper++;
	    }
	} else {
	    if (moins != 0) {
		if (moins == 1) {
		    ctemp = chaine(moins,lchain-moins);
		    Analyze(ctemp.Data(),err,offset); if (err) return;
		    fExpr[fNoper] = "-";
		    actionCode = kSignInv;
		    SetAction(fNoper,actionCode,actionParam);
		    ++fNoper;
		} else {
		    if (moins == lchain) {
			err=5;
			chaine_error = "-";
		    } else {
			ctemp = chaine(0,moins-1);
			Analyze(ctemp.Data(),err,offset); if (err) return;
			ctemp = chaine(moins,lchain-moins);
			Analyze(ctemp.Data(),err,offset); if (err) return;
			fExpr[fNoper] = "-";
			actionCode = kSubstract;
			SetAction(fNoper,actionCode,actionParam);
			fNoper++;
		    }
		}
	    } else if (modulo != 0) {
		if (modulo == 1 || modulo == lchain) {
		    err=5;
		    chaine_error="%";
		} else {
		    ctemp = chaine(0,modulo-1);
		    Analyze(ctemp.Data(),err,offset); if (err) return;
		    ctemp = chaine(modulo,lchain-modulo);
		    Analyze(ctemp.Data(),err,offset); if (err) return;
		    fExpr[fNoper] = "%";
		    actionCode = kModulo;
		    SetAction(fNoper,actionCode,actionParam);
		    fNoper++;
		}
	    } else if (rshift != 0) {
		if (rshift == 1 || rshift == lchain) {
		    err=5;
		    chaine_error=">>";
		} else {
		    ctemp = chaine(0,rshift-1);
		    Analyze(ctemp.Data(),err,offset); if (err) return;
		    ctemp = chaine(rshift+1,lchain-rshift-1);
		    Analyze(ctemp.Data(),err,offset); if (err) return;
		    fExpr[fNoper] = ">>";
		    actionCode = kRightShift;
		    SetAction(fNoper,actionCode,actionParam);
		    fNoper++;
		}
	    } else if (lshift != 0) {
		if (lshift == 1 || lshift == lchain) {
		    err=5;
		    chaine_error=">>";
		} else {
		    ctemp = chaine(0,lshift-1);
		    Analyze(ctemp.Data(),err,offset); if (err) return;
		    ctemp = chaine(lshift+1,lchain-lshift-1);
		    Analyze(ctemp.Data(),err,offset); if (err) return;
		    fExpr[fNoper] = ">>";
		    actionCode = kLeftShift;
		    SetAction(fNoper,actionCode,actionParam);
		    fNoper++;
		}
	    } else {
		if (multi != 0) {
		    if (multi == 1 || multi == lchain) {
			err=5;
			chaine_error="*";
		    }
		    else {
			ctemp = chaine(0,multi-1);
			Analyze(ctemp.Data(),err,offset); if (err) return;
			ctemp = chaine(multi,lchain-multi);
			Analyze(ctemp.Data(),err,offset); if (err) return;
			fExpr[fNoper] = "*";
			actionCode = kMultiply;
			SetAction(fNoper,actionCode,actionParam);
			fNoper++;
		    }
		} else {
		    if (divi != 0) {
			if (divi == 1 || divi == lchain) {
			    err=5;
			    chaine_error = "/";
			}
			else {
			    ctemp = chaine(0,divi-1);
			    Analyze(ctemp.Data(),err,offset); if (err) return;
			    ctemp = chaine(divi,lchain-divi);
			    Analyze(ctemp.Data(),err,offset); if (err) return;
			    fExpr[fNoper] = "/";
			    actionCode = kDivide;
			    SetAction(fNoper,actionCode,actionParam);
			    fNoper++;
			}
		    } else {
			if (puiss != 0) {
			    if (puiss == 1 || puiss == lchain) {
				err = 5;
				chaine_error = "**";
			    }
			    else {
				if (chaine(lchain-2,2) == "^2") {
				    ctemp = "sq(" + chaine(0,lchain-2) + ")";
				    Analyze(ctemp.Data(),err,offset); if (err) return;
				} else {
				    ctemp = chaine(0,puiss-1);
				    Analyze(ctemp.Data(),err,offset); if (err) return;
				    ctemp = chaine(puiss,lchain-puiss);
				    Analyze(ctemp.Data(),err,offset); if (err) return;
				    fExpr[fNoper] = "^";
				    actionCode = kpow;
				    SetAction(fNoper,actionCode,actionParam);
				    fNoper++;
				}
			    }
			} else {

			    find=0;

			    //*-*- Check for a numerical expression
			    {
				Bool_t hasDot = kFALSE;
				Bool_t isHexa = kFALSE;
				Bool_t hasExpo= kFALSE;
				if ((chaine(0,2)=="0x")||(chaine(0,2)=="0X")) isHexa=kTRUE;
				for (j=0; j<chaine.Length() && err==0; j++) {
				    t=chaine[j];
				    if (!isHexa) {
					if (j>0 && (chaine(j,1)=="e" || chaine(j,2)=="e+" || chaine(j,2)=="e-")) {
					    if (hasExpo) {
						err=26;
						chaine_error=chaine;
					    }
					    hasExpo = kTRUE;
					    // The previous implementation allowed a '.' in the exponent.
					    // That information was ignored (by sscanf), we now make it an error
					    // hasDot = kFALSE;
					    hasDot = kTRUE;  // forbid any additional '.'
					    if (chaine(j,2)=="e+" || chaine(j,2)=="e-") j++;
					}
					else {
					    if (chaine(j,1) == "." && !hasDot) hasDot = kTRUE; // accept only one '.' in the number
					    else {
						// The previous implementation was allowing ANYTHING after the '.' and thus
						// made legal code like '2.3 and fpx' and was just silently ignoring the
						// 'and fpx'.
						if (!strchr("0123456789",t) && (chaine(j,1)!="+" || j!=0)) {
						    err = 30;
						    chaine_error=chaine;
						}
					    }
					}
				    }
				    else {
					if (!strchr("0123456789abcdefABCDEF",t) && (j>1)) {
					    err = 30;
					    chaine_error=chaine;
					}
				    }
				}
				if (fNconst >= gMAXCONST) err = 27;
				if (!err) {
				    if (!isHexa) {if (sscanf((const char*)chaine,"%lg",&vafConst) > 0) err = 0; else err =1;}
				    else {if (sscanf((const char*)chaine,"%lx",&vafConst2) > 0) err = 0; else err=1;
					vafConst = (Double_t) vafConst2;}
				    fExpr[fNoper] = chaine;
				    k = -1;
				    for (j=0;j<fNconst;j++) {
					if (vafConst == fConst[j] ) k= j;
				    }
				    if ( k < 0) {  k = fNconst; fNconst++; fConst[k] = vafConst; }
				    actionCode = kConstant;
				    actionParam = k;
				    SetAction(fNoper,actionCode,actionParam);
				    fNoper++;
				}
				if (err==30) err=0;
				else find = kTRUE;
			    }


			    //*-*- Look for an already defined expression
			    if (find==0) {
				oldformula = (TFormula*)gROOT->GetListOfFunctions()->FindObject((const char*)chaine);
				if (oldformula && strcmp(schain,oldformula->GetTitle())) {
				    Int_t nprior = fNpar;
				    Analyze(oldformula->GetExpFormula(),err,fNpar); if (err) return; // changes fNpar
				    fNpar = nprior;
				    find=1;
				    if (!err) {
					Int_t npold = oldformula->GetNpar();
					fNpar += npold;
					for (Int_t ipar=0;ipar<npold;ipar++) {
					    fParams[ipar+fNpar-npold] = oldformula->GetParameter(ipar);
					}
				    }
				}
			    }
			    if (find == 0) {
				//*-*- Check if chaine is a defined variable.
				//*-*- Note that DefinedVariable can be overloaded
				ctemp = chaine;
				ctemp.ReplaceAll(escapedSlash, slash);
				Int_t action;
				k = DefinedVariable(ctemp,action);
				if (k==-3) {
				    // Error message already issued
				    err = 1;
				} if (k==-2) {
				    err = 31;
				    chaine_error = ctemp;
				} else if ( k >= 0 ) {
				    fExpr[fNoper] = ctemp;
				    actionCode = action;
				    actionParam = k;
				    SetAction(fNoper,actionCode,actionParam);
				    if (action==kDefinedString) fNstring++;
				    else if (k <kMAXFOUND && !fAlreadyFound.TestBitNumber(k)) {
					fAlreadyFound.SetBitNumber(k);
					fNval++;
				    }
				    fNoper++;
				} else if (chaine(0,1) == "!") {
				    ctemp = chaine(1,lchain-1);
				    Analyze(ctemp.Data(),err,offset); if (err) return;
				    fExpr[fNoper] = "!";
				    actionCode = kNot;
				    SetAction(fNoper,actionCode,actionParam);
				    fNoper++;
				} else if (chaine(0,1)=="\"" && chaine(chaine.Length()-1,1)=="\"") {
				    //*-* It is a string !!!
				    fExpr[fNoper] = chaine(1,chaine.Length()-2);
				    actionCode = kStringConst;
				    SetAction(fNoper,actionCode,actionParam);
				    fNoper++;
				} else if (chaine(0,4) == "cos(") {
				    ctemp = chaine(3,lchain-3);
				    Analyze(ctemp.Data(),err,offset); if (err) return;
				    fExpr[fNoper] = "cos";
				    actionCode = kcos;
				    SetAction(fNoper,actionCode,actionParam);
				    fNoper++;
				} else if (chaine(0,4) == "sin(") {
				    ctemp = chaine(3,lchain-3);
				    Analyze(ctemp.Data(),err,offset); if (err) return;
				    fExpr[fNoper] = "sin";
				    actionCode = ksin;
				    SetAction(fNoper,actionCode,actionParam);
				    fNoper++;
				} else if (chaine(0,4) == "tan(") {
				    ctemp = chaine(3,lchain-3);
				    Analyze(ctemp.Data(),err,offset); if (err) return;
				    fExpr[fNoper] = "tan";
				    actionCode = ktan;
				    SetAction(fNoper,actionCode,actionParam);
				    fNoper++;
				} else if (chaine(0,5) == "acos(") {
				    ctemp = chaine(4,lchain-4);
				    Analyze(ctemp.Data(),err,offset); if (err) return;
				    fExpr[fNoper] = "acos";
				    actionCode = kacos;
				    SetAction(fNoper,actionCode,actionParam);
				    fNoper++;
				} else if (chaine(0,5) == "asin(") {
				    ctemp = chaine(4,lchain-4);
				    Analyze(ctemp.Data(),err,offset); if (err) return;
				    fExpr[fNoper] = "asin";
				    actionCode = kasin;
				    SetAction(fNoper,actionCode,actionParam);
				    fNoper++;
				} else if (chaine(0,5) == "atan(") {
				    ctemp = chaine(4,lchain-4);
				    Analyze(ctemp.Data(),err,offset); if (err) return;
				    fExpr[fNoper] = "atan";
				    actionCode = katan;
				    SetAction(fNoper,actionCode,actionParam);
				    fNoper++;
				} else if (chaine(0,5) == "cosh(") {
				    ctemp = chaine(4,lchain-4);
				    Analyze(ctemp.Data(),err,offset); if (err) return;
				    fExpr[fNoper] = "cosh";
				    actionCode = kcosh;
				    SetAction(fNoper,actionCode,actionParam);
				    fNoper++;
				} else if (chaine(0,5) == "sinh(") {
				    ctemp = chaine(4,lchain-4);
				    Analyze(ctemp.Data(),err,offset); if (err) return;
				    fExpr[fNoper] = "sinh";
				    actionCode = ksinh;
				    SetAction(fNoper,actionCode,actionParam);
				    fNoper++;;
				} else if (chaine(0,5) == "tanh(") {
				    ctemp = chaine(4,lchain-4);
				    Analyze(ctemp.Data(),err,offset); if (err) return;
				    fExpr[fNoper] = "tanh";
				    actionCode = ktanh;
				    SetAction(fNoper,actionCode,actionParam);
				    fNoper++;;
				} else if (chaine(0,6) == "acosh(") {
				    ctemp = chaine(5,lchain-5);
				    Analyze(ctemp.Data(),err,offset); if (err) return;
				    fExpr[fNoper] = "acosh";
				    actionCode = kacosh;
				    SetAction(fNoper,actionCode,actionParam);
				    fNoper++;;
				} else if (chaine(0,6) == "asinh(") {
				    ctemp = chaine(5,lchain-5);
				    Analyze(ctemp.Data(),err,offset); if (err) return;
				    fExpr[fNoper] = "asinh";
				    actionCode = kasinh;
				    SetAction(fNoper,actionCode,actionParam);
				    fNoper++;;
				} else if (chaine(0,6) == "atanh(") {
				    ctemp = chaine(5,lchain-5);
				    Analyze(ctemp.Data(),err,offset); if (err) return;
				    fExpr[fNoper] = "atanh";
				    actionCode = katanh;
				    SetAction(fNoper,actionCode,actionParam);
				    fNoper++;;
				} else if (chaine(0,3) == "sq(") {
				    ctemp = chaine(2,lchain-2);
				    Analyze(ctemp.Data(),err,offset); if (err) return;
				    fExpr[fNoper] = "sq";
				    actionCode = ksq;
				    SetAction(fNoper,actionCode,actionParam);
				    fNoper++;;
				} else if (chaine(0,4) == "log(") {
				    ctemp = chaine(3,lchain-3);
				    Analyze(ctemp.Data(),err,offset); if (err) return;
				    fExpr[fNoper] = "log";
				    actionCode = klog;
				    SetAction(fNoper,actionCode,actionParam);
				    fNoper++;;
				} else if (chaine(0,6) == "log10(") {
				    ctemp = chaine(5,lchain-5);
				    Analyze(ctemp.Data(),err,offset); if (err) return;
				    fExpr[fNoper] = "log10";
				    actionCode = klog10;
				    SetAction(fNoper,actionCode,actionParam);
				    fNoper++;;
				} else if (chaine(0,4) == "exp(") {
				    ctemp = chaine(3,lchain-3);
				    Analyze(ctemp.Data(),err,offset); if (err) return;
				    fExpr[fNoper] = "exp";
				    actionCode = kexp;
				    SetAction(fNoper,actionCode,actionParam);
				    fNoper++;;
				} else if (chaine(0,4) == "abs(") {
				    ctemp = chaine(3,lchain-3);
				    Analyze(ctemp.Data(),err,offset); if (err) return;
				    fExpr[fNoper] = "abs";
				    actionCode = kabs;
				    SetAction(fNoper,actionCode,actionParam);
				    fNoper++;;
				} else if (chaine(0,5) == "sign(") {
				    ctemp = chaine(4,lchain-4);
				    Analyze(ctemp.Data(),err,offset); if (err) return;
				    fExpr[fNoper] = "sign";
				    actionCode = ksign;
				    SetAction(fNoper,actionCode,actionParam);
				    fNoper++;;
				} else if (chaine(0,4) == "int(") {
				    ctemp = chaine(3,lchain-3);
				    Analyze(ctemp.Data(),err,offset); if (err) return;
				    fExpr[fNoper] = "int";
				    actionCode = kint;
				    SetAction(fNoper,actionCode,actionParam);
				    fNoper++;;
				} else if (chaine == "rndm" || chaine(0,5) == "rndm(") {
				    fExpr[fNoper] = "rndm";
				    actionCode = krndm;
				    SetAction(fNoper,actionCode,actionParam);
				    fNoper++;;
				} else if (chaine(0,5) == "sqrt(") {
				    ctemp = chaine(4,lchain-4);
				    Analyze(ctemp.Data(),err,offset); if (err) return;
				    fExpr[fNoper] = "sqrt";
				    actionCode = ksqrt;
				    SetAction(fNoper,actionCode,actionParam);
				    fNoper++;;

				    //*-*- Look for an exponential
				    //*-*  =======================
				} else if ( chaine == "expo" || chaine(0,5)=="expo("
					    || (lchain==5 && chaine(1,4)=="expo")
					    || (lchain==6 && chaine(2,4)=="expo")
					    || chaine(1,5)=="expo(" || chaine(2,5)=="expo(" ) {
				    chaine1ST=chaine;
				    if (chaine(1,4) == "expo") {
					ctemp=chaine(0,1);
					if (ctemp=="x") {
					    inter2=0;
					    if (fNdim < 1) fNdim = 1; }
					else if (ctemp=="y") {
					    inter2=1;
					    if (fNdim < 2) fNdim = 2; }
					else if (ctemp=="z") {
					    inter2=2;
					    if (fNdim < 3) fNdim = 3; }
					else if (ctemp=="t") {
					    inter2=3;
					    if (fNdim < 4) fNdim = 4; }
					else {
					    err=26; // unknown name;
					    chaine_error=chaine1ST;
					}
					chaine=chaine(1,lchain-1);
					lchain=chaine.Length();
				    } else inter2=0;
				    if (chaine(2,4) == "expo") {
					if (chaine(0,2) != "xy") {
					    err=26; // unknown name
					    chaine_error=chaine1ST;
					}
					else {
					    inter2=5;
					    if (fNdim < 2) fNdim = 2;
					    chaine=chaine(2,lchain-2);
					    lchain=chaine.Length();
					}
				    }
				    if (lchain == 4) {
					if (fNpar>=gMAXPAR) err=7; // too many parameters
					if (!err) {
					    fExpr[fNoper] = chaine1ST;
					    actionCode = kexpo + inter2;
					    actionParam = offset;
					    SetAction(fNoper,actionCode,actionParam);
					    if (inter2 == 5+offset && fNpar < 3+offset) fNpar = 3+offset;
					    if (fNpar < 2+offset) fNpar = 2+offset;
					    if (fNpar>=gMAXPAR) err=7; // too many parameters
					    if (!err) {
						fNoper++;
						if (fNdim < 1) fNdim = 1;
						if (fNpar == 2) SetNumber(200);
					    }
					}
				    } else if (chaine(4,1) == "(") {
					ctemp = chaine(5,lchain-6);
					fExpr[fNoper] = chaine1ST;
					for (j=0; j<ctemp.Length(); j++) {
					    t=ctemp[j];
					    if (strchr("0123456789",t)==0 && (ctemp(j,1)!="+" || j!=0)) {
						err=20;
						chaine_error=chaine1ST;
					    }
					}
					if (err==0) {
					    sscanf(ctemp.Data(),"%d",&inter);
					    if (inter>=0) {
						inter += offset;
						actionCode = kexpo + inter2;
						actionParam = inter;
						SetAction(fNoper,actionCode,actionParam);
						if (inter2 == 5) inter++;
						if (inter+2>fNpar) fNpar = inter+2;
						if (fNpar>=gMAXPAR) err=7; // too many parameters
						if (!err) fNoper++;
						if (fNpar == 2) SetNumber(200);
					    } else err=20;
					} else err = 20; // non integer value for parameter number
				    } else {
					err=26; // unknown name
					chaine_error=chaine;
				    }
				    //*-*- Look for gaus, xgaus,ygaus,xygaus
				    //*-*  =================================
				} else if (chaine=="gaus"
					   || (lchain==5 && chaine(1,4)=="gaus")
					   || (lchain==6 && chaine(2,4)=="gaus")
					   || chaine(0,5)=="gaus(" || chaine(1,5)=="gaus(" || chaine(2,5)=="gaus(") {
				    chaine1ST=chaine;
				    if (chaine(1,4) == "gaus") {
					ctemp=chaine(0,1);
					if (ctemp=="x") {
					    inter2=0;
					    if (fNdim < 1) fNdim = 1; }
					else if (ctemp=="y") {
					    inter2=1;
					    if (fNdim < 2) fNdim = 2; }
					else if (ctemp=="z") {
					    inter2=2;
					    if (fNdim < 3) fNdim = 3; }
					else if (ctemp=="t") {
					    inter2=3;
					    if (fNdim < 4) fNdim = 4; }
					else {
					    err=26; // unknown name
					    chaine_error=chaine1ST;
					}
					chaine=chaine(1,lchain-1);
					lchain=chaine.Length();
				    } else inter2=0;
				    if (chaine(2,4) == "gaus") {
					if (chaine(0,2) != "xy") {
					    err=26; // unknown name
					    chaine_error=chaine1ST;
					}
					else {
					    inter2=5;
					    if (fNdim < 2) fNdim = 2;
					    chaine=chaine(2,lchain-2);
					    lchain=chaine.Length();
					}
				    }
				    if (lchain == 4 && err==0) {
					if (fNpar>=gMAXPAR) err=7; // too many parameters
					if (!err) {
					    fExpr[fNoper] = chaine1ST;
					    actionCode = kgaus + inter2;
					    actionParam = offset;
					    SetAction(fNoper,actionCode,actionParam);
					    if (inter2 == 5+offset && fNpar < 5+offset) fNpar = 5+offset;
					    if (3+offset>fNpar) fNpar = 3+offset;
					    if (fNpar>=gMAXPAR) err=7; // too many parameters
					    if (!err) {
						fNoper++;
						if (fNdim < 1) fNdim = 1;
						if (fNpar == 3) SetNumber(100);
					    }
					}
				    } else if (chaine(4,1) == "(" && err==0) {
					ctemp = chaine(5,lchain-6);
					fExpr[fNoper] = chaine1ST;
					for (j=0; j<ctemp.Length(); j++) {
					    t=ctemp[j];
					    if (strchr("0123456789",t)==0 && (ctemp(j,1)!="+" || j!=0)) {
						err=20;
						chaine_error=chaine1ST;
					    }
					}
					if (err==0) {
					    sscanf(ctemp.Data(),"%d",&inter);
					    if (inter >= 0) {
						inter += offset;
						actionCode = kgaus + inter2;
						actionParam = inter;
						SetAction(fNoper,actionCode,actionParam);
						if (inter2 == 5) inter += 2;
						if (inter+3>fNpar) fNpar = inter+3;
						if (fNpar>=gMAXPAR) err=7; // too many parameters
						if (!err) fNoper++;
						if(fNpar == 3) SetNumber(100);
					    } else err = 20; // non integer value for parameter number
					}
				    } else if (err==0) {
					err=26; // unknown name
					chaine_error=chaine1ST;
				    }
				    //*-*- Look for landau, xlandau,ylandau,xylandau
				    //*-*  =================================
				} else if (chaine=="landau" || (lchain==7 && chaine(1,6)=="landau")
					   || (lchain==8 && chaine(2,6)=="landau")
					   || chaine(0,7)=="landau(" || chaine(1,7)=="landau(" || chaine(2,7)=="landau(") {
				    chaine1ST=chaine;
				    if (chaine(1,6) == "landau") {
					ctemp=chaine(0,1);
					if (ctemp=="x") {
					    inter2=0;
					    if (fNdim < 1) fNdim = 1; }
					else if (ctemp=="y") {
					    inter2=1;
					    if (fNdim < 2) fNdim = 2; }
					else if (ctemp=="z") {
					    inter2=2;
					    if (fNdim < 3) fNdim = 3; }
					else if (ctemp=="t") {
					    inter2=3;
					    if (fNdim < 4) fNdim = 4; }
					else {
					    err=26; // unknown name
					    chaine_error=chaine1ST;
					}
					chaine=chaine(1,lchain-1);
					lchain=chaine.Length();
				    } else inter2=0;
				    if (chaine(2,6) == "landau") {
					if (chaine(0,2) != "xy") {
					    err=26; // unknown name
					    chaine_error=chaine1ST;
					}
					else {
					    inter2=5;
					    if (fNdim < 2) fNdim = 2;
					    chaine=chaine(2,lchain-2);
					    lchain=chaine.Length();
					}
				    }
				    if (lchain == 6 && err==0) {
					if (fNpar>=gMAXPAR) err=7; // too many parameters
					if (!err) {
					    fExpr[fNoper] = chaine1ST;
					    actionCode = klandau + inter2;
					    actionParam = offset;
					    SetAction(fNoper,actionCode,actionParam);
					    if (inter2 == 5+offset && fNpar < 5+offset) fNpar = 5+offset;
					    if (3+offset>fNpar) fNpar = 3+offset;
					    if (fNpar>=gMAXPAR) err=7; // too many parameters
					    if (!err) {
						fNoper++;
						if (fNdim < 1) fNdim = 1;
						if (fNpar == 3) SetNumber(400);
					    }
					}
				    } else if (chaine(6,1) == "(" && err==0) {
					ctemp = chaine(7,lchain-8);
					fExpr[fNoper] = chaine1ST;
					for (j=0; j<ctemp.Length(); j++) {
					    t=ctemp[j];
					    if (strchr("0123456789",t)==0 && (ctemp(j,1)!="+" || j!=0)) {
						err=20;
						chaine_error=chaine1ST;
					    }
					}
					if (err==0) {
					    sscanf(ctemp.Data(),"%d",&inter);
					    if (inter >= 0) {
						inter += offset;
						actionCode = klandau + inter2;
						actionParam = inter;
						SetAction(fNoper,actionCode,actionParam);
						if (inter2 == 5) inter += 2;
						if (inter+3>fNpar) fNpar = inter+3;
						if (fNpar>=gMAXPAR) err=7; // too many parameters
						if (!err) fNoper++;
						if (fNpar == 3) SetNumber(400);
					    } else err = 20; // non integer value for parameter number
					}
				    } else if (err==0) {
					err=26; // unknown name
					chaine_error=chaine1ST;
				    }
				    //*-*- Look for a polynomial
				    //*-*  =====================
				} else if (chaine(0,3) == "pol" || chaine(1,3) == "pol") {
				    chaine1ST=chaine;
				    if (chaine(1,3) == "pol") {
					ctemp=chaine(0,1);
					if (ctemp=="x") {
					    inter2=1;
					    if (fNdim < 1) fNdim = 1; }
					else if (ctemp=="y") {
					    inter2=2;
					    if (fNdim < 2) fNdim = 2; }
					else if (ctemp=="z") {
					    inter2=3;
					    if (fNdim < 3) fNdim = 3; }
					else if (ctemp=="t") {
					    inter2=4;
					    if (fNdim < 4) fNdim = 4; }
					else {
					    err=26; // unknown name;
					    chaine_error=chaine1ST;
					}
					chaine=chaine(1,lchain-1);
					lchain=chaine.Length();
				    } else inter2=1;
				    if (chaine(lchain-1,1) == ")") {
					nomb = 0;
					for (j=3;j<lchain;j++) if (chaine(j,1)=="(" && nomb == 0) nomb = j;
					if (nomb == 3) err = 23; // degree of polynomial not specified
					if (nomb == 0) err = 40; // '(' is expected
					ctemp = chaine(nomb+1,lchain-nomb-2);
					for (j=0; j<ctemp.Length(); j++) {
					    t=ctemp[j];
					    if (strchr("0123456789",t)==0 && (ctemp(j,1)!="+" || j!=0)) {
						err=20;
						chaine_error=chaine1ST;
					    }
					}
					if (!err) {
					    sscanf(ctemp.Data(),"%d",&inter);
					    if (inter < 0) err = 20;
					}
				    }
				    else {
					nomb = lchain;
					inter = 0;
				    }
				    if (!err) {
					inter--;
					ctemp = chaine(3,nomb-3);
					if (sscanf(ctemp.Data(),"%d",&n) > 0) {
					    if (n < 0  ) err = 24; //Degree of polynomial must be positive
					    if (n >= 20) err = 25; //Degree of polynomial must be less than 20
					} else err = 20;
				    }
				    if (!err) {
					fExpr[fNoper] = chaine1ST;
					actionCode = kpol+(inter2-1);
					actionParam = n*100+inter+2;
					SetAction(fNoper,actionCode,actionParam);
					if (inter+n+1>=fNpar) fNpar = inter + n + 2;
					if (fNpar>=gMAXPAR) err=7; // too many parameters
					if (!err) {
					    fNoper++;
					    if (fNdim < 1) fNdim = 1;
					    SetNumber(300+n);
					}
				    }
				    //*-*- Look for pow,atan2,etc
				    //*-*  ======================
				} else if (chaine(0,4) == "pow(") {
				    compt = 4; nomb = 0; virgule = 0; nest=0;
				    while(compt != lchain) {
					compt++;
					if (chaine(compt-1,1) == "(") nest++;
					else if (chaine(compt-1,1) == ")") nest--;
					else if (chaine(compt-1,1) == "," && nest==0) {
					    nomb++;
					    if (nomb == 1 && virgule == 0) virgule = compt;
					}
				    }
				    if (nomb != 1) err = 22; // There are plus or minus than 2 arguments for pow
				    else {
					ctemp = chaine(4,virgule-5);
					Analyze(ctemp.Data(),err,offset); if (err) return;
					ctemp = chaine(virgule,lchain-virgule-1);
					Analyze(ctemp.Data(),err,offset); if (err) return;
					fExpr[fNoper] = "^";
					actionCode = kpow;
					SetAction(fNoper,actionCode,actionParam);
					fNoper++;
				    }
				} else if (chaine(0,7) == "strstr(") {
				    compt = 7; nomb = 0; virgule = 0; nest=0;
				    inString = false;
				    while(compt != lchain) {
					compt++;
					if (chaine(compt-1,1) == "\"") {
					    inString = !inString;
					}  else if (!inString) {
					    if (chaine(compt-1,1) == "(") nest++;
					    else if (chaine(compt-1,1) == ")") nest--;
					    else if (chaine(compt-1,1) == "," && nest==0) {
						nomb++;
						if (nomb == 1 && virgule == 0) virgule = compt;
					    }
					}
				    }
				    if (nomb != 1) err = 28; // There are plus or minus than 2 arguments for strstr
				    else {
					ctemp = chaine(7,virgule-8);
					Analyze(ctemp.Data(),err,offset); if (err) return;
					ctemp = chaine(virgule,lchain-virgule-1);
					Analyze(ctemp.Data(),err,offset); if (err) return;
					fExpr[fNoper] = "strstr";
					actionCode = kstrstr;
					SetAction(fNoper,actionCode,actionParam);
					fNoper++;
				    }
				} else if (chaine(0,4) == "min(") {
				    compt = 4; nomb = 0; virgule = 0; nest=0;
				    while(compt != lchain) {
					compt++;
					if (chaine(compt-1,1) == "(") nest++;
					else if (chaine(compt-1,1) == ")") nest--;
					else if (chaine(compt-1,1) == "," && nest==0) {
					    nomb++;
					    if (nomb == 1 && virgule == 0) virgule = compt;
					}
				    }
				    if (nomb != 1) {
					err = 44; // There are plus or minus than 2 arguments for min
					err_hint = 3;
				    }
				    else {
					ctemp = chaine(4,virgule-5);
					Analyze(ctemp.Data(),err,offset); if (err) return;
					ctemp = chaine(virgule,lchain-virgule-1);
					Analyze(ctemp.Data(),err,offset); if (err) return;
					fExpr[fNoper] = "min";
					actionCode = kmin;
					SetAction(fNoper,actionCode,actionParam);
					fNoper++;
				    }
				} else if (chaine(0,4) == "max(") {
				    compt = 4; nomb = 0; virgule = 0; nest=0;
				    while(compt != lchain) {
					compt++;
					if (chaine(compt-1,1) == "(") nest++;
					else if (chaine(compt-1,1) == ")") nest--;
					else if (chaine(compt-1,1) == "," && nest==0) {
					    nomb++;
					    if (nomb == 1 && virgule == 0) virgule = compt;
					}
				    }
				    if (nomb != 1) {
					err = 44; // There are plus or minus than 2 arguments for min
					err_hint = 3;
				    }
				    else {
					ctemp = chaine(4,virgule-5);
					Analyze(ctemp.Data(),err,offset); if (err) return;
					ctemp = chaine(virgule,lchain-virgule-1);
					Analyze(ctemp.Data(),err,offset); if (err) return;
					fExpr[fNoper] = "max";
					actionCode = kmax;
					SetAction(fNoper,actionCode,actionParam);
					fNoper++;
				    }

				} else if (chaine(0,6) == "atan2(") {
				    compt = 6; nomb = 0; virgule = 0; nest=0;
				    while(compt != lchain) {
					compt++;
					if (chaine(compt-1,1) == "(") nest++;
					else if (chaine(compt-1,1) == ")") nest--;
					else if (chaine(compt-1,1) == "," && nest==0) {
					    nomb++;
					    if (nomb == 1 && virgule == 0) virgule = compt;
					}
				    }
				    if (nomb != 1) err = 21;  //{ There are plus or minus than 2 arguments for atan2
				    else {
					ctemp = chaine(6,virgule-7);
					Analyze(ctemp.Data(),err,offset); if (err) return;
					ctemp = chaine(virgule,lchain-virgule-1);
					Analyze(ctemp.Data(),err,offset); if (err) return;
					fExpr[fNoper] = "atan2";
					actionCode = katan2;
					SetAction(fNoper,actionCode,actionParam);
					fNoper++;
				    }
				} else if (chaine(0,5) == "fmod(") {
				    compt = 5; nomb = 0; virgule = 0; nest=0;
				    while(compt != lchain) {
					compt++;
					if (chaine(compt-1,1) == "(") nest++;
					else if (chaine(compt-1,1) == ")") nest--;
					else if (chaine(compt-1,1) == "," && nest==0) {
					    nomb++;
					    if (nomb == 1 && virgule == 0) virgule = compt;
					}
				    }
				    if (nomb != 1) {
					err = 44; // There are plus or minus than 2 arguments for fmod
					err_hint = 4;
				    }
				    else {
					ctemp = chaine(5,virgule-6);
					Analyze(ctemp.Data(),err,offset); if (err) return;
					ctemp = chaine(virgule,lchain-virgule-1);
					Analyze(ctemp.Data(),err,offset); if (err) return;
					fExpr[fNoper] = "fmod";
					actionCode = kfmod;
					SetAction(fNoper,actionCode,actionParam);
					fNoper++;
				    }
				} else if (AnalyzeFunction(chaine,err,offset) || err) { // The '||err' is to grab an error coming from AnalyzeFunction
				    if (err) {
					chaine_error = chaine;
				    } else {
					// We have a function call. Note that all the work was already,
					// eventually done in AnalyzeFuntion
					//fprintf(stderr,"We found a foreign function in %s\n",chaine.Data());
				    }
				} else if (chaine(0,1) == "[" && chaine(lchain-1,1) == "]") {
				    fExpr[fNoper] = chaine;
				    fNoper++;
				    ctemp = chaine(1,lchain-2);
				    for (j=0; j<ctemp.Length(); j++) {
					t=ctemp[j];
					if (strchr("0123456789",t)==0 && (ctemp(j,1)!="+" || j!=0)) {
					    err=20;
					    chaine_error=chaine1ST; // le numero ? de par[?] n'est pas un entier }
					}
				    }
				    if (!err) {
					sscanf(ctemp.Data(),"%d",&valeur);
					actionCode = kParameter;
					actionParam = offset + valeur;
					SetAction(fNoper-1, actionCode, actionParam);
					fExpr[fNoper-1] = "[";
					fExpr[fNoper-1] = (fExpr[fNoper-1] + (long int)(valeur+offset)) + "]";
				    }
				} else if (chaine == "pi") {
				    fExpr[fNoper] = "pi";
				    actionCode = kpi;
				    SetAction(fNoper,actionCode,actionParam);
				    fNoper++;
				}
				else {
				    //*-*- None of the above.
				    //*-*  ==================
				    err = 30;
				}
			    }
			}
		    }
		}
	    }
	}

	//   Test  * si y existe :  que x existe
	//         * si z existe :  que x et y existent

	//     nomb = 1;
	//     for (i=1; i<=fNoper; i++) {
	//         if (fOper[i-1] == 97 && nomb > 0) nomb *= -1;
	//         if (fOper[i-1] == 98 && TMath::Abs(nomb) != 2) nomb *= 2;
	//         if (fOper[i-1] == 99 && TMath::Abs(nomb) != 20 && TMath::Abs(nomb) != 10) nomb *= 10;
	//     }
	//     if (nomb == 10)  err = 10; //{variable z sans x et y }
	//     if (nomb == 20)  err = 11; //{variables z et y sans x }
	//     if (nomb == 2)   err = 12; //{variable y sans x }
	//     if (nomb == -10) err = 13; //{variables z et x sans y }

	//*-*- Overflows
	if (fNoper>=gMAXOP) err=6; // too many operators

    }

    //*-*- errors!
    if (err>1) {
	TString er = "";
	error_string =  chaine_error;
	chaine_error = "\""+chaine_error+"\"";
	switch(err) {
	case  2 : er = " Invalid Floating Point Operation"; break;
	case  4 : er = " Empty String"; break;
	case  5 : er = " Invalid Syntax " + chaine_error; break;
	case  6 : er = " Too many operators !"; break;
	case  7 : er = " Too many parameters !"; break;
	case 10 : er = " z specified but not x and y"; break;
	case 11 : er = " z and y specified but not x"; break;
	case 12 : er = " y specified but not x"; break;
	case 13 : er = " z and x specified but not y"; break;
	case 20 : er = " Non integer value for parameter number : " + chaine_error; break;
	case 21 : er = " ATAN2 requires two arguments"; break;
	case 22 : er = " POW requires two arguments"; break;
	case 23 : er = " Degree of polynomial not specified"; break;
	case 24 : er = " Degree of polynomial must be positive"; break;
	case 25 : er = " Degree of polynomial must be less than 20"; break;
	case 26 : er = " Unknown name : " + chaine_error; break;
	case 27 : er = " Too many constants in expression"; break;
	case 28 : er = " strstr requires two arguments"; break;
	case 29 : er = " TFormula can only call interpreted and compiled functions that return a numerical type: " + chaine_error; break;
	    //         case 30 : er = " Bad numerical expression : " + chaine_error; break;
	case 31 : er = " Part of the Variable " + chaine_error; er += " exists but some of it is not accessible or useable"; break;
	case 40 : er = " '(' is expected"; break;
	case 41 : er = " ')' is expected"; break;
	case 42 : er = " '[' is expected"; break;
	case 43 : er = " ']' is expected"; break;
	case 44 : er = " The function '" + chaine(0,err_hint) + "' requires two arguments."; break;
	}
	if (err != 30)
	    Error("Compile",er.Data());

	//      err=1;
    }
    error_code = err;
}

#else

PFormula::PFormula(const char *name,const char *expression) {
    Error("Compile","ROOT version too old");
}

void PFormula::Analyze(const char *schain, Int_t &err, Int_t offset){
    error_code = 666;
    Error("Compile","ROOT version too old");
    error_string = "ROOT version too old";
}


#endif

ClassImp(PFormula)
 PFormula.cc:1
 PFormula.cc:2
 PFormula.cc:3
 PFormula.cc:4
 PFormula.cc:5
 PFormula.cc:6
 PFormula.cc:7
 PFormula.cc:8
 PFormula.cc:9
 PFormula.cc:10
 PFormula.cc:11
 PFormula.cc:12
 PFormula.cc:13
 PFormula.cc:14
 PFormula.cc:15
 PFormula.cc:16
 PFormula.cc:17
 PFormula.cc:18
 PFormula.cc:19
 PFormula.cc:20
 PFormula.cc:21
 PFormula.cc:22
 PFormula.cc:23
 PFormula.cc:24
 PFormula.cc:25
 PFormula.cc:26
 PFormula.cc:27
 PFormula.cc:28
 PFormula.cc:29
 PFormula.cc:30
 PFormula.cc:31
 PFormula.cc:32
 PFormula.cc:33
 PFormula.cc:34
 PFormula.cc:35
 PFormula.cc:36
 PFormula.cc:37
 PFormula.cc:38
 PFormula.cc:39
 PFormula.cc:40
 PFormula.cc:41
 PFormula.cc:42
 PFormula.cc:43
 PFormula.cc:44
 PFormula.cc:45
 PFormula.cc:46
 PFormula.cc:47
 PFormula.cc:48
 PFormula.cc:49
 PFormula.cc:50
 PFormula.cc:51
 PFormula.cc:52
 PFormula.cc:53
 PFormula.cc:54
 PFormula.cc:55
 PFormula.cc:56
 PFormula.cc:57
 PFormula.cc:58
 PFormula.cc:59
 PFormula.cc:60
 PFormula.cc:61
 PFormula.cc:62
 PFormula.cc:63
 PFormula.cc:64
 PFormula.cc:65
 PFormula.cc:66
 PFormula.cc:67
 PFormula.cc:68
 PFormula.cc:69
 PFormula.cc:70
 PFormula.cc:71
 PFormula.cc:72
 PFormula.cc:73
 PFormula.cc:74
 PFormula.cc:75
 PFormula.cc:76
 PFormula.cc:77
 PFormula.cc:78
 PFormula.cc:79
 PFormula.cc:80
 PFormula.cc:81
 PFormula.cc:82
 PFormula.cc:83
 PFormula.cc:84
 PFormula.cc:85
 PFormula.cc:86
 PFormula.cc:87
 PFormula.cc:88
 PFormula.cc:89
 PFormula.cc:90
 PFormula.cc:91
 PFormula.cc:92
 PFormula.cc:93
 PFormula.cc:94
 PFormula.cc:95
 PFormula.cc:96
 PFormula.cc:97
 PFormula.cc:98
 PFormula.cc:99
 PFormula.cc:100
 PFormula.cc:101
 PFormula.cc:102
 PFormula.cc:103
 PFormula.cc:104
 PFormula.cc:105
 PFormula.cc:106
 PFormula.cc:107
 PFormula.cc:108
 PFormula.cc:109
 PFormula.cc:110
 PFormula.cc:111
 PFormula.cc:112
 PFormula.cc:113
 PFormula.cc:114
 PFormula.cc:115
 PFormula.cc:116
 PFormula.cc:117
 PFormula.cc:118
 PFormula.cc:119
 PFormula.cc:120
 PFormula.cc:121
 PFormula.cc:122
 PFormula.cc:123
 PFormula.cc:124
 PFormula.cc:125
 PFormula.cc:126
 PFormula.cc:127
 PFormula.cc:128
 PFormula.cc:129
 PFormula.cc:130
 PFormula.cc:131
 PFormula.cc:132
 PFormula.cc:133
 PFormula.cc:134
 PFormula.cc:135
 PFormula.cc:136
 PFormula.cc:137
 PFormula.cc:138
 PFormula.cc:139
 PFormula.cc:140
 PFormula.cc:141
 PFormula.cc:142
 PFormula.cc:143
 PFormula.cc:144
 PFormula.cc:145
 PFormula.cc:146
 PFormula.cc:147
 PFormula.cc:148
 PFormula.cc:149
 PFormula.cc:150
 PFormula.cc:151
 PFormula.cc:152
 PFormula.cc:153
 PFormula.cc:154
 PFormula.cc:155
 PFormula.cc:156
 PFormula.cc:157
 PFormula.cc:158
 PFormula.cc:159
 PFormula.cc:160
 PFormula.cc:161
 PFormula.cc:162
 PFormula.cc:163
 PFormula.cc:164
 PFormula.cc:165
 PFormula.cc:166
 PFormula.cc:167
 PFormula.cc:168
 PFormula.cc:169
 PFormula.cc:170
 PFormula.cc:171
 PFormula.cc:172
 PFormula.cc:173
 PFormula.cc:174
 PFormula.cc:175
 PFormula.cc:176
 PFormula.cc:177
 PFormula.cc:178
 PFormula.cc:179
 PFormula.cc:180
 PFormula.cc:181
 PFormula.cc:182
 PFormula.cc:183
 PFormula.cc:184
 PFormula.cc:185
 PFormula.cc:186
 PFormula.cc:187
 PFormula.cc:188
 PFormula.cc:189
 PFormula.cc:190
 PFormula.cc:191
 PFormula.cc:192
 PFormula.cc:193
 PFormula.cc:194
 PFormula.cc:195
 PFormula.cc:196
 PFormula.cc:197
 PFormula.cc:198
 PFormula.cc:199
 PFormula.cc:200
 PFormula.cc:201
 PFormula.cc:202
 PFormula.cc:203
 PFormula.cc:204
 PFormula.cc:205
 PFormula.cc:206
 PFormula.cc:207
 PFormula.cc:208
 PFormula.cc:209
 PFormula.cc:210
 PFormula.cc:211
 PFormula.cc:212
 PFormula.cc:213
 PFormula.cc:214
 PFormula.cc:215
 PFormula.cc:216
 PFormula.cc:217
 PFormula.cc:218
 PFormula.cc:219
 PFormula.cc:220
 PFormula.cc:221
 PFormula.cc:222
 PFormula.cc:223
 PFormula.cc:224
 PFormula.cc:225
 PFormula.cc:226
 PFormula.cc:227
 PFormula.cc:228
 PFormula.cc:229
 PFormula.cc:230
 PFormula.cc:231
 PFormula.cc:232
 PFormula.cc:233
 PFormula.cc:234
 PFormula.cc:235
 PFormula.cc:236
 PFormula.cc:237
 PFormula.cc:238
 PFormula.cc:239
 PFormula.cc:240
 PFormula.cc:241
 PFormula.cc:242
 PFormula.cc:243
 PFormula.cc:244
 PFormula.cc:245
 PFormula.cc:246
 PFormula.cc:247
 PFormula.cc:248
 PFormula.cc:249
 PFormula.cc:250
 PFormula.cc:251
 PFormula.cc:252
 PFormula.cc:253
 PFormula.cc:254
 PFormula.cc:255
 PFormula.cc:256
 PFormula.cc:257
 PFormula.cc:258
 PFormula.cc:259
 PFormula.cc:260
 PFormula.cc:261
 PFormula.cc:262
 PFormula.cc:263
 PFormula.cc:264
 PFormula.cc:265
 PFormula.cc:266
 PFormula.cc:267
 PFormula.cc:268
 PFormula.cc:269
 PFormula.cc:270
 PFormula.cc:271
 PFormula.cc:272
 PFormula.cc:273
 PFormula.cc:274
 PFormula.cc:275
 PFormula.cc:276
 PFormula.cc:277
 PFormula.cc:278
 PFormula.cc:279
 PFormula.cc:280
 PFormula.cc:281
 PFormula.cc:282
 PFormula.cc:283
 PFormula.cc:284
 PFormula.cc:285
 PFormula.cc:286
 PFormula.cc:287
 PFormula.cc:288
 PFormula.cc:289
 PFormula.cc:290
 PFormula.cc:291
 PFormula.cc:292
 PFormula.cc:293
 PFormula.cc:294
 PFormula.cc:295
 PFormula.cc:296
 PFormula.cc:297
 PFormula.cc:298
 PFormula.cc:299
 PFormula.cc:300
 PFormula.cc:301
 PFormula.cc:302
 PFormula.cc:303
 PFormula.cc:304
 PFormula.cc:305
 PFormula.cc:306
 PFormula.cc:307
 PFormula.cc:308
 PFormula.cc:309
 PFormula.cc:310
 PFormula.cc:311
 PFormula.cc:312
 PFormula.cc:313
 PFormula.cc:314
 PFormula.cc:315
 PFormula.cc:316
 PFormula.cc:317
 PFormula.cc:318
 PFormula.cc:319
 PFormula.cc:320
 PFormula.cc:321
 PFormula.cc:322
 PFormula.cc:323
 PFormula.cc:324
 PFormula.cc:325
 PFormula.cc:326
 PFormula.cc:327
 PFormula.cc:328
 PFormula.cc:329
 PFormula.cc:330
 PFormula.cc:331
 PFormula.cc:332
 PFormula.cc:333
 PFormula.cc:334
 PFormula.cc:335
 PFormula.cc:336
 PFormula.cc:337
 PFormula.cc:338
 PFormula.cc:339
 PFormula.cc:340
 PFormula.cc:341
 PFormula.cc:342
 PFormula.cc:343
 PFormula.cc:344
 PFormula.cc:345
 PFormula.cc:346
 PFormula.cc:347
 PFormula.cc:348
 PFormula.cc:349
 PFormula.cc:350
 PFormula.cc:351
 PFormula.cc:352
 PFormula.cc:353
 PFormula.cc:354
 PFormula.cc:355
 PFormula.cc:356
 PFormula.cc:357
 PFormula.cc:358
 PFormula.cc:359
 PFormula.cc:360
 PFormula.cc:361
 PFormula.cc:362
 PFormula.cc:363
 PFormula.cc:364
 PFormula.cc:365
 PFormula.cc:366
 PFormula.cc:367
 PFormula.cc:368
 PFormula.cc:369
 PFormula.cc:370
 PFormula.cc:371
 PFormula.cc:372
 PFormula.cc:373
 PFormula.cc:374
 PFormula.cc:375
 PFormula.cc:376
 PFormula.cc:377
 PFormula.cc:378
 PFormula.cc:379
 PFormula.cc:380
 PFormula.cc:381
 PFormula.cc:382
 PFormula.cc:383
 PFormula.cc:384
 PFormula.cc:385
 PFormula.cc:386
 PFormula.cc:387
 PFormula.cc:388
 PFormula.cc:389
 PFormula.cc:390
 PFormula.cc:391
 PFormula.cc:392
 PFormula.cc:393
 PFormula.cc:394
 PFormula.cc:395
 PFormula.cc:396
 PFormula.cc:397
 PFormula.cc:398
 PFormula.cc:399
 PFormula.cc:400
 PFormula.cc:401
 PFormula.cc:402
 PFormula.cc:403
 PFormula.cc:404
 PFormula.cc:405
 PFormula.cc:406
 PFormula.cc:407
 PFormula.cc:408
 PFormula.cc:409
 PFormula.cc:410
 PFormula.cc:411
 PFormula.cc:412
 PFormula.cc:413
 PFormula.cc:414
 PFormula.cc:415
 PFormula.cc:416
 PFormula.cc:417
 PFormula.cc:418
 PFormula.cc:419
 PFormula.cc:420
 PFormula.cc:421
 PFormula.cc:422
 PFormula.cc:423
 PFormula.cc:424
 PFormula.cc:425
 PFormula.cc:426
 PFormula.cc:427
 PFormula.cc:428
 PFormula.cc:429
 PFormula.cc:430
 PFormula.cc:431
 PFormula.cc:432
 PFormula.cc:433
 PFormula.cc:434
 PFormula.cc:435
 PFormula.cc:436
 PFormula.cc:437
 PFormula.cc:438
 PFormula.cc:439
 PFormula.cc:440
 PFormula.cc:441
 PFormula.cc:442
 PFormula.cc:443
 PFormula.cc:444
 PFormula.cc:445
 PFormula.cc:446
 PFormula.cc:447
 PFormula.cc:448
 PFormula.cc:449
 PFormula.cc:450
 PFormula.cc:451
 PFormula.cc:452
 PFormula.cc:453
 PFormula.cc:454
 PFormula.cc:455
 PFormula.cc:456
 PFormula.cc:457
 PFormula.cc:458
 PFormula.cc:459
 PFormula.cc:460
 PFormula.cc:461
 PFormula.cc:462
 PFormula.cc:463
 PFormula.cc:464
 PFormula.cc:465
 PFormula.cc:466
 PFormula.cc:467
 PFormula.cc:468
 PFormula.cc:469
 PFormula.cc:470
 PFormula.cc:471
 PFormula.cc:472
 PFormula.cc:473
 PFormula.cc:474
 PFormula.cc:475
 PFormula.cc:476
 PFormula.cc:477
 PFormula.cc:478
 PFormula.cc:479
 PFormula.cc:480
 PFormula.cc:481
 PFormula.cc:482
 PFormula.cc:483
 PFormula.cc:484
 PFormula.cc:485
 PFormula.cc:486
 PFormula.cc:487
 PFormula.cc:488
 PFormula.cc:489
 PFormula.cc:490
 PFormula.cc:491
 PFormula.cc:492
 PFormula.cc:493
 PFormula.cc:494
 PFormula.cc:495
 PFormula.cc:496
 PFormula.cc:497
 PFormula.cc:498
 PFormula.cc:499
 PFormula.cc:500
 PFormula.cc:501
 PFormula.cc:502
 PFormula.cc:503
 PFormula.cc:504
 PFormula.cc:505
 PFormula.cc:506
 PFormula.cc:507
 PFormula.cc:508
 PFormula.cc:509
 PFormula.cc:510
 PFormula.cc:511
 PFormula.cc:512
 PFormula.cc:513
 PFormula.cc:514
 PFormula.cc:515
 PFormula.cc:516
 PFormula.cc:517
 PFormula.cc:518
 PFormula.cc:519
 PFormula.cc:520
 PFormula.cc:521
 PFormula.cc:522
 PFormula.cc:523
 PFormula.cc:524
 PFormula.cc:525
 PFormula.cc:526
 PFormula.cc:527
 PFormula.cc:528
 PFormula.cc:529
 PFormula.cc:530
 PFormula.cc:531
 PFormula.cc:532
 PFormula.cc:533
 PFormula.cc:534
 PFormula.cc:535
 PFormula.cc:536
 PFormula.cc:537
 PFormula.cc:538
 PFormula.cc:539
 PFormula.cc:540
 PFormula.cc:541
 PFormula.cc:542
 PFormula.cc:543
 PFormula.cc:544
 PFormula.cc:545
 PFormula.cc:546
 PFormula.cc:547
 PFormula.cc:548
 PFormula.cc:549
 PFormula.cc:550
 PFormula.cc:551
 PFormula.cc:552
 PFormula.cc:553
 PFormula.cc:554
 PFormula.cc:555
 PFormula.cc:556
 PFormula.cc:557
 PFormula.cc:558
 PFormula.cc:559
 PFormula.cc:560
 PFormula.cc:561
 PFormula.cc:562
 PFormula.cc:563
 PFormula.cc:564
 PFormula.cc:565
 PFormula.cc:566
 PFormula.cc:567
 PFormula.cc:568
 PFormula.cc:569
 PFormula.cc:570
 PFormula.cc:571
 PFormula.cc:572
 PFormula.cc:573
 PFormula.cc:574
 PFormula.cc:575
 PFormula.cc:576
 PFormula.cc:577
 PFormula.cc:578
 PFormula.cc:579
 PFormula.cc:580
 PFormula.cc:581
 PFormula.cc:582
 PFormula.cc:583
 PFormula.cc:584
 PFormula.cc:585
 PFormula.cc:586
 PFormula.cc:587
 PFormula.cc:588
 PFormula.cc:589
 PFormula.cc:590
 PFormula.cc:591
 PFormula.cc:592
 PFormula.cc:593
 PFormula.cc:594
 PFormula.cc:595
 PFormula.cc:596
 PFormula.cc:597
 PFormula.cc:598
 PFormula.cc:599
 PFormula.cc:600
 PFormula.cc:601
 PFormula.cc:602
 PFormula.cc:603
 PFormula.cc:604
 PFormula.cc:605
 PFormula.cc:606
 PFormula.cc:607
 PFormula.cc:608
 PFormula.cc:609
 PFormula.cc:610
 PFormula.cc:611
 PFormula.cc:612
 PFormula.cc:613
 PFormula.cc:614
 PFormula.cc:615
 PFormula.cc:616
 PFormula.cc:617
 PFormula.cc:618
 PFormula.cc:619
 PFormula.cc:620
 PFormula.cc:621
 PFormula.cc:622
 PFormula.cc:623
 PFormula.cc:624
 PFormula.cc:625
 PFormula.cc:626
 PFormula.cc:627
 PFormula.cc:628
 PFormula.cc:629
 PFormula.cc:630
 PFormula.cc:631
 PFormula.cc:632
 PFormula.cc:633
 PFormula.cc:634
 PFormula.cc:635
 PFormula.cc:636
 PFormula.cc:637
 PFormula.cc:638
 PFormula.cc:639
 PFormula.cc:640
 PFormula.cc:641
 PFormula.cc:642
 PFormula.cc:643
 PFormula.cc:644
 PFormula.cc:645
 PFormula.cc:646
 PFormula.cc:647
 PFormula.cc:648
 PFormula.cc:649
 PFormula.cc:650
 PFormula.cc:651
 PFormula.cc:652
 PFormula.cc:653
 PFormula.cc:654
 PFormula.cc:655
 PFormula.cc:656
 PFormula.cc:657
 PFormula.cc:658
 PFormula.cc:659
 PFormula.cc:660
 PFormula.cc:661
 PFormula.cc:662
 PFormula.cc:663
 PFormula.cc:664
 PFormula.cc:665
 PFormula.cc:666
 PFormula.cc:667
 PFormula.cc:668
 PFormula.cc:669
 PFormula.cc:670
 PFormula.cc:671
 PFormula.cc:672
 PFormula.cc:673
 PFormula.cc:674
 PFormula.cc:675
 PFormula.cc:676
 PFormula.cc:677
 PFormula.cc:678
 PFormula.cc:679
 PFormula.cc:680
 PFormula.cc:681
 PFormula.cc:682
 PFormula.cc:683
 PFormula.cc:684
 PFormula.cc:685
 PFormula.cc:686
 PFormula.cc:687
 PFormula.cc:688
 PFormula.cc:689
 PFormula.cc:690
 PFormula.cc:691
 PFormula.cc:692
 PFormula.cc:693
 PFormula.cc:694
 PFormula.cc:695
 PFormula.cc:696
 PFormula.cc:697
 PFormula.cc:698
 PFormula.cc:699
 PFormula.cc:700
 PFormula.cc:701
 PFormula.cc:702
 PFormula.cc:703
 PFormula.cc:704
 PFormula.cc:705
 PFormula.cc:706
 PFormula.cc:707
 PFormula.cc:708
 PFormula.cc:709
 PFormula.cc:710
 PFormula.cc:711
 PFormula.cc:712
 PFormula.cc:713
 PFormula.cc:714
 PFormula.cc:715
 PFormula.cc:716
 PFormula.cc:717
 PFormula.cc:718
 PFormula.cc:719
 PFormula.cc:720
 PFormula.cc:721
 PFormula.cc:722
 PFormula.cc:723
 PFormula.cc:724
 PFormula.cc:725
 PFormula.cc:726
 PFormula.cc:727
 PFormula.cc:728
 PFormula.cc:729
 PFormula.cc:730
 PFormula.cc:731
 PFormula.cc:732
 PFormula.cc:733
 PFormula.cc:734
 PFormula.cc:735
 PFormula.cc:736
 PFormula.cc:737
 PFormula.cc:738
 PFormula.cc:739
 PFormula.cc:740
 PFormula.cc:741
 PFormula.cc:742
 PFormula.cc:743
 PFormula.cc:744
 PFormula.cc:745
 PFormula.cc:746
 PFormula.cc:747
 PFormula.cc:748
 PFormula.cc:749
 PFormula.cc:750
 PFormula.cc:751
 PFormula.cc:752
 PFormula.cc:753
 PFormula.cc:754
 PFormula.cc:755
 PFormula.cc:756
 PFormula.cc:757
 PFormula.cc:758
 PFormula.cc:759
 PFormula.cc:760
 PFormula.cc:761
 PFormula.cc:762
 PFormula.cc:763
 PFormula.cc:764
 PFormula.cc:765
 PFormula.cc:766
 PFormula.cc:767
 PFormula.cc:768
 PFormula.cc:769
 PFormula.cc:770
 PFormula.cc:771
 PFormula.cc:772
 PFormula.cc:773
 PFormula.cc:774
 PFormula.cc:775
 PFormula.cc:776
 PFormula.cc:777
 PFormula.cc:778
 PFormula.cc:779
 PFormula.cc:780
 PFormula.cc:781
 PFormula.cc:782
 PFormula.cc:783
 PFormula.cc:784
 PFormula.cc:785
 PFormula.cc:786
 PFormula.cc:787
 PFormula.cc:788
 PFormula.cc:789
 PFormula.cc:790
 PFormula.cc:791
 PFormula.cc:792
 PFormula.cc:793
 PFormula.cc:794
 PFormula.cc:795
 PFormula.cc:796
 PFormula.cc:797
 PFormula.cc:798
 PFormula.cc:799
 PFormula.cc:800
 PFormula.cc:801
 PFormula.cc:802
 PFormula.cc:803
 PFormula.cc:804
 PFormula.cc:805
 PFormula.cc:806
 PFormula.cc:807
 PFormula.cc:808
 PFormula.cc:809
 PFormula.cc:810
 PFormula.cc:811
 PFormula.cc:812
 PFormula.cc:813
 PFormula.cc:814
 PFormula.cc:815
 PFormula.cc:816
 PFormula.cc:817
 PFormula.cc:818
 PFormula.cc:819
 PFormula.cc:820
 PFormula.cc:821
 PFormula.cc:822
 PFormula.cc:823
 PFormula.cc:824
 PFormula.cc:825
 PFormula.cc:826
 PFormula.cc:827
 PFormula.cc:828
 PFormula.cc:829
 PFormula.cc:830
 PFormula.cc:831
 PFormula.cc:832
 PFormula.cc:833
 PFormula.cc:834
 PFormula.cc:835
 PFormula.cc:836
 PFormula.cc:837
 PFormula.cc:838
 PFormula.cc:839
 PFormula.cc:840
 PFormula.cc:841
 PFormula.cc:842
 PFormula.cc:843
 PFormula.cc:844
 PFormula.cc:845
 PFormula.cc:846
 PFormula.cc:847
 PFormula.cc:848
 PFormula.cc:849
 PFormula.cc:850
 PFormula.cc:851
 PFormula.cc:852
 PFormula.cc:853
 PFormula.cc:854
 PFormula.cc:855
 PFormula.cc:856
 PFormula.cc:857
 PFormula.cc:858
 PFormula.cc:859
 PFormula.cc:860
 PFormula.cc:861
 PFormula.cc:862
 PFormula.cc:863
 PFormula.cc:864
 PFormula.cc:865
 PFormula.cc:866
 PFormula.cc:867
 PFormula.cc:868
 PFormula.cc:869
 PFormula.cc:870
 PFormula.cc:871
 PFormula.cc:872
 PFormula.cc:873
 PFormula.cc:874
 PFormula.cc:875
 PFormula.cc:876
 PFormula.cc:877
 PFormula.cc:878
 PFormula.cc:879
 PFormula.cc:880
 PFormula.cc:881
 PFormula.cc:882
 PFormula.cc:883
 PFormula.cc:884
 PFormula.cc:885
 PFormula.cc:886
 PFormula.cc:887
 PFormula.cc:888
 PFormula.cc:889
 PFormula.cc:890
 PFormula.cc:891
 PFormula.cc:892
 PFormula.cc:893
 PFormula.cc:894
 PFormula.cc:895
 PFormula.cc:896
 PFormula.cc:897
 PFormula.cc:898
 PFormula.cc:899
 PFormula.cc:900
 PFormula.cc:901
 PFormula.cc:902
 PFormula.cc:903
 PFormula.cc:904
 PFormula.cc:905
 PFormula.cc:906
 PFormula.cc:907
 PFormula.cc:908
 PFormula.cc:909
 PFormula.cc:910
 PFormula.cc:911
 PFormula.cc:912
 PFormula.cc:913
 PFormula.cc:914
 PFormula.cc:915
 PFormula.cc:916
 PFormula.cc:917
 PFormula.cc:918
 PFormula.cc:919
 PFormula.cc:920
 PFormula.cc:921
 PFormula.cc:922
 PFormula.cc:923
 PFormula.cc:924
 PFormula.cc:925
 PFormula.cc:926
 PFormula.cc:927
 PFormula.cc:928
 PFormula.cc:929
 PFormula.cc:930
 PFormula.cc:931
 PFormula.cc:932
 PFormula.cc:933
 PFormula.cc:934
 PFormula.cc:935
 PFormula.cc:936
 PFormula.cc:937
 PFormula.cc:938
 PFormula.cc:939
 PFormula.cc:940
 PFormula.cc:941
 PFormula.cc:942
 PFormula.cc:943
 PFormula.cc:944
 PFormula.cc:945
 PFormula.cc:946
 PFormula.cc:947
 PFormula.cc:948
 PFormula.cc:949
 PFormula.cc:950
 PFormula.cc:951
 PFormula.cc:952
 PFormula.cc:953
 PFormula.cc:954
 PFormula.cc:955
 PFormula.cc:956
 PFormula.cc:957
 PFormula.cc:958
 PFormula.cc:959
 PFormula.cc:960
 PFormula.cc:961
 PFormula.cc:962
 PFormula.cc:963
 PFormula.cc:964
 PFormula.cc:965
 PFormula.cc:966
 PFormula.cc:967
 PFormula.cc:968
 PFormula.cc:969
 PFormula.cc:970
 PFormula.cc:971
 PFormula.cc:972
 PFormula.cc:973
 PFormula.cc:974
 PFormula.cc:975
 PFormula.cc:976
 PFormula.cc:977
 PFormula.cc:978
 PFormula.cc:979
 PFormula.cc:980
 PFormula.cc:981
 PFormula.cc:982
 PFormula.cc:983
 PFormula.cc:984
 PFormula.cc:985
 PFormula.cc:986
 PFormula.cc:987
 PFormula.cc:988
 PFormula.cc:989
 PFormula.cc:990
 PFormula.cc:991
 PFormula.cc:992
 PFormula.cc:993
 PFormula.cc:994
 PFormula.cc:995
 PFormula.cc:996
 PFormula.cc:997
 PFormula.cc:998
 PFormula.cc:999
 PFormula.cc:1000
 PFormula.cc:1001
 PFormula.cc:1002
 PFormula.cc:1003
 PFormula.cc:1004
 PFormula.cc:1005
 PFormula.cc:1006
 PFormula.cc:1007
 PFormula.cc:1008
 PFormula.cc:1009
 PFormula.cc:1010
 PFormula.cc:1011
 PFormula.cc:1012
 PFormula.cc:1013
 PFormula.cc:1014
 PFormula.cc:1015
 PFormula.cc:1016
 PFormula.cc:1017
 PFormula.cc:1018
 PFormula.cc:1019
 PFormula.cc:1020
 PFormula.cc:1021
 PFormula.cc:1022
 PFormula.cc:1023
 PFormula.cc:1024
 PFormula.cc:1025
 PFormula.cc:1026
 PFormula.cc:1027
 PFormula.cc:1028
 PFormula.cc:1029
 PFormula.cc:1030
 PFormula.cc:1031
 PFormula.cc:1032
 PFormula.cc:1033
 PFormula.cc:1034
 PFormula.cc:1035
 PFormula.cc:1036
 PFormula.cc:1037
 PFormula.cc:1038
 PFormula.cc:1039
 PFormula.cc:1040
 PFormula.cc:1041
 PFormula.cc:1042
 PFormula.cc:1043
 PFormula.cc:1044
 PFormula.cc:1045
 PFormula.cc:1046
 PFormula.cc:1047
 PFormula.cc:1048
 PFormula.cc:1049
 PFormula.cc:1050
 PFormula.cc:1051
 PFormula.cc:1052
 PFormula.cc:1053
 PFormula.cc:1054
 PFormula.cc:1055
 PFormula.cc:1056
 PFormula.cc:1057
 PFormula.cc:1058
 PFormula.cc:1059
 PFormula.cc:1060
 PFormula.cc:1061
 PFormula.cc:1062
 PFormula.cc:1063
 PFormula.cc:1064
 PFormula.cc:1065
 PFormula.cc:1066
 PFormula.cc:1067
 PFormula.cc:1068
 PFormula.cc:1069
 PFormula.cc:1070
 PFormula.cc:1071
 PFormula.cc:1072
 PFormula.cc:1073
 PFormula.cc:1074
 PFormula.cc:1075
 PFormula.cc:1076
 PFormula.cc:1077
 PFormula.cc:1078
 PFormula.cc:1079
 PFormula.cc:1080
 PFormula.cc:1081
 PFormula.cc:1082
 PFormula.cc:1083
 PFormula.cc:1084
 PFormula.cc:1085
 PFormula.cc:1086
 PFormula.cc:1087
 PFormula.cc:1088
 PFormula.cc:1089
 PFormula.cc:1090
 PFormula.cc:1091
 PFormula.cc:1092
 PFormula.cc:1093
 PFormula.cc:1094
 PFormula.cc:1095
 PFormula.cc:1096
 PFormula.cc:1097
 PFormula.cc:1098
 PFormula.cc:1099
 PFormula.cc:1100
 PFormula.cc:1101
 PFormula.cc:1102
 PFormula.cc:1103
 PFormula.cc:1104
 PFormula.cc:1105
 PFormula.cc:1106
 PFormula.cc:1107
 PFormula.cc:1108
 PFormula.cc:1109
 PFormula.cc:1110
 PFormula.cc:1111
 PFormula.cc:1112
 PFormula.cc:1113
 PFormula.cc:1114
 PFormula.cc:1115
 PFormula.cc:1116
 PFormula.cc:1117
 PFormula.cc:1118
 PFormula.cc:1119
 PFormula.cc:1120
 PFormula.cc:1121
 PFormula.cc:1122
 PFormula.cc:1123
 PFormula.cc:1124
 PFormula.cc:1125
 PFormula.cc:1126
 PFormula.cc:1127
 PFormula.cc:1128
 PFormula.cc:1129
 PFormula.cc:1130
 PFormula.cc:1131
 PFormula.cc:1132
 PFormula.cc:1133
 PFormula.cc:1134
 PFormula.cc:1135
 PFormula.cc:1136
 PFormula.cc:1137
 PFormula.cc:1138
 PFormula.cc:1139
 PFormula.cc:1140
 PFormula.cc:1141
 PFormula.cc:1142
 PFormula.cc:1143
 PFormula.cc:1144
 PFormula.cc:1145
 PFormula.cc:1146
 PFormula.cc:1147
 PFormula.cc:1148
 PFormula.cc:1149
 PFormula.cc:1150
 PFormula.cc:1151
 PFormula.cc:1152
 PFormula.cc:1153
 PFormula.cc:1154
 PFormula.cc:1155
 PFormula.cc:1156
 PFormula.cc:1157
 PFormula.cc:1158
 PFormula.cc:1159
 PFormula.cc:1160
 PFormula.cc:1161
 PFormula.cc:1162
 PFormula.cc:1163
 PFormula.cc:1164
 PFormula.cc:1165
 PFormula.cc:1166
 PFormula.cc:1167
 PFormula.cc:1168
 PFormula.cc:1169
 PFormula.cc:1170
 PFormula.cc:1171
 PFormula.cc:1172
 PFormula.cc:1173
 PFormula.cc:1174
 PFormula.cc:1175
 PFormula.cc:1176
 PFormula.cc:1177
 PFormula.cc:1178
 PFormula.cc:1179
 PFormula.cc:1180
 PFormula.cc:1181
 PFormula.cc:1182
 PFormula.cc:1183
 PFormula.cc:1184
 PFormula.cc:1185
 PFormula.cc:1186
 PFormula.cc:1187
 PFormula.cc:1188
 PFormula.cc:1189
 PFormula.cc:1190
 PFormula.cc:1191
 PFormula.cc:1192
 PFormula.cc:1193
 PFormula.cc:1194
 PFormula.cc:1195
 PFormula.cc:1196
 PFormula.cc:1197
 PFormula.cc:1198
 PFormula.cc:1199
 PFormula.cc:1200
 PFormula.cc:1201
 PFormula.cc:1202
 PFormula.cc:1203
 PFormula.cc:1204
 PFormula.cc:1205
 PFormula.cc:1206
 PFormula.cc:1207
 PFormula.cc:1208
 PFormula.cc:1209
 PFormula.cc:1210
 PFormula.cc:1211
 PFormula.cc:1212
 PFormula.cc:1213
 PFormula.cc:1214
 PFormula.cc:1215
 PFormula.cc:1216
 PFormula.cc:1217
 PFormula.cc:1218
 PFormula.cc:1219
 PFormula.cc:1220
 PFormula.cc:1221
 PFormula.cc:1222
 PFormula.cc:1223
 PFormula.cc:1224
 PFormula.cc:1225
 PFormula.cc:1226
 PFormula.cc:1227
 PFormula.cc:1228
 PFormula.cc:1229
 PFormula.cc:1230
 PFormula.cc:1231
 PFormula.cc:1232
 PFormula.cc:1233
 PFormula.cc:1234
 PFormula.cc:1235
 PFormula.cc:1236
 PFormula.cc:1237
 PFormula.cc:1238
 PFormula.cc:1239
 PFormula.cc:1240
 PFormula.cc:1241
 PFormula.cc:1242
 PFormula.cc:1243
 PFormula.cc:1244
 PFormula.cc:1245
 PFormula.cc:1246
 PFormula.cc:1247
 PFormula.cc:1248
 PFormula.cc:1249
 PFormula.cc:1250
 PFormula.cc:1251
 PFormula.cc:1252
 PFormula.cc:1253
 PFormula.cc:1254
 PFormula.cc:1255
 PFormula.cc:1256
 PFormula.cc:1257
 PFormula.cc:1258
 PFormula.cc:1259
 PFormula.cc:1260
 PFormula.cc:1261
 PFormula.cc:1262
 PFormula.cc:1263
 PFormula.cc:1264
 PFormula.cc:1265
 PFormula.cc:1266
 PFormula.cc:1267
 PFormula.cc:1268
 PFormula.cc:1269
 PFormula.cc:1270
 PFormula.cc:1271
 PFormula.cc:1272
 PFormula.cc:1273
 PFormula.cc:1274
 PFormula.cc:1275
 PFormula.cc:1276
 PFormula.cc:1277
 PFormula.cc:1278
 PFormula.cc:1279
 PFormula.cc:1280
 PFormula.cc:1281
 PFormula.cc:1282
 PFormula.cc:1283
 PFormula.cc:1284
 PFormula.cc:1285
 PFormula.cc:1286
 PFormula.cc:1287
 PFormula.cc:1288
 PFormula.cc:1289
 PFormula.cc:1290
 PFormula.cc:1291
 PFormula.cc:1292
 PFormula.cc:1293
 PFormula.cc:1294
 PFormula.cc:1295
 PFormula.cc:1296
 PFormula.cc:1297
 PFormula.cc:1298
 PFormula.cc:1299
 PFormula.cc:1300
 PFormula.cc:1301
 PFormula.cc:1302
 PFormula.cc:1303
 PFormula.cc:1304
 PFormula.cc:1305
 PFormula.cc:1306
 PFormula.cc:1307
 PFormula.cc:1308
 PFormula.cc:1309
 PFormula.cc:1310
 PFormula.cc:1311
 PFormula.cc:1312
 PFormula.cc:1313
 PFormula.cc:1314
 PFormula.cc:1315
 PFormula.cc:1316
 PFormula.cc:1317
 PFormula.cc:1318
 PFormula.cc:1319
 PFormula.cc:1320
 PFormula.cc:1321
 PFormula.cc:1322
 PFormula.cc:1323
 PFormula.cc:1324
 PFormula.cc:1325
 PFormula.cc:1326
 PFormula.cc:1327
 PFormula.cc:1328
 PFormula.cc:1329
 PFormula.cc:1330
 PFormula.cc:1331
 PFormula.cc:1332
 PFormula.cc:1333
 PFormula.cc:1334
 PFormula.cc:1335
 PFormula.cc:1336
 PFormula.cc:1337
 PFormula.cc:1338
 PFormula.cc:1339
 PFormula.cc:1340
 PFormula.cc:1341
 PFormula.cc:1342
 PFormula.cc:1343
 PFormula.cc:1344
 PFormula.cc:1345
 PFormula.cc:1346
 PFormula.cc:1347
 PFormula.cc:1348
 PFormula.cc:1349
 PFormula.cc:1350
 PFormula.cc:1351
 PFormula.cc:1352
 PFormula.cc:1353
 PFormula.cc:1354
 PFormula.cc:1355
 PFormula.cc:1356
 PFormula.cc:1357
 PFormula.cc:1358
 PFormula.cc:1359
 PFormula.cc:1360
 PFormula.cc:1361
 PFormula.cc:1362
 PFormula.cc:1363
 PFormula.cc:1364
 PFormula.cc:1365
 PFormula.cc:1366
 PFormula.cc:1367
 PFormula.cc:1368
 PFormula.cc:1369
 PFormula.cc:1370
 PFormula.cc:1371
 PFormula.cc:1372
 PFormula.cc:1373
 PFormula.cc:1374
 PFormula.cc:1375
 PFormula.cc:1376
 PFormula.cc:1377
 PFormula.cc:1378
 PFormula.cc:1379
 PFormula.cc:1380
 PFormula.cc:1381
 PFormula.cc:1382
 PFormula.cc:1383
 PFormula.cc:1384
 PFormula.cc:1385
 PFormula.cc:1386
 PFormula.cc:1387
 PFormula.cc:1388
 PFormula.cc:1389
 PFormula.cc:1390
 PFormula.cc:1391
 PFormula.cc:1392
 PFormula.cc:1393
 PFormula.cc:1394
 PFormula.cc:1395
 PFormula.cc:1396
 PFormula.cc:1397
 PFormula.cc:1398
 PFormula.cc:1399
 PFormula.cc:1400
 PFormula.cc:1401
 PFormula.cc:1402
 PFormula.cc:1403
 PFormula.cc:1404
 PFormula.cc:1405
 PFormula.cc:1406
 PFormula.cc:1407
 PFormula.cc:1408
 PFormula.cc:1409
 PFormula.cc:1410
 PFormula.cc:1411
 PFormula.cc:1412
 PFormula.cc:1413
 PFormula.cc:1414
 PFormula.cc:1415
 PFormula.cc:1416
 PFormula.cc:1417
 PFormula.cc:1418
 PFormula.cc:1419
 PFormula.cc:1420
 PFormula.cc:1421
 PFormula.cc:1422
 PFormula.cc:1423
 PFormula.cc:1424
 PFormula.cc:1425
 PFormula.cc:1426
 PFormula.cc:1427
 PFormula.cc:1428
 PFormula.cc:1429
 PFormula.cc:1430
 PFormula.cc:1431
 PFormula.cc:1432
 PFormula.cc:1433
 PFormula.cc:1434
 PFormula.cc:1435
 PFormula.cc:1436
 PFormula.cc:1437
 PFormula.cc:1438
 PFormula.cc:1439
 PFormula.cc:1440
 PFormula.cc:1441
 PFormula.cc:1442
 PFormula.cc:1443
 PFormula.cc:1444
 PFormula.cc:1445
 PFormula.cc:1446
 PFormula.cc:1447
 PFormula.cc:1448
 PFormula.cc:1449
 PFormula.cc:1450
 PFormula.cc:1451
 PFormula.cc:1452
 PFormula.cc:1453
 PFormula.cc:1454
 PFormula.cc:1455
 PFormula.cc:1456
 PFormula.cc:1457
 PFormula.cc:1458
 PFormula.cc:1459
 PFormula.cc:1460
 PFormula.cc:1461
 PFormula.cc:1462
 PFormula.cc:1463
 PFormula.cc:1464
 PFormula.cc:1465
 PFormula.cc:1466
 PFormula.cc:1467
 PFormula.cc:1468
 PFormula.cc:1469
 PFormula.cc:1470
 PFormula.cc:1471
 PFormula.cc:1472
 PFormula.cc:1473
 PFormula.cc:1474
 PFormula.cc:1475
 PFormula.cc:1476
 PFormula.cc:1477
 PFormula.cc:1478
 PFormula.cc:1479
 PFormula.cc:1480
 PFormula.cc:1481
 PFormula.cc:1482
 PFormula.cc:1483
 PFormula.cc:1484
 PFormula.cc:1485
 PFormula.cc:1486
 PFormula.cc:1487
 PFormula.cc:1488
 PFormula.cc:1489
 PFormula.cc:1490
 PFormula.cc:1491
 PFormula.cc:1492
 PFormula.cc:1493
 PFormula.cc:1494
 PFormula.cc:1495
 PFormula.cc:1496
 PFormula.cc:1497
 PFormula.cc:1498
 PFormula.cc:1499
 PFormula.cc:1500
 PFormula.cc:1501
 PFormula.cc:1502
 PFormula.cc:1503
 PFormula.cc:1504
 PFormula.cc:1505
 PFormula.cc:1506
 PFormula.cc:1507
 PFormula.cc:1508
 PFormula.cc:1509
 PFormula.cc:1510
 PFormula.cc:1511
 PFormula.cc:1512
 PFormula.cc:1513