$PBExportHeader$uo_ljws_engine.sru forward global type uo_ljws_engine from olecustomcontrol end type end forward global type uo_ljws_engine from olecustomcontrol integer width = 128 integer height = 112 borderstyle borderstyle = stylelowered! boolean focusrectangle = false string binarykey = "uo_ljws_engine.udo" integer textsize = -12 integer weight = 400 fontcharset fontcharset = ansi! fontpitch fontpitch = variable! fontfamily fontfamily = swiss! string facename = "Arial" long textcolor = 33554432 event ocx_error ( integer number, string description, long scode, string source, string helpfile, long helpcontext, boolean canceldisplay ) event dataarrival ( long bytestotal ) event ocx_connect ( ) event connectionrequest ( long requestid ) event ocx_close ( ) event sendprogress ( long bytessent, long bytesremaining ) event sendcomplete ( ) event ue_getdatacomplete ( blob arg_bdata ) event timer pbm_timer event ue_error ( string error_msg ) event ue_thread_dataarrival ( ) event ue_startsend ( ) event ue_send ( ) event ue_thread_send ( ) event ue_thread_getdatacomplete ( ) end type global uo_ljws_engine uo_ljws_engine type variables uo_thread_ws ins_obj_thread long listenport=7896//监听端口(默认8000) string remotehost='127.0.0.1'//远程主机名(默认127.0.0.1) long remoteport=7896 //远程端口(默认8000) string separator //分割符 long ins_sendblob_size=21000000 // 数据包上限19.9M long ins_frame_size=1000 // 数据帧上限 long Compress_level =3 //1~9 ->慢 string ins_msg='' //错误信息存放 window parentwindow_p PROTECTEDWRITE long ins_self_max_cmdid=1 //当前命令ID增量,新命令则+1后取 PROTECTEDWRITE long ins_cur_cmdid=0 //当前执行的命令ID PROTECTEDWRITE long ins_cur_cmd_staus=0 //当前执行命令状态,0-执行中,1-完成,-1失败 PROTECTEDWRITE blob ins_send_blob_ori //未经处理的要发送的原blob PROTECTEDWRITE blob ins_send_blob_compress//压缩后的blob PROTECTEDWRITE blob ins_acc_blob_ori //未经处理的dataarrival事件接收到的原blob PROTECTEDWRITE blob ins_acc_blob_compress //压缩后的blob blob ins_dataarrival_blob PROTECTEDWRITE long ins_send_total=0 //当前次发送数据的总帧数 PROTECTEDWRITE long ins_send_pos=0 //当前次发送数据帧序号 long ins_get_total=0 //当前次接收数据的总帧数 long ins_get_pos=0 //当前次接收数据帧序号 //long ins_client_cmdID=0 //客户端命令ID //long ins_server_cmdID=0 //服务端命令ID private blob ins_acc_temp//存放分包合并后完整的命令(string类型) //private blob ins_cmd_blob//(未解压数据)临时存放数据,每接收到分包都加进此blob private OLEObject ins_ZIPObject boolean ins_cancel_flag=false//取消操作标志 end variables forward prototypes public subroutine reset () public subroutine close () public subroutine connecttoserver (string arg_remotehost, long arg_remoteport) public subroutine connecttoserver () public function long getstate () public function string getstatemsg () public function integer send (blob arg_blob) private function integer send_fn (long arg_dataframeno) private function integer decompress () private function blob getframeblob (long arg_dataposition) private function integer getdataframe (blob arg_blobdata) public subroutine listen () private function long get_newcmdid () private function blob p_getframeblob (s_dataframe arg_sdf) private function s_dataframe p_getframestru (blob arg_bdata) private function integer compress () public subroutine setlistenport (long arg_listenport) public function integer send (string arg_str) public function integer send () end prototypes event dataarrival(long bytestotal);//ins_obj_thread.of_runue('ue_thread_dataarrival') this.postevent('ue_thread_dataarrival') //blob lb_data //long rslt // //this.object.getdata(ref lb_data)//获取blob数据 // //rslt=getdataframe(lb_data) //if rslt=0 then // ins_msg='解释接收数据错误>'+ins_msg // this.postevent('ue_error') //end if end event event connectionrequest(long requestid);if this.object.state <> 0 then this.object.close() end if this.object.accept(requestID) end event event ocx_close();this.object.close() end event event timer;//1秒检测一次连接状态 choose case this.object.state() case 0 // st_msg.text="关闭" // ib_listen = false case 1 // st_msg.text="打开" // ib_listen = true case 2 // st_msg.text="侦听" // ib_listen = true case 3 // st_msg.text="连接挂起" case 4 // st_msg.text="识别主机" case 5 // st_msg.text="已识别主机" case 6 // st_msg.text="正在连接" case 7 // st_msg.text="已连接" case 8 // st_msg.text="同级人员正在关闭连接" this.reset() //this.object.close() this.triggerevent('ocx_close') case 9 // st_msg.text="错误" this.reset() //this.object.close() this.triggerevent('ocx_close') end choose end event event ue_thread_dataarrival();blob lb_data long rslt this.object.getdata(ref lb_data)//获取blob数据 lb_data = blob ( String(lb_data,EncodingAnsi!) ) rslt=getdataframe(lb_data) if rslt=0 then ins_msg='解释接收数据错误>'+ins_msg this.postevent('ue_error') end if end event event ue_thread_send();this.postevent('ue_send') end event event ue_thread_getdatacomplete();this.postevent('ue_thread_getdatacomplete') end event public subroutine reset ();ins_acc_temp=blob('') ins_send_blob_ori=blob('') ins_acc_blob_compress=blob('') ins_cur_cmdid=0 end subroutine public subroutine close ();this.object.close() end subroutine public subroutine connecttoserver (string arg_remotehost, long arg_remoteport);// //使用参数的连接属性连接 //IF THIS.Object.State <> 0 THEN // THIS.Object.Close() //END IF //remotehost = arg_remotehost //remoteport = arg_remoteport //THIS.Object.protocol = 0 //THIS.Object.remotehost = arg_remotehost //THIS.Object.remoteport = arg_remoteport // // //THIS.Object.Connect() // remotehost = arg_remotehost remoteport = arg_remoteport THIS.ConnectToServer() end subroutine public subroutine connecttoserver ();//使用默认连接属性连接,默认连接属性可通过直接给remotehost和remoteport赋值实现 IF THIS.Object.State <> 0 THEN THIS.Object.Close() END IF THIS.Object.protocol = 0 THIS.Object.remotehost = remotehost THIS.Object.remoteport = remoteport THIS.Object.Connect() end subroutine public function long getstate ();return this.object.state() end function public function string getstatemsg ();choose case this.object.state() case 0 return "关闭" case 1 return "打开" case 2 return "侦听" case 3 return "连接挂起" case 4 return "识别主机" case 5 return "已识别主机" case 6 return "正在连接" case 7 return "已连接" case 8 return "同级人员正在关闭连接" case 9 return "错误" end choose end function public function integer send (blob arg_blob);//发送数据的启动函数 //1.压缩 //2.分包发送->this.send() Long rslt = 1 Long ls_len string ls_sendmsg ins_msg = '' IF IsNull(arg_blob) OR Len(arg_blob) = 0 THEN ins_msg = '没有发送内容' rslt = 0 GOTO ext END IF ////Unicode码 //BlobBuf = ToUnicode(Left(sMsg, 1024))//FromUnicode() ////Ascii码 ////BlobBuf = ToAnsi(Left(sMsg, 1024))//FromAnsi() ////BlobBuf = Blob(Left(sMsg, 1024)) //转化成ToUnicode(ls_sendmsg) ls_sendmsg = String(arg_blob,EncodingAnsi!) arg_blob = Blob(ls_sendmsg,EncodingUTF16LE!) ins_send_blob_ori = arg_blob rslt = THIS.Send() ext: RETURN rslt //////////////////////////////////////////////////////////////////////////压缩处理 //////压缩dll不能在c#中使用 ////rslt = compress( ) //ins_send_blob压缩=>ins_send_blob_compress ////IF rslt = 0 THEN //// ins_msg = '发送失败>'+ins_msg //// GOTO ext ////END IF //// ////ls_len = Len(ins_send_blob_compress) //总长 // /////////////////////////////////////////////////////////////////////计算总包数 //ls_len = Len(ins_send_blob_ori) //总长 //IF Mod(ls_len,ins_frame_size) = 0 THEN // ins_send_total = Int(ls_len/ins_frame_size) //ELSE // ins_send_total = Int(ls_len/ins_frame_size)+1 //END IF // //////////////////////////////////////////////////////////////////////获取本次发包id //ins_cur_cmdid = get_newcmdid() // /////////////////////////////////////////////////////////////////////分包发送数据 ////发送第一个包,待包发送成功并返回信息时继续发包,在getdataframe处实现 //rslt = send_fn(1) //IF rslt = 0 THEN // ins_msg = '发送失败>'+ins_msg // GOTO ext //END IF // //ext: //RETURN rslt // // end function private function integer send_fn (long arg_dataframeno);Long ls_state ls_state = THIS.getstate() IF ls_state = 7 THEN THIS.Object.senddata(getframeblob(arg_dataframeno)) RETURN 1 ELSE ins_msg = "连接失败,状态:"+String(ls_state) RETURN 0 END IF end function private function integer decompress ();Blob lb_null SetNull(lb_null) Long l_rslt Long l_destLen Long rslt = 1 //0 -失败 ,1-成功 //l_destLen=ins_frame_size*10 l_destLen = ins_frame_size*10000 //这个参数的意义????????? IF l_destLen < 1000000 THEN l_destLen = 1000000 END IF IF NOT Len(ins_acc_blob_compress) > 0 OR IsNull(ins_acc_blob_compress) THEN ins_msg = '没有要解压缩的数据' rslt = 0 GOTO ext END IF Long ll_status = 0 String a_msg //if isvalid(ins_zipobject)=false then ll_status = ins_zipobject.ConnectToNewObject("longjoebz2.bz2") IF ll_status < 0 THEN CHOOSE CASE ll_status CASE -1 a_msg = "Invalid Call: the argument is the Object property of a control" CASE -2 a_msg = "Class name not found" CASE -3 a_msg = "Object could not be created" CASE -4 a_msg = "Could not connect to object" CASE -9 a_msg = "Other error" END CHOOSE ins_msg = a_msg rslt = 0 GOTO ext END IF //处理解压缩 ins_acc_blob_ori = ins_acc_blob_compress l_rslt = ins_zipobject.z2DeCompressData(REF ins_acc_blob_ori, l_destLen) IF l_rslt <> 0 THEN //失败 ins_msg = '解压缩调用失败' rslt = 0 ins_acc_blob_ori = lb_null GOTO ext END IF ext: RETURN rslt end function private function blob getframeblob (long arg_dataposition);//获得包数为arg_dataposition的分包ins_send_blob_compress数据 Long ls_total //总包数 Long ls_len //长度 Blob rslt_b rslt_b = Blob('') s_dataframe s_sdf IF arg_dataposition > ins_send_total THEN ins_msg = '不合理包序号,'+String(arg_dataposition)+'/'+String(ins_send_total) GOTO ext END IF s_sdf.cmdid = ins_cur_cmdid s_sdf.totalp = ins_send_total s_sdf.posp = arg_dataposition //if arg_dataposition=ls_total then IF arg_dataposition = ins_send_total THEN s_sdf.blobdata = BlobMid(ins_send_blob_ori,(arg_dataposition - 1) * ins_frame_size + 1) ELSE s_sdf.blobdata = BlobMid(ins_send_blob_ori,(arg_dataposition - 1) * ins_frame_size + 1,ins_frame_size) END IF rslt_b = THIS.p_getframeblob(s_sdf) //生成帧的序号 ins_send_pos = arg_dataposition ext: RETURN rslt_b end function private function integer getdataframe (blob arg_blobdata);//获取分包数据,判断数据是否已经全收完 //没有发完就继续发 Long l_nextframeno Long rslt Boolean if_getdatafinish = FALSE String ls_strblib ins_cancel_flag = FALSE //2006.7.8 //THIS.Object.senddata(ToUnicode("[getping]")) IF String(BlobMid(arg_blobdata,1,Len("[ping]"))) = "[ping]" THEN IF THIS.getstate() = 7 THEN THIS.Object.senddata(Blob("[getping]",EncodingUTF16LE!)) //THIS.Object.senddata(ToAnsi ("[getping]")) END IF GOTO ext ELSEIF String(BlobMid(arg_blobdata,1,Len("[getping]"))) = "[getping]" THEN GOTO ext ELSEIF String(BlobMid(arg_blobdata,1,Len("[datapos]"))) = "[datapos]" THEN //发包中,继续发包。。。 ls_strblib = String(arg_blobdata) l_nextframeno = Long(Mid(ls_strblib,Len("[datapos]")+1)) IF l_nextframeno > 0 AND l_nextframeno <= ins_send_total THEN //发下一个包 rslt = send_fn(l_nextframeno) IF rslt = 0 THEN if_getdatafinish = FALSE ins_msg = '下一个数据包发送失败>'+ins_msg GOTO ext END IF END IF GOTO ext ELSEIF String(BlobMid(arg_blobdata,1,Len("[cancel]"))) = "[cancel]" THEN //2006.7.8*** if_getdatafinish = FALSE ins_cancel_flag = TRUE ins_msg = '取消命令>'+ins_msg GOTO ext //2006.7.8****** END IF /////////////////////////////////////////////// //接收数据包处理 s_dataframe s_sdf // s_sdf.totalp //获取总包数 // s_sdf.posp//获取的是第几包 s_sdf = p_getframestru( arg_blobdata) //解释接收到的数据 IF s_sdf.Error <> 0 THEN ins_msg = '接收失败>'+ins_msg GOTO ext END IF IF s_sdf.totalp > 0 AND s_sdf.posp > 0 THEN IF s_sdf.totalp > s_sdf.posp THEN IF s_sdf.posp = 1 THEN //收到第一个数据包 ins_acc_temp = s_sdf.blobdata ELSE //收到其他部分数据包 ins_acc_temp = ins_acc_temp + s_sdf.blobdata END IF THIS.Object.senddata(Blob("[datapos]"+String(s_sdf.posp + 1),EncodingUTF16LE!)) //请求下一数据包 if_getdatafinish = FALSE ELSEIF s_sdf.totalp <= s_sdf.posp THEN IF s_sdf.totalp = 1 THEN ins_acc_temp = s_sdf.blobdata ELSE ins_acc_temp = ins_acc_temp + s_sdf.blobdata END IF if_getdatafinish = TRUE //如果所有数据包传送完毕返回true END IF END IF //////////////////////////////////////////////////////////// //接收完数据,解压,读取 IF if_getdatafinish THEN //如果所有数据包传送完毕返回true // ins_acc_blob_compress = ins_acc_temp // rslt = decompress() //ins_acc_blob_compress=>ins_acc_blob_ori // IF rslt = 0 THEN // ins_msg = '接收数据完毕,解压失败>' // END IF //messagebox(string(len(ins_acc_blob_compress)),string(len(ins_acc_blob_ori))) ins_acc_blob_ori = ins_acc_temp ins_acc_temp = Blob('') //reset ins_acc_temp EVENT ue_getdatacomplete(ins_acc_blob_ori) ELSE IF ins_cancel_flag THEN //取消操作 ins_acc_temp = Blob('') //reset ins_acc_temp END IF END IF //////////////////////////////////////////////////////////////// // ext: RETURN rslt end function public subroutine listen ();IF THIS.Object.State() <> 0 THEN THIS.Object.Close() END IF THIS.Object.localport = listenport //用默认端口 THIS.Object.Listen() end subroutine private function long get_newcmdid ();ins_self_max_cmdid=ins_self_max_cmdid+1 return ins_self_max_cmdid end function private function blob p_getframeblob (s_dataframe arg_sdf);//从帧结构返回blob /* long cmdID //本次命令ID ,对象内自增量 ,0-错误数据格式 long totalp //总包数 long posp //当前包数 blob blobdata //数据包,可能是压缩的 */ blob b_data b_data=Blob(string(arg_sdf.cmdID) + separator + & string(arg_sdf.totalp) + separator+ & string(arg_sdf.posp) + separator,EncodingUTF16LE!) + & arg_sdf.blobdata return b_data end function private function s_dataframe p_getframestru (blob arg_bdata);//从blob返回数据帧结构内容 s_dataframe s_df /* s_dataframe long cmdID //本次命令ID ,对象内自增量 ,0-错误数据格式 long totalp //总包数 long posp //当前包数 blob blobdata //数据包,可能是压缩的 */ Long ls_p1 = 0,ls_p2 = 0,ls_p3 = 0,ls_len,li = 0 Long lens,ls_separator_no = 0 string ls_str, ls_str1 lens = Len(separator) * 2 ls_len = Len(arg_bdata) IF ls_len < lens*3+3 THEN s_df.Error = 1 GOTO ext END IF ls_str = string(arg_bdata, EncodingANSI!) FOR li = 1 TO ls_len step 2 ls_str = String(BlobMid(arg_bdata,li,lens)) IF ls_str = separator THEN ls_separator_no = ls_separator_no+1 IF ls_separator_no = 1 THEN //cmdID 的位置 ls_p1 = li ELSEIF ls_separator_no = 2 THEN //totalp 位置 ls_p2 = li ELSEIF ls_separator_no = 3 THEN //posp 位置 ls_p3 = li EXIT END IF END IF NEXT IF ls_p3 = 0 THEN s_df.Error = 1 //没数据 GOTO ext END IF s_df.cmdID = Long(String(BlobMid(arg_bdata,1,ls_p1 - 1))) s_df.totalp = Long(String(BlobMid(arg_bdata,ls_p1+lens,ls_p2 - ls_p1 - lens))) s_df.posp = Long(String(BlobMid(arg_bdata,ls_p2+lens,ls_p3 - ls_p2 - lens))) s_df.blobdata = BlobMid(arg_bdata,ls_p3+lens) IF s_df.cmdID <= 0 OR s_df.totalp <= 0 OR s_df.posp <= 0 THEN s_df.Error = 2 //有数据但是不对 GOTO ext ELSE s_df.Error = 0 //正确 END IF ext: RETURN s_df end function private function integer compress ();Blob lb_null SetNull(lb_null) Long l_rslt Long rslt = 1 //0 -失败 ,1-成功 IF NOT Len(ins_send_blob_ori) > 0 OR IsNull(ins_send_blob_ori) THEN ins_msg = '没有要压缩的数据' rslt = 0 GOTO ext END IF //压缩代码 Long ll_status = 0 String a_msg //if isvalid(ins_zipobject)=false then ll_status = ins_zipobject.ConnectToNewObject("longjoebz2.bz2") IF ll_status < 0 THEN CHOOSE CASE ll_status CASE -1 a_msg = "Invalid Call: the argument is the Object property of a control" CASE -2 a_msg = "Class name not found" CASE -3 a_msg = "Object could not be created" CASE -4 a_msg = "Could not connect to object" CASE -9 a_msg = "Other error" END CHOOSE ins_msg = a_msg rslt = 0 GOTO ext END IF //处理压缩 ins_send_blob_compress = ins_send_blob_ori l_rslt = ins_zipobject.z2CompressData(REF ins_send_blob_compress , Compress_level ) //第二参数是压缩等级 //messagebox('压缩'+string(len(ins_send_blob_compress)),len(ins_send_blob_ori)) IF l_rslt <> 0 THEN //失败 ins_msg = '压缩调用失败' rslt = 0 ins_send_blob_compress = lb_null GOTO ext END IF ext: RETURN rslt end function public subroutine setlistenport (long arg_listenport);listenport=arg_listenport //this.listen() end subroutine public function integer send (string arg_str);//发送数据的启动函数 //1.压缩 //2.分包发送->this.send() Long rslt = 1 Long ls_len ins_msg = '' IF IsNull(arg_str) OR Len(arg_str) = 0 THEN ins_msg = '没有发送内容' rslt = 0 GOTO ext END IF //Unicode码 ins_send_blob_ori = Blob(arg_str,EncodingUTF16LE!)//FromUnicode() ////Ascii码 ////BlobBuf = ToAnsi(Left(sMsg, 1024))//FromAnsi() ////BlobBuf = Blob(Left(sMsg, 1024)) rslt = THIS.Send() ext: RETURN rslt /////////////////////////////////////////////////////////////////////计算总包数 //ls_len = Len(ins_send_blob_ori) //总长 //IF Mod(ls_len,ins_frame_size) = 0 THEN // ins_send_total = Int(ls_len/ins_frame_size) //ELSE // ins_send_total = Int(ls_len/ins_frame_size)+1 //END IF // //////////////////////////////////////////////////////////////////////获取本次发包id //ins_cur_cmdid = get_newcmdid() // /////////////////////////////////////////////////////////////////////分包发送数据 ////发送第一个包,待包发送成功并返回信息时继续发包,在getdataframe处实现 //rslt = send_fn(1) //IF rslt = 0 THEN // ins_msg = '发送失败>'+ins_msg // GOTO ext //END IF // //ext: //RETURN rslt // // end function public function integer send ();//发送数据的启动函数 //1.压缩 //2.分包发送->this.send() Long rslt = 1 Long ls_len ins_msg = '' //Unicode码 //ins_send_blob_ori = ToUnicode(arg_str)//FromUnicode() ////Ascii码 ////BlobBuf = ToAnsi(Left(sMsg, 1024))//FromAnsi() ////BlobBuf = Blob(Left(sMsg, 1024)) ////////////////////////////////////////////////////////////////////////压缩处理 ////压缩dll不能在c#中使用 //rslt = compress( ) //ins_send_blob压缩=>ins_send_blob_compress //IF rslt = 0 THEN // ins_msg = '发送失败>'+ins_msg // GOTO ext //END IF // //ls_len = Len(ins_send_blob_compress) //总长 ///////////////////////////////////////////////////////////////////计算总包数 ls_len = Len(ins_send_blob_ori) //总长 if ls_len = 0 then ins_msg = '没有发送内容' rslt = 0 GOTO ext end if IF Mod(ls_len,ins_frame_size) = 0 THEN ins_send_total = Int(ls_len/ins_frame_size) ELSE ins_send_total = Int(ls_len/ins_frame_size)+1 END IF ////////////////////////////////////////////////////////////////////获取本次发包id ins_cur_cmdid = get_newcmdid() ///////////////////////////////////////////////////////////////////分包发送数据 //发送第一个包,待包发送成功并返回信息时继续发包,在getdataframe处实现 rslt = send_fn(1) IF rslt = 0 THEN ins_msg = '发送失败>'+ins_msg GOTO ext END IF ext: RETURN rslt end function on uo_ljws_engine.create end on on uo_ljws_engine.destroy end on event destructor;destroy ins_ZIPObject this.object.close() end event event constructor;///cjh ///cjh@longserve.com ///2006-3 ins_frame_size=long(profilestring('ljprj_wiz.ini','longjoews','frame_size','1000')) // 封装基本的通讯及压缩功能 ins_ZIPObject=create OLEObject //listenport=sys_listenport //separator=char(17)+char(18) separator=char(17) parentwindow_p = getparent() //获得祖先 end event Start of PowerBuilder Binary Data Section : Do NOT Edit 0Fuo_ljws_engine.bin 2500000c00e011cfd0e11ab1a1000000000000000000000000000000000003003e0009fffe000000060000000000000000000000010000000100000000000010000000000200000001fffffffe0000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd00000004fffffffefffffffefffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006f00520074006f004500200074006e00790072000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050016ffffffffffffffff00000003000000000000000000000000000000000000000000000000000000000417c8a001cbc90800000003000001000000000000500003004c004200430049004e0045004500530045004b000000590000000000000000000000000000000000000000000000000000000000000000000000000002001cffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000480000000000500003004f0042005800430054005300450052004d0041000000000000000000000000000000000000000000000000000000000000000000000000000000000002001affffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000020000002800000000004200500043004f00530058004f00540041005200450047000000000000000000000000000000000000000000000000000000000000000000000000000000000101001a000000020000000100000004248dd89611cfbb458000bc9a8db7e7c7000000000417c8a001cbc9080417c8a001cbc90800000000000000000000000000000001fffffffefffffffefffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 21ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006300320039003400380066003000300063002d00640032002d006400310031006600630039002d00640061002d00360030003000300038003700630037006500370062006400380043003b005c003a007200500067006f006100720020006d006900460065006c005c00730079005300610062006500730053005c004c00511234432100000008000002e5000002e5248dd8920006000000000000000000000000000000000000005c003a007200500067006f006100720020006d006900461234432100000008000002e5000002e5248dd89200060000000000000000000000000000000000000072006500200065003000310053005c006200790073006100200065006500430074006e006100720020006c002e0035002e0030005c0030006900770033006e003b0032003a00430050005c006f007200720067006d006100460020006c0069007300650053005c0062007900730061005c0065006f00500065007700420072006900750064006c0072006500310020002e0031003b0035003a00430057005c004e0049004f004400530057004d005c00630069006f0072006f007300740066004e002e005400450046005c006100720065006d006f0077006b00720076005c002e0032002e00300030003500320037003b003700000000013d002200ff00fe0015028800150288fffffffe00000000fffffffffffffffe006f00430074006e006e00650073007400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001020012ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000300000028000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 1Fuo_ljws_engine.bin End of PowerBuilder Binary Data Section : No Source Expected After This Point