unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ADODB, DB;
type
TForm1 = class(TForm)
Label1: TLabel;
Btn_Recv_SMS: TButton;
Grp_EntReg: TGroupBox;
Edt_EntName: TEdit;
Label7: TLabel;
Label8: TLabel;
Edt_LinkName: TEdit;
Edt_LinkPhone: TEdit;
Label9: TLabel;
Edt_LinkMobile: TEdit;
Label10: TLabel;
Label11: TLabel;
Edt_Email: TEdit;
Label12: TLabel;
Edt_LinkFax: TEdit;
Label13: TLabel;
Edt_Address: TEdit;
Label14: TLabel;
Edt_PostCode: TEdit;
Btn_Reg: TButton;
Grp_ChargeUp: TGroupBox;
Btn_ChargeUp: TButton;
Edt_CardNum: TEdit;
Label3: TLabel;
Edt_CardPwd: TEdit;
Label4: TLabel;
Panel_SN: TPanel;
Edt_SN: TEdit;
Label2: TLabel;
Grp_SendSms: TGroupBox;
Btn_Send_Sms: TButton;
Edt_Sms_Cont: TEdit;
Label6: TLabel;
Btn_SendSche_Sms: TButton;
Grp_Trans: TGroupBox;
Label5: TLabel;
Edt_Trans_Phone: TEdit;
Btn_Trans_Reg: TButton;
Btn_Trans_UnReg: TButton;
Label15: TLabel;
Edt_Sms_Phone: TEdit;
Edt_Sms_SendTime: TEdit;
Label16: TLabel;
Edt_Sms_Addi: TEdit;
Label17: TLabel;
Grp_Proxy: TGroupBox;
Btn_Set_Proxy: TButton;
Edt_Proxy_IP: TLabeledEdit;
Edt_Proxy_Port: TLabeledEdit;
Edt_Proxy_User: TLabeledEdit;
Edt_Proxy_Pwd: TLabeledEdit;
Edt_SN_PWD: TEdit;
Label18: TLabel;
Btn_Send_Sms_Addi: TButton;
Btn_SendSche_Sms_Addi: TButton;
Btn_Recv_Sms_Addi: TButton;
ListBox_Recv_Sms_Cont: TListBox;
Label21: TLabel;
ListBox_SendSms_Msg: TListBox;
Label20: TLabel;
Edt_Sms_Pri: TEdit;
Btn_UnReg: TButton;
Grp_Version: TGroupBox;
Btn_SetKey: TButton;
Edt_Key: TEdit;
Btn_Balance: TButton;
Btn_Price: TButton;
Label22: TLabel;
Btn_Version: TButton;
Grp_Change_Pwd: TGroupBox;
Label23: TLabel;
Edt_SN_Old_PWD: TEdit;
Label19: TLabel;
Edt_SN_NEW_PWD: TEdit;
Btn_ChangePwd: TButton;
procedure Btn_RegClick(Sender: TObject);
procedure Btn_BalanceClick(Sender: TObject);
procedure Btn_ChargeUpClick(Sender: TObject);
procedure Btn_PriceClick(Sender: TObject);
procedure Btn_Send_SmsClick(Sender: TObject);
procedure Btn_SendSche_SmsClick(Sender: TObject);
procedure Btn_Recv_SMSClick(Sender: TObject);
procedure Btn_UnRegClick(Sender: TObject);
procedure Btn_Trans_RegClick(Sender: TObject);
procedure Btn_Trans_UnRegClick(Sender: TObject);
procedure Btn_Set_ProxyClick(Sender: TObject);
procedure Btn_ChangePwdClick(Sender: TObject);
procedure Btn_Send_Sms_AddiClick(Sender: TObject);
procedure Btn_SendSche_Sms_AddiClick(Sender: TObject);
procedure Btn_Recv_Sms_AddiClick(Sender: TObject);
procedure Btn_SetKeyClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure Btn_VersionClick(Sender: TObject);
private
{ Private declarations }
isclose: boolean;
public
{ Public declarations }
end;
TMTNRecvContent = procedure(mobile, senderaddi, recvaddi, ct,sd:PChar; flag:Pointer);stdcall;
var
Form1: TForm1;
//导入的动态库中的函数
Function GetPrice(sn: Pchar;m:PChar): integer; stdcall;external 'EUCPComm.dll' name 'GetPrice'; //价格
Function GetBalance(m:PChar;balance:PChar): integer; stdcall;external 'EUCPComm.dll' name 'GetBalance';//查询余额
Function GetSDKVersion(ver:PChar): integer; stdcall;external 'EUCPComm.dll' name 'GetSDKVersion';//查询版本号
Function SendScheSMS(sn:PChar;mn:PChar;ct:PChar;ti:PChar): integer; stdcall;external 'EUCPComm.dll' name 'SendScheSMS';//定时发送
Function _Register(sn:PChar; pwd:PChar; EntName: PChar; LinkMan: PChar; Phone: PChar; Mobile: PChar; Email: PChar; Fax: PChar; sAddress: PChar; Postcode: PChar):integer; stdcall;external 'EUCPComm.dll' name 'Register';//注册
Function ChargeUp(sn:PChar;acco:PChar;pass:PChar):integer; stdcall;external 'EUCPComm.dll' name 'ChargeUp';//存值
function ReceiveSMS(sn: PChar; func: Pointer): integer;stdcall; external 'EUCPComm.dll' name 'ReceiveSMS';//存值
function ReceiveSMSEx(sn: PChar; func: Pointer): integer;stdcall; external 'EUCPComm.dll' name 'ReceiveSMSEx';//存值
Function CancelTransfer(sn:PChar):integer; stdcall;external 'EUCPComm.dll' name 'CancelTransfer';//申请转接服务
Function RegistryTransfer(sn:PChar;mn:PChar):integer; stdcall;external 'EUCPComm.dll' name 'RegistryTransfer';//注销转接服务
function SendSMS(sn,mn,ct,priority:pchar):integer; stdcall;external 'EUCPComm.dll' name 'SendSMS';
Function SendSMSEx(sn:PChar;mn:PChar;ct:PChar;addiSerial:PChar): integer; stdcall;external 'EUCPComm.dll' name 'SendSMSEx';//即时发送
Function SendScheSMSEx(sn:PChar;mn:PChar;ct:PChar;ti:PChar;addiSerial:PChar): integer; stdcall;external 'EUCPComm.dll' name 'SendScheSMSEx';//定时发送
Function SetProxy(proxyAddr:PChar;proxyPort:PChar;proxyUser:PChar;proxyPassword:PChar): integer; stdcall;external 'EUCPComm.dll' name 'SetProxy';//定时发送
function RegistryPwdUpd( sn, oldpwd,newpwd:pchar):integer;stdcall;external 'EUCPComm.dll' name 'RegistryPwdUpd';
function UnRegister(sn:pchar):integer;stdcall;external 'EUCPComm.dll' name 'UnRegister' ;
Function SetKey(key:PChar):integer; stdcall;external 'EUCPComm.dll' name 'SetKey';//注销转接服务
implementation
{$R *.dfm}
procedure ParseMsg(result:integer);
begin
if (result = 1) then
ShowMessage('成功 Return=1')
else if (result = 0) then
ShowMessage('失败 Return=0')
else if (result = 2) then
ShowMessage('服务器返回:重复登录,如在同一TCP/IP连接中连续两次以上请求登录')
else if (result = 3) then
ShowMessage('服务器返回:连接过多,指单个节点要求同时建立的连接数过多')
else if (result = 4) then
ShowMessage('服务器返回:参数格式错,指命令中参数值与参数类型不符或与协议规定的范围不符')
else if (result = 7) then
ShowMessage('服务器返回:消息ID错')
else if (result =
then
ShowMessage('服务器返回:信息长度错')
else if (result = 9) then
ShowMessage('服务器返回:指令操作失败')
else if (result = 10) then
ShowMessage('服务器返回:客户端注册失败')
else if (result = 11) then
ShowMessage('服务器返回:企业信息注册失败')
else if (result = 12) then
ShowMessage('服务器返回:查询余额失败')
else if (result = 13) then
ShowMessage('服务器返回:充值失败')
else if (result = 14) then
ShowMessage('服务器返回:手机转移失败')
else if (result = 15) then
ShowMessage('服务器返回:手机扩展转移失败')
else if (result = 16) then
ShowMessage('服务器返回:取消转移失败')
else if (result = 17) then
ShowMessage('服务器返回:发送信息失败')
else if (result = 18) then
ShowMessage('服务器返回:发送定时信息失败 序列号非法或者余额不足')
else if (result = 19) then
ShowMessage('服务器返回:接收短信失败')
else if (result = 20) then
ShowMessage('服务器返回:审核失败')
else if (result = 21) then
ShowMessage('服务器返回:审核失败')
else if (result = 22) then
ShowMessage('服务器返回:注销失败')
else if (result = 23) then
ShowMessage('服务器返回:注册号码不存在')
else if (result = 24) then
ShowMessage('服务器返回:注册号码未注册')
else if (result = 25) then
ShowMessage('服务器返回:注册号码密码修改失败')
else if (result = 26) then
ShowMessage('服务器返回:获取代理信息错误')
else if (result = 27) then
ShowMessage('服务器返回:查询单条短信费用错误码')
else if (result = 100) then
ShowMessage('序列号码为空或无效')
else if (result = 101) then
ShowMessage('网络故障')
else if (result = 102) then
ShowMessage('其它故障')
else if (result = 103) then
ShowMessage('注册企业基本信息失败,当软件注册号码注册成功,但整体还是失败,要重新注册')
else if (result = 104) then
ShowMessage('注册信息填写不完整')
else if (result = 105) then
ShowMessage('参数指针为空')
else if (result = 106) then
ShowMessage('卡号或密码为空或无效')
else if (result = 107) then
ShowMessage('手机号码为空或分割无效')
else if (result = 108) then
ShowMessage('手机号码分割符号不正确')
else if (result = 109) then
ShowMessage('部分手机号码不正确,已删除,其余手机号码被发送')
else if (result = 110) then
ShowMessage('短信内容为空或超长(70个汉字)')
else if (result = 111) then
ShowMessage('附加号码过长(8位)')
else if (result = 112) then
ShowMessage('定时时间为空或格式不正确')
else if (result = 113) then
ShowMessage('定时时间为空或格式不正确')
else if (result = 114) then
ShowMessage('得到标识错误')
else if (result = 122) then
ShowMessage('接口调用异常')
else if (result = 125) then
ShowMessage('初始化通讯SOCKET失败')
else if (result = 126) then
ShowMessage('获取响应值失败')
else if (result = 999) then
ShowMessage('函数调用频率过快')
else if (result = 201) then
ShowMessage('计费失败,请充值')
else if (result = -1) then
ShowMessage('加载 EUCPComm.DLL 动态库失败')
else
ShowMessage('其它错误值: ' + IntToStr(result) )
end;
//
// 序列号注册
// 在计算机上发短信必须先注册该软件序列号
// 注意:此函数只需执行一次即可,直到将该序列号换到别的计算机上时才需要重新注册。
// Register(序列号,密码,企业名称,联系人姓名,联系电话,联系手机,电子邮件, 联系传真,公司地址, 邮政编码)
// 参数中:
//【序列号】 通过亿美销售人员获取
//【密码】 通过亿美销售人员获取,长度为6个字节
//【企业名称】最多60字节,必须输入
//【联系人姓名】(最多20字节),必须输入
//【联系电话】(最多20字节),必须输入
//【联系手机】(最多15字节),必须输入
//【电子邮件】(最多60字节),必须输入
//【联系传真】(最多20字节),必须输入
//【公司地址】(最多60字节),必须输入
//【邮政编码】(最多6字节),必须输入
procedure TForm1.Btn_RegClick(Sender: TObject);
var
result:integer;
begin //软件序列号 密码 企业名称 联系人姓名 联系电话 联系手机 电子邮件 联系传真 公司地址 邮政编码
result:= _Register(PChar(Edt_SN.Text),PChar(Edt_SN_PWD.Text),PChar(Edt_EntName.Text),PChar(Edt_LinkName.Text),PChar(Edt_LinkPhone.Text),PChar(Edt_LinkMobile.Text),PChar(Edt_Email.Text),PChar(Edt_LinkFax.Text),PChar(Edt_Address.Text),PChar(Edt_PostCode.Text));
ParseMsg(result);
end;
//
// 查询余额
// 余额不足,发送短信会失败
// GetBalance(软件序列号,余额);
// 【余额字符串】最少10个字节
//
procedure TForm1.Btn_BalanceClick(Sender: TObject);
var
result:integer;
balance : array[0..9] of char;
begin
FillChar(balance,sizeof(balance),0);
result:=GetBalance(PChar(Edt_SN.Text),balance);
if(result =1) then
ShowMessage(balance + ' 元')
else
ParseMsg(result);
end;
//
// 充值
// chargeUp(软件序列号,充值卡卡号, 密码)
// 请通过亿美销售人员获取充值卡卡号和密码
// [充值卡卡号]长度为20内
// [密码]长度为6个字节
// 如果余额不足,发送短信会失败
//
procedure TForm1.Btn_ChargeUpClick(Sender: TObject);
var
result:integer;
begin
//充值 软件序列号 卡号 密码
result:=ChargeUp(PChar(Edt_SN.Text),PChar(Edt_CardNum.Text),PChar(Edt_CardPwd.Text));
//ShowMessage(IntToStr(result));
ParseMsg(result);
end;
//
// 查询短信单条费用
// GetPrice(软件序列号,价格);
// 【价格字符串】至少20个字节
procedure TForm1.Btn_PriceClick(Sender: TObject);
var
result:integer;
price: array [0..20] of char;
begin
FillChar(price,sizeof(price),0);
result:=GetPrice(PChar(Edt_SN.Text),@price);
if(result = 1) then
ShowMessage(price + ' 元')
else
ParseMsg(result);
end;
//
// 发送即时短信
// sendSMS(软件序列号, 手机号码,短信内容,优先级)
// [手机号码]为手机号码字符串,以半角逗号分隔,最大小于200个手机号码
// [短信内容]为短信内容,最大长度为500字
// (不区分汉字与英文),亿美短信平台会根据实际通道自动拆分,计费以实际拆分条数为准.亿美推荐短信长度70字以内
// [优先级]代表优先级,范围1~5,数值越高优先级越高
procedure TForm1.Btn_Send_SmsClick(Sender: TObject);
var
result:integer;
circlenum :integer;
i: Integer;
begin
//即时发送
result := 1;
circlenum := 0;
try
// 这里是 软件序列号 手机号 短信内容 优先级
result := SendSMS(PChar(Edt_SN.Text),PChar(Edt_Sms_Phone.Text),PChar(Edt_Sms_Cont.Text),PChar(Edt_Sms_Pri.Text));
application.ProcessMessages;
if(result = 1) then
Form1.ListBox_SendSms_Msg.Items.Add(Edt_Sms_Phone.Text + ' : ' + formatdatetime('hh:nn:ss',now()))
else
Form1.ListBox_SendSms_Msg.Items.Add('发送失败' + ' : ' + formatdatetime('hh:nn:ss',now()));
except
on e:exception do begin
ShowMessage('异常信息:'+e.Message);
end;
end;
//ShowMessage(IntToStr(result));
ParseMsg(result);
end;
// 发送定时短信
// SendScheSMS(软件序列号, 手机号码,短信内容, 定时时间,优先级)
// [定时时间]格式为:年年年年月月日日时时分分秒秒,例如:20090504111010 代表2009年5月4日 11时10分10秒,时间大于当前时间,小于一年以内
// [手机号码]为手机号码字符串,以半角逗号分隔,最大小于200个手机号码
// [短信内容]为短信内容,最大长度为500字(不区分汉字与英文),亿美短信平台会根据实际通道自动拆分
// ,计费以实际拆分条数为准.亿美推荐短信长度70字以内
// [优先级]代表优先级,范围1~5,数值越高优先级越高
procedure TForm1.Btn_SendSche_SmsClick(Sender: TObject);
var
result:integer;
begin
//定时发送
try //软件序列号 手机号 短信内容 发送时间
result:=SendScheSMS(PChar(Edt_SN.Text),PChar(Edt_Sms_Phone.Text),PChar(Edt_Sms_Cont.Text),PChar(Edt_Sms_SendTime.Text));
except
on exception do begin end;
end;
ParseMsg(result);
end;
//接收短信需要的用户自定义的回调函数
// 示例代码为直接输出到 ListBox 内
// mobile:手机号
// senderaddi:发送者附加号
// recvaddi:接收者附加号
// ct:短信内容
// sd:日期
// flag : 标志,为 1 表示有短信
// 上行短信务如果要保存,需要加入业务逻辑代码,如:保存数据库,写文件等等
//手机号,发送者附加号,接收者附加号,短信内容, 日期,标识
procedure Recv_Sms_CallBack_Func(mobile, senderaddi, recvaddi,ct,sd:PChar; flag:Pointer);stdcall;
var
f: integer;
smscontentstr: AnsiString;
begin
f := integer(Pointer(flag)^);
//ShowMessage(inttostr(f));
if(f = 1) then begin
smscontentstr := string(mobile) + ';' + string(senderaddi) + ';' + string(recvaddi)+';' + string(ct) + ';' + StrPas(sd);
Form1.ListBox_Recv_Sms_Cont.Items.Add(smscontentstr);
//ShowMessage(smscontentstr);
end;
end;
//
// 得到上行短信
// ReceiveSMS(软件序列号,自定义的接收回调函数)
// 【自定义的接收回调函数】:接收到的短信,会通过回调函数的参数传入,在函数内部可以进行处理,例如存入数据库,写文件等。
//
procedure TForm1.Btn_Recv_SMSClick(Sender: TObject);
var
result:integer;
recvContent:PChar;
begin //软件序列号 传入回调方法地址
result := ReceiveSMS(PChar(Edt_SN.Text),@Recv_Sms_CallBack_Func);
ParseMsg(result);
end;
//
// 注销软件序列号
// UnRegister(软件序列号)
// 当需要在另外一台计算上发短信时,需要先将本机的软件序列号注销,再在别的机器上注册后,才能继续使用
procedure TForm1.Btn_UnRegClick(Sender: TObject);
var
result:integer;
begin //软件序列号
result:=UnRegister(PChar(Edt_SN.Text));
ParseMsg(result);
end;
//
// 注册转接
// 如果需要将上行短信转到该手机上接收,需要调用该函数。
// RegistryTransfer(软件序列号,手机号)
// 【手机号】最多10个,手机号码以半角逗号分隔
procedure TForm1.Btn_Trans_RegClick(Sender: TObject);
var
result:integer;
begin //软件序列号 手机号
result:=RegistryTransfer(PChar(Edt_SN.Text),PChar(Edt_Trans_Phone.Text));
ParseMsg(result);
end;
//
// 取消注册转接
// CancelTransfer(软件序列号)
// 如果需要取消上行短信转发到手机上,需要调用该函数。
procedure TForm1.Btn_Trans_UnRegClick(Sender: TObject);
var
result:integer;
begin // 软件序列号
result:=CancelTransfer(PChar(Edt_SN.Text));
ParseMsg(result);
end;
//
// 设置代理服务器
// SetProxy(IP,端口,用户名,密码)
// 如果是通过代理上网,需要向网管取得相关网络信息,然后调用该函数,才能够调用其他函数发短信
procedure TForm1.Btn_Set_ProxyClick(Sender: TObject);
var
result:integer;
begin
// 代理服务器IP 端口 用户名 密码
result:=SetProxy(PChar(Edt_Proxy_IP.Text),PChar(Edt_Proxy_Port.Text),PChar(Edt_Proxy_User.Text),PChar(Edt_Proxy_PWD.Text));
ParseMsg(result);
end;
//
// 修改序列号密码
// RegistryPwdUpd(软件序列号,旧密码, 新密码);
// [密码]长度为6个字节
procedure TForm1.Btn_ChangePwdClick(Sender: TObject);
var
result:integer;
begin // 软件序列号 旧密码 新密码
result:=RegistryPwdUpd(PChar(Edt_SN.Text),PChar(Edt_SN_Old_PWD.Text),PChar(Edt_SN_NEW_PWD.Text));
ParseMsg(result);
end;
//
// 发送即时短信(带附加号码,即扩展号)
// SendSMSEx(软件序列号,手机号码,短信内容, 附加号码,优先级)
// [手机号码]为手机号码字符串,以半角逗号分隔,最大小于200个手机号码
// [短信内容]为短信内容,最大长度为500字
// (不区分汉字与英文),亿美短信平台会根据实际通道自动拆分,计费以实际拆分条数为准.亿美推荐短信长度70字以内
// [附加号码]用户自定义的附加号码,一般小于6个字节
// [优先级]代表优先级,范围1~5,数值越高优先级越高
procedure TForm1.Btn_Send_Sms_AddiClick(Sender: TObject);
var
result:integer;
begin
//即时发送
try // 这里是 软件序列号 手机号 短信内容 附加号
result:=SendSMSEx(PChar(Edt_SN.Text),PChar(Edt_Sms_Phone.Text),PChar(Edt_Sms_Cont.Text),PChar(Edt_Sms_Addi.Text));
except
on exception do begin end;
end;
ParseMsg(result);
end;
//
// 发送定时短信(带附加号码,即扩展号)
// SendScheSMSEx(软件序列号, 手机号码,短信内容, 定时时间,附加号码,优先级)
// [定时时间]格式为:年年年年月月日日时时分分秒秒,例如:20090504111010 代表2009年5月4日 11时10分10秒,时间大于当前时间,小于一年以内
// [手机号码]为手机号码字符串,以半角逗号分隔,最大小于200个手机号码
// [短信内容]为短信内容,最大长度为500字(不区分汉字与英文),亿美短信平台会根据实际通道自动拆分
// ,计费以实际拆分条数为准.亿美推荐短信长度70字以内
// [附加号码]用户自定义的附加号码,一般小于6个字节
// [优先级]代表优先级,范围1~5,数值越高优先级越高
procedure TForm1.Btn_SendSche_Sms_AddiClick(Sender: TObject);
var
result:integer;
begin
//定时发送
try //软件序列号 手机号 短信内容 发送时间 附加号
result:=SendScheSMSEx(PChar(Edt_SN.Text),PChar(Edt_Sms_Phone.Text),PChar(Edt_Sms_Cont.Text),PChar(Edt_Sms_SendTime.Text),PChar(Edt_Sms_Addi.Text));
except
on exception do begin end;
end;
ParseMsg(result);
end;
//
// 得到上行短信(带附加号码)
// ReceiveSMSEx(软件序列号,自定义的接收回调函数)
// 【自定义的接收回调函数】:接收到的短信和附加号码,会通过回调函数的参数传入,在函数内部可以进行处理,例如存入数据库,写文件等。
procedure TForm1.Btn_Recv_Sms_AddiClick(Sender: TObject);
var
result:integer;
begin
try //软件序列号 传入回调方法地址
result := ReceiveSMSEx(PChar(Edt_SN.Text),@Recv_Sms_CallBack_Func);
except
on exception do begin
end;
end;
ParseMsg(result);
end;
//
// 设置Key
// SetKey(自定义的字符串)
// 如果软件序列号需要在多台机器上使用,需要先调用该函数一次,再发送短信
procedure TForm1.Btn_SetKeyClick(Sender: TObject);
var
result:integer;
begin
//设置Key(用于多台机器共用同一个序列号) 这里添加 统一自定义的字符串
result := SetKey(PChar(trim(Edt_Key.Text)));
ParseMsg(result);
end;
procedure savelogfile(a_file, a_log: string);
var logfile:textfile;
begin
assignfile(logfile,a_file);
try
if fileexists(a_file) then append(logfile) else rewrite(logfile);
writeln(logfile,'工作时间'+formatdatetime('yyyy-mm-dd hh:mm:ss',now()));
writeln(logfile,a_log);
finally
closefile(logfile);
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
isclose := true;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
//序列号,请通过亿美销售人员获取
Edt_SN.Text := '0SDK-EMY-0130-ABCDE';
//密码,请通过亿美销售人员获取
Edt_SN_PWD.Text := '123456';
Edt_Trans_Phone.Text := '13701381234';
end;
//
// 查询软件版本号
// GetSDKVersion(软件版本号)
// 【软件版本号字符串】:最少20个字节
procedure TForm1.Btn_VersionClick(Sender: TObject);
var
result:integer;
version : array[0..20] of char;
begin
// 软件序列号
FillChar(version,sizeof(version),0);
result:=GetSDKVersion(version);
ShowMessage(version);
end;
end.