From news-rocq.inria.fr!jussieu.fr!math.ohio-state.edu!news.physics.uiowa.edu!news.uiowa.edu!black.weeg.uiowa.edu!jboer Thu Mar 20 11:46:23 1997 Article: 7339 of rec.games.corewar Path: news-rocq.inria.fr!jussieu.fr!math.ohio-state.edu!news.physics.uiowa.edu!news.uiowa.edu!black.weeg.uiowa.edu!jboer From: jason Newsgroups: rec.games.corewar Subject: Evoluition ga_war.c Date: Wed, 19 Mar 1997 18:02:33 -0600 Organization: The University of Iowa Lines: 405 Message-ID: References: <199703190403.UAA11913@hungary.it.earthlink.net> NNTP-Posting-Host: black.weeg.uiowa.edu Mime-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-2130757628-1129678272-858816153=:26714" X-Sender: jboer@black.weeg.uiowa.edu To: Franz In-Reply-To: This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. ---2130757628-1129678272-858816153=:26714 Content-Type: TEXT/PLAIN; charset=US-ASCII hey, I got excited by all the evolution talk and cooked up this code it is still a little ragged but I will be fixxing it up more this next week over spring break. It evolves a population in place with no generations. It cycles though all the warrior and matches them against a random opponent a total win leads to a straight replacement of the losser. A partial win leads to a mutation replacement. A tie can lead to a in place self mutation. I also have a Valhalla where the warrior that has scored the best for a given slot is kept and sometimes is returned to battle. I does alot of file access so I load it in a ramdisk this speeds it up and keeps from grinding the disk to dust. It was compiled using djgpp 2.01 and should be able to compile anywhere with gcc and a couple of changes like the path seperator. I will be making a config-able version and working out the portablity problems soon. You need to make the directory for the a.exe and ./valhalla before running it to make a new population set create_population=1 you also need cp if you are using dos and a warior called plant.red that is a spl #0,#0 in the directory. Also pmars under dos I suggest a recompile with out go32 to avoid selector problems. ps this will not run for long under 95' because of the bug in the dpmi server. Here is a example of a program produced after 1000 cycles on a population of 100. This is closed evolution no predaters were used although that might be some thing I will try latter. ;redcode-b ;name ga_24.red ;author jason ;strategy evolved by ga_war.c 1000 cycles 100 population ;assert CORESIZE == 8000 seq.x { 4,{ 4 spl.ba # -2,* -3 mov.i { -1,< -4 djn.i * 1,> 3 jmn.f # 0,{ -3 dat.x < 2,$ 4 nop.ba $ 2,@ 3 dat.f > -3,< -3 jmn.a > -2,< 0 jmp.x $ 4,{ 2 end jason ---2130757628-1129678272-858816153=:26714 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="ga_war.c" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: DQ0KDQ0KI2luY2x1ZGUgPHN0ZGlvLmg+DQ0KI2luY2x1ZGUgPHN0cmluZy5o Pg0NCiNpbmNsdWRlIDxzdGRsaWIuaD4NDQojaW5jbHVkZSA8dGltZS5oPg0N Cg0NCg0NCnN0YXRpYyB1bnNpZ25lZCBsb25nIG51bWJlcl9vZl9vcGNvZGVz PTE3OyANDQoNDQpzdGF0aWMgY2hhciAqIG9wY29kZXNbXT17XA0NCgkJImRh dCIsIm1vdiIsImFkZCIsInN1YiIsXA0NCgkJIm11bCIsImRpdiIsIm1vZCIs ImptcCIsXA0NCgkJImpteiIsImptbiIsImRqbiIsInNwbCIsXA0NCgkJInNs dCIsImNtcCIsInNlcSIsInNuZSIsXA0NCgkJIm5vcCJ9Ow0NCg0NCg0NCnN0 YXRpYyB1bnNpZ25lZCBsb25nIG51bWJlcl9vZl9tb2RpZmllcnM9NzsgDQ0K DQ0Kc3RhdGljIGNoYXIgKiBtb2RpZmllcnNbXT0NDQoJCXsiLmEgIiwiLmIg IiwiLmFiIiwiLmJhIiwiLmYgIiwiLnggIiwiLmkgIn07DQ0KDQ0KDQ0Kc3Rh dGljIHVuc2lnbmVkIGxvbmcgbnVtYmVyX29mX2FkZHJlc3NfbW9kZXM9Nzsg DQ0KDQ0Kc3RhdGljIGNoYXIgKiBhZGRyZXNzX21vZGVzW109DQ0KCQl7IiMi LCIkIiwiQCIsIjwiLCI+IiwiKiIsInsiLCJ9In07DQ0KDQ0KLyoqKioqKioq KioqKioqKioqKioqLw0NCg0NCnN0YXRpYyBjaGFyIHBhdGhfc3ltYm9sW109 IlxcIjsNDQoNDQovKioqKioqKioqKioqKioqKioqKiovDQ0KDQ0Kc3RhdGlj IGNoYXIgcG9wdWxhdGlvbl9uYW1lWzMyXT0iIjsNDQpzdGF0aWMgaW50IHBv cHVsYXRpb25fc2l6ZT0wOw0NCnN0YXRpYyBpbnQgbnVtYmVyX29mX2N5Y2xl cz0wOw0NCnN0YXRpYyBpbnQgbnVtYmVyX29mX2JhdHRsZXM9MDsNDQoNDQpz dGF0aWMgaW50IG11dGF0aW9uX3JhdGU9MDsNDQpzdGF0aWMgaW50IHJlc3Vy cmVjdGlvbl9yYXRlPTA7DQ0Kc3RhdGljIGludCBpbnNlcnRpb25fcmF0ZT0w Ow0NCnN0YXRpYyBpbnQgcmVtb3ZhbF9yYXRlPTA7DQ0KDQ0Kc3RhdGljIGlu dCBtYXhfbnVtYmVyX3NpemU9MDsNDQpzdGF0aWMgaW50IG1heF9pbnN0cnVj dGlvbnM9MDsNDQoNDQpzdGF0aWMgaW50ICogdmFsaGFsbGFfcmVjb3JkPTA7 DQ0KDQ0KLyoqKioqKioqKioqKioqKioqKioqLw0NCg0NCmludCBhX3JhbmRv bV9pbnRlZ2VyKGludCByYW5nZSl7DQ0KDQ0KCXJldHVybiAoaW50KXJhbmdl LShyYW5kKCklKHJhbmdlKjIpKTsNDQp9DQ0KDQ0KaW50IGFfcmFuZG9tX251 bWJlcihpbnQgcmFuZ2UpIHsNDQoNDQoJcmV0dXJuIChpbnQpcmFuZCgpJXJh bmdlOw0NCn0NDQoNDQovKioqKioqKioqKioqKioqKioqKiovDQ0KDQ0Kc3Rh dGljIGNoYXIgbmV3X2xpbmVbMjU2XTsNDQoNDQpjaGFyICogbmV3X2xpbmVf b2ZfY29kZSh2b2lkKSB7DQ0KDQ0KCXNwcmludGYobmV3X2xpbmUsIiVzJXMg JXMlM2QsJXMlM2QiLA0NCgkJCW9wY29kZXNbcmFuZCgpJW51bWJlcl9vZl9v cGNvZGVzXSwNDQoJCQltb2RpZmllcnNbcmFuZCgpJW51bWJlcl9vZl9tb2Rp ZmllcnNdLA0NCgkJCWFkZHJlc3NfbW9kZXNbcmFuZCgpJW51bWJlcl9vZl9h ZGRyZXNzX21vZGVzXSwNDQoJCQlhX3JhbmRvbV9pbnRlZ2VyKG1heF9udW1i ZXJfc2l6ZSksDQ0KCQkJYWRkcmVzc19tb2Rlc1tyYW5kKCklbnVtYmVyX29m X2FkZHJlc3NfbW9kZXNdLA0NCgkJCWFfcmFuZG9tX2ludGVnZXIobWF4X251 bWJlcl9zaXplKSk7DQ0KCQkJCQ0NCglwcmludGYoIiQkJCQkICVzXG4iLG5l d19saW5lKTsNDQoJCQ0NCglyZXR1cm4gbmV3X2xpbmU7DQ0KDQ0KfS8qbmV3 X2xpbmVfb2ZfY29kZSgpKi8NDQoNDQovKioqKioqKioqKioqKioqKioqKiov DQ0KDQ0KaW50IHRlc3RfdmlhYmxlKGNoYXIgKiBmaWxlX25hbWUpIHsNDQoN DQoJRklMRSAqIGZpbGU9MDsNDQoNDQoJY2hhciBjb21tYW5kWzI1Nl07DQ0K CWNoYXIgYnVmZmVyWzI1Nl09IiI7DQ0KCWNoYXIgKiBzX3B0cj0wOw0NCg0N CglpbnQgY291bnQ9MDsNDQoNDQoJLyp0ZXN0IGxlbmd0aCovDQ0KCWlmICgo ZmlsZT1mb3BlbihmaWxlX25hbWUsInIiKSk9PTApIGV4aXQoMCk7DQ0KCQ0N CglzdHJjcHkoYnVmZmVyLCI7Iik7DQ0KDQ0KCXdoaWxlIChzdHJuY21wKGJ1 ZmZlciwiOyIsMSk9PTApDQ0KCQlmZ2V0cyAoYnVmZmVyLDI1NSxmaWxlKTsN DQoJDQ0KCXdoaWxlIChzdHJzdHIoYnVmZmVyLCJlbmQiKT09MCkgew0NCgkJ ZmdldHMgKGJ1ZmZlciwyNTUsZmlsZSk7DQ0KCQljb3VudCsrOw0NCgl9DQ0K DQ0KCWZjbG9zZShmaWxlKTsNDQoNDQoJaWYgKGNvdW50PT0wfHxjb3VudD5t YXhfaW5zdHJ1Y3Rpb25zKSB7DQ0KCQlwcmludGYoIjs7Ozs7ICVzXG4iLGZp bGVfbmFtZSk7DQ0KCQlyZXR1cm4gMDsNDQoJfQkNDQoNDQoNDQoJLyp0ZXN0 IHdpdGggcGxhbnQqLw0NCglzcHJpbnRmKGNvbW1hbmQsInBtYXJzIC1iIC1v IHBsYW50LnJlZCAlcyA+IHRlbXAudHh0IixmaWxlX25hbWUpOw0NCgkNDQoJ c3lzdGVtKGNvbW1hbmQpOw0NCg0NCglpZiAoKGZpbGU9Zm9wZW4oInRlbXAu dHh0IiwiciIpKT09MCkgZXhpdCgwKTsNDQoJDQ0KCXdoaWxlIChzdHJzdHIo YnVmZmVyLGZpbGVfbmFtZSk9PTApDQ0KCQlmZ2V0cyAoYnVmZmVyLDI1NSxm aWxlKTsNDQoJDQ0KCWZjbG9zZShmaWxlKTsNDQoNDQoJc19wdHI9KHN0cnN0 cihidWZmZXIsInNjb3JlcyIpKTsJCQ0NCgkJDQ0KCXNfcHRyKz03Ow0NCg0N CglpZiAoYXRvaShzX3B0cik8MSkgew0NCgkJcHJpbnRmKCI9PT09PSAlcyAl cyIsZmlsZV9uYW1lLHNfcHRyKTsNDQoJCXJldHVybiAwOw0NCgl9IGVsc2Ug ew0NCgkJcHJpbnRmKCI9PT09PSAlcyAlcyIsZmlsZV9uYW1lLHNfcHRyKTsN DQoJCXJldHVybiAxOw0NCgl9DQ0KDQ0KfS8qdGVzdF92aWFibGUoKSovDQ0K DQ0KLyoqKioqKioqKioqKioqKioqKioqLw0NCg0NCnZvaWQgc2V0dXAodm9p ZCl7DQ0KDQ0KCXRpbWVfdCB0Ow0NCg0NCglzcmFuZCgodW5zaWduZWQgaW50 KSB0aW1lKCYgdCkpOw0NCg0NCn0NDQoNDQovKioqKioqKioqKioqKioqKioq KiovDQ0KDQ0Kdm9pZCBjcmVhdGVfc2VlZF9wb3B1bGF0aW9uKGludCBwb3B1 bGF0aW9uX3NpemUsY2hhciAqIHBvcHVsYXRpb25fbmFtZSkgew0NCgkNDQoJ RklMRSAqIGZpbGU9MDsNDQoNDQoJaW50IGluZGV4Ow0NCg0NCgljaGFyIGNv bW1hbmRbMjU2XTsJDQ0KCWNoYXIgYnVmZmVyWzI1Nl07CQ0NCg0NCgljaGFy IGZpbGVfbmFtZVsyNTZdOw0NCg0NCglmb3IgKGluZGV4PTE7aW5kZXg8cG9w dWxhdGlvbl9zaXplKzE7aW5kZXgrKykgew0NCgkJDQ0KCQlDUkVBVEU6DQ0K DQ0KCQlzcHJpbnRmKGZpbGVfbmFtZSwiJXNfJWQucmVkIixwb3B1bGF0aW9u X25hbWUsaW5kZXgpOw0NCg0NCgkJaWYgKDA9PShmaWxlPWZvcGVuKGZpbGVf bmFtZSwidysiKSkpDQ0KCQkJZXhpdCgwKTsNDQoJCQ0NCgkJZnByaW50Zihm aWxlLCI7IHJlZGNvZGUtOTRcbiIpOw0NCgkJZnByaW50ZihmaWxlLCI7IGFz c2VydCBDT1JFU0laRSA9PSA4MDAwXG4iKTsNDQoJCQ0NCgkJZnByaW50Zihm aWxlLCI7IG5hbWUgJXNcbiIsZmlsZV9uYW1lKTsNDQoJCQ0NCgkJZnByaW50 ZihmaWxlLCIlc1xuIixuZXdfbGluZV9vZl9jb2RlKCkpOw0NCg0NCgkJZnBy aW50ZihmaWxlLCJlbmRcbiIpOw0NCg0NCgkJZnByaW50ZihmaWxlLCI7IDBc biIpOw0NCg0NCgkJZmNsb3NlKGZpbGUpOw0NCg0NCgkJaWYgKHRlc3Rfdmlh YmxlKGZpbGVfbmFtZSk9PTApIGdvdG8gQ1JFQVRFOw0NCg0NCgkJc3ByaW50 ZihidWZmZXIsIi4lc3ZhbGhhbGxhJXMlcyIscGF0aF9zeW1ib2wscGF0aF9z eW1ib2wsZmlsZV9uYW1lKTsNDQoJDQ0KCQlzcHJpbnRmKGNvbW1hbmQsImNw ICVzIC4lc3ZhbGhhbGxhIixmaWxlX25hbWUscGF0aF9zeW1ib2wpOw0NCgkN DQoJCXN5c3RlbShjb21tYW5kKTsNDQoNDQoJCX0NDQoNDQp9LypjcmVhdGVf c2VlZF9wb3B1bGF0aW9uKCkqLw0NCg0NCi8qKioqKioqKioqKioqKioqKioq Ki8NDQoNDQppbnQgYV9tdXRhdGlvbigpIHsNDQoJcmV0dXJuICgoYV9yYW5k b21fbnVtYmVyKDEwMCkrMSk8PW11dGF0aW9uX3JhdGUpOw0NCn0NDQoNDQpp bnQgYV9yZXN1cnJlY3Rpb24oKSB7DQ0KCXJldHVybiAoKGFfcmFuZG9tX251 bWJlcigxMDApKzEpPD1yZXN1cnJlY3Rpb25fcmF0ZSk7DQ0KfQ0NCg0NCmlu dCBhX2luc2VydGlvbigpIHsNDQoJcmV0dXJuICgoYV9yYW5kb21fbnVtYmVy KDEwMCkrMSk8PWluc2VydGlvbl9yYXRlKTsNDQp9DQ0KDQ0KaW50IGFfcmVt b3ZhbCgpIHsNDQoJcmV0dXJuICgoYV9yYW5kb21fbnVtYmVyKDEwMCkrMSk8 PXJlbW92YWxfcmF0ZSk7DQ0KfQ0NCg0NCi8qKioqKioqKioqKioqKioqKioq Ki8NDQoNDQpjaGFyICogZXZvbHZlX2FfbGluZShjaGFyICogb2xkX2xpbmUp IHsNDQoJDQ0KCWNoYXIgKiBuZXdfbGluZV9wdHI7DQ0KCWNoYXIgKiBvbGRf bGluZV9wdHI7DQ0KDQ0KCXN0cmNweShuZXdfbGluZSwiIik7CQ0NCg0NCglu ZXdfbGluZV9wdHI9bmV3X2xpbmU7DQ0KCW9sZF9saW5lX3B0cj1vbGRfbGlu ZTsNDQoNDQoJLypvcGNvZGUqLw0NCglpZiAoYV9tdXRhdGlvbigpKSANDQoJ CXN0cm5jcHkobmV3X2xpbmVfcHRyLG9wY29kZXNbcmFuZCgpJW51bWJlcl9v Zl9vcGNvZGVzXSwzKTsNDQoJZWxzZSANDQoJCXN0cm5jcHkobmV3X2xpbmVf cHRyLG9sZF9saW5lX3B0ciwzKTsNDQoNDQoJbmV3X2xpbmVfcHRyKz0zOwkN DQoJb2xkX2xpbmVfcHRyKz0zOwkNDQoJDQ0KCS8qbW9kaWZpZXJzKi8NDQoJ aWYgKGFfbXV0YXRpb24oKSkgDQ0KCQlzdHJuY3B5KG5ld19saW5lX3B0cixt b2RpZmllcnNbcmFuZCgpJW51bWJlcl9vZl9tb2RpZmllcnNdLDMpOw0NCgll bHNlIA0NCgkJc3RybmNweShuZXdfbGluZV9wdHIsb2xkX2xpbmVfcHRyLDMp Ow0NCg0NCgluZXdfbGluZV9wdHIrPTM7CQ0NCglvbGRfbGluZV9wdHIrPTM7 DQ0KCQ0NCglzdHJjcHkobmV3X2xpbmVfcHRyLCIgIik7CQ0NCgkNDQoJbmV3 X2xpbmVfcHRyKz0xOwkNDQoJb2xkX2xpbmVfcHRyKz0xOw0NCgkJDQ0KCS8q YWRkcmVzcyBtb2RlKi8NDQoJaWYgKGFfbXV0YXRpb24oKSkgDQ0KCQlzdHJu Y3B5KG5ld19saW5lX3B0cixhZGRyZXNzX21vZGVzW3JhbmQoKSVudW1iZXJf b2ZfYWRkcmVzc19tb2Rlc10sMSk7DQ0KCWVsc2UgDQ0KCQlzdHJuY3B5KG5l d19saW5lX3B0cixvbGRfbGluZV9wdHIsMSk7DQ0KDQ0KCW5ld19saW5lX3B0 cis9MTsJDQ0KCW9sZF9saW5lX3B0cis9MTsJDQ0KCQ0NCgkvKm51bWJlciov DQ0KCWlmIChhX211dGF0aW9uKCkpIA0NCgkJc3ByaW50ZihuZXdfbGluZV9w dHIsIiUzZCwiLGFfcmFuZG9tX2ludGVnZXIobWF4X251bWJlcl9zaXplKSk7 DQ0KCWVsc2UgDQ0KCQlzdHJuY3B5KG5ld19saW5lX3B0cixvbGRfbGluZV9w dHIsNCk7DQ0KDQ0KCW5ld19saW5lX3B0cis9NDsJDQ0KCW9sZF9saW5lX3B0 cis9NDsJDQ0KCQ0NCgkvKmFkZHJlc3MgbW9kZSovDQ0KCWlmIChhX211dGF0 aW9uKCkpIA0NCgkJc3RybmNweShuZXdfbGluZV9wdHIsYWRkcmVzc19tb2Rl c1tyYW5kKCklbnVtYmVyX29mX2FkZHJlc3NfbW9kZXNdLDEpOw0NCgllbHNl IA0NCgkJc3RybmNweShuZXdfbGluZV9wdHIsb2xkX2xpbmVfcHRyLDEpOw0N Cg0NCgluZXdfbGluZV9wdHIrPTE7CQ0NCglvbGRfbGluZV9wdHIrPTE7CQ0N Cg0NCgkvKm51bWJlciovDQ0KCWlmIChhX211dGF0aW9uKCkpIA0NCgkJc3By aW50ZihuZXdfbGluZV9wdHIsIiUzZCIsYV9yYW5kb21faW50ZWdlcihtYXhf bnVtYmVyX3NpemUpKTsNDQoJZWxzZSANDQoJCXN0cm5jcHkobmV3X2xpbmVf cHRyLG9sZF9saW5lX3B0ciwzKTsNDQoNDQoJbmV3X2xpbmVfcHRyKz0zOw0N Cg0NCglzdHJjcHkobmV3X2xpbmVfcHRyLCIiKTsJDQ0KCQ0NCglwcmludGYo Ii0tLS0tICVzXG4iLG5ld19saW5lKTsNDQoNDQoJcmV0dXJuIG5ld19saW5l Ow0NCg0NCn0vKmV2b2x2ZV9hX2xpbmUoKSovDQ0KDQ0KLyoqKioqKioqKioq KioqKioqKioqLw0NCg0NCnZvaWQgY3JlYXRlX3N1Y2Nlc3NvcihjaGFyICog c291cmNlX25hbWUsY2hhciAqIHRhcmdldF9uYW1lKSB7DQ0KDQ0KCUZJTEUg KiB0YXJnZXRfZmlsZT0wOw0NCglGSUxFICogc291cmNlX2ZpbGU9MDsNDQoN DQoJY2hhciBidWZmZXJbMjU2XTsNDQoNDQoJQ1JFQVRFOg0NCgkNDQoJaWYg KDA9PSh0YXJnZXRfZmlsZT1mb3Blbih0YXJnZXRfbmFtZSwidysiKSkpDQ0K CQlleGl0KDApOw0NCglpZiAoMD09KHNvdXJjZV9maWxlPWZvcGVuKHNvdXJj ZV9uYW1lLCJyIikpKQ0NCgkJZXhpdCgwKTsNDQoJCQ0NCglmcHJpbnRmKHRh cmdldF9maWxlLCI7IHJlZGNvZGUtOTRcbiIpOw0NCglmcHJpbnRmKHRhcmdl dF9maWxlLCI7IGFzc2VydCBDT1JFU0laRSA9PSA4MDAwXG4iKTsJDQ0KCWZw cmludGYodGFyZ2V0X2ZpbGUsIjsgbmFtZSAlc1xuIix0YXJnZXRfbmFtZSk7 DQ0KDQ0KCXN0cmNweShidWZmZXIsIjsiKTsNDQoJd2hpbGUgKHN0cnN0cihi dWZmZXIsIjsiKSE9MCkNDQoJCWZnZXRzIChidWZmZXIsMjU1LHNvdXJjZV9m aWxlKTsNDQoJDQ0KCXdoaWxlIChzdHJzdHIoYnVmZmVyLCJlbmQiKT09MCkg ew0NCgkJDQ0KCQlpZiAoYV9pbnNlcnRpb24oKSkNDQoJCQlmcHJpbnRmKHRh cmdldF9maWxlLCIlc1xuIixuZXdfbGluZV9vZl9jb2RlKCkpOw0NCg0NCgkJ aWYgKGFfcmVtb3ZhbCgpKSANDQoJCQlwcmludGYoIl1dXV1dICVzIixidWZm ZXIpOw0NCgkJZWxzZSB7IA0NCgkJCXByaW50ZigiKioqKiogJXMiLGJ1ZmZl cik7DQ0KCQkJZnByaW50Zih0YXJnZXRfZmlsZSwiJXNcbiIsZXZvbHZlX2Ff bGluZShidWZmZXIpKTsNDQoJCX0NDQoJCQ0NCgkJZmdldHMgKGJ1ZmZlciwy NTUsc291cmNlX2ZpbGUpOw0NCgl9DQ0KDQ0KCWlmIChhX2luc2VydGlvbigp KQ0NCgkJZnByaW50Zih0YXJnZXRfZmlsZSwiJXNcbiIsbmV3X2xpbmVfb2Zf Y29kZSgpKTsNDQoJDQ0KCWZwcmludGYodGFyZ2V0X2ZpbGUsImVuZFxuIik7 DQ0KCWZwcmludGYodGFyZ2V0X2ZpbGUsIjsgMFxuIik7DQ0KDQ0KCWZjbG9z ZSh0YXJnZXRfZmlsZSk7CQkNDQoJZmNsb3NlKHNvdXJjZV9maWxlKTsNDQoN DQoJaWYgKHRlc3RfdmlhYmxlKHRhcmdldF9uYW1lKT09MCkgZ290byBDUkVB VEU7DQ0KDQ0KfS8qY3JlYXRlX3N1Y2Nlc3NvcigpKi8NDQoNDQovKioqKioq KioqKioqKioqKioqKiovDQ0KDQ0KI2RlZmluZSBUT1RBTF9XSU4JIDINDQoj ZGVmaW5lIFRPVEFMX0xPU1MJLTINDQojZGVmaW5lCVdJTgkJIDENDQojZGVm aW5lCUxPU1MJCS0xDQ0KI2RlZmluZSBUSUUJCSAwDQ0KDQ0KDQ0KaW50IHJ1 bl9jb21wZXRpb24oY2hhciAqIHNvdXJjZV9uYW1lLGNoYXIgKiB0X25hbWUp IHsNDQoNDQoJRklMRSAqIGZpbGU9MDsNDQoNDQoJY2hhciBjb21tYW5kWzI1 Nl07DQ0KCWNoYXIgYnVmZmVyWzI1Nl09IiI7DQ0KCWNoYXIgKiBzX3B0cj0w Ow0NCgkNDQoJaW50IHRfc2NvcmU9MDsNDQoJaW50IHNfc2NvcmU9MDsNDQoJ DQ0KCXNwcmludGYoY29tbWFuZCwicG1hcnMgLXIgJWQgLWIgLW8gJXMgJXMg PiB0ZW1wLnR4dCIsDQ0KCQkJCW51bWJlcl9vZl9iYXR0bGVzLHNvdXJjZV9u YW1lLHRfbmFtZSk7DQ0KCQ0NCglzeXN0ZW0oY29tbWFuZCk7DQ0KDQ0KCWlm ICgoZmlsZT1mb3BlbigidGVtcC50eHQiLCJyIikpPT0wKSBleGl0KDApOw0N CgkNDQoJZmdldHMgKGJ1ZmZlciwyNTUsZmlsZSk7DQ0KDQ0KCWlmIChzdHJz dHIoYnVmZmVyLHNvdXJjZV9uYW1lKT09MCkgew0NCgkJc19wdHI9KHN0cnN0 cihidWZmZXIsInNjb3JlcyIpKTsJCQkJDQ0KCQlzX3B0cis9NzsNDQoJCXRf c2NvcmU9YXRvaShzX3B0cik7DQ0KCX0gZWxzZSB7DQ0KCQlzX3B0cj0oc3Ry c3RyKGJ1ZmZlciwic2NvcmVzIikpOwkJCQkNDQoJCXNfcHRyKz03Ow0NCgkJ c19zY29yZT1hdG9pKHNfcHRyKTsNDQoJfQ0NCg0NCglmZ2V0cyAoYnVmZmVy LDI1NSxmaWxlKTsNDQoNDQoJaWYgKHN0cnN0cihidWZmZXIsc291cmNlX25h bWUpPT0wKSB7DQ0KCQlzX3B0cj0oc3Ryc3RyKGJ1ZmZlciwic2NvcmVzIikp OwkJCQkNDQoJCXNfcHRyKz03Ow0NCgkJdF9zY29yZT1hdG9pKHNfcHRyKTsN DQoJfSBlbHNlIHsNDQoJCXNfcHRyPShzdHJzdHIoYnVmZmVyLCJzY29yZXMi KSk7CQkJCQ0NCgkJc19wdHIrPTc7DQ0KCQlzX3Njb3JlPWF0b2koc19wdHIp Ow0NCgl9DQ0KDQ0KCWZjbG9zZShmaWxlKTsNDQoNDQoJcHJpbnRmKCJeXl5e XiU5cyAlOXM6JWQgJWRcbiIsc291cmNlX25hbWUsdF9uYW1lLHNfc2NvcmUs dF9zY29yZSk7DQ0KCQ0NCglpZiAoc19zY29yZT49KDMqbnVtYmVyX29mX2Jh dHRsZXMpKSByZXR1cm4gVE9UQUxfV0lOOw0NCglpZiAodF9zY29yZT49KDMq bnVtYmVyX29mX2JhdHRsZXMpKSByZXR1cm4gVE9UQUxfTE9TUzsNDQoJaWYg KHNfc2NvcmU+dF9zY29yZSkgcmV0dXJuIFdJTjsNDQoJaWYgKHNfc2NvcmU8 dF9zY29yZSkgcmV0dXJuIExPU1M7DQ0KCXJldHVybiBUSUU7DQ0KDQ0KfQ0N Cg0NCi8qKioqKioqKioqKioqKioqKioqKi8NDQoNDQp2b2lkIHN0cmFpZ2h0 X3JlcGxhY2UoY2hhciAqIHNvdXJjZV9uYW1lLGNoYXIgKiB0YXJnZXRfbmFt ZSkgew0NCg0NCglGSUxFICogdGFyZ2V0X2ZpbGU9MDsNDQoJRklMRSAqIHNv dXJjZV9maWxlPTA7DQ0KDQ0KCWNoYXIgYnVmZmVyWzI1Nl07DQ0KCQ0NCglp ZiAoMD09KHRhcmdldF9maWxlPWZvcGVuKHRhcmdldF9uYW1lLCJ3KyIpKSkN DQoJCWV4aXQoMCk7DQ0KCWlmICgwPT0oc291cmNlX2ZpbGU9Zm9wZW4oc291 cmNlX25hbWUsInIiKSkpDQ0KCQlleGl0KDApOw0NCgkNDQoJZnByaW50Zih0 YXJnZXRfZmlsZSwiOyByZWRjb2RlLTk0XG4iKTsNDQoJZnByaW50Zih0YXJn ZXRfZmlsZSwiOyBhc3NlcnQgQ09SRVNJWkUgPT0gODAwMFxuIik7CQ0NCglm cHJpbnRmKHRhcmdldF9maWxlLCI7IG5hbWUgJXNcbiIsdGFyZ2V0X25hbWUp Ow0NCg0NCglzdHJjcHkoYnVmZmVyLCI7Iik7DQ0KCXdoaWxlIChzdHJzdHIo YnVmZmVyLCI7IikhPTApDQ0KCQlmZ2V0cyAoYnVmZmVyLDI1NSxzb3VyY2Vf ZmlsZSk7DQ0KCQ0NCgl3aGlsZSAoc3Ryc3RyKGJ1ZmZlciwiZW5kIik9PTAp IHsNDQoJCWZwcmludGYodGFyZ2V0X2ZpbGUsIiVzIixidWZmZXIpOw0NCgkJ ZmdldHMgKGJ1ZmZlciwyNTUsc291cmNlX2ZpbGUpOw0NCgkJfQ0NCg0NCglm cHJpbnRmKHRhcmdldF9maWxlLCJlbmRcbiIpOw0NCglmcHJpbnRmKHRhcmdl dF9maWxlLCI7IDBcbiIpOw0NCg0NCglmY2xvc2Uoc291cmNlX2ZpbGUpOw0N CglmY2xvc2UodGFyZ2V0X2ZpbGUpOw0NCgkJDQ0KCXByaW50ZigiISEhISEg JXMgLT4gJXNcbiIsc291cmNlX25hbWUsdGFyZ2V0X25hbWUpOwkNDQp9DQ0K DQ0KLyoqKioqKioqKioqKioqKioqKioqLw0NCg0NCmludCB2YWxoYWxsYV9z Y29yZShjaGFyICogZmlsZV9uYW1lKSB7DQ0KDQ0KCUZJTEUgKiBmaWxlPTA7 DQ0KCWNoYXIgYnVmZmVyWzI1Nl07CQ0NCg0NCglpZiAoMD09KGZpbGU9Zm9w ZW4oZmlsZV9uYW1lLCJyIikpKQ0NCgkJZXhpdCgwKTsNDQoNDQoJc3RyY3B5 KGJ1ZmZlciwiOyIpOw0NCgkNDQoJd2hpbGUgKHN0cnN0cihidWZmZXIsImVu ZCIpPT0wKSANDQoJCWZnZXRzIChidWZmZXIsMjU1LGZpbGUpOw0NCg0NCglm Z2V0cyAoYnVmZmVyLDI1NSxmaWxlKTsNDQoJCQ0NCglmY2xvc2UoZmlsZSk7 DQ0KDQ0KCXByaW50Zigic2NvcmUgJWRcbiIsYXRvaSgoYnVmZmVyKzIpKSk7 CQ0NCg0NCglyZXR1cm4gYXRvaSgoYnVmZmVyKzIpKTsJCQ0NCg0NCn0vKnZh bGhhbGxhX3Njb3JlKCkqLw0NCg0NCi8qKioqKioqKioqKioqKioqKioqKi8N DQoNDQp2b2lkIHNlbmRfdG9fdmFsaGFsbGEoaW50IHNvdXJjZV9udW1iZXIs Y2hhciAqIHNvdXJjZV9maWxlX25hbWUpIHsNDQoNDQoJY2hhciBjb21tYW5k WzI1Nl07CQ0NCgljaGFyIHRhcmdldF9maWxlX25hbWVbMjU2XTsNDQoNDQoJ LyptYWtlIHZhaGFsbGEgZmlsZSBuYW1lKi8NDQoJc3ByaW50Zih0YXJnZXRf ZmlsZV9uYW1lLCIuJXN2YWxoYWxsYSVzJXMiLHBhdGhfc3ltYm9sLHBhdGhf c3ltYm9sLHNvdXJjZV9maWxlX25hbWUpOw0NCg0NCgkvKmlzIHRoaXMgb25l IGJldHRlciB0aGFuIHRoZSBjdXJyZW50IHZhbGhhbGxhIGZpbGUqLw0NCglp Zih2YWxoYWxsYV9zY29yZSh0YXJnZXRfZmlsZV9uYW1lKT49dmFsaGFsbGFf cmVjb3JkW3NvdXJjZV9udW1iZXJdKSANDQoJCXJldHVybjsNDQoNDQoJLypp dCBub3Qgc28gY29weSB0aGUgZmlsZSB0byB2YWxoYWxsYSovDQ0KCXNwcmlu dGYoY29tbWFuZCwiY3AgJXMgLiVzdmFsaGFsbGEiLHNvdXJjZV9maWxlX25h bWUscGF0aF9zeW1ib2wpOw0NCg0NCglzeXN0ZW0oY29tbWFuZCk7DQ0KDQ0K CXZhbGhhbGxhX3JlY29yZFtzb3VyY2VfbnVtYmVyXT0wOw0NCgkNDQoJcHJp bnRmKCI+Pj4+PiAlc1xuIixzb3VyY2VfZmlsZV9uYW1lKTsNDQoNDQp9Lypz ZW5kX3RvX3ZhbGhhbGxhKCkqLw0NCg0NCi8qKioqKioqKioqKioqKioqKioq Ki8NDQoNDQp2b2lkIHJldHVybl9mcm9tX3ZhbGhhbGxhKGNoYXIgKiB0YXJn ZXRfZmlsZV9uYW1lKSB7DQ0KCQ0NCglGSUxFICogc291cmNlX2ZpbGU9MDsN DQoJRklMRSAqIHRhcmdldF9maWxlPTA7DQ0KDQ0KCWNoYXIgYnVmZmVyWzI1 Nl07CQkJCQ0NCgljaGFyIHNvdXJjZV9maWxlX25hbWVbMjU2XTsJDQ0KDQ0K CXNwcmludGYoc291cmNlX2ZpbGVfbmFtZSwiLiVzdmFsaGFsbGElcyVzIixw YXRoX3N5bWJvbCxwYXRoX3N5bWJvbCx0YXJnZXRfZmlsZV9uYW1lKTsNDQoN DQoJLyppcyB0aGlzIG9uZSBiZXR0ZXIgdGhhbiB0aGUgY3VycmVudCB2YWxo YWxsYSBmaWxlKi8NDQoJaWYodmFsaGFsbGFfc2NvcmUoc291cmNlX2ZpbGVf bmFtZSk8PXZhbGhhbGxhX3Njb3JlKHRhcmdldF9maWxlX25hbWUpKSANDQoJ CXJldHVybjsNDQoJDQ0KCWlmICgwPT0odGFyZ2V0X2ZpbGU9Zm9wZW4odGFy Z2V0X2ZpbGVfbmFtZSwidysiKSkpDQ0KCQlleGl0KDApOw0NCglpZiAoMD09 KHNvdXJjZV9maWxlPWZvcGVuKHNvdXJjZV9maWxlX25hbWUsInIiKSkpDQ0K CQlleGl0KDApOw0NCg0NCg0NCgkvKioqKiovDQ0KCWZwcmludGYodGFyZ2V0 X2ZpbGUsIjsgcmVkY29kZS05NFxuIik7DQ0KCWZwcmludGYodGFyZ2V0X2Zp bGUsIjsgYXNzZXJ0IENPUkVTSVpFID09IDgwMDBcbiIpOwkNDQoJZnByaW50 Zih0YXJnZXRfZmlsZSwiOyBuYW1lICVzXG4iLHRhcmdldF9maWxlX25hbWUp Ow0NCg0NCglzdHJjcHkoYnVmZmVyLCI7Iik7DQ0KDQ0KCXdoaWxlIChzdHJz dHIoYnVmZmVyLCI7IikhPTApICANDQoJCWZnZXRzIChidWZmZXIsMjU1LHNv dXJjZV9maWxlKTsJCQ0NCgkJDQ0KCXdoaWxlIChzdHJzdHIoYnVmZmVyLCJl bmQiKT09MCkgeyANDQoJCWZwcmludGYodGFyZ2V0X2ZpbGUsIiVzIixidWZm ZXIpOw0NCgkJZmdldHMgKGJ1ZmZlciwyNTUsc291cmNlX2ZpbGUpOwkJDQ0K CX0NDQoNDQoJZnByaW50Zih0YXJnZXRfZmlsZSwiZW5kXG4iKTsNDQoJZnBy aW50Zih0YXJnZXRfZmlsZSwiOyAwXG4iKTsNDQoJLyoqKioqLw0NCg0NCglm Y2xvc2UodGFyZ2V0X2ZpbGUpOw0NCglmY2xvc2Uoc291cmNlX2ZpbGUpOw0N Cg0NCglwcmludGYoIjw8PDw8ICVzXG4iLHRhcmdldF9maWxlX25hbWUpOw0N Cg0NCn0vKnJldHVybl9mcm9tX3ZhbGhhbGxhKCkqLw0NCg0NCi8qKioqKioq KioqKioqKioqKioqKi8NDQoJDQ0Kdm9pZCBhZGRfdG9fdmFsaGFsbGFfc2Nv cmUoY2hhciAqIGZpbGVfbmFtZSxpbnQgdGFyZ2V0X251bWJlcixpbnQgc2Nv cmUpIHsNDQoJCQkNDQoJRklMRSAqIHNvdXJjZV9maWxlPTA7DQ0KCUZJTEUg KiB0YXJnZXRfZmlsZT0wOw0NCg0NCgljaGFyIGJ1ZmZlclsyNTZdOwkJCQkN DQoJY2hhciBjb21tYW5kWzI1Nl07DQ0KDQ0KCXZhbGhhbGxhX3JlY29yZFt0 YXJnZXRfbnVtYmVyXSs9c2NvcmU7DQ0KDQ0KCWlmICgwPT0oc291cmNlX2Zp bGU9Zm9wZW4oZmlsZV9uYW1lLCJyIikpKQ0NCgkJZXhpdCgwKTsNDQoJaWYg KDA9PSh0YXJnZXRfZmlsZT1mb3BlbigidGVtcC5yZWQiLCJ3KyIpKSkNDQoJ CWV4aXQoMCk7DQ0KCQ0NCglmcHJpbnRmKHRhcmdldF9maWxlLCI7IHJlZGNv ZGUtOTRcbiIpOw0NCglmcHJpbnRmKHRhcmdldF9maWxlLCI7IGFzc2VydCBD T1JFU0laRSA9PSA4MDAwXG4iKTsJDQ0KCWZwcmludGYodGFyZ2V0X2ZpbGUs IjsgbmFtZSAlc1xuIixmaWxlX25hbWUpOw0NCg0NCglzdHJjcHkoYnVmZmVy LCI7Iik7DQ0KCXdoaWxlIChzdHJzdHIoYnVmZmVyLCI7IikhPTApICAgDQ0K CQlmZ2V0cyAoYnVmZmVyLDI1NSxzb3VyY2VfZmlsZSk7CQkNDQoNDQoJd2hp bGUgKHN0cnN0cihidWZmZXIsImVuZCIpPT0wKSB7ICANDQoJCWZwcmludGYo dGFyZ2V0X2ZpbGUsIiVzIixidWZmZXIpOw0NCgkJZmdldHMgKGJ1ZmZlciwy NTUsc291cmNlX2ZpbGUpOwkJDQ0KCX0NDQoNDQoJZnByaW50Zih0YXJnZXRf ZmlsZSwiZW5kXG4iKTsNDQoJZnByaW50Zih0YXJnZXRfZmlsZSwiOyAlZFxu Iix2YWxoYWxsYV9yZWNvcmRbdGFyZ2V0X251bWJlcl0pOw0NCg0NCglmY2xv c2Uoc291cmNlX2ZpbGUpOw0NCglmY2xvc2UodGFyZ2V0X2ZpbGUpOw0NCg0N CgkvKnJlcGxhY2UgaXQqLw0NCglzcHJpbnRmKGNvbW1hbmQsImNwIHRlbXAu cmVkICVzIixmaWxlX25hbWUpOw0NCglzeXN0ZW0oY29tbWFuZCk7DQ0KDQ0K fS8qYWRkX3RvX3ZhbGhhbGxhX3Njb3JlKCkqLw0NCg0NCi8qKioqKioqKioq KioqKioqKioqKi8NDQoNDQp2b2lkIHJ1bl9vbmVfY3ljbGUoaW50IHBvcHVs YXRpb25fc2l6ZSxjaGFyICogcG9wdWxhdGlvbl9uYW1lKSB7IA0NCg0NCglp bnQgc291cmNlX251bWJlcjsNDQoJaW50IHRhcmdldF9udW1iZXI7DQ0KCQ0N CgljaGFyIHNvdXJjZV9uYW1lWzI1Nl07DQ0KCWNoYXIgdGFyZ2V0X25hbWVb MjU2XTsNDQoNDQoJLyppbmRleCB0aHJvdWdoIHdob2xlIHBvcHVsYXRpb24q Lw0NCglmb3IgKHNvdXJjZV9udW1iZXI9MTtzb3VyY2VfbnVtYmVyPD1wb3B1 bGF0aW9uX3NpemU7c291cmNlX251bWJlcisrKSB7DQ0KCQkNDQoJCS8qcGlj ayBhIHRhcmdldCovDQ0KCQl0YXJnZXRfbnVtYmVyPXNvdXJjZV9udW1iZXI7 DQ0KCQl3aGlsZSAodGFyZ2V0X251bWJlcj09c291cmNlX251bWJlcikNDQoJ CQl0YXJnZXRfbnVtYmVyPShhX3JhbmRvbV9udW1iZXIocG9wdWxhdGlvbl9z aXplKSsxKTsNDQoNDQoJCS8qbWFrZSBmaWxlIG5hbWVzKi8NDQoJCXNwcmlu dGYoc291cmNlX25hbWUsIiVzXyVkLnJlZCIscG9wdWxhdGlvbl9uYW1lLHNv dXJjZV9udW1iZXIpOw0NCgkJc3ByaW50Zih0YXJnZXRfbmFtZSwiJXNfJWQu cmVkIixwb3B1bGF0aW9uX25hbWUsdGFyZ2V0X251bWJlcik7DQ0KDQ0KCQkN DQoJCXN3aXRjaCAocnVuX2NvbXBldGlvbihzb3VyY2VfbmFtZSx0YXJnZXRf bmFtZSkpIHsNDQoJCQkNDQoJCQljYXNlICBUT1RBTF9XSU4JOiANDQoJCQkJ YWRkX3RvX3ZhbGhhbGxhX3Njb3JlKHNvdXJjZV9uYW1lLHNvdXJjZV9udW1i ZXIsMyk7DQ0KCQkJCXNlbmRfdG9fdmFsaGFsbGEodGFyZ2V0X251bWJlcix0 YXJnZXRfbmFtZSk7DQ0KCQkJCXN0cmFpZ2h0X3JlcGxhY2Uoc291cmNlX25h bWUsdGFyZ2V0X25hbWUpOw0NCgkJCQlicmVhazsNDQoNDQoJCQljYXNlICBU T1RBTF9MT1NTIDogDQ0KCQkJCWFkZF90b192YWxoYWxsYV9zY29yZSh0YXJn ZXRfbmFtZSx0YXJnZXRfbnVtYmVyLDMpOwkJCQkNDQoJCQkJc2VuZF90b192 YWxoYWxsYShzb3VyY2VfbnVtYmVyLHNvdXJjZV9uYW1lKTsJCQkJDQ0KCQkJ CXN0cmFpZ2h0X3JlcGxhY2UodGFyZ2V0X25hbWUsc291cmNlX25hbWUpOw0N CgkJCQlicmVhazsNDQoJDQ0KCQkJY2FzZSAgV0lOIDogDQ0KCQkJCWFkZF90 b192YWxoYWxsYV9zY29yZShzb3VyY2VfbmFtZSxzb3VyY2VfbnVtYmVyLDEp Ow0NCgkJCQlzZW5kX3RvX3ZhbGhhbGxhKHRhcmdldF9udW1iZXIsdGFyZ2V0 X25hbWUpOw0NCgkJCQljcmVhdGVfc3VjY2Vzc29yKHNvdXJjZV9uYW1lLHRh cmdldF9uYW1lKTsJDQ0KCQkJCWJyZWFrOw0NCg0NCgkJCWNhc2UgIExPU1Mg OiANDQoJCQkJYWRkX3RvX3ZhbGhhbGxhX3Njb3JlKHRhcmdldF9uYW1lLHRh cmdldF9udW1iZXIsMSk7CQkJCQ0NCgkJCQlzZW5kX3RvX3ZhbGhhbGxhKHNv dXJjZV9udW1iZXIsc291cmNlX25hbWUpOw0NCgkJCQljcmVhdGVfc3VjY2Vz c29yKHRhcmdldF9uYW1lLHNvdXJjZV9uYW1lKTsJCQkJDQ0KCQkJCWJyZWFr Ow0NCgkJCQ0NCgkJCWNhc2UgICBUSUUgOgkJCQkJDQ0KCQkJCWlmIChhX3Jl c3VycmVjdGlvbigpKQkJCQkJDQ0KCQkJCQlyZXR1cm5fZnJvbV92YWxoYWxs YShzb3VyY2VfbmFtZSk7DQ0KCQkJCWVsc2UgDQ0KCQkJCQlpZiAoYV9tdXRh dGlvbigpKSB7IAkJCQkJCQ0NCgkJCQkJCXNlbmRfdG9fdmFsaGFsbGEoc291 cmNlX251bWJlcixzb3VyY2VfbmFtZSk7DQ0KCQkJCQkJY3JlYXRlX3N1Y2Nl c3Nvcihzb3VyY2VfbmFtZSwidGVtcC5yZWQiKTsNDQoJCQkJCQlzdHJhaWdo dF9yZXBsYWNlKCJ0ZW1wLnJlZCIsc291cmNlX25hbWUpOw0NCgkJCQkJfQkJ CQkNDQoJCQkJYnJlYWs7CQkJDQ0KCQkJZGVmYXVsdAk6DQ0KCQkJCWJyZWFr Ow0NCgkJfS8qc3dpdGNoKi8NDQoJfS8qZm9yKi8NDQp9LypydW5fb25lX2N5 Y2xlKCkqLw0NCg0NCi8qKioqKioqKioqKioqKioqKioqKi8NDQoNDQppbnQg bWFpbigpIHsNDQoNDQoJaW50IGluZGV4Ow0NCg0NCglpbnQgY3JlYXRlX25l d19wb3B1bGF0aW9uPTA7DQ0KDQ0KCXBvcHVsYXRpb25fc2l6ZT0xMDA7DQ0K DQ0KCW51bWJlcl9vZl9jeWNsZXM9NTAwOw0NCg0NCgltYXhfaW5zdHJ1Y3Rp b25zPTEwOw0NCg0NCgltYXhfbnVtYmVyX3NpemU9NTsNDQoNDQoJc3RyY3B5 KHBvcHVsYXRpb25fbmFtZSwiaSIpOw0NCgkNDQoJbXV0YXRpb25fcmF0ZT0y NTsNDQoNDQoJaW5zZXJ0aW9uX3JhdGU9MTA7DQ0KCXJlbW92YWxfcmF0ZT01 Ow0NCg0NCglyZXN1cnJlY3Rpb25fcmF0ZT0yOw0NCgkNDQoNDQoJbnVtYmVy X29mX2JhdHRsZXM9MzsNDQoNDQoJdmFsaGFsbGFfcmVjb3JkPShpbnQqKSBt YWxsb2Moc2l6ZW9mKGludCkqcG9wdWxhdGlvbl9zaXplKTsNDQoJLypjbGVh ciB2YWxoYWxsYV9yZWNvcmQqLw0NCglmb3IgKGluZGV4PTE7aW5kZXg8cG9w dWxhdGlvbl9zaXplKzE7aW5kZXgrKykNDQoJCSoodmFsaGFsbGFfcmVjb3Jk K2luZGV4KT0wOw0NCgkNDQoJc2V0dXAoKTsJDQ0KDQ0KCWlmIChjcmVhdGVf bmV3X3BvcHVsYXRpb24pDQ0KCQljcmVhdGVfc2VlZF9wb3B1bGF0aW9uKHBv cHVsYXRpb25fc2l6ZSxwb3B1bGF0aW9uX25hbWUpOw0NCg0NCglmb3IgKGlu ZGV4PTA7aW5kZXg8bnVtYmVyX29mX2N5Y2xlcztpbmRleCsrKSB7DQ0KCQlw cmludGYoIi4uLi4uICVkXG4iLGluZGV4KTsJDQ0KCQlydW5fb25lX2N5Y2xl KHBvcHVsYXRpb25fc2l6ZSxwb3B1bGF0aW9uX25hbWUpOw0NCgl9DQ0KDQ0K CXByaW50ZigiXG4iKTsNDQoJZm9yIChpbmRleD0xO2luZGV4PHBvcHVsYXRp b25fc2l6ZSsxO2luZGV4KyspDQ0KCQlwcmludGYoIiVkICIsKih2YWxoYWxs YV9yZWNvcmQraW5kZXgpKTsNDQoJDQ0KCXJldHVybiAxOw0NCg0NCn0NDQoN DQoNDQoaDQ0K ---2130757628-1129678272-858816153=:26714--