| using System;
                                    using System.Data;
                                    using System.Diagnostics;
                                    using System.Configuration;
                                    using System.Web;
                                    using System.Text;
                                    using System.Collections;
                                    using EXDb97;
                                    using EXCommon;
                                    
                                    //###2
                                    namespace EPol
                                    {
                                    
                                    
                                    public enum ENLanguage
                                    {
                                    eng =0,
                                    fr=1
                                    }
                                    
                                    
                                    
                                    
                                    public struct SEntityName
                                    {
                                    public CCommandFactoryBase.P dEntityParent;
                                    public CCommandFactoryBase.P dClass;
                                    public string[] sHelpArray;
                                    public CCommandFactoryBase.P dType;
                                    public CCommandFactoryBase.P[] m_oChildArray, m_oIdChildArray, m_oIdParentArray, m_oInstanceArray;
                                    public string[] sNameArray;
                                    public string[] sAbreviationArray;
                                    public CDbEPBase.SProperty[] m_oPropertyArray;
                                    
                                    public string csDump()
                                    {
                                    StringBuilder sOutput = new StringBuilder();
                                    sOutput.Append("| dClass = " +  dClass);
                                    sOutput.Append("| dParent= " + dEntityParent);
                                    sOutput.Append("| dType= " +  dType + '\n');
                                    sOutput.Append("| ID Parent= " + CDbEPBase.ToString( m_oIdParentArray) + '\n');
                                    sOutput.Append("| Values= " + CDbEPBase.ToString( m_oInstanceArray) + '\n');
                                    sOutput.Append("| Child= " + CDbEPBase.ToString( m_oChildArray) + '\n');
                                    sOutput.Append("| ID Child= " + CDbEPBase.ToString( m_oIdChildArray) + '\n');
                                    sOutput.Append("| Property List= " + CDbEPBase.ToString( m_oPropertyArray) + '\n');
                                    sOutput.Append("| Name= " + CDbEPBase.ToString( sNameArray) + '\n');
                                    sOutput.Append("| Abrevation= " + CDbEPBase.ToString( sAbreviationArray) + '\n');
                                    return sOutput.ToString();
                                    
                                    }
                                    
                                    }
                                    
                                    /// 
                                    /// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                    /// 
                                    
                                    public class CEntityNameCommandArray :  CDbEPBase 
                                    {
                                    public  CEntityNameCommandArray(P dHardCodeCount, P dFirstEntityIndex, int dEntityCount) {
                                    
                                    m_dFirstEntityIndex = (int)dFirstEntityIndex;
                                    m_oHardCodedEntityName = new SEntityName[(int)dHardCodeCount];
                                    m_oDbEntityName = new SEntityName[dEntityCount - m_dFirstEntityIndex];
                                    m_oEntityNameArrayList= new ArrayList();
                                    }
                                    SEntityName[] m_oHardCodedEntityName;
                                    SEntityName[] m_oDbEntityName;
                                    ArrayList m_oEntityNameArrayList;
                                    int m_dFirstEntityIndex;
                                    
                                    public int Length
                                    {
                                    get
                                    {
                                    return (int)m_dFirstEntityIndex + m_oDbEntityName.Length + m_oEntityNameArrayList.Count;
                                    }
                                    }
                                    
                                    public bool bIsInEntityIndexInTheRange(P i)
                                    {
                                    return i >= P.NONE && i < P.ENTITY_COUNT || (int)i >= m_dFirstEntityIndex && (int)i <  Length;
                                    }
                                    
                                    
                                    
                                    public  SEntityName this [int dIndex]
                                    {
                                    get
                                    {
                                    if (dIndex < m_oHardCodedEntityName.Length) {
                                    return m_oHardCodedEntityName[dIndex];
                                    }
                                    else if (dIndex >= m_dFirstEntityIndex && dIndex < m_dFirstEntityIndex + m_oDbEntityName.Length)
                                    {
                                    return m_oDbEntityName[dIndex - m_dFirstEntityIndex];
                                    }
                                    else if (dIndex >= (m_dFirstEntityIndex + m_oDbEntityName.Length) && (dIndex - m_dFirstEntityIndex - m_oDbEntityName.Length)
                                    < m_oEntityNameArrayList.Count)
                                    {
                                    return (SEntityName)m_oEntityNameArrayList[dIndex - m_dFirstEntityIndex - m_oDbEntityName.Length];
                                    }
                                    else {
                                    CTrace.i().vWrite(ENMessage.Error, " Can not read " + dIndex + " at " + (int)dIndex);
                                    return CEntityManager.m_oNullEntityName;
                                    }
                                    
                                    }
                                    set
                                    {
                                    if (dIndex < m_oHardCodedEntityName.Length)
                                    {
                                    m_oHardCodedEntityName[dIndex]=value;
                                    }
                                    else if (dIndex >= m_dFirstEntityIndex && dIndex < m_dFirstEntityIndex + m_oDbEntityName.Length)
                                    {
                                    m_oDbEntityName[dIndex - m_dFirstEntityIndex] = value;
                                    }
                                    else if (dIndex >= (m_dFirstEntityIndex + m_oDbEntityName.Length))
                                    {
                                    vIncreaseTo(dIndex);
                                    m_oEntityNameArrayList[dIndex - m_dFirstEntityIndex - m_oDbEntityName.Length] = value;
                                    }
                                    else
                                    {
                                    EPAssert(false, " Failed to insert " + dIndex);
                                    }
                                    
                                    
                                    }
                                    }
                                    void vIncreaseTo(int dName)
                                    {
                                    if ( dName >= Length)
                                    {
                                    int dNewItemCount = dName + 1 - Length;
                                    for (int i = 0; i < dNewItemCount; i++)
                                    {
                                    m_oEntityNameArrayList.Add(new SEntityName());
                                    }
                                    }
                                    }
                                    
                                    public SProperty[] GetPropertyArray(P dEntity)
                                    {
                                    if (bIsInEntityIndexInTheRange(dEntity))
                                    {
                                    return this[(int)dEntity].m_oPropertyArray;
                                    }
                                    return null;
                                    
                                    }
                                    
                                    public void vSetIdParent(P dName, P dEntityIdParent)
                                    {
                                    
                                    vIncreaseTo((int)dName);
                                    SEntityName oEntityName = this[(int)dName];
                                    vAdd(ref oEntityName.m_oIdParentArray, dEntityIdParent);
                                    this[(int)dName] = oEntityName;
                                    
                                    CTrace.i().vWriteLn(ENMessage.Attribute, "this[" + dName + "]= " + this[(int)dName].csDump() );
                                    
                                    SEntityName oEntityNameP = this[(int)dEntityIdParent];
                                    vAdd(ref oEntityNameP.m_oChildArray, dName);
                                    this[(int)dEntityIdParent] = oEntityNameP;
                                    CTrace.i().vWriteLn(ENMessage.Attribute, "this[" + dEntityIdParent + "]= " + this[(int)dEntityIdParent].csDump());
                                    
                                    
                                    }
                                    
                                    public void vSetParent(P dName, P dEntityParent)
                                    {
                                    vIncreaseTo((int)dName);
                                    SEntityName oEntityName = this[(int)dName];
                                    oEntityName.dEntityParent = dEntityParent;
                                    
                                    this[(int)dName] = oEntityName;
                                    SEntityName oEntityNameParent = this[(int)dEntityParent];
                                    vAdd(ref oEntityNameParent.m_oChildArray, dName);
                                    this[(int)dEntityParent] = oEntityNameParent;
                                    
                                    }
                                    public void vLoadProperty(P dName, SProperty[] oPropertyList)
                                    {
                                    vIncreaseTo((int)dName);
                                    SEntityName oEntityName = this[(int)dName];
                                    oEntityName.m_oPropertyArray = oPropertyList;
                                    this[(int)dName] = oEntityName;
                                    }
                                    
                                    public bool bIsADescentOf(P dEntityName, P dEntityIdParent)
                                    {
                                    CTrace.i().vWrite(ENMessage.Attribute, " bIsADescentOf dEntityIdParent=" + dEntityIdParent + "dEntityName= " + dEntityName);
                                    
                                    if (bIsInEntityIndexInTheRange(dEntityName) == false || bIsInEntityIndexInTheRange(dEntityIdParent) == false) return false;
                                    P[] oIdParentArray = this[(int)dEntityName].m_oIdParentArray;
                                    if (Contains(ref oIdParentArray, dEntityIdParent)) return true;
                                    CTrace.i().vWriteLn(ENMessage.Attribute, "| oIdParentArray=" + ToString(oIdParentArray));
                                    if (dEntityName == dEntityIdParent) return true;
                                    if (oIdParentArray != null)
                                    {
                                    for (int i = 0; i < oIdParentArray.Length; i++)
                                    {
                                    if (bIsADescentOf(oIdParentArray[i], dEntityIdParent) == true)
                                    {
                                    return true;
                                    }
                                    }
                                    }
                                    return this[(int)dEntityName].dClass == dEntityIdParent;
                                    }
                                    
                                    public P dFindEntity(P dLanguage, string csEntityName)
                                    {
                                    if (csEntityName != null )
                                    {
                                    csEntityName = csEntityName.ToLower();
                                    for (int i = 0; i < (int)P.ENTITY_COUNT; i++)
                                    {
                                    //CTrace.i().vWriteLn(ENMessage.Command,"(CCommandArrayFactory.P)i).ToString()= " + ((CCommandArrayFactory.P)i).ToString());
                                    if (bIsInEntityNameCommandArrayRange(dLanguage, i, csEntityName))
                                    {
                                    return (CCommandArrayFactory.P)i;
                                    }
                                    }
                                    for (int i = m_dFirstEntityIndex; i < Length; i++)
                                    {
                                    //CTrace.i().vWriteLn(ENMessage.Command,"(CCommandArrayFactory.P)i).ToString()= " + ((CCommandArrayFactory.P)i).ToString());
                                    if (bIsInEntityNameCommandArrayRange(dLanguage, i, csEntityName))
                                    {
                                    return (CCommandArrayFactory.P)i;
                                    }
                                    }
                                    
                                    }
                                    return P.NOT_USED;
                                    }
                                    
                                    public bool bIsInEntityNameCommandArrayRange(P dLanguage, int i, string csEntityName)
                                    {
                                    string[] sNameArray = this[i].sNameArray;
                                    string[] sAbreviationArray = this[i].sAbreviationArray;
                                    CTrace.i().vWriteLn(ENMessage.EntityLoading, "bIsInEntityNameCommandArrayRange csEntityName= " + csEntityName + "sAbreviationArray
                                    = " + ToString(sAbreviationArray));
                                    
                                    return ((CCommandArrayFactory.P)i).ToString().ToLower() == csEntityName ||
                                    ((sNameArray != null && sNameArray.Length > dGetLanguage(dLanguage) && csEntityName == sNameArray[dGetLanguage(dLanguage)])
                                    ||
                                    sAbreviationArray != null && sAbreviationArray.Length > dGetLanguage(dLanguage) &&
                                    csEntityName == sAbreviationArray[dGetLanguage(dLanguage)]);
                                    }
                                    
                                    public virtual void vSetClass(P dName, P dClass)
                                    {
                                    vIncreaseTo((int)dName);
                                    SEntityName oEntityName = this[(int)dName];
                                    oEntityName.dClass = dClass;
                                    this[(int)dName] = oEntityName;
                                    SEntityName oEntityNameClass = this[(int)dClass];
                                    vAdd(ref oEntityNameClass.m_oInstanceArray, dName);
                                    this[(int)dClass] = oEntityNameClass;
                                    
                                    }
                                    public P dGetClass(P dEntity)
                                    {
                                    return this[(int)dEntity].dClass;
                                    }
                                    public void vSetClass(P dName, P dClass, P dLanguage, string sAbreviation)
                                    {
                                    CTrace.i().vWriteLn(ENMessage.EntityLoading, "vSetClass(" + dName + "," + dClass + "," + sAbreviation);
                                    
                                    // EPAssert(m_oAbreviasionDictionary.ContainsKey(sAbreviation)== false, " The abreviation " + sAbreviation + " is already
                                    used");
                                    EPAssert(IsNotUsed(dFindEntity(dLanguage, sAbreviation)), " The abreviation" + sAbreviation + " is already used as an entity");
                                    
                                    vSetClass(dName, dClass);
                                    SEntityName oEntityName = this[(int)dName];
                                    vSet(ref oEntityName.sAbreviationArray, dGetLanguage(dLanguage), sAbreviation);
                                    this[(int)dName] = oEntityName;
                                    
                                    //  m_oAbreviasionDictionary.Add(sAbreviation, dName);
                                    }
                                    public void vSetType(P dName, P dType, P dTypeOfTheSet)
                                    {
                                    SEntityName oEntityName = this[(int)dName];
                                    oEntityName.dType = dType;
                                    this[(int)dName] = oEntityName;
                                    if (IsUsed(dTypeOfTheSet))
                                    {
                                    vSet(dName, CCommandFactoryBase.IS_TYPE_OF_HIS_SET, dTypeOfTheSet);
                                    }
                                    }
                                    public virtual void vSet(P dName, char cRelation, bool bIsTrue)
                                    {
                                    SEntityName oEntityName = this[(int)dName];
                                    vSet(ref oEntityName.m_oPropertyArray, cRelation, bIsTrue ? P.ALL: P.NONE);
                                    this[(int)dName] = oEntityName;
                                    }
                                    
                                    public string sGetName(P dEntityIndex, P dLanguage)  
                                    {
                                    string sName=null;
                                    if ((int)dEntityIndex < 0)
                                    {
                                    sName = P.NOT_USED.ToString();
                                    }
                                    else
                                    {
                                    if ( bIsInEntityIndexInTheRange(dEntityIndex))
                                    {
                                    
                                    if (this[(int)dEntityIndex].sNameArray != null)
                                    {
                                    sName = this[(int)dEntityIndex].sNameArray[dGetLanguage(dLanguage)];
                                    }
                                    }
                                    
                                    if (sName == "" || sName == null)
                                    {
                                    sName = ((P)dEntityIndex).ToString().ToLower();
                                    }
                                    }
                                    return sName;
                                    }
                                    
                                    public void vSetName(P dName, string sName, P dLanguage)
                                    {
                                    SEntityName oEntityName = this[(int)dName];
                                    CDbEPBase.vSet(ref oEntityName.sNameArray, dGetLanguage(dLanguage), sName);
                                    this[(int)dName] = oEntityName;
                                    }
                                    public void vSetHelp(P dName, string sHelp, P dLanguage)
                                    {
                                    SEntityName oEntityName = this[(int)dName];
                                    CDbEPBase.vSet(ref oEntityName.sHelpArray, dGetLanguage(dLanguage), sHelp);
                                    this[(int)dName] = oEntityName;
                                    }
                                    public void vSetAbbreviation(P dName, P dLanguage, string sAbbrevation)
                                    {
                                    SEntityName oEntityName = this[(int)dName];
                                    CDbEPBase.vSet(ref oEntityName.sAbreviationArray, dGetLanguage(dLanguage), sAbbrevation);
                                    this[(int)dName] = oEntityName;
                                    }
                                    public void vSet(P dName, char cRelation, P dEntityProperty)
                                    {
                                    SEntityName oEntityName = this[(int)dName];
                                    vSet( ref oEntityName.m_oPropertyArray, cRelation, dEntityProperty);
                                    this[(int)dName] = oEntityName;
                                    }
                                    
                                    /* public void vSet(P dName, char cRelation, P dEntityProperty)
                                    {
                                    SEntityName oEntityName = this[(int)dName];
                                    vSet( oEntityName.m_oPropertiesList, cRelation, dEntityProperty1);
                                    this[(int)dName] = oEntityName;
                                    }*/
                                    /*  public P dGet(SProperty oPropertieArray, P dName, char cRelation)
                                    {
                                    
                                    //   string sProperties= m_oEntityNameCommandArray[(int)dName].sPropertiesList;
                                    P dEntityProperty = P.NOT_USED;
                                    if (sProperties != null && sProperties != "")
                                    {
                                    CTrace.i().vWriteLn(ENMessage.Entity, dName.ToString() + " " + cRelation + " " + sProperties);
                                    int dIndex = sProperties.IndexOf("#" + cRelation);
                                    if (dIndex <= -1)
                                    {
                                    return P.NOT_USED;
                                    }
                                    else
                                    {
                                    int dEndIndex = sProperties.IndexOf("#", dIndex + 1);
                                    
                                    if (dEndIndex <= -1) dEndIndex = sProperties.Length;
                                    string sProperty;
                                    sProperty = sProperties.Substring(dIndex + 2, dEndIndex - dIndex - 2);
                                    // CTrace.i().vWriteLn(ENMessage.Command,"sProperty = " + sProperty);
                                    if (sProperty == "")
                                    {
                                    dEntityProperty = P.NONE;
                                    }
                                    else
                                    {
                                    dEntityProperty = (P)Convert.ToInt32(sProperty);
                                    }
                                    }
                                    }
                                    return dEntityProperty;
                                    
                                    }
                                    */
                                    
                                    }
                                    /// ///////////////////////////////////////////////////////////////////////////////
                                    /// 
                                    
                                    
                                    /// 
                                    /// ///////////////////////////////////////////////////////////////////////////////
                                    /// 
                                    public struct SEntity  
                                    {
                                    public SEntity(CDbEPBase.P _dClass, object _oInstance)
                                    {
                                    dClass = _dClass;
                                    oInstance = _oInstance;
                                    bExact = true;
                                    }
                                    /*        public SEntity()
                                    {
                                    dClass = CDbEPBase.P.NOT_USED;
                                    oInstance = CDbEPBase.P.NOT_USED;
                                    bExact = true;
                                    }*/
                                    public CDbEPBase.P dClass;
                                    object oInstance;
                                    public bool bExact;
                                    
                                    
                                    public bool IsUsed
                                    {
                                    get
                                    {
                                    return IsNotUsed == false;
                                    }
                                    }
                                    public string sql
                                    {
                                    get
                                    {
                                    if (bIsType(CDbEPBase.P.STRING_TYPE) )
                                    {
                                    return oInstance.ToString();
                                    }
                                    else if (bIsType(CDbEPBase.P.INTEGER_TYPE) || bIsType(CDbEPBase.P.P_TYPE))
                                    {
                                    return ((int)oInstance).ToString();
                                    }
                                    else
                                    {
                                    return ((int)CDbEPBase.P.TYPE_ERROR).ToString();
                                    }
                                    }
                                    
                                    }
                                    
                                    CDbEPBase.P Type
                                    {
                                    get
                                    {
                                    return CEntityManager.Instance(CDbEPBase.P.ENGLISH).dGetType(dClass);
                                    }
                                    }
                                    
                                    public bool bIsType(CDbEPBase.P dType)
                                    {
                                    return CEntityManager.Instance(CDbEPBase.P.ENGLISH).bIsA(Type, dType);
                                    }
                                    
                                    public bool IsNotUsed
                                    {
                                    get
                                    {
                                    if (oInstance == null)
                                    {
                                    return true;
                                    }
                                    else if (bIsType( CDbEPBase.P.STRING_TYPE) )
                                    {
                                    return oInstance.ToString() == CDbEPBase.NOT_USED_STR;
                                    }
                                    else if (bIsType(CDbEPBase.P.INTEGER_TYPE))
                                    {
                                    return (int)oInstance == CDbEPBase.NOT_USED;
                                    }
                                    else if (bIsType(CDbEPBase.P.ENTITY_ARRAY_TYPE))
                                    {
                                    return (int)oInstance == CDbEPBase.NOT_USED;
                                    }
                                    else if (bIsType(CDbEPBase.P.SINDEX_TYPE))
                                    {
                                    return CDbEPBase.IsNotUsed((CDbEPBase.SIndex)oInstance);
                                    }
                                    else  
                                    {
                                    return (CDbEPBase.P)oInstance == CDbEPBase.P.NOT_USED;
                                    }
                                    
                                    }
                                    }
                                    public bool bEqualTo(CDbEPBase.P dProperty)
                                    {
                                    if (bIsType(CDbEPBase.P.P_TYPE))
                                    {
                                    return (CDbEPBase.P)oInstance == dProperty;
                                    }
                                    return false;
                                    
                                    }
                                    public object Instance
                                    {
                                    get
                                    {
                                    return oInstance;
                                    }
                                    set
                                    {
                                    oInstance = value;
                                    }
                                    }
                                    
                                    
                                    public CEntityArray EntityArrayInstance
                                    {
                                    get
                                    {
                                    if (bIsType(CDbEPBase.P.ENTITY_ARRAY_TYPE))
                                    {
                                    return (CEntityArray)oInstance;
                                    }
                                    else
                                    {
                                    return null;
                                    }
                                    }
                                    
                                    }
                                    
                                    public int dInstance
                                    {
                                    get
                                    {
                                    if (bIsType(CDbEPBase.P.INTEGER_TYPE))
                                    {
                                    return (int)oInstance;
                                    }
                                    else
                                    {
                                    return CDbEPBase.NOT_USED;
                                    }
                                    }
                                    
                                    }
                                    
                                    public void vSetInstanceFromTypeAndIntegerString(string sInstanceKeyword)
                                    {
                                    try
                                    {
                                    if (sInstanceKeyword.Length < 2)
                                    {
                                    oInstance = (CDbEPBase.P)Convert.ToInt32(sInstanceKeyword);
                                    }
                                    else
                                    {
                                    string sType = sInstanceKeyword.Substring(0, 2);
                                    string sContent = sInstanceKeyword.Substring(2, sInstanceKeyword.Length - 2);
                                    if (sType == "i:")
                                    {
                                    
                                    oInstance = Convert.ToInt32(sInstanceKeyword.Substring(2));
                                    }
                                    else if (sType == "s:")
                                    {
                                    oInstance = sInstanceKeyword.Substring(2);
                                    }
                                    else
                                    {
                                    oInstance = (CDbEPBase.P)Convert.ToInt32(sInstanceKeyword);
                                    }
                                    
                                    }
                                    }
                                    catch
                                    {
                                    oInstance = CDbEPBase.P.CONVERTION_FAILED;
                                    }
                                    
                                    }
                                    public string sInstance
                                    {
                                    get
                                    {
                                    if (bIsType(CDbEPBase.P.STRING_TYPE))
                                    {
                                    return oInstance.ToString();
                                    }
                                    else
                                    {
                                    return CDbEPBase.NOT_USED_STR;
                                    }
                                    }
                                    
                                    }
                                    public override string ToString()
                                    {
                                    string sComparator = bExact ? "=" : "*=";
                                    
                                    string sClass = dClass.ToString().ToLower();
                                    if (bIsType(CDbEPBase.P.STRING_TYPE))
                                    {
                                    return sClass + sComparator + "s:" + oInstance.ToString();
                                    }
                                    else if (bIsType(CDbEPBase.P.INTEGER_TYPE))
                                    {
                                    return sClass + sComparator + "i:" + ((int)oInstance).ToString();
                                    }
                                    else if (bIsType(CDbEPBase.P.SINDEX_TYPE))
                                    {
                                    return sClass + sComparator + "si:" + ((CDbEPBase.SIndex)oInstance).ToString();
                                    }
                                    else if (bIsType(CDbEPBase.P.ENTITY_ARRAY_TYPE))
                                    {
                                    return sClass + sComparator + "ea:" + ((CEntityArray)oInstance).ToString();
                                    }
                                    else 
                                    {
                                    return sClass + sComparator + "UnknownType" + Type + " for " + oInstance.ToString();
                                    }
                                    
                                    }
                                    public void vSet(CDbEPBase.P dClass, string sInstanceKeyword, CDbEPBase.P dLanguage)
                                    {
                                    if (sInstanceKeyword.Length < 2)
                                    {
                                    Instance = CEntityManager.Instance(dLanguage).dFindEntity( sInstanceKeyword);
                                    }
                                    else
                                    {
                                    vSetInstanceFromTypeAndIntegerString(sInstanceKeyword);
                                    /*    string sType = sInstanceKeyword.Substring(0, 2);
                                    string sContent = sInstanceKeyword.Substring(2, sInstanceKeyword.Length - 2);
                                    
                                    if (sType == "i:")
                                    {
                                    try
                                    {
                                    oEntity.iInstance = Convert.ToInt32(sInstanceKeyword);
                                    }
                                    catch
                                    {
                                    oEntity.Instance = P.CONVERTION_FAILED;
                                    }
                                    }
                                    else if (sType == "s:")
                                    {
                                    oEntity.sInstance = sContent;
                                    }
                                    else
                                    {
                                    oEntity.Instance = dGet(m_dLanguage, sInstanceKeyword);
                                    }*/
                                    }
                                    
                                    }
                                    public void vSet(string sClassKeyword, string sInstanceKeyword, CDbEPBase.P dLanguage)
                                    {
                                    dClass = CEntityManager.Instance(dLanguage).dFindEntity( sClassKeyword);
                                    
                                    vSet(dClass, sInstanceKeyword, dLanguage);
                                    }
                                    
                                    
                                    };
                                    /// 
                                    /// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                    /// 
                                    
                                    public class CEntityManager : CCommandFactoryBase
                                    {
                                    protected CEntityManager(P  dLanguage)
                                    {
                                    m_dLanguage = dLanguage;
                                    m_oEntityNameCommandArray = null;
                                    // vLoad();
                                    }
                                    static public CEntityManager Instance(P dLanguage)
                                    {
                                    if (s_oEntityNameArrayFactory == null)
                                    {
                                    s_oEntityNameArrayFactory = new CEntityManager(dLanguage);
                                    }
                                    s_oEntityNameArrayFactory.m_dLanguage = dLanguage;
                                    return s_oEntityNameArrayFactory;
                                    }
                                    
                                    //Hashtable m_oEntityNameCommandArrayDictionary;
                                    P[] m_oOptionEntity, m_oCommandEntity;
                                    public CEntityNameCommandArray m_oEntityNameCommandArray;
                                    //    Hashtable m_oAbreviasionDictionary;
                                    
                                    public P[] OptionEntityArray
                                    {
                                    get
                                    {
                                    return m_oOptionEntity;
                                    }
                                    }
                                    
                                    
                                    public P[] CommandArray
                                    {
                                    get
                                    {
                                    return m_oCommandEntity;
                                    }
                                    } 
                                    public P  m_dLanguage;
                                    
                                    public P dFindCommand(string sCommandName)
                                    {
                                    for (int i = 0; i < m_oCommandEntity.Length; i++)
                                    {
                                    if (sGetEntityName(m_oCommandEntity[i]) == sCommandName || sGetEntityAbreviation(m_oCommandEntity[i]) == sCommandName)
                                    {
                                    return m_oCommandEntity[i];
                                    }
                                    }
                                    return P.NOT_USED;
                                    }
                                    
                                    public string sGetEntityName(P dEntityName)
                                    {
                                    SEntityName oEntityName = FindEntityName(dEntityName);
                                    CTrace.i().vWriteLn(ENMessage.EntityLoading, "FindEntityName(" + dEntityName + ")= " + oEntityName.csDump());
                                    if (oEntityName.sNameArray != null &&  dGetLanguage( m_dLanguage) < oEntityName.sNameArray.Length)
                                    {
                                    return oEntityName.sNameArray[dGetLanguage(m_dLanguage)];
                                    }
                                    else if (CEntityManager.Instance(P.ENGLISH).bIsInEntityIndexInTheRange(dEntityName))
                                    {
                                    
                                    return dEntityName.ToString().ToLower();
                                    }
                                    else
                                    {
                                    return "entity:" + ((int)dEntityName).ToString();
                                    }
                                    }
                                    public string sGetEntityAbreviation(P dEntity)
                                    {
                                    SEntityName oEntityName = FindEntityName(dEntity);
                                    if (oEntityName.sAbreviationArray != null && dGetLanguage(m_dLanguage) < oEntityName.sAbreviationArray.Length)
                                    {
                                    return oEntityName.sAbreviationArray[dGetLanguage(m_dLanguage)];
                                    }
                                    return null;
                                    
                                    }     
                                    static CEntityManager s_oEntityNameArrayFactory = null;
                                    static public SEntityName m_oNullEntityName;
                                    
                                    protected P m_dIDChild, m_dIDParent;
                                    
                                    public bool bIsParentIDHierarchy(P[] dEntityArray)
                                    {
                                    if (dEntityArray == null)
                                    {
                                    return true;
                                    }
                                    m_dIDChild = m_dIDParent = P.NOT_USED;
                                    for (int i = dEntityArray.Length - 1; i >= 1; i--)
                                    {
                                    if (  bIsADescentOf(dEntityArray[i], dEntityArray[i-1])== false) {
                                    m_dIDChild = dEntityArray[i]; m_dIDParent = dEntityArray[i - 1];
                                    return false;
                                    }
                                    }
                                    return true;
                                    }
                                    
                                    
                                    public SEntityName FindEntityName(P dEntityName)
                                    {
                                    if (bIsInEntityIndexInTheRange(dEntityName) == false) return m_oNullEntityName;
                                    return m_oEntityNameCommandArray[(int)dEntityName];
                                    }
                                    public bool bIsInEntityIndexInTheRange(P i) {
                                    return i>=  P.NONE && i <  P.ENTITY_COUNT || i>=  P.FIRST_KEYWORD_INDEX && (int)i <  m_oEntityNameCommandArray.Length;
                                    }
                                    
                                    public SEntityName FindEntityName(string csEntityName)
                                    {
                                    return FindEntityName(dFindEntity(csEntityName));
                                    }
                                    
                                    public P dFindEntity(string csEntityName)
                                    {
                                    return m_oEntityNameCommandArray.dFindEntity(m_dLanguage, csEntityName);
                                    
                                    }
                                    
                                    void vSetOption(P dName)
                                    {
                                    m_oEntityNameCommandArray.vSetType(dName, P.P_TYPE, P.NOT_USED);
                                    m_oEntityNameCommandArray.vSet(dName, IS_OPTION_RELATION, P.P_TYPE);
                                    
                                    }
                                    void vSetCommand(P dCommand, string sAbbreviation, P dCommandSynopsis)
                                    {
                                    vSetClass(dCommand, P.COMMAND_CLASS, sAbbreviation);
                                    vSet(dCommand, IS_SYNOPSIS, dCommandSynopsis);
                                    }
                                    
                                    void vSetOption(P dName, P dType)
                                    {
                                    m_oEntityNameCommandArray.vSetType(dName, dType, P.NOT_USED);
                                    m_oEntityNameCommandArray.vSet(dName, IS_OPTION_RELATION, dType);
                                    
                                    }
                                    void vSetOption(P dName, P dType, P dSetType)
                                    {
                                    m_oEntityNameCommandArray.vSetType(dName, dType, dSetType);
                                    m_oEntityNameCommandArray.vSet(dName, IS_OPTION_RELATION, dType);
                                    
                                    }
                                    
                                    
                                    public void vSetIdParent(P dName, P dEntityIdParent)
                                    {
                                    if (IsUsed(dEntityIdParent))
                                    {
                                    m_oEntityNameCommandArray.vSetIdParent(dName, dEntityIdParent);
                                    }
                                    
                                    }
                                    
                                    public void vSetParent(P dName, P dEntityParent)
                                    {
                                    if (IsUsed(dEntityParent))
                                    {
                                    m_oEntityNameCommandArray.vSetParent(dName, dEntityParent);
                                    }
                                    
                                    }
                                    
                                    public void vLoadProperty(P dName, SProperty[] oPropertyList)
                                    {
                                    m_oEntityNameCommandArray.vLoadProperty(dName, oPropertyList);
                                    }
                                    
                                    public string sGetChildList( P dEntityParent)
                                    {
                                    if ( IsNotUsed(dEntityParent)) return null;
                                    
                                    StringBuilder oChildString = new StringBuilder();
                                    oChildString.Append((int)dEntityParent);
                                    
                                    if (m_oEntityNameCommandArray[(int)dEntityParent].m_oChildArray != null)
                                    {
                                    for (int i = 0; i < m_oEntityNameCommandArray[(int)dEntityParent].m_oChildArray.Length; i++)
                                    {
                                    oChildString.Append(','); oChildString.Append(sGetChildList(m_oEntityNameCommandArray[(int)dEntityParent].m_oChildArray[i]));
                                    
                                    
                                    }
                                    }
                                    return oChildString.ToString();
                                    }
                                    
                                    public P dGetBaseFeatureType(P dFeatureEntity)
                                    {
                                    P dBaseFeatureType = dFeatureEntity;
                                    if (bIsA(dFeatureEntity, P.TIMESPAN_FEATURE))
                                    {
                                    dBaseFeatureType = P.TIMESPAN_FEATURE;
                                    }
                                    return dBaseFeatureType;
                                    }
                                    
                                    
                                    
                                    public bool bIsA(P dEntityName, P dEntityParent)
                                    {
                                    if (dEntityName == P.NONE || dEntityParent == P.NONE || bIsInEntityIndexInTheRange(dEntityName) == false || bIsInEntityIndexInTheRange(dEntityParent)
                                    == false) return false;
                                    if (dEntityName == dEntityParent || m_oEntityNameCommandArray[(int)dEntityName].dEntityParent == dEntityParent
                                    || m_oEntityNameCommandArray[(int)dEntityName].dClass == dEntityParent) return true;
                                    
                                    return  bIsA(m_oEntityNameCommandArray[(int)dEntityName].dEntityParent, dEntityParent);
                                    }
                                    
                                    public bool bIsADescentOf(P dEntityName, P dEntityIdParent)
                                    {
                                    
                                    return m_oEntityNameCommandArray.bIsADescentOf(dEntityName, dEntityIdParent);
                                    }
                                    
                                    
                                    
                                    public virtual void vSetClass(P dName, P dClass)
                                    {
                                    
                                    m_oEntityNameCommandArray.vSetClass(dName, dClass);
                                    
                                    }
                                    public void vSetClass(P dName,  P dClass, string sAbreviation)
                                    {
                                    m_oEntityNameCommandArray.vSetClass(dName, dClass, m_dLanguage, sAbreviation);
                                    }
                                    public P dGetType(P dEntity)
                                    {
                                    P dClass = dGetClass(dEntity);
                                    if (dClass != P.CLASS && dClass != P.ENTITY_ROOT && dClass != P.NONE && dClass != P.NOT_USED)
                                    {
                                    dEntity = dClass;
                                    }
                                    P dType = P.P_TYPE;
                                    if (bIsInEntityIndexInTheRange(dEntity))
                                    {
                                    P dParentEntity = dEntity;
                                    
                                    do
                                    {
                                    dType = m_oEntityNameCommandArray[(int)dParentEntity].dType;
                                    dParentEntity = m_oEntityNameCommandArray[(int)dParentEntity].dEntityParent;
                                    }
                                    while (dType <= P.NONE && bIsInEntityIndexInTheRange(dParentEntity) && dParentEntity > P.NONE);
                                    }
                                    return dType;
                                    }
                                    
                                    public P dGetClass(P dEntity)
                                    {
                                    P dClass = P.NOT_USED;
                                    if (bIsInEntityIndexInTheRange(dEntity))
                                    {
                                    P dParentEntity = dEntity;
                                    
                                    do
                                    {
                                    CTrace.i().vWrite(ENMessage.EntityLoading, " dGetClass("+ dParentEntity + ")=" + m_oEntityNameCommandArray[(int)dParentEntity].csDump());
                                    dClass = m_oEntityNameCommandArray[(int)dParentEntity].dClass;
                                    dParentEntity = m_oEntityNameCommandArray[(int)dParentEntity].dEntityParent;
                                    }
                                    while (dClass <= P.NONE && bIsInEntityIndexInTheRange(dParentEntity) && dParentEntity > P.NONE);
                                    }
                                    return dClass;
                                    }
                                    
                                    public SProperty[] GetPropertyArray(P dEntity)
                                    {
                                    return m_oEntityNameCommandArray.GetPropertyArray(dEntity);
                                    }
                                    public P dGetSetType(P dEntity)
                                    {
                                    
                                    return dGet(dEntity, IS_TYPE_OF_HIS_SET) ;
                                    }
                                    
                                    public P dGetOptionParameter(P dEntity)
                                    {
                                    return dGet(dEntity, IS_OPTION_RELATION);
                                    }
                                    public P dGet(P dEntity, char cRelation)
                                    {
                                    return CDbEPBase.dGet(m_oEntityNameCommandArray[(int)dEntity].m_oPropertyArray, cRelation);
                                    }
                                    public int dGetArray(P dEntity, char cRelation, out P[] oProperty)
                                    {
                                    return CDbEPBase.dGetArray(m_oEntityNameCommandArray[(int)dEntity].m_oPropertyArray, cRelation, out oProperty);
                                    }
                                    public void vHas(P dName, P dEntityProperty)
                                    {
                                    m_oEntityNameCommandArray.vSet(dName, HAS_RELATION, dEntityProperty);
                                    }
                                    
                                    public void vHas(P dName, P dEntityProperty1, P dEntityProperty2)
                                    {
                                    vSet(dName, HAS_RELATION, dEntityProperty2, dEntityProperty1);
                                    }
                                    
                                    public bool bHas(P dName, char cRelation)
                                    {
                                    return IsUsed(dGet(dName, cRelation));
                                    }
                                    
                                    
                                    void vSetName( P dName, string sName)
                                    {
                                    
                                    m_oEntityNameCommandArray.vSetName(dName, sName, m_dLanguage);
                                    }
                                    
                                    void vSetAbbreviation(P dName, string sText)
                                    {
                                    
                                    m_oEntityNameCommandArray.vSetAbbreviation(dName, m_dLanguage, sText);
                                    }
                                    
                                    public void vSetName(P dName, string sName, P dLanguage)
                                    {
                                    
                                    m_oEntityNameCommandArray.vSetName(dName, sName,  dLanguage);
                                    }
                                    
                                    
                                    void vSetHelp(P dName, string sHelp)
                                    {
                                    m_oEntityNameCommandArray.vSetHelp(dName, sHelp, m_dLanguage);
                                    }
                                    
                                    public void vSet(P dName, char cRelation)
                                    {
                                    m_oEntityNameCommandArray.vSet(dName, cRelation, true);
                                    }
                                    
                                    public virtual  void vSet(P dName, char cRelation, P dEntityProperty1 )
                                    {
                                    
                                    m_oEntityNameCommandArray.vSet(dName, cRelation, dEntityProperty1);
                                    }
                                    
                                    public virtual void vSet(P dName, char cRelation, P dEntityProperty1, P dEntityProperty2)
                                    {
                                    m_oEntityNameCommandArray.vSet(dName,  cRelation, dEntityProperty1);
                                    m_oEntityNameCommandArray.vSet(dName, cRelation, dEntityProperty2);
                                    }
                                    
                                    
                                    
                                    
                                    public void vSetType(P dName, P dType, P dTypeOfTheSet)
                                    {
                                    m_oEntityNameCommandArray.vSetType(dName, dType, dTypeOfTheSet);
                                    }
                                    
                                    public virtual void vLoad(int dEntityTotal)
                                    {
                                    m_oEntityNameCommandArray = new CEntityNameCommandArray(P.ENTITY_COUNT, P.FIRST_KEYWORD_INDEX, dEntityTotal);
                                    
                                    m_oEntityNameCommandArray.vSetType(P.AGENT, P.AVATAR_SINDEX_TYPE, P.NOT_USED);
                                    vSetParent(P.AVATAR, P.AGENT);
                                    m_oEntityNameCommandArray.vSetType(P.AVATAR, P.AVATAR_SINDEX_TYPE, P.AVATAR_SINDEX_TYPE);
                                    
                                    vSetParent(P.PROFILE, P.AVATAR);
                                    vSet(P.AVATAR, HAS_NAME_RELATION, P.AVATAR_NAME);
                                    
                                    vSetType(P.PROFILE, P.PROFILE_INDEX_TYPE, P.PROFILE_INDEX_TYPE);
                                    vSet(P.PROFILE, HAS_NAME_RELATION, P.AVATAR_NAME);
                                    				vSetType(P.MEME, P.SINDEX_TYPE, P.SINDEX_TYPE );
                                    
                                    vSetType(P.MEMBER_PROFILE, P.PROFILE_INDEX_TYPE, P.PROFILE_INDEX_TYPE);
                                    
                                    vSet(P.AUTHOR, HAS_NAME_RELATION, P.AVATAR_NAME); 
                                    vSetParent(P.PROSPECT, P.AVATAR);
                                    vSetClass(P.AUTHOR, P.AGENT);
                                    vSetParent(P.SENDER, P.AVATAR);
                                    vSetParent(P.MEMBER, P.AVATAR);
                                    vSetParent(P.FRIEND, P.AVATAR);
                                    
                                    /// NAME
                                    
                                    vSetType(P.NAME, P.NAME_STRING_TYPE, P.NAME_STRING_TYPE);
                                    vSetParent(P.AVATAR_NAME, P.NAME);
                                    vSetParent(P.ORGANISATION_NAME, P.NAME);
                                    
                                    //////////// ORGANISATION
                                    vSetType(P.ORGANISATION, P.ORGANISATION_INDEX_TYPE, P.ORGANISATION_INDEX_TYPE);
                                    vSet(P.ORGANISATION, HAS_NAME_RELATION, P.ORGANISATION_NAME);
                                    
                                    vSetParent(P.COMMITTEE, P.ORGANISATION);
                                    vSetType(P.COMMITTEE, P.COMMITTEE_SINDEX_TYPE, P.COMMITTEE_SINDEX_TYPE);
                                    vSet(P.COMMITTEE, HAS_NAME_RELATION, P.ORGANISATION_NAME);
                                    
                                    vSetClass(P.MANAGEMENT_TEAM, P.ORGANISATION);
                                    vSetParent(P.GOVERMENT_STATE, P.MANAGEMENT_TEAM);
                                    vSetParent(P.NOMENCLATURA, P.ORGANISATION);
                                    
                                    
                                    //////////// OBJECTIVE
                                    
                                    vSet(P.COMMITMENT, HAS_RELATION, P.OBJECTIVE, P.ACTION);
                                    
                                    //////////// ISSUE
                                    
                                    vSetClass(P.ISSUE, P.FACT);
                                    
                                    //////////// POLITICAL CAMPAIGN
                                    
                                    
                                    //////////// RULE
                                    
                                    /*     vSetClass(P.PHYSICAL_RULE, P.RULE);
                                    vHas(P.PHYSICAL_RULE, P.CONSEQUENCE);
                                    vSetClass(P.ORGANIC_RULE, P.RULE);
                                    vSetClass(P.CULTURAL_BELIEF_RULE, P.RULE);
                                    vSetParent(P.CASE, P.RULE);
                                    * */
                                    vSetParent(P.CULTURAL_BELIEF, P.CONSEQUENCE);
                                    vSetParent(P.PROPERTY_DISTRIBUTION, P.CONSEQUENCE);
                                    
                                    
                                    //////////// ACTION
                                    
                                    vSet(P.ACTION, HAS_MANDATORY_PARAMETER_RELATION, P.LOCATION, P.TIME);
                                    vSetClass(P.CREATE_RULE, P.ACTION);
                                    vSetClass(P.STRIKE, P.ACTION);
                                    vSetClass(P.SELF_TAX_REDUCTION, P.ACTION);
                                    //////////// RESPONSABILITY
                                    
                                    vHas(P.INDIVIDUAL_POSITION, P.ASSIGMENT, P.RIGHT_TO_REACT);
                                    
                                    //////////// RESSOURCE
                                    
                                    vSetParent(P.ASSET_LIQUID_SELLABLE, P.RESSOURCE);
                                    vSetParent(P.PERSONAL_AVAILABLE_TIME, P.RESSOURCE);
                                    vSetParent(P.TAXATION, P.RESSOURCE);
                                    vSetParent(P.DIRECT_TAXATION, P.TAXATION);
                                    vSetParent(P.INDIRECT_TAXATION, P.TAXATION);
                                    vSetParent(P.CIVIL_SERVANT_TIME, P.RESSOURCE);
                                    
                                    //////////// TIME
                                    
                                    vSetParent(P.CURRENT_YEAR, P.TIME);
                                    vSetParent(P.FUTURE_YEAR, P.TIME);
                                    vSetParent(P.PAST_YEAR, P.TIME);
                                    
                                    //////////// LOCATION
                                    
                                    vSetParent(P.CYBERSPACE, P.LOCATION);
                                    vSetParent(P.WORLD, P.LOCATION);
                                    vSetParent(P.COUNTRY, P.WORLD);
                                    vSetParent(P.REGION, P.COUNTRY);
                                    vSetParent(P.CITY, P.REGION);
                                    vSetParent(P.DISTRICT, P.CITY);
                                    
                                    //////////// PUBLICATION
                                    
                                    vSet(P.DOCUMENT, HAS_MANDATORY_PARAMETER_RELATION, P.AUTHOR);
                                    vSet(P.DOCUMENT, HAS_MANDATORY_PARAMETER_RELATION, P.LANGUAGE);
                                    vSetParent(P.PUBLICATION, P.DOCUMENT);
                                    vSetParent(P.URL, P.DOCUMENT);
                                    vSetParent(P.GUIDANCE, P.DOCUMENT);
                                    vSetParent(P.BILL, P.GUIDANCE);
                                    vSetParent(P.SECTION, P.CHAPTER);
                                    vSetParent(P.SUB_SECTION, P.CHAPTER);
                                    vSetParent(P.RESOLUTION, P.GUIDANCE);
                                    vSetParent(P.EXPERITMENT_RESOLUTION, P.RESOLUTION);
                                    vSetParent(P.ACT_RESOLUTION, P.RESOLUTION);
                                    vSetParent(P.INFORMATIVE_RESOLUTION, P.RESOLUTION);
                                    vSetParent(P.POLL, P.INFORMATIVE_RESOLUTION);
                                    
                                    //////////// Document
                                    
                                    vSetIdParent(P.PARAGRAPH, P.DOCUMENT);
                                    vSetType(P.BIBLE_LINE, P.SINDEX_TYPE, P.SINDEX_TYPE);
                                    vSet(P.DOCUMENT, HAS_MANDATORY_PARAMETER_RELATION, P.DOCUMENT_REFERENCE);
                                    vSetType(P.DOCUMENT_REFERENCE, P.IDENTIFIER, P.IDENTIFIER);
                                    vSetClass(P.GOSPEL, P.DOCUMENT_REFERENCE);
                                    vSetParent(P.EVANGELIST, P.AGENT);
                                    vSet(P.GOSPEL, HAS_MANDATORY_PARAMETER_RELATION, P.EVANGELIST);
                                    vSetClass(P.MARK, P.EVANGELIST);
                                    vSetClass(P.JOHN, P.EVANGELIST);
                                    vSetClass(P.MATTHEW, P.EVANGELIST);
                                    vSetClass(P.LUKE, P.EVANGELIST);
                                    vSetParent(P.GOSPEL_TRANSLATION, P.TRANSLATION);
                                    vSet(P.GOSPEL, HAS_MANDATORY_PARAMETER_RELATION, P.GOSPEL_TRANSLATION);
                                    // vSet(P.GOSPEL_TRANSLATION, HAS_MANDATORY_PARAMETER_RELATION, P.DATE);
                                    //vSetType(P.DATE, P.DATE_TYPE);
                                    vSet(P.GOSPEL_TRANSLATION, HAS_MANDATORY_PARAMETER_RELATION, P.LANGUAGE);
                                    vSetClass(P.YOUNG_LITERAL_TRANSLATION, P.GOSPEL_TRANSLATION);
                                    
                                    
                                    
                                    
                                    //////// keyword
                                    
                                    vSetClass(P.CONSULTATION, P.ACTION);
                                    
                                    //////////// ARGUMENT
                                    
                                    vSetClass(P.STUDY_RESULT, P.ACTION);
                                    vSetParent(P.BELIEF, P.ARGUMENT);
                                    vSetParent(P.BELIEF, P.ARGUMENT);
                                    vSetParent(P.CONSENSUS, P.BELIEF);
                                    vSetParent(P.FACT, P.ARGUMENT);
                                    
                                    //ATTRIBUTE
                                    
                                    vSetClass(P.BIRTHDATE, P.TIME);
                                    vSetType(P.BIRTHDATE, P.DATE_TYPE, P.NOT_USED);
                                    
                                    // TYPE
                                    
                                    vSetClass(P.STRING_TYPE, P.ATTRIBUTE_TYPE);
                                    vSetClass(P.INTEGER_TYPE, P.ATTRIBUTE_TYPE);
                                    vSetClass(P.P_TYPE, P.ATTRIBUTE_TYPE);
                                    vSetClass(P.TIMESPAN_TYPE, P.ATTRIBUTE_TYPE);
                                    vSetClass(P.DATE_TYPE, P.ATTRIBUTE_TYPE);
                                    vSetClass(P.SINDEX_TYPE, P.ATTRIBUTE_TYPE);
                                    vSetClass(P.ENTITY_ARRAY_TYPE, P.ATTRIBUTE_TYPE);
                                    vSetClass(P.EXECUTED_ENTITY_TYPE, P.ATTRIBUTE_TYPE);
                                    vSetClass(P.ENTITY_ITEM_ARRAY_TYPE, P.ATTRIBUTE_TYPE);
                                    vSetClass(P.COMMAND_LINE_TYPE, P.ATTRIBUTE_TYPE);
                                    
                                    
                                    vSetParent(P.STRING_255_TYPE, P.STRING_TYPE);
                                    vSetParent(P.STRING_10_TYPE, P.STRING_TYPE);
                                    vSetParent(P.STRING_20_TYPE, P.STRING_TYPE);
                                    vSetParent(P.STRING_4000_TYPE, P.STRING_TYPE);
                                    vSetParent(P.TITLE_AND_TEXT_TYPE, P.STRING_4000_TYPE);
                                    vSetParent(P.TEXT_TYPE, P.STRING_4000_TYPE);
                                    // vSetParent(RULE_TYPE, STRING_4000_ATTRIBUTE_TYPE);
                                    
                                    vSetParent( P.AVATAR_SINDEX_TYPE, P.SINDEX_TYPE);
                                    vSetParent(P.COMMITTEE_SINDEX_TYPE,P.SINDEX_TYPE);
                                    vSetParent(P.ORGANISATION_INDEX_TYPE, P.INDEX_TYPE);
                                    vSetParent(P.PROFILE_INDEX_TYPE, P.INDEX_TYPE);
                                    
                                    // Feature
                                    vSetClass(P.ELECTION_SPAN_FEATURE, P.ORGANISATION_PROPERTY_CLASS);
                                    vSetParent(P.TIMESPAN_FEATURE, P.FEATURE);
                                    vSetParent(P.ELECTION_SPAN_FEATURE, P.TIMESPAN_FEATURE);
                                    
                                    vSetClass(P.ELECTION_CHANGE_FREEZE_PERCENTAGE_FEATURE, P.ORGANISATION_PROPERTY_CLASS);
                                    vSetParent(P.PERCENTAGE_FEATURE, P.FEATURE);
                                    vSetParent(P.ELECTION_CHANGE_FREEZE_PERCENTAGE_FEATURE, P.PERCENTAGE_FEATURE);
                                    
                                    //Function
                                    vSetClass(P.ATTRIBUTE, P.ENTITY_ROOT);
                                    vSetParent(P.PROFILE_ATTRIBUTE, P.ATTRIBUTE);
                                    vSet(P.PROFILE_ATTRIBUTE, HAS_MANDATORY_PARAMETER_RELATION, P.PROFILE);
                                    vSetParent(P.MEMBER_ATTRIBUTE, P.ATTRIBUTE);
                                    vSet(P.MEMBER_ATTRIBUTE, HAS_MANDATORY_PARAMETER_RELATION,  P.MEMBER);
                                    
                                    vSetParent(P.ORGANISATION_ATTRIBUTE, P.ATTRIBUTE);
                                    vSet(P.ORGANISATION_ATTRIBUTE, HAS_MANDATORY_PARAMETER_RELATION,  P.ORGANISATION);
                                    
                                    
                                    
                                    vSetParent(P.MEMBER_IN_ORGANISATION_ATTRIBUTE, P.ATTRIBUTE);
                                    vSet(P.MEMBER_IN_ORGANISATION_ATTRIBUTE, HAS_MANDATORY_PARAMETER_RELATION, P.MEMBER_PROFILE, P.ORGANISATION);
                                    
                                    vSetParent(P.MEMBER_IN_COMMITTEE_ATTRIBUTE, P.MEMBER_IN_ORGANISATION_ATTRIBUTE);
                                    vSet(P.MEMBER_IN_COMMITTEE_ATTRIBUTE, HAS_MANDATORY_PARAMETER_RELATION, P.MEMBER_PROFILE, P.COMMITTEE);
                                    
                                    vSetClass(P.GRADE_CLASS, P.ENTITY_ROOT);
                                    vSetClass(P.ATTRIBUTE_ORGANISATION_CLASS, P.ENTITY_ROOT);
                                    vSetClass(P.DOCUMENT_CLASS, P.ENTITY_ROOT);
                                    vSetClass(P.CURRENCY_CLASS, P.ENTITY_ROOT);
                                    vSetClass(P.CATEGORY, P.ENTITY_ROOT);
                                    vSetType(P.CATEGORY, P.ENTITY_ITEM_ARRAY_TYPE, P.ENTITY_ITEM_ARRAY_TYPE);
                                    
                                    //  vSetClass(P.RULE_CLASS, P.ENTITY_ROOT);
                                    vSetClass(P.BILL_PROPOSAL_CLASS, P.ENTITY_ROOT);
                                    //vSetClass(P.TRADUCTION_CLASS, P.ENTITY_ROOT);
                                    vSetClass(P.VOTE_TYPE_CLASS, P.ENTITY_ROOT);
                                    vSetClass(P.ATTRIBUTE_TYPE, P.ENTITY_ROOT);
                                    
                                    vSetParent(P.INDEX_TYPE, P.INTEGER_TYPE);
                                    //  vSetType(P.INDEX_TYPE, P.INTEGER_TYPE, P.INTEGER_ARRAY_TYPE);
                                    //vSetClass(P.SUB_INDEX, P.SUB_INDEX_CLASS);
                                    vSetParent(P.PROFILE_INDEX_TYPE, P.INDEX_TYPE);
                                    vSetParent(P.AVATAR_SINDEX_TYPE, P.SINDEX_TYPE);
                                    
                                    
                                    // vSetParent(P.MEME_INDEX, P.INDEX);
                                    // vSetParent(P.MEME_SUB_INDEX, P.SUB_INDEX);
                                    
                                    vSetParent(P.BILL_PROPOSAL_CLASS, P.DOCUMENT_CLASS);
                                    vSetParent(P.ANNOTATION_CLASS, P.ENTITY_ROOT);
                                    
                                    //vSetClass(P.IDENTIFIER, P.ENTITY);
                                    vSetType(P.IDENTIFIER, P.IDENTIFIER_TYPE, P.IDENTIFIER_TYPE);
                                    // Index
                                    //vSetClass(P.INDEX_CLASS, P.ENTITY_ROOT);
                                    //vSetClass(P.SUB_INDEX_CLASS, P.ENTITY_ROOT);
                                    
                                    
                                    //Critics
                                    
                                    vSetParent(P.ANNOTATION, P.PRINCIPLE);
                                    //  vSetParent(P.RULE, P.ENTITY);
                                    vSetParent(P.PRINCIPLE, P.RULE);
                                    /* vSetParent(P.CRITIC, P.PRINCIPLE);
                                    vSetParent(P.CRITIC_REDACTION, P.CRITIC);
                                    vSetParent(P.CRITIC_PROPAGANDA, P.CRITIC);
                                    vSetParent(P.CRITIC_VOCABULARY, P.CRITIC);
                                    //  vSetClass(P.CRITIC, P.RULE_CLASS); */
                                    //  vSetClass(P.CRITIC_OF_CRITIC, P.RULE_CLASS); 
                                    /* vSetClass(P.RULE, P.RULE_CLASS);
                                    vSetClass(P.RULE_FUNDAMENTAL, P.RULE_CLASS);
                                    * */
                                    // Principle
                                    /*      vSetClass(P.FUTURE_VERSUS_PRESENT_CRITERIA, P.CRITERIA);
                                    vSetClass(P.HUMANITY_VERSUS_INDIVIDUAL_CRITERIA, P.CRITERIA);
                                    vSetClass(P.READIBILITY_CRITERIA, P.CRITERIA);
                                    vSetClass(P.COST_CRITERIA, P.CRITERIA);
                                    vSetClass(P.RESEARCH_CRITERIA, P.CRITERIA);
                                    vSetClass(P.URGENCE_CRITERIA, P.CRITERIA);
                                    vSetClass(P.IMPORTANCE_CRITERIA, P.CRITERIA);
                                    vSetClass(P.ORIGINALITY_CRITERIA, P.CRITERIA);
                                    * */
                                    
                                    // Command
                                    vSetClass(P.COMMAND_CLASS, P.ENTITY_ROOT);
                                    vSetCommand(P.CREATE, "c", P.COMMAND_ENTITY_NAME_COMMAND_SYNOPSIS);
                                    vSetCommand(P.LIST, "l", P.COMMAND_ENTITY_COMMAND_SYNOPSIS);
                                    vSetCommand(P.MOVE, "m", P.COMMAND_ENTITY_NAME_COMMAND_SYNOPSIS);
                                    vSetCommand(P.REMOVE, "r", P.COMMAND_ENTITY_NAME_COMMAND_SYNOPSIS);
                                    vSetCommand(P.REVOKE, "rev", P.COMMAND_ENTITY_NAME_COMMAND_SYNOPSIS);
                                    vSetCommand(P.DELETE, "del", P.COMMAND_ENTITY_NAME_COMMAND_SYNOPSIS);
                                    vSetCommand(P.HELP,  "h", P.COMMAND_ENTITY_COMMAND_SYNOPSIS);
                                    vSetCommand(P.SUPPORT, "yes", P.COMMAND_ENTITY_NAME_COMMAND_SYNOPSIS);
                                    vSetCommand(P.OPPOSE, "no", P.COMMAND_ENTITY_NAME_COMMAND_SYNOPSIS);
                                    vSetCommand(P.ADD, "a", P.COMMAND_ENTITY_NAME_COMMAND_SYNOPSIS);
                                    vSetCommand(P.UPDATE,  "u", P.COMMAND_ENTITY_NAME_COMMAND_SYNOPSIS);
                                    vSetCommand(P.SET, "se", P.COMMAND_ENTITY_NAME_COMMAND_SYNOPSIS);
                                    vSetCommand(P.GRANT, "gr", P.COMMAND_ENTITY_NAME_COMMAND_SYNOPSIS);
                                    vSetCommand(P.STATUS, "st", P.COMMAND_ENTITY_NAME_COMMAND_SYNOPSIS);
                                    vSetCommand(P.DISPLAY,   "d", P.COMMAND_ENTITY_COMMAND_SYNOPSIS);
                                    vSetCommand(P.HIDE, "hi", P.COMMAND_ENTITY_NAME_COMMAND_SYNOPSIS);
                                    vSetCommand(P.SHOW, "sh", P.COMMAND_ENTITY_NAME_COMMAND_SYNOPSIS );
                                    vSetCommand(P.VOTE_COUNT, "vc", P.COMMAND_ENTITY_NAME_COMMAND_SYNOPSIS);
                                    
                                    vSetClass(P.IDENTIFIER, P.ENTITY_ROOT, "id");
                                    vSetParent(P.IDENTIFIER_RESULT, P.IDENTIFIER);
                                    
                                    vSetParent(P.LIST, P.DISPLAY);
                                    vSetParent(P.GRANT, P.CREATE);
                                    vSetParent(P.ADD, P.CREATE);
                                    vSetParent(P.REVOKE, P.DELETE);
                                    vSetParent(P.REMOVE, P.DELETE);
                                    vSetParent(P.SET, P.UPDATE);
                                    vSetParent(P.SUPPORT, P.VOTE);
                                    vSetParent(P.OPPOSE, P.VOTE);
                                    
                                    // Execution
                                    
                                    
                                    vSetParent(P.EXECUTIVE_FEATURE, P.FEATURE);
                                    vSetParent(P.EXCLUSIVE_EXECUTION, P.EXECUTIVE_CONDITION);
                                    vSetParent(P.DEPENDANT_EXECUTION, P.EXECUTIVE_CONDITION);
                                    vSetParent(P.INDEPENDANT_EXECUTION, P.EXECUTIVE_CONDITION);
                                    
                                    //vSetParent(P.EXCLUSIVE_EXECUTION, P.EXECUTION_RESTRICTION);
                                    
                                    /*    // Excution
                                    vSetClass(P.EXCLUSIVE_EXECUTIVE_RESTRICTION, P.EXECUTIVE_RESTRICTION);
                                    vSetClass(P.PURPOSE_EXCLUSIVE_EXECUTIVE_RESTRICTION, P.EXECUTIVE_RESTRICTION);
                                    vSetClass(P.TIME_EXECUTIVE_RESTRICTION, P.EXECUTIVE_RESTRICTION);
                                    vSetClass(P.FINANCIAL_ONLY_EXECUTIVE_RESTRICTION, P.EXECUTIVE_RESTRICTION);
                                    vSetClass(P.LEGAL_EXCLUSIVE_EXECUTIVE_RESTRICTION, P.EXECUTIVE_RESTRICTION);
                                    vSetClass(P.PHYSICAL_EXCLUSIVE_EXECUTIVE_RESTRICTION, P.EXECUTIVE_RESTRICTION);
                                    
                                    vSetParent(P.PURPOSE_EXCLUSIVE_EXECUTIVE_RESTRICTION, P.EXCLUSIVE_EXECUTIVE_RESTRICTION);
                                    vSetParent(P.LEGAL_EXCLUSIVE_EXECUTIVE_RESTRICTION, P.EXCLUSIVE_EXECUTIVE_RESTRICTION);
                                    vSetParent(P.PHYSICAL_EXCLUSIVE_EXECUTIVE_RESTRICTION, P.EXCLUSIVE_EXECUTIVE_RESTRICTION);
                                    
                                    vSetParent(P.EXCLUSIVE_EXECUTIVE_RESTRICTION, P.EXECUTIVE_RESTRICTION);
                                    vSetParent(P.TIME_EXECUTIVE_RESTRICTION, P.EXECUTIVE_RESTRICTION);
                                    vSetParent(P.PURPOSE_EXCLUSIVE_EXECUTIVE_RESTRICTION, P.EXECUTIVE_RESTRICTION);
                                    */
                                    //LANGUAGE
                                    vSetClass(P.ENGLISH, P.LANGUAGE, "eng");
                                    vSetClass(P.FRENCH, P.LANGUAGE, "fr");
                                    
                                    /////////// Option
                                    
                                    vSetOption(P.COMMENT, P.TEXT_TYPE); 
                                    vSetOption(P.LANGUAGE, P.P_TYPE);
                                    vSetOption( P.NAME, P.STRING_TYPE);
                                    vSetOption(P.AVATAR, P.AVATAR_SINDEX_TYPE, P.AVATAR_SINDEX_TYPE);
                                    vSetOption( P.VIRTUAL);
                                    vSetOption(P.PARENT, P.EXECUTED_ENTITY_TYPE);
                                    vSetOption( P.RECURSIVE);
                                    vSetOption(P.TYPE); 
                                    vSetOption(P.MEMBER, P.PROFILE_INDEX_TYPE, P.COMMITTEE_SINDEX_TYPE);
                                    
                                    
                                    vSetOption(P.MEMBER, P.AVATAR_SINDEX_TYPE, P.COMMITTEE_SINDEX_TYPE);
                                    vSet(P.MEMBER, HAS_NAME_RELATION, P.MEMBER_NAME);
                                    vSetParent(P.MEMBER_NAME, P.NAME);
                                    vSetOption(P.AUTHOR, P.AVATAR_SINDEX_TYPE, P.COMMITTEE_SINDEX_TYPE);
                                    vSet(P.AUTHOR, HAS_NAME_RELATION, P.AUTHOR_NAME);
                                    vSetParent(P.AUTHOR_NAME,   P.NAME);
                                    vSetOption(P.ORGANISATION, P.ORGANISATION_INDEX_TYPE);
                                    vSetOption(P.COMMITTEE, P.COMMITTEE_SINDEX_TYPE);                   
                                    vSetOption( P.CATEGORY, P.IDENTIFIER_TYPE);
                                    vSetOption(P.THEME, P.P_TYPE);
                                    vSetOption(P.TO, P.IDENTIFIER_TYPE);    
                                    vSetOption(P.PRINCIPLE, P.EXECUTED_ENTITY_TYPE);
                                    vSetOption(P.COMPARATOR, P.P_TYPE);
                                    vSetOption(P.TRACE, P.P_TYPE);   
                                    vSetOption( P.ENCRYPT);
                                    vSetOption(P.ACCESS, P.AVATAR_SINDEX_TYPE, P.AVATAR_SINDEX_TYPE);
                                    				vSetOption(P.AGAINST, P.EXECUTED_ENTITY_TYPE);
                                    				vSetOption(P.VARIABLE, P.STRING_TYPE);
                                    
                                    vSetClass(P.COMMAND_ENTITY_COMMAND_SYNOPSIS, P.COMMAND_SYNOPSIS_CLASS);
                                    vSetClass(P.COMMAND_ENTITY_NAME_COMMAND_SYNOPSIS, P.COMMAND_SYNOPSIS_CLASS);
                                    vSetClass(P.COMMAND_ENTITY_NAME_TEXT_COMMAND_SYNOPSIS, P.COMMAND_SYNOPSIS_CLASS);
                                    
                                    
                                    
                                    /////// MESSAGE
                                    
                                    m_oNullEntityName = FindEntityName(P.NOT_USED);
                                    if (m_dLanguage == P.ENGLISH)
                                    {
                                    vSetEnglishLanguageComment();
                                    vConstructEnglishFeatures();
                                    }
                                    
                                    
                                    m_oOptionEntity = dGetEntityByRelationFilter(IS_OPTION_RELATION);
                                    m_oCommandEntity = dGetEntityByClassFilter(P.COMMAND_CLASS);
                                    
                                    }
                                    
                                    
                                    public P[] dGetEntityByClassFilter(P dClassFilter)
                                    {
                                    ArrayList oOptionArrayList = new ArrayList();
                                    for (int i = 0; i < m_oEntityNameCommandArray.Length; i++)
                                    {
                                    if (bIsA(m_oEntityNameCommandArray[i].dClass, dClassFilter))
                                    {
                                    oOptionArrayList.Add((P)i);
                                    }
                                    }
                                    return (P[])oOptionArrayList.ToArray(typeof(P));
                                    }
                                    
                                    public P[] dGetEntityByRelationFilter(char cRelation)
                                    {
                                    ArrayList oOptionArrayList = new ArrayList();
                                    for (int i = 0; i < m_oEntityNameCommandArray.Length; i++)
                                    {
                                    if (bHas((P)i, cRelation) )
                                    {
                                    oOptionArrayList.Add((P)i);
                                    }
                                    }
                                    return (P[])oOptionArrayList.ToArray(typeof(P));
                                    }
                                    void vSetEnglishLanguageComment()
                                    {
                                    vSetName(P.SUB_SECTION, "subsection");
                                    vSetName(P.FRENCH, "french"); vSetAbbreviation(P.FRENCH, "fr");
                                    vSetName(P.ENGLISH, "english"); vSetAbbreviation(P.ENGLISH, "eng");
                                    //vSetName(P.MEMBER_ORGANISATION, "member");
                                    vSetName(P.ADMINISTRATOR_ORGANISATION, "administrator");
                                    vSetAbbreviation(P.IDENTIFIER, "id");
                                    vSetAbbreviation(P.AVATAR,   "av");
                                    vSetAbbreviation(P.ORGANISATION,  "org");
                                    //vSetAbbreviation(P.VARIABLE, "var");
                                    // vSetClass(P.VARIABLE, P.ENTITY_ROOT, "var");
                                    // vSetType(P.VARIABLE, P.IDENTIFIER_TYPE, P.IDENTIFIER_TYPE);
                                    // vSetName(P.IDENTIFIER, "id");
                                    			vSetClass(P.FUNCTION, P.ENTITY_ROOT, "var");
                                    			vSetType(P.FUNCTION, P.COMMAND_LINE_TYPE, P.COMMAND_LINE_TYPE);
                                    			// vSetName(P.IDENTIFIER, "id");
                                    			//vSetName(P.AVATAR, "av");
                                    //vSetName(P.ORGANISATION, "org");
                                    vSetName(P.BIRTHDATE, "birthdate");
                                    vSetName(P.STRING_255_TYPE, "string255");
                                    vSetName(P.INTEGER_TYPE, "integer");
                                    vSetName(P.STRING_50_TYPE, "string50");
                                    vSetName(P.STRING_10_TYPE, "string10");
                                    vSetName(P.STRING_20_TYPE, "string20");
                                    vSetName(P.STRING_4000_TYPE, "text");
                                    vSetName(P.STRING_TYPE, "string");
                                    vSetName(P.BOOLEAN_TYPE, "boolean");
                                    vSetName(P.DOUBLE_TYPE, "double");
                                    vSetName(P.DATE_TYPE, "date");
                                    //vSetName(P.ATTRIBUTE_CLASS, "attribute");
                                    vSetName(P.GRADE_CLASS, "grade");
                                    vSetName(P.DOCUMENT_CLASS, "document");
                                    vSetName(P.TIMESPAN_TYPE, "timespan");
                                    //            vSetName(P.CRITERIA, "principle");
                                    vSetName(P.EXCLUSIVE_EXECUTION, "exclusive");
                                    vSetName(P.INDEPENDANT_EXECUTION, "independant");
                                    vSetName(P.DEPENDANT_EXECUTION, "dependant");
                                    
                                    
                                    //////// keyword
                                    
                                    vSetHelp(P.AVATAR, "An avatar has restricted access to the information of your profile.\nThe avatar can have a restricted
                                    display right of his father avatar. A normal avatar is created by the user.");
                                    vSetHelp(P.PROFILE, "The profile is the root avatar and it has all accesses. The connection to a profile should be done witha
                                    password.");
                                    vSetHelp(P.PROSPECT, "A prospect is a non register avatar. A prospect is created by a friend in order to join a cause.");
                                    }
                                    
                                    
                                    
                                    public void vConstructEnglishFeatures()
                                    {
                                    if (CFeatureTypeFactory.Instance().Count == 0)
                                    {
                                    
                                    CFeatureTypeFactory.Instance().vAdd("INSTANT", TimeSpan.FromDays(0));
                                    CFeatureTypeFactory.Instance().vAdd("1WK", TimeSpan.FromDays(7));
                                    CFeatureTypeFactory.Instance().vAdd("1M", TimeSpan.FromDays(30));
                                    CFeatureTypeFactory.Instance().vAdd("3M", TimeSpan.FromDays(365 / 4));
                                    CFeatureTypeFactory.Instance().vAdd("1Y", TimeSpan.FromDays(365));
                                    CFeatureTypeFactory.Instance().vAdd("3Y", TimeSpan.FromDays(365 * 3));
                                    CFeatureTypeFactory.Instance().vAdd("5Y", TimeSpan.FromDays(365 * 5));
                                    CFeatureTypeFactory.Instance().Create(P.ELECTION_SPAN_FEATURE);
                                    
                                    
                                    CFeatureTypeFactory.Instance().vAdd("0%", 0);
                                    CFeatureTypeFactory.Instance().vAdd("5%", 5);
                                    CFeatureTypeFactory.Instance().vAdd("10%", 10);
                                    CFeatureTypeFactory.Instance().vAdd("25%", 25);
                                    CFeatureTypeFactory.Instance().vAdd("50%", 50);
                                    CFeatureTypeFactory.Instance().vAdd("75%", 75);
                                    CFeatureTypeFactory.Instance().vAdd("90%", 90);
                                    CFeatureTypeFactory.Instance().vAdd("95%", 95);
                                    CFeatureTypeFactory.Instance().vAdd("100%", 100);
                                    CFeatureTypeFactory.Instance().Create(P.ELECTION_CHANGE_FREEZE_PERCENTAGE_FEATURE);
                                    
                                    CFeatureTypeFactory.Instance().vAdd(ENExecution.Independant.ToString(), (int)ENExecution.Independant);
                                    CFeatureTypeFactory.Instance().vAdd(ENExecution.DoneOnlyIfOtherDone.ToString(), (int)ENExecution.DoneOnlyIfOtherDone);
                                    CFeatureTypeFactory.Instance().vAdd(ENExecution.Exclusive.ToString(), (int)ENExecution.Exclusive);
                                    CFeatureTypeFactory.Instance().Create(P.EXECUTIVE_FEATURE);
                                    }
                                    
                                    }
                                    
                                    static public void vAdd(ref SEntity[] eArray, SEntity oEntity)
                                    {
                                    if (eArray == null)
                                    {
                                    eArray = new SEntity[1];
                                    eArray[0] = oEntity;
                                    }
                                    else
                                    {
                                    SEntity[] eNewArray = new SEntity[eArray.Length + 1];
                                    for (int i = 0; i < eArray.Length; i++)
                                    {
                                    eNewArray[i] = eArray[i];
                                    }
                                    eNewArray[eArray.Length] = oEntity;
                                    eArray = eNewArray;
                                    
                                    }
                                    }
                                    
                                    public static SEntity NOT_USED_SENTITY = new SEntity(P.NOT_USED, NOT_USED);
                                    static public string ToString(SEntity[] dArray)
                                    {
                                    if (dArray == null || dArray.Length == 0) return null;
                                    StringBuilder sResult = new StringBuilder(dArray[0].ToString());
                                    for (int i = 1; i < dArray.Length; i++)
                                    {
                                    sResult.Append(','); sResult.Append(dArray[i].ToString());
                                    
                                    }
                                    return sResult.ToString();
                                    }
                                    
                                    static public bool IsNotUsed(SEntity oEntity)
                                    {
                                    return oEntity.dClass == P.NOT_USED || oEntity.IsNotUsed;
                                    }
                                    static public bool IsUsed(SEntity oEntity)
                                    {
                                    return oEntity.dClass != P.NOT_USED && oEntity.IsUsed;
                                    }
                                    
                                    
                                    }
                                    
                                    public class CEntityHelp 
                                    {
                                    public CEntityHelp() {
                                    m_oHelpArray = new ArrayList();
                                    }
                                    public CDbEPBase.P dEntity;
                                    ArrayList m_oHelpArray;
                                    
                                    public void vAdd(CDbEPBase.P dCommand, CDbEPBase.P dOption, string sHelp) {
                                    SHelp oHelp = new SHelp();
                                    oHelp.dOption= dOption;
                                    oHelp.dCommand= dCommand;
                                    oHelp.sHelp= sHelp;
                                    }
                                    
                                    public string[] sGetHelp(CDbEPBase.P dCommand) {
                                    ArrayList oOutputArray = new ArrayList();
                                    for(int i=0; i < m_oHelpArray.Count; i++) {
                                    if ( ((SHelp)m_oHelpArray[i]).dCommand == dCommand) {
                                    oOutputArray.Add( ((SHelp)m_oHelpArray[i]).sHelp);
                                    }
                                    }
                                    return (string[])oOutputArray.ToArray(typeof(string));
                                    }
                                    
                                    }
                                    
                                    public struct SHelp
                                    {
                                    public CDbEPBase.P dCommand;
                                    public CDbEPBase.P dOption;
                                    public string sHelp;
                                    }
                                    /// 
                                    /// Summary description for CEPolCommandArrayFactory
                                    /// 
                                    public class CCommandArrayFactory : CCommandFactoryBase
                                    {
                                    public CCommandArrayFactory()
                                    {
                                    m_oCommandArrayDictionary = new SortedList();
                                    
                                    }
                                    SortedList m_oCommandArrayDictionary;
                                    
                                    public string sKey(P  dLanguage, P dEntity)
                                    {
                                    string sKey = ((int)dLanguage).ToString();
                                    
                                    if (CDbEPBase.IsUsed(dEntity))
                                    {
                                    sKey += 'e' + ((int)dEntity).ToString();
                                    }
                                    
                                    return sKey;
                                    
                                    }
                                    
                                    /*
                                    public string sKey(P  dLanguage, P dCommand, P dEntity, P dOption) 
                                    {
                                    string sKey = ((int)dLanguage).ToString();
                                    if (CDbEPBase.IsUsed(dCommand)) {
                                    sKey += 'c' + ((int)dCommand).Tostring() 
                                    }
                                    if (CDbEPBase.IsUsed(dEntity)) {
                                    sKey += 'e'+ ((int)dEntity).Tostring();
                                    }
                                    if (CDbEPBase.IsUsed(dOption)) {
                                    sKey += 'o'+ ((int)dOption).Tostring();
                                    }
                                    return sKey;
                                    
                                    }
                                    * 
                                    * */
                                    
                                    public string[] sHelp(P  dLanguage, P dCommand, P dEntity)
                                    {
                                    CEntityHelp oEntityHelp = null;
                                    string sKey1 = sKey(dLanguage, dEntity);
                                    if (m_oCommandArrayDictionary.ContainsKey(sKey1))
                                    {
                                    oEntityHelp = ((CEntityHelp)m_oCommandArrayDictionary[sKey1]);
                                    }
                                    else if (P.ENGLISH != dLanguage)
                                    {
                                    string sKey2 = sKey(P.ENGLISH, dEntity);
                                    if (m_oCommandArrayDictionary.ContainsKey(sKey2))
                                    {
                                    oEntityHelp = ((CEntityHelp)m_oCommandArrayDictionary[sKey2]);
                                    }
                                    if (oEntityHelp == null)
                                    {
                                    string[] sReturn = new string[1];
                                    sReturn[0] = "There is no help for " + dEntity.ToString().ToLower() + " in " + dLanguage.ToString().ToLower();
                                    if (dLanguage != P.ENGLISH)
                                    {
                                    sReturn[0] += " or english";
                                    }
                                    return sReturn;
                                    }
                                    }
                                    return oEntityHelp == null ? null : oEntityHelp.sGetHelp(dCommand);
                                    }
                                    
                                    // public SCommand m_oNullCommand;
                                    static CCommandArrayFactory s_oCommandArrayFactory = null;
                                    public static CCommandArrayFactory Instance()
                                    {
                                    if (s_oCommandArrayFactory == null)
                                    {
                                    s_oCommandArrayFactory = new CCommandArrayFactory();
                                    }
                                    return s_oCommandArrayFactory;
                                    }
                                    
                                    
                                    
                                    public void vSetHelp(P  dLanguage, P dCommand, P dEntityName, P dOption, string sHelp)
                                    {
                                    
                                    SHelp oHelp = new SHelp();
                                    oHelp.dCommand = dCommand;
                                    oHelp.dOption = dOption;
                                    
                                    oHelp.sHelp = sHelp;
                                    m_oCommandArrayDictionary.Add(sKey(dLanguage, dEntityName), oHelp);
                                    }
                                    }
                                    
                                    
                                    ///-------------------------------------------------------------------------------------------------------------------------
                                    /// 
                                    /// Summary description for CDbEntityNameTable
                                    /// 
                                    ///-------------------------------------------------------------------------------------------------------------------------
                                    public class CIdentifier : CDbEPBase
                                    {
                                    public CIdentifier()
                                    {
                                    vClear();
                                    
                                    }
                                    public CIdentifier(SBIndex iIndex)
                                    {
                                    vClear();
                                    m_iIndex = iIndex;
                                    
                                    }
                                    public CIdentifier(int dIndex)
                                    {
                                    vClear();
                                    m_iIndex.dReferenceIndex= NOT_USED;
                                    m_iIndex.dMainSIndex.dIndex = dIndex;
                                    m_iIndex.dMainSIndex.dSubIndex = NOT_USED;
                                    
                                    }
                                    public CIdentifier(P dEntity, CIdentifier oIdentifierParent)
                                    {
                                    
                                    vClear();
                                    m_dEntity = dEntity;
                                    m_oIdentifierParent = oIdentifierParent;
                                    }
                                    public CIdentifier(P dEntity, CIdentifier oIdentifierParent, CEntityArray oEntityArray)
                                    {
                                    
                                    vClear();
                                    m_dEntity = dEntity;
                                    m_oIdentifierParent = oIdentifierParent;
                                    m_eaFilter = oEntityArray;
                                    }
                                    public CIdentifier( SBIndex iIndex, P dEntity, CEntityArray oEntityArray)
                                    {
                                    
                                    vClear();
                                    m_dEntity = dEntity;
                                    m_oIdentifierParent = null;
                                    m_eaFilter = oEntityArray;
                                    m_iIndex = iIndex;
                                    
                                    }
                                    public override string ToString()
                                    {
                                    string sOutput = "";
                                    if (m_oIdentifierParent != null)
                                    {
                                    sOutput = m_oIdentifierParent.ToString();
                                    }
                                    else
                                    {
                                    sOutput = "";
                                    }
                                    if (sOutput != "") sOutput += IDENTIFIER_CHILD_SEPARATOR;
                                    if (IsUsed(m_dEntity))
                                    {
                                    sOutput += FromNoodToString();
                                    }
                                    else
                                    {
                                    sOutput += "id:" + m_iIndex.ToString();
                                    }
                                    if (IsUsed(m_iIndex.dMainSIndex.dSubIndex))
                                    {
                                    sOutput += IDENTIFIER_MEME_SEPARATOR + m_iIndex.dMainSIndex.dSubIndex;
                                    
                                    } 
                                    return sOutput;
                                    }
                                    public bool bIsEmpty
                                    {
                                    get
                                    {
                                    return IsNotUsed(m_dEntity);
                                    }
                                    }
                                    public void vSetSubMeme(int dSubMeme) {
                                    m_iIndex.dMainSIndex.dSubIndex = dSubMeme;
                                    
                                    }
                                    
                                    public CIdentifier(P dEntity)
                                    {
                                    vClear();
                                    m_dEntity = dEntity;
                                    }
                                    void vClear()
                                    {
                                    m_dEntity = P.NOT_USED;
                                    m_oIdentifierParent = null;
                                    m_eaFilter = null;
                                    m_dDepth = NOT_USED;
                                    m_iIndex = NOT_USED_SBINDEX;
                                    
                                    }
                                    
                                    P m_dEntity;
                                    protected SBIndex  m_iIndex;
                                    CIdentifier m_oIdentifierParent;
                                    CEntityArray m_eaFilter;
                                    int m_dDepth;
                                    
                                    public P  Language
                                    {
                                    get
                                    {
                                    int dInstance= dFind(P.LANGUAGE);
                                    if (IsUsed(dInstance))
                                    {
                                    return (P)dInstance;
                                    }
                                    return P.ENGLISH;
                                    }
                                    }
                                    
                                    public int dFind(P dClass)
                                    {
                                    if (m_eaFilter != null)
                                    {
                                    int dInstance = m_eaFilter.dFind(dClass);
                                    if (IsUsed(dInstance))
                                    {
                                    return dInstance;
                                    }
                                    else if (m_oIdentifierParent != null)
                                    {
                                    return m_oIdentifierParent.dFind(dClass);
                                    }
                                    }
                                    return NOT_USED;
                                    
                                    }
                                    public CEntityArray ParentEntityArray
                                    {
                                    get
                                    {
                                    if (this.m_oIdentifierParent != null)
                                    {
                                    return m_oIdentifierParent.m_eaFilter;
                                    }
                                    return null;
                                    }
                                    
                                    }
                                    
                                    
                                    public CEntityArray dGetEntityArray(bool bIsExactMatch)
                                    {
                                    
                                    if (m_eaFilter != null)
                                    {
                                    return m_eaFilter.toExactMatch(bIsExactMatch);
                                    }
                                    return null;
                                    
                                    
                                    }
                                    public void vSetEntityArray(CEntityArray ea)
                                    {
                                    
                                    m_eaFilter = ea;
                                    
                                    }
                                    public bool bIsA(P dEntity)
                                    {
                                    
                                    CIdentifier oIdentifier = this;
                                    
                                    
                                    if (oIdentifier.m_dEntity == dEntity)
                                    {
                                    return true;
                                    }
                                    else
                                    {
                                    if (oIdentifier.ParentIdentifier == null)
                                    {
                                    return false;
                                    }
                                    else
                                    {
                                    return oIdentifier.ParentIdentifier.bIsA( dEntity);
                                    }
                                    }
                                    
                                    }
                                    
                                    public int AuthorIndex
                                    {
                                    get
                                    {
                                    CIdentifier oIdentifier = oGetRoot(P.PROFILE_ATTRIBUTE);
                                    if (oIdentifier != null)
                                    {
                                    CEntityArray oEntityArray =  oIdentifier.dGetEntityArray(false);
                                    if (oEntityArray != null)
                                    {
                                    return (int)oEntityArray.pFind(P.PROFILE_INDEX_TYPE);
                                    }
                                    }
                                    return NOT_USED;
                                    }
                                    } 
                                    
                                    
                                    
                                    public CIdentifier oGetRoot(P dEntity)
                                    {
                                    
                                    CIdentifier oIdentifier = this;
                                    
                                    
                                    if (oIdentifier.m_dEntity == dEntity)
                                    {
                                    return oIdentifier;
                                    }
                                    else {
                                    if (oIdentifier.ParentIdentifier == null)
                                    {
                                    return null;
                                    }
                                    else
                                    {
                                    return oIdentifier.ParentIdentifier.oGetRoot(dEntity);
                                    }
                                    }
                                    
                                    }
                                    
                                    
                                    public CIdentifier ParentIdentifier
                                    {
                                    get
                                    {
                                    return m_oIdentifierParent;
                                    }
                                    set
                                    {
                                    m_oIdentifierParent = value;
                                    }
                                    }
                                    public int dReferenceIndex
                                    {
                                    get
                                    {
                                    return m_iIndex.dReferenceIndex;
                                    }
                                    set
                                    {
                                    m_iIndex.dReferenceIndex= value;
                                    
                                    }
                                    }
                                    public SIndex Index
                                    {
                                    get
                                    {
                                    return m_iIndex.dMainSIndex;
                                    }
                                    set
                                    {
                                    m_iIndex.dReferenceIndex = NOT_USED;
                                    m_iIndex.dMainSIndex = value;
                                    
                                    }
                                    }
                                    public SBIndex iIndex
                                    {
                                    get
                                    {
                                    return m_iIndex;
                                    }
                                    set
                                    {
                                    m_iIndex = value;
                                    }
                                    }
                                    public void vSetParentIndentifierIndex(SBIndex iIndex)
                                    {
                                    m_oIdentifierParent = new CIdentifier(iIndex);
                                    }
                                    public void vSetParentIndentifierPrincipalIndex(SIndex dIndex)
                                    {
                                    m_oIdentifierParent = new CIdentifier(new SBIndex( dIndex));
                                    }
                                    
                                    public P Entity
                                    {
                                    get
                                    {
                                    return m_dEntity;
                                    }
                                    set
                                    {
                                    m_dEntity = value;
                                    }
                                    }
                                    public void vAddTail(CIdentifier oIdentifierAncestor)
                                    {
                                    if (m_oIdentifierParent == null)
                                    {
                                    m_oIdentifierParent = oIdentifierAncestor;
                                    }
                                    else
                                    {
                                    m_oIdentifierParent.vAddTail(oIdentifierAncestor);
                                    }
                                    
                                    }
                                    bool bSet(SEntity oEntity)
                                    {
                                    
                                    if (m_eaFilter != null && IsUsed(m_eaFilter.pFind(oEntity.dClass)) )
                                    {
                                    
                                    m_eaFilter.vAdd(oEntity);
                                    return true;
                                    }
                                    else if ( this.ParentIdentifier != null) {
                                    return ParentIdentifier.bSet(oEntity);
                                    
                                    }
                                    return false;
                                    }
                                    public void vAdd(P dClass, int dInstance)
                                    {
                                    vAdd(new SEntity(dClass, dInstance));
                                    }
                                    public void vAdd(SEntity oEntity)
                                    {
                                    if (bSet(oEntity) == false)
                                    {
                                    vAddAttribute(oEntity);
                                    }
                                    }
                                    void vAddAttribute(SEntity oEntity)
                                    {
                                    m_iIndex = NOT_USED_SBINDEX;
                                    if (m_eaFilter == null)
                                    {
                                    m_eaFilter = new CEntityArray(oEntity);
                                    }
                                    else
                                    {
                                    m_eaFilter.vAdd(oEntity);
                                    }
                                    
                                    }
                                    
                                    public bool bAdd(P dEntity, SEntity oEntity)
                                    {
                                    if (dEntity == m_dEntity)
                                    {
                                    vAddAttribute(oEntity);
                                    }
                                    else
                                    {
                                    if (m_oIdentifierParent != null)
                                    {
                                    return m_oIdentifierParent.bAdd(dEntity, oEntity);
                                    }
                                    }
                                    return false;
                                    
                                    }
                                    public string ToString(P dEntity)
                                    {
                                    return CEntityManager.Instance(Language).sGetEntityName(dEntity);
                                    }
                                    string FromNoodToString()
                                    {
                                    if (IsUsed(m_dEntity)) {
                                    string sOutput = ToString(m_dEntity);
                                    if (m_eaFilter != null && m_eaFilter.ToString() != "")
                                    {
                                    sOutput += IDENTIFIER_PROPERTY_SEPARATOR  + m_eaFilter.ToString();
                                    }
                                    return sOutput;
                                    }
                                    return null;
                                    
                                    }
                                    
                                    public int Depth
                                    {
                                    get
                                    {
                                    if (IsUsed(m_dDepth))
                                    {
                                    return m_dDepth;
                                    }
                                    else
                                    {
                                    if (m_oIdentifierParent == null)
                                    {
                                    m_dDepth = 1;
                                    }
                                    else
                                    {
                                    m_dDepth = m_oIdentifierParent.Depth + 1;
                                    }
                                    }
                                    return m_dDepth;
                                    }
                                    
                                    }
                                    public P[] GetEntityList
                                    {
                                    get
                                    {
                                    P[] oArray = new P[Depth];
                                    CIdentifier oIdentifierParent = ParentIdentifier;
                                    oArray[0] = m_dEntity;
                                    for (int i = 1; i < Depth; i++)
                                    {
                                    if (oIdentifierParent != null)
                                    {
                                    oArray[i] = oIdentifierParent.m_dEntity;
                                    oIdentifierParent = oIdentifierParent.ParentIdentifier;
                                    }
                                    }
                                    return oArray;
                                    
                                    }
                                    }
                                    public CIdentifier GetParent(int dDepth)
                                    {
                                    CIdentifier oIdentifierParent = ParentIdentifier;
                                    
                                    for (int i = 1; i < dDepth; i++)
                                    {
                                    if (oIdentifierParent == null)
                                    {
                                    return null;
                                    }
                                    else
                                    {
                                    oIdentifierParent = oIdentifierParent.ParentIdentifier;
                                    }
                                    }
                                    return oIdentifierParent;
                                    }
                                    
                                    
                                    public string csDump()
                                    {
                                    string sOutput = "";
                                    if (m_oIdentifierParent != null)
                                    {
                                    sOutput = m_oIdentifierParent.csDump();
                                    }
                                    else
                                    {
                                    sOutput = "";
                                    }
                                    if (sOutput != "") sOutput += IDENTIFIER_CHILD_SEPARATOR;
                                    if (IsUsed(this.m_iIndex))
                                    {
                                    sOutput += m_iIndex.ToString() + ':';
                                    }
                                    sOutput += FromNoodToString();
                                    if ( IsUsed(m_iIndex.dMainSIndex.dSubIndex) ) {
                                    sOutput += IDENTIFIER_MEME_SEPARATOR + m_iIndex.dMainSIndex.dSubIndex;
                                    
                                    } 
                                    return sOutput;
                                    }
                                    
                                    }
                                    
                                    
                                    
                                    ///------------------------------------------------------------------------------------------------------------------------
                                    
                                    
                                    public class CEntityArray : CDbEPBase
                                    {
                                    public CEntityArray(SEntity[] oEntityArray)
                                    {
                                    vClear();
                                    m_oEntityArray = oEntityArray;
                                    
                                    }
                                    public CEntityArray()
                                    {
                                    vClear();
                                    }
                                    public CEntityArray(SEntity[] oEntityArray, SEntity oEntity)
                                    {
                                    
                                    vClear();
                                    vAppend(oEntityArray);
                                    vAppend(oEntity);
                                    }
                                    public CEntityArray(SEntity oEntity)
                                    {
                                    vClear();
                                    vAppend(oEntity);
                                    }
                                    public CEntityArray(P dClass, P dInstance)
                                    {
                                    vClear();
                                    SEntity[] oEntityArray = new SEntity[1];
                                    oEntityArray[0].dClass = dClass;
                                    oEntityArray[0].Instance = dInstance;
                                    vAppend(oEntityArray);
                                    
                                    }
                                    public CEntityArray(P dClass, int dInstance)
                                    {
                                    vClear();
                                    SEntity[] oEntityArray = new SEntity[1];
                                    oEntityArray[0].dClass = dClass;
                                    oEntityArray[0].Instance = dInstance;
                                    vAppend(oEntityArray);
                                    
                                    }
                                    public CEntityArray(CEntityArray oEntityArray, SEntity oEntity)
                                    {
                                    vClear();
                                    m_oEntityArray = oEntityArray.EntityExtraArray;
                                    vAppend(oEntity);
                                    
                                    }
                                    public CEntityArray(params CEntityArray[] oEntityArrayOfArray)
                                    {
                                    vClear();
                                    for(int i=0; i < oEntityArrayOfArray.Length; i++) {
                                    if (oEntityArrayOfArray[i] != null)
                                    {
                                    vAppend(oEntityArrayOfArray[i].EntityExtraArray);
                                    
                                    }
                                    }
                                    }
                                    
                                    
                                    public CEntityArray(SEntity[] oEntityArray, SEntity[] oEntityArray2)
                                    {
                                    vClear();
                                    vAppend(oEntityArray);
                                    vAppend(oEntityArray2);
                                    }
                                    
                                    /*
                                    public CEntityArray(ArrayList oEntityArrayList)
                                    {
                                    vClear();
                                    vAppend(ToSEntityArray(oEntityArrayList));
                                    
                                    
                                    }*/
                                    public bool bIsEmpty
                                    {
                                    get
                                    {
                                    return m_oEntityArray.Length == 0;
                                    }
                                    }
                                    SEntity[] m_oEntityArray;
                                    public void vClear()
                                    {
                                    m_bNormalForm = true;
                                    m_oEntityArray = new SEntity[0];
                                    }
                                    public SEntity[] EntityExtraArray
                                    {
                                    get
                                    {
                                    if (m_bNormalForm == false) dSort();
                                    return m_oEntityArray;
                                    }
                                    }
                                    
                                    public SEntity[] EntityArray
                                    {
                                    get
                                    {
                                    if (m_bNormalForm == false) dSort();
                                    SEntity[] oEntityArray = new SEntity[m_oEntityArray.Length];
                                    
                                    for (int i = 0; i < m_oEntityArray.Length; i++)
                                    {
                                    oEntityArray[i] = m_oEntityArray[i];
                                    }
                                    return oEntityArray;
                                    }
                                    }
                                    public void vTrim()
                                    {
                                    
                                    if (m_oEntityArray != null)
                                    {
                                    SEntity[] oEntityArrayOld = m_oEntityArray;
                                    m_oEntityArray = new SEntity[0];
                                    for (int i = 0; i < oEntityArrayOld.Length; i++)
                                    {
                                    if (IsUsed(oEntityArrayOld[i]))
                                    {
                                    vAdd(oEntityArrayOld[i]);
                                    }
                                    }
                                    }
                                    
                                    }
                                    static new public bool IsUsed(object oValue)
                                    {
                                    if (oValue is SEntity)
                                    {
                                    return ((SEntity)oValue).IsUsed;
                                    }
                                    else
                                    {
                                    return CDbEPBase.IsUsed(oValue);
                                    }
                                    } 
                                    /*static new public bool IsUsed(object oValue)
                                    {
                                    
                                    return CFeatureType.IsUsed(oValue);
                                    }
                                    */
                                    public static CEntityArray FromClassAndPTypeToEntityArray(ArrayList oArrayList)
                                    {
                                    if (oArrayList == null)
                                    {
                                    return null;
                                    }
                                    SEntity[] oEntityArray = new SEntity[oArrayList.Count];
                                    for (int i = 0; i < oArrayList.Count; i++)
                                    {
                                    object[] oObjects = (object[])oArrayList[i];
                                    oEntityArray[i].dClass = (P)oObjects[0];
                                    oEntityArray[i].Instance = oObjects[1];
                                    }
                                    return new CEntityArray(oEntityArray);
                                    }
                                    
                                    public static CEntityArray FromClassAndSIndexToEntityArray(ArrayList oArrayList)
                                    {
                                    if (oArrayList == null)
                                    {
                                    return null;
                                    }
                                    SEntity[] oEntityArray = new SEntity[oArrayList.Count];
                                    for (int i = 0; i < oArrayList.Count; i++)
                                    {
                                    object[] oObjects = (object[])oArrayList[i];
                                    oEntityArray[i].dClass = (P)oObjects[0];
                                    SIndex oSIndex = new SIndex((int)oObjects[1], (int)oObjects[2]);
                                    oEntityArray[i].Instance = oSIndex;
                                    }
                                    return new CEntityArray(oEntityArray);
                                    }
                                    public CEntityArray toExactMatch(bool bIsExactMatch)
                                    {
                                    if (bIsExactMatch)
                                    {
                                    SEntity[] oNewEntity = new SEntity[m_oEntityArray.Length];
                                    for (int i = 0; i < m_oEntityArray.Length; i++)
                                    {
                                    oNewEntity[i] = m_oEntityArray[i]; oNewEntity[i].bExact = bIsExactMatch;
                                    
                                    }
                                    return new CEntityArray(oNewEntity);
                                    }
                                    return this;
                                    
                                    }
                                    
                                    public virtual void vInitializedWithContext(CEntityArray oEntityArray)
                                    {
                                    vClear();
                                    }
                                    bool m_bNormalForm;
                                    public SEntity this[int i]
                                    {
                                    get
                                    {
                                    if (m_bNormalForm == false) dSort();
                                    return m_oEntityArray[i];
                                    }
                                    }
                                    public int Length
                                    {
                                    get
                                    {
                                    if (m_oEntityArray == null) return 0;
                                    if (m_bNormalForm == false) dSort();
                                    return m_oEntityArray.Length;
                                    }
                                    }
                                    public override string ToString()
                                    {
                                    if (m_bNormalForm == false) dSort();
                                    StringBuilder sEntityKey = new StringBuilder();
                                    //sEntityKey.Append(dMetaClass + "," + dClass + "," + dName + "," + dLanguage);
                                    for (int i = 0; i < m_oEntityArray.Length; i++)
                                    {
                                    if ( sEntityKey.Length > 0 ) sEntityKey.Append(',');
                                    sEntityKey.Append(m_oEntityArray[i].ToString()); 
                                    
                                    }
                                    return sEntityKey.ToString();
                                    }
                                    
                                    public ec dSort()
                                    {
                                    
                                    
                                    vTrim();
                                    ec dRC = ec.ST_SUCCEED;
                                    if (m_oEntityArray != null)
                                    {
                                    SEntity[] oOutPutArray = new SEntity[m_oEntityArray.Length];
                                    ArrayList oInputList = new ArrayList();
                                    oInputList.AddRange(m_oEntityArray);
                                    
                                    for (int i = 0; i < oOutPutArray.Length; i++)
                                    {
                                    P dMinEntity = (P)9999999;
                                    int dCurrentIndex = 0;
                                    for (int j = 0; j < oInputList.Count; j++)
                                    {
                                    if (((SEntity)oInputList[j]).dClass < (P)dMinEntity)
                                    {
                                    if (((SEntity)oInputList[j]).dClass < (P)dMinEntity)
                                    {
                                    dMinEntity = ((SEntity)oInputList[j]).dClass;
                                    dCurrentIndex = j;
                                    }
                                    else if (((SEntity)oInputList[j]).dClass == (P)dMinEntity)
                                    {
                                    dRC = ec.ST_ATTRIBUTE_ENTITY_DUPLICATE;
                                    dCurrentIndex = j;
                                    }
                                    }
                                    }
                                    oOutPutArray[i] = ((SEntity)oInputList[dCurrentIndex]);
                                    oInputList.RemoveAt(dCurrentIndex);
                                    
                                    }
                                    m_oEntityArray = oOutPutArray;
                                    m_bNormalForm = true;
                                    }
                                    return dRC;
                                    }
                                    
                                    static public SEntity oCreateEntity(P dEntityClass, object oInstance)
                                    {
                                    SEntity oAttribute = new SEntity();
                                    oAttribute.dClass = dEntityClass;
                                    oAttribute.Instance = oInstance;
                                    return oAttribute;
                                    }
                                    
                                    static public SEntity[] oGetEntityArray( P dEntityClass, object oInstance)
                                    {
                                    
                                    
                                    return oGetEntityArray(new SEntity(dEntityClass, oInstance));
                                    }
                                    static public SEntity[] oGetEntityArray(SEntity oEntity)
                                    {
                                    SEntity[] oAttributeArray = new SEntity[1];
                                    oAttributeArray[0] = oEntity;
                                    return oAttributeArray;
                                    }
                                    
                                    public void vAppend(SEntity oEntity)
                                    {
                                    SEntity[] oSecondEntityArray;
                                    oSecondEntityArray = new SEntity[1];
                                    oSecondEntityArray[0] = oEntity;
                                    vAppend(oSecondEntityArray);
                                    }
                                    public void vAdd(P dClass, P dInstance)
                                    {
                                    SEntity oSecondEntity = new SEntity(dClass, dInstance);
                                    vAdd(oSecondEntity);
                                    }
                                    public void vAdd(P dClass, int dInstance)
                                    {
                                    SEntity oSecondEntity = new SEntity(dClass, dInstance);
                                    vAdd(oSecondEntity);
                                    }
                                    public void vAppend(SEntity[] oSecondEntityArray)
                                    {
                                    if (oSecondEntityArray != null)
                                    {
                                    ArrayList oSecondEntityArrayList = new ArrayList();
                                    for (int i = 0; i < oSecondEntityArray.Length; i++)
                                    {
                                    oSecondEntityArrayList.Add(oSecondEntityArray[i]);
                                    
                                    }
                                    oSecondEntityArray = (SEntity[])oSecondEntityArrayList.ToArray(typeof(SEntity));
                                    SEntity[] oAttributeArray;
                                    if (m_oEntityArray != null)
                                    {
                                    oAttributeArray = new SEntity[m_oEntityArray.Length + oSecondEntityArray.Length];
                                    for (int i = 0; i < m_oEntityArray.Length; i++)
                                    {
                                    oAttributeArray[i] = m_oEntityArray[i];
                                    }
                                    for (int i = 0; i < oSecondEntityArray.Length; i++)
                                    {
                                    oAttributeArray[m_oEntityArray.Length + i] = oSecondEntityArray[i];
                                    }
                                    
                                    }
                                    else
                                    {
                                    oAttributeArray = oSecondEntityArray;
                                    
                                    }
                                    m_oEntityArray = oAttributeArray;
                                    }
                                    
                                    
                                    if (m_oEntityArray == null) m_oEntityArray = new SEntity[0];
                                    
                                    
                                    m_bNormalForm = false;
                                    }
                                    
                                    
                                    protected int dFindIndex(P dEntityClass)
                                    {
                                    for (int i = 0; i < m_oEntityArray.Length; i++)
                                    {
                                    if (m_oEntityArray[i].dClass == dEntityClass)
                                    {
                                    return i;
                                    }
                                    }
                                    return NOT_USED;
                                    } 
                                    public object oExtract(P dClassName)
                                    {
                                    
                                    int dIndex = dFindIndex(dClassName);
                                    object oInstance = P.NOT_USED;
                                    if (dIndex >= 0)
                                    {
                                    oInstance = m_oEntityArray[dIndex].Instance;
                                    vRemoveAt(dIndex);
                                    }
                                    
                                    return oInstance;
                                    
                                    }
                                    protected void vRemoveAt(int dIndex)
                                    {
                                    SEntity[] oOldArray = m_oEntityArray;
                                    m_oEntityArray = new SEntity[oOldArray.Length - 1];
                                    int j = 0;
                                    for (int i = 0; i < oOldArray.Length; i++)
                                    {
                                    if (i != dIndex)
                                    {
                                    m_oEntityArray[j] = oOldArray[i]; j++;
                                    }
                                    }
                                    
                                    }
                                    public int dFind(P dEntityClass)
                                    {
                                    int dIndex = Convert.ToInt32(oFind(dEntityClass));
                                    return dIndex;
                                    }
                                    
                                    public P pFind(P dEntityClass)
                                    {
                                    P dIndex = (P)oFind(dEntityClass);
                                    return dIndex;
                                    }
                                    public object oFind(P dEntityClass)
                                    {
                                    if (m_bNormalForm == false) dSort();
                                    int dIndex = dFindIndex(dEntityClass);
                                    if (IsUsed(dIndex))
                                    {
                                    return m_oEntityArray[dIndex].Instance;
                                    }
                                    //   }
                                    return P.NOT_USED;
                                    }
                                    
                                    public void vAdd(SEntity oEntity)
                                    {
                                    
                                    for (int i = 0; m_oEntityArray != null && i < m_oEntityArray.Length; i++)
                                    {
                                    if (m_oEntityArray[i].dClass == oEntity.dClass)
                                    {
                                    m_oEntityArray[i].Instance = oEntity.Instance;
                                    return;
                                    }
                                    }
                                    vAppend(oEntity);
                                    }
                                    
                                    public void vAdd(SEntity[] oEntityArray2)
                                    {
                                    for (int i = 0; oEntityArray2 != null && i < oEntityArray2.Length; i++)
                                    {
                                    vAdd(oEntityArray2[i]);
                                    }
                                    
                                    }
                                    public void vAdd(string sAddress)
                                    {
                                    
                                    
                                    ArrayList dEntityArrayList = new ArrayList();
                                    
                                    string sKeyword = "";
                                    string sClass = "";
                                    for (int i = 0; i < sAddress.Length; i++)
                                    {
                                    char cChar = sAddress[i];
                                    if (cChar.ToString() == IDENTIFIER_PROPERTY_SEPARATOR || i == sAddress.Length - 1)
                                    {
                                    if (i == sAddress.Length - 1) sKeyword += cChar;
                                    SEntity oEntity = new SEntity();
                                    try
                                    {
                                    
                                    oEntity.vSetInstanceFromTypeAndIntegerString(sKeyword);
                                    
                                    if (sClass == "")
                                    {
                                    oEntity.dClass = P.IDENTIFIER;
                                    
                                    
                                    }
                                    else
                                    {
                                    oEntity.dClass = (P)Convert.ToInt32(sClass);
                                    }
                                    
                                    dEntityArrayList.Add(oEntity);
                                    }
                                    catch
                                    {
                                    oEntity.Instance = P.CONVERTION_FAILED;
                                    }
                                    
                                    sClass = sKeyword = "";
                                    }
                                    else if (cChar == '=')
                                    {
                                    sClass = sKeyword; sKeyword = "";
                                    }
                                    else
                                    {
                                    sKeyword += cChar;
                                    }
                                    
                                    }
                                    
                                    vAppend((SEntity[])dEntityArrayList.ToArray(typeof(SEntity)));
                                    
                                    }
                                    
                                    }
                                    
                                    ///------------------------------------------------------------------------------------------------------------------------
                                    
                                    public class CCommandContext : CDbEPBase
                                    {
                                    public CCommandContext()
                                    {
                                    m_oVariableMap = new SortedList();
                                    vClear();
                                    }
                                    public void vClear()
                                    {
                                    m_iSender = m_iMember = m_iOrganisation = NOT_USED_SINDEX;
                                    dLanguage = P.ENGLISH;
                                    m_oVariableMap.Clear();
                                    }
                                    SortedList m_oVariableMap;
                                    	
                                    SIndex m_iSender;
                                    SIndex m_iMember;
                                    public SIndex m_iOrganisation;
                                    public P  dLanguage;
                                    public SIndex SenderIndex
                                    {
                                    get {
                                    return m_iSender;
                                    }
                                    set
                                    {
                                    if (IsNotUsed(value.dSubIndex))
                                    {
                                    if (IsUsed(m_iSender))
                                    {
                                    m_iSender.dSubIndex = PUBLIC_PROFILE_SUB_INDEX;
                                    }
                                    }
                                    else
                                    {
                                    m_iSender = value;
                                    }
                                    }
                                    }
                                    public SIndex MemberIndex
                                    {
                                    get
                                    {
                                    return m_iMember;
                                    }
                                    set
                                    {
                                    m_iMember = value;
                                    
                                    } 
                                    }
                                    /*
                                    public SIndex AvatarIndex
                                    {
                                    get
                                    {
                                    return m_iSender;
                                    }
                                    set
                                    {
                                    if (m_iSender.dIndex == value.dIndex)
                                    {
                                    m_iSender = value;
                                    }
                                    
                                    }
                                    }*/
                                    public void vSet(CCommandLine oCommandLine) {
                                    m_iMember = oCommandLine.MemberIndex;
                                    m_iSender = oCommandLine.SenderIndex;
                                    m_iOrganisation = oCommandLine.OrganisationIndex;
                                    dLanguage = oCommandLine.Language;
                                    }
                                    public void vAdd(string sVariableName, CIdentifier oIdentifier)
                                    {
                                    			if ( sVariableName.Substring(0,1) == "$" ) 
                                    			{
                                    				sVariableName = sVariableName.Substring(1);
                                    			}
                                    			m_oVariableMap.Remove(sVariableName);
                                    m_oVariableMap.Add(sVariableName, oIdentifier);
                                    }
                                    public void vAdd(string sVariableName, CCommandLine oCommandLine)
                                    {
                                    			if ( sVariableName.Substring(0,1) == "$" ) 
                                    			{
                                    				sVariableName = sVariableName.Substring(1);
                                    			}
                                    m_oVariableMap.Add(sVariableName, oCommandLine);
                                    }
                                    
                                    		public void vAdd(string sVariableName,  CMemeArray oMemeArray) 
                                    		{
                                    			if ( sVariableName.Substring(0,1) == "$" ) 
                                    			{
                                    				sVariableName = sVariableName.Substring(1);
                                    			}
                                    			m_oVariableMap.Add(sVariableName,oMemeArray);
                                    
                                    		}
                                    
                                    		public  CMemeArray  maGetVariable(string sVariableName)
                                    		{
                                    
                                    			return (CMemeArray)oGetVariable( sVariableName, typeof(CMemeArray));
                                    		}
                                    
                                    		public CIdentifier idGetVariable(string sVariableName)
                                    		{
                                    
                                    			return (CIdentifier)oGetVariable( sVariableName, typeof(CIdentifier));
                                    		}
                                    
                                    		public string sGetVariable(string sVariableName)
                                    		{
                                    
                                    			return (string)oGetVariable( sVariableName, typeof(string));
                                    		}
                                    
                                    		public object oGetVariable(string sVariableName, Type oCastType)
                                    		{
                                    			if ( sVariableName != null && sVariableName.Substring(0,1) == "$" ) 
                                    			{
                                    				sVariableName = sVariableName.Substring(1);
                                    				if (m_oVariableMap.Contains(sVariableName) == false || m_oVariableMap[sVariableName].GetType() != oCastType)
                                    				{
                                    					return null;
                                    				}
                                    				if ( m_oVariableMap[sVariableName].GetType() == oCastType) 
                                    				{
                                    					return m_oVariableMap[sVariableName];
                                    				}
                                    			}
                                    			return null;
                                    		}
                                    
                                    
                                    		public CCommandLine clGetVariable(string sVariableName)
                                    {
                                    
                                    			return (CCommandLine)oGetVariable( sVariableName, typeof(CCommandLine));
                                    }
                                    public string csDump()
                                    {
                                    			string sOutput = "Sender:" + m_iSender.ToString() + " Member:" + m_iMember.ToString() + " Organisation:" + m_iOrganisation.ToString()
                                    + " Language:" + dLanguage + "\nDict: ";
                                    	 
                                    			foreach(DictionaryEntry oVariableEntry in m_oVariableMap) 
                                    			{
                                    
                                    				sOutput += oVariableEntry.Key.ToString() + ":";
                                    				if ( oVariableEntry.Value.GetType() == typeof(CCommandLine)) {
                                    					sOutput += ((CCommandLine)oVariableEntry.Value).csDump() + "\n";
                                    				}
                                    				else if ( oVariableEntry.Value.GetType() == typeof(CIdentifier)) 
                                    				{
                                    					sOutput += ((CIdentifier)oVariableEntry.Value).csDump()+ "\n";
                                    				}
                                    				else {
                                    					sOutput += oVariableEntry.Value.ToString() + "\n";
                                    				}
                                    
                                    			}
                                    			return sOutput;
                                    }
                                    
                                    }
                                    ///------------------------------------------------------------------------------------------------------------------------
                                    public class CEmailCommand
                                    {
                                    
                                    public CEmailCommand(CDbEPBase.P dLanguage, CDbEPBase.P dCommand, string sEntityName, string csEntityContent, string csOption)
                                    {
                                    m_dLanguage = dLanguage;
                                    m_dCommand = dCommand;
                                    m_sEntityName = sEntityName;
                                    m_csEntityContent = csEntityContent;
                                    m_csOptionString = csOption;
                                    }
                                    CDbEPBase.P m_dLanguage;
                                    public CDbEPBase.P m_dCommand;
                                    public string m_csOptionString, m_csEntityContent, m_sEntityName;
                                    /*
                                    public bool bHasOption(string csOptionName)
                                    {
                                    return CCommandManager.bHasOption(csOptionName, m_csOptionString);
                                    }
                                    
                                    */
                                    public string Synopsis
                                    {
                                    get
                                    {
                                    return m_dCommand.ToString() + ' ' + m_sEntityName + " " + m_csEntityContent + " " + m_csOptionString;
                                    }
                                    }
                                    
                                    public string csDump()
                                    {
                                    string csDump = "command:" + m_dCommand.ToString() + " entity:" + m_sEntityName;
                                    csDump += "  m_csOptionString: " + m_csOptionString + " m_csEntityContent:" + m_csEntityContent;
                                    return csDump;
                                    }
                                    
                                    }
                                    ///-------------------------------------------------------------------------------------------------------------------
                                    
                                    
                                    public class CCommandLine : CDbEPBase
                                    {
                                    public CCommandLine(P dCommand, P dExecutedEntity, ref CCommandContext oCommandContext)
                                    {
                                    vClear();
                                    m_dCommand = dCommand;
                                    ExecutedEntity = dExecutedEntity;
                                    m_oCommandContext = oCommandContext;
                                    
                                    }
                                    public CCommandLine(ref CCommandContext oCommandContext)
                                    {
                                    vClear();
                                    m_oCommandContext = oCommandContext;
                                    }
                                    CCommandContext m_oCommandContext;
                                    ArrayList m_oErrorCode;
                                    
                                    
                                    public CCommandContext CommandContext
                                    {
                                    get
                                    {
                                    return m_oCommandContext;
                                    }
                                    }
                                    
                                    public void vClear()
                                    {
                                    m_dCommand = P.NOT_USED;
                                    ExecutedEntity = P.NOT_USED;
                                    m_oOptionList = new SortedList();
                                    m_sContentText= m_sContentName = null;
                                    
                                    m_oErrorCode = new ArrayList();
                                    }
                                    P m_dCommand;
                                    P m_dExecutedEntity;
                                    string m_sContentName, m_sContentText; 
                                    
                                    			public bool bIsAVariable
                                    			{
                                    				get 
                                    				{
                                    					return m_sContentName != null &&  m_sContentName.Substring(0,1)== "$";
                                    				}
                                    			}
                                    
                                    public CIdentifier ContentIdentifier
                                    {
                                    get
                                    {
                                    					 CIdentifier idContentIdentifier=null;
                                    					if ( bIsAVariable ) 
                                    					{
                                    						idContentIdentifier= m_oCommandContext.idGetVariable(m_sContentName);
                                    						/*if ( idContentIdentifier== null && ContentCommandLine != null) 
                                    						{
                                    							CTrace.i().vWriteLn(ENMessage.Trace, "ContentCommandLine = " + ContentCommandLine.csDump() );
                                    							idContentIdentifier= ContentCommandLine.ContentIdentifier;
                                    
                                    						}*/
                                    					}
                                    if ( idContentIdentifier == null) idContentIdentifier = idFind(m_dExecutedEntity);
                                    return idContentIdentifier;
                                    }
                                    set
                                    {
                                    EPAssert(m_sContentName == null, "m_sContentName should be null");
                                    //  EPAssert(IsNotUsed(m_oContentIndex), "m_oContentIndex should be not be used");
                                    if (value.GetType() == typeof(CIdentifier))
                                    {
                                    
                                    this.vAdd(m_dExecutedEntity, (CIdentifier)value);
                                    }
                                    else
                                    {
                                    }
                                    }
                                    }
                                    public SIndex ContentIndex
                                    {
                                    get
                                    {
                                    if (IsNotUsed(m_dExecutedEntity) || m_dExecutedEntity== P.FUNCTION)
                                    {
                                    return NOT_USED_SINDEX;
                                    }
                                    SIndex oIndex =  iFind(m_dExecutedEntity);
                                    					return oIndex;
                                    }
                                    set
                                    {
                                    EPAssert(ContentIdentifier == null ||   ContentIdentifier.bIsEmpty, "ContentIdentifier should not be used");
                                    EPAssert(m_sContentName == null, "m_sContentName should be null");
                                    
                                    
                                    vAdd(m_dExecutedEntity, value);
                                    
                                    
                                    
                                    }
                                    }
                                    
                                    public CCommandLine ContentCommandLine
                                    {
                                    get
                                    {
                                    if (IsNotUsed(m_dExecutedEntity))
                                    {
                                    return null;
                                    }
                                    					if (bIsAVariable) 
                                    					{
                                    						return m_oCommandContext.clGetVariable(m_sContentName);
                                    					}
                                    					return null;
                                    
                                    }
                                    				/*set
                                    {
                                    EPAssert(ContentIdentifier == null || ContentIdentifier.bIsEmpty, "ContentIdentifier should not be used");
                                    EPAssert(m_sContentName != null, "m_sContentName should not be null " + m_sContentName);
                                    
                                    
                                    vAdd(PFUNCTION, value);
                                    
                                    
                                    
                                    } */
                                    } 
                                    
                                    		public void vAddFunctionAndCommandLine(string sVariableEntityName, CCommandLine oVariableCommandLine) 
                                    		{
                                    			CTrace.i().vWriteLn(ENMessage.Function, " vAddFunctionAndCommandLine sVariableEntityName= " + sVariableEntityName + " oVariableCommandLine
                                    = " + oVariableCommandLine.csDump() );
                                    			if (sVariableEntityName.Substring(0,1) != "$" ) {
                                    				m_sContentName = "$" + sVariableEntityName;
                                    			}
                                    			else {
                                    				m_sContentName = sVariableEntityName;
                                    			}
                                    			CommandContext.vAdd(m_sContentName, oVariableCommandLine);
                                    			CTrace.i().vWriteLn(ENMessage.Function, "CommandContext = " +  CommandContext.csDump() );
                                    		}
                                    
                                    	
                                    public string ContentName
                                    {
                                    get
                                    {
                                    CIdentifier idContentIdentifier = ContentIdentifier;
                                    if (idContentIdentifier != null && idContentIdentifier.bIsEmpty == false )
                                    {
                                    return ContentIdentifier.ToString();
                                    }
                                    else
                                    {
                                    
                                    		
                                    return m_sContentName;
                                    }
                                    }
                                    set
                                    {
                                    EPAssert(ContentIdentifier == null ||   ContentIdentifier.bIsEmpty, "ContentIdentifier should be null");
                                    //   EPAssert(IsNotUsed(m_oContentIndex), "m_oContentIndex should be not be used");
                                    
                                    
                                    CDbEPBase.dGetEquation(value, out m_sContentName, out m_sContentText);
                                    
                                    }
                                    }
                                    
                                    public string ContentText
                                    {
                                    get
                                    {
                                    if (m_sContentText == "")
                                    {
                                    m_sContentText = null;
                                    }
                                    return m_sContentText;
                                    
                                    }
                                    set
                                    {
                                    m_sContentText = value;
                                    }
                                    
                                    }
                                    public SIndex NoodIndex
                                    {
                                    get
                                    {
                                    SIndex oIndex = iFind(P.PARENT);
                                    if (IsNotUsed(oIndex))
                                    {
                                    if (bIsA(ExecutedEntity, P.AVATAR))
                                    {
                                    
                                    oIndex = SenderIndex;
                                    oIndex.dSubIndex = CDbEPBase.PUBLIC_PROFILE_SUB_INDEX;
                                    if (oIndex.dSubIndex == CDbEPBase.PRIVATE_PROFILE_SUB_INDEX)
                                    {
                                    oIndex.dSubIndex = CDbEPBase.PUBLIC_PROFILE_SUB_INDEX;
                                    }
                                    }
                                    }
                                    return oIndex;
                                    }
                                    
                                    }
                                    
                                    public P AttributeClass
                                    {
                                    get
                                    {
                                    P dAttributeClass;
                                    
                                    
                                    if (IsUsed( OrganisationIndex))
                                    {
                                    if (IsUsed( MemberIndex) &&  IsMemberEqualSender == false)
                                    {
                                    if ( OrganisationIndex.dSubIndex == ORGANISATION_ROOT_SUB_INDEX)
                                    {
                                    dAttributeClass = P.MEMBER_IN_ORGANISATION_ATTRIBUTE;
                                    }
                                    else
                                    {
                                    dAttributeClass = P.MEMBER_IN_COMMITTEE_ATTRIBUTE;
                                    }
                                    }
                                    else
                                    {
                                    if ( OrganisationIndex.dSubIndex == ORGANISATION_ROOT_SUB_INDEX)
                                    {
                                    dAttributeClass = P.ORGANISATION_ATTRIBUTE;
                                    }
                                    else
                                    {
                                    dAttributeClass = P.COMMITTEE_ATTRIBUTE;
                                    }
                                    
                                    }
                                    }
                                    else if ( ExecutedEntity == P.MEMBER_ATTRIBUTE)
                                    {
                                    dAttributeClass = P.MEMBER_ATTRIBUTE;
                                    }
                                    else if (bIsA(ExecutedEntity, P.ATTRIBUTE))
                                    {
                                    dAttributeClass = P.PROFILE_ATTRIBUTE;
                                    }
                                    else {
                                    dAttributeClass = P.NOT_USED;
                                    }
                                    
                                    return dAttributeClass;
                                    }
                                    
                                    }
                                    
                                    
                                    
                                    public string Comment
                                    {
                                    get
                                    {
                                    
                                    return sFind(P.COMMENT);
                                    }
                                    set
                                    {
                                    //  EPAssert(m_sContentName != null || idFind(P.IDENTIFIER_NEW_OBJECT) != null, "m_sContentName should be filled up");
                                    vAdd(P.COMMENT, value);
                                    }
                                    }
                                    
                                    
                                    SortedList m_oOptionList;
                                    
                                    public SortedList GetSortedList()
                                    {
                                    return m_oOptionList;
                                    }
                                    public void vClear(P dOption)
                                    {
                                    
                                    m_oOptionList.Remove(dOption);
                                    
                                    }
                                    public void vAdd(P dOption, SIndex oIndex) {
                                    /*  if (dOption == P.MEMBER)
                                    {
                                    Debug.Write(" P.MEMBER");
                                    }*/
                                    if (IsUsed(dOption) && IsUsed(oIndex))
                                    {
                                    m_oOptionList.Remove(dOption);
                                    m_oOptionList.Add(dOption, oIndex);
                                    }
                                    }
                                    public void vAdd(P dOption, int dIndex)
                                    {
                                    if (IsUsed(dOption) && IsUsed(dIndex))
                                    {
                                    m_oOptionList.Remove(dOption);
                                    m_oOptionList.Add(dOption, dIndex);
                                    }
                                    }
                                    public void vAdd(P dOption, string sText)
                                    {
                                    if (IsUsed(dOption) && sText != null && sText != "")
                                    {
                                    m_oOptionList.Remove(dOption);
                                    m_oOptionList.Add(dOption, sText);
                                    }
                                    }
                                    public void vAdd(P dOption, P dEntity)
                                    {
                                    if (IsUsed(dOption) && IsUsed(dEntity))
                                    {
                                    m_oOptionList.Remove(dOption);
                                    m_oOptionList.Add(dOption, dEntity);
                                    }
                                    }
                                    
                                    public void vAdd(P dOption, CEntityArray oEntityArray)
                                    {
                                    if (IsUsed(dOption) && oEntityArray != null)
                                    {
                                    m_oOptionList.Remove(dOption);
                                    m_oOptionList.Add(dOption, oEntityArray);
                                    }
                                    }
                                    
                                    
                                    public void vAdd(P dOption, CIdentifier oIdentifier)
                                    {
                                    if (IsUsed(dOption) && oIdentifier != null)
                                    {
                                    m_oOptionList.Remove(dOption);
                                    m_oOptionList.Add(dOption, oIdentifier);
                                    }
                                    }
                                    public void vAdd(P dOption, CCommandLine oCommandLine)
                                    {
                                    
                                    if (IsUsed(dOption) && oCommandLine != null)
                                    {
                                    
                                    m_oOptionList.Remove(dOption);
                                    m_oOptionList.Add(dOption, oCommandLine);
                                    
                                    }
                                    
                                    }
                                    
                                    public void vAppend(P dOption, CEntityArray oEntityArray)
                                    {
                                    CEntityArray oCurrentEntityArray = eaFind(dOption);
                                    if (IsUsed(dOption) && oCurrentEntityArray != null)
                                    {
                                    oCurrentEntityArray.vAppend(oEntityArray.EntityExtraArray);
                                    m_oOptionList.Remove(dOption);
                                    m_oOptionList.Add(dOption, oCurrentEntityArray);
                                    
                                    }
                                    else
                                    {
                                    m_oOptionList.Add(dOption, oEntityArray);
                                    }
                                    }
                                    public void vAppend(P dOption, SEntity  oEntity)
                                    {
                                    CEntityArray oCurrentEntityArray = eaFind(dOption);
                                    
                                    if (IsUsed(dOption) && oCurrentEntityArray != null)
                                    {
                                    m_oOptionList.Remove(dOption);
                                    oCurrentEntityArray.vAppend(oEntity);
                                    
                                    }
                                    else
                                    {
                                    m_oOptionList.Add(dOption, new CEntityArray(oEntity));
                                    }
                                    }
                                    public void vAdd(P dOption, bool bBoolean)
                                    {
                                    if (IsUsed(dOption))
                                    {
                                    m_oOptionList.Remove(dOption);
                                    m_oOptionList.Add(dOption, bBoolean);
                                    }
                                    }
                                    
                                    public bool bIsA(P dEntity, P dEntityBase)
                                    {
                                    return CEntityManager.Instance(P.ENGLISH).bIsA(dEntity, dEntityBase);
                                    }         
                                    
                                    
                                    public object oFind(P dOption, out P dType)
                                    {
                                    
                                    dType = P.NOT_USED;
                                    object oIndex = null;
                                    if (IsNotUsed(dOption))
                                    {
                                    return null;
                                    }
                                    else if (m_oOptionList.ContainsKey(dOption))
                                    {
                                    dType = CEntityManager.Instance(P.ENGLISH).dGetType(dOption);
                                    if (dType == P.EXECUTED_ENTITY_TYPE)
                                    {
                                    dType = CEntityManager.Instance(P.ENGLISH).dGetType(m_dExecutedEntity);
                                    }
                                    
                                    		 
                                    if (bIsA(dType, P.SINDEX_TYPE))
                                    {
                                    oIndex = ((SIndex)m_oOptionList[dOption]);
                                    }
                                    else if (bIsA(dType, P.INTEGER_TYPE))
                                    {
                                    oIndex = ((int)m_oOptionList[dOption]);
                                    }
                                    else if (bIsA(dType, P.ENTITY_ITEM_ARRAY_TYPE))
                                    {
                                    oIndex = ((P[])m_oOptionList[dOption]);
                                    }
                                    else if (bIsA(dType, P.COMMAND_LINE_TYPE))
                                    {
                                    oIndex = (CCommandLine)m_oOptionList[dOption];
                                    }
                                    else if (bIsA(dType, P.P_TYPE))
                                    {
                                    oIndex = ((P)m_oOptionList[dOption]);
                                    }
                                    else if (bIsA(dType, P.STRING_TYPE))
                                    {
                                    oIndex = m_oOptionList[dOption].ToString();
                                    }
                                    else if (bIsA(dType, P.IDENTIFIER_TYPE))
                                    {
                                    oIndex = ((CIdentifier)m_oOptionList[dOption]);
                                    }
                                    else if ( bIsA(dType, P.ENTITY_ARRAY_TYPE))
                                    {
                                    oIndex =  ((CEntityArray)m_oOptionList[dOption]);
                                    }
                                    }
                                    else if (dOption == P.MEMBER_PROFILE)
                                    {
                                    oIndex = (int)MemberIndex.dIndex;
                                    dType = CEntityManager.Instance(P.ENGLISH).dGetType(dOption);
                                    }
                                    else if (dOption == P.PROFILE)
                                    {
                                    oIndex = (int)MemberIndex.dIndex;
                                    dType = CEntityManager.Instance(P.ENGLISH).dGetType(dOption);
                                    }
                                    /*    else if (dOption == P.AUTHOR)
                                    {
                                    oIndex = AuthorIndex.dIndex;
                                    dType = P.PROFILE_INDEX_TYPE;
                                    }*/
                                    else
                                    
                                    if (oIndex == null)
                                    {
                                    
                                    if (dOption == P.SENDER)
                                    {
                                    oIndex = m_oCommandContext.SenderIndex;
                                    }
                                    
                                    else if (dOption == P.ORGANISATION)
                                    {
                                    oIndex = m_oCommandContext.m_iOrganisation.dIndex;
                                    }
                                    else if (dOption == P.COMMITTEE)
                                    {
                                    oIndex = m_oCommandContext.m_iOrganisation;
                                    }
                                    else if (dOption == P.MEMBER)
                                    {
                                    oIndex = m_oCommandContext.MemberIndex;
                                    }
                                    else if (dOption == P.MEMBER_PROFILE)
                                    {
                                    oIndex = m_oCommandContext.MemberIndex.dIndex;
                                    }
                                    
                                    else if (dOption == P.PROFILE)
                                    {
                                    oIndex = m_oCommandContext.SenderIndex.dIndex;
                                    
                                    }
                                    else if (dOption == P.LANGUAGE )
                                    {
                                    oIndex = m_oCommandContext.dLanguage;
                                    }
                                    if (oIndex != null)
                                    {
                                    dType = CEntityManager.Instance(P.ENGLISH).dGetType(dOption);
                                    CTrace.i().vWriteLn(ENMessage.CommandParsing, " oFind dType = " + dType);
                                    }
                                    
                                    }
                                    
                                    return oIndex;
                                    
                                    }
                                    public P[] peFind(P dOption) {
                                    
                                    P dType;
                                    object oInstance = oFind(dOption, out dType);
                                    EPAssert(oInstance == null || IsNotUsed(dType) || bIsA(dType, P.ENTITY_ITEM_ARRAY_TYPE), " xxFind The type is not a ENTITY_ITEM_ARRAY_TYPE
                                    dType= " + dType);
                                    if (bIsA(dType, P.ENTITY_ITEM_ARRAY_TYPE))
                                    {
                                    return (P[])oInstance;
                                    }
                                    return null;
                                    
                                    }
                                    
                                    public CCommandLine clFind(P dOption)
                                    {
                                    
                                    P dType;
                                    object oInstance = oFind(dOption, out dType);
                                    EPAssert(oInstance == null || IsNotUsed(dType) || bIsA(dType, P.COMMAND_LINE_TYPE), " xxFind The type is not a CComandLineType
                                    dType= " + dType);
                                    
                                    if (bIsA(dType, P.COMMAND_LINE_TYPE))
                                    {
                                    return (CCommandLine)oInstance;
                                    }
                                    
                                    return null;
                                    }
                                    public SIndex iFind(P dOption)
                                    {
                                    
                                    P dType;
                                    object oInstance = oFind(dOption, out dType);
                                    EPAssert(oInstance == null || IsNotUsed(dType) || bIsA(dType, P.SINDEX_TYPE) || bIsA(dType, P.ORGANISATION_INDEX_TYPE), "
                                    xxFind The type is not a ENTITY_ITEM_ARRAY_TYPE dType= " + dType);
                                    
                                    if (bIsA(dType, P.SINDEX_TYPE))
                                    {
                                    return (SIndex)oInstance;
                                    }
                                    else if (bIsA(dType, P.ORGANISATION_INDEX_TYPE))
                                    {
                                    return new SIndex((int)oInstance, ORGANISATION_ROOT_SUB_INDEX);
                                    }
                                    
                                    return NOT_USED_SINDEX;
                                    }
                                    
                                    public P pFind(P dOption)
                                    {
                                    
                                    P dType;
                                    object oInstance = oFind(dOption, out dType);
                                    EPAssertMessage(oInstance == null || bIsA(dType, P.P_TYPE), " xxFind The type is not a P_TYPE dType= " + dType);
                                    
                                    if (bIsA(dType, P.P_TYPE))
                                    {
                                    return (P)oInstance;
                                    }
                                    return P.NOT_USED;
                                    }
                                    
                                    
                                    public string sFind(P dOption)
                                    {
                                    
                                    P dType;
                                    object oInstance = oFind(dOption, out dType);
                                    EPAssert(oInstance == null || bIsA(dType, P.STRING_TYPE), " xxFind The type is not a STRING_TYPE dType= " + dType);
                                    
                                    if (bIsA(dType, P.STRING_TYPE))
                                    {
                                    return oInstance.ToString();
                                    }
                                    return null;
                                    }
                                    
                                    
                                    
                                    
                                    public CIdentifier idFind(P dOption)
                                    {
                                    P dType;
                                    object oInstance = oFind(dOption, out dType);
                                    
                                    
                                    if (bIsA(dType, P.IDENTIFIER_TYPE))
                                    {
                                    return (CIdentifier)oInstance;
                                    }
                                    return null;
                                    }
                                    
                                    
                                    
                                    public CEntityArray eaFind(P dOption)
                                    {
                                    P dType;
                                    object oInstance = oFind(dOption, out dType);
                                    EPAssert(IsNotUsed(dType) || bIsA(dType, P.ENTITY_ARRAY_TYPE), " xxFind The type is not a ENTITY_ARRAY_TYPE dType= " + dType);
                                    if (bIsA(dType, P.ENTITY_ARRAY_TYPE))
                                    {
                                    return (CEntityArray)oInstance;
                                    }
                                    return null;
                                    }
                                    
                                    P m_dEntityParameterNotExisting;
                                    public  ec dExtract(P[] oParameter, out CEntityArray ea)
                                    {
                                    
                                    ec dRet= ec.ST_SUCCEED;
                                    
                                    
                                    ea = new CEntityArray();
                                    if (oParameter != null)
                                    {
                                    for (int i = 0; i < oParameter.Length; i++)
                                    {
                                    P dType;
                                    object oInstance;
                                    /*    if (oParameter[i] == P.AUTHOR )
                                    {
                                    oInstance = AuthorIndex.dIndex;
                                    dType = P.PROFILE_INDEX_TYPE;
                                    }
                                    else
                                    { */
                                    oInstance = oFind(oParameter[i], out dType);
                                    //}
                                    if (oInstance != null)
                                    {
                                    ea.vAppend(new SEntity(oParameter[i], oInstance));
                                    }
                                    else
                                    {
                                    m_dEntityParameterNotExisting = oParameter[i];
                                    dRet = ec.ST_ATTRIBUTE_THE_PARAMETER_IS_MISSING_FROM_THE_COMMAND_LINE;
                                    CTrace.i().vWriteLn(ENMessage.Error, " Missing parameter from command line " + m_dEntityParameterNotExisting.ToString() +
                                    " in " + csDump());
                                    }
                                    
                                    }
                                    }
                                    if (ea.Length == 0)
                                    {
                                    ea = null;
                                    }
                                    return dRet;
                                    
                                    
                                    }
                                    
                                    
                                    
                                    
                                    public bool bHasOption(P dOption)
                                    {
                                    
                                    if (m_oOptionList.ContainsKey(dOption))
                                    {
                                    P dType = CEntityManager.Instance(P.ENGLISH).dGetType(dOption);
                                    if (dType == P.EXECUTED_ENTITY_TYPE)
                                    {
                                    dType = CEntityManager.Instance(P.ENGLISH).dGetType(m_dExecutedEntity);
                                    }
                                    if (dType == P.BOOLEAN_TYPE)
                                    {
                                    return (bool)m_oOptionList[dOption];
                                    }
                                    else
                                    {
                                    return true;
                                    }
                                    
                                    }
                                    return false;
                                    }
                                    
                                    public SIndex SenderIndex
                                    {
                                    get
                                    {
                                    SIndex iIndex = iFind(P.SENDER);
                                    if (IsNotUsed(iIndex))
                                    {
                                    iIndex = this.m_oCommandContext.SenderIndex;
                                    }
                                    CTrace.i().vWriteLn(ENMessage.CommandManagerDetail, "Get SenderIndex = " + iIndex);
                                    return iIndex;
                                    }
                                    set
                                    {
                                    if (IsNotUsed(value.dSubIndex))
                                    {
                                    SenderProfileSubIndex = PUBLIC_PROFILE_SUB_INDEX;
                                    }
                                    else
                                    {
                                    vAdd(P.SENDER, value);
                                    }
                                    CTrace.i().vWriteLn(ENMessage.CommandManager, "Set SenderIndex = " + value);
                                    
                                    
                                    }
                                    }
                                    public SIndex AuthorIndex
                                    {
                                    get
                                    {
                                    SIndex iIndex = iFind(P.AUTHOR);
                                    if (IsNotUsed(iIndex))
                                    {
                                    if (IsNotUsed(iIndex))
                                    {
                                    CIdentifier oIdentifier = idFind(P.IDENTIFIER);
                                    if (oIdentifier != null)
                                    {
                                    iIndex.dIndex = oIdentifier.AuthorIndex;
                                    iIndex.dSubIndex = PUBLIC_PROFILE_SUB_INDEX;
                                    
                                    }
                                    }
                                    }
                                    
                                    /*   if (IsNotUsed(iIndex))
                                    {
                                    iIndex = SenderIndex;
                                    }*/
                                    return iIndex;
                                    
                                    }
                                    
                                    set
                                    {
                                    
                                    vAdd(P.AUTHOR, value);
                                    
                                    } 
                                    }
                                    
                                    public SIndex OrganisationIndex
                                    {
                                    get
                                    {
                                    SIndex oCommitteeIndex = iFind(P.COMMITTEE);
                                    if (IsNotUsed(oCommitteeIndex))
                                    {
                                    P dType;
                                    object oIndex = oFind(P.ORGANISATION, out dType);
                                    if ( bIsA(dType, P.ORGANISATION_INDEX_TYPE)) {
                                    oCommitteeIndex.dIndex = (int)oIndex;
                                    oCommitteeIndex.dSubIndex = ORGANISATION_ROOT_SUB_INDEX;
                                    }
                                    }
                                    if (IsNotUsed(oCommitteeIndex))
                                    {
                                    oCommitteeIndex=this.m_oCommandContext.m_iOrganisation;
                                    }
                                    
                                    return oCommitteeIndex;
                                    }
                                    set
                                    {
                                    if (value.dSubIndex == ORGANISATION_ROOT_SUB_INDEX)
                                    {
                                    vAdd(P.ORGANISATION, value.dIndex);
                                    }
                                    else
                                    {
                                    
                                    vAdd(P.COMMITTEE, value);
                                    }
                                    
                                    }
                                    }
                                    
                                    public bool IsMemberEqualSender
                                    {
                                    get {
                                    return MemberIndex.dIndex == SenderIndex.dIndex;
                                    }
                                    }
                                    
                                    
                                    public SIndex MemberIndex
                                    {
                                    get
                                    {
                                    SIndex iIndex = iFind(P.MEMBER);
                                    if (IsNotUsed(iIndex))
                                    {
                                    iIndex=this.m_oCommandContext.MemberIndex;
                                    }
                                    return iIndex;
                                    }
                                    set
                                    {
                                    
                                    vAdd(P.MEMBER, value);
                                    
                                    } 
                                    }
                                    /*
                                    public SIndex AvatarIndex
                                    {
                                    get
                                    {
                                    return iFind(P.AVATAR);
                                    
                                    }
                                    set
                                    {
                                    SIndex oAvatarIndex = value;
                                    if (oAvatarIndex.dIndex == SenderIndex.dIndex)
                                    {
                                    SenderIndex = value;
                                    vAdd(P.AVATAR, value);
                                    }
                                    else
                                    {
                                    vAdd(P.MEMBER, value);
                                    }
                                    
                                    }
                                    }
                                    * */
                                    public int SenderProfileSubIndex
                                    {
                                    get
                                    {
                                    return iFind(P.SENDER).dSubIndex;
                                    }
                                    set
                                    {
                                    SIndex oSenderIndex = SenderIndex;
                                    if (IsUsed(value) && IsUsed(oSenderIndex))
                                    {
                                    
                                    oSenderIndex.dSubIndex = value;
                                    vAdd(P.SENDER, oSenderIndex);
                                    }
                                    }
                                    }
                                    
                                    
                                    
                                    
                                    public P ExecutedEntity
                                    {
                                    get
                                    {
                                    if (IsUsed(m_dExecutedEntity))
                                    {
                                    return m_dExecutedEntity;
                                    }
                                    return P.IDENTIFIER;
                                    }
                                    set
                                    {
                                    m_dExecutedEntity = value;
                                    
                                    }
                                    }
                                    
                                    public P Command
                                    {
                                    get
                                    {
                                    
                                    return m_dCommand;
                                    }
                                    set
                                    {
                                    m_dCommand = value;
                                    }
                                    }
                                    
                                    
                                    
                                    public P AttributeType
                                    {
                                    get
                                    {
                                    
                                    
                                    P dAttributeType = pFind(P.TYPE);
                                    if (IsNotUsed(dAttributeType))
                                    {
                                    dAttributeType = CEntityManager.Instance(P.ENGLISH).dGetType(m_dExecutedEntity);
                                    if (dAttributeType == P.ATTRIBUTE_TYPE || bIsA(m_dExecutedEntity, P.ATTRIBUTE) )
                                    {
                                    dAttributeType = P.STRING_TYPE;
                                    }
                                    }
                                    return dAttributeType;
                                    }
                                    set
                                    {
                                    vAdd(P.TYPE, (P)value);
                                    }
                                    }
                                    
                                    public P  Language
                                    {
                                    get
                                    {
                                    
                                    
                                    return pFind(P.LANGUAGE);
                                    }
                                    set
                                    {
                                    vAdd(P.LANGUAGE, (P)value);
                                    }
                                    }
                                    public Type ContentType
                                    {
                                    get
                                    {
                                    if (ContentIdentifier != null && ContentIdentifier.bIsEmpty== false)
                                    {
                                    return typeof(CIdentifier);
                                    }
                                    else if (IsUsed(ContentIndex))
                                    {
                                    return typeof(SIndex);
                                    }
                                    else if (ContentCommandLine != null)
                                    {
                                    return typeof(CCommandLine);
                                    }
                                    else {
                                    return typeof(string);
                                    }
                                    }
                                    }
                                    public void vAdd(object oEvent, ec ecErrorCode)
                                    {
                                    if (ecErrorCode != ec.ST_SUCCEED && ecErrorCode != ec.ST_NOT_USED)
                                    {
                                    m_oErrorCode.Add(new ENErrorEvent(oEvent, ecErrorCode));
                                    }
                                    }
                                    public void vAdd(ENErrorEvent oErrorEvent) {
                                    if (oErrorEvent.bIsError)
                                    {
                                    m_oErrorCode.Add(oErrorEvent);
                                    }
                                    }
                                    public ENErrorEvent[] GetErrors
                                    {
                                    get
                                    {
                                    return (ENErrorEvent[])m_oErrorCode.ToArray(typeof(ENErrorEvent));
                                    }
                                    }
                                    
                                    public string csDump()
                                    {
                                    string sOutput = Command.ToString().ToLower() + " " + ExecutedEntity.ToString().ToLower();
                                    if (ContentType == typeof(string) && ContentName != null)
                                    {
                                    sOutput += " name_str:" + ContentName.ToLower();
                                    }
                                    else if (ContentType == typeof(SIndex))
                                    {
                                    sOutput += " name_si:" + ContentIndex.ToString().ToLower();
                                    }
                                    else if (ContentType == typeof(CEntityArray) && ContentIdentifier != null)
                                    {
                                    sOutput += " name_ea:" + ContentIdentifier.ToString().ToLower();
                                    }
                                    if (ContentText != null)
                                    {
                                    sOutput += " content_str:" + ContentText;
                                    }
                                    
                                    sOutput += " Sender:" + SenderIndex;
                                    
                                    if (IsUsed(MemberIndex))
                                    {
                                    sOutput += " Member: " + MemberIndex;
                                    }
                                    
                                    if (IsUsed(OrganisationIndex)) {
                                    sOutput += " Organisation:" + OrganisationIndex;
                                    }
                                    sOutput += "\n";
                                    
                                    foreach (DictionaryEntry oOption in m_oOptionList)
                                    {
                                    if (oOption.Value is CEntityArray   )
                                    {
                                    if (((CEntityArray)oOption.Value).bIsEmpty == false) {
                                    sOutput += " " + oOption.Key.ToString().ToLower() + "=" + oOption.Value.ToString().ToLower();
                                      }
                                                    }
                                                    else if (oOption.Value is CIdentifier)
                                                    {
                                                        sOutput += " " + oOption.Key.ToString().ToLower() + "=" + ((CIdentifier)oOption.Value).csDump();
                                    
                                                    }
                                                    else if (oOption.Value is CCommandLine)
                                                    {
                                                        sOutput += " " + oOption.Key.ToString().ToLower() + "=" + ((CCommandLine)oOption.Value).csDump();
                                    
                                                    }
                                                    else {
                                                        if (IsUsed(oOption.Value)) {
                                                            sOutput += " " + oOption.Key.ToString().ToLower() + "=" + oOption.Value.ToString().ToLower();
                                    
                                                        }
                                                    }
                                     
                                                }
                                    
                                                return sOutput + ToString(GetErrors);
                                            }
                                              
                                    
                                        }
                                    
                                    }
                                    
                                    
                                  |