| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562 |
- #pragma once
- #include "ElectricBaseDefine.h"
- #include "../Global/NetMessageDefine.h"
- #include "../Global/BaseDefine.h"
- #include "ElcBaseEqpmt.h"
- #include "../Global/SenceControlBaseDefine.h"
- #include "PublicEqpmtID.h"
- #include <string>
- #include <sstream>
- #define EQPMT_RELATIONTYPE_BREAKHANDER 2527 //断路器手车
- #define EQPMT_RELATIONTYPE_INPUT 2528 //输入关系
- #define EQPMT_RELATIONTYPE_AUTOBOLT 2529 //备自投母联断路器
- #define EQPMT_RELATIONTYPE_AUTOBOLTLSWITCH 2631 //备自投左进线设备
- #define EQPMT_RELATIONTYPE_AUTOBOLTRSWITCH 2632 //备自投右进线设备
- #define EQPMT_RELATIONTYPE_NEXTAUTOBOLT 2633 //下一个备自投
- #define EQPMT_RELATIONTYPE_INITUIONCTRL 2531 //主动联控
- #define EQPMT_RELATIONTYPE_PASSUIONCTRL 2532 //被动联控
- #define EQPMT_RELATIONTYPE_EARTHSWITCH 2730 //关联接地开关
- #define EQPMT_RELATIONTYPE_EARTHSWITCHINPUT 2731 //接地开关输入
- #define EQPMTTYPE_35KV 35 // 35KV系统设备
- #define EQPMTTYPE_400V 400 // 400V系统设备
- #define EQPMT_RELATIONTYPE_AUTOBOLTAASWITCH 30 //备自投自投自复关联设备
- #define EQPMT_RELATIONTYPE_AUTOBOLTAMSWITCH 31 //备自投自投手复关联设备
- #define EQPMT_RELATIONTYPE_AUTOBOLTMMSWITCH 32 //备自投手投手复关联设备
- typedef void (*CALLBACKFUNC_Telesignalisation)(void* pOwner, int nProtectID, const string& strEqpmtStrID, int nMark );
- typedef void (*CALLBACKFUNC_DealElcTurnOffArea)(void* pOwner, const string& strEqpmtStrID );
- typedef void (*CALLBACKFUNC_Deal400VLoadTurnOff)(void* pOwner, const string& strEqpmtStrID, int nButtonID );
- class BaseElectricEqpmt :
- public ElcBaseEqpmt
- {
- public:
- BaseElectricEqpmt();
- virtual ~BaseElectricEqpmt();
- void SetSendList(CommandQueue * pcmdlist,int trian) //发送消息列表
- {
- p_SendList=pcmdlist;
- m_Trianid=trian;
- }
- bool AddProtect(string id, int EventID); //增加保护
- void SetEarthSwitchID(string id) //设置接地开关
- {
- m_EarthSwitchID.push_back(id);
- }
- void SetEarthSwitchRelationSwitch(string strSwitch) //设置接地开关关联开关
- {
- m_EarthSwitchInputSwitch.push_back(strSwitch);//added by yangs on 2022.1.5
- }
- void OccarSearchError(int errorid); //查找当前故障
- void RevertAlarms(); //恢复报警
- void SetEqmpInitStatus(int status) //设置初始状态
- {
- //m_status=status;
- SetStatus(status);
- SetInitStatus(status);
- if (status==Electric_Eqpmt_Status_ON)
- //HavePower =true;
- SetPower(true);
- else
- //HavePower = false;
- SetPower(false);
- }
- void AddInputRelation(string InputID) //增加输入关系
- {
- InputLineInfo inutinfo;
- inutinfo.ID=InputID;
- inutinfo.InputPower = true;
- InputEqpmtIDMap.insert(make_pair(InputID,inutinfo));
- }
- void ResetInputPower() //added by zhangjiahua
- {
- std::map<string,InputLineInfo>::iterator itor=InputEqpmtIDMap.begin();
- for (;itor!=InputEqpmtIDMap.end();itor++)
- {
- itor->second.InputPower = true;
- }
- }
- void AddOutputRelation(string ID) //增加输出关系
- {
- OutputEqpmtIDMap.insert(make_pair(ID,ID));
- }
- static void SetTrackRelationXDMap(TrackRelationXDMAP trackrelationmap);
- //{
- // //if (trackrelationmap.size()>0)
- // //{
- // // TrackRelationXDMAP::iterator iteer = trackrelationmap.begin();
- // // for (;iteer!=trackrelationmap)
- // // {
- // // }
- // //}
- // m_TrackRelationXDMap = trackrelationmap;
- //}
- TrackRelationXDMAP GetTrackRelationXDMap();
- //{
- // return m_TrackRelationXDMap;
- //}
- //string GetTrackStrid()
- //{
- // return m_TrackStrid;
- //}
- //int GetTrackPower()
- //{
- // return m_TrackPower;
- //}
- TrackRelationXD GetTrackRelationXD()
- {
- return m_TrackRelationXD;
- }
- bool CheckElcEnvirRelation(); //检查电环关系
- int CheckInPowerNums(); //检查带电的个数
- // void SendAlarmMsg(string grade,int station,string strvalue);
- // void SendSOEMsg(int station,string label,string labelvalue);
- void SendMsgNotice(int station,int sysid,int level,int type, int fault, string labelvalue,string strEqpmtID = ""); //发送消息通知
- void AddCtrlUnoin(int operstatus,string preeqpmtid,int prestatus,int relation,int delaytime,int index); //增加联控
- virtual void CalculateValue(double inputv,double inputI,std::map<string,BaseElectricEqpmt*>* PEqpmtMap){} //计算值
- virtual void EqpmtCtrl(int status,map<string,BaseElectricEqpmt*>& ElectricEqpmtMap,string Stdid,int CtrlType, int nMark = 0){ SetCtrlMark(nMark); }
- virtual void EqpmtCtrlExecution(int status, map<string, BaseElectricEqpmt*>& ElectricEqpmtMap, string Stdid, int CtrlType, int nMark = 0) { SetCtrlMark(nMark); }
- virtual bool CheckProtect(map<string,BaseElectricEqpmt*>& ElectricEqpmtMap,int errorid,int protectid,bool bAutoRelation = true){return false;} //检查保护
- //virtual bool CheckProtect(map<string,BaseElectricEqpmt*>& ElectricEqpmtMap,int errorid,int protectid,bool bAutoRelation = true); //检查保护
- virtual bool handle_checkprotect(int eventOper,map<string,BaseElectricEqpmt*>& eqpmtmap,int errorid,int protectid){return false;}//处理保护
- virtual bool handle_fault(int eventOper,map<string,BaseElectricEqpmt*>& eqpmtmap,int errorid, int Param, int nType); //处理故障
- virtual bool handle_revert(int eventOper,map<string,BaseElectricEqpmt*>& eqpmtmap,int Param); //处理恢复
- virtual bool handle_delaytime(time_t& time,map<string,BaseElectricEqpmt*>& eqpmtmap,const DelayTimeInfo& delayparm){return false;}//处理延时
- //************************************
- // 函数名称: PowerCut
- // 函数功能: 检查设备是否可以断电
- // 函数类型: virtual public
- // 返 回 值: bool
- // 参数说明: map<string
- // 参数说明: BaseElectricEqpmt * > & eqpmtmap
- // 参数说明: string sourceid
- // 参数说明: int offcase
- // 作 者: 张家华
- // 日 期: 2019/4/16
- // 修改记录:
- //************************************
- virtual bool PowerCut(map<string,BaseElectricEqpmt*>& eqpmtmap,string sourceid,int offcase); //
- //************************************
- // 函数名称: PowerLost
- // 函数功能: 切断当前设备带电状态
- // 函数类型: virtual public
- // 返 回 值: bool
- // 参数说明: map<string
- // 参数说明: BaseElectricEqpmt * > & eqpmtmap
- // 参数说明: string sourceid
- // 参数说明: int offcase
- // 作 者: 张家华
- // 日 期: 2019/4/16
- // 修改记录:
- //************************************
- virtual bool PowerLost(map<string,BaseElectricEqpmt*>& eqpmtmap, string sourceid,int offcase); //
- virtual bool PowerIn(map<string,BaseElectricEqpmt*>& eqpmtmap, string sourceid); //来电
- virtual void UpdateEqpmtStatus(map<string,BaseElectricEqpmt*>& eqpmtmap,int status,int ctrltype=CTRLTYPE_STATUS,int nDesSysID = 0); //更新设备状态
- virtual void SetDelayMap(DELAYMAP* delaymap){p_DelayTimeMap=delaymap;} //设置延时列表
- virtual int CheckEqpmtCtrlCase(int status,map<string,BaseElectricEqpmt*>& ElectricEqpmtMap,int stdid,int subsysid,int trianid,int stationid,int viewid, int CtrlType, int nMark = 0){ return DH_CmdReplyStatus_Deny;}
- virtual void ClearProtect(map<string,BaseElectricEqpmt*>& ElectricEqpmtMap,int errorid){} //清除保护
- virtual void ClearSingleProtect(map<string,BaseElectricEqpmt*>& ElectricEqpmtMap,int errorid,const string& strProtecResetType = ""){} //清除单个保护
- virtual void SetShield(map<string,BaseElectricEqpmt*>& ElectricEqpmtMap){}
- virtual void CancleShield(map<string,BaseElectricEqpmt*>& ElectricEqpmtMap){}
- void UpdateCommmunicationStatus(int status);
- virtual void CutEqpmtAlarm(map<string,BaseElectricEqpmt*>& ElectricEqpmtMap, int nTripActType); //设备报警
- virtual void RevertEqpmtAlarm(map<string,BaseElectricEqpmt*>& ElectricEqpmtMap, int nTripActType); //设备报警恢复
- virtual void CutCommunication(map<string,BaseElectricEqpmt*>& ElectricEqpmtMap); //通讯中断
- virtual void RevertCommunication(map<string,BaseElectricEqpmt*>& ElectricEqpmtMap); //通讯恢复
- virtual void SetRemoteLock(map<string,BaseElectricEqpmt*>& ElectricEqpmtMap,int status,int ctrlArea,int lockType){}
- virtual void CancleRemoteLock(map<string,BaseElectricEqpmt*>& ElectricEqpmtMap,int status,int ctrlArea){}
- virtual void InitiativeUnionCtrl(int status,map<string,BaseElectricEqpmt*>& ElectricEqpmtMap); //初始化联动控制
- virtual bool CheckTripping( map<string,BaseElectricEqpmt*>& ElectricEqpmtMap, const ProtectValue& protectValue ){ return false; }
- virtual void UnLockTrippingEqpmt( map<string,BaseElectricEqpmt*>& ElectricEqpmtMap ){}
- static ErrorToProtectMAP* GetErrorToProtectMAP()
- {
- return &m_mapErrorToProtect;
- }
- static void ClearErrorToProtectMAP()
- {
- m_mapErrorToProtect.clear();
- }
- /*
- 故障发生时启动故障对应保护类型(一种或多种)
- */
- virtual bool CheckErrorToProtect( int eventOper,map<string,BaseElectricEqpmt*>& eqpmtmap, int nErrorid );
- virtual bool RevertErrorToProtect( int eventOper,map<string,BaseElectricEqpmt*>& eqpmtmap, int nErrorid );
- virtual bool RevertErrorToProtect( int eventOper,map<string,BaseElectricEqpmt*>& eqpmtmap, int nErrorid, int nProtectID );
- /*
- 故障发生时根据闭锁列表闭锁相关设备 ADD BY XYX 2018-01-18
- */
- void AddProtectLockingEqpmt( const string& strProtectLockingEqpmtID, int nProtectId ,const string& strLockintText );
- void ProtectLocking( BaseElectricEqpmt* pEqpmt, const string& strLockingDisplayContent, int nProtectID );
- //故障场景闭锁的设备
- void AddFaultSceneLockingEqpmt(const string& strProtectLockingEqpmtID, int nProtectId);
- void FaultSceneLocking(BaseElectricEqpmt* pEqpmt, int nProtectID);
-
- void SetMotherAutoBolt( const string& strMotherAutoBolt )
- {
- m_strMotherAutoBolt = strMotherAutoBolt;
- }
- string GetMotherAutoBolt()
- {
- return m_strMotherAutoBolt;
- }
- void CheckMotherAutoBolt(map<string,BaseElectricEqpmt*>& eqpmtmap);
- bool AddFaultEqpmt(string FaultEqpmt); //xyx新增,添加当前故障设备
- //************************************
- // 函数名称: UpdateOperResultStatusToMsg
- // 函数功能: 将设备的操作结果信息发送至教员用于评价
- // 函数类型: virtual public
- // 返 回 值: void
- // 参数1说明: string strEqpmtID 设备图元ID
- // 参数2说明: int EqpmtName 设备操作结果状态
- // 作 者: xyx新增
- // 日 期: 2019/8/19
- // 修改记录:
- //************************************
- virtual void UpdateOperResultToTechEva(string strEqpmtID,int nResultStatus);
- //add by yangs 20230702
- int GetCurErrorNos()
- {
- return m_CurErrorNos.size();
- }
- //add by yangs 20230702
- bool EraseErrorNosByErrorID(int nErrorID);
- protected:
- std::vector<string> m_FaultEqpmt; //xyx新增,线路测试时查找当前故障设备
- std::map<string,InputLineInfo> InputEqpmtIDMap; //输入设备ID列表
- std::map<string, string> OutputEqpmtIDMap; //输出设备ID列表
- std::map<int,ErrorInfo> m_CurErrorNos; //当前故障号
- std::vector<ProtectCtrl> ProtectVecs; //保护列表
- double InputVoltage; //输入电压
- double InputElectricity; //输入电流
- double OutputVoltage; //输出电压
- double OutputElectricity; //输入电流
- int m_Trianid; //训练ID
- //bool HavePower; //是否有电
- CommandQueue * p_SendList; //消息发送列表
- vector<int> m_AlarmIDs; //报警ID
- vector<ElcEnvirPowerRelation> m_ElcEnvirRelations; //电环关第列表
- std::vector<UionCtrl> m_CtrlUnions; //联控信息列表
- DELAYMAP* p_DelayTimeMap;
- //string AutoBoltID; //noted by zhangjiahua
- int m_OperStationID; //客户端操作车站ID
- int m_OperViewID; //客户端操作视图ID
- int m_OperSubsysID; //客户端操作子系统ID
- std::vector<UionCtrl> m_ProtectLockingEqpmt;//保护闭锁设备列表
- std::vector<FaultSceneCtrl> m_vecFaultSceneLockingEqpmt;//故障场景控制,故障后试合闸不成功的设备
- ///*
- //左右进线关联母联备自投设备编号
- //*/
- string m_strMotherAutoBolt;
- //是否禁止复归 add by chenht
- bool IsProhibitedReversion;
- bool isReallyEqpmt; // 是否是真实设备
- bool isRealEqpmtFeedback; //真实设备是否反馈
- int m_nRealEqpmtStatus; //真实设备反馈状态
- int m_nDelaydurTime; //设备动作延时时间
- public:
- std::vector<ProtectValue> SettingProtects;
- static TrackRelationXDMAP m_TrackRelationXDMap;
- static ErrorToProtectMAP m_mapErrorToProtect;
- //string m_TrackStrid;
- //int m_TrackPower;
- //int m_PreTrackPower;
- vector<string> m_EarthSwitchID; //接地开关ID
- vector<string> m_EarthSwitchInputSwitch; //接地开关输入开关
- TrackRelationXD m_TrackRelationXD;
- /*void SetAutoBoltID(string id)
- {
- AutoBoltID = id;
- }
- string GetAutoBoltID()
- {
- return AutoBoltID;
- }*/ //noted by zhangjiahua
- void SetOperStationID(int id)
- {
- if (id != -1 && id != m_OperStationID)
- {
- m_OperStationID = id;
- }
-
- }
- int GetOperStationID()
- {
- return m_OperStationID;
- }
- void SetOperViewID(int id)
- {
- if (id != -1 && id != m_OperViewID)
- {
- m_OperViewID = id;
- }
- //m_OperViewID = id;
- }
- int GetOperViewID()
- {
- return m_OperViewID;
- }
- void SetOperSubsysID(int id)
- {
- if (id != -1 && id != m_OperSubsysID)
- {
- m_OperSubsysID = id;
- }
- //m_OperSubsysID = id;
- }
- int GetOperSubsysID()
- {
- return m_OperSubsysID;
- }
- public:
- /*
- 遥信模块处理句柄
- */
- static void* m_pTelesignalisationOwner;
- int m_nCurProtectID;
- static void SetTelesignalisationOwner(void* pTelesignalisationOwner )
- {
- m_pTelesignalisationOwner = pTelesignalisationOwner;
- }
- static void SetCallBackTelesignalisationFunc( CALLBACKFUNC_Telesignalisation hCallBackTelesignalisation)
- {
- m_hCallBackTelesignalisation = hCallBackTelesignalisation;
- }
- static CALLBACKFUNC_Telesignalisation m_hCallBackTelesignalisation;
- /*
- 遥信处理
- */
- void DealTelesignalisation( int nProtectID, const string& strEqpmtStrID, int nMark );
- /*
- 设备区域失电/受电处理
- */
- void DealElcTurnOffArea();
- /*
- 400V三级负荷停送电
- */
- void Deal400VLoad();
- static CALLBACKFUNC_DealElcTurnOffArea m_hCallBackDealElcTurnOffArea;
- static void SetCallBackDealElcTurnOffAreaFunc( CALLBACKFUNC_DealElcTurnOffArea hCallBackDealElcTurnOffArea )
- {
- m_hCallBackDealElcTurnOffArea = hCallBackDealElcTurnOffArea;
- }
- int m_nRelationElcTurnOffArea;
- void SetRelationElcTurnOffArea( int nRelationElcTurnOffArea )
- {
- m_nRelationElcTurnOffArea = nRelationElcTurnOffArea;
- }
- int GetRelationElcTurnOffArea()
- {
- return m_nRelationElcTurnOffArea;
- }
- bool IsPower();
- void ElcAreaAlarm( bool bPower );
- public:
- /*
- 当前设备操作方式:大于0为人工操作
- */
- int m_nCtrlMark; //修改为设备成员变量
- void SetCtrlMark( int nMark )
- {
- m_nCtrlMark = nMark;
- }
-
- void ResetCtrlMark()
- {
- m_nCtrlMark = 0;
- }
- int GetCtrlMark()
- {
- return m_nCtrlMark;
- }
- public:
- /*
- 功能:增加同一供电区间内备自投自投逻辑 ADD BY XYX 2018-03-28
- */
- vector<OutLineElectricEqpmt> m_vecOutLineElectricEqpmt;
- /*
- 增加出线设备
- */
- void AddOutLineElectricEqpmt( int nType, const string& strOutLineElectricEqpmtStrID );
- /*
- 检查出线设备
- */
- virtual void CheckOutLineElectricEqpmt(map<string,BaseElectricEqpmt*>& eqpmtmap, int nMark = 0);
- /*
- 35KV目联是否投入
- */
- virtual bool BoltPowerIn_35KV( map<string,BaseElectricEqpmt*>& eqpmtmap, const string& strOutLineElectricEqpmtStrID );
- /*
- 400V出线设备自断
- */
- virtual void PowerCutCurElectricEqpmt_400V( map<string,BaseElectricEqpmt*>& eqpmtmap );
- /*
- XYX END 2018-03-30
- */
- public:
- /*
- 车站400V三级负荷
- */
- int m_n400VLoadID;
- static CALLBACKFUNC_Deal400VLoadTurnOff m_hCallBackDeal400VLoadTurnOff;
- static void SetCallBackDeal400VLoadTurnOffFunc( CALLBACKFUNC_Deal400VLoadTurnOff hCallBackDeal400VLoadTurnOff )
- {
- m_hCallBackDeal400VLoadTurnOff = hCallBackDeal400VLoadTurnOff;
- }
- void Set400VLoadID( int nLoadID )
- {
- m_n400VLoadID = nLoadID;
- }
- public:
- //设置电调设备报警配置信息 xyx新增
- static ELCEQPMTALARMINFOMAP* m_EqpmtAlarmInfoMap;
- static void SetElcEqpmtAlarmInfoMap(ELCEQPMTALARMINFOMAP* m_AlarmInfoMap );
-
- //************************************
- // 函数名称: UpdateAlarmInfo
- // 函数功能: 更新报文
- // 函数类型: public
- // 返 回 值: void
- // 参数1说明: string EppmtTypeName 设备类型名称
- // 参数2说明: string EqpmtName 设备名称
- // 参数3说明: int SourceStaionID 设备所属车站ID
- // 参数4说明: ELCEQPMTALARMINFO& EqpmtAlarmInfo 设备报文配置信息
- // 作 者: xyx新增
- // 日 期: 2019/8/8
- // 修改记录:
- //************************************
- void UpdateAlarmInfo(string EppmtTypeName, string EqpmtName,int SourceStaionID,ELCEQPMTALARMINFO& EqpmtAlarmInfo );
-
- //************************************
- // 函数名称: UpdateAlarmType
- // 函数功能: 更新动作设备的报文类型
- // 函数类型: public
- // 返 回 值: void
- // 参数1说明: int EppmtType 设备类型ID
- // 参数2说明: string EppmtTypeName 设备类型名称
- // 参数3说明: string EqpmtName 设备名称
- // 参数4说明: int SourceStaionID 设备所属车站ID
- // 参数5说明: int ActType 动作类型ID
- // 作 者: xyx新增
- // 日 期: 2019/8/12
- // 修改记录:
- //************************************
- void UpdateAlarmType( int EppmtType, string EppmtTypeName, string EqpmtName,int SourceStaionID,int ActType);
- //更新设备闭锁光字牌保护状态
- void UpdateEqpmtLightCardStatu(int nProtectID);
- //
- void UpdateEqpmtTeleValue(string strEqpmtID, int nType, float fValue, int IsReset);
- //更新设备带电状态
- void UpdateEqpmtPower(string strEqpmtID, int power);
-
- //设置设备所属的电环联合控制区域
- int m_nElcToEnvCtrlAreaID;
- void SetElcToEnvCtrlArea( int nCtrlAreaID )
- {
- m_nElcToEnvCtrlAreaID = nCtrlAreaID;
- }
- //考试模式下设备校验反馈 add by chenht
- void SendExamModeEqpmtCheckStatus( int stdid,int subsysyid,int trianid,int stationid,int viewid);
- //设置禁止复归
- void setProhibitedReversion(bool bIsPRever = true)
- {
- IsProhibitedReversion = bIsPRever;
- }
- bool getProhibitedReversion()
- {
- return IsProhibitedReversion;
- }
- void setReallyEqpmtFlag() { isReallyEqpmt = true; }
- bool checkReallyEqpmtFlag() { return isReallyEqpmt; }
- void setRealEqpmtFeedback(bool flag) { isRealEqpmtFeedback = flag; }
- bool checkRealEqpmtFeedback() { return isRealEqpmtFeedback; }
- void setRealEqpmtStatus(int status) { m_nRealEqpmtStatus = status; }
- int getRealEqpmtStatus() { return m_nRealEqpmtStatus; }
- void setDelaydurTime(int time) { m_nDelaydurTime = time; }
- int getDelaydurTime() { return m_nDelaydurTime; }
- bool CheckDCMLineInPowerNums(map<string, BaseElectricEqpmt*>& eqpmtmap);
- bool PowerCutMLineOutPower(int nType);
- };
- typedef std::map<string,BaseElectricEqpmt*> ELEEQPMTMAP;
- typedef std::map<string, string> OUTPUTEQPMTMAP;
- typedef std::map<string,InputLineInfo> INPUTEQPMTMAP;
- typedef std::map<int,ErrorInfo> ERRORMAP;
|