com php/gtk-src: Segfault bug on win32 and windows build system: main/phpg_gvalue.c win32/config.w32.in win 32/confutils.js
[email protected] (Elizabeth Marie Smith) Wed, 15 Aug 2012 01:40:50 +0000
| Newsgroups | php.gtk.cvs |
|---|---|
| Message-ID | <[email protected]> |
--61c2eea4dd17d53a008762f3e141f5a1b85a71a6 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Commit: b9901ae6000b45d2883122fcbc13dcfba6cbf61c=0AAuthor: Elizabeth = M Smith <[email protected]> Tue, 14 Aug 2012 21:40:26 -0400= =0AParents: 4cda109cf9fbc3498df709a0cf009da93919439e=0ABranches: master= =0A=0ALink: http://git.php.net/?p=3Dphp/gtk-src.git;a=3Dcommitdiff;h= =3Db9901ae6000b45d2883122fcbc13dcfba6cbf61c=0A=0ALog:=0ASegfault bug on win= 32 and windows build system=0A=0Aissue with the zend destructor using type = and getting confused when=0Athere was no type - only showed up on release b= uilds on win32 (grrr=0Astupid thing) - also fixed the compiler detection an= d flags. This=0Aprobably breaks things for older then 2008 compilers, real= ly don't care=0A=0AChanged paths:=0A M main/phpg_gvalue.c=0A M win32/co= nfig.w32.in=0A M win32/confutils.js=0A=0A --61c2eea4dd17d53a008762f3e141f5a1b85a71a6 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="diff_b9901ae6000b45d2883122fcbc13dcfba6cbf61c.txt" ZGlmZiAtLWdpdCBhL21haW4vcGhwZ19ndmFsdWUuYyBiL21haW4vcGhwZ19ndmFsdWUuYwppbmRl eCA5NGM5OTY5Li5iNDdjYWIzIDEwMDY0NAotLS0gYS9tYWluL3BocGdfZ3ZhbHVlLmMKKysrIGIv bWFpbi9waHBnX2d2YWx1ZS5jCkBAIC0xLDU1NCArMSw1NTUgQEAKLS8qCi0gKiBQSFAtR1RLIC0g VGhlIFBIUCBsYW5ndWFnZSBiaW5kaW5ncyBmb3IgR1RLKwotICoKLSAqIENvcHlyaWdodCAoQykg MjAwMS0yMDA4IEFuZHJlaSBabWlldnNraSA8YW5kcmVpQHBocC5uZXQ+Ci0gKgotICogVGhpcyBs aWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgot ICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1 YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh dGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIg b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIAotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3Ry aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9V VCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICog TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl IHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFp bHMuCi0gKiAKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBM ZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7 IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4s IDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EK LSAqLwotCi0jaW5jbHVkZSAicGhwX2d0ay5oIgotCi0jaWYgSEFWRV9QSFBfR1RLCi0KLS8qCi0g KiBHVmFsdWUgcmVsYXRlZCBmdW5jdGlvbnMKLSAqLwotCi0KLS8qIHt7eyBQSFBfR1RLX0FQSSBw aHBnX2d2YWx1ZV90b196dmFsKCkgKi8KLVBIUF9HVEtfQVBJIGludCBwaHBnX2d2YWx1ZV90b196 dmFsKGNvbnN0IEdWYWx1ZSAqZ3ZhbCwgenZhbCAqKnZhbHVlLCB6ZW5kX2Jvb2wgY29weV9ib3hl ZCwgemVuZF9ib29sIGRvX3V0ZjggVFNSTUxTX0RDKQotewotICAgIGFzc2VydCh2YWx1ZSAhPSBO VUxMKTsKLQotICAgIHN3aXRjaCAoR19UWVBFX0ZVTkRBTUVOVEFMKEdfVkFMVUVfVFlQRShndmFs KSkpIHsKLSAgICAgICAgY2FzZSBHX1RZUEVfSU5WQUxJRDoKLSAgICAgICAgY2FzZSBHX1RZUEVf Tk9ORToKLSAgICAgICAgICAgIE1BS0VfWlZBTF9JRl9OVUxMKCp2YWx1ZSk7Ci0gICAgICAgICAg ICBaVkFMX05VTEwoKnZhbHVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Ug R19UWVBFX0NIQVI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2NoYXIgdmFsID0g Z192YWx1ZV9nZXRfY2hhcihndmFsKTsKLSAgICAgICAgICAgICAgICBNQUtFX1pWQUxfSUZfTlVM TCgqdmFsdWUpOwotICAgICAgICAgICAgICAgIFpWQUxfU1RSSU5HTCgqdmFsdWUsIChjaGFyICop JnZhbCwgMSwgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAg ICBjYXNlIEdfVFlQRV9VQ0hBUjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBndWNo YXIgdmFsID0gZ192YWx1ZV9nZXRfdWNoYXIoZ3ZhbCk7Ci0gICAgICAgICAgICAgICAgTUFLRV9a VkFMX0lGX05VTEwoKnZhbHVlKTsKLSAgICAgICAgICAgICAgICBaVkFMX1NUUklOR0woKnZhbHVl LCAoY2hhciAqKSZ2YWwsIDEsIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7 Ci0KLSAgICAgICAgY2FzZSBHX1RZUEVfQk9PTEVBTjoKLSAgICAgICAgICAgIE1BS0VfWlZBTF9J Rl9OVUxMKCp2YWx1ZSk7Ci0gICAgICAgICAgICBaVkFMX0JPT0woKnZhbHVlLCBnX3ZhbHVlX2dl dF9ib29sZWFuKGd2YWwpKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgR19U WVBFX0lOVDoKLSAgICAgICAgICAgIE1BS0VfWlZBTF9JRl9OVUxMKCp2YWx1ZSk7Ci0gICAgICAg ICAgICBaVkFMX0xPTkcoKnZhbHVlLCAobG9uZylnX3ZhbHVlX2dldF9pbnQoZ3ZhbCkpOwotICAg ICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBHX1RZUEVfTE9ORzoKLSAgICAgICAgICAg IE1BS0VfWlZBTF9JRl9OVUxMKCp2YWx1ZSk7Ci0gICAgICAgICAgICBaVkFMX0xPTkcoKnZhbHVl LCAobG9uZylnX3ZhbHVlX2dldF9sb25nKGd2YWwpKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0g ICAgICAgIGNhc2UgR19UWVBFX1VJTlQ6Ci0gICAgICAgICAgICBNQUtFX1pWQUxfSUZfTlVMTCgq dmFsdWUpOwotICAgICAgICAgICAgWlZBTF9MT05HKCp2YWx1ZSwgKGxvbmcpZ192YWx1ZV9nZXRf dWludChndmFsKSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEdfVFlQRV9V TE9ORzoKLSAgICAgICAgICAgIE1BS0VfWlZBTF9JRl9OVUxMKCp2YWx1ZSk7Ci0gICAgICAgICAg ICBaVkFMX0xPTkcoKnZhbHVlLCAobG9uZylnX3ZhbHVlX2dldF91bG9uZyhndmFsKSk7Ci0gICAg ICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEdfVFlQRV9GTE9BVDoKLSAgICAgICAgICAg IE1BS0VfWlZBTF9JRl9OVUxMKCp2YWx1ZSk7Ci0gICAgICAgICAgICBaVkFMX0RPVUJMRSgqdmFs dWUsIChkb3VibGUpZ192YWx1ZV9nZXRfZmxvYXQoZ3ZhbCkpOwotICAgICAgICAgICAgYnJlYWs7 Ci0KLSAgICAgICAgY2FzZSBHX1RZUEVfRE9VQkxFOgotICAgICAgICAgICAgTUFLRV9aVkFMX0lG X05VTEwoKnZhbHVlKTsKLSAgICAgICAgICAgIFpWQUxfRE9VQkxFKCp2YWx1ZSwgKGRvdWJsZSln X3ZhbHVlX2dldF9kb3VibGUoZ3ZhbCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAg Y2FzZSBHX1RZUEVfRU5VTToKLSAgICAgICAgICAgIE1BS0VfWlZBTF9JRl9OVUxMKCp2YWx1ZSk7 Ci0gICAgICAgICAgICBaVkFMX0xPTkcoKnZhbHVlLCAobG9uZylnX3ZhbHVlX2dldF9lbnVtKGd2 YWwpKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgR19UWVBFX0ZMQUdTOgot ICAgICAgICAgICAgTUFLRV9aVkFMX0lGX05VTEwoKnZhbHVlKTsKLSAgICAgICAgICAgIFpWQUxf TE9ORygqdmFsdWUsIChsb25nKWdfdmFsdWVfZ2V0X2ZsYWdzKGd2YWwpKTsKLSAgICAgICAgICAg IGJyZWFrOwotCi0gICAgICAgIGNhc2UgR19UWVBFX1NUUklORzoKLSAgICAgICAgICAgIHsKLSAg ICAgICAgICAgICAgICBnY2hhciAqY3AgPSBOVUxMOwotICAgICAgICAgICAgICAgIGdzaXplIGNw X2xlbiA9IDA7Ci0gICAgICAgICAgICAgICAgemVuZF9ib29sIGZyZWVfY3AgPSAwOwotICAgICAg ICAgICAgICAgIGNvbnN0IGdjaGFyICpzdHIgPSBnX3ZhbHVlX2dldF9zdHJpbmcoZ3ZhbCk7Ci0K LSAgICAgICAgICAgICAgICBNQUtFX1pWQUxfSUZfTlVMTCgqdmFsdWUpOwotICAgICAgICAgICAg ICAgIGlmIChzdHIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZG9fdXRmOCkg ewotICAgICAgICAgICAgICAgICAgICAgICAgY3AgPSBwaHBnX2Zyb21fdXRmOChzdHIsIHN0cmxl bihzdHIpLCAmY3BfbGVuLCAmZnJlZV9jcCBUU1JNTFNfQ0MpOwotICAgICAgICAgICAgICAgICAg ICAgICAgaWYgKGNwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyID0gY3A7Ci0g ICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHBocF9lcnJvcihFX1dBUk5JTkcsICJDb3VsZCBub3QgY29udmVydCBzdHJpbmcgZnJvbSBV VEYtOCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9 Ci0gICAgICAgICAgICAgICAgICAgIFpWQUxfU1RSSU5HKCp2YWx1ZSwgKGNoYXIgKilzdHIsIDEp OwotICAgICAgICAgICAgICAgICAgICBpZiAoZnJlZV9jcCkgewotICAgICAgICAgICAgICAgICAg ICAgICAgZ19mcmVlKGNwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg IH0gZWxzZQotICAgICAgICAgICAgICAgICAgICBaVkFMX05VTEwoKnZhbHVlKTsKLSAgICAgICAg ICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgR19UWVBFX1BBUkFNOgot ICAgICAgICAgICAgcGhwZ19wYXJhbXNwZWNfbmV3KHZhbHVlLCBnX3ZhbHVlX2dldF9wYXJhbShn dmFsKSBUU1JNTFNfQ0MpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBHX1RZ UEVfT0JKRUNUOgotICAgICAgICAgICAgcGhwZ19nb2JqZWN0X25ldyh2YWx1ZSwgZ192YWx1ZV9n ZXRfb2JqZWN0KGd2YWwpIFRTUk1MU19DQyk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAg ICBjYXNlIEdfVFlQRV9JTlRFUkZBQ0U6Ci0gICAgICAgICAgICBpZiAoZ190eXBlX2lzX2EoR19W QUxVRV9UWVBFKGd2YWwpLCBHX1RZUEVfT0JKRUNUKSkgewotICAgICAgICAgICAgICAgIHBocGdf Z29iamVjdF9uZXcodmFsdWUsIGdfdmFsdWVfZ2V0X29iamVjdChndmFsKSBUU1JNTFNfQ0MpOwot ICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwaHBfZXJyb3IoRV9XQVJOSU5H LCAiQ291bGQgbm90IGFjY2VzcyBpbnRlcmZhY2UgJXMiLCBnX3R5cGVfbmFtZShHX1ZBTFVFX1RZ UEUoZ3ZhbCkpKTsKLSAgICAgICAgICAgICAgICBNQUtFX1NURF9aVkFMKCp2YWx1ZSk7Ci0gICAg ICAgICAgICAgICAgWlZBTF9OVUxMKCp2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZB SUxVUkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNl IEdfVFlQRV9QT0lOVEVSOgotICAgICAgICAgICAgcGhwZ19ncG9pbnRlcl9uZXcodmFsdWUsIEdf VkFMVUVfVFlQRShndmFsKSwgZ192YWx1ZV9nZXRfcG9pbnRlcihndmFsKSBUU1JNTFNfQ0MpOwot ICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBHX1RZUEVfQk9YRUQ6Ci0gICAgICAg IHsKLSAgICAgICAgICAgIHBocGdfZ2JveGVkX21hcnNoYWxfdCAqZ2JtOwotCi0gICAgICAgICAg ICBpZiAoR19WQUxVRV9IT0xEUyhndmFsLCBHX1RZUEVfUEhQX1ZBTFVFKSkgewotICAgICAgICAg ICAgICAgIHp2YWwgKm9iamVjdCA9ICh6dmFsICopIGdfdmFsdWVfZHVwX2JveGVkKGd2YWwpOwot ICAgICAgICAgICAgICAgIE1BS0VfWlZBTF9JRl9OVUxMKCp2YWx1ZSk7Ci0gICAgICAgICAgICAg ICAgaWYgKG9iamVjdCkgewotICAgICAgICAgICAgICAgICAgICBSRVBMQUNFX1pWQUxfVkFMVUUo dmFsdWUsIG9iamVjdCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIHp2YWxfcHRyX2R0b3IoJm9i amVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTVUNDRVNTOwotICAgICAgICAgICAg ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFpWQUxfTlVMTCgqdmFsdWUpOwotICAg ICAgICAgICAgICAgICAgICByZXR1cm4gRkFJTFVSRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAg ICAgICAgICB9IGVsc2UgaWYgKEdfVkFMVUVfSE9MRFMoZ3ZhbCwgR19UWVBFX1ZBTFVFX0FSUkFZ KSkgewotICAgICAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgICAgIHp2YWwgKml0ZW07 Ci0gICAgICAgICAgICAgICAgaW50IHZhbHVlX2NvdW50OwotCi0gICAgICAgICAgICAgICAgR1Zh bHVlQXJyYXkgKmFycmF5ID0gKEdWYWx1ZUFycmF5ICopIGdfdmFsdWVfZ2V0X2JveGVkKGd2YWwp OwotICAgICAgICAgICAgICAgIE1BS0VfWlZBTF9JRl9OVUxMKCp2YWx1ZSk7Ci0gICAgICAgICAg ICAgICAgYXJyYXlfaW5pdCgqdmFsdWUpOwotICAgICAgICAgICAgICAgIHZhbHVlX2NvdW50ID0g YXJyYXktPm5fdmFsdWVzOwotCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHZhbHVl X2NvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgTUFLRV9TVERfWlZBTChpdGVtKTsK LSAgICAgICAgICAgICAgICAgICAgcGhwZ19ndmFsdWVfdG9fenZhbChhcnJheS0+dmFsdWVzICsg aSwgJml0ZW0sIGNvcHlfYm94ZWQsIFRSVUUgVFNSTUxTX0NDKTsKLSAgICAgICAgICAgICAgICAg ICAgYWRkX25leHRfaW5kZXhfenZhbCgqdmFsdWUsIGl0ZW0pOwotICAgICAgICAgICAgICAgIH0K LSAgICAgICAgICAgIH0gZWxzZSBpZiAoKGdibSA9IHBocGdfZ2JveGVkX2xvb2t1cF9jdXN0b20o R19WQUxVRV9UWVBFKGd2YWwpKSkpIHsKLSAgICAgICAgICAgICAgICBNQUtFX1NURF9aVkFMKCp2 YWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdibS0+dG9fenZhbChndmFsLCB2YWx1ZSBU U1JNTFNfQ0MpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoY29w eV9ib3hlZCkgewotICAgICAgICAgICAgICAgICAgICBwaHBnX2dib3hlZF9uZXcodmFsdWUsIEdf VkFMVUVfVFlQRShndmFsKSwgZ192YWx1ZV9nZXRfYm94ZWQoZ3ZhbCksIFRSVUUsIFRSVUUgVFNS TUxTX0NDKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBw aHBnX2dib3hlZF9uZXcodmFsdWUsIEdfVkFMVUVfVFlQRShndmFsKSwgZ192YWx1ZV9nZXRfYm94 ZWQoZ3ZhbCksIEZBTFNFLCBGQUxTRSBUU1JNTFNfQ0MpOwotICAgICAgICAgICAgICAgIH0KLSAg ICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVm YXVsdDoKLSAgICAgICAgICAgIHBocF9lcnJvcihFX1dBUk5JTkcsICJQSFAtR1RLIGludGVybmFs IGVycm9yOiB1bnN1cHBvcnRlZCB0eXBlICVzIiwgZ190eXBlX25hbWUoR19WQUxVRV9UWVBFKGd2 YWwpKSk7Ci0gICAgICAgICAgICBNQUtFX1NURF9aVkFMKCp2YWx1ZSk7Ci0gICAgICAgICAgICBa VkFMX05VTEwoKnZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBGQUlMVVJFOwotICAgIH0KLQot ICAgIHJldHVybiBTVUNDRVNTOwotfQotLyogfX19ICovCi0KLS8qIHt7eyBQSFBfR1RLX0FQSSBw aHBnX2d2YWx1ZV9mcm9tX3p2YWwoKSAqLwotUEhQX0dUS19BUEkgaW50IHBocGdfZ3ZhbHVlX2Zy b21fenZhbChHVmFsdWUgKmd2YWwsIHp2YWwgKip2YWx1ZSwgemVuZF9ib29sIGRvX3V0ZjggVFNS TUxTX0RDKQotewotICAgIHN3aXRjaCAoR19UWVBFX0ZVTkRBTUVOVEFMKEdfVkFMVUVfVFlQRShn dmFsKSkpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogRm9yIHdoYXRldmVyIHJlYXNvbiwgd2Ug c2hvdWxkIGFwcGFyZW50bHkgcmVzcGVjdCB0aGF0IHRoZSBndmFsIG1heSBiZSBvZiB0aGVzZQot ICAgICAgICAgKiB0eXBlcyBhbmQgdGhleSBkbyBub3QgbmVlZCBhIHZhbHVlLgotICAgICAgICAg Ki8KLSAgICAgICAgY2FzZSBHX1RZUEVfSU5WQUxJRDoKLSAgICAgICAgY2FzZSBHX1RZUEVfTk9O RToKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgR19UWVBFX0JPT0xFQU46Ci0g ICAgICAgICAgICBjb252ZXJ0X3RvX2Jvb2xlYW5fZXgodmFsdWUpOwotICAgICAgICAgICAgZ192 YWx1ZV9zZXRfYm9vbGVhbihndmFsLCAoZ2Jvb2xlYW4pWl9CVkFMX1BQKHZhbHVlKSk7Ci0gICAg ICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEdfVFlQRV9DSEFSOgotICAgICAgICAgICAg Y29udmVydF90b19zdHJpbmdfZXgodmFsdWUpOwotICAgICAgICAgICAgZ192YWx1ZV9zZXRfY2hh cihndmFsLCBaX1NUUlZBTF9QUCh2YWx1ZSlbMF0pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAg ICAgICAgY2FzZSBHX1RZUEVfVUNIQVI6Ci0gICAgICAgICAgICBjb252ZXJ0X3RvX3N0cmluZ19l eCh2YWx1ZSk7Ci0gICAgICAgICAgICBnX3ZhbHVlX3NldF91Y2hhcihndmFsLCAoZ3VjaGFyKVpf U1RSVkFMX1BQKHZhbHVlKVswXSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNl IEdfVFlQRV9JTlQ6Ci0gICAgICAgICAgICBjb252ZXJ0X3RvX2xvbmdfZXgodmFsdWUpOwotICAg ICAgICAgICAgZ192YWx1ZV9zZXRfaW50KGd2YWwsIChnaW50KVpfTFZBTF9QUCh2YWx1ZSkpOwot ICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBHX1RZUEVfVUlOVDoKLSAgICAgICAg ICAgIGNvbnZlcnRfdG9fbG9uZ19leCh2YWx1ZSk7Ci0gICAgICAgICAgICBnX3ZhbHVlX3NldF91 aW50KGd2YWwsIChndWludClaX0xWQUxfUFAodmFsdWUpKTsKLSAgICAgICAgICAgIGJyZWFrOwot Ci0gICAgICAgIGNhc2UgR19UWVBFX0xPTkc6Ci0gICAgICAgICAgICBjb252ZXJ0X3RvX2xvbmdf ZXgodmFsdWUpOwotICAgICAgICAgICAgZ192YWx1ZV9zZXRfbG9uZyhndmFsLCAoZ2xvbmcpWl9M VkFMX1BQKHZhbHVlKSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEdfVFlQ RV9VTE9ORzoKLSAgICAgICAgICAgIGNvbnZlcnRfdG9fbG9uZ19leCh2YWx1ZSk7Ci0gICAgICAg ICAgICBnX3ZhbHVlX3NldF91bG9uZyhndmFsLCAoZ3Vsb25nKVpfTFZBTF9QUCh2YWx1ZSkpOwot ICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBHX1RZUEVfRkxPQVQ6Ci0gICAgICAg ICAgICBjb252ZXJ0X3RvX2RvdWJsZV9leCh2YWx1ZSk7Ci0gICAgICAgICAgICBnX3ZhbHVlX3Nl dF9mbG9hdChndmFsLCAoZ2Zsb2F0KVpfRFZBTF9QUCh2YWx1ZSkpOwotICAgICAgICAgICAgYnJl YWs7Ci0KLSAgICAgICAgY2FzZSBHX1RZUEVfRE9VQkxFOgotICAgICAgICAgICAgY29udmVydF90 b19kb3VibGVfZXgodmFsdWUpOwotICAgICAgICAgICAgZ192YWx1ZV9zZXRfZG91YmxlKGd2YWws IFpfRFZBTF9QUCh2YWx1ZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBH X1RZUEVfRU5VTToKLSAgICAgICAgewotICAgICAgICAgICAgZ2ludCB2YWwgPSAwOwotICAgICAg ICAgICAgaWYgKHBocGdfZ3ZhbHVlX2dldF9lbnVtKEdfVkFMVUVfVFlQRShndmFsKSwgKnZhbHVl LCAmdmFsKSA9PSBGQUlMVVJFKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBSUxVUkU7Ci0g ICAgICAgICAgICB9Ci0gICAgICAgICAgICBnX3ZhbHVlX3NldF9lbnVtKGd2YWwsIHZhbCk7Ci0g ICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgR19UWVBFX0ZMQUdT OgotICAgICAgICB7Ci0gICAgICAgICAgICBnaW50IHZhbCA9IDA7Ci0gICAgICAgICAgICBpZiAo cGhwZ19ndmFsdWVfZ2V0X2ZsYWdzKEdfVkFMVUVfVFlQRShndmFsKSwgKnZhbHVlLCAmdmFsKSA9 PSBGQUlMVVJFKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBSUxVUkU7Ci0gICAgICAgICAg ICB9Ci0gICAgICAgICAgICBnX3ZhbHVlX3NldF9mbGFncyhndmFsLCB2YWwpOwotICAgICAgICAg ICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEdfVFlQRV9TVFJJTkc6Ci0gICAg ICAgIHsKLSAgICAgICAgICAgIGdjaGFyICp1dGY4ID0gTlVMTDsKLSAgICAgICAgICAgIGdzaXpl IHV0ZjhfbGVuID0gMDsKLSAgICAgICAgICAgIHplbmRfYm9vbCBmcmVlX3V0ZjggPSAwOwotICAg ICAgICAgICAgZ2NoYXIgKnN0cjsKLQotICAgICAgICAgICAgY29udmVydF90b19zdHJpbmdfZXgo dmFsdWUpOwotICAgICAgICAgICAgc3RyID0gWl9TVFJWQUxfUFAodmFsdWUpOwotICAgICAgICAg ICAgaWYgKGRvX3V0ZjgpIHsKLSAgICAgICAgICAgICAgICB1dGY4ID0gcGhwZ190b191dGY4KFpf U1RSVkFMX1BQKHZhbHVlKSwgWl9TVFJMRU5fUFAodmFsdWUpLCAmdXRmOF9sZW4sICZmcmVlX3V0 ZjggVFNSTUxTX0NDKTsKLSAgICAgICAgICAgICAgICBpZiAodXRmOCkgewotICAgICAgICAgICAg ICAgICAgICBzdHIgPSB1dGY4OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAg ICAgICAgICAgIHBocF9lcnJvcihFX1dBUk5JTkcsICJDb3VsZCBub3QgY29udmVydCBzdHJpbmcg dG8gVVRGLTgiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg ICBnX3ZhbHVlX3NldF9zdHJpbmcoZ3ZhbCwgc3RyKTsKLSAgICAgICAgICAgIGlmIChmcmVlX3V0 ZjgpIHsKLSAgICAgICAgICAgICAgICBnX2ZyZWUodXRmOCk7Ci0gICAgICAgICAgICB9Ci0gICAg ICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgR19UWVBFX1BPSU5URVI6 Ci0gICAgICAgICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSA9PSBJU19OVUxMKSB7Ci0gICAgICAg ICAgICAgICAgZ192YWx1ZV9zZXRfcG9pbnRlcihndmFsLCBOVUxMKTsKLSAgICAgICAgICAgIH0g ZWxzZSBpZiAoWl9UWVBFX1BQKHZhbHVlKSA9PSBJU19PQkpFQ1QKLSAgICAgICAgICAgICAgICAg ICAgICAgJiYgaW5zdGFuY2VvZl9mdW5jdGlvbihaX09CSkNFX1BQKHZhbHVlKSwgZ3BvaW50ZXJf Y2UgVFNSTUxTX0NDKQotICAgICAgICAgICAgICAgICAgICAgICAmJiBHX1ZBTFVFX0hPTERTKGd2 YWwsICgocGhwZ19ncG9pbnRlcl90KilQSFBHX0dFVCgqdmFsdWUpKS0+Z3R5cGUpKSB7Ci0gICAg ICAgICAgICAgICAgZ192YWx1ZV9zZXRfcG9pbnRlcihndmFsLCAoKHBocGdfZ3BvaW50ZXJfdCop UEhQR19HRVQoKnZhbHVlKSktPnBvaW50ZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAg ICAgICAgICAgICByZXR1cm4gRkFJTFVSRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJy ZWFrOwotCi0gICAgICAgIGNhc2UgR19UWVBFX0JPWEVEOgotICAgICAgICB7Ci0gICAgICAgICAg ICBwaHBnX2dib3hlZF9tYXJzaGFsX3QgKmdibTsKLQotICAgICAgICAgICAgaWYgKFpfVFlQRV9Q UCh2YWx1ZSkgPT0gSVNfTlVMTCkgewotICAgICAgICAgICAgICAgIGdfdmFsdWVfc2V0X2JveGVk KGd2YWwsIE5VTEwpOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFdlIHNob3VsZCBi ZSBzYWZlIGp1c3Qgc2V0dGluZyB0aGUgenZhbCBoZXJlLCBzaW5jZSBHX1RZUEVfUEhQX1ZBTFVF IGlzCi0gICAgICAgICAgICAgKiBzdXBwb3NlZCB0byB0YWtlIGFueSB6dmFsIHR5cGUuCi0gICAg ICAgICAgICAgKi8KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoR19WQUxVRV9IT0xEUyhndmFsLCBH X1RZUEVfUEhQX1ZBTFVFKSkgewotICAgICAgICAgICAgICAgIGdfdmFsdWVfc2V0X2JveGVkKGd2 YWwsICp2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgPT0g SVNfT0JKRUNUCi0gICAgICAgICAgICAgICAgICAgICAgICYmIGluc3RhbmNlb2ZfZnVuY3Rpb24o Wl9PQkpDRV9QUCh2YWx1ZSksIGdib3hlZF9jZSBUU1JNTFNfQ0MpCi0gICAgICAgICAgICAgICAg ICAgICAgICYmIEdfVkFMVUVfSE9MRFMoZ3ZhbCwgKChwaHBnX2dib3hlZF90KilQSFBHX0dFVCgq dmFsdWUpKS0+Z3R5cGUpKSB7Ci0gICAgICAgICAgICAgICAgZ192YWx1ZV9zZXRfYm94ZWQoZ3Zh bCwgUEhQR19HQk9YRUQoKnZhbHVlKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChnYm0gPSBw aHBnX2dib3hlZF9sb29rdXBfY3VzdG9tKEdfVkFMVUVfVFlQRShndmFsKSkpKSB7Ci0gICAgICAg ICAgICAgICAgcmV0dXJuIGdibS0+ZnJvbV96dmFsKCp2YWx1ZSwgZ3ZhbCBUU1JNTFNfQ0MpOwot ICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBSUxVUkU7Ci0gICAg ICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgR19UWVBFX1BBUkFNOgot ICAgICAgICAgICAgaWYgKHBocF9ndGtfY2hlY2tfY2xhc3MoKnZhbHVlLCBncGFyYW1zcGVjX2Nl KSkgewotICAgICAgICAgICAgICAgIGdfdmFsdWVfc2V0X3BhcmFtKGd2YWwsIFBIUEdfR1BBUkFN U1BFQygqdmFsdWUpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0 dXJuIEZBSUxVUkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNh c2UgR19UWVBFX09CSkVDVDoKLSAgICAgICAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpID09IElT X05VTEwpIHsKLSAgICAgICAgICAgICAgICBnX3ZhbHVlX3NldF9vYmplY3QoZ3ZhbCwgTlVMTCk7 Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFpfVFlQRV9QKCp2YWx1ZSkgPT0gSVNfT0JKRUNUCi0g ICAgICAgICAgICAgICAgICAgICAgICYmIGluc3RhbmNlb2ZfZnVuY3Rpb24oWl9PQkpDRV9QUCh2 YWx1ZSksIGdvYmplY3RfY2UgVFNSTUxTX0NDKQotICAgICAgICAgICAgICAgICAgICAgICAmJiBH X1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRShQSFBHX0dPQkpFQ1QoKnZhbHVlKSwgR19WQUxVRV9U WVBFKGd2YWwpKSkgewotICAgICAgICAgICAgICAgIGdfdmFsdWVfc2V0X29iamVjdChndmFsLCBQ SFBHX0dPQkpFQ1QoKnZhbHVlKSk7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAg ICByZXR1cm4gRkFJTFVSRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgR19U WVBFX0lOVEVSRkFDRToKLSAgICAgICAgICAgIGlmIChnX3R5cGVfaXNfYShHX1ZBTFVFX1RZUEUo Z3ZhbCksIEdfVFlQRV9PQkpFQ1QpICYmCi0gICAgICAgICAgICAgICAgWl9UWVBFX1BQKHZhbHVl KSA9PSBJU19PQkpFQ1QgJiYKLSAgICAgICAgICAgICAgICBHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0Vf VFlQRShQSFBHX0dPQkpFQ1QoKnZhbHVlKSwgR19WQUxVRV9UWVBFKGd2YWwpKSkgewotICAgICAg ICAgICAgICAgIGdfdmFsdWVfc2V0X29iamVjdChndmFsLCBQSFBHX0dPQkpFQ1QoKnZhbHVlKSk7 Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBocF9lcnJvcihFX1dBUk5J TkcsICJDb3VsZCBub3QgYWNjZXNzIGludGVyZmFjZSAlcyIsIGdfdHlwZV9uYW1lKEdfVkFMVUVf VFlQRShndmFsKSkpOwotICAgICAgICAgICAgICAgIHJldHVybiBGQUlMVVJFOwotICAgICAgICAg ICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAg IHBocF9lcnJvcihFX1dBUk5JTkcsICJQSFAtR1RLIGludGVybmFsIGVycm9yOiB1bnN1cHBvcnRl ZCB0eXBlICVzIiwgZ190eXBlX25hbWUoR19WQUxVRV9UWVBFKGd2YWwpKSk7Ci0gICAgICAgICAg ICByZXR1cm4gRkFJTFVSRTsKLQotICAgIH0KLQotICAgIHJldHVybiBTVUNDRVNTOwotfQotLyog fX19ICovCi0KLS8qIHt7eyBQSFBfR1RLX0FQSSBwaHBnX3BhcmFtX2d2YWx1ZV90b196dmFsKCkg Ki8KLVBIUF9HVEtfQVBJIGludCBwaHBnX3BhcmFtX2d2YWx1ZV90b196dmFsKGNvbnN0IEdWYWx1 ZSAqZ3ZhbCwgenZhbCAqKnZhbHVlLCB6ZW5kX2Jvb2wgY29weV9ib3hlZCwgY29uc3QgR1BhcmFt U3BlYyAqcHNwZWMgVFNSTUxTX0RDKQotewotICAgIGlmIChHX0lTX1BBUkFNX1NQRUNfVU5JQ0hB Uihwc3BlYykpIHsKLSAgICAgICAgLyogVE9ETyAqLwotICAgICAgICByZXR1cm4gRkFJTFVSRTsK LSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gcGhwZ19ndmFsdWVfdG9fenZhbChndmFsLCB2 YWx1ZSwgY29weV9ib3hlZCwgVFJVRSBUU1JNTFNfQ0MpOwotICAgIH0KLX0KLS8qIH19fSAqLwot Ci0vKiB7e3sgUEhQX0dUS19BUEkgcGhwZ19wYXJhbV9ndmFsdWVfZnJvbV96dmFsKCkgKi8KLVBI UF9HVEtfQVBJIGludCBwaHBnX3BhcmFtX2d2YWx1ZV9mcm9tX3p2YWwoR1ZhbHVlICpndmFsLCB6 dmFsICoqdmFsdWUsIGNvbnN0IEdQYXJhbVNwZWMgKnBzcGVjIFRTUk1MU19EQykKLXsKLSAgICBp ZiAoR19JU19QQVJBTV9TUEVDX1VOSUNIQVIocHNwZWMpKSB7Ci0gICAgICAgIC8qIFRPRE8gKi8K LSAgICAgICAgcmV0dXJuIEZBSUxVUkU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHBo cGdfZ3ZhbHVlX2Zyb21fenZhbChndmFsLCB2YWx1ZSwgVFJVRSBUU1JNTFNfQ0MpOwotICAgIH0K LX0KLS8qIH19fSAqLwotCi0vKiB7e3sgUEhQX0dUS19BUEkgcGhwZ19ndmFsdWVzX3RvX2FycmF5 KCkgKi8KLVBIUF9HVEtfQVBJIHp2YWwgKnBocGdfZ3ZhbHVlc190b19hcnJheShjb25zdCBHVmFs dWUgKnZhbHVlcywgdWludCBuX3ZhbHVlcykKLXsKLQl6dmFsICpoYXNoOwotCXp2YWwgKml0ZW0g PSBOVUxMOwotCWludCBpOwotCWludCB2YWx1ZV9jb3VudDsKLQotCU1BS0VfU1REX1pWQUwoaGFz aCk7Ci0JYXJyYXlfaW5pdChoYXNoKTsKLQl2YWx1ZV9jb3VudCA9IG5fdmFsdWVzOwotCi0JZm9y IChpID0gMDsgaSA8IHZhbHVlX2NvdW50OyBpKyspIHsKLQkJLy9pdGVtID0gcGhwZ19ndmFsdWVf dG9fenZhbCgmdmFsdWVzW2ldLCBGQUxTRSk7Ci0JCWlmICghaXRlbSkgewotCQkJTUFLRV9TVERf WlZBTChpdGVtKTsKLQkJCVpWQUxfTlVMTChpdGVtKTsKLQkJfQotCQl6ZW5kX2hhc2hfbmV4dF9p bmRleF9pbnNlcnQoWl9BUlJWQUxfUChoYXNoKSwgJml0ZW0sIHNpemVvZih6dmFsICopLCBOVUxM KTsKLQl9Ci0KLQlyZXR1cm4gaGFzaDsKLX0KLS8qIH19fSAqLwotCi0vKiB7e3sgUEhQX0dUS19B UEkgcGhwZ19ndmFsdWVfZ2V0X2VudW0oKSAqLwotUEhQX0dUS19BUEkgaW50IHBocGdfZ3ZhbHVl X2dldF9lbnVtKEdUeXBlIGVudW1fdHlwZSwgenZhbCAqZW51bV92YWwsIGdpbnQgKnJlc3VsdCkK LXsKLSAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBGQUlMVVJFOwotCi0g ICAgaWYgKGVudW1fdmFsID09IE5VTEwpIHsKLSAgICAgICAgKnJlc3VsdCA9IDA7Ci0gICAgfSBl bHNlIGlmIChaX1RZUEVfUChlbnVtX3ZhbCkgPT0gSVNfTE9ORykgewotICAgICAgICAqcmVzdWx0 ID0gWl9MVkFMX1AoZW51bV92YWwpOwotICAgIH0gZWxzZSBpZiAoWl9UWVBFX1AoZW51bV92YWwp ID09IElTX1NUUklORykgewotICAgICAgICBHRW51bUNsYXNzICplY2xhc3MgPSBOVUxMOwotICAg ICAgICBHRW51bVZhbHVlICppbmZvID0gTlVMTDsKLQotICAgICAgICBpZiAoZW51bV90eXBlICE9 IEdfVFlQRV9OT05FKSB7Ci0gICAgICAgICAgICBlY2xhc3MgPSBHX0VOVU1fQ0xBU1MoZ190eXBl X2NsYXNzX3JlZihlbnVtX3R5cGUpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBo cF9lcnJvcihFX1dBUk5JTkcsICJQSFAtR1RLIGludGVybmFsIGVycm9yOiBjb3VsZCBub3Qgb2J0 YWluIHRoZSB0eXBlIG9mIGVudW0iKTsKLSAgICAgICAgICAgIHJldHVybiBGQUlMVVJFOwotICAg ICAgICB9Ci0KLSAgICAgICAgaW5mbyA9IGdfZW51bV9nZXRfdmFsdWVfYnlfbmFtZShlY2xhc3Ms IFpfU1RSVkFMX1AoZW51bV92YWwpKTsKLQotICAgICAgICBpZiAoaW5mbyA9PSBOVUxMKSB7Ci0g ICAgICAgICAgICBpbmZvID0gZ19lbnVtX2dldF92YWx1ZV9ieV9uaWNrKGVjbGFzcywgWl9TVFJW QUxfUChlbnVtX3ZhbCkpOwotICAgICAgICB9Ci0gICAgICAgIGdfdHlwZV9jbGFzc191bnJlZihl Y2xhc3MpOwotICAgICAgICAKLSAgICAgICAgaWYgKGluZm8gIT0gTlVMTCkgewotICAgICAgICAg ICAgKnJlc3VsdCA9IGluZm8tPnZhbHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg cGhwX2Vycm9yKEVfV0FSTklORywgIlBIUC1HVEsgaW50ZXJuYWwgZXJyb3I6IGNvdWxkIG5vdCBj b252ZXJ0ICclcycgdG8gZW51bSIsIFpfU1RSVkFMX1AoZW51bV92YWwpKTsKLSAgICAgICAgICAg IHJldHVybiBGQUlMVVJFOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcGhwX2Vy cm9yKEVfV0FSTklORywgIlBIUC1HVEsgaW50ZXJuYWwgZXJyb3I6IGVudW1zIG11c3QgYmUgc3Ry aW5ncyBvciBpbnRlZ2VycyIpOwotICAgICAgICByZXR1cm4gRkFJTFVSRTsKLSAgICB9Ci0KLSAg ICByZXR1cm4gU1VDQ0VTUzsKLX0KLS8qIH19fSAqLwotCi0vKiB7e3sgUEhQX0dUS19BUEkgcGhw Z19ndmFsdWVfZ2V0X2ZsYWdzKCkgKi8KLVBIUF9HVEtfQVBJIGludCBwaHBnX2d2YWx1ZV9nZXRf ZmxhZ3MoR1R5cGUgZmxhZ3NfdHlwZSwgenZhbCAqZmxhZ3NfdmFsLCBnaW50ICpyZXN1bHQpCi17 Ci0gICAgR0ZsYWdzQ2xhc3MgKmZjbGFzcyA9IE5VTEw7Ci0gICAgR0ZsYWdzVmFsdWUgKmluZm8g PSBOVUxMOwotCi0gICAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gRkFJTFVS RTsKLQotICAgIGlmIChmbGFnc192YWwgPT0gTlVMTCkgewotICAgICAgICAqcmVzdWx0ID0gMDsK LSAgICB9IGVsc2UgaWYgKFpfVFlQRV9QKGZsYWdzX3ZhbCkgPT0gSVNfTE9ORykgewotICAgICAg ICAqcmVzdWx0ID0gWl9MVkFMX1AoZmxhZ3NfdmFsKTsKLSAgICB9IGVsc2UgaWYgKFpfVFlQRV9Q KGZsYWdzX3ZhbCkgPT0gSVNfU1RSSU5HKSB7Ci0gICAgICAgIGlmIChmbGFnc190eXBlICE9IEdf VFlQRV9OT05FKSB7Ci0gICAgICAgICAgICBmY2xhc3MgPSBHX0ZMQUdTX0NMQVNTKGdfdHlwZV9j bGFzc19yZWYoZmxhZ3NfdHlwZSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGhw X2Vycm9yKEVfV0FSTklORywgIlBIUC1HVEsgaW50ZXJuYWwgZXJyb3I6IGNvdWxkIG5vdCBvYnRh aW4gdGhlIHR5cGUgb2YgZmxhZ3MiKTsKLSAgICAgICAgICAgIHJldHVybiBGQUlMVVJFOwotICAg ICAgICB9Ci0KLSAgICAgICAgaW5mbyA9IGdfZmxhZ3NfZ2V0X3ZhbHVlX2J5X25hbWUoZmNsYXNz LCBaX1NUUlZBTF9QKGZsYWdzX3ZhbCkpOwotICAgICAgICBpZiAoaW5mbyA9PSBOVUxMKSB7Ci0g ICAgICAgICAgICBpbmZvID0gZ19mbGFnc19nZXRfdmFsdWVfYnlfbmljayhmY2xhc3MsIFpfU1RS VkFMX1AoZmxhZ3NfdmFsKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZ190eXBlX2NsYXNzX3VucmVm KGZjbGFzcyk7Ci0KLSAgICAgICAgaWYgKGluZm8gIT0gTlVMTCkgewotICAgICAgICAgICAgKnJl c3VsdCA9IGluZm8tPnZhbHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGhwX2Vy cm9yKEVfV0FSTklORywgIlBIUC1HVEsgaW50ZXJuYWwgZXJyb3I6IGNvdWxkIG5vdCBjb252ZXJ0 ICclcycgdG8gZmxhZ3MiLCBaX1NUUlZBTF9QKGZsYWdzX3ZhbCkpOwotICAgICAgICAgICAgcmV0 dXJuIEZBSUxVUkU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKFpfVFlQRV9QKGZsYWdzX3Zh bCkgPT0gSVNfQVJSQVkpIHsKLQkJenZhbCAqKmZsYWc7Ci0KLSAgICAgICAgKnJlc3VsdCA9IDA7 Ci0gICAgICAgIGlmIChmbGFnc190eXBlICE9IEdfVFlQRV9OT05FKSB7Ci0gICAgICAgICAgICBm Y2xhc3MgPSBHX0ZMQUdTX0NMQVNTKGdfdHlwZV9jbGFzc19yZWYoZmxhZ3NfdHlwZSkpOwotICAg ICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGhwX2Vycm9yKEVfV0FSTklORywgIlBIUC1HVEsg aW50ZXJuYWwgZXJyb3I6IGNvdWxkIG5vdCBvYnRhaW4gdGhlIHR5cGUgb2YgZmxhZ3MiKTsKLSAg ICAgICAgICAgIHJldHVybiBGQUlMVVJFOwotICAgICAgICB9Ci0KLQkJZm9yICh6ZW5kX2hhc2hf aW50ZXJuYWxfcG9pbnRlcl9yZXNldChaX0FSUlZBTF9QKGZsYWdzX3ZhbCkpOwotCQkJIHplbmRf aGFzaF9nZXRfY3VycmVudF9kYXRhKFpfQVJSVkFMX1AoZmxhZ3NfdmFsKSwgKHZvaWQgKiopJmZs YWcpID09IFNVQ0NFU1M7Ci0JCQkgemVuZF9oYXNoX21vdmVfZm9yd2FyZChaX0FSUlZBTF9QKGZs YWdzX3ZhbCkpKSB7Ci0KLQkJCWlmIChaX1RZUEVfUFAoZmxhZykgPT0gSVNfTE9ORykgewotCQkJ CSpyZXN1bHQgfD0gWl9MVkFMX1BQKGZsYWcpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChaX1RZ UEVfUFAoZmxhZykgPT0gSVNfU1RSSU5HKSB7Ci0gICAgICAgICAgICAgICAgaW5mbyA9IGdfZmxh Z3NfZ2V0X3ZhbHVlX2J5X25hbWUoZmNsYXNzLCBaX1NUUlZBTF9QUChmbGFnKSk7Ci0gICAgICAg ICAgICAgICAgaWYgKGluZm8gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBpbmZvID0g Z19mbGFnc19nZXRfdmFsdWVfYnlfbmljayhmY2xhc3MsIFpfU1RSVkFMX1BQKGZsYWcpKTsKLSAg ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGluZm8gIT0gTlVMTCkgewotICAg ICAgICAgICAgICAgICAgICAqcmVzdWx0IHw9IGluZm8tPnZhbHVlOwotICAgICAgICAgICAgICAg IH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBocF9lcnJvcihFX1dBUk5JTkcsICJQSFAt R1RLIGludGVybmFsIGVycm9yOiBjb3VsZCBub3QgY29udmVydCAnJXMnIHRvIGZsYWdzIiwgWl9T VFJWQUxfUFAoZmxhZykpOwotICAgICAgICAgICAgICAgICAgICBnX3R5cGVfY2xhc3NfdW5yZWYo ZmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBSUxVUkU7Ci0gICAgICAgICAg ICAgICAgfQotCQkJfSBlbHNlIHsKLQkJCQlwaHBfZXJyb3IoRV9XQVJOSU5HLCAiUEhQLUdUSyBm bGFnIGFycmF5cyBjYW4gY29udGFpbiBvbmx5IGludGVnZXJzIG9yIHN0cmluZ3MiKTsKLSAgICAg ICAgICAgICAgICBnX3R5cGVfY2xhc3NfdW5yZWYoZmNsYXNzKTsKLQkJCQlyZXR1cm4gMDsKLQkJ CX0KLQkJfQotICAgICAgICBnX3R5cGVfY2xhc3NfdW5yZWYoZmNsYXNzKTsKLSAgICB9IGVsc2Ug ewotICAgICAgICBwaHBfZXJyb3IoRV9XQVJOSU5HLCAiUEhQLUdUSyBmbGFncyBtdXN0IGJlIHN0 cmluZ3MsIGludGVnZXJzLCBvciBhcnJheXMgb2Ygc3RyaW5ncyBvciBpbnRlZ2VycyIpOwotICAg ICAgICByZXR1cm4gRkFJTFVSRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gU1VDQ0VTUzsKLX0KLS8q IH19fSAqLwotCi0jZW5kaWYKLQotLyogdmltOiBzZXQgZmRtPW1hcmtlciBldCA6ICovCisvKg0K KyAqIFBIUC1HVEsgLSBUaGUgUEhQIGxhbmd1YWdlIGJpbmRpbmdzIGZvciBHVEsrDQorICoNCisg KiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBBbmRyZWkgWm1pZXZza2kgPGFuZHJlaUBwaHAubmV0 Pg0KKyAqDQorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0 cmlidXRlIGl0IGFuZC9vcg0KKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO VSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUg RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXINCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUg TGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCisgKiANCisg KiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl IHVzZWZ1bCwNCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg aW1wbGllZCB3YXJyYW50eSBvZg0KKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQorICogTGVzc2VyIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCisgKiANCisgKiBZb3Ugc2hvdWxkIGhhdmUg cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQorICogTGlj ZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBT b2Z0d2FyZQ0KKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMw LCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0ENCisgKi8NCisNCisjaW5jbHVkZSAicGhwX2d0 ay5oIg0KKw0KKyNpZiBIQVZFX1BIUF9HVEsNCisNCisvKg0KKyAqIEdWYWx1ZSByZWxhdGVkIGZ1 bmN0aW9ucw0KKyAqLw0KKw0KKw0KKy8qIHt7eyBQSFBfR1RLX0FQSSBwaHBnX2d2YWx1ZV90b196 dmFsKCkgKi8NCitQSFBfR1RLX0FQSSBpbnQgcGhwZ19ndmFsdWVfdG9fenZhbChjb25zdCBHVmFs dWUgKmd2YWwsIHp2YWwgKip2YWx1ZSwgemVuZF9ib29sIGNvcHlfYm94ZWQsIHplbmRfYm9vbCBk b191dGY4IFRTUk1MU19EQykNCit7DQorICAgIGFzc2VydCh2YWx1ZSAhPSBOVUxMKTsNCisNCisg ICAgc3dpdGNoIChHX1RZUEVfRlVOREFNRU5UQUwoR19WQUxVRV9UWVBFKGd2YWwpKSkgew0KKyAg ICAgICAgY2FzZSBHX1RZUEVfSU5WQUxJRDoNCisgICAgICAgIGNhc2UgR19UWVBFX05PTkU6DQor ICAgICAgICAgICAgTUFLRV9aVkFMX0lGX05VTEwoKnZhbHVlKTsNCisgICAgICAgICAgICBaVkFM X05VTEwoKnZhbHVlKTsNCisgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgR19U WVBFX0NIQVI6DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBnY2hhciB2YWwgPSBn X3ZhbHVlX2dldF9jaGFyKGd2YWwpOw0KKyAgICAgICAgICAgICAgICBNQUtFX1pWQUxfSUZfTlVM TCgqdmFsdWUpOw0KKyAgICAgICAgICAgICAgICBaVkFMX1NUUklOR0woKnZhbHVlLCAoY2hhciAq KSZ2YWwsIDEsIDEpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisNCisg ICAgICAgIGNhc2UgR19UWVBFX1VDSEFSOg0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAg ICAgZ3VjaGFyIHZhbCA9IGdfdmFsdWVfZ2V0X3VjaGFyKGd2YWwpOw0KKyAgICAgICAgICAgICAg ICBNQUtFX1pWQUxfSUZfTlVMTCgqdmFsdWUpOw0KKyAgICAgICAgICAgICAgICBaVkFMX1NUUklO R0woKnZhbHVlLCAoY2hhciAqKSZ2YWwsIDEsIDEpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAg ICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgR19UWVBFX0JPT0xFQU46DQorICAgICAgICAg ICAgTUFLRV9aVkFMX0lGX05VTEwoKnZhbHVlKTsNCisgICAgICAgICAgICBaVkFMX0JPT0woKnZh bHVlLCBnX3ZhbHVlX2dldF9ib29sZWFuKGd2YWwpKTsNCisgICAgICAgICAgICBicmVhazsNCisN CisgICAgICAgIGNhc2UgR19UWVBFX0lOVDoNCisgICAgICAgICAgICBNQUtFX1pWQUxfSUZfTlVM TCgqdmFsdWUpOw0KKyAgICAgICAgICAgIFpWQUxfTE9ORygqdmFsdWUsIChsb25nKWdfdmFsdWVf Z2V0X2ludChndmFsKSk7DQorICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBjYXNlIEdf VFlQRV9MT05HOg0KKyAgICAgICAgICAgIE1BS0VfWlZBTF9JRl9OVUxMKCp2YWx1ZSk7DQorICAg ICAgICAgICAgWlZBTF9MT05HKCp2YWx1ZSwgKGxvbmcpZ192YWx1ZV9nZXRfbG9uZyhndmFsKSk7 DQorICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBjYXNlIEdfVFlQRV9VSU5UOg0KKyAg ICAgICAgICAgIE1BS0VfWlZBTF9JRl9OVUxMKCp2YWx1ZSk7DQorICAgICAgICAgICAgWlZBTF9M T05HKCp2YWx1ZSwgKGxvbmcpZ192YWx1ZV9nZXRfdWludChndmFsKSk7DQorICAgICAgICAgICAg YnJlYWs7DQorDQorICAgICAgICBjYXNlIEdfVFlQRV9VTE9ORzoNCisgICAgICAgICAgICBNQUtF X1pWQUxfSUZfTlVMTCgqdmFsdWUpOw0KKyAgICAgICAgICAgIFpWQUxfTE9ORygqdmFsdWUsIChs b25nKWdfdmFsdWVfZ2V0X3Vsb25nKGd2YWwpKTsNCisgICAgICAgICAgICBicmVhazsNCisNCisg ICAgICAgIGNhc2UgR19UWVBFX0ZMT0FUOg0KKyAgICAgICAgICAgIE1BS0VfWlZBTF9JRl9OVUxM KCp2YWx1ZSk7DQorICAgICAgICAgICAgWlZBTF9ET1VCTEUoKnZhbHVlLCAoZG91YmxlKWdfdmFs dWVfZ2V0X2Zsb2F0KGd2YWwpKTsNCisgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNh c2UgR19UWVBFX0RPVUJMRToNCisgICAgICAgICAgICBNQUtFX1pWQUxfSUZfTlVMTCgqdmFsdWUp Ow0KKyAgICAgICAgICAgIFpWQUxfRE9VQkxFKCp2YWx1ZSwgKGRvdWJsZSlnX3ZhbHVlX2dldF9k b3VibGUoZ3ZhbCkpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgY2FzZSBHX1RZ UEVfRU5VTToNCisgICAgICAgICAgICBNQUtFX1pWQUxfSUZfTlVMTCgqdmFsdWUpOw0KKyAgICAg ICAgICAgIFpWQUxfTE9ORygqdmFsdWUsIChsb25nKWdfdmFsdWVfZ2V0X2VudW0oZ3ZhbCkpOw0K KyAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgY2FzZSBHX1RZUEVfRkxBR1M6DQorICAg ICAgICAgICAgTUFLRV9aVkFMX0lGX05VTEwoKnZhbHVlKTsNCisgICAgICAgICAgICBaVkFMX0xP TkcoKnZhbHVlLCAobG9uZylnX3ZhbHVlX2dldF9mbGFncyhndmFsKSk7DQorICAgICAgICAgICAg YnJlYWs7DQorDQorICAgICAgICBjYXNlIEdfVFlQRV9TVFJJTkc6DQorICAgICAgICAgICAgew0K KyAgICAgICAgICAgICAgICBnY2hhciAqY3AgPSBOVUxMOw0KKyAgICAgICAgICAgICAgICBnc2l6 ZSBjcF9sZW4gPSAwOw0KKyAgICAgICAgICAgICAgICB6ZW5kX2Jvb2wgZnJlZV9jcCA9IDA7DQor ICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpzdHIgPSBnX3ZhbHVlX2dldF9zdHJpbmcoZ3Zh bCk7DQorDQorICAgICAgICAgICAgICAgIE1BS0VfWlZBTF9JRl9OVUxMKCp2YWx1ZSk7DQorICAg ICAgICAgICAgICAgIGlmIChzdHIgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYg KGRvX3V0ZjgpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBjcCA9IHBocGdfZnJvbV91dGY4 KHN0ciwgc3RybGVuKHN0ciksICZjcF9sZW4sICZmcmVlX2NwIFRTUk1MU19DQyk7DQorICAgICAg ICAgICAgICAgICAgICAgICAgaWYgKGNwKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAg IHN0ciA9IGNwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHBocF9lcnJvcihFX1dBUk5JTkcsICJDb3VsZCBub3QgY29udmVy dCBzdHJpbmcgZnJvbSBVVEYtOCIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAg ICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIFpWQUxfU1RSSU5HKCp2YWx1 ZSwgKGNoYXIgKilzdHIsIDEpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGZyZWVfY3ApIHsN CisgICAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUoY3ApOw0KKyAgICAgICAgICAgICAgICAg ICAgfQ0KKyAgICAgICAgICAgICAgICB9IGVsc2UNCisgICAgICAgICAgICAgICAgICAgIFpWQUxf TlVMTCgqdmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisNCisg ICAgICAgIGNhc2UgR19UWVBFX1BBUkFNOg0KKyAgICAgICAgICAgIHBocGdfcGFyYW1zcGVjX25l dyh2YWx1ZSwgZ192YWx1ZV9nZXRfcGFyYW0oZ3ZhbCkgVFNSTUxTX0NDKTsNCisgICAgICAgICAg ICBicmVhazsNCisNCisgICAgICAgIGNhc2UgR19UWVBFX09CSkVDVDoNCisgICAgICAgICAgICBw aHBnX2dvYmplY3RfbmV3KHZhbHVlLCBnX3ZhbHVlX2dldF9vYmplY3QoZ3ZhbCkgVFNSTUxTX0ND KTsNCisgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgR19UWVBFX0lOVEVSRkFD RToNCisgICAgICAgICAgICBpZiAoZ190eXBlX2lzX2EoR19WQUxVRV9UWVBFKGd2YWwpLCBHX1RZ UEVfT0JKRUNUKSkgew0KKyAgICAgICAgICAgICAgICBwaHBnX2dvYmplY3RfbmV3KHZhbHVlLCBn X3ZhbHVlX2dldF9vYmplY3QoZ3ZhbCkgVFNSTUxTX0NDKTsNCisgICAgICAgICAgICB9IGVsc2Ug ew0KKyAgICAgICAgICAgICAgICBwaHBfZXJyb3IoRV9XQVJOSU5HLCAiQ291bGQgbm90IGFjY2Vz cyBpbnRlcmZhY2UgJXMiLCBnX3R5cGVfbmFtZShHX1ZBTFVFX1RZUEUoZ3ZhbCkpKTsNCisgICAg ICAgICAgICAgICAgTUFLRV9TVERfWlZBTCgqdmFsdWUpOw0KKyAgICAgICAgICAgICAgICBaVkFM X05VTEwoKnZhbHVlKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBSUxVUkU7DQorICAgICAg ICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgY2FzZSBHX1RZUEVfUE9J TlRFUjoNCisgICAgICAgICAgICBwaHBnX2dwb2ludGVyX25ldyh2YWx1ZSwgR19WQUxVRV9UWVBF KGd2YWwpLCBnX3ZhbHVlX2dldF9wb2ludGVyKGd2YWwpIFRTUk1MU19DQyk7DQorICAgICAgICAg ICAgYnJlYWs7DQorDQorICAgICAgICBjYXNlIEdfVFlQRV9CT1hFRDoNCisgICAgICAgIHsNCisg ICAgICAgICAgICBwaHBnX2dib3hlZF9tYXJzaGFsX3QgKmdibTsNCisNCisgICAgICAgICAgICBp ZiAoR19WQUxVRV9IT0xEUyhndmFsLCBHX1RZUEVfUEhQX1ZBTFVFKSkgew0KKyAgICAgICAgICAg ICAgICB6dmFsICpvYmplY3QgPSAoenZhbCAqKSBnX3ZhbHVlX2R1cF9ib3hlZChndmFsKTsNCisg ICAgICAgICAgICAgICAgTUFLRV9aVkFMX0lGX05VTEwoKnZhbHVlKTsNCisJCQkJWlZBTF9OVUxM KCp2YWx1ZSk7DQorICAgICAgICAgICAgICAgIGlmIChvYmplY3QpIHsNCisgICAgICAgICAgICAg ICAgICAgIFJFUExBQ0VfWlZBTF9WQUxVRSh2YWx1ZSwgb2JqZWN0LCAxKTsNCisgICAgICAgICAg ICAgICAgICAgIHp2YWxfcHRyX2R0b3IoJm9iamVjdCk7DQorICAgICAgICAgICAgICAgICAgICBy ZXR1cm4gU1VDQ0VTUzsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAg ICAgICAgIFpWQUxfTlVMTCgqdmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZB SUxVUkU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2UgaWYgKEdfVkFM VUVfSE9MRFMoZ3ZhbCwgR19UWVBFX1ZBTFVFX0FSUkFZKSkgew0KKyAgICAgICAgICAgICAgICBp bnQgaTsNCisgICAgICAgICAgICAgICAgenZhbCAqaXRlbTsNCisgICAgICAgICAgICAgICAgaW50 IHZhbHVlX2NvdW50Ow0KKw0KKyAgICAgICAgICAgICAgICBHVmFsdWVBcnJheSAqYXJyYXkgPSAo R1ZhbHVlQXJyYXkgKikgZ192YWx1ZV9nZXRfYm94ZWQoZ3ZhbCk7DQorICAgICAgICAgICAgICAg IE1BS0VfWlZBTF9JRl9OVUxMKCp2YWx1ZSk7DQorICAgICAgICAgICAgICAgIGFycmF5X2luaXQo KnZhbHVlKTsNCisgICAgICAgICAgICAgICAgdmFsdWVfY291bnQgPSBhcnJheS0+bl92YWx1ZXM7 DQorDQorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB2YWx1ZV9jb3VudDsgaSsrKSB7 DQorICAgICAgICAgICAgICAgICAgICBNQUtFX1NURF9aVkFMKGl0ZW0pOw0KKyAgICAgICAgICAg ICAgICAgICAgcGhwZ19ndmFsdWVfdG9fenZhbChhcnJheS0+dmFsdWVzICsgaSwgJml0ZW0sIGNv cHlfYm94ZWQsIFRSVUUgVFNSTUxTX0NDKTsNCisgICAgICAgICAgICAgICAgICAgIGFkZF9uZXh0 X2luZGV4X3p2YWwoKnZhbHVlLCBpdGVtKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAg ICAgIH0gZWxzZSBpZiAoKGdibSA9IHBocGdfZ2JveGVkX2xvb2t1cF9jdXN0b20oR19WQUxVRV9U WVBFKGd2YWwpKSkpIHsNCisgICAgICAgICAgICAgICAgTUFLRV9TVERfWlZBTCgqdmFsdWUpOw0K KyAgICAgICAgICAgICAgICByZXR1cm4gZ2JtLT50b196dmFsKGd2YWwsIHZhbHVlIFRTUk1MU19D Qyk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgaWYgKGNvcHlfYm94 ZWQpIHsNCisgICAgICAgICAgICAgICAgICAgIHBocGdfZ2JveGVkX25ldyh2YWx1ZSwgR19WQUxV RV9UWVBFKGd2YWwpLCBnX3ZhbHVlX2dldF9ib3hlZChndmFsKSwgVFJVRSwgVFJVRSBUU1JNTFNf Q0MpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgcGhw Z19nYm94ZWRfbmV3KHZhbHVlLCBHX1ZBTFVFX1RZUEUoZ3ZhbCksIGdfdmFsdWVfZ2V0X2JveGVk KGd2YWwpLCBGQUxTRSwgRkFMU0UgVFNSTUxTX0NDKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAg ICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisNCisgICAgICAg IGRlZmF1bHQ6DQorICAgICAgICAgICAgcGhwX2Vycm9yKEVfV0FSTklORywgIlBIUC1HVEsgaW50 ZXJuYWwgZXJyb3I6IHVuc3VwcG9ydGVkIHR5cGUgJXMiLCBnX3R5cGVfbmFtZShHX1ZBTFVFX1RZ UEUoZ3ZhbCkpKTsNCisgICAgICAgICAgICBNQUtFX1NURF9aVkFMKCp2YWx1ZSk7DQorICAgICAg ICAgICAgWlZBTF9OVUxMKCp2YWx1ZSk7DQorICAgICAgICAgICAgcmV0dXJuIEZBSUxVUkU7DQor ICAgIH0NCisNCisgICAgcmV0dXJuIFNVQ0NFU1M7DQorfQ0KKy8qIH19fSAqLw0KKw0KKy8qIHt7 eyBQSFBfR1RLX0FQSSBwaHBnX2d2YWx1ZV9mcm9tX3p2YWwoKSAqLw0KK1BIUF9HVEtfQVBJIGlu dCBwaHBnX2d2YWx1ZV9mcm9tX3p2YWwoR1ZhbHVlICpndmFsLCB6dmFsICoqdmFsdWUsIHplbmRf Ym9vbCBkb191dGY4IFRTUk1MU19EQykNCit7DQorICAgIHN3aXRjaCAoR19UWVBFX0ZVTkRBTUVO VEFMKEdfVkFMVUVfVFlQRShndmFsKSkpIHsNCisgICAgICAgIC8qDQorICAgICAgICAgKiBGb3Ig d2hhdGV2ZXIgcmVhc29uLCB3ZSBzaG91bGQgYXBwYXJlbnRseSByZXNwZWN0IHRoYXQgdGhlIGd2 YWwgbWF5IGJlIG9mIHRoZXNlDQorICAgICAgICAgKiB0eXBlcyBhbmQgdGhleSBkbyBub3QgbmVl ZCBhIHZhbHVlLg0KKyAgICAgICAgICovDQorICAgICAgICBjYXNlIEdfVFlQRV9JTlZBTElEOg0K KyAgICAgICAgY2FzZSBHX1RZUEVfTk9ORToNCisgICAgICAgICAgICBicmVhazsNCisNCisgICAg ICAgIGNhc2UgR19UWVBFX0JPT0xFQU46DQorICAgICAgICAgICAgY29udmVydF90b19ib29sZWFu X2V4KHZhbHVlKTsNCisgICAgICAgICAgICBnX3ZhbHVlX3NldF9ib29sZWFuKGd2YWwsIChnYm9v bGVhbilaX0JWQUxfUFAodmFsdWUpKTsNCisgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAg IGNhc2UgR19UWVBFX0NIQVI6DQorICAgICAgICAgICAgY29udmVydF90b19zdHJpbmdfZXgodmFs dWUpOw0KKyAgICAgICAgICAgIGdfdmFsdWVfc2V0X2NoYXIoZ3ZhbCwgWl9TVFJWQUxfUFAodmFs dWUpWzBdKTsNCisgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgR19UWVBFX1VD SEFSOg0KKyAgICAgICAgICAgIGNvbnZlcnRfdG9fc3RyaW5nX2V4KHZhbHVlKTsNCisgICAgICAg ICAgICBnX3ZhbHVlX3NldF91Y2hhcihndmFsLCAoZ3VjaGFyKVpfU1RSVkFMX1BQKHZhbHVlKVsw XSk7DQorICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBjYXNlIEdfVFlQRV9JTlQ6DQor ICAgICAgICAgICAgY29udmVydF90b19sb25nX2V4KHZhbHVlKTsNCisgICAgICAgICAgICBnX3Zh bHVlX3NldF9pbnQoZ3ZhbCwgKGdpbnQpWl9MVkFMX1BQKHZhbHVlKSk7DQorICAgICAgICAgICAg YnJlYWs7DQorDQorICAgICAgICBjYXNlIEdfVFlQRV9VSU5UOg0KKyAgICAgICAgICAgIGNvbnZl cnRfdG9fbG9uZ19leCh2YWx1ZSk7DQorICAgICAgICAgICAgZ192YWx1ZV9zZXRfdWludChndmFs LCAoZ3VpbnQpWl9MVkFMX1BQKHZhbHVlKSk7DQorICAgICAgICAgICAgYnJlYWs7DQorDQorICAg ICAgICBjYXNlIEdfVFlQRV9MT05HOg0KKyAgICAgICAgICAgIGNvbnZlcnRfdG9fbG9uZ19leCh2 YWx1ZSk7DQorICAgICAgICAgICAgZ192YWx1ZV9zZXRfbG9uZyhndmFsLCAoZ2xvbmcpWl9MVkFM X1BQKHZhbHVlKSk7DQorICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBjYXNlIEdfVFlQ RV9VTE9ORzoNCisgICAgICAgICAgICBjb252ZXJ0X3RvX2xvbmdfZXgodmFsdWUpOw0KKyAgICAg ICAgICAgIGdfdmFsdWVfc2V0X3Vsb25nKGd2YWwsIChndWxvbmcpWl9MVkFMX1BQKHZhbHVlKSk7 DQorICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBjYXNlIEdfVFlQRV9GTE9BVDoNCisg ICAgICAgICAgICBjb252ZXJ0X3RvX2RvdWJsZV9leCh2YWx1ZSk7DQorICAgICAgICAgICAgZ192 YWx1ZV9zZXRfZmxvYXQoZ3ZhbCwgKGdmbG9hdClaX0RWQUxfUFAodmFsdWUpKTsNCisgICAgICAg ICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgR19UWVBFX0RPVUJMRToNCisgICAgICAgICAg ICBjb252ZXJ0X3RvX2RvdWJsZV9leCh2YWx1ZSk7DQorICAgICAgICAgICAgZ192YWx1ZV9zZXRf ZG91YmxlKGd2YWwsIFpfRFZBTF9QUCh2YWx1ZSkpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKw0K KyAgICAgICAgY2FzZSBHX1RZUEVfRU5VTToNCisgICAgICAgIHsNCisgICAgICAgICAgICBnaW50 IHZhbCA9IDA7DQorICAgICAgICAgICAgaWYgKHBocGdfZ3ZhbHVlX2dldF9lbnVtKEdfVkFMVUVf VFlQRShndmFsKSwgKnZhbHVlLCAmdmFsKSA9PSBGQUlMVVJFKSB7DQorICAgICAgICAgICAgICAg IHJldHVybiBGQUlMVVJFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBnX3ZhbHVlX3Nl dF9lbnVtKGd2YWwsIHZhbCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorDQor ICAgICAgICBjYXNlIEdfVFlQRV9GTEFHUzoNCisgICAgICAgIHsNCisgICAgICAgICAgICBnaW50 IHZhbCA9IDA7DQorICAgICAgICAgICAgaWYgKHBocGdfZ3ZhbHVlX2dldF9mbGFncyhHX1ZBTFVF X1RZUEUoZ3ZhbCksICp2YWx1ZSwgJnZhbCkgPT0gRkFJTFVSRSkgew0KKyAgICAgICAgICAgICAg ICByZXR1cm4gRkFJTFVSRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZ192YWx1ZV9z ZXRfZmxhZ3MoZ3ZhbCwgdmFsKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisN CisgICAgICAgIGNhc2UgR19UWVBFX1NUUklORzoNCisgICAgICAgIHsNCisgICAgICAgICAgICBn Y2hhciAqdXRmOCA9IE5VTEw7DQorICAgICAgICAgICAgZ3NpemUgdXRmOF9sZW4gPSAwOw0KKyAg ICAgICAgICAgIHplbmRfYm9vbCBmcmVlX3V0ZjggPSAwOw0KKyAgICAgICAgICAgIGdjaGFyICpz dHI7DQorDQorICAgICAgICAgICAgY29udmVydF90b19zdHJpbmdfZXgodmFsdWUpOw0KKyAgICAg ICAgICAgIHN0ciA9IFpfU1RSVkFMX1BQKHZhbHVlKTsNCisgICAgICAgICAgICBpZiAoZG9fdXRm OCkgew0KKyAgICAgICAgICAgICAgICB1dGY4ID0gcGhwZ190b191dGY4KFpfU1RSVkFMX1BQKHZh bHVlKSwgWl9TVFJMRU5fUFAodmFsdWUpLCAmdXRmOF9sZW4sICZmcmVlX3V0ZjggVFNSTUxTX0ND KTsNCisgICAgICAgICAgICAgICAgaWYgKHV0ZjgpIHsNCisgICAgICAgICAgICAgICAgICAgIHN0 ciA9IHV0Zjg7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAg ICBwaHBfZXJyb3IoRV9XQVJOSU5HLCAiQ291bGQgbm90IGNvbnZlcnQgc3RyaW5nIHRvIFVURi04 Iik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZ192 YWx1ZV9zZXRfc3RyaW5nKGd2YWwsIHN0cik7DQorICAgICAgICAgICAgaWYgKGZyZWVfdXRmOCkg ew0KKyAgICAgICAgICAgICAgICBnX2ZyZWUodXRmOCk7DQorICAgICAgICAgICAgfQ0KKyAgICAg ICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgY2FzZSBHX1RZUEVfUE9JTlRF UjoNCisgICAgICAgICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSA9PSBJU19OVUxMKSB7DQorICAg ICAgICAgICAgICAgIGdfdmFsdWVfc2V0X3BvaW50ZXIoZ3ZhbCwgTlVMTCk7DQorICAgICAgICAg ICAgfSBlbHNlIGlmIChaX1RZUEVfUFAodmFsdWUpID09IElTX09CSkVDVA0KKyAgICAgICAgICAg ICAgICAgICAgICAgJiYgaW5zdGFuY2VvZl9mdW5jdGlvbihaX09CSkNFX1BQKHZhbHVlKSwgZ3Bv aW50ZXJfY2UgVFNSTUxTX0NDKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgJiYgR19WQUxVRV9I T0xEUyhndmFsLCAoKHBocGdfZ3BvaW50ZXJfdCopUEhQR19HRVQoKnZhbHVlKSktPmd0eXBlKSkg ew0KKyAgICAgICAgICAgICAgICBnX3ZhbHVlX3NldF9wb2ludGVyKGd2YWwsICgocGhwZ19ncG9p bnRlcl90KilQSFBHX0dFVCgqdmFsdWUpKS0+cG9pbnRlcik7DQorICAgICAgICAgICAgfSBlbHNl IHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBSUxVUkU7DQorICAgICAgICAgICAgfQ0KKyAg ICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgY2FzZSBHX1RZUEVfQk9YRUQ6DQorICAgICAg ICB7DQorICAgICAgICAgICAgcGhwZ19nYm94ZWRfbWFyc2hhbF90ICpnYm07DQorDQorICAgICAg ICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgPT0gSVNfTlVMTCkgew0KKyAgICAgICAgICAgICAg ICBnX3ZhbHVlX3NldF9ib3hlZChndmFsLCBOVUxMKTsNCisgICAgICAgICAgICAvKg0KKyAgICAg ICAgICAgICAqIFdlIHNob3VsZCBiZSBzYWZlIGp1c3Qgc2V0dGluZyB0aGUgenZhbCBoZXJlLCBz aW5jZSBHX1RZUEVfUEhQX1ZBTFVFIGlzDQorICAgICAgICAgICAgICogc3VwcG9zZWQgdG8gdGFr ZSBhbnkgenZhbCB0eXBlLg0KKyAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgIH0gZWxzZSBp ZiAoR19WQUxVRV9IT0xEUyhndmFsLCBHX1RZUEVfUEhQX1ZBTFVFKSkgew0KKyAgICAgICAgICAg ICAgICBnX3ZhbHVlX3NldF9ib3hlZChndmFsLCAqdmFsdWUpOw0KKyAgICAgICAgICAgIH0gZWxz ZSBpZiAoWl9UWVBFX1BQKHZhbHVlKSA9PSBJU19PQkpFQ1QNCisgICAgICAgICAgICAgICAgICAg ICAgICYmIGluc3RhbmNlb2ZfZnVuY3Rpb24oWl9PQkpDRV9QUCh2YWx1ZSksIGdib3hlZF9jZSBU U1JNTFNfQ0MpDQorICAgICAgICAgICAgICAgICAgICAgICAmJiBHX1ZBTFVFX0hPTERTKGd2YWws ICgocGhwZ19nYm94ZWRfdCopUEhQR19HRVQoKnZhbHVlKSktPmd0eXBlKSkgew0KKyAgICAgICAg ICAgICAgICBnX3ZhbHVlX3NldF9ib3hlZChndmFsLCBQSFBHX0dCT1hFRCgqdmFsdWUpKTsNCisg ICAgICAgICAgICB9IGVsc2UgaWYgKChnYm0gPSBwaHBnX2dib3hlZF9sb29rdXBfY3VzdG9tKEdf VkFMVUVfVFlQRShndmFsKSkpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBnYm0tPmZyb21f enZhbCgqdmFsdWUsIGd2YWwgVFNSTUxTX0NDKTsNCisgICAgICAgICAgICB9IGVsc2UNCisgICAg ICAgICAgICAgICAgcmV0dXJuIEZBSUxVUkU7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAg ICB9DQorDQorICAgICAgICBjYXNlIEdfVFlQRV9QQVJBTToNCisgICAgICAgICAgICBpZiAocGhw X2d0a19jaGVja19jbGFzcygqdmFsdWUsIGdwYXJhbXNwZWNfY2UpKSB7DQorICAgICAgICAgICAg ICAgIGdfdmFsdWVfc2V0X3BhcmFtKGd2YWwsIFBIUEdfR1BBUkFNU1BFQygqdmFsdWUpKTsNCisg ICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFJTFVSRTsNCisg ICAgICAgICAgICB9DQorICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgR19UWVBFX09C SkVDVDoNCisgICAgICAgICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSA9PSBJU19OVUxMKSB7DQor ICAgICAgICAgICAgICAgIGdfdmFsdWVfc2V0X29iamVjdChndmFsLCBOVUxMKTsNCisgICAgICAg ICAgICB9IGVsc2UgaWYgKFpfVFlQRV9QKCp2YWx1ZSkgPT0gSVNfT0JKRUNUDQorICAgICAgICAg ICAgICAgICAgICAgICAmJiBpbnN0YW5jZW9mX2Z1bmN0aW9uKFpfT0JKQ0VfUFAodmFsdWUpLCBn b2JqZWN0X2NlIFRTUk1MU19DQykNCisgICAgICAgICAgICAgICAgICAgICAgICYmIEdfVFlQRV9D SEVDS19JTlNUQU5DRV9UWVBFKFBIUEdfR09CSkVDVCgqdmFsdWUpLCBHX1ZBTFVFX1RZUEUoZ3Zh bCkpKSB7DQorICAgICAgICAgICAgICAgIGdfdmFsdWVfc2V0X29iamVjdChndmFsLCBQSFBHX0dP QkpFQ1QoKnZhbHVlKSk7DQorICAgICAgICAgICAgfSBlbHNlDQorICAgICAgICAgICAgICAgIHJl dHVybiBGQUlMVVJFOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgY2FzZSBHX1RZ UEVfSU5URVJGQUNFOg0KKyAgICAgICAgICAgIGlmIChnX3R5cGVfaXNfYShHX1ZBTFVFX1RZUEUo Z3ZhbCksIEdfVFlQRV9PQkpFQ1QpICYmDQorICAgICAgICAgICAgICAgIFpfVFlQRV9QUCh2YWx1 ZSkgPT0gSVNfT0JKRUNUICYmDQorICAgICAgICAgICAgICAgIEdfVFlQRV9DSEVDS19JTlNUQU5D RV9UWVBFKFBIUEdfR09CSkVDVCgqdmFsdWUpLCBHX1ZBTFVFX1RZUEUoZ3ZhbCkpKSB7DQorICAg ICAgICAgICAgICAgIGdfdmFsdWVfc2V0X29iamVjdChndmFsLCBQSFBHX0dPQkpFQ1QoKnZhbHVl KSk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgcGhwX2Vycm9yKEVf V0FSTklORywgIkNvdWxkIG5vdCBhY2Nlc3MgaW50ZXJmYWNlICVzIiwgZ190eXBlX25hbWUoR19W QUxVRV9UWVBFKGd2YWwpKSk7DQorICAgICAgICAgICAgICAgIHJldHVybiBGQUlMVVJFOw0KKyAg ICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGRlZmF1bHQ6DQor ICAgICAgICAgICAgcGhwX2Vycm9yKEVfV0FSTklORywgIlBIUC1HVEsgaW50ZXJuYWwgZXJyb3I6 IHVuc3VwcG9ydGVkIHR5cGUgJXMiLCBnX3R5cGVfbmFtZShHX1ZBTFVFX1RZUEUoZ3ZhbCkpKTsN CisgICAgICAgICAgICByZXR1cm4gRkFJTFVSRTsNCisNCisgICAgfQ0KKw0KKyAgICByZXR1cm4g U1VDQ0VTUzsNCit9DQorLyogfX19ICovDQorDQorLyoge3t7IFBIUF9HVEtfQVBJIHBocGdfcGFy YW1fZ3ZhbHVlX3RvX3p2YWwoKSAqLw0KK1BIUF9HVEtfQVBJIGludCBwaHBnX3BhcmFtX2d2YWx1 ZV90b196dmFsKGNvbnN0IEdWYWx1ZSAqZ3ZhbCwgenZhbCAqKnZhbHVlLCB6ZW5kX2Jvb2wgY29w eV9ib3hlZCwgY29uc3QgR1BhcmFtU3BlYyAqcHNwZWMgVFNSTUxTX0RDKQ0KK3sNCisgICAgaWYg KEdfSVNfUEFSQU1fU1BFQ19VTklDSEFSKHBzcGVjKSkgew0KKyAgICAgICAgLyogVE9ETyAqLw0K KyAgICAgICAgcmV0dXJuIEZBSUxVUkU7DQorICAgIH0gZWxzZSB7DQorICAgICAgICByZXR1cm4g cGhwZ19ndmFsdWVfdG9fenZhbChndmFsLCB2YWx1ZSwgY29weV9ib3hlZCwgVFJVRSBUU1JNTFNf Q0MpOw0KKyAgICB9DQorfQ0KKy8qIH19fSAqLw0KKw0KKy8qIHt7eyBQSFBfR1RLX0FQSSBwaHBn X3BhcmFtX2d2YWx1ZV9mcm9tX3p2YWwoKSAqLw0KK1BIUF9HVEtfQVBJIGludCBwaHBnX3BhcmFt X2d2YWx1ZV9mcm9tX3p2YWwoR1ZhbHVlICpndmFsLCB6dmFsICoqdmFsdWUsIGNvbnN0IEdQYXJh bVNwZWMgKnBzcGVjIFRTUk1MU19EQykNCit7DQorICAgIGlmIChHX0lTX1BBUkFNX1NQRUNfVU5J Q0hBUihwc3BlYykpIHsNCisgICAgICAgIC8qIFRPRE8gKi8NCisgICAgICAgIHJldHVybiBGQUlM VVJFOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgICAgcmV0dXJuIHBocGdfZ3ZhbHVlX2Zyb21fenZh bChndmFsLCB2YWx1ZSwgVFJVRSBUU1JNTFNfQ0MpOw0KKyAgICB9DQorfQ0KKy8qIH19fSAqLw0K Kw0KKy8qIHt7eyBQSFBfR1RLX0FQSSBwaHBnX2d2YWx1ZXNfdG9fYXJyYXkoKSAqLw0KK1BIUF9H VEtfQVBJIHp2YWwgKnBocGdfZ3ZhbHVlc190b19hcnJheShjb25zdCBHVmFsdWUgKnZhbHVlcywg dWludCBuX3ZhbHVlcykNCit7DQorCXp2YWwgKmhhc2g7DQorCXp2YWwgKml0ZW0gPSBOVUxMOw0K KwlpbnQgaTsNCisJaW50IHZhbHVlX2NvdW50Ow0KKw0KKwlNQUtFX1NURF9aVkFMKGhhc2gpOw0K KwlhcnJheV9pbml0KGhhc2gpOw0KKwl2YWx1ZV9jb3VudCA9IG5fdmFsdWVzOw0KKw0KKwlmb3Ig KGkgPSAwOyBpIDwgdmFsdWVfY291bnQ7IGkrKykgew0KKwkJLy9pdGVtID0gcGhwZ19ndmFsdWVf dG9fenZhbCgmdmFsdWVzW2ldLCBGQUxTRSk7DQorCQlpZiAoIWl0ZW0pIHsNCisJCQlNQUtFX1NU RF9aVkFMKGl0ZW0pOw0KKwkJCVpWQUxfTlVMTChpdGVtKTsNCisJCX0NCisJCXplbmRfaGFzaF9u ZXh0X2luZGV4X2luc2VydChaX0FSUlZBTF9QKGhhc2gpLCAmaXRlbSwgc2l6ZW9mKHp2YWwgKiks IE5VTEwpOw0KKwl9DQorDQorCXJldHVybiBoYXNoOw0KK30NCisvKiB9fX0gKi8NCisNCisvKiB7 e3sgUEhQX0dUS19BUEkgcGhwZ19ndmFsdWVfZ2V0X2VudW0oKSAqLw0KK1BIUF9HVEtfQVBJIGlu dCBwaHBnX2d2YWx1ZV9nZXRfZW51bShHVHlwZSBlbnVtX3R5cGUsIHp2YWwgKmVudW1fdmFsLCBn aW50ICpyZXN1bHQpDQorew0KKyAgICBpZiAocmVzdWx0ID09IE5VTEwpDQorICAgICAgICByZXR1 cm4gRkFJTFVSRTsNCisNCisgICAgaWYgKGVudW1fdmFsID09IE5VTEwpIHsNCisgICAgICAgICpy ZXN1bHQgPSAwOw0KKyAgICB9IGVsc2UgaWYgKFpfVFlQRV9QKGVudW1fdmFsKSA9PSBJU19MT05H KSB7DQorICAgICAgICAqcmVzdWx0ID0gWl9MVkFMX1AoZW51bV92YWwpOw0KKyAgICB9IGVsc2Ug aWYgKFpfVFlQRV9QKGVudW1fdmFsKSA9PSBJU19TVFJJTkcpIHsNCisgICAgICAgIEdFbnVtQ2xh c3MgKmVjbGFzcyA9IE5VTEw7DQorICAgICAgICBHRW51bVZhbHVlICppbmZvID0gTlVMTDsNCisN CisgICAgICAgIGlmIChlbnVtX3R5cGUgIT0gR19UWVBFX05PTkUpIHsNCisgICAgICAgICAgICBl Y2xhc3MgPSBHX0VOVU1fQ0xBU1MoZ190eXBlX2NsYXNzX3JlZihlbnVtX3R5cGUpKTsNCisgICAg ICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcGhwX2Vycm9yKEVfV0FSTklORywgIlBIUC1HVEsg aW50ZXJuYWwgZXJyb3I6IGNvdWxkIG5vdCBvYnRhaW4gdGhlIHR5cGUgb2YgZW51bSIpOw0KKyAg ICAgICAgICAgIHJldHVybiBGQUlMVVJFOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaW5mbyA9 IGdfZW51bV9nZXRfdmFsdWVfYnlfbmFtZShlY2xhc3MsIFpfU1RSVkFMX1AoZW51bV92YWwpKTsN CisNCisgICAgICAgIGlmIChpbmZvID09IE5VTEwpIHsNCisgICAgICAgICAgICBpbmZvID0gZ19l bnVtX2dldF92YWx1ZV9ieV9uaWNrKGVjbGFzcywgWl9TVFJWQUxfUChlbnVtX3ZhbCkpOw0KKyAg ICAgICAgfQ0KKyAgICAgICAgZ190eXBlX2NsYXNzX3VucmVmKGVjbGFzcyk7DQorICAgICAgICAN CisgICAgICAgIGlmIChpbmZvICE9IE5VTEwpIHsNCisgICAgICAgICAgICAqcmVzdWx0ID0gaW5m by0+dmFsdWU7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHBocF9lcnJvcihFX1dB Uk5JTkcsICJQSFAtR1RLIGludGVybmFsIGVycm9yOiBjb3VsZCBub3QgY29udmVydCAnJXMnIHRv IGVudW0iLCBaX1NUUlZBTF9QKGVudW1fdmFsKSk7DQorICAgICAgICAgICAgcmV0dXJuIEZBSUxV UkU7DQorICAgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgICBwaHBfZXJyb3IoRV9XQVJO SU5HLCAiUEhQLUdUSyBpbnRlcm5hbCBlcnJvcjogZW51bXMgbXVzdCBiZSBzdHJpbmdzIG9yIGlu dGVnZXJzIik7DQorICAgICAgICByZXR1cm4gRkFJTFVSRTsNCisgICAgfQ0KKw0KKyAgICByZXR1 cm4gU1VDQ0VTUzsNCit9DQorLyogfX19ICovDQorDQorLyoge3t7IFBIUF9HVEtfQVBJIHBocGdf Z3ZhbHVlX2dldF9mbGFncygpICovDQorUEhQX0dUS19BUEkgaW50IHBocGdfZ3ZhbHVlX2dldF9m bGFncyhHVHlwZSBmbGFnc190eXBlLCB6dmFsICpmbGFnc192YWwsIGdpbnQgKnJlc3VsdCkNCit7 DQorICAgIEdGbGFnc0NsYXNzICpmY2xhc3MgPSBOVUxMOw0KKyAgICBHRmxhZ3NWYWx1ZSAqaW5m byA9IE5VTEw7DQorDQorICAgIGlmIChyZXN1bHQgPT0gTlVMTCkNCisgICAgICAgIHJldHVybiBG QUlMVVJFOw0KKw0KKyAgICBpZiAoZmxhZ3NfdmFsID09IE5VTEwpIHsNCisgICAgICAgICpyZXN1 bHQgPSAwOw0KKyAgICB9IGVsc2UgaWYgKFpfVFlQRV9QKGZsYWdzX3ZhbCkgPT0gSVNfTE9ORykg ew0KKyAgICAgICAgKnJlc3VsdCA9IFpfTFZBTF9QKGZsYWdzX3ZhbCk7DQorICAgIH0gZWxzZSBp ZiAoWl9UWVBFX1AoZmxhZ3NfdmFsKSA9PSBJU19TVFJJTkcpIHsNCisgICAgICAgIGlmIChmbGFn c190eXBlICE9IEdfVFlQRV9OT05FKSB7DQorICAgICAgICAgICAgZmNsYXNzID0gR19GTEFHU19D TEFTUyhnX3R5cGVfY2xhc3NfcmVmKGZsYWdzX3R5cGUpKTsNCisgICAgICAgIH0gZWxzZSB7DQor ICAgICAgICAgICAgcGhwX2Vycm9yKEVfV0FSTklORywgIlBIUC1HVEsgaW50ZXJuYWwgZXJyb3I6 IGNvdWxkIG5vdCBvYnRhaW4gdGhlIHR5cGUgb2YgZmxhZ3MiKTsNCisgICAgICAgICAgICByZXR1 cm4gRkFJTFVSRTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGluZm8gPSBnX2ZsYWdzX2dldF92 YWx1ZV9ieV9uYW1lKGZjbGFzcywgWl9TVFJWQUxfUChmbGFnc192YWwpKTsNCisgICAgICAgIGlm IChpbmZvID09IE5VTEwpIHsNCisgICAgICAgICAgICBpbmZvID0gZ19mbGFnc19nZXRfdmFsdWVf YnlfbmljayhmY2xhc3MsIFpfU1RSVkFMX1AoZmxhZ3NfdmFsKSk7DQorICAgICAgICB9DQorICAg ICAgICBnX3R5cGVfY2xhc3NfdW5yZWYoZmNsYXNzKTsNCisNCisgICAgICAgIGlmIChpbmZvICE9 IE5VTEwpIHsNCisgICAgICAgICAgICAqcmVzdWx0ID0gaW5mby0+dmFsdWU7DQorICAgICAgICB9 IGVsc2Ugew0KKyAgICAgICAgICAgIHBocF9lcnJvcihFX1dBUk5JTkcsICJQSFAtR1RLIGludGVy bmFsIGVycm9yOiBjb3VsZCBub3QgY29udmVydCAnJXMnIHRvIGZsYWdzIiwgWl9TVFJWQUxfUChm bGFnc192YWwpKTsNCisgICAgICAgICAgICByZXR1cm4gRkFJTFVSRTsNCisgICAgICAgIH0NCisg ICAgfSBlbHNlIGlmIChaX1RZUEVfUChmbGFnc192YWwpID09IElTX0FSUkFZKSB7DQorCQl6dmFs ICoqZmxhZzsNCisNCisgICAgICAgICpyZXN1bHQgPSAwOw0KKyAgICAgICAgaWYgKGZsYWdzX3R5 cGUgIT0gR19UWVBFX05PTkUpIHsNCisgICAgICAgICAgICBmY2xhc3MgPSBHX0ZMQUdTX0NMQVNT KGdfdHlwZV9jbGFzc19yZWYoZmxhZ3NfdHlwZSkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAg ICAgICAgICBwaHBfZXJyb3IoRV9XQVJOSU5HLCAiUEhQLUdUSyBpbnRlcm5hbCBlcnJvcjogY291 bGQgbm90IG9idGFpbiB0aGUgdHlwZSBvZiBmbGFncyIpOw0KKyAgICAgICAgICAgIHJldHVybiBG QUlMVVJFOw0KKyAgICAgICAgfQ0KKw0KKwkJZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRl cl9yZXNldChaX0FSUlZBTF9QKGZsYWdzX3ZhbCkpOw0KKwkJCSB6ZW5kX2hhc2hfZ2V0X2N1cnJl bnRfZGF0YShaX0FSUlZBTF9QKGZsYWdzX3ZhbCksICh2b2lkICoqKSZmbGFnKSA9PSBTVUNDRVNT Ow0KKwkJCSB6ZW5kX2hhc2hfbW92ZV9mb3J3YXJkKFpfQVJSVkFMX1AoZmxhZ3NfdmFsKSkpIHsN CisNCisJCQlpZiAoWl9UWVBFX1BQKGZsYWcpID09IElTX0xPTkcpIHsNCisJCQkJKnJlc3VsdCB8 PSBaX0xWQUxfUFAoZmxhZyk7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChaX1RZUEVfUFAoZmxh ZykgPT0gSVNfU1RSSU5HKSB7DQorICAgICAgICAgICAgICAgIGluZm8gPSBnX2ZsYWdzX2dldF92 YWx1ZV9ieV9uYW1lKGZjbGFzcywgWl9TVFJWQUxfUFAoZmxhZykpOw0KKyAgICAgICAgICAgICAg ICBpZiAoaW5mbyA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBpbmZvID0gZ19mbGFn c19nZXRfdmFsdWVfYnlfbmljayhmY2xhc3MsIFpfU1RSVkFMX1BQKGZsYWcpKTsNCisgICAgICAg ICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoaW5mbyAhPSBOVUxMKSB7DQorICAgICAg ICAgICAgICAgICAgICAqcmVzdWx0IHw9IGluZm8tPnZhbHVlOw0KKyAgICAgICAgICAgICAgICB9 IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgcGhwX2Vycm9yKEVfV0FSTklORywgIlBIUC1H VEsgaW50ZXJuYWwgZXJyb3I6IGNvdWxkIG5vdCBjb252ZXJ0ICclcycgdG8gZmxhZ3MiLCBaX1NU UlZBTF9QUChmbGFnKSk7DQorICAgICAgICAgICAgICAgICAgICBnX3R5cGVfY2xhc3NfdW5yZWYo ZmNsYXNzKTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUlMVVJFOw0KKyAgICAgICAg ICAgICAgICB9DQorCQkJfSBlbHNlIHsNCisJCQkJcGhwX2Vycm9yKEVfV0FSTklORywgIlBIUC1H VEsgZmxhZyBhcnJheXMgY2FuIGNvbnRhaW4gb25seSBpbnRlZ2VycyBvciBzdHJpbmdzIik7DQor ICAgICAgICAgICAgICAgIGdfdHlwZV9jbGFzc191bnJlZihmY2xhc3MpOw0KKwkJCQlyZXR1cm4g MDsNCisJCQl9DQorCQl9DQorICAgICAgICBnX3R5cGVfY2xhc3NfdW5yZWYoZmNsYXNzKTsNCisg ICAgfSBlbHNlIHsNCisgICAgICAgIHBocF9lcnJvcihFX1dBUk5JTkcsICJQSFAtR1RLIGZsYWdz IG11c3QgYmUgc3RyaW5ncywgaW50ZWdlcnMsIG9yIGFycmF5cyBvZiBzdHJpbmdzIG9yIGludGVn ZXJzIik7DQorICAgICAgICByZXR1cm4gRkFJTFVSRTsNCisgICAgfQ0KKw0KKyAgICByZXR1cm4g U1VDQ0VTUzsNCit9DQorLyogfX19ICovDQorDQorI2VuZGlmDQorDQorLyogdmltOiBzZXQgZmRt PW1hcmtlciBldCA6ICovDQpkaWZmIC0tZ2l0IGEvd2luMzIvY29uZmlnLnczMi5pbiBiL3dpbjMy L2NvbmZpZy53MzIuaW4KaW5kZXggODhlMjk1ZS4uZmFmYTYxZSAxMDA2NDQKLS0tIGEvd2luMzIv Y29uZmlnLnczMi5pbgorKysgYi93aW4zMi9jb25maWcudzMyLmluCkBAIC0xLDE1NyArMSwxNjIg QEAKLS8vIHZpbTpmdD1qYXZhc2NyaXB0Ci0vLyAkSWQkCi0vLyAiTWFzdGVyIiBjb25maWcgZmls ZTsgdGhpbmsgb2YgaXQgYXMgYSBjb25maWd1cmUuaW4gZXF1aXZhbGVudC4KLQotLy8gTVNWQyB2 ZXJzaW9uIHRhYmxlCi12YXIgTVNWQ1ZFUlMgPSBbXTsKLU1TVkNWRVJTWzEyMDBdID0gJ01TVkM2 IChWaXN1YWwgQysrIDYuMCknOwotTVNWQ1ZFUlNbMTMwMF0gPSAnTVNWQzcgKFZpc3VhbCBDKysg MjAwMiknOwotTVNWQ1ZFUlNbMTMxMF0gPSAnTVNWQzcuMSAoVmlzdWFsIEMrKyAyMDAzKSc7Ci1N U1ZDVkVSU1sxNDAwXSA9ICdNU1ZDOCAoVmlzdWFsIEMrKyAyMDA1KSc7Ci1NU1ZDVkVSU1sxNTAw XSA9ICdNU1ZDOSAoVmlzdWFsIEMrKyAyMDA4KSc7Ci1NU1ZDVkVSU1sxNjAwXSA9ICdNU1ZDMTAg KFZpc3VhbCBDKysgMjAxMCknOwotCi1TVERPVVQuV3JpdGVCbGFua0xpbmVzKDEpOwotCi1DTCA9 IFBBVEhfUFJPRygnY2wnKTsKLQotLy8gYXZvaWQgcGlja2luZyB1cCBtaWRuaWdodCBjb21tYW5k ZXIgZnJvbSBjeWd3aW4KLVBBVEhfUFJPRygnbWMnLCBXc2hTaGVsbC5FbnZpcm9ubWVudCgiUHJv Y2VzcyIpLkl0ZW0oIlBBVEgiKSk7Ci1QQVRIX1BST0coJ3JjJywgV3NoU2hlbGwuRW52aXJvbm1l bnQoIlByb2Nlc3MiKS5JdGVtKCJQQVRIIikpOwotCi0vKiBjeWd3aW4gc2hpcHMgd2l0aCAnbGlu ay5leGUnLiBBdm9pZCBzZWFyY2hpbmcgdGhlIGN5Z3dpbiBwYXRoIGZvciB0aGlzLCBhcyB3ZSB3 YW50IHRoZSBNUyBsaW5rZXIgKi8KLVBBVEhfUFJPRygnbGluaycsIFdzaFNoZWxsLkVudmlyb25t ZW50KCJQcm9jZXNzIikuSXRlbSgiUEFUSCIpLCAiTEQiKTsKLVBBVEhfUFJPRygnbm1ha2UnKTsK LQotLy8gY2hlY2sgZm9yIGdyZXAgYW5kIHNlZCEKLWlmICghUEFUSF9QUk9HKCdncmVwJywgV3No U2hlbGwuRW52aXJvbm1lbnQoIlByb2Nlc3MiKS5JdGVtKCJQQVRIIikpIHx8Ci0JIVBBVEhfUFJP Rygnc2VkJywgV3NoU2hlbGwuRW52aXJvbm1lbnQoIlByb2Nlc3MiKS5JdGVtKCJQQVRIIikpKSB7 Ci0gCUVSUk9SKCJncmVwIGFuZCBzZWQgYXJlIHJlcXVpcmVkIik7Ci19IAotCi0vLyB3ZSBkb24n dCB3YW50IHRvIGRlZmluZSBMSUIsIGFzIHRoYXQgd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdCBs aWJyYXJ5IHBhdGggc2V0IGluIHRoYXQgZW52IHZhcgotUEFUSF9QUk9HKCdsaWInLCBudWxsLCAn TUFLRV9MSUInKTsKLVBBVEhfUFJPRygncGhwJyk7Ci0KLVNURE9VVC5Xcml0ZUJsYW5rTGluZXMo MSk7Ci0KLWlmIChDTCkgewotCXZhciBWQ1ZFUlMgPSBwcm9iZV9tc3ZjX2NvbXBpbGVyX3ZlcnNp b24oQ0wpOwotCi0JaWYgKHR5cGVvZihNU1ZDVkVSU1tWQ1ZFUlNdKSA9PSB1bmRlZmluZWQpIHsK LQkJLy8gTGV0cyBqdXN0IGJhaWwgb3V0IGlmIHdlIGRvbnQga25vdyB0aGUgTVNWQyB2ZXJzaW9u Ci0JCUVSUk9SKCJNUyBDKysgY29tcGlsZXIgaXMgcmVxdWlyZWQgLS0gdW5hYmxlIHRvIGRldGVj dCB2ZXJzaW9uIik7Ci0JfSBlbHNlIHsKLQkJU1RET1VULldyaXRlTGluZSgiRGV0ZWN0ZWQgY29t cGlsZXIgdmVyc2lvbjogIiArIE1TVkNWRVJTW1ZDVkVSU10pOwotIAl9Ci19IGVsc2UgewotCUVS Uk9SKCJNUyBDKysgY29tcGlsZXIgaXMgcmVxdWlyZWQiKTsKLX0KLQotU1RET1VULldyaXRlQmxh bmtMaW5lcygxKTsKLQotQVJHX1dJVEgoJ3BocC1idWlsZCcsICdQYXRoIHRvIHdoZXJlIHlvdSBl eHRyYWN0ZWQgaHR0cDovL3d3dy5waHAubmV0L2V4dHJhL3dpbjMyYnVpbGQuemlwLiBBc3N1bWVz IHRoYXQgaXQgaXMgYSBzaWJsaW5nIG9mIHRoaXMgc291cmNlIGRpciAoLi5cXHBocF9idWlsZCkg aWYgbm90IHNwZWNpZmllZCcsICdubycpOwotQVJHX1dJVEgoJ2N5Z3dpbicsICdQYXRoIHRvIGN5 Z3dpbiB1dGlsaXRpZXMgb24geW91ciBzeXN0ZW0nLCAnXFxjeWd3aW4nKTsKLUFSR19FTkFCTEUo J2dkJywgJ1BocCBoYXMgc3RhdGljIGdkJywgJ25vJyk7Ci1BUkdfRU5BQkxFKCd6dHMnLCAnRGlz YWJsZSB0aHJlYWQgc2FmZXR5JywgJ3llcycpOwotCi0vLyBzdGljayBvYmplY3RzIHNvbWV3aGVy ZSBvdXRzaWRlIG9mIHRoZSBzb3VyY2UgdHJlZQotQVJHX0VOQUJMRSgnb2JqZWN0LW91dC1kaXIn LCAnQWx0ZXJuYXRpdmUgbG9jYXRpb24gZm9yIGJpbmFyeSBvYmplY3RzIGR1cmluZyBidWlsZCcs ICcnKTsKLWlmIChQSFBfR1RLX09CSkVDVF9PVVRfRElSLmxlbmd0aCkgewotCWlmICghRlNPLkZv bGRlckV4aXN0cyhQSFBfR1RLX09CSkVDVF9PVVRfRElSKSkgewotCQlFUlJPUignWW91ciBjaG9z ZW4gb3V0cHV0IGRpcmVjdG9yeSAnICsgUEhQX0dUS19PQkpFQ1RfT1VUX0RJUiArICcgZG9lcyBu b3QgZXhpc3QnKTsKLQl9Ci0JUEhQX0dUS19PQkpFQ1RfT1VUX0RJUiArPSAnXFwnOwotfQotCi1B UkdfRU5BQkxFKCdkZWJ1ZycsICdDb21waWxlIHdpdGggZGVidWdnaW5nIHN5bWJvbHMnLCAibm8i KTsKLUFSR19FTkFCTEUoJ2RlYnVnLXBhY2snLCAnUmVsZWFzZSBiaW5hcmllcyB3aXRoIGV4dGVy bmFsIGRlYnVnIHN5bWJvbHMgKC0tZW5hYmxlLWRlYnVnIG11c3Qgbm90IGJlIHNwZWNpZmllZCkn LCAnbm8nKTsKLWlmIChQSFBfR1RLX0RFQlVHID09ICJ5ZXMiICYmIFBIUF9HVEtfREVCVUdfUEFD SyA9PSAieWVzIikgewotCUVSUk9SKCJVc2Ugb2YgYm90aCAtLWVuYWJsZS1kZWJ1ZyBhbmQgLS1l bmFibGUtZGVidWctcGFjayBub3QgYWxsb3dlZC4iKTsKLX0KLQotLy8gQ29tcGlsZSBkaXJlY3Rv cnkKLWlmIChQSFBfR1RLX0RFQlVHID09ICJ5ZXMiICYmIFBIUF9HVEtfWlRTID09ICJ5ZXMiKSB7 Ci0JREVGSU5FKCJCVUlMRF9ESVIiLCBQSFBfR1RLX09CSkVDVF9PVVRfRElSICsgIkRlYnVnX1RT Iik7Ci0JREVGSU5FKCJQSFBfTElCIiwgInBocDV0c19kZWJ1Zy5saWIiKTsKLQlQSFBfTElCID0g InBocDV0c19kZWJ1Zy5saWIiOwotfSBlbHNlIGlmIChQSFBfR1RLX0RFQlVHID09ICJ5ZXMiKSB7 Ci0JREVGSU5FKCJCVUlMRF9ESVIiLCBQSFBfR1RLX09CSkVDVF9PVVRfRElSICsgIkRlYnVnIik7 Ci0JREVGSU5FKCJQSFBfTElCIiwgInBocDVfZGVidWcubGliIik7Ci0JUEhQX0xJQiA9ICJwaHA1 X2RlYnVnLmxpYiI7Ci19IGVsc2UgaWYgKFBIUF9HVEtfWlRTID09ICJ5ZXMiKSB7Ci0JREVGSU5F KCJCVUlMRF9ESVIiLCBQSFBfR1RLX09CSkVDVF9PVVRfRElSICsgIlJlbGVhc2VfVFMiKTsKLQlE RUZJTkUoIlBIUF9MSUIiLCAicGhwNXRzLmxpYiIpOwotCVBIUF9MSUIgPSAicGhwNXRzLmxpYiI7 Ci19IGVsc2UgewotCURFRklORSgiQlVJTERfRElSIiwgUEhQX0dUS19PQkpFQ1RfT1VUX0RJUiAr ICJSZWxlYXNlIik7Ci0JREVGSU5FKCJQSFBfTElCIiwgInBocDUubGliIik7Ci0JUEhQX0xJQiA9 ICJwaHA1LmxpYiI7Ci19Ci1pZiAoUEhQX0dUS19QSFBfQlVJTEQgPT0gJ25vJykgewotCWlmIChG U08uRm9sZGVyRXhpc3RzKCIuLlxccGhwX2d0a19idWlsZCIpKSB7Ci0JCVBIUF9HVEtfUEhQX0JV SUxEID0gIi4uXFxwaHBfZ3RrX2J1aWxkIjsKLQl9IGVsc2UgaWYgKEZTTy5Gb2xkZXJFeGlzdHMo Ii4uXFxwaHBfYnVpbGQiKSkgewotCQlQSFBfR1RLX1BIUF9CVUlMRCA9ICIuLlxccGhwX2J1aWxk IjsKLQl9IGVsc2UgaWYgKEZTTy5Gb2xkZXJFeGlzdHMoIi4uXFx3aW4zMmJ1aWxkIikpIHsKLQkJ UEhQX0dUS19QSFBfQlVJTEQgPSAiLi5cXHdpbjMyYnVpbGQiOwotCX0gZWxzZSBpZiAoRlNPLkZv bGRlckV4aXN0cygiLi5cXHBocC13aW4zMi1kZXZcXHBocF9idWlsZCIpKSB7Ci0JCVBIUF9HVEtf UEhQX0JVSUxEID0gIi4uXFxwaHAtd2luMzItZGV2XFxwaHBfYnVpbGQiOwotCX0KLX0KLQotdmFy IHBocF91c3VhbF9pbmNsdWRlX3N1c3BlY3RzID0gUEhQX0dUS19QSFBfQlVJTEQ7Ci12YXIgcGhw X3VzdWFsX2xpYl9zdXNwZWN0cyA9IFBIUF9HVEtfUEhQX0JVSUxEOwotCi1BUkdfSVMoJ2FsbCcs ICdDb25maWd1cmUgYWxsIGF2YWlsYWJsZSBleHRlbnNpb25zJywgJ25vJyk7Ci0KLURFRklORSgi UEhQR1RLRExMIiwgInBocF9ndGsyLmRsbCIpOwotREVGSU5FKCJQSFBHVEtMSUIiLCAicGhwX2d0 azIubGliIik7Ci1nZXRfdmVyc2lvbl9udW1iZXJzKCk7Ci0vKiBwaWNrIHVwIHRoZSB2ZXJzaW9u IGZyb20gZ3RrL2d0a3ZlcnNpb24uaCAqLwotZ2V0X2d0a19saWJ2ZXJzaW9uKCk7Ci0KLS8vIEdl bmVyYWwgbGluayBmbGFncwotREVGSU5FKCJMREZMQUdTIiwgIi9ub2xvZ28iKTsKLS8vIEdlbmVy YWwgRExMIGxpbmsgZmxhZ3MKLURFRklORSgiRExMX0xERkxBR1MiLCAiL2RsbCAvbWFjaGluZTpJ Mzg2Iik7Ci0vLyBQSFAtR1RLIERMTCBsaW5rIGZsYWdzCi1ERUZJTkUoIkxERkxBR1NfUEhQX0dU SyIsICIkKERMTF9MREZMQUdTKSIpOwotCi0vLyBHZW5lcmFsIGxpYnMKLURFRklORSgiTElCUyIs ICJrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMy LmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIik7Ci0KLWlmIChQSFBfR1RL X0RFQlVHID09ICJ5ZXMiKSB7Ci0JREVGSU5FKCJDRkxBR1MiLCAiL25vbG9nbyAvTERkIC9NRGQg L0dtIC9aSSAvR1ogL0kgLiAvSSAuLlxcIC9JIC4uXFwuLiAvSSBtYWluIC9JIC4uXFxtYWluIC9J IGV4dCAvSSAuLlxcZXh0IC9EIFpFTkRfV0lOMzIgL0QgWkVORF9ERUJVRz0xIC9EIFBIUF9XSU4z MiAvRCBXSU4zMiAvRCBfREVCVUcgL0QgX1dJTkRPV1MgL0QgX01CQ1MgL0QgX1VTUkRMTCIpOwot CUFERF9GTEFHKCJMREZMQUdTIiwgIi9kZWJ1ZyIpOwotCi19IGVsc2UgewotCURFRklORSgiQ0ZM QUdTIiwgIi9ub2xvZ28gL01EIC9XMyAvR1ggL08yIC9JIC4gL0kgLi5cXCAvSSAuLlxcLi4gL0kg bWFpbiAvSSAuLlxcbWFpbiAvSSBleHQgL0kgLi5cXGV4dCAvRCBaRU5EX1dJTjMyIC9EIFpFTkRf REVCVUc9MCAvRCBQSFBfV0lOMzIgL0QgV0lOMzIgL0QgTkRFQlVHIC9EIF9XSU5ET1dTIC9EIF9N QkNTIC9EIF9VU1JETEwiKTsKLQkvLyBHZW5lcmF0ZSBleHRlcm5hbCBkZWJ1ZyBmaWxlcyB3aGVu IC0tZW5hYmxlLWRlYnVnLXBhY2sgaXMgc3BlY2lmaWVkCi0JaWYgKFBIUF9HVEtfREVCVUdfUEFD SyA9PSAieWVzIikgewotCSAJQUREX0ZMQUcoIkNGTEFHUyIsICIvWmkiKTsKLQkgCUFERF9GTEFH KCJMREZMQUdTIiwgIi9pbmNyZW1lbnRhbDpubyAvZGVidWcgL29wdDpyZWYsaWNmIik7Ci0JIH0K LX0KLQotaWYgKFBIUF9HVEtfWlRTID09ICJ5ZXMiKSB7Ci0JIAlBRERfRkxBRygiQ0ZMQUdTIiwg Ii9EIFpUUz0xIik7Ci0JIH0KLQotaWYgKFZDVkVSUyA8IDE0MDApIHsKLQkvLyBFbmFibGUgYXV0 b21hdGljIHByZWNvbXBpbGVkIGhlYWRlcnMKLQlBRERfRkxBRygnQ0ZMQUdTJywgJy9ZWCAvYycp OwotfSBlbHNlIHsKLQkvLyBmdW4gc3R1ZmY6IE1TIGRlcHJlY2F0ZWQgQU5TSSBzdGRpbyBhbmQg c2ltaWxhciBmdW5jdGlvbnMgLSBkaXNhYmxlIHdhcm5pbmdzCi0JLy8gR1MgaGFyZGVucyB0aGUg YmluYXJ5IGFnYWluc3QgYnVmZmVyIG92ZXJydW5zCi0JQUREX0ZMQUcoJ0NGTEFHUycsICcvR1Mg L3dkNDk5NiAnKTsKLX0KLQotaWYgKFBIUF9HVEtfR0QgPT0gInllcyIpIHsKLQlBRERfRkxBRygn Q0ZMQUdTJywgJy9EIEhBVkVfR0RfQlVORExFRD0xJyk7IAotfQotCi1wcm9iZV9iYXNpY19oZWFk ZXJzKCk7Ci0KLUFERF9TT1VSQ0VTKCJtYWluIiwgInBocF9ndGsuYyBwaHBfZ3RrX2V4dC53MzIu YyBwaHBfZ3RrX3V0aWwuYyBwaHBnX2Nsb3N1cmUuYyBwaHBnX2V4Y2VwdGlvbnMuYyBwaHBnX2di b3hlZC5jIHBocGdfZ29iamVjdC5jIHBocGdfZ3BvaW50ZXIuYyBwaHBnX2d0eXBlLmMgcGhwZ19n dmFsdWUuYyBwaHBnX2F0b20uYyBwaHBnX3N1cHBvcnQuYyBwaHBnX3BhcmFtc3BlYy5jIiwgInBo cC1ndGsiKTsKLQorLy8gdmltOmZ0PWphdmFzY3JpcHQNCisvLyAkSWQkDQorLy8gIk1hc3RlciIg Y29uZmlnIGZpbGU7IHRoaW5rIG9mIGl0IGFzIGEgY29uZmlndXJlLmluIGVxdWl2YWxlbnQuDQor DQorLy8gTVNWQyB2ZXJzaW9uIHRhYmxlDQordmFyIE1TVkNWRVJTID0gW107DQorTVNWQ1ZFUlNb MTIwMF0gPSAnTVNWQzYgKFZpc3VhbCBDKysgNi4wKSc7DQorTVNWQ1ZFUlNbMTMwMF0gPSAnTVNW QzcgKFZpc3VhbCBDKysgMjAwMiknOw0KK01TVkNWRVJTWzEzMTBdID0gJ01TVkM3LjEgKFZpc3Vh bCBDKysgMjAwMyknOw0KK01TVkNWRVJTWzE0MDBdID0gJ01TVkM4IChWaXN1YWwgQysrIDIwMDUp JzsNCitNU1ZDVkVSU1sxNTAwXSA9ICdNU1ZDOSAoVmlzdWFsIEMrKyAyMDA4KSc7DQorTVNWQ1ZF UlNbMTYwMF0gPSAnTVNWQzEwIChWaXN1YWwgQysrIDIwMTApJzsNCisNCitTVERPVVQuV3JpdGVC bGFua0xpbmVzKDEpOw0KKw0KK0NMID0gUEFUSF9QUk9HKCdjbCcpOw0KKw0KKy8vIGF2b2lkIHBp Y2tpbmcgdXAgbWlkbmlnaHQgY29tbWFuZGVyIGZyb20gY3lnd2luDQorUEFUSF9QUk9HKCdtYycs IFdzaFNoZWxsLkVudmlyb25tZW50KCJQcm9jZXNzIikuSXRlbSgiUEFUSCIpKTsNCitQQVRIX1BS T0coJ3JjJywgV3NoU2hlbGwuRW52aXJvbm1lbnQoIlByb2Nlc3MiKS5JdGVtKCJQQVRIIikpOw0K Kw0KKy8qIGN5Z3dpbiBzaGlwcyB3aXRoICdsaW5rLmV4ZScuIEF2b2lkIHNlYXJjaGluZyB0aGUg Y3lnd2luIHBhdGggZm9yIHRoaXMsIGFzIHdlIHdhbnQgdGhlIE1TIGxpbmtlciAqLw0KK1BBVEhf UFJPRygnbGluaycsIFdzaFNoZWxsLkVudmlyb25tZW50KCJQcm9jZXNzIikuSXRlbSgiUEFUSCIp LCAiTEQiKTsNCitQQVRIX1BST0coJ25tYWtlJyk7DQorDQorLy8gY2hlY2sgZm9yIGdyZXAgYW5k IHNlZCENCitpZiAoIVBBVEhfUFJPRygnZ3JlcCcsIFdzaFNoZWxsLkVudmlyb25tZW50KCJQcm9j ZXNzIikuSXRlbSgiUEFUSCIpKSB8fA0KKwkhUEFUSF9QUk9HKCdzZWQnLCBXc2hTaGVsbC5FbnZp cm9ubWVudCgiUHJvY2VzcyIpLkl0ZW0oIlBBVEgiKSkpIHsNCisgCUVSUk9SKCJncmVwIGFuZCBz ZWQgYXJlIHJlcXVpcmVkIik7DQorfSANCisNCisvLyB3ZSBkb24ndCB3YW50IHRvIGRlZmluZSBM SUIsIGFzIHRoYXQgd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdCBsaWJyYXJ5IHBhdGggc2V0IGlu IHRoYXQgZW52IHZhcg0KK1BBVEhfUFJPRygnbGliJywgbnVsbCwgJ01BS0VfTElCJyk7DQorUEFU SF9QUk9HKCdwaHAnKTsNCisNCitpZiAoIVBBVEhfUFJPRygncGhwJywgV3NoU2hlbGwuRW52aXJv bm1lbnQoIlByb2Nlc3MiKS5JdGVtKCJQQVRIIikpKSB7DQorIAlFUlJPUigicGhwIGlzIHJlcXVp cmVkIik7DQorfSANCisNCitTVERPVVQuV3JpdGVCbGFua0xpbmVzKDEpOw0KKw0KK2lmIChDTCkg ew0KKwl2YXIgVkNWRVJTID0gcHJvYmVfbXN2Y19jb21waWxlcl92ZXJzaW9uKENMKTsNCisJU1RE T1VULldyaXRlTGluZSgiRGV0ZWN0ZWQgY29tcGlsZXIgdmVyc2lvbjogIiArIFZDVkVSUyk7DQor DQorCWlmICh0eXBlb2YoTVNWQ1ZFUlNbVkNWRVJTXSkgPT0gdW5kZWZpbmVkKSB7DQorCQkvLyBM ZXRzIGp1c3QgYmFpbCBvdXQgaWYgd2UgZG9udCBrbm93IHRoZSBNU1ZDIHZlcnNpb24NCisJCUVS Uk9SKCJNUyBDKysgY29tcGlsZXIgaXMgcmVxdWlyZWQgLS0gdW5hYmxlIHRvIGRldGVjdCB2ZXJz aW9uIik7DQorCX0gZWxzZSB7DQorCQlTVERPVVQuV3JpdGVMaW5lKCJEZXRlY3RlZCBjb21waWxl ciB2ZXJzaW9uOiAiICsgTVNWQ1ZFUlNbVkNWRVJTXSk7DQorIAl9DQorfSBlbHNlIHsNCisJRVJS T1IoIk1TIEMrKyBjb21waWxlciBpcyByZXF1aXJlZCIpOw0KK30NCisNCitTVERPVVQuV3JpdGVC bGFua0xpbmVzKDEpOw0KKw0KK0FSR19XSVRIKCdwaHAtYnVpbGQnLCAnUGF0aCB0byB3aGVyZSB5 b3UgZXh0cmFjdGVkIGh0dHA6Ly93d3cucGhwLm5ldC9leHRyYS93aW4zMmJ1aWxkLnppcC4gQXNz dW1lcyB0aGF0IGl0IGlzIGEgc2libGluZyBvZiB0aGlzIHNvdXJjZSBkaXIgKC4uXFxwaHBfYnVp bGQpIGlmIG5vdCBzcGVjaWZpZWQnLCAnbm8nKTsNCitBUkdfV0lUSCgnY3lnd2luJywgJ1BhdGgg dG8gY3lnd2luIHV0aWxpdGllcyBvbiB5b3VyIHN5c3RlbScsICdcXGN5Z3dpbicpOw0KK0FSR19F TkFCTEUoJ2dkJywgJ1BocCBoYXMgc3RhdGljIGdkJywgJ25vJyk7DQorQVJHX0VOQUJMRSgnenRz JywgJ0Rpc2FibGUgdGhyZWFkIHNhZmV0eScsICd5ZXMnKTsNCisNCisvLyBzdGljayBvYmplY3Rz IHNvbWV3aGVyZSBvdXRzaWRlIG9mIHRoZSBzb3VyY2UgdHJlZQ0KK0FSR19FTkFCTEUoJ29iamVj dC1vdXQtZGlyJywgJ0FsdGVybmF0aXZlIGxvY2F0aW9uIGZvciBiaW5hcnkgb2JqZWN0cyBkdXJp bmcgYnVpbGQnLCAnJyk7DQoraWYgKFBIUF9HVEtfT0JKRUNUX09VVF9ESVIubGVuZ3RoKSB7DQor CWlmICghRlNPLkZvbGRlckV4aXN0cyhQSFBfR1RLX09CSkVDVF9PVVRfRElSKSkgew0KKwkJRVJS T1IoJ1lvdXIgY2hvc2VuIG91dHB1dCBkaXJlY3RvcnkgJyArIFBIUF9HVEtfT0JKRUNUX09VVF9E SVIgKyAnIGRvZXMgbm90IGV4aXN0Jyk7DQorCX0NCisJUEhQX0dUS19PQkpFQ1RfT1VUX0RJUiAr PSAnXFwnOw0KK30NCisNCitBUkdfRU5BQkxFKCdkZWJ1ZycsICdDb21waWxlIHdpdGggZGVidWdn aW5nIHN5bWJvbHMnLCAibm8iKTsNCitBUkdfRU5BQkxFKCdkZWJ1Zy1wYWNrJywgJ1JlbGVhc2Ug YmluYXJpZXMgd2l0aCBleHRlcm5hbCBkZWJ1ZyBzeW1ib2xzICgtLWVuYWJsZS1kZWJ1ZyBtdXN0 IG5vdCBiZSBzcGVjaWZpZWQpJywgJ25vJyk7DQoraWYgKFBIUF9HVEtfREVCVUcgPT0gInllcyIg JiYgUEhQX0dUS19ERUJVR19QQUNLID09ICJ5ZXMiKSB7DQorCUVSUk9SKCJVc2Ugb2YgYm90aCAt LWVuYWJsZS1kZWJ1ZyBhbmQgLS1lbmFibGUtZGVidWctcGFjayBub3QgYWxsb3dlZC4iKTsNCit9 DQorDQorLy8gQ29tcGlsZSBkaXJlY3RvcnkNCitpZiAoUEhQX0dUS19ERUJVRyA9PSAieWVzIiAm JiBQSFBfR1RLX1pUUyA9PSAieWVzIikgew0KKwlERUZJTkUoIkJVSUxEX0RJUiIsIFBIUF9HVEtf T0JKRUNUX09VVF9ESVIgKyAiRGVidWdfVFMiKTsNCisJREVGSU5FKCJQSFBfTElCIiwgInBocDV0 c19kZWJ1Zy5saWIiKTsNCisJUEhQX0xJQiA9ICJwaHA1dHNfZGVidWcubGliIjsNCit9IGVsc2Ug aWYgKFBIUF9HVEtfREVCVUcgPT0gInllcyIpIHsNCisJREVGSU5FKCJCVUlMRF9ESVIiLCBQSFBf R1RLX09CSkVDVF9PVVRfRElSICsgIkRlYnVnIik7DQorCURFRklORSgiUEhQX0xJQiIsICJwaHA1 X2RlYnVnLmxpYiIpOw0KKwlQSFBfTElCID0gInBocDVfZGVidWcubGliIjsNCit9IGVsc2UgaWYg KFBIUF9HVEtfWlRTID09ICJ5ZXMiKSB7DQorCURFRklORSgiQlVJTERfRElSIiwgUEhQX0dUS19P QkpFQ1RfT1VUX0RJUiArICJSZWxlYXNlX1RTIik7DQorCURFRklORSgiUEhQX0xJQiIsICJwaHA1 dHMubGliIik7DQorCVBIUF9MSUIgPSAicGhwNXRzLmxpYiI7DQorfSBlbHNlIHsNCisJREVGSU5F KCJCVUlMRF9ESVIiLCBQSFBfR1RLX09CSkVDVF9PVVRfRElSICsgIlJlbGVhc2UiKTsNCisJREVG SU5FKCJQSFBfTElCIiwgInBocDUubGliIik7DQorCVBIUF9MSUIgPSAicGhwNS5saWIiOw0KK30N CitpZiAoUEhQX0dUS19QSFBfQlVJTEQgPT0gJ25vJykgew0KKwlpZiAoRlNPLkZvbGRlckV4aXN0 cygiLi5cXHBocF9ndGtfYnVpbGQiKSkgew0KKwkJUEhQX0dUS19QSFBfQlVJTEQgPSAiLi5cXHBo cF9ndGtfYnVpbGQiOw0KKwl9IGVsc2UgaWYgKEZTTy5Gb2xkZXJFeGlzdHMoIi4uXFxwaHBfYnVp bGQiKSkgew0KKwkJUEhQX0dUS19QSFBfQlVJTEQgPSAiLi5cXHBocF9idWlsZCI7DQorCX0gZWxz ZSBpZiAoRlNPLkZvbGRlckV4aXN0cygiLi5cXHdpbjMyYnVpbGQiKSkgew0KKwkJUEhQX0dUS19Q SFBfQlVJTEQgPSAiLi5cXHdpbjMyYnVpbGQiOw0KKwl9IGVsc2UgaWYgKEZTTy5Gb2xkZXJFeGlz dHMoIi4uXFxwaHAtd2luMzItZGV2XFxwaHBfYnVpbGQiKSkgew0KKwkJUEhQX0dUS19QSFBfQlVJ TEQgPSAiLi5cXHBocC13aW4zMi1kZXZcXHBocF9idWlsZCI7DQorCX0NCit9DQorDQordmFyIHBo cF91c3VhbF9pbmNsdWRlX3N1c3BlY3RzID0gUEhQX0dUS19QSFBfQlVJTEQ7DQordmFyIHBocF91 c3VhbF9saWJfc3VzcGVjdHMgPSBQSFBfR1RLX1BIUF9CVUlMRDsNCisNCitBUkdfSVMoJ2FsbCcs ICdDb25maWd1cmUgYWxsIGF2YWlsYWJsZSBleHRlbnNpb25zJywgJ25vJyk7DQorDQorREVGSU5F KCJQSFBHVEtETEwiLCAicGhwX2d0azIuZGxsIik7DQorREVGSU5FKCJQSFBHVEtMSUIiLCAicGhw X2d0azIubGliIik7DQorZ2V0X3ZlcnNpb25fbnVtYmVycygpOw0KKy8qIHBpY2sgdXAgdGhlIHZl cnNpb24gZnJvbSBndGsvZ3RrdmVyc2lvbi5oICovDQorZ2V0X2d0a19saWJ2ZXJzaW9uKCk7DQor DQorLy8gR2VuZXJhbCBsaW5rIGZsYWdzDQorREVGSU5FKCJMREZMQUdTIiwgIi9ub2xvZ28iKTsN CisvLyBHZW5lcmFsIERMTCBsaW5rIGZsYWdzDQorREVGSU5FKCJETExfTERGTEFHUyIsICIvZGxs IC9tYWNoaW5lOkkzODYiKTsNCisvLyBQSFAtR1RLIERMTCBsaW5rIGZsYWdzDQorREVGSU5FKCJM REZMQUdTX1BIUF9HVEsiLCAiJChETExfTERGTEFHUykiKTsNCisNCisvLyBHZW5lcmFsIGxpYnMN CitERUZJTkUoIkxJQlMiLCAia2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNw b29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiIp Ow0KKw0KK2lmIChQSFBfR1RLX0RFQlVHID09ICJ5ZXMiKSB7DQorCURFRklORSgiQ0ZMQUdTIiwg Ii9ub2xvZ28gL0xEZCAvTURkIC9HbSAvWkkgL0daIC9JIC4gL0kgLi5cXCAvSSAuLlxcLi4gL0kg bWFpbiAvSSAuLlxcbWFpbiAvSSBleHQgL0kgLi5cXGV4dCAvRCBaRU5EX1dJTjMyIC9EIFpFTkRf REVCVUc9MSAvRCBQSFBfV0lOMzIgL0QgV0lOMzIgL0QgX0RFQlVHIC9EIF9XSU5ET1dTIC9EIF9N QkNTIC9EIF9VU1JETEwiKTsNCisJQUREX0ZMQUcoIkxERkxBR1MiLCAiL2RlYnVnIik7DQorDQor fSBlbHNlIHsNCisJREVGSU5FKCJDRkxBR1MiLCAiL25vbG9nbyAvTUQgL1czIC9FSHNjIC9PeCAv SSAuIC9JIC4uXFwgL0kgLi5cXC4uIC9JIG1haW4gL0kgLi5cXG1haW4gL0kgZXh0IC9JIC4uXFxl eHQgL0QgWkVORF9XSU4zMiAvRCBaRU5EX0RFQlVHPTAgL0QgUEhQX1dJTjMyIC9EIFdJTjMyIC9E IE5ERUJVRyAvRCBfV0lORE9XUyAvRCBfTUJDUyAvRCBfVVNSRExMIik7DQorCS8vIEdlbmVyYXRl IGV4dGVybmFsIGRlYnVnIGZpbGVzIHdoZW4gLS1lbmFibGUtZGVidWctcGFjayBpcyBzcGVjaWZp ZWQNCisJaWYgKFBIUF9HVEtfREVCVUdfUEFDSyA9PSAieWVzIikgew0KKwkgCUFERF9GTEFHKCJD RkxBR1MiLCAiL1ppIik7DQorCSAJQUREX0ZMQUcoIkxERkxBR1MiLCAiL2luY3JlbWVudGFsOm5v IC9kZWJ1ZyAvb3B0OnJlZixpY2YiKTsNCisJIH0NCit9DQorDQoraWYgKFBIUF9HVEtfWlRTID09 ICJ5ZXMiKSB7DQorCSAJQUREX0ZMQUcoIkNGTEFHUyIsICIvRCBaVFM9MSIpOw0KKwkgfQ0KKw0K K2lmIChWQ1ZFUlMgPCAxNDAwKSB7DQorCS8vIEVuYWJsZSBhdXRvbWF0aWMgcHJlY29tcGlsZWQg aGVhZGVycw0KKwlBRERfRkxBRygnQ0ZMQUdTJywgJy9ZWCAvYycpOw0KK30gZWxzZSB7DQorCS8v IGZ1biBzdHVmZjogTVMgZGVwcmVjYXRlZCBBTlNJIHN0ZGlvIGFuZCBzaW1pbGFyIGZ1bmN0aW9u cyAtIGRpc2FibGUgd2FybmluZ3MNCisJLy8gR1MgaGFyZGVucyB0aGUgYmluYXJ5IGFnYWluc3Qg YnVmZmVyIG92ZXJydW5zDQorCUFERF9GTEFHKCdDRkxBR1MnLCAnL0dTIC93ZDQ5OTYgJyk7DQor fQ0KKw0KK2lmIChQSFBfR1RLX0dEID09ICJ5ZXMiKSB7DQorCUFERF9GTEFHKCdDRkxBR1MnLCAn L0QgSEFWRV9HRF9CVU5ETEVEPTEnKTsgDQorfQ0KKw0KK3Byb2JlX2Jhc2ljX2hlYWRlcnMoKTsN CisNCitBRERfU09VUkNFUygibWFpbiIsICJwaHBfZ3RrLmMgcGhwX2d0a19leHQudzMyLmMgcGhw X2d0a191dGlsLmMgcGhwZ19jbG9zdXJlLmMgcGhwZ19leGNlcHRpb25zLmMgcGhwZ19nYm94ZWQu YyBwaHBnX2dvYmplY3QuYyBwaHBnX2dwb2ludGVyLmMgcGhwZ19ndHlwZS5jIHBocGdfZ3ZhbHVl LmMgcGhwZ19hdG9tLmMgcGhwZ19zdXBwb3J0LmMgcGhwZ19wYXJhbXNwZWMuYyIsICJwaHAtZ3Rr Iik7DQorDQpkaWZmIC0tZ2l0IGEvd2luMzIvY29uZnV0aWxzLmpzIGIvd2luMzIvY29uZnV0aWxz LmpzCmluZGV4IGExOWNmN2YuLjVjZTA4ZTkgMTAwNjQ0Ci0tLSBhL3dpbjMyL2NvbmZ1dGlscy5q cworKysgYi93aW4zMi9jb25mdXRpbHMuanMKQEAgLTEsMTI2MyArMSwxMjYzIEBACi0vLyBVdGls cyBmb3IgY29uZmlndXJlIHNjcmlwdAotLyoKLSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgUEhQLUdU SyBWZXJzaW9uIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfAotICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgfCBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNSBU aGUgUEhQIEdyb3VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICstLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tKwotICB8IFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB2ZXJzaW9uIDMuMCBv ZiB0aGUgUEhQIGxpY2Vuc2UsICAgICAgIHwKLSAgfCB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlz IHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRSwgYW5kIGlzICAgICAgICB8Ci0gIHwgYXZhaWxh YmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoZSBmb2xsb3dpbmcgdXJsOiAgICAg ICAgICAgfAotICB8IGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQuICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgfCBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEg Y29weSBvZiB0aGUgUEhQIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG8gICB8Ci0gIHwgb2J0YWlu IGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhIG5vdGUgdG8gICAg ICAgICAgfAotICB8IGxpY2Vuc2VAcGhwLm5ldCBzbyB3ZSBjYW4gbWFpbCB5b3UgYSBjb3B5IGlt bWVkaWF0ZWx5LiAgICAgICAgICAgICAgIHwKLSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgQXV0aG9y OiBXZXogRnVybG9uZyA8d2V6QHRoZWJyYWlucm9vbS5jb20+ICAgICAgICAgICAgICAgICAgICAg ICAgICAgfAotICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi0KLS8vICRJZDogY29uZnV0aWxzLmpzLHYg MS4yNCAyMDA4LTA4LTAxIDE0OjM0OjQzIGF1cm9yYWVvc3Jvc2UgRXhwICQKLQotLyogc2V0IHZh cnMgKi8KLXZhciBTVERPVVQgPSBXU2NyaXB0LlN0ZE91dDsKLXZhciBTVERFUlIgPSBXU2NyaXB0 LlN0ZEVycjsKLXZhciBXc2hTaGVsbCA9IFdTY3JpcHQuQ3JlYXRlT2JqZWN0KCJXU2NyaXB0LlNo ZWxsIik7Ci12YXIgRlNPID0gV1NjcmlwdC5DcmVhdGVPYmplY3QoIlNjcmlwdGluZy5GaWxlU3lz dGVtT2JqZWN0Iik7Ci12YXIgTUZPID0gbnVsbDsKLXZhciBNRkUgPSBudWxsOwotdmFyIFNZU1RF TV9EUklWRSA9IFdzaFNoZWxsLkVudmlyb25tZW50KCJQcm9jZXNzIikuSXRlbSgiU3lzdGVtRHJp dmUiKTsKLXZhciBQUk9HUkFNX0ZJTEVTID0gV3NoU2hlbGwuRW52aXJvbm1lbnQoIlByb2Nlc3Mi KS5JdGVtKCJQcm9ncmFtRmlsZXMiKTsKLQotaWYgKFBST0dSQU1fRklMRVMgPT0gbnVsbCkgewot CVBST0dSQU1fRklMRVMgPSAiQzpcXFByb2dyYW0gRmlsZXMiOwotfQotCi12YXIgQ1dEID0gV3No U2hlbGwuQ3VycmVudERpcmVjdG9yeTsKLQotaWYgKHR5cGVvZihDV0QpID09ICJ1bmRlZmluZWQi KSB7Ci0JQ1dEID0gRlNPLkdldFBhcmVudEZvbGRlck5hbWUoRlNPLkdldEFic29sdXRlUGF0aE5h bWUoImJ1aWxkY29uZi5iYXQiKSk7Ci19Ci0KLWNvbmZpZ3VyZV9hcmdzID0gbmV3IEFycmF5KCk7 Ci1jb25maWd1cmVfc3Vic3QgPSBXU2NyaXB0LkNyZWF0ZU9iamVjdCgiU2NyaXB0aW5nLkRpY3Rp b25hcnkiKTsKLQotY29uZmlndXJlX2hkciA9IFdTY3JpcHQuQ3JlYXRlT2JqZWN0KCJTY3JpcHRp bmcuRGljdGlvbmFyeSIpOwotYnVpbGRfZGlycyA9IG5ldyBBcnJheSgpOwotbWFrZV9idWlsZHMg PSBuZXcgQXJyYXkoKTsKLQotZXh0ZW5zaW9uX2luY2x1ZGVfY29kZSA9ICIiOwotZXh0ZW5zaW9u X21vZHVsZV9wdHJzID0gIiI7Ci0KLS8qIGZ1bmN0aW9ucyAqLwotCi1mdW5jdGlvbiBnZXRfZ3Rr X2xpYnZlcnNpb24oKQotewotCXZhciBlbnYsIGksIHZpbiwgbWFqb3IsIG1pbm9yOwotCXZhciBm b3VuZCA9IGZhbHNlOwotCi0JZm91bmQgPSBDSEVDS19IRUFERVIoImd0ay9ndGt2ZXJzaW9uLmgi KTsKLQotCWlmIChmb3VuZCkgewotCQlTVERPVVQuV3JpdGVMaW5lKCIJPGluIGRlZmF1bHQgcGF0 aD4iKTsKLQkJdmluID0gZmlsZV9nZXRfY29udGVudHMoZm91bmQgKyAiXFxndGtcXGd0a3ZlcnNp b24uaCIpOwotCi0JCXJlZ2V4ID0gbmV3IFJlZ0V4cCgiR1RLX01BSk9SX1ZFUlNJT05cXHMrXFwo KFswLTldKylcXCkiKTsKLQkJcmVnZXguZXhlYyh2aW4pOwotCQltYWpvciA9IFJlZ0V4cC4kMTsK LQkJaWYgKG1ham9yIDwgMikKLQkJCW1ham9yID0gMjsKLQkKLQkJcmVnZXggPSBuZXcgUmVnRXhw KCJHVEtfTUlOT1JfVkVSU0lPTlxccytcXCgoWzAtOV0rKVxcKSIpOwotCQlyZWdleC5leGVjKHZp bik7Ci0JCW1pbm9yID0gUmVnRXhwLiQxOwotCQlpZiAobWlub3IgPCA2KQotCQkJbWlub3IgPSA2 OwotCQotCQlpZiAobWFqb3IgPj0gMiAmJiBtaW5vciA+PTgpIHsKLQkJCUVOQUJMRV9DQUlSTyA9 IDE7Ci0JCX0gZWxzZSB7Ci0JCQlFTkFCTEVfQ0FJUk8gPSAwOwotCQl9Ci0JCVBIUF9HVEtfTElC VkVSU0lPTiA9IG1ham9yICsgJy4nICsgbWlub3I7Ci0JfSBlbHNlIHsKLQkJU1RET1VULldyaXRl TGluZSgiCTxub3QgZm91bmQ+Iik7Ci0JCVBIUF9HVEtfTElCVkVSU0lPTiA9ICcyLjYnOwotCX0K LQotCVNURE9VVC5Xcml0ZSgiTGlicmFyeSBkZWZpbml0aW9ucyBmb3IgIiArIFBIUF9HVEtfTElC VkVSU0lPTiArICIgd2lsbCBiZSB1c2VkIik7Ci0JU1RERVJSLldyaXRlQmxhbmtMaW5lcygxKTsK LX0KLQotZnVuY3Rpb24gZ2VuZXJhdGVfc291cmNlKCkgewotCi0JaWYgKCFGU08uRmlsZUV4aXN0 cygiZXh0XFxndGsrXFxjb21wbGV0ZS50eHQiKSkgewotCQlpZiAoIUZTTy5GaWxlRXhpc3RzKCJ3 aW4zMlxcdGVtcC5iYXQiKSkgewotCQkJU1RERVJSLldyaXRlTGluZSgiUnVuIGJ1aWxkY29uZiBm aXJzdCAtIHRoZSBzb3VyY2UgZmlsZSBnZW5lcmF0b3IgaXMgbWlzc2luZyIpOwotCQkJV1Njcmlw dC5RdWl0KDEwKTsKLQkJfSBlbHNlIHsKLQkJCXZhciB0ZW1wID0gRlNPLk9wZW5UZXh0RmlsZSgi d2luMzJcXHRlbXAuYmF0IiwgOCk7Ci0JCQl0ZW1wLldyaXRlTGluZSgiQGVjaG8gb2ZmID4gc291 cmNlX2NvbXBsZXRlLnR4dCIpOwotCQkJdGVtcC5DbG9zZSgpOwotCQkJV3NoU2hlbGwuUnVuKCJ3 aW4zMlxcdGVtcCIsIDApOwotCQl9Ci0JfQotCXJldHVybjsKLX0KLQotZnVuY3Rpb24gY2hlY2tf Z2VuZXJhdGlvbigpIHsKLQotCWlmICghRlNPLkZpbGVFeGlzdHMoInNvdXJjZV9jb21wbGV0ZS50 eHQiKSkgewotCQlTVERPVVQuV3JpdGVMaW5lKCJXYWl0aW5nIGZvciBzb3VyY2UgZmlsZXMgdG8g Z2VuZXJhdGUuLi4iKTsKLQkJV1NjcmlwdC5TbGVlcCgzNTAwKTsKLQkJY2hlY2tfZ2VuZXJhdGlv bigpOwotCX0KLQlyZXR1cm47Ci19Ci0KLWZ1bmN0aW9uIGdldF92ZXJzaW9uX251bWJlcnMoKSB7 Ci0KLQkvKiBwaWNrIHVwIHRoZSB2ZXJzaW9uIGZyb20gbWFpbi9waHBfZ3RrLmggKi8KLQl2YXIg dmluID0gZmlsZV9nZXRfY29udGVudHMoIm1haW5cXHBocF9ndGsuaCIpOwotCXZhciB2ZXJzaW9u LCB2ZXJzaW9uX3N0cmluZ3MsIG1ham9yLCBtaW5vciwgZGV0YWlscywgcmVsZWFzZSA9ICIiLCBl eHRyYSA9ICIiOwotCi0JaWYgKHZpbi5tYXRjaChuZXcgUmVnRXhwKCJQSFBfR1RLX1ZFUlNJT04g XCIoW15cIl0rKVwiIikpKSB7Ci0JCXZlcnNpb24gPSBSZWdFeHAuJDE7Ci0JCXZlcnNpb25fc3Ry aW5ncyA9IHZlcnNpb24uc3BsaXQoIi4iKTsKLQotCQltYWpvciA9IHZlcnNpb25fc3RyaW5nc1sw XTsKLQkJbWlub3IgPSB2ZXJzaW9uX3N0cmluZ3NbMV07Ci0JCWRldGFpbHMgPSB2ZXJzaW9uX3N0 cmluZ3NbMl07Ci0KLQkJZm9yIChpID0gMDsgaSA8IGRldGFpbHMubGVuZ3RoOyBpKyspIHsKLQkJ CWlmKCFpc05hTihkZXRhaWxzLmNoYXJBdChpKSkpIHsKLQkJCQlyZWxlYXNlID0gcmVsZWFzZSAr IGRldGFpbHMuY2hhckF0KGkpOwotCQkJfSBlbHNlIHsKLQkJCQlleHRyYSA9IGRldGFpbHMuc3Vi c3RyaW5nKGkpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JdmFyIHZmaWxlID0gRlNP LkNyZWF0ZVRleHRGaWxlKCJtYWluL3BocF9ndGtfdmVyc2lvbi5oIiwgdHJ1ZSk7Ci0JdmZpbGUu V3JpdGVMaW5lKCIvKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZHVyaW5n IHdpbjMyIGNvbmZpZ3VyYXRpb24gKi8iKTsKLQl2ZmlsZS5Xcml0ZUxpbmUoIi8qIEVkaXQgcGhw X2d0ay5oIHRvIGNoYW5nZSB0aGUgdmVyc2lvbiBudW1iZXIgKi8iKTsKLQl2ZmlsZS5Xcml0ZUxp bmUoIiNkZWZpbmUgUEhQX0dUS19NQUpPUl9WRVJTSU9OICIgKyBtYWpvcik7Ci0JdmZpbGUuV3Jp dGVMaW5lKCIjZGVmaW5lIFBIUF9HVEtfTUlOT1JfVkVSU0lPTiAiICsgbWlub3IpOwotCXZmaWxl LldyaXRlTGluZSgiI2RlZmluZSBQSFBfR1RLX1JFTEVBU0VfVkVSU0lPTiAiICsgcmVsZWFzZSk7 Ci0JaWYgKFBIUF9HVEtfREVCVUcgPT0gInllcyIpIHsKLQkJdmZpbGUuV3JpdGVMaW5lKCIjZGVm aW5lIFBIUF9HVEtfRVhUUkFfVkVSU0lPTiBcIiIgKyBleHRyYSArICIgKERFQlVHKVwiIik7Ci0J fSBlbHNlIHsKLQkJdmZpbGUuV3JpdGVMaW5lKCIjZGVmaW5lIFBIUF9HVEtfRVhUUkFfVkVSU0lP TiBcIiIgKyBleHRyYSArICJcIiIpOwotCX0KLQotCURFRklORSgnUEhQX0dUS19WRVJTSU9OX1NU UklORycsIHZlcnNpb24pOwotfQotCi1mdW5jdGlvbiBjb25kZW5zZV9wYXRoKHBhdGgpIHsKLQot CXBhdGggPSBGU08uR2V0QWJzb2x1dGVQYXRoTmFtZShwYXRoKTsKLQotCWlmIChwYXRoLnN1YnN0 cigwLCBDV0QubGVuZ3RoKS50b0xvd2VyQ2FzZSgpCi0JCQk9PSBDV0QudG9Mb3dlckNhc2UoKSAm JgotCQkJKHBhdGguY2hhckNvZGVBdChDV0QubGVuZ3RoKSA9PSA5MiB8fCBwYXRoLmNoYXJDb2Rl QXQoQ1dELmxlbmd0aCkgPT0gNDcpKSB7Ci0JCXJldHVybiBwYXRoLnN1YnN0cihDV0QubGVuZ3Ro ICsgMSk7Ci0JfQotCi0JdmFyIGEgPSBDV0Quc3BsaXQoIlxcIik7Ci0JdmFyIGIgPSBwYXRoLnNw bGl0KCJcXCIpOwotCXZhciBpLCBqOwotCi0JZm9yIChpID0gMDsgaSA8IGIubGVuZ3RoOyBpKysp IHsKLQkJaWYgKGFbaV0udG9Mb3dlckNhc2UoKSA9PSBiW2ldLnRvTG93ZXJDYXNlKCkpCi0JCQlj b250aW51ZTsKLQkJaWYgKGkgPiAwKSB7Ci0JCQkvKiBmaXJzdCBkaWZmZXJlbmNlIGZvdW5kICov Ci0JCQlwYXRoID0gIiI7Ci0JCQlmb3IgKGogPSAwOyBqIDwgYS5sZW5ndGggLSBpOyBqKyspIHsK LQkJCQlwYXRoICs9ICIuLlxcIjsKLQkJCX0KLQkJCWZvciAoaiA9IGk7IGogPCBiLmxlbmd0aDsg aisrKSB7Ci0JCQkJcGF0aCArPSBiW2pdOwotCQkJCWlmIChqIDwgYi5sZW5ndGggLSAxKQotCQkJ CQlwYXRoICs9ICJcXCI7Ci0JCQl9Ci0JCQlyZXR1cm4gcGF0aDsKLQkJfQotCQkvKiBvbiBhIGRp ZmZlcmVudCBkcml2ZSAqLwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcGF0aDsKLX0KLQotZnVu Y3Rpb24gQ29uZmlndXJlQXJnKHR5cGUsIG9wdG5hbWUsIGhlbHB0ZXh0LCBkZWZ2YWwpIHsKLQot CXZhciBvcHB0eXBlID0gIiI7Ci0KLQlpZiAodHlwZSkgewotCi0JCW9wcHR5cGUgPSB0eXBlID09 ICJlbmFibGUiID8gImRpc2FibGUiIDogIndpdGhvdXQiOwotCi0JCWlmIChkZWZ2YWwgPT0gInll cyIgfHwgZGVmdmFsID09ICJ5ZXMsc2hhcmVkIikgewotCQkJdGhpcy5hcmcgPSAiLS0iICsgb3Bw dHlwZSArICItIiArIG9wdG5hbWU7Ci0JCQl0aGlzLmltcGFyZyA9ICItLSIgKyB0eXBlICsgIi0i ICsgb3B0bmFtZTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuYXJnID0gIi0tIiArIHR5cGUgKyAiLSIg KyBvcHRuYW1lOwotCQkJdGhpcy5pbXBhcmcgPSAiLS0iICsgb3BwdHlwZSArICItIiArIG9wdG5h bWU7Ci0JCX0KLQl9IGVsc2UgewotCQl0aGlzLmFyZyA9ICItLSIgKyBvcHRuYW1lOwotCX0KLQot CXRoaXMub3B0bmFtZSA9IG9wdG5hbWU7Ci0JdGhpcy5oZWxwdGV4dCA9IGhlbHB0ZXh0OwotCXRo aXMuZGVmdmFsID0gZGVmdmFsOwotCXRoaXMuc3ltdmFsID0gb3B0bmFtZS50b1VwcGVyQ2FzZSgp LnJlcGxhY2UobmV3IFJlZ0V4cCgiLSIsICJnIiksICJfIik7Ci0JdGhpcy5zZWVuID0gZmFsc2U7 Ci0JdGhpcy5hcmd2YWwgPSBkZWZ2YWw7Ci19Ci0KLWZ1bmN0aW9uIGFuYWx5emVfYXJnKGFyZ3Zh bCkgewotCi0JdmFyIHJldCA9IG5ldyBBcnJheSgpOwotCi0JaWYgKGFyZ3ZhbCA9PSAic2hhcmVk IikgewotCQlhcmd2YWwgPSAieWVzIjsKLQl9IGVsc2UgaWYgKGFyZ3ZhbCA9PSBudWxsKSB7Ci0J CS8qIG5vdGhpbmcgKi8KLQl9IGVsc2UgaWYgKGFyZ19tYXRjaCA9IGFyZ3ZhbC5tYXRjaChuZXcg UmVnRXhwKCJec2hhcmVkLCguKikiKSkpIHsKLQkJYXJndmFsID0gYXJnX21hdGNoWzFdOwotCX0g ZWxzZSBpZiAoYXJnX21hdGNoID0gYXJndmFsLm1hdGNoKG5ldyBSZWdFeHAoIl4oLiopLHNoYXJl ZCQiKSkpIHsKLQkJYXJndmFsID0gYXJnX21hdGNoWzFdOwotCX0KLQotCXJldFswXSA9IGFyZ3Zh bDsKLQlyZXR1cm4gcmV0OwotfQotCi1mdW5jdGlvbiBjb25mX3Byb2Nlc3NfYXJncygpIHsKLQot CXZhciBpLCBqOwotCXZhciBjb25maWd1cmVfaGVscF9tb2RlID0gZmFsc2U7Ci0JdmFyIGFuYWx5 emVkID0gZmFsc2U7Ci0JdmFyIG5pY2UgPSAiY3NjcmlwdCAvbm9sb2dvIGNvbmZpZ3VyZS5qcyAi OwotCi0JYXJncyA9IFdTY3JpcHQuQXJndW1lbnRzOwotCi0JZm9yIChpID0gMDsgaSA8IGFyZ3Mu bGVuZ3RoOyBpKyspIHsKLQkJYXJnID0gYXJncyhpKTsKLQkJbmljZSArPSAnICInICsgYXJnICsg JyInOwotCQlpZiAoYXJnID09ICItLWhlbHAiKSB7Ci0JCQljb25maWd1cmVfaGVscF9tb2RlID0g dHJ1ZTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gSWYgaXQgaXMgLS1mb289YmFyLCBzcGxpdCBv biB0aGUgZXF1YWxzIHNpZ24KLQkJYXJnID0gYXJnLnNwbGl0KCI9IiwgMik7Ci0JCWFyZ25hbWUg PSBhcmdbMF07Ci0JCWlmIChhcmcubGVuZ3RoID4gMSkgewotCQkJYXJndmFsID0gYXJnWzFdOwot CQl9IGVsc2UgewotCQkJYXJndmFsID0gbnVsbDsKLQkJfQotCi0JCS8vIEZpbmQgdGhlIGFyZwot CQlmb3VuZCA9IGZhbHNlOwotCQlmb3IgKGogPSAwOyBqIDwgY29uZmlndXJlX2FyZ3MubGVuZ3Ro OyBqKyspIHsKLQkJCWlmIChhcmduYW1lID09IGNvbmZpZ3VyZV9hcmdzW2pdLmltcGFyZyB8fCBh cmduYW1lID09IGNvbmZpZ3VyZV9hcmdzW2pdLmFyZykgewotCQkJCWZvdW5kID0gdHJ1ZTsKLQot CQkJCWFyZyA9IGNvbmZpZ3VyZV9hcmdzW2pdOwotCQkJCWFyZy5zZWVuID0gdHJ1ZTsKLQotCQkJ CWFuYWx5emVkID0gYW5hbHl6ZV9hcmcoYXJndmFsKTsKLQkJCQlhcmd2YWwgPSBhbmFseXplZFsw XTsKLQotCQkJCWlmIChhcmduYW1lID09IGFyZy5pbXBhcmcpIHsKLQkJCQkJLyogd2UgbWF0Y2hl ZCB0aGUgaW1wbGljaXQsIG9yIGRlZmF1bHQgYXJnICovCi0JCQkJCWlmIChhcmd2YWwgPT0gbnVs bCkgewotCQkJCQkJYXJndmFsID0gYXJnLmRlZnZhbDsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0J CQkJCS8qIHdlIG1hdGNoZWQgdGhlIG5vbi1kZWZhdWx0IGFyZyAqLwotCQkJCQlpZiAoYXJndmFs ID09IG51bGwpIHsKLQkJCQkJCWFyZ3ZhbCA9IGFyZy5kZWZ2YWwgPT0gIm5vIiA/ICJ5ZXMiIDog Im5vIjsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWFyZy5hcmd2YWwgPSBhcmd2YWw7Ci0JCQkJZXZh bCgiUEhQX0dUS18iICsgYXJnLnN5bXZhbCArICIgPSBhcmd2YWw7Iik7Ci0JCQkJYnJlYWs7Ci0J CQl9Ci0JCX0KLQkJaWYgKCFmb3VuZCkgewotCQkJU1RERVJSLldyaXRlTGluZSgiVW5rbm93biBv cHRpb24gIiArIGFyZ25hbWUpOwotCQkJU1RERVJSLldyaXRlTGluZSgiUGxlYXNlIHRyeSBjb25m aWd1cmUuanMgLS1oZWxwIGZvciBhIGxpc3Qgb2YgdmFsaWQgb3B0aW9ucyIpOwotCQkJV1Njcmlw dC5RdWl0KDIpOwotCQl9Ci0JfQotCi0JaWYgKGNvbmZpZ3VyZV9oZWxwX21vZGUpIHsKLQotCQlT VERPVVQuV3JpdGVCbGFua0xpbmVzKDEpOwotCi0JCS8vIE1lYXN1cmUgd2lkdGggdG8gcHJldHR5 LXByaW50IHRoZSBvdXRwdXQKLQkJbWF4X3dpZHRoID0gMDsKLQkJZm9yIChpID0gMDsgaSA8IGNv bmZpZ3VyZV9hcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhcmcgPSBjb25maWd1cmVfYXJnc1tpXTsK LQkJCWlmIChhcmcuYXJnLmxlbmd0aCA+IG1heF93aWR0aCkgewotCQkJCW1heF93aWR0aCA9IGFy Zy5hcmcubGVuZ3RoOwotCQkJfQotCQl9Ci0KLQkJZm9yIChpID0gMDsgaSA8IGNvbmZpZ3VyZV9h cmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhcmcgPSBjb25maWd1cmVfYXJnc1tpXTsKLQotCQkJbiA9 IG1heF93aWR0aCAtIGFyZy5hcmcubGVuZ3RoOwotCQkJcGFkID0gIiAgICI7Ci0JCQlmb3IgKGog PSAwOyBqIDwgbjsgaisrKSB7Ci0JCQkJcGFkICs9ICIgIjsKLQkJCX0KLQkJCVNURE9VVC5Xcml0 ZUxpbmUoIiAgIiArIGFyZy5hcmcgKyBwYWQgKyB3b3JkX3dyYXBfYW5kX2luZGVudChtYXhfd2lk dGggKyA1LCBhcmcuaGVscHRleHQpKTsKLQkJfQotCQlXU2NyaXB0LlF1aXQoMSk7Ci0JfQotCi0J Ly8gTm93IHNldCBhbnkgZGVmYXVsdHMgd2UgbWlnaHQgaGF2ZSBtaXNzZWQgb3V0IGVhcmxpZXIK LQlmb3IgKGkgPSAwOyBpIDwgY29uZmlndXJlX2FyZ3MubGVuZ3RoOyBpKyspIHsKLQkJYXJnID0g Y29uZmlndXJlX2FyZ3NbaV07Ci0JCWlmIChhcmcuc2VlbikKLQkJCWNvbnRpbnVlOwotCQlhbmFs eXplZCA9IGFuYWx5emVfYXJnKGFyZy5kZWZ2YWwpOwotCQlhcmd2YWwgPSBhbmFseXplZFswXTsK LQotCQlldmFsKCJQSFBfR1RLXyIgKyBhcmcuc3ltdmFsICsgIiA9IGFyZ3ZhbDsiKTsKLQl9Ci0K LQlNRk8gPSBGU08uQ3JlYXRlVGV4dEZpbGUoIk1ha2VmaWxlLm9iamVjdHMiLCB0cnVlKTsKLQlN RkUgPSBGU08uQ3JlYXRlVGV4dEZpbGUoIk1ha2VmaWxlLmV4dGVuc2lvbnMiLCB0cnVlKTsKLQot CVNURE9VVC5Xcml0ZUJsYW5rTGluZXMoMSk7Ci0JU1RET1VULldyaXRlTGluZSgiU2F2aW5nIGNv bmZpZ3VyZSBvcHRpb25zIHRvIGNvbmZpZ3VyZS5iYXQiKTsKLQl2YXIgbmljZWZpbGUgPSBGU08u Q3JlYXRlVGV4dEZpbGUoImNvbmZpZ3VyZS5iYXQiLCB0cnVlKTsKLQluaWNlZmlsZS5Xcml0ZUxp bmUobmljZSk7Ci0JbmljZWZpbGUuQ2xvc2UoKTsKLQotCUFDX0RFRklORSgnQ09ORklHVVJFX0NP TU1BTkQnLCBuaWNlKTsKLX0KLQotZnVuY3Rpb24gZmluZF9wYXR0ZXJuX2luX3BhdGgocGF0dGVy biwgcGF0aCkgewotCi0JaWYgKHBhdGggPT0gbnVsbCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQot Ci0JdmFyIGRpcnMgPSBwYXRoLnNwbGl0KCc7Jyk7Ci0JdmFyIGk7Ci0JdmFyIGl0ZW1zOwotCi0J Zm9yIChpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyBpKyspIHsKLQkJaXRlbXMgPSBnbG9iKGRpcnNb aV0gKyAiXFwiICsgcGF0dGVybik7Ci0JCWlmIChpdGVtcykgewotCQkJcmV0dXJuIGNvbmRlbnNl X3BhdGgoaXRlbXNbMF0pOwotCQl9Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotZnVuY3Rpb24g QVJHX0lTKG9wdG5hbWUsIGhlbHB0ZXh0LCBkZWZ2YWwpIHsKLQotCWNvbmZpZ3VyZV9hcmdzW2Nv bmZpZ3VyZV9hcmdzLmxlbmd0aF0gPSBuZXcgQ29uZmlndXJlQXJnKCIiLCBvcHRuYW1lLCBoZWxw dGV4dCwgZGVmdmFsKTsKLX0KLQotZnVuY3Rpb24gQVJHX1dJVEgob3B0bmFtZSwgaGVscHRleHQs IGRlZnZhbCkgewotCi0JY29uZmlndXJlX2FyZ3NbY29uZmlndXJlX2FyZ3MubGVuZ3RoXSA9IG5l dyBDb25maWd1cmVBcmcoIndpdGgiLCBvcHRuYW1lLCBoZWxwdGV4dCwgZGVmdmFsKTsKLX0KLQot ZnVuY3Rpb24gQVJHX0VOQUJMRShvcHRuYW1lLCBoZWxwdGV4dCwgZGVmdmFsKSB7Ci0KLQljb25m aWd1cmVfYXJnc1tjb25maWd1cmVfYXJncy5sZW5ndGhdID0gbmV3IENvbmZpZ3VyZUFyZygiZW5h YmxlIiwgb3B0bmFtZSwgaGVscHRleHQsIGRlZnZhbCk7Ci19Ci0KLWZ1bmN0aW9uIERFRklORShu YW1lLCB2YWx1ZSkgewotCi0JaWYgKGNvbmZpZ3VyZV9zdWJzdC5FeGlzdHMobmFtZSkpIHsKLQkJ Y29uZmlndXJlX3N1YnN0LlJlbW92ZShuYW1lKTsKLQl9Ci0JY29uZmlndXJlX3N1YnN0LkFkZChu YW1lLCB2YWx1ZSk7Ci19Ci0KLWZ1bmN0aW9uIEFDX0RFRklORShuYW1lLCB2YWx1ZSwgY29tbWVu dCwgcXVvdGUpIHsKLQotCWlmIChxdW90ZSA9PSBudWxsKSB7Ci0JCXF1b3RlID0gdHJ1ZTsKLQl9 Ci0JaWYgKHF1b3RlICYmIHR5cGVvZih2YWx1ZSkgPT0gInN0cmluZyIpIHsKLQkJdmFsdWUgPSAn IicgKyB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoJyhbIlxcXFxdKScsICJnIiksICdcXCQxJykg KyAnIic7Ci0JfSBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPT0gMCkgewotCQl2YWx1ZSA9ICciIic7 Ci0JfQotCXZhciBpdGVtID0gbmV3IEFycmF5KHZhbHVlLCBjb21tZW50KTsKLQlpZiAoY29uZmln dXJlX2hkci5FeGlzdHMobmFtZSkpIHsKLQkJdmFyIG9yaWdfaXRlbSA9IGNvbmZpZ3VyZV9oZHIu SXRlbShuYW1lKTsKLQkJU1RET1VULldyaXRlTGluZSgiQUNfREVGSU5FWyIgKyBuYW1lICsgIl09 IiArIHZhbHVlICsgIjogaXMgYWxyZWFkeSBkZWZpbmVkIHRvICIgKyBpdGVtWzBdKTsKLQl9IGVs c2UgewotCQljb25maWd1cmVfaGRyLkFkZChuYW1lLCBpdGVtKTsKLQl9Ci19Ci0KLWZ1bmN0aW9u IFBBVEhfUFJPRyhwcm9nbmFtZSwgYWRkaXRpb25hbF9wYXRocywgc3ltYm9sKSB7Ci0KLQl2YXIg ZXhlOwotCXZhciBwbGFjZTsKLQl2YXIgY3lnX3BhdGggPSBQSFBfR1RLX0NZR1dJTiArICJcXGJp bjsiICsgUEhQX0dUS19DWUdXSU4gKyAiXFx1c3JcXGxvY2FsXFxiaW4iOwotCi0JZXhlID0gcHJv Z25hbWUgKyAiLmV4ZSI7Ci0KLQlpZiAoYWRkaXRpb25hbF9wYXRocyA9PSBudWxsKSB7Ci0JCWFk ZGl0aW9uYWxfcGF0aHMgPSBjeWdfcGF0aDsKLQl9IGVsc2UgewotCQlhZGRpdGlvbmFsX3BhdGhz ICs9ICI7IiArIGN5Z19wYXRoOwotCX0KLQotCXBsYWNlID0gc2VhcmNoX3BhdGhzKGV4ZSwgYWRk aXRpb25hbF9wYXRocywgIlBBVEgiKTsKLQotCWlmIChwbGFjZSA9PSB0cnVlKSB7Ci0JCXBsYWNl ID0gZXhlOwotCX0gZWxzZSBpZiAocGxhY2UgIT0gZmFsc2UpIHsKLQotCQlpZiAocGxhY2UubGFz dEluZGV4T2YoIlxcIikgIT0gcGxhY2UubGVuZ3RoIC0gMSkgewotCQkJcGxhY2UgKz0gIlxcIjsK LQkJfQotCi0JCXBsYWNlID0gcGxhY2UgKyBleGU7Ci0KLQkJaWYgKHBsYWNlLmluZGV4T2YoIiAi KSkgewotCQkJcGxhY2UgPSAnIicgKyBwbGFjZSArICciJzsKLQkJfQotCX0KLQotCWlmIChwbGFj ZSkgewotCQlpZiAoc3ltYm9sID09IG51bGwpIHsKLQkJCXN5bWJvbCA9IHByb2duYW1lLnRvVXBw ZXJDYXNlKCk7Ci0JCX0KLQkJREVGSU5FKHN5bWJvbCwgcGxhY2UpOwotCX0KLQlyZXR1cm4gcGxh Y2U7Ci19Ci0KLWZ1bmN0aW9uIENIRUNLX0xJQihsaWJuYW1lcywgdGFyZ2V0LCBwYXRoX3RvX2No ZWNrLCBjb21tb25fbmFtZSkgewotCi0JU1RET1VULldyaXRlKCJDaGVja2luZyBmb3IgIiArIGxp Ym5hbWVzICsgIiAuLi4gIik7Ci0KLQlpZiAoY29tbW9uX25hbWUgPT0gbnVsbCAmJiB0YXJnZXQg IT0gbnVsbCkgewotCQljb21tb25fbmFtZSA9IHRhcmdldDsKLQl9Ci0KLQlpZiAocGF0aF90b19j aGVjayA9PSBudWxsKSB7Ci0JCXBhdGhfdG9fY2hlY2sgPSAiIjsKLQl9Ci0KLQkvLyBpZiB0aGV5 IHNwZWNpZmllZCBhIGNvbW1vbiBuYW1lIGZvciB0aGUgcGFja2FnZSB0aGF0IGNvbnRhaW5zCi0J Ly8gdGhlIGxpYnJhcnksIHRhZyBzb21lIHVzZWZ1bCBkZWZhdWx0cyBvbiB0byB0aGUgZW5kIG9m IHRoZQotCS8vIHBhdGggdG8gYmUgc2VhcmNoZWQKLQlpZiAoY29tbW9uX25hbWUgIT0gbnVsbCkg ewotCQlwYXRoX3RvX2NoZWNrICs9ICI7Li5cXCIgKyBjb21tb25fbmFtZSArICIqIjsKLQl9Ci0K LQkvLyBEZXRlcm1pbmUgdGFyZ2V0IGZvciBidWlsZCBmbGFncwotCWlmICh0YXJnZXQgPT0gbnVs bCkgewotCQl0YXJnZXQgPSAiIjsKLQl9IGVsc2UgewotCQl0YXJnZXQgPSAiXyIgKyB0YXJnZXQu dG9VcHBlckNhc2UoKS5yZXBsYWNlKG5ldyBSZWdFeHAoIi0iLCAiZyIpLCAiXyIpOwotCX0KLQot CS8vIEV4cGFuZCBwYXRoIHRvIGluY2x1ZGUgZ2VuZXJhbCBkaXJzCi0JcGF0aF90b19jaGVjayAr PSAiOyIgKyBwaHBfdXN1YWxfbGliX3N1c3BlY3RzOwotCi0JLy8gSXQgaXMgY29tbW9uIHByYWN0 aWNlIHRvIHB1dCBsaWJzIHVuZGVyIG9uZSBvZiB0aGVzZSBkaXIgbmFtZXMKLQl2YXIgc3ViZGly cyA9IG5ldyBBcnJheShQSFBfR1RLX0RFQlVHID09ICJ5ZXMiID8gIkRlYnVnIiA6ICJSZWxlYXNl IiwgImxpYiIsICJsaWJzIiwgImxpYmV4ZWMiKTsKLQotCS8vIGxpYm5hbWVzIGNhbiBiZSA7IHNl cGFyYXRlZCBsaXN0IG9mIGFjY2VwdGVkIGxpYnJhcnkgbmFtZXMKLQlsaWJuYW1lcyA9IGxpYm5h bWVzLnNwbGl0KCc7Jyk7Ci0KLQl2YXIgaSwgaiwgaywgbGlibmFtZTsKLQl2YXIgbG9jYXRpb24g PSBmYWxzZTsKLQl2YXIgcGF0aCA9IHBhdGhfdG9fY2hlY2suc3BsaXQoJzsnKTsKLQotCWZvciAo aSA9IDA7IGkgPCBsaWJuYW1lcy5sZW5ndGg7IGkrKykgewotCQlsaWJuYW1lID0gbGlibmFtZXNb aV07Ci0KLQkJZm9yIChrID0gMDsgayA8IHBhdGgubGVuZ3RoOyBrKyspIHsKLQkJCWxvY2F0aW9u ID0gZ2xvYihwYXRoW2tdICsgIlxcIiArIGxpYm5hbWUpOwotCQkJaWYgKGxvY2F0aW9uKSB7Ci0J CQkJbG9jYXRpb24gPSBsb2NhdGlvblswXTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWZvciAoaiA9 IDA7IGogPCBzdWJkaXJzLmxlbmd0aDsgaisrKSB7Ci0JCQkJbG9jYXRpb24gPSBnbG9iKHBhdGhb a10gKyAiXFwiICsgc3ViZGlyc1tqXSArICJcXCIgKyBsaWJuYW1lKTsKLQkJCQlpZiAobG9jYXRp b24pIHsKLQkJCQkJbG9jYXRpb24gPSBsb2NhdGlvblswXTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQot CQkJfQotCQkJaWYgKGxvY2F0aW9uKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGxvY2F0aW9u KSB7Ci0JCQlsb2NhdGlvbiA9IGNvbmRlbnNlX3BhdGgobG9jYXRpb24pOwotCQkJdmFyIGxpYmRp ciA9IEZTTy5HZXRQYXJlbnRGb2xkZXJOYW1lKGxvY2F0aW9uKTsKLQkJCWxpYm5hbWUgPSBGU08u R2V0RmlsZU5hbWUobG9jYXRpb24pOwotCQkJQUREX0ZMQUcoIkxERkxBR1MiICsgdGFyZ2V0LCAn L2xpYnBhdGg6IicgKyBsaWJkaXIgKyAnIiAnKTsKLQkJCUFERF9GTEFHKCJMSUJTIiArIHRhcmdl dCwgbGlibmFtZSk7Ci0KLQkJCVNURE9VVC5Xcml0ZUxpbmUoCWxvY2F0aW9uKTsKLQotCQkJcmV0 dXJuIGxvY2F0aW9uOwotCQl9Ci0KLQkJLy8gQ2hlY2sgaW4gdGhlaXIgc3RhbmRhcmQgbGliIHBh dGgKLQkJbG9jYXRpb24gPSBmaW5kX3BhdHRlcm5faW5fcGF0aChsaWJuYW1lLCBXc2hTaGVsbC5F bnZpcm9ubWVudCgiUHJvY2VzcyIpLkl0ZW0oIkxJQiIpKTsKLQotCQlpZiAobG9jYXRpb24pIHsK LQkJCWxvY2F0aW9uID0gY29uZGVuc2VfcGF0aChsb2NhdGlvbik7Ci0JCQlsaWJuYW1lID0gRlNP LkdldEZpbGVOYW1lKGxvY2F0aW9uKTsKLQkJCUFERF9GTEFHKCJMSUJTIiArIHRhcmdldCwgbGli bmFtZSk7Ci0KLQkJCVNURE9VVC5Xcml0ZUxpbmUoIgk8aW4gTElCIHBhdGg+ICIgKyBsaWJuYW1l KTsKLQkJCXJldHVybiBsb2NhdGlvbjsKLQkJfQotCX0KLQotCUVSUk9SKCIJIiArIGxpYm5hbWUg KyAiIG5vdCBmb3VuZCAtIGFib3J0aW5nIGNvbmZpZ3VyZSBwcm9jZXNzIik7Ci0KLQlyZXR1cm4g ZmFsc2U7Ci19Ci0KLWZ1bmN0aW9uIENIRUNLX0hFQURFUihoZWFkZXJfbmFtZSwgcGF0aF90b19j aGVjaykgewotCWlmICghcGF0aF90b19jaGVjaykgewotCQlwYXRoX3RvX2NoZWNrID0gcGhwX3Vz dWFsX2luY2x1ZGVfc3VzcGVjdHM7Ci0JfQotCi0JdmFyIHBhdGggPSBzZWFyY2hfcGF0aHMoaGVh ZGVyX25hbWUsIHBhdGhfdG9fY2hlY2ssICJJTkNMVURFIik7Ci0KLQlpZiAoIXBhdGgpIHsKLQkJ RVJST1IoIgkiICsgaGVhZGVyX25hbWUgKyAiIG5vdCBmb3VuZCAtIGFib3J0aW5nIGNvbmZpZ3Vy ZSBwcm9jZXNzIik7Ci0JfQotCi0JcmV0dXJuIHBhdGg7Ci19Ci0KLS8vIHVzZSB0aGlzIGZvciB2 ZXJzaW9uIGNoZWNraW5nCi1mdW5jdGlvbiBHUkVQX0hFQURFUihoZWFkZXJfbmFtZSwgcmVnZXgs IHBhdGhfdG9fY2hlY2spIHsKLQotCXZhciBjID0gZmFsc2U7Ci0KLQlpZiAoRlNPLkZpbGVFeGlz dHMocGF0aF90b19jaGVjayArICJcXCIgKyBoZWFkZXJfbmFtZSkpIHsKLQkJYyA9IGZpbGVfZ2V0 X2NvbnRlbnRzKHBhdGhfdG9fY2hlY2sgKyAiXFwiICsgaGVhZGVyX25hbWUpOwotCX0KLQotCWlm ICghYykgewotCQkvKiBsb29rIGluIHRoZSBpbmNsdWRlIHBhdGggKi8KLQotCQl2YXIgcCA9IHNl YXJjaF9wYXRocyhoZWFkZXJfbmFtZSwgcGF0aF90b19jaGVjaywgIklOQ0xVREUiKTsKLQotCQlp ZiAodHlwZW9mKHApID09ICJzdHJpbmciKSB7Ci0JCQljID0gZmlsZV9nZXRfY29udGVudHMocCk7 Ci0JCX0KLQotCQlpZiAoIWMpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCWlmICh0 eXBlb2YocmVnZXgpID09ICJzdHJpbmciKSB7Ci0JCXJlZ2V4ID0gbmV3IFJlZ0V4cChyZWdleCk7 Ci0JfQotCi0JaWYgKGMubWF0Y2gocmVnZXgpKSB7Ci0JCS8qIGNhbGxlciBjYW4gbm93IHVzZSBS ZWdFeHAuJDEgZXRjLiB0byBnZXQgYXQgcGF0dGVybnMgKi8KLQkJcmV0dXJuIHRydWU7Ci0JfQot CXJldHVybiBmYWxzZTsKLX0KLQotZnVuY3Rpb24gQ0hFQ0tfSEVBREVSX0FERF9JTkNMVURFKGhl YWRlcl9uYW1lLCBmbGFnX25hbWUsIHBhdGhfdG9fY2hlY2ssIHVzZV9lbnYsIGFkZF9kaXJfcGFy dCwgYWRkX3RvX2ZsYWdfb25seSkgewotCi0JdmFyIGRpcl9wYXJ0X3RvX2FkZCA9ICIiOwotCi0J aWYgKHVzZV9lbnYgPT0gbnVsbCkgewotCQl1c2VfZW52ID0gdHJ1ZTsKLQl9Ci0KLQkvLyBpZiB0 cnVlLCBhZGQgdGhlIGRpciBwYXJ0IG9mIHRoZSBoZWFkZXJfbmFtZSB0byB0aGUgaW5jbHVkZSBw YXRoCi0JaWYgKGFkZF9kaXJfcGFydCA9PSBudWxsKSB7Ci0JCWFkZF9kaXJfcGFydCA9IGZhbHNl OwotCX0gZWxzZSBpZiAoYWRkX2Rpcl9wYXJ0KSB7Ci0JCXZhciBiYXNlbmFtZSA9IEZTTy5HZXRG aWxlTmFtZShoZWFkZXJfbmFtZSk7Ci0JCWRpcl9wYXJ0X3RvX2FkZCA9ICJcXCIgKyBoZWFkZXJf bmFtZS5zdWJzdHIoMCwgaGVhZGVyX25hbWUubGVuZ3RoIC0gYmFzZW5hbWUubGVuZ3RoIC0gMSk7 Ci0JfQotCi0JaWYgKHBhdGhfdG9fY2hlY2sgPT0gbnVsbCkgewotCQlwYXRoX3RvX2NoZWNrID0g cGhwX3VzdWFsX2luY2x1ZGVfc3VzcGVjdHM7Ci0JfSBlbHNlIHsKLQkJcGF0aF90b19jaGVjayAr PSAiOyIgKyBwaHBfdXN1YWxfaW5jbHVkZV9zdXNwZWN0czsKLQl9Ci0KLQl2YXIgcCA9IHNlYXJj aF9wYXRocyhoZWFkZXJfbmFtZSwgcGF0aF90b19jaGVjaywgdXNlX2VudiA/ICJJTkNMVURFIiA6 IG51bGwpOwotCXZhciBoYXZlID0gMDsKLQl2YXIgc3ltOwotCi0JaWYgKHR5cGVvZihwKSA9PSAi c3RyaW5nIikgewotCQlBRERfRkxBRyhmbGFnX25hbWUsICcvSSAiJyArIHAgKyBkaXJfcGFydF90 b19hZGQgKyAnIiAnKTsKLQl9Ci0KLQloYXZlID0gcCA/IDEgOiAwCi0KLQlzeW0gPSBoZWFkZXJf bmFtZS50b1VwcGVyQ2FzZSgpOwotCXN5bSA9IHN5bS5yZXBsYWNlKG5ldyBSZWdFeHAoIltcXFxc L1wuLV0iLCAiZyIpLCAiXyIpOwotCi0JaWYgKHR5cGVvZihhZGRfdG9fZmxhZ19vbmx5KSA9PSB1 bmRlZmluZWQgJiYKLQkJCWZsYWdfbmFtZS5tYXRjaChuZXcgUmVnRXhwKCJeQ0ZMQUdTXyguKikk IikpKSB7Ci0JCWFkZF90b19mbGFnX29ubHkgPSB0cnVlOwotCX0KLQotCWlmICh0eXBlb2YoYWRk X3RvX2ZsYWdfb25seSkgIT0gInVuZGVmaW5lZCIpIHsKLQkJQUREX0ZMQUcoZmxhZ19uYW1lLCAi L0QgSEFWRV8iICsgc3ltICsgIj0iICsgaGF2ZSk7Ci0JfSBlbHNlIHsKLQkJQUNfREVGSU5FKCJI QVZFXyIgKyBzeW0sIGhhdmUsICJoYXZlIHRoZSAiICsgaGVhZGVyX25hbWUgKyAiIGhlYWRlciBm aWxlIik7Ci0JfQotCi0JcmV0dXJuIHA7Ci19Ci0KLWZ1bmN0aW9uIEVYVEVOU0lPTihleHRuYW1l LCBmaWxlX2xpc3QsIHNoYXJlZCwgY2ZsYWdzLCBkbGxuYW1lLCBvYmpfZGlyKSB7Ci0KLQl2YXIg ZGxsZmxhZ3MgPSAiIjsKLQl2YXIgZGVwX2xpYnMgPSAiIjsKLQl2YXIgRVhUID0gZXh0bmFtZS50 b1VwcGVyQ2FzZSgpLnJlcGxhY2UobmV3IFJlZ0V4cCgiLSIsICJnIiksICJfIik7Ci0JdmFyIGV4 dG5hbWVfZm9yX3ByaW50aW5nOwotCXZhciByZXNfdmFyID0gIiI7Ci0JdmFyIGZpbGU7Ci0KLQlp ZiAoY2ZsYWdzID09IG51bGwpIHsKLQkJY2ZsYWdzID0gIiI7Ci0JfQotCi0JaWYgKHR5cGVvZihv YmpfZGlyKSA9PSAidW5kZWZpbmVkIikgewotCi0JCWV4dG5hbWVfZm9yX3ByaW50aW5nID0gY29u ZmlndXJlX21vZHVsZV9kaXJuYW1lOwotCi0JfSBlbHNlIHsKLQotCQlleHRuYW1lX2Zvcl9wcmlu dGluZyA9IGNvbmZpZ3VyZV9tb2R1bGVfZGlybmFtZSArICIgKHZpYSAiICsgb2JqX2RpciArICIp IjsKLQl9Ci0KLQlTVERPVVQuV3JpdGVMaW5lKCJFbmFibGluZyBleHRlbnNpb24gIiArIGV4dG5h bWVfZm9yX3ByaW50aW5nKTsKLQotCWlmIChleHRuYW1lID09ICdwaHAtZ3RrJykgewotCQljZmxh Z3MgPSAiL0QgQ09NUElMRV9ETF8iICsgRVhUICsgIjIgL0QgIiArIEVYVCArICJfRVhQT1JUUz0x IiArIGNmbGFnczsKLQkJZmlsZSA9IE1GTzsKLQl9IGVsc2UgewotCQljZmxhZ3MgPSAiL0QgUEhQ X0dUS19DT01QSUxFX0RMXyIgKyBFWFQgKyAiIC9EICIgKyBFWFQgKyAiX0VYUE9SVFM9MSIgKyBj ZmxhZ3M7Ci0JCWZpbGUgPSBNRkU7Ci0JfQotCi0JZmlsZS5Xcml0ZUJsYW5rTGluZXMoMSk7Ci0J ZmlsZS5Xcml0ZUxpbmUoIiMgb2JqZWN0cyBmb3IgRVhUICIgKyBleHRuYW1lKTsKLQlmaWxlLldy aXRlQmxhbmtMaW5lcygxKTsKLQotCUFERF9TT1VSQ0VTKGNvbmZpZ3VyZV9tb2R1bGVfZGlybmFt ZSwgZmlsZV9saXN0LCBleHRuYW1lLCBvYmpfZGlyKTsKLQotCWZpbGUuV3JpdGVCbGFua0xpbmVz KDEpOwotCi0JLy8gUEhQLUdUSyBhbmQgaXRzIGV4dGVuc2lvbnMgYXJlIGFsd2F5cyBidWlsdCBh cyBzaGFyZWQgZm9yIG5vdwotCi0JaWYgKGRsbG5hbWUgPT0gbnVsbCkgewotCQlpZiAoZXh0bmFt ZSA9PSAncGhwLWd0aycpIHsKLQkJCWRsbG5hbWUgPSAicGhwX2d0azIuZGxsIjsKLQkJCXJlc25h bWUgPSBnZW5lcmF0ZV92ZXJzaW9uX2luZm9fcmVzb3VyY2UoZGxsbmFtZSwgY29uZmlndXJlX21v ZHVsZV9kaXJuYW1lKTsKLQkJCXJlc192YXIgPSAiICQoUEhQR1RLRExMX1JFUykiOwotCQl9IGVs c2UgewotCQkJY2ZsYWdzID0gIi9EIEdUS19TSEFSRUQ9MSAiICsgY2ZsYWdzOwotCQkJZGxsbmFt ZSA9ICJwaHBfZ3RrXyIgKyBleHRuYW1lICsgIjIuZGxsIjsKLQkJCWRsbGZsYWdzID0gIiAkKERM TF9MREZMQUdTKSI7Ci0JCQlkZXBfbGlicyA9ICIgJChCVUlMRF9ESVIpXFwkKFBIUEdUS0xJQikg JChMSUJTX1BIUF9HVEspIjsKLQkJfQotCX0KLQl2YXIgbGlibmFtZSA9IGRsbG5hbWUuc3Vic3Ry aW5nKDAsIGRsbG5hbWUubGVuZ3RoIC0gNCkgKyAiLmxpYiI7Ci0JdmFyIGxkID0gIkAkKExEKSI7 Ci0KLQlBRERfRkxBRygiRVhUX1RBUkdFVFMiLCAiJChCVUlMRF9ESVIpXFwiICsgZGxsbmFtZSk7 Ci0JbWFrZV9idWlsZHNbbWFrZV9idWlsZHMubGVuZ3RoXSA9IGV4dG5hbWUgKyAiOiAkKEJVSUxE X0RJUilcXCIgKyBkbGxuYW1lOwotCi0JZmlsZS5Xcml0ZUxpbmUoIiQoQlVJTERfRElSKVxcIiAr IGRsbG5hbWUgKyAiOiAkKCIgKyBFWFQgKyAiX0dMT0JBTF9PQkpTKSIgKyByZXNfdmFyKTsKLQlm aWxlLldyaXRlTGluZSgiXHQiICsgbGQgKyAiIC9vdXQ6JChCVUlMRF9ESVIpXFwiICsgZGxsbmFt ZSArICIgJChMREZMQUdTXyIgKyBFWFQgKyAiKSIgKyBkbGxmbGFncyArICIgJChMREZMQUdTKSAk KCIgKyBFWFQgKyAiX0dMT0JBTF9PQkpTKSAkKExJQlNfIiArIEVYVCArICIpIiArIGRlcF9saWJz ICsgIiAkKExJQlMpIiArIHJlc192YXIpOwotCi0JZmlsZS5Xcml0ZUJsYW5rTGluZXMoMSk7Ci0J ZmlsZS5Xcml0ZUxpbmUoZGxsbmFtZSArICI6ICQoQlVJTERfRElSKVxcIiArIGRsbG5hbWUpOwot CWZpbGUuV3JpdGVMaW5lKCJcdEBlY2hvIEVYVCAiICsgZXh0bmFtZSArICIgYnVpbGQgY29tcGxl dGUiKTsKLQlmaWxlLldyaXRlQmxhbmtMaW5lcygxKTsKLQotCUFERF9GTEFHKCJDRkxBR1NfIiAr IEVYVCwgY2ZsYWdzKTsKLX0KLQotZnVuY3Rpb24gQUREX1NPVVJDRVMoZGlyLCBmaWxlX2xpc3Qs IHRhcmdldCwgb2JqX2RpcikgewotCi0JdmFyIGk7Ci0JdmFyIHR2OwotCXZhciBzcmMsIG9iaiwg c3ltLCBmbGFnczsKLQl2YXIgY29yZV9jZmxhZ3MgPSAiIjsKLQl2YXIgZmlsZTsKLQotCXN5bSA9 IHRhcmdldC50b1VwcGVyQ2FzZSgpLnJlcGxhY2UobmV3IFJlZ0V4cCgiLSIsICJnIiksICJfIikg KyAiX0dMT0JBTF9PQkpTIjsKLQlmbGFncyA9ICJDRkxBR1NfIiArIHRhcmdldC50b1VwcGVyQ2Fz ZSgpLnJlcGxhY2UobmV3IFJlZ0V4cCgiLSIsICJnIiksICJfIik7Ci0KLQlpZiAoY29uZmlndXJl X3N1YnN0LkV4aXN0cyhzeW0pKSB7Ci0JCXR2ID0gY29uZmlndXJlX3N1YnN0Lkl0ZW0oc3ltKTsK LQl9IGVsc2UgewotCQl0diA9ICIiOwotCX0KLQotCWlmICh0YXJnZXQgIT0gInBocC1ndGsiKSB7 Ci0JCWZpbGUgPSBNRkU7Ci0JCWNvcmVfY2ZsYWdzID0gIiQoQ0ZMQUdTX1BIUF9HVEspICI7Ci0J fSBlbHNlIHsKLQkJZmlsZSA9IE1GTzsKLQl9Ci0KLQlmaWxlX2xpc3QgPSBmaWxlX2xpc3Quc3Bs aXQobmV3IFJlZ0V4cCgiXFxzKyIpKTsKLQlmaWxlX2xpc3Quc29ydCgpOwotCi0JdmFyIHJlID0g bmV3IFJlZ0V4cCgiXC5bYS16MC05QS1aXC1dKyQiKTsKLQotCWRpciA9IGRpci5yZXBsYWNlKG5l dyBSZWdFeHAoIi8iLCAiZyIpLCAiXFwiKTsKLQl2YXIgb2Jqc19saW5lID0gIiI7Ci0JdmFyIHNy Y3NfbGluZSA9ICIiOwotCi0JdmFyIHN1Yl9idWlsZCA9ICIkKEJVSUxEX0RJUilcXCI7Ci0KLQkv KiBpZiBtb2R1bGUgZGlyIGlzIG5vdCBhIGNoaWxkIG9mIHRoZSBtYWluIHNvdXJjZSBkaXIsCi0J ICogd2UgbmVlZCB0byB0d2VhayBpdDsgd2Ugc2hvdWxkIGhhdmUgZGV0ZWN0ZWQgc3VjaCBhCi0J ICogY2FzZSBpbiBjb25kZW5zZV9wYXRoIGFuZCByZXdyaXR0ZW4gdGhlIHBhdGggdG8KLQkgKiBi ZSByZWxhdGl2ZS4KLQkgKiBUaGlzIHByb2JhYmx5IGJyZWFrcyBmb3Igbm9uLXNpYmxpbmcgZGly cyAqLwotCWlmIChvYmpfZGlyID09IG51bGwpIHsKLQkJdmFyIGJ1aWxkX2RpciA9IGRpci5yZXBs YWNlKG5ldyBSZWdFeHAoIl4uLlxcXFwiKSwgIiIpOwotCX0gZWxzZSB7Ci0JCXZhciBidWlsZF9k aXIgPSBvYmpfZGlyLnJlcGxhY2UobmV3IFJlZ0V4cCgiXi4uXFxcXCIpLCAiIik7Ci0JfQotCi0J dmFyIG1hbmdsZV9kaXIgPSBidWlsZF9kaXIucmVwbGFjZShuZXcgUmVnRXhwKCJbXFxcXC8uKy1d IiwgImciKSwgIl8iKTsKLQotCS8qIGtpbGwgdHJhaWxpbmcgdW5kZXJzY29yZXMgKi8KLQlpZiAo bWFuZ2xlX2Rpci5zdWJzdHJpbmcobWFuZ2xlX2Rpci5sZW5ndGggLSAxKSA9PSAiXyIpIHsKLQkJ bWFuZ2xlX2RpciA9IG1hbmdsZV9kaXIuc3Vic3RyaW5nKDAsIG1hbmdsZV9kaXIubGVuZ3RoIC0g MSk7Ci0JfQotCi0JdmFyIGJkX2ZsYWdzX25hbWUgPSAiQ0ZMQUdTX0JEXyIgKyBtYW5nbGVfZGly LnRvVXBwZXJDYXNlKCk7Ci0KLQl2YXIgZGlycyA9IGJ1aWxkX2Rpci5zcGxpdCgiXFwiKTsKLQl2 YXIgaSwgZCA9ICIiOwotCWZvciAoaSA9IDA7IGkgPCBkaXJzLmxlbmd0aDsgaSsrKSB7Ci0JCWQg Kz0gZGlyc1tpXTsKLQkJYnVpbGRfZGlyc1tidWlsZF9kaXJzLmxlbmd0aF0gPSBkOwotCQlkICs9 ICJcXCI7Ci0JfQotCXN1Yl9idWlsZCArPSBkOwotCi0JREVGSU5FKGJkX2ZsYWdzX25hbWUsICIg L0ZkIiArIHN1Yl9idWlsZCArICIgL0ZwIiArIHN1Yl9idWlsZCArICIgL0ZSIiArIHN1Yl9idWls ZCk7Ci0KLQlmb3IgKGkgaW4gZmlsZV9saXN0KSB7Ci0JCXNyYyA9IGZpbGVfbGlzdFtpXTsKLQkJ b2JqID0gc3JjLnJlcGxhY2UocmUsICIub2JqIik7Ci0JCXR2ICs9ICIgIiArIHN1Yl9idWlsZCAr IG9iajsKLQotCQlmaWxlLldyaXRlTGluZShzdWJfYnVpbGQgKyBvYmogKyAiOiAiICsgZGlyICsg IlxcIiArIHNyYyk7Ci0JCWZpbGUuV3JpdGVMaW5lKCJcdEAkKENDKSAkKCIgKyBmbGFncyArICIp ICIgKyBjb3JlX2NmbGFncyArICIkKENGTEFHUykgJCgiICsgYmRfZmxhZ3NfbmFtZSArICIpIC9j ICIgKyBkaXIgKyAiXFwiICsgc3JjICsgIiAvRm8iICsgc3ViX2J1aWxkICsgb2JqKTsKLQl9Ci0K LQlERUZJTkUoc3ltLCB0dik7Ci19Ci0KLWZ1bmN0aW9uIEFERF9GTEFHKG5hbWUsIGZsYWdzLCB0 YXJnZXQpIHsKLQotCWlmICh0YXJnZXQgIT0gbnVsbCkgewotCQluYW1lID0gdGFyZ2V0LnRvVXBw ZXJDYXNlKCkgKyAiXyIgKyBuYW1lOwotCX0KLQlpZiAoY29uZmlndXJlX3N1YnN0LkV4aXN0cyhu YW1lKSkgewotCQl2YXIgY3Vycl9mbGFncyA9IGNvbmZpZ3VyZV9zdWJzdC5JdGVtKG5hbWUpOwot Ci0JCWlmIChjdXJyX2ZsYWdzLmluZGV4T2YoZmxhZ3MpID49IDApIHsKLQkJCXJldHVybjsKLQkJ fQotCi0JCWZsYWdzID0gZmxhZ3MgKyAiICIgKyBjdXJyX2ZsYWdzOwotCQljb25maWd1cmVfc3Vi c3QuUmVtb3ZlKG5hbWUpOwotCX0KLQljb25maWd1cmVfc3Vic3QuQWRkKG5hbWUsIGZsYWdzKTsK LX0KLQotZnVuY3Rpb24gZ2V0X2RlZmluZShuYW1lKSB7Ci0KLQlyZXR1cm4gY29uZmlndXJlX3N1 YnN0Lkl0ZW0obmFtZSk7Ci19Ci0KLWZ1bmN0aW9uIEVSUk9SKG1zZykgewotCi0gICAgU1RERVJS LldyaXRlQmxhbmtMaW5lcygyKTsKLQlTVERFUlIuV3JpdGVMaW5lKCJFUlJPUjogIiArIG1zZyk7 Ci0JV1NjcmlwdC5RdWl0KDMpOwotfQotCi1mdW5jdGlvbiBXQVJOSU5HKG1zZykgewotCi0JU1RE RVJSLldyaXRlTGluZSgiV0FSTklORzogIiArIG1zZyk7Ci0JU1RERVJSLldyaXRlQmxhbmtMaW5l cygxKTsKLX0KLQotLyogU2VhcmNoZXMgYSBzZXQgb2YgcGF0aHMgZm9yIGEgZmlsZTsgcmV0dXJu cyB0aGUgZGlyIGluIHdoaWNoIHRoZSBmaWxlIHdhcyBmb3VuZCwgdHJ1ZSBpZiBpdAotd2FzIGZv dW5kIGluIHRoZSBkZWZhdWx0IGVudiBwYXRoLCBvciBmYWxzZSBpZiBpdCB3YXMgbm90IGZvdW5k IGF0IGFsbC4gZW52X25hbWUgaXMgdGhlIG9wdGlvbmFsCi1uYW1lIG9mIGFuIGVudiB2YXIgc3Bl Y2lmeWluZyB0aGUgZGVmYXVsdCBwYXRoIHRvIHNlYXJjaCAqLwotZnVuY3Rpb24gc2VhcmNoX3Bh dGhzKHRoaW5nX3RvX2ZpbmQsIGV4cGxpY2l0X3BhdGgsIGVudl9uYW1lKSB7Ci0KLQl2YXIgaSwg Zm91bmQgPSBmYWxzZSwgcGxhY2UgPSBmYWxzZSwgZmlsZSwgZW52OwotCi0JU1RET1VULldyaXRl KCJDaGVja2luZyBmb3IgIiArIHRoaW5nX3RvX2ZpbmQgKyAiIC4uLiAiKTsKLQotCWlmICh0aGlu Z190b19maW5kLmxlbmd0aCA8IDYpIHsKLQkJU1RET1VULldyaXRlKCIJIik7Ci0JfQotCi0JdGhp bmdfdG9fZmluZCA9IHRoaW5nX3RvX2ZpbmQucmVwbGFjZShuZXcgUmVnRXhwKCIvIiwgImciKSwg IlxcIik7Ci0KLQlpZiAoZXhwbGljaXRfcGF0aCAhPSBudWxsKSB7Ci0JCWlmICh0eXBlb2YoZXhw bGljaXRfcGF0aCkgPT0gInN0cmluZyIpIHsKLQkJCWV4cGxpY2l0X3BhdGggPSBleHBsaWNpdF9w YXRoLnNwbGl0KCI7Iik7Ci0JCX0KLQotCQlmb3IgKGkgPSAwOyBpIDwgZXhwbGljaXRfcGF0aC5s ZW5ndGg7IGkrKykgewotCQkJZmlsZSA9IGdsb2IoZXhwbGljaXRfcGF0aFtpXSArICJcXCIgKyB0 aGluZ190b19maW5kKTsKLQkJCWlmIChmaWxlKSB7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJCXBs YWNlID0gZmlsZVswXTsKLQkJCQlwbGFjZSA9IHBsYWNlLnN1YnN0cigwLCBwbGFjZS5sZW5ndGgg LSB0aGluZ190b19maW5kLmxlbmd0aCAtIDEpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQot Ci0JaWYgKCFmb3VuZCAmJiBlbnZfbmFtZSAhPSBudWxsKSB7Ci0JCWVudiA9IFdzaFNoZWxsLkVu dmlyb25tZW50KCJQcm9jZXNzIikuSXRlbShlbnZfbmFtZSk7Ci0JCWVudiA9IGVudi5zcGxpdCgi OyIpOwotCQlmb3IgKGkgPSAwOyBpIDwgZW52Lmxlbmd0aDsgaSsrKSB7Ci0JCQlmaWxlID0gZ2xv YihlbnZbaV0gKyAiXFwiICsgdGhpbmdfdG9fZmluZCk7Ci0JCQlpZiAoZmlsZSkgewotCQkJCWZv dW5kID0gdHJ1ZTsKLQkJCQlwbGFjZSA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9 Ci0KLQlpZiAoZm91bmQgJiYgcGxhY2UgPT0gdHJ1ZSkgewotCQlTVERPVVQuV3JpdGVMaW5lKCIJ PGluIGRlZmF1bHQgcGF0aD4iKTsKLQkJcGxhY2UgPSBmaWxlWzBdOwotCQlwbGFjZSA9IHBsYWNl LnN1YnN0cigwLCBwbGFjZS5sZW5ndGggLSB0aGluZ190b19maW5kLmxlbmd0aCAtIDEpOwotCX0g ZWxzZSBpZiAoZm91bmQpIHsKLQkJU1RET1VULldyaXRlTGluZSgiCSIgKyBwbGFjZSk7Ci0JfSBl bHNlIHsKLQkJU1RET1VULldyaXRlTGluZSgiCTxub3QgZm91bmQ+Iik7Ci0JfQotCXJldHVybiBw bGFjZTsKLX0KLQotZnVuY3Rpb24gd29yZF93cmFwX2FuZF9pbmRlbnQoaW5kZW50LCB0ZXh0LCBs aW5lX3N1ZmZpeCwgaW5kZW50X2NoYXIpIHsKLQotCWlmICh0ZXh0ID09IG51bGwpIHsKLQkJcmV0 dXJuICIiOwotCX0KLQotCXZhciB3b3JkcyA9IHRleHQuc3BsaXQobmV3IFJlZ0V4cCgiXFxzKyIs ICJnIikpOwotCXZhciBpID0gMDsKLQl2YXIgcmV0X3RleHQgPSAiIjsKLQl2YXIgdGhpc19saW5l ID0gIiI7Ci0JdmFyIHQ7Ci0JdmFyIHNwYWNlID0gIiI7Ci0JdmFyIGxpbmVzID0gMDsKLQotCWlm IChsaW5lX3N1ZmZpeCA9PSBudWxsKSB7Ci0JCWxpbmVfc3VmZml4ID0gIiI7Ci0JfQotCi0JaWYg KGluZGVudF9jaGFyID09IG51bGwpIHsKLQkJaW5kZW50X2NoYXIgPSAiICI7Ci0JfQotCi0JZm9y IChpID0gMDsgaSA8IGluZGVudDsgaSsrKSB7Ci0JCXNwYWNlICs9IGluZGVudF9jaGFyOwotCX0K LQotCWZvciAoaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7IGkrKykgewotCQlpZiAodGhpc19saW5l Lmxlbmd0aCkgewotCQkJdCA9IHRoaXNfbGluZSArICIgIiArIHdvcmRzW2ldOwotCQl9IGVsc2Ug ewotCQkJdCA9IHdvcmRzW2ldOwotCQl9Ci0KLQkJaWYgKHQubGVuZ3RoICsgaW5kZW50ID4gNzgp IHsKLQkJCWlmIChsaW5lcysrKSB7Ci0JCQkJcmV0X3RleHQgKz0gc3BhY2U7Ci0JCQl9Ci0JCQly ZXRfdGV4dCArPSB0aGlzX2xpbmUgKyBsaW5lX3N1ZmZpeCArICJcclxuIjsKLQkJCXRoaXNfbGlu ZSA9ICIiOwotCQl9Ci0KLQkJaWYgKHRoaXNfbGluZS5sZW5ndGgpIHsKLQkJCXRoaXNfbGluZSAr PSAiICIgKyB3b3Jkc1tpXTsKLQkJfSBlbHNlIHsKLQkJCXRoaXNfbGluZSA9IHdvcmRzW2ldOwot CQl9Ci0JfQotCi0JaWYgKHRoaXNfbGluZS5sZW5ndGgpIHsKLQkJaWYgKGxpbmVzKQotCQkJcmV0 X3RleHQgKz0gc3BhY2U7Ci0JCXJldF90ZXh0ICs9IHRoaXNfbGluZTsKLQl9Ci0KLQlyZXR1cm4g cmV0X3RleHQ7Ci19Ci0KLWZ1bmN0aW9uIGZpbGVfZ2V0X2NvbnRlbnRzKGZpbGVuYW1lKSB7Ci0K LQl2YXIgZiwgYzsKLQotCXRyeSB7Ci0JCWYgPSBGU08uT3BlblRleHRGaWxlKGZpbGVuYW1lLCAx KTsKLQkJYyA9IGYuUmVhZEFsbCgpOwotCQlmLkNsb3NlKCk7Ci0JCXJldHVybiBjOwotCX0gY2F0 Y2ggKGUpIHsKLQkJU1RET1VULldyaXRlTGluZSgiUHJvYmxlbSByZWFkaW5nICIgKyBmaWxlbmFt ZSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19Ci0KLWZ1bmN0aW9uIGdlbmVyYXRlX2ZpbGVzKCkg ewotCi0JdmFyIGksIGRpciwgYmQsIGxhc3Q7Ci0KLQlnZW5lcmF0ZV9zb3VyY2UoKTsKLQotCVNU RE9VVC5Xcml0ZUxpbmUoIkdlbmVyYXRpbmcgc291cmNlIGZpbGVzIC0gdGhpcyBtYXkgdGFrZSBh IGZldyBzZWNvbmRzIik7Ci0JV1NjcmlwdC5TbGVlcCgzNTAwKTsKLQljaGVja19nZW5lcmF0aW9u KCk7Ci0KLQkvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhZGRpdGlvbmFsIG9iamVjdHMgdG8g YWRkCi0JdmFyIHNvdXJjZXMgPSBmaWxlX2dldF9jb250ZW50cygic291cmNlcy50ZW1wIik7Ci0J Y29uZmlndXJlX21vZHVsZV9kaXJuYW1lID0gY29uZGVuc2VfcGF0aCgiZXh0XFxndGsrXFwiKTsK LQlFWFRFTlNJT04oInBocC1ndGsiLCBwaHBfZ3RrX2ZpbGVzICsgc291cmNlcywgdHJ1ZSk7Ci0K LQlTVERPVVQuV3JpdGVCbGFua0xpbmVzKDEpOwotCVNURE9VVC5Xcml0ZUxpbmUoIkNyZWF0aW5n IGJ1aWxkIGRpcnMuLi4iKTsKLQlkaXIgPSBnZXRfZGVmaW5lKCJCVUlMRF9ESVIiKTsKLQlidWls ZF9kaXJzLnNvcnQoKTsKLQlsYXN0ID0gbnVsbDsKLQotCWlmICghRlNPLkZvbGRlckV4aXN0cyhk aXIpKSB7Ci0JCUZTTy5DcmVhdGVGb2xkZXIoZGlyKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwg YnVpbGRfZGlycy5sZW5ndGg7IGkrKykgewotCQliZCA9IEZTTy5CdWlsZFBhdGgoZGlyLCBidWls ZF9kaXJzW2ldKTsKLQkJaWYgKGJkID09IGxhc3QpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWxh c3QgPSBiZDsKLQkJQUREX0ZMQUcoIkJVSUxEX0RJUlNfU1VCIiwgYmQpOwotCQlpZiAoIUZTTy5G b2xkZXJFeGlzdHMoYmQpKSB7Ci0JCQlGU08uQ3JlYXRlRm9sZGVyKGJkKTsKLQkJfQotCX0KLQot CWdlbmVyYXRlX21ha2VmaWxlKCk7Ci0KLQlTVERPVVQuV3JpdGVMaW5lKCJEb25lLiIpOwotCVNU RE9VVC5Xcml0ZUJsYW5rTGluZXMoMSk7Ci0JU1RET1VULldyaXRlTGluZSgiVHlwZSAnbm1ha2Un IHRvIGJ1aWxkIGFsbCB0YXJnZXRzLCBvciAnbm1ha2UgcGhwLWd0aycgdG8gYnVpbGQgUEhQLUdU SyBhbG9uZSIpOwotCVNURE9VVC5Xcml0ZUxpbmUoIiogQ29uZmlndXJlZCBQSFAtR1RLIGV4dGVu c2lvbnMgY2FuIGJlIGJ1aWx0IGluZGl2aWR1YWxseSBhdCBhIGxhdGVyIHN0YWdlICoiKTsKLX0K LQotZnVuY3Rpb24gZ2VuZXJhdGVfbWFrZWZpbGUoKSB7Ci0KLSAgICBNRkUuV3JpdGVMaW5lKCIi KTsgLy8gVG8gYXZvaWQgZXJyb3IgaWYgTUZFIHdpbGwgYmUgY29tcGxldGUKLQlNRkUuQ2xvc2Uo KTsgLy8gTWFrZWZpbGUuZXh0ZW5zaW9ucyBpcyBub3cgY29tcGxldGUKLQlNRk8uQ2xvc2UoKTsg Ly8gTWFrZWZpbGUub2JqZWN0cyBpcyBub3cgY29tcGxldGUKLQl2YXIgTUYgPSBGU08uQ3JlYXRl VGV4dEZpbGUoIk1ha2VmaWxlIiwgdHJ1ZSk7Ci0JU1RET1VULldyaXRlTGluZSgiR2VuZXJhdGlu ZyBNYWtlZmlsZSIpOwotCi0JTUYuV3JpdGVMaW5lKCIjIEdlbmVyYXRlZCBieSBjb25maWd1cmUu anMiKTsKLQlNRi5Xcml0ZUJsYW5rTGluZXMoMSk7Ci0KLQkvKiBzcGl0IG91dCB2YXJpYWJsZSBk ZWZpbml0aW9ucyAqLwotCXZhciBrZXlzID0gKG5ldyBWQkFycmF5KGNvbmZpZ3VyZV9zdWJzdC5L ZXlzKCkpKS50b0FycmF5KCk7Ci0JdmFyIGk7Ci0KLQlmb3IgKGkgaW4ga2V5cykgewotCQkvKiBU aGUgdHJhaWxpbmcgc3BhY2UgaXMgbmVlZGVkIHRvIHByZXZlbnQgdGhlIHRyYWlsaW5nIGJhY2tz bGFzaCB0aGF0IGlzIHBhcnQgb2YKLQkJdGhlIGJ1aWxkIGRpciBmbGFncyAoQ0ZMQUdTX0JEX1hY WCkgZnJvbSBiZWluZyBzZWVuIGFzIGEgbGluZSBjb250aW51YXRpb24gY2hhcmFjdGVyICovCi0J CU1GLldyaXRlTGluZShrZXlzW2ldICsgIj0iICsgY29uZmlndXJlX3N1YnN0Lkl0ZW0oa2V5c1tp XSkgKyAiICIpOwotCX0KLQotCU1GLldyaXRlQmxhbmtMaW5lcygxKTsKLQlNRi5Xcml0ZUxpbmUo ImFsbDogJChFWFRfVEFSR0VUUykiKTsKLQotCWZvciAoaSA9IG1ha2VfYnVpbGRzLmxlbmd0aDsg aSA+PSAwOyBpLS0pIHsKLQkJaWYgKGkgPT0gbWFrZV9idWlsZHMubGVuZ3RoKSB7Ci0JCQlNRi5X cml0ZUxpbmUoIiFJRiBFWElTVCgkKEJVSUxEX0RJUilcXCQoUEhQR1RLTElCKSkiKTsKLQkJfQot CQlNRi5Xcml0ZUxpbmUobWFrZV9idWlsZHNbaV0pOwotCX0KLQotCWlmIChtYWtlX2J1aWxkcy5s ZW5ndGggPiAxKSB7Ci0JCU1GLldyaXRlTGluZSgiIUVMU0UiKTsKLQkJTUYuV3JpdGVMaW5lKCIh TUVTU0FHRSBOb3RlOiAkKFBIUEdUS0xJQikgbXVzdCBiZSBjcmVhdGVkIGJlZm9yZSBQSFAtR1RL IGV4dGVuc2lvbnMgY2FuIGJlIGJ1aWx0Iik7Ci0JfQotCQotCU1GLldyaXRlTGluZSgiIUVORElG Iik7Ci0JTUYuV3JpdGVMaW5lKCJidWlsZF9kaXJzOiAkKEJVSUxEX0RJUikgJChCVUlMRF9ESVJT X1NVQikiKTsKLQlNRi5Xcml0ZUJsYW5rTGluZXMoMSk7Ci0KLQlURiA9IEZTTy5PcGVuVGV4dEZp bGUoIk1ha2VmaWxlLm9iamVjdHMiLCAxKTsKLQlNRi5Xcml0ZShURi5SZWFkQWxsKCkpOwotCVRG LkNsb3NlKCk7Ci0KLQlURiA9IEZTTy5PcGVuVGV4dEZpbGUoIk1ha2VmaWxlLmV4dGVuc2lvbnMi LCAxKTsKLQlNRi5Xcml0ZShURi5SZWFkQWxsKCkpOwotCVRGLkNsb3NlKCk7Ci0KLQlNRi5DbG9z ZSgpOwotCi0JRlNPLkRlbGV0ZUZpbGUoIk1ha2VmaWxlLm9iamVjdHMiKTsKLQlGU08uRGVsZXRl RmlsZSgiTWFrZWZpbGUuZXh0ZW5zaW9ucyIpOwotfQotCi1mdW5jdGlvbiBjb3B5X2FuZF9zdWJz dChzcmNuYW1lLCBkZXN0bmFtZSwgc3Vic3RfYXJyYXkpIHsKLQotCWlmICghRlNPLkZpbGVFeGlz dHMoc3JjbmFtZSkpIHsKLQkJc3JjbmFtZSA9IGNvbmZpZ3VyZV9tb2R1bGVfZGlybmFtZSArICJc XCIgKyBzcmNuYW1lOwotCQlkZXN0bmFtZSA9IGNvbmZpZ3VyZV9tb2R1bGVfZGlybmFtZSArICJc XCIgKyBkZXN0bmFtZTsKLQl9Ci0KLQl2YXIgY29udGVudCA9IGZpbGVfZ2V0X2NvbnRlbnRzKHNy Y25hbWUpOwotCXZhciBpOwotCi0JZm9yIChpID0gMDsgaSA8IHN1YnN0X2FycmF5Lmxlbmd0aDsg aSs9MikgewotCQl2YXIgcmUgPSBzdWJzdF9hcnJheVtpXTsKLQkJdmFyIHJlcCA9IHN1YnN0X2Fy cmF5W2krMV07Ci0KLQkJY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShyZSwgcmVwKTsKLQl9Ci0K LQl2YXIgZiA9IEZTTy5DcmVhdGVUZXh0RmlsZShkZXN0bmFtZSwgdHJ1ZSk7Ci0JZi5Xcml0ZShj b250ZW50KTsKLQlmLkNsb3NlKCk7Ci19Ci0KLS8vIGdsb2IgdXNpbmcgc2ltcGxlIGZpbGVuYW1l IHdpbGRjYXJkczsgcmV0dXJucyBhbiBhcnJheSBvZiBtYXRjaGVzIGZvdW5kIGluIHRoZSBmaWxl c3lzdGVtCi1mdW5jdGlvbiBnbG9iKHBhdGhfcGF0dGVybikgewotCi0JdmFyIHBhdGhfcGFydHMg PSBwYXRoX3BhdHRlcm4ucmVwbGFjZShuZXcgUmVnRXhwKCIvIiwgImciKSwgIlxcIikuc3BsaXQo IlxcIik7Ci0JdmFyIHA7Ci0JdmFyIGJhc2UgPSAiIjsKLQl2YXIgaXNfcGF0X3JlID0gL1wqLzsK LQotCWlmIChGU08uRmlsZUV4aXN0cyhwYXRoX3BhdHRlcm4pKSB7Ci0JCXJldHVybiBuZXcgQXJy YXkocGF0aF9wYXR0ZXJuKTsKLQl9Ci0KLQkvLyBmaXJzdCwgYnVpbGQgYXMgbXVjaCBhcyBwb3Nz aWJsZSB0aGF0IGRvZXNuJ3QgaGF2ZSBhIHBhdHRlcm4KLQlmb3IgKHAgPSAwOyBwIDwgcGF0aF9w YXJ0cy5sZW5ndGg7IHArKykgewotCQlpZiAocGF0aF9wYXJ0c1twXS5tYXRjaChpc19wYXRfcmUp KQotCQkJYnJlYWs7Ci0JCWlmIChwKQotCQkJYmFzZSArPSAiXFwiOwotCQliYXNlICs9IHBhdGhf cGFydHNbcF07Ci0JfQotCi0JcmV0dXJuIF9pbm5lcl9nbG9iKGJhc2UsIHAsIHBhdGhfcGFydHMp OwotfQotCi1mdW5jdGlvbiBfaW5uZXJfZ2xvYihiYXNlLCBwLCBwYXJ0cykgewotCi0JdmFyIHBh dCA9IHBhcnRzW3BdOwotCXZhciBmdWxsX25hbWUgPSBiYXNlICsgIlxcIiArIHBhdDsKLQl2YXIg cmUgPSBudWxsOwotCXZhciBpdGVtcyA9IG51bGw7Ci0KLQlpZiAocCA9PSBwYXJ0cy5sZW5ndGgp IHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCWlmIChGU08uRmlsZUV4aXN0cyhmdWxsX25hbWUp KSB7Ci0JCWlmIChwIDwgcGFydHMubGVuZ3RoIC0gMSkgewotCQkJLy8gd2UgZGlkbid0IHJlYWNo IHRoZSBmdWxsIGV4dGVudCBvZiB0aGUgcGF0dGVybgotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0J CXJldHVybiBuZXcgQXJyYXkoZnVsbF9uYW1lKTsKLQl9Ci0KLQlpZiAoRlNPLkZvbGRlckV4aXN0 cyhmdWxsX25hbWUpICYmIHAgPT0gcGFydHMubGVuZ3RoIC0gMSkgewotCQkvLyB3ZSBoYXZlIHJl YWNoZWQgdGhlIGVuZCBvZiB0aGUgcGF0dGVybjsgbm8gbmVlZCB0byByZWN1cnNlCi0JCXJldHVy biBuZXcgQXJyYXkoZnVsbF9uYW1lKTsKLQl9Ci0KLQkvLyBDb252ZXJ0IHRoZSBwYXR0ZXJuIGlu dG8gYSByZWdleHAKLQlyZSA9IG5ldyBSZWdFeHAoIl4iICsgcGF0LnJlcGxhY2UoL1wuL2csICdc XC4nKS5yZXBsYWNlKC9cKi9nLCAnLionKS5yZXBsYWNlKC9cPy9nLCAnLicpICsgIiQiLCAiaSIp OwotCi0JaXRlbXMgPSBuZXcgQXJyYXkoKTsKLQotCWlmICghRlNPLkZvbGRlckV4aXN0cyhiYXNl KSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JdmFyIGZvbGRlciA9IEZTTy5HZXRGb2xkZXIo YmFzZSk7Ci0JdmFyIGZjID0gbnVsbDsKLQl2YXIgc3ViaXRlbXMgPSBudWxsOwotCXZhciBpdGVt X25hbWUgPSBudWxsOwotCXZhciBqOwotCi0JZmMgPSBuZXcgRW51bWVyYXRvcihmb2xkZXIuU3Vi Rm9sZGVycyk7Ci0JZm9yICg7ICFmYy5hdEVuZCgpOyBmYy5tb3ZlTmV4dCgpKSB7Ci0JCWl0ZW1f bmFtZSA9IEZTTy5HZXRGaWxlTmFtZShmYy5pdGVtKCkpOwotCi0JCWlmIChpdGVtX25hbWUubWF0 Y2gocmUpKSB7Ci0JCQkvLyBnb3QgYSBtYXRjaDsgaWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhl IHBhdHRlcm4sIGp1c3QgYWRkIHRoZXNlCi0JCQkvLyB0aGluZ3MgdG8gdGhlIGl0ZW1zIGFycmF5 Ci0JCQlpZiAocCA9PSBwYXJ0cy5sZW5ndGggLSAxKSB7Ci0JCQkJaXRlbXNbaXRlbXMubGVuZ3Ro XSA9IGZjLml0ZW0oKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gd2Ugc2hvdWxkIHJlY3Vyc2UgYW5k IGRvIG1vcmUgbWF0Y2hlcwotCQkJCXN1Yml0ZW1zID0gX2lubmVyX2dsb2IoYmFzZSArICJcXCIg KyBpdGVtX25hbWUsIHAgKyAxLCBwYXJ0cyk7Ci0JCQkJaWYgKHN1Yml0ZW1zKSB7Ci0JCQkJCWZv ciAoaiA9IDA7IGogPCBzdWJpdGVtcy5sZW5ndGg7IGorKykgewotCQkJCQkJaXRlbXNbaXRlbXMu bGVuZ3RoXSA9IHN1Yml0ZW1zW2pdOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0J Ly8gaWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIHBhdHRlcm4sIHdlIHNob3VsZCBtYXRjaCBm aWxlcyB0b28KLQlpZiAocCA9PSBwYXJ0cy5sZW5ndGggLSAxKSB7Ci0JCWZjID0gbmV3IEVudW1l cmF0b3IoZm9sZGVyLkZpbGVzKTsKLQkJZm9yICg7ICFmYy5hdEVuZCgpOyBmYy5tb3ZlTmV4dCgp KSB7Ci0JCQlpdGVtX25hbWUgPSBGU08uR2V0RmlsZU5hbWUoZmMuaXRlbSgpKTsKLQkJCWlmIChp dGVtX25hbWUubWF0Y2gocmUpKSB7Ci0JCQkJaXRlbXNbaXRlbXMubGVuZ3RoXSA9IGZjLml0ZW0o KTsKLQkJCX0KLQkJfQotCX0KLQotCWlmIChpdGVtcy5sZW5ndGggPT0gMCkKLQkJcmV0dXJuIGZh bHNlOwotCi0JcmV0dXJuIGl0ZW1zOwotfQotCi0vKiBFbWl0cyBydWxlIHRvIGdlbmVyYXRlIHZl cnNpb24gaW5mbyBmb3IgYW4gZXh0ZW5zaW9uLgotUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgLnJl cyBmaWxlIHRoYXQgd2lsbCBiZSBnZW5lcmF0ZWQgKi8KLWZ1bmN0aW9uIGdlbmVyYXRlX3ZlcnNp b25faW5mb19yZXNvdXJjZShtYWtlZmlsZXRhcmdldCwgY3JlZGl0c3BhdGgpIHsKLQotCS8vIG1h a2VmaWxldGFyZ2V0IGlzIHBocC1ndGsuZGxsCi0JLy8gY3JlZGl0c3BhdGggaXMgZXh0XGd0aysK LQotCXZhciByZXNuYW1lID0gbWFrZWZpbGV0YXJnZXQgKyAiLnJlcyI7Ci0JdmFyIHJlc19kZXNj ID0gIlBIUC1HVEsgU2NyaXB0IEludGVycHJldGVyIjsKLQl2YXIgcmVzX3Byb2RfbmFtZSA9ICJQ SFAtR1RLIjsKLQl2YXIgY3JlZGl0czsKLQl2YXIgdGhhbmtzID0gIlRoYW5rcyB0byBBbmRyZWkg Wm1pZXZza2kiOwotCXZhciBsb2dvID0gIiI7Ci0KLQlpZiAoRlNPLkZpbGVFeGlzdHMoY3JlZGl0 c3BhdGggKyAnL0NSRURJVFMnKSkgewotCQljcmVkaXRzID0gRlNPLk9wZW5UZXh0RmlsZShjcmVk aXRzcGF0aCArICcvQ1JFRElUUycsIDEpOwotCQlyZXNfZGVzYyA9IGNyZWRpdHMuUmVhZExpbmUo KTsKLQkJdHJ5IHsKLQkJCXRoYW5rcyA9IGNyZWRpdHMuUmVhZExpbmUoKTsKLQkJfSBjYXRjaCAo ZSkgewotCQkJdGhhbmtzID0gbnVsbDsKLQkJfQotCQlpZiAodGhhbmtzID09IG51bGwpIHsKLQkJ CXRoYW5rcyA9ICIiOwotCQl9IGVsc2UgewotCQkJdGhhbmtzID0gIlRoYW5rcyB0byAiICsgdGhh bmtzOwotCQl9Ci0JCWNyZWRpdHMuQ2xvc2UoKTsKLQl9Ci0KLQlNRk8uV3JpdGVMaW5lKCJQSFBH VEtETExfUkVTPSQoQlVJTERfRElSKVxcJChQSFBHVEtETEwpLnJlcyIpOwotCU1GTy5Xcml0ZUJs YW5rTGluZXMoMSk7Ci0KLQlpZiAobWFrZWZpbGV0YXJnZXQubWF0Y2gobmV3IFJlZ0V4cCgiXFwu ZXhlJCIpKSkgewotCQlsb2dvID0gIiAvRCBXQU5UX0xPR08iOwotCX0KLQotCU1GTy5Xcml0ZUxp bmUoIiQoUEhQR1RLRExMX1JFUyk6IHdpbjMyXFx0ZW1wbGF0ZS5yYyIpOwotCU1GTy5Xcml0ZUxp bmUoIlx0JChSQykgL2ZvICQoUEhQR1RLRExMX1JFUykiICsgbG9nbyArICcgL0QgRklMRV9ERVND UklQVElPTj0iXFwiJyArIHJlc19kZXNjICsgJ1xcIiIgL0QgRklMRV9OQU1FPSJcXCIkKFBIUEdU S0RMTClcXCIiIC9EIFBST0RVQ1RfTkFNRT0iXFwiJyArIHJlc19wcm9kX25hbWUgKyAnXFwiIiAv RCBUSEFOS1NfR1VZUz0iXFwiJyArIHRoYW5rcyArICdcXCIiIHdpbjMyXFx0ZW1wbGF0ZS5yYycp OwotCU1GTy5Xcml0ZUJsYW5rTGluZXMoMSk7Ci0KLQlyZXR1cm4gcmVzbmFtZTsKLX0KLQotLyog ZXhlY3V0ZSBhIGNvbW1hbmQgYW5kIHJldHVybiB0aGUgb3V0cHV0IGFzIGEgc3RyaW5nICovCi1m dW5jdGlvbiBleGVjdXRlKGNvbW1hbmRfbGluZSkgewotCXZhciBlID0gV3NoU2hlbGwuRXhlYyhj b21tYW5kX2xpbmUpOwotCXZhciByZXQgPSAiIjsKLQotCXJldCA9IGUuU3RkT3V0LlJlYWRBbGwo KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8vIFdoaWNoIHZlcnNpb24gb2YgdGhlIGNvbXBpbGVy IGRvIHdlIGhhdmU/CisvLyBVdGlscyBmb3IgY29uZmlndXJlIHNjcmlwdA0KKy8qDQorICArLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLSsNCisgIHwgUEhQLUdUSyBWZXJzaW9uIDIgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQorICB8 IENvcHlyaWdodCAoYykgMTk5Ny0yMDA1IFRoZSBQSFAgR3JvdXAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwNCisgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KKyAgfCBUaGlzIHNvdXJjZSBmaWxl IGlzIHN1YmplY3QgdG8gdmVyc2lvbiAzLjAgb2YgdGhlIFBIUCBsaWNlbnNlLCAgICAgICB8DQor ICB8IHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNF LCBhbmQgaXMgICAgICAgIHwNCisgIHwgYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUt d2ViIGF0IHRoZSBmb2xsb3dpbmcgdXJsOiAgICAgICAgICAgfA0KKyAgfCBodHRwOi8vd3d3LnBo cC5uZXQvbGljZW5zZS8zXzAudHh0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 DQorICB8IElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBQSFAgbGljZW5zZSBh bmQgYXJlIHVuYWJsZSB0byAgIHwNCisgIHwgb2J0YWluIGl0IHRocm91Z2ggdGhlIHdvcmxkLXdp ZGUtd2ViLCBwbGVhc2Ugc2VuZCBhIG5vdGUgdG8gICAgICAgICAgfA0KKyAgfCBsaWNlbnNlQHBo cC5uZXQgc28gd2UgY2FuIG1haWwgeW91IGEgY29weSBpbW1lZGlhdGVseS4gICAgICAgICAgICAg ICB8DQorICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCisgIHwgQXV0aG9yOiBXZXogRnVybG9uZyA8d2V6QHRo ZWJyYWlucm9vbS5jb20+ICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyAgKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0rDQorKi8NCisNCisvLyAkSWQ6IGNvbmZ1dGlscy5qcyx2IDEuMjQgMjAwOC0wOC0wMSAx NDozNDo0MyBhdXJvcmFlb3Nyb3NlIEV4cCAkDQorDQorLyogc2V0IHZhcnMgKi8NCit2YXIgU1RE T1VUID0gV1NjcmlwdC5TdGRPdXQ7DQordmFyIFNUREVSUiA9IFdTY3JpcHQuU3RkRXJyOw0KK3Zh ciBXc2hTaGVsbCA9IFdTY3JpcHQuQ3JlYXRlT2JqZWN0KCJXU2NyaXB0LlNoZWxsIik7DQordmFy IEZTTyA9IFdTY3JpcHQuQ3JlYXRlT2JqZWN0KCJTY3JpcHRpbmcuRmlsZVN5c3RlbU9iamVjdCIp Ow0KK3ZhciBNRk8gPSBudWxsOw0KK3ZhciBNRkUgPSBudWxsOw0KK3ZhciBTWVNURU1fRFJJVkUg PSBXc2hTaGVsbC5FbnZpcm9ubWVudCgiUHJvY2VzcyIpLkl0ZW0oIlN5c3RlbURyaXZlIik7DQor dmFyIFBST0dSQU1fRklMRVMgPSBXc2hTaGVsbC5FbnZpcm9ubWVudCgiUHJvY2VzcyIpLkl0ZW0o IlByb2dyYW1GaWxlcyIpOw0KKw0KK2lmIChQUk9HUkFNX0ZJTEVTID09IG51bGwpIHsNCisJUFJP R1JBTV9GSUxFUyA9ICJDOlxcUHJvZ3JhbSBGaWxlcyI7DQorfQ0KKw0KK3ZhciBDV0QgPSBXc2hT aGVsbC5DdXJyZW50RGlyZWN0b3J5Ow0KKw0KK2lmICh0eXBlb2YoQ1dEKSA9PSAidW5kZWZpbmVk Iikgew0KKwlDV0QgPSBGU08uR2V0UGFyZW50Rm9sZGVyTmFtZShGU08uR2V0QWJzb2x1dGVQYXRo TmFtZSgiYnVpbGRjb25mLmJhdCIpKTsNCit9DQorDQorY29uZmlndXJlX2FyZ3MgPSBuZXcgQXJy YXkoKTsNCitjb25maWd1cmVfc3Vic3QgPSBXU2NyaXB0LkNyZWF0ZU9iamVjdCgiU2NyaXB0aW5n LkRpY3Rpb25hcnkiKTsNCisNCitjb25maWd1cmVfaGRyID0gV1NjcmlwdC5DcmVhdGVPYmplY3Qo IlNjcmlwdGluZy5EaWN0aW9uYXJ5Iik7DQorYnVpbGRfZGlycyA9IG5ldyBBcnJheSgpOw0KK21h a2VfYnVpbGRzID0gbmV3IEFycmF5KCk7DQorDQorZXh0ZW5zaW9uX2luY2x1ZGVfY29kZSA9ICIi Ow0KK2V4dGVuc2lvbl9tb2R1bGVfcHRycyA9ICIiOw0KKw0KKy8qIGZ1bmN0aW9ucyAqLw0KKw0K K2Z1bmN0aW9uIGdldF9ndGtfbGlidmVyc2lvbigpDQorew0KKwl2YXIgZW52LCBpLCB2aW4sIG1h am9yLCBtaW5vcjsNCisJdmFyIGZvdW5kID0gZmFsc2U7DQorDQorCWZvdW5kID0gQ0hFQ0tfSEVB REVSKCJndGsvZ3RrdmVyc2lvbi5oIik7DQorDQorCWlmIChmb3VuZCkgew0KKwkJU1RET1VULldy aXRlTGluZSgiCTxpbiBkZWZhdWx0IHBhdGg+Iik7DQorCQl2aW4gPSBmaWxlX2dldF9jb250ZW50 cyhmb3VuZCArICJcXGd0a1xcZ3RrdmVyc2lvbi5oIik7DQorDQorCQlyZWdleCA9IG5ldyBSZWdF eHAoIkdUS19NQUpPUl9WRVJTSU9OXFxzK1xcKChbMC05XSspXFwpIik7DQorCQlyZWdleC5leGVj KHZpbik7DQorCQltYWpvciA9IFJlZ0V4cC4kMTsNCisJCWlmIChtYWpvciA8IDIpDQorCQkJbWFq b3IgPSAyOw0KKwkNCisJCXJlZ2V4ID0gbmV3IFJlZ0V4cCgiR1RLX01JTk9SX1ZFUlNJT05cXHMr XFwoKFswLTldKylcXCkiKTsNCisJCXJlZ2V4LmV4ZWModmluKTsNCisJCW1pbm9yID0gUmVnRXhw LiQxOw0KKwkJaWYgKG1pbm9yIDwgNikNCisJCQltaW5vciA9IDY7DQorCQ0KKwkJaWYgKG1ham9y ID49IDIgJiYgbWlub3IgPj04KSB7DQorCQkJRU5BQkxFX0NBSVJPID0gMTsNCisJCX0gZWxzZSB7 DQorCQkJRU5BQkxFX0NBSVJPID0gMDsNCisJCX0NCisJCVBIUF9HVEtfTElCVkVSU0lPTiA9IG1h am9yICsgJy4nICsgbWlub3I7DQorCX0gZWxzZSB7DQorCQlTVERPVVQuV3JpdGVMaW5lKCIJPG5v dCBmb3VuZD4iKTsNCisJCVBIUF9HVEtfTElCVkVSU0lPTiA9ICcyLjYnOw0KKwl9DQorDQorCVNU RE9VVC5Xcml0ZSgiTGlicmFyeSBkZWZpbml0aW9ucyBmb3IgIiArIFBIUF9HVEtfTElCVkVSU0lP TiArICIgd2lsbCBiZSB1c2VkIik7DQorCVNUREVSUi5Xcml0ZUJsYW5rTGluZXMoMSk7DQorfQ0K Kw0KK2Z1bmN0aW9uIGdlbmVyYXRlX3NvdXJjZSgpIHsNCisNCisJaWYgKCFGU08uRmlsZUV4aXN0 cygiZXh0XFxndGsrXFxjb21wbGV0ZS50eHQiKSkgew0KKwkJaWYgKCFGU08uRmlsZUV4aXN0cygi d2luMzJcXHRlbXAuYmF0IikpIHsNCisJCQlTVERFUlIuV3JpdGVMaW5lKCJSdW4gYnVpbGRjb25m IGZpcnN0IC0gdGhlIHNvdXJjZSBmaWxlIGdlbmVyYXRvciBpcyBtaXNzaW5nIik7DQorCQkJV1Nj cmlwdC5RdWl0KDEwKTsNCisJCX0gZWxzZSB7DQorCQkJdmFyIHRlbXAgPSBGU08uT3BlblRleHRG aWxlKCJ3aW4zMlxcdGVtcC5iYXQiLCA4KTsNCisJCQl0ZW1wLldyaXRlTGluZSgiQGVjaG8gb2Zm ID4gc291cmNlX2NvbXBsZXRlLnR4dCIpOw0KKwkJCXRlbXAuQ2xvc2UoKTsNCisJCQlXc2hTaGVs bC5SdW4oIndpbjMyXFx0ZW1wIiwgMCk7DQorCQl9DQorCX0NCisJcmV0dXJuOw0KK30NCisNCitm dW5jdGlvbiBjaGVja19nZW5lcmF0aW9uKCkgew0KKw0KKwlpZiAoIUZTTy5GaWxlRXhpc3RzKCJz b3VyY2VfY29tcGxldGUudHh0IikpIHsNCisJCVNURE9VVC5Xcml0ZUxpbmUoIldhaXRpbmcgZm9y IHNvdXJjZSBmaWxlcyB0byBnZW5lcmF0ZS4uLiIpOw0KKwkJV1NjcmlwdC5TbGVlcCgzNTAwKTsN CisJCWNoZWNrX2dlbmVyYXRpb24oKTsNCisJfQ0KKwlyZXR1cm47DQorfQ0KKw0KK2Z1bmN0aW9u IGdldF92ZXJzaW9uX251bWJlcnMoKSB7DQorDQorCS8qIHBpY2sgdXAgdGhlIHZlcnNpb24gZnJv bSBtYWluL3BocF9ndGsuaCAqLw0KKwl2YXIgdmluID0gZmlsZV9nZXRfY29udGVudHMoIm1haW5c XHBocF9ndGsuaCIpOw0KKwl2YXIgdmVyc2lvbiwgdmVyc2lvbl9zdHJpbmdzLCBtYWpvciwgbWlu b3IsIGRldGFpbHMsIHJlbGVhc2UgPSAiIiwgZXh0cmEgPSAiIjsNCisNCisJaWYgKHZpbi5tYXRj aChuZXcgUmVnRXhwKCJQSFBfR1RLX1ZFUlNJT04gXCIoW15cIl0rKVwiIikpKSB7DQorCQl2ZXJz aW9uID0gUmVnRXhwLiQxOw0KKwkJdmVyc2lvbl9zdHJpbmdzID0gdmVyc2lvbi5zcGxpdCgiLiIp Ow0KKw0KKwkJbWFqb3IgPSB2ZXJzaW9uX3N0cmluZ3NbMF07DQorCQltaW5vciA9IHZlcnNpb25f c3RyaW5nc1sxXTsNCisJCWRldGFpbHMgPSB2ZXJzaW9uX3N0cmluZ3NbMl07DQorDQorCQlmb3Ig KGkgPSAwOyBpIDwgZGV0YWlscy5sZW5ndGg7IGkrKykgew0KKwkJCWlmKCFpc05hTihkZXRhaWxz LmNoYXJBdChpKSkpIHsNCisJCQkJcmVsZWFzZSA9IHJlbGVhc2UgKyBkZXRhaWxzLmNoYXJBdChp KTsNCisJCQl9IGVsc2Ugew0KKwkJCQlleHRyYSA9IGRldGFpbHMuc3Vic3RyaW5nKGkpOw0KKwkJ CQlicmVhazsNCisJCQl9DQorCQl9DQorCX0NCisNCisJdmFyIHZmaWxlID0gRlNPLkNyZWF0ZVRl eHRGaWxlKCJtYWluL3BocF9ndGtfdmVyc2lvbi5oIiwgdHJ1ZSk7DQorCXZmaWxlLldyaXRlTGlu ZSgiLyogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGR1cmluZyB3aW4zMiBj b25maWd1cmF0aW9uICovIik7DQorCXZmaWxlLldyaXRlTGluZSgiLyogRWRpdCBwaHBfZ3RrLmgg dG8gY2hhbmdlIHRoZSB2ZXJzaW9uIG51bWJlciAqLyIpOw0KKwl2ZmlsZS5Xcml0ZUxpbmUoIiNk ZWZpbmUgUEhQX0dUS19NQUpPUl9WRVJTSU9OICIgKyBtYWpvcik7DQorCXZmaWxlLldyaXRlTGlu ZSgiI2RlZmluZSBQSFBfR1RLX01JTk9SX1ZFUlNJT04gIiArIG1pbm9yKTsNCisJdmZpbGUuV3Jp dGVMaW5lKCIjZGVmaW5lIFBIUF9HVEtfUkVMRUFTRV9WRVJTSU9OICIgKyByZWxlYXNlKTsNCisJ aWYgKFBIUF9HVEtfREVCVUcgPT0gInllcyIpIHsNCisJCXZmaWxlLldyaXRlTGluZSgiI2RlZmlu ZSBQSFBfR1RLX0VYVFJBX1ZFUlNJT04gXCIiICsgZXh0cmEgKyAiIChERUJVRylcIiIpOw0KKwl9 IGVsc2Ugew0KKwkJdmZpbGUuV3JpdGVMaW5lKCIjZGVmaW5lIFBIUF9HVEtfRVhUUkFfVkVSU0lP TiBcIiIgKyBleHRyYSArICJcIiIpOw0KKwl9DQorDQorCURFRklORSgnUEhQX0dUS19WRVJTSU9O X1NUUklORycsIHZlcnNpb24pOw0KK30NCisNCitmdW5jdGlvbiBjb25kZW5zZV9wYXRoKHBhdGgp IHsNCisNCisJcGF0aCA9IEZTTy5HZXRBYnNvbHV0ZVBhdGhOYW1lKHBhdGgpOw0KKw0KKwlpZiAo cGF0aC5zdWJzdHIoMCwgQ1dELmxlbmd0aCkudG9Mb3dlckNhc2UoKQ0KKwkJCT09IENXRC50b0xv d2VyQ2FzZSgpICYmDQorCQkJKHBhdGguY2hhckNvZGVBdChDV0QubGVuZ3RoKSA9PSA5MiB8fCBw YXRoLmNoYXJDb2RlQXQoQ1dELmxlbmd0aCkgPT0gNDcpKSB7DQorCQlyZXR1cm4gcGF0aC5zdWJz dHIoQ1dELmxlbmd0aCArIDEpOw0KKwl9DQorDQorCXZhciBhID0gQ1dELnNwbGl0KCJcXCIpOw0K Kwl2YXIgYiA9IHBhdGguc3BsaXQoIlxcIik7DQorCXZhciBpLCBqOw0KKw0KKwlmb3IgKGkgPSAw OyBpIDwgYi5sZW5ndGg7IGkrKykgew0KKwkJaWYgKGFbaV0udG9Mb3dlckNhc2UoKSA9PSBiW2ld LnRvTG93ZXJDYXNlKCkpDQorCQkJY29udGludWU7DQorCQlpZiAoaSA+IDApIHsNCisJCQkvKiBm aXJzdCBkaWZmZXJlbmNlIGZvdW5kICovDQorCQkJcGF0aCA9ICIiOw0KKwkJCWZvciAoaiA9IDA7 IGogPCBhLmxlbmd0aCAtIGk7IGorKykgew0KKwkJCQlwYXRoICs9ICIuLlxcIjsNCisJCQl9DQor CQkJZm9yIChqID0gaTsgaiA8IGIubGVuZ3RoOyBqKyspIHsNCisJCQkJcGF0aCArPSBiW2pdOw0K KwkJCQlpZiAoaiA8IGIubGVuZ3RoIC0gMSkNCisJCQkJCXBhdGggKz0gIlxcIjsNCisJCQl9DQor CQkJcmV0dXJuIHBhdGg7DQorCQl9DQorCQkvKiBvbiBhIGRpZmZlcmVudCBkcml2ZSAqLw0KKwkJ YnJlYWs7DQorCX0NCisNCisJcmV0dXJuIHBhdGg7DQorfQ0KKw0KK2Z1bmN0aW9uIENvbmZpZ3Vy ZUFyZyh0eXBlLCBvcHRuYW1lLCBoZWxwdGV4dCwgZGVmdmFsKSB7DQorDQorCXZhciBvcHB0eXBl ID0gIiI7DQorDQorCWlmICh0eXBlKSB7DQorDQorCQlvcHB0eXBlID0gdHlwZSA9PSAiZW5hYmxl IiA/ICJkaXNhYmxlIiA6ICJ3aXRob3V0IjsNCisNCisJCWlmIChkZWZ2YWwgPT0gInllcyIgfHwg ZGVmdmFsID09ICJ5ZXMsc2hhcmVkIikgew0KKwkJCXRoaXMuYXJnID0gIi0tIiArIG9wcHR5cGUg KyAiLSIgKyBvcHRuYW1lOw0KKwkJCXRoaXMuaW1wYXJnID0gIi0tIiArIHR5cGUgKyAiLSIgKyBv cHRuYW1lOw0KKwkJfSBlbHNlIHsNCisJCQl0aGlzLmFyZyA9ICItLSIgKyB0eXBlICsgIi0iICsg b3B0bmFtZTsNCisJCQl0aGlzLmltcGFyZyA9ICItLSIgKyBvcHB0eXBlICsgIi0iICsgb3B0bmFt ZTsNCisJCX0NCisJfSBlbHNlIHsNCisJCXRoaXMuYXJnID0gIi0tIiArIG9wdG5hbWU7DQorCX0N CisNCisJdGhpcy5vcHRuYW1lID0gb3B0bmFtZTsNCisJdGhpcy5oZWxwdGV4dCA9IGhlbHB0ZXh0 Ow0KKwl0aGlzLmRlZnZhbCA9IGRlZnZhbDsNCisJdGhpcy5zeW12YWwgPSBvcHRuYW1lLnRvVXBw ZXJDYXNlKCkucmVwbGFjZShuZXcgUmVnRXhwKCItIiwgImciKSwgIl8iKTsNCisJdGhpcy5zZWVu ID0gZmFsc2U7DQorCXRoaXMuYXJndmFsID0gZGVmdmFsOw0KK30NCisNCitmdW5jdGlvbiBhbmFs eXplX2FyZyhhcmd2YWwpIHsNCisNCisJdmFyIHJldCA9IG5ldyBBcnJheSgpOw0KKw0KKwlpZiAo YXJndmFsID09ICJzaGFyZWQiKSB7DQorCQlhcmd2YWwgPSAieWVzIjsNCisJfSBlbHNlIGlmIChh cmd2YWwgPT0gbnVsbCkgew0KKwkJLyogbm90aGluZyAqLw0KKwl9IGVsc2UgaWYgKGFyZ19tYXRj aCA9IGFyZ3ZhbC5tYXRjaChuZXcgUmVnRXhwKCJec2hhcmVkLCguKikiKSkpIHsNCisJCWFyZ3Zh bCA9IGFyZ19tYXRjaFsxXTsNCisJfSBlbHNlIGlmIChhcmdfbWF0Y2ggPSBhcmd2YWwubWF0Y2go bmV3IFJlZ0V4cCgiXiguKiksc2hhcmVkJCIpKSkgew0KKwkJYXJndmFsID0gYXJnX21hdGNoWzFd Ow0KKwl9DQorDQorCXJldFswXSA9IGFyZ3ZhbDsNCisJcmV0dXJuIHJldDsNCit9DQorDQorZnVu Y3Rpb24gY29uZl9wcm9jZXNzX2FyZ3MoKSB7DQorDQorCXZhciBpLCBqOw0KKwl2YXIgY29uZmln dXJlX2hlbHBfbW9kZSA9IGZhbHNlOw0KKwl2YXIgYW5hbHl6ZWQgPSBmYWxzZTsNCisJdmFyIG5p Y2UgPSAiY3NjcmlwdCAvbm9sb2dvIGNvbmZpZ3VyZS5qcyAiOw0KKw0KKwlhcmdzID0gV1Njcmlw dC5Bcmd1bWVudHM7DQorDQorCWZvciAoaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7DQor CQlhcmcgPSBhcmdzKGkpOw0KKwkJbmljZSArPSAnICInICsgYXJnICsgJyInOw0KKwkJaWYgKGFy ZyA9PSAiLS1oZWxwIikgew0KKwkJCWNvbmZpZ3VyZV9oZWxwX21vZGUgPSB0cnVlOw0KKwkJCWJy ZWFrOw0KKwkJfQ0KKw0KKwkJLy8gSWYgaXQgaXMgLS1mb289YmFyLCBzcGxpdCBvbiB0aGUgZXF1 YWxzIHNpZ24NCisJCWFyZyA9IGFyZy5zcGxpdCgiPSIsIDIpOw0KKwkJYXJnbmFtZSA9IGFyZ1sw XTsNCisJCWlmIChhcmcubGVuZ3RoID4gMSkgew0KKwkJCWFyZ3ZhbCA9IGFyZ1sxXTsNCisJCX0g ZWxzZSB7DQorCQkJYXJndmFsID0gbnVsbDsNCisJCX0NCisNCisJCS8vIEZpbmQgdGhlIGFyZw0K KwkJZm91bmQgPSBmYWxzZTsNCisJCWZvciAoaiA9IDA7IGogPCBjb25maWd1cmVfYXJncy5sZW5n dGg7IGorKykgew0KKwkJCWlmIChhcmduYW1lID09IGNvbmZpZ3VyZV9hcmdzW2pdLmltcGFyZyB8 fCBhcmduYW1lID09IGNvbmZpZ3VyZV9hcmdzW2pdLmFyZykgew0KKwkJCQlmb3VuZCA9IHRydWU7 DQorDQorCQkJCWFyZyA9IGNvbmZpZ3VyZV9hcmdzW2pdOw0KKwkJCQlhcmcuc2VlbiA9IHRydWU7 DQorDQorCQkJCWFuYWx5emVkID0gYW5hbHl6ZV9hcmcoYXJndmFsKTsNCisJCQkJYXJndmFsID0g YW5hbHl6ZWRbMF07DQorDQorCQkJCWlmIChhcmduYW1lID09IGFyZy5pbXBhcmcpIHsNCisJCQkJ CS8qIHdlIG1hdGNoZWQgdGhlIGltcGxpY2l0LCBvciBkZWZhdWx0IGFyZyAqLw0KKwkJCQkJaWYg KGFyZ3ZhbCA9PSBudWxsKSB7DQorCQkJCQkJYXJndmFsID0gYXJnLmRlZnZhbDsNCisJCQkJCX0N CisJCQkJfSBlbHNlIHsNCisJCQkJCS8qIHdlIG1hdGNoZWQgdGhlIG5vbi1kZWZhdWx0IGFyZyAq Lw0KKwkJCQkJaWYgKGFyZ3ZhbCA9PSBudWxsKSB7DQorCQkJCQkJYXJndmFsID0gYXJnLmRlZnZh bCA9PSAibm8iID8gInllcyIgOiAibm8iOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCWFyZy5h cmd2YWwgPSBhcmd2YWw7DQorCQkJCWV2YWwoIlBIUF9HVEtfIiArIGFyZy5zeW12YWwgKyAiID0g YXJndmFsOyIpOw0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCQlpZiAoIWZvdW5kKSB7DQor CQkJU1RERVJSLldyaXRlTGluZSgiVW5rbm93biBvcHRpb24gIiArIGFyZ25hbWUpOw0KKwkJCVNU REVSUi5Xcml0ZUxpbmUoIlBsZWFzZSB0cnkgY29uZmlndXJlLmpzIC0taGVscCBmb3IgYSBsaXN0 IG9mIHZhbGlkIG9wdGlvbnMiKTsNCisJCQlXU2NyaXB0LlF1aXQoMik7DQorCQl9DQorCX0NCisN CisJaWYgKGNvbmZpZ3VyZV9oZWxwX21vZGUpIHsNCisNCisJCVNURE9VVC5Xcml0ZUJsYW5rTGlu ZXMoMSk7DQorDQorCQkvLyBNZWFzdXJlIHdpZHRoIHRvIHByZXR0eS1wcmludCB0aGUgb3V0cHV0 DQorCQltYXhfd2lkdGggPSAwOw0KKwkJZm9yIChpID0gMDsgaSA8IGNvbmZpZ3VyZV9hcmdzLmxl bmd0aDsgaSsrKSB7DQorCQkJYXJnID0gY29uZmlndXJlX2FyZ3NbaV07DQorCQkJaWYgKGFyZy5h cmcubGVuZ3RoID4gbWF4X3dpZHRoKSB7DQorCQkJCW1heF93aWR0aCA9IGFyZy5hcmcubGVuZ3Ro Ow0KKwkJCX0NCisJCX0NCisNCisJCWZvciAoaSA9IDA7IGkgPCBjb25maWd1cmVfYXJncy5sZW5n dGg7IGkrKykgew0KKwkJCWFyZyA9IGNvbmZpZ3VyZV9hcmdzW2ldOw0KKw0KKwkJCW4gPSBtYXhf d2lkdGggLSBhcmcuYXJnLmxlbmd0aDsNCisJCQlwYWQgPSAiICAgIjsNCisJCQlmb3IgKGogPSAw OyBqIDwgbjsgaisrKSB7DQorCQkJCXBhZCArPSAiICI7DQorCQkJfQ0KKwkJCVNURE9VVC5Xcml0 ZUxpbmUoIiAgIiArIGFyZy5hcmcgKyBwYWQgKyB3b3JkX3dyYXBfYW5kX2luZGVudChtYXhfd2lk dGggKyA1LCBhcmcuaGVscHRleHQpKTsNCisJCX0NCisJCVdTY3JpcHQuUXVpdCgxKTsNCisJfQ0K Kw0KKwkvLyBOb3cgc2V0IGFueSBkZWZhdWx0cyB3ZSBtaWdodCBoYXZlIG1pc3NlZCBvdXQgZWFy bGllcg0KKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlndXJlX2FyZ3MubGVuZ3RoOyBpKyspIHsNCisJ CWFyZyA9IGNvbmZpZ3VyZV9hcmdzW2ldOw0KKwkJaWYgKGFyZy5zZWVuKQ0KKwkJCWNvbnRpbnVl Ow0KKwkJYW5hbHl6ZWQgPSBhbmFseXplX2FyZyhhcmcuZGVmdmFsKTsNCisJCWFyZ3ZhbCA9IGFu YWx5emVkWzBdOw0KKw0KKwkJZXZhbCgiUEhQX0dUS18iICsgYXJnLnN5bXZhbCArICIgPSBhcmd2 YWw7Iik7DQorCX0NCisNCisJTUZPID0gRlNPLkNyZWF0ZVRleHRGaWxlKCJNYWtlZmlsZS5vYmpl Y3RzIiwgdHJ1ZSk7DQorCU1GRSA9IEZTTy5DcmVhdGVUZXh0RmlsZSgiTWFrZWZpbGUuZXh0ZW5z aW9ucyIsIHRydWUpOw0KKw0KKwlTVERPVVQuV3JpdGVCbGFua0xpbmVzKDEpOw0KKwlTVERPVVQu V3JpdGVMaW5lKCJTYXZpbmcgY29uZmlndXJlIG9wdGlvbnMgdG8gY29uZmlndXJlLmJhdCIpOw0K Kwl2YXIgbmljZWZpbGUgPSBGU08uQ3JlYXRlVGV4dEZpbGUoImNvbmZpZ3VyZS5iYXQiLCB0cnVl KTsNCisJbmljZWZpbGUuV3JpdGVMaW5lKG5pY2UpOw0KKwluaWNlZmlsZS5DbG9zZSgpOw0KKw0K KwlBQ19ERUZJTkUoJ0NPTkZJR1VSRV9DT01NQU5EJywgbmljZSk7DQorfQ0KKw0KK2Z1bmN0aW9u IGZpbmRfcGF0dGVybl9pbl9wYXRoKHBhdHRlcm4sIHBhdGgpIHsNCisNCisJaWYgKHBhdGggPT0g bnVsbCkgew0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCXZhciBkaXJzID0gcGF0aC5zcGxp dCgnOycpOw0KKwl2YXIgaTsNCisJdmFyIGl0ZW1zOw0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgZGly cy5sZW5ndGg7IGkrKykgew0KKwkJaXRlbXMgPSBnbG9iKGRpcnNbaV0gKyAiXFwiICsgcGF0dGVy bik7DQorCQlpZiAoaXRlbXMpIHsNCisJCQlyZXR1cm4gY29uZGVuc2VfcGF0aChpdGVtc1swXSk7 DQorCQl9DQorCX0NCisJcmV0dXJuIGZhbHNlOw0KK30NCisNCitmdW5jdGlvbiBBUkdfSVMob3B0 bmFtZSwgaGVscHRleHQsIGRlZnZhbCkgew0KKw0KKwljb25maWd1cmVfYXJnc1tjb25maWd1cmVf YXJncy5sZW5ndGhdID0gbmV3IENvbmZpZ3VyZUFyZygiIiwgb3B0bmFtZSwgaGVscHRleHQsIGRl ZnZhbCk7DQorfQ0KKw0KK2Z1bmN0aW9uIEFSR19XSVRIKG9wdG5hbWUsIGhlbHB0ZXh0LCBkZWZ2 YWwpIHsNCisNCisJY29uZmlndXJlX2FyZ3NbY29uZmlndXJlX2FyZ3MubGVuZ3RoXSA9IG5ldyBD b25maWd1cmVBcmcoIndpdGgiLCBvcHRuYW1lLCBoZWxwdGV4dCwgZGVmdmFsKTsNCit9DQorDQor ZnVuY3Rpb24gQVJHX0VOQUJMRShvcHRuYW1lLCBoZWxwdGV4dCwgZGVmdmFsKSB7DQorDQorCWNv bmZpZ3VyZV9hcmdzW2NvbmZpZ3VyZV9hcmdzLmxlbmd0aF0gPSBuZXcgQ29uZmlndXJlQXJnKCJl bmFibGUiLCBvcHRuYW1lLCBoZWxwdGV4dCwgZGVmdmFsKTsNCit9DQorDQorZnVuY3Rpb24gREVG SU5FKG5hbWUsIHZhbHVlKSB7DQorDQorCWlmIChjb25maWd1cmVfc3Vic3QuRXhpc3RzKG5hbWUp KSB7DQorCQljb25maWd1cmVfc3Vic3QuUmVtb3ZlKG5hbWUpOw0KKwl9DQorCWNvbmZpZ3VyZV9z dWJzdC5BZGQobmFtZSwgdmFsdWUpOw0KK30NCisNCitmdW5jdGlvbiBBQ19ERUZJTkUobmFtZSwg dmFsdWUsIGNvbW1lbnQsIHF1b3RlKSB7DQorDQorCWlmIChxdW90ZSA9PSBudWxsKSB7DQorCQlx dW90ZSA9IHRydWU7DQorCX0NCisJaWYgKHF1b3RlICYmIHR5cGVvZih2YWx1ZSkgPT0gInN0cmlu ZyIpIHsNCisJCXZhbHVlID0gJyInICsgdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKCcoWyJcXFxc XSknLCAiZyIpLCAnXFwkMScpICsgJyInOw0KKwl9IGVsc2UgaWYgKHZhbHVlLmxlbmd0aCA9PSAw KSB7DQorCQl2YWx1ZSA9ICciIic7DQorCX0NCisJdmFyIGl0ZW0gPSBuZXcgQXJyYXkodmFsdWUs IGNvbW1lbnQpOw0KKwlpZiAoY29uZmlndXJlX2hkci5FeGlzdHMobmFtZSkpIHsNCisJCXZhciBv cmlnX2l0ZW0gPSBjb25maWd1cmVfaGRyLkl0ZW0obmFtZSk7DQorCQlTVERPVVQuV3JpdGVMaW5l KCJBQ19ERUZJTkVbIiArIG5hbWUgKyAiXT0iICsgdmFsdWUgKyAiOiBpcyBhbHJlYWR5IGRlZmlu ZWQgdG8gIiArIGl0ZW1bMF0pOw0KKwl9IGVsc2Ugew0KKwkJY29uZmlndXJlX2hkci5BZGQobmFt ZSwgaXRlbSk7DQorCX0NCit9DQorDQorZnVuY3Rpb24gUEFUSF9QUk9HKHByb2duYW1lLCBhZGRp dGlvbmFsX3BhdGhzLCBzeW1ib2wpIHsNCisNCisJdmFyIGV4ZTsNCisJdmFyIHBsYWNlOw0KKwl2 YXIgY3lnX3BhdGggPSBQSFBfR1RLX0NZR1dJTiArICJcXGJpbjsiICsgUEhQX0dUS19DWUdXSU4g KyAiXFx1c3JcXGxvY2FsXFxiaW4iOw0KKw0KKwlleGUgPSBwcm9nbmFtZSArICIuZXhlIjsNCisN CisJaWYgKGFkZGl0aW9uYWxfcGF0aHMgPT0gbnVsbCkgew0KKwkJYWRkaXRpb25hbF9wYXRocyA9 IGN5Z19wYXRoOw0KKwl9IGVsc2Ugew0KKwkJYWRkaXRpb25hbF9wYXRocyArPSAiOyIgKyBjeWdf cGF0aDsNCisJfQ0KKw0KKwlwbGFjZSA9IHNlYXJjaF9wYXRocyhleGUsIGFkZGl0aW9uYWxfcGF0 aHMsICJQQVRIIik7DQorDQorCWlmIChwbGFjZSA9PSB0cnVlKSB7DQorCQlwbGFjZSA9IGV4ZTsN CisJfSBlbHNlIGlmIChwbGFjZSAhPSBmYWxzZSkgew0KKw0KKwkJaWYgKHBsYWNlLmxhc3RJbmRl eE9mKCJcXCIpICE9IHBsYWNlLmxlbmd0aCAtIDEpIHsNCisJCQlwbGFjZSArPSAiXFwiOw0KKwkJ fQ0KKw0KKwkJcGxhY2UgPSBwbGFjZSArIGV4ZTsNCisNCisJCWlmIChwbGFjZS5pbmRleE9mKCIg IikpIHsNCisJCQlwbGFjZSA9ICciJyArIHBsYWNlICsgJyInOw0KKwkJfQ0KKwl9DQorDQorCWlm IChwbGFjZSkgew0KKwkJaWYgKHN5bWJvbCA9PSBudWxsKSB7DQorCQkJc3ltYm9sID0gcHJvZ25h bWUudG9VcHBlckNhc2UoKTsNCisJCX0NCisJCURFRklORShzeW1ib2wsIHBsYWNlKTsNCisJfQ0K KwlyZXR1cm4gcGxhY2U7DQorfQ0KKw0KK2Z1bmN0aW9uIENIRUNLX0xJQihsaWJuYW1lcywgdGFy Z2V0LCBwYXRoX3RvX2NoZWNrLCBjb21tb25fbmFtZSkgew0KKw0KKwlTVERPVVQuV3JpdGUoIkNo ZWNraW5nIGZvciAiICsgbGlibmFtZXMgKyAiIC4uLiAiKTsNCisNCisJaWYgKGNvbW1vbl9uYW1l ID09IG51bGwgJiYgdGFyZ2V0ICE9IG51bGwpIHsNCisJCWNvbW1vbl9uYW1lID0gdGFyZ2V0Ow0K Kwl9DQorDQorCWlmIChwYXRoX3RvX2NoZWNrID09IG51bGwpIHsNCisJCXBhdGhfdG9fY2hlY2sg PSAiIjsNCisJfQ0KKw0KKwkvLyBpZiB0aGV5IHNwZWNpZmllZCBhIGNvbW1vbiBuYW1lIGZvciB0 aGUgcGFja2FnZSB0aGF0IGNvbnRhaW5zDQorCS8vIHRoZSBsaWJyYXJ5LCB0YWcgc29tZSB1c2Vm dWwgZGVmYXVsdHMgb24gdG8gdGhlIGVuZCBvZiB0aGUNCisJLy8gcGF0aCB0byBiZSBzZWFyY2hl ZA0KKwlpZiAoY29tbW9uX25hbWUgIT0gbnVsbCkgew0KKwkJcGF0aF90b19jaGVjayArPSAiOy4u XFwiICsgY29tbW9uX25hbWUgKyAiKiI7DQorCX0NCisNCisJLy8gRGV0ZXJtaW5lIHRhcmdldCBm b3IgYnVpbGQgZmxhZ3MNCisJaWYgKHRhcmdldCA9PSBudWxsKSB7DQorCQl0YXJnZXQgPSAiIjsN CisJfSBlbHNlIHsNCisJCXRhcmdldCA9ICJfIiArIHRhcmdldC50b1VwcGVyQ2FzZSgpLnJlcGxh Y2UobmV3IFJlZ0V4cCgiLSIsICJnIiksICJfIik7DQorCX0NCisNCisJLy8gRXhwYW5kIHBhdGgg dG8gaW5jbHVkZSBnZW5lcmFsIGRpcnMNCisJcGF0aF90b19jaGVjayArPSAiOyIgKyBwaHBfdXN1 YWxfbGliX3N1c3BlY3RzOw0KKw0KKwkvLyBJdCBpcyBjb21tb24gcHJhY3RpY2UgdG8gcHV0IGxp YnMgdW5kZXIgb25lIG9mIHRoZXNlIGRpciBuYW1lcw0KKwl2YXIgc3ViZGlycyA9IG5ldyBBcnJh eShQSFBfR1RLX0RFQlVHID09ICJ5ZXMiID8gIkRlYnVnIiA6ICJSZWxlYXNlIiwgImxpYiIsICJs aWJzIiwgImxpYmV4ZWMiKTsNCisNCisJLy8gbGlibmFtZXMgY2FuIGJlIDsgc2VwYXJhdGVkIGxp c3Qgb2YgYWNjZXB0ZWQgbGlicmFyeSBuYW1lcw0KKwlsaWJuYW1lcyA9IGxpYm5hbWVzLnNwbGl0 KCc7Jyk7DQorDQorCXZhciBpLCBqLCBrLCBsaWJuYW1lOw0KKwl2YXIgbG9jYXRpb24gPSBmYWxz ZTsNCisJdmFyIHBhdGggPSBwYXRoX3RvX2NoZWNrLnNwbGl0KCc7Jyk7DQorDQorCWZvciAoaSA9 IDA7IGkgPCBsaWJuYW1lcy5sZW5ndGg7IGkrKykgew0KKwkJbGlibmFtZSA9IGxpYm5hbWVzW2ld Ow0KKw0KKwkJZm9yIChrID0gMDsgayA8IHBhdGgubGVuZ3RoOyBrKyspIHsNCisJCQlsb2NhdGlv biA9IGdsb2IocGF0aFtrXSArICJcXCIgKyBsaWJuYW1lKTsNCisJCQlpZiAobG9jYXRpb24pIHsN CisJCQkJbG9jYXRpb24gPSBsb2NhdGlvblswXTsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJCWZv ciAoaiA9IDA7IGogPCBzdWJkaXJzLmxlbmd0aDsgaisrKSB7DQorCQkJCWxvY2F0aW9uID0gZ2xv YihwYXRoW2tdICsgIlxcIiArIHN1YmRpcnNbal0gKyAiXFwiICsgbGlibmFtZSk7DQorCQkJCWlm IChsb2NhdGlvbikgew0KKwkJCQkJbG9jYXRpb24gPSBsb2NhdGlvblswXTsNCisJCQkJCWJyZWFr Ow0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChsb2NhdGlvbikNCisJCQkJYnJlYWs7DQorCQl9DQor DQorCQlpZiAobG9jYXRpb24pIHsNCisJCQlsb2NhdGlvbiA9IGNvbmRlbnNlX3BhdGgobG9jYXRp b24pOw0KKwkJCXZhciBsaWJkaXIgPSBGU08uR2V0UGFyZW50Rm9sZGVyTmFtZShsb2NhdGlvbik7 DQorCQkJbGlibmFtZSA9IEZTTy5HZXRGaWxlTmFtZShsb2NhdGlvbik7DQorCQkJQUREX0ZMQUco IkxERkxBR1MiICsgdGFyZ2V0LCAnL2xpYnBhdGg6IicgKyBsaWJkaXIgKyAnIiAnKTsNCisJCQlB RERfRkxBRygiTElCUyIgKyB0YXJnZXQsIGxpYm5hbWUpOw0KKw0KKwkJCVNURE9VVC5Xcml0ZUxp bmUoCWxvY2F0aW9uKTsNCisNCisJCQlyZXR1cm4gbG9jYXRpb247DQorCQl9DQorDQorCQkvLyBD aGVjayBpbiB0aGVpciBzdGFuZGFyZCBsaWIgcGF0aA0KKwkJbG9jYXRpb24gPSBmaW5kX3BhdHRl cm5faW5fcGF0aChsaWJuYW1lLCBXc2hTaGVsbC5FbnZpcm9ubWVudCgiUHJvY2VzcyIpLkl0ZW0o IkxJQiIpKTsNCisNCisJCWlmIChsb2NhdGlvbikgew0KKwkJCWxvY2F0aW9uID0gY29uZGVuc2Vf cGF0aChsb2NhdGlvbik7DQorCQkJbGlibmFtZSA9IEZTTy5HZXRGaWxlTmFtZShsb2NhdGlvbik7 DQorCQkJQUREX0ZMQUcoIkxJQlMiICsgdGFyZ2V0LCBsaWJuYW1lKTsNCisNCisJCQlTVERPVVQu V3JpdGVMaW5lKCIJPGluIExJQiBwYXRoPiAiICsgbGlibmFtZSk7DQorCQkJcmV0dXJuIGxvY2F0 aW9uOw0KKwkJfQ0KKwl9DQorDQorCUVSUk9SKCIJIiArIGxpYm5hbWUgKyAiIG5vdCBmb3VuZCAt IGFib3J0aW5nIGNvbmZpZ3VyZSBwcm9jZXNzIik7DQorDQorCXJldHVybiBmYWxzZTsNCit9DQor DQorZnVuY3Rpb24gQ0hFQ0tfSEVBREVSKGhlYWRlcl9uYW1lLCBwYXRoX3RvX2NoZWNrKSB7DQor CWlmICghcGF0aF90b19jaGVjaykgew0KKwkJcGF0aF90b19jaGVjayA9IHBocF91c3VhbF9pbmNs dWRlX3N1c3BlY3RzOw0KKwl9DQorDQorCXZhciBwYXRoID0gc2VhcmNoX3BhdGhzKGhlYWRlcl9u YW1lLCBwYXRoX3RvX2NoZWNrLCAiSU5DTFVERSIpOw0KKw0KKwlpZiAoIXBhdGgpIHsNCisJCUVS Uk9SKCIJIiArIGhlYWRlcl9uYW1lICsgIiBub3QgZm91bmQgLSBhYm9ydGluZyBjb25maWd1cmUg cHJvY2VzcyIpOw0KKwl9DQorDQorCXJldHVybiBwYXRoOw0KK30NCisNCisvLyB1c2UgdGhpcyBm b3IgdmVyc2lvbiBjaGVja2luZw0KK2Z1bmN0aW9uIEdSRVBfSEVBREVSKGhlYWRlcl9uYW1lLCBy ZWdleCwgcGF0aF90b19jaGVjaykgew0KKw0KKwl2YXIgYyA9IGZhbHNlOw0KKw0KKwlpZiAoRlNP LkZpbGVFeGlzdHMocGF0aF90b19jaGVjayArICJcXCIgKyBoZWFkZXJfbmFtZSkpIHsNCisJCWMg PSBmaWxlX2dldF9jb250ZW50cyhwYXRoX3RvX2NoZWNrICsgIlxcIiArIGhlYWRlcl9uYW1lKTsN CisJfQ0KKw0KKwlpZiAoIWMpIHsNCisJCS8qIGxvb2sgaW4gdGhlIGluY2x1ZGUgcGF0aCAqLw0K Kw0KKwkJdmFyIHAgPSBzZWFyY2hfcGF0aHMoaGVhZGVyX25hbWUsIHBhdGhfdG9fY2hlY2ssICJJ TkNMVURFIik7DQorDQorCQlpZiAodHlwZW9mKHApID09ICJzdHJpbmciKSB7DQorCQkJYyA9IGZp bGVfZ2V0X2NvbnRlbnRzKHApOw0KKwkJfQ0KKw0KKwkJaWYgKCFjKSB7DQorCQkJcmV0dXJuIGZh bHNlOw0KKwkJfQ0KKwl9DQorDQorCWlmICh0eXBlb2YocmVnZXgpID09ICJzdHJpbmciKSB7DQor CQlyZWdleCA9IG5ldyBSZWdFeHAocmVnZXgpOw0KKwl9DQorDQorCWlmIChjLm1hdGNoKHJlZ2V4 KSkgew0KKwkJLyogY2FsbGVyIGNhbiBub3cgdXNlIFJlZ0V4cC4kMSBldGMuIHRvIGdldCBhdCBw YXR0ZXJucyAqLw0KKwkJcmV0dXJuIHRydWU7DQorCX0NCisJcmV0dXJuIGZhbHNlOw0KK30NCisN CitmdW5jdGlvbiBDSEVDS19IRUFERVJfQUREX0lOQ0xVREUoaGVhZGVyX25hbWUsIGZsYWdfbmFt ZSwgcGF0aF90b19jaGVjaywgdXNlX2VudiwgYWRkX2Rpcl9wYXJ0LCBhZGRfdG9fZmxhZ19vbmx5 KSB7DQorDQorCXZhciBkaXJfcGFydF90b19hZGQgPSAiIjsNCisNCisJaWYgKHVzZV9lbnYgPT0g bnVsbCkgew0KKwkJdXNlX2VudiA9IHRydWU7DQorCX0NCisNCisJLy8gaWYgdHJ1ZSwgYWRkIHRo ZSBkaXIgcGFydCBvZiB0aGUgaGVhZGVyX25hbWUgdG8gdGhlIGluY2x1ZGUgcGF0aA0KKwlpZiAo YWRkX2Rpcl9wYXJ0ID09IG51bGwpIHsNCisJCWFkZF9kaXJfcGFydCA9IGZhbHNlOw0KKwl9IGVs c2UgaWYgKGFkZF9kaXJfcGFydCkgew0KKwkJdmFyIGJhc2VuYW1lID0gRlNPLkdldEZpbGVOYW1l KGhlYWRlcl9uYW1lKTsNCisJCWRpcl9wYXJ0X3RvX2FkZCA9ICJcXCIgKyBoZWFkZXJfbmFtZS5z dWJzdHIoMCwgaGVhZGVyX25hbWUubGVuZ3RoIC0gYmFzZW5hbWUubGVuZ3RoIC0gMSk7DQorCX0N CisNCisJaWYgKHBhdGhfdG9fY2hlY2sgPT0gbnVsbCkgew0KKwkJcGF0aF90b19jaGVjayA9IHBo cF91c3VhbF9pbmNsdWRlX3N1c3BlY3RzOw0KKwl9IGVsc2Ugew0KKwkJcGF0aF90b19jaGVjayAr PSAiOyIgKyBwaHBfdXN1YWxfaW5jbHVkZV9zdXNwZWN0czsNCisJfQ0KKw0KKwl2YXIgcCA9IHNl YXJjaF9wYXRocyhoZWFkZXJfbmFtZSwgcGF0aF90b19jaGVjaywgdXNlX2VudiA/ICJJTkNMVURF IiA6IG51bGwpOw0KKwl2YXIgaGF2ZSA9IDA7DQorCXZhciBzeW07DQorDQorCWlmICh0eXBlb2Yo cCkgPT0gInN0cmluZyIpIHsNCisJCUFERF9GTEFHKGZsYWdfbmFtZSwgJy9JICInICsgcCArIGRp cl9wYXJ0X3RvX2FkZCArICciICcpOw0KKwl9DQorDQorCWhhdmUgPSBwID8gMSA6IDANCisNCisJ c3ltID0gaGVhZGVyX25hbWUudG9VcHBlckNhc2UoKTsNCisJc3ltID0gc3ltLnJlcGxhY2UobmV3 IFJlZ0V4cCgiW1xcXFwvXC4tXSIsICJnIiksICJfIik7DQorDQorCWlmICh0eXBlb2YoYWRkX3Rv X2ZsYWdfb25seSkgPT0gdW5kZWZpbmVkICYmDQorCQkJZmxhZ19uYW1lLm1hdGNoKG5ldyBSZWdF eHAoIl5DRkxBR1NfKC4qKSQiKSkpIHsNCisJCWFkZF90b19mbGFnX29ubHkgPSB0cnVlOw0KKwl9 DQorDQorCWlmICh0eXBlb2YoYWRkX3RvX2ZsYWdfb25seSkgIT0gInVuZGVmaW5lZCIpIHsNCisJ CUFERF9GTEFHKGZsYWdfbmFtZSwgIi9EIEhBVkVfIiArIHN5bSArICI9IiArIGhhdmUpOw0KKwl9 IGVsc2Ugew0KKwkJQUNfREVGSU5FKCJIQVZFXyIgKyBzeW0sIGhhdmUsICJoYXZlIHRoZSAiICsg aGVhZGVyX25hbWUgKyAiIGhlYWRlciBmaWxlIik7DQorCX0NCisNCisJcmV0dXJuIHA7DQorfQ0K Kw0KK2Z1bmN0aW9uIEVYVEVOU0lPTihleHRuYW1lLCBmaWxlX2xpc3QsIHNoYXJlZCwgY2ZsYWdz LCBkbGxuYW1lLCBvYmpfZGlyKSB7DQorDQorCXZhciBkbGxmbGFncyA9ICIiOw0KKwl2YXIgZGVw X2xpYnMgPSAiIjsNCisJdmFyIEVYVCA9IGV4dG5hbWUudG9VcHBlckNhc2UoKS5yZXBsYWNlKG5l dyBSZWdFeHAoIi0iLCAiZyIpLCAiXyIpOw0KKwl2YXIgZXh0bmFtZV9mb3JfcHJpbnRpbmc7DQor CXZhciByZXNfdmFyID0gIiI7DQorCXZhciBmaWxlOw0KKw0KKwlpZiAoY2ZsYWdzID09IG51bGwp IHsNCisJCWNmbGFncyA9ICIiOw0KKwl9DQorDQorCWlmICh0eXBlb2Yob2JqX2RpcikgPT0gInVu ZGVmaW5lZCIpIHsNCisNCisJCWV4dG5hbWVfZm9yX3ByaW50aW5nID0gY29uZmlndXJlX21vZHVs ZV9kaXJuYW1lOw0KKw0KKwl9IGVsc2Ugew0KKw0KKwkJZXh0bmFtZV9mb3JfcHJpbnRpbmcgPSBj b25maWd1cmVfbW9kdWxlX2Rpcm5hbWUgKyAiICh2aWEgIiArIG9ial9kaXIgKyAiKSI7DQorCX0N CisNCisJU1RET1VULldyaXRlTGluZSgiRW5hYmxpbmcgZXh0ZW5zaW9uICIgKyBleHRuYW1lX2Zv cl9wcmludGluZyk7DQorDQorCWlmIChleHRuYW1lID09ICdwaHAtZ3RrJykgew0KKwkJY2ZsYWdz ID0gIi9EIENPTVBJTEVfRExfIiArIEVYVCArICIyIC9EICIgKyBFWFQgKyAiX0VYUE9SVFM9MSIg KyBjZmxhZ3M7DQorCQlmaWxlID0gTUZPOw0KKwl9IGVsc2Ugew0KKwkJY2ZsYWdzID0gIi9EIFBI UF9HVEtfQ09NUElMRV9ETF8iICsgRVhUICsgIiAvRCAiICsgRVhUICsgIl9FWFBPUlRTPTEiICsg Y2ZsYWdzOw0KKwkJZmlsZSA9IE1GRTsNCisJfQ0KKw0KKwlmaWxlLldyaXRlQmxhbmtMaW5lcygx KTsNCisJZmlsZS5Xcml0ZUxpbmUoIiMgb2JqZWN0cyBmb3IgRVhUICIgKyBleHRuYW1lKTsNCisJ ZmlsZS5Xcml0ZUJsYW5rTGluZXMoMSk7DQorDQorCUFERF9TT1VSQ0VTKGNvbmZpZ3VyZV9tb2R1 bGVfZGlybmFtZSwgZmlsZV9saXN0LCBleHRuYW1lLCBvYmpfZGlyKTsNCisNCisJZmlsZS5Xcml0 ZUJsYW5rTGluZXMoMSk7DQorDQorCS8vIFBIUC1HVEsgYW5kIGl0cyBleHRlbnNpb25zIGFyZSBh bHdheXMgYnVpbHQgYXMgc2hhcmVkIGZvciBub3cNCisNCisJaWYgKGRsbG5hbWUgPT0gbnVsbCkg ew0KKwkJaWYgKGV4dG5hbWUgPT0gJ3BocC1ndGsnKSB7DQorCQkJZGxsbmFtZSA9ICJwaHBfZ3Rr Mi5kbGwiOw0KKwkJCXJlc25hbWUgPSBnZW5lcmF0ZV92ZXJzaW9uX2luZm9fcmVzb3VyY2UoZGxs bmFtZSwgY29uZmlndXJlX21vZHVsZV9kaXJuYW1lKTsNCisJCQlyZXNfdmFyID0gIiAkKFBIUEdU S0RMTF9SRVMpIjsNCisJCX0gZWxzZSB7DQorCQkJY2ZsYWdzID0gIi9EIEdUS19TSEFSRUQ9MSAi ICsgY2ZsYWdzOw0KKwkJCWRsbG5hbWUgPSAicGhwX2d0a18iICsgZXh0bmFtZSArICIyLmRsbCI7 DQorCQkJZGxsZmxhZ3MgPSAiICQoRExMX0xERkxBR1MpIjsNCisJCQlkZXBfbGlicyA9ICIgJChC VUlMRF9ESVIpXFwkKFBIUEdUS0xJQikgJChMSUJTX1BIUF9HVEspIjsNCisJCX0NCisJfQ0KKwl2 YXIgbGlibmFtZSA9IGRsbG5hbWUuc3Vic3RyaW5nKDAsIGRsbG5hbWUubGVuZ3RoIC0gNCkgKyAi LmxpYiI7DQorCXZhciBsZCA9ICJAJChMRCkiOw0KKw0KKwlBRERfRkxBRygiRVhUX1RBUkdFVFMi LCAiJChCVUlMRF9ESVIpXFwiICsgZGxsbmFtZSk7DQorCW1ha2VfYnVpbGRzW21ha2VfYnVpbGRz Lmxlbmd0aF0gPSBleHRuYW1lICsgIjogJChCVUlMRF9ESVIpXFwiICsgZGxsbmFtZTsNCisNCisJ ZmlsZS5Xcml0ZUxpbmUoIiQoQlVJTERfRElSKVxcIiArIGRsbG5hbWUgKyAiOiAkKCIgKyBFWFQg KyAiX0dMT0JBTF9PQkpTKSIgKyByZXNfdmFyKTsNCisJZmlsZS5Xcml0ZUxpbmUoIlx0IiArIGxk ICsgIiAvb3V0OiQoQlVJTERfRElSKVxcIiArIGRsbG5hbWUgKyAiICQoTERGTEFHU18iICsgRVhU ICsgIikiICsgZGxsZmxhZ3MgKyAiICQoTERGTEFHUykgJCgiICsgRVhUICsgIl9HTE9CQUxfT0JK UykgJChMSUJTXyIgKyBFWFQgKyAiKSIgKyBkZXBfbGlicyArICIgJChMSUJTKSIgKyByZXNfdmFy KTsNCisNCisJZmlsZS5Xcml0ZUJsYW5rTGluZXMoMSk7DQorCWZpbGUuV3JpdGVMaW5lKGRsbG5h bWUgKyAiOiAkKEJVSUxEX0RJUilcXCIgKyBkbGxuYW1lKTsNCisJZmlsZS5Xcml0ZUxpbmUoIlx0 QGVjaG8gRVhUICIgKyBleHRuYW1lICsgIiBidWlsZCBjb21wbGV0ZSIpOw0KKwlmaWxlLldyaXRl QmxhbmtMaW5lcygxKTsNCisNCisJQUREX0ZMQUcoIkNGTEFHU18iICsgRVhULCBjZmxhZ3MpOw0K K30NCisNCitmdW5jdGlvbiBBRERfU09VUkNFUyhkaXIsIGZpbGVfbGlzdCwgdGFyZ2V0LCBvYmpf ZGlyKSB7DQorDQorCXZhciBpOw0KKwl2YXIgdHY7DQorCXZhciBzcmMsIG9iaiwgc3ltLCBmbGFn czsNCisJdmFyIGNvcmVfY2ZsYWdzID0gIiI7DQorCXZhciBmaWxlOw0KKw0KKwlzeW0gPSB0YXJn ZXQudG9VcHBlckNhc2UoKS5yZXBsYWNlKG5ldyBSZWdFeHAoIi0iLCAiZyIpLCAiXyIpICsgIl9H TE9CQUxfT0JKUyI7DQorCWZsYWdzID0gIkNGTEFHU18iICsgdGFyZ2V0LnRvVXBwZXJDYXNlKCku cmVwbGFjZShuZXcgUmVnRXhwKCItIiwgImciKSwgIl8iKTsNCisNCisJaWYgKGNvbmZpZ3VyZV9z dWJzdC5FeGlzdHMoc3ltKSkgew0KKwkJdHYgPSBjb25maWd1cmVfc3Vic3QuSXRlbShzeW0pOw0K Kwl9IGVsc2Ugew0KKwkJdHYgPSAiIjsNCisJfQ0KKw0KKwlpZiAodGFyZ2V0ICE9ICJwaHAtZ3Rr Iikgew0KKwkJZmlsZSA9IE1GRTsNCisJCWNvcmVfY2ZsYWdzID0gIiQoQ0ZMQUdTX1BIUF9HVEsp ICI7DQorCX0gZWxzZSB7DQorCQlmaWxlID0gTUZPOw0KKwl9DQorDQorCWZpbGVfbGlzdCA9IGZp bGVfbGlzdC5zcGxpdChuZXcgUmVnRXhwKCJcXHMrIikpOw0KKwlmaWxlX2xpc3Quc29ydCgpOw0K Kw0KKwl2YXIgcmUgPSBuZXcgUmVnRXhwKCJcLlthLXowLTlBLVpcLV0rJCIpOw0KKw0KKwlkaXIg PSBkaXIucmVwbGFjZShuZXcgUmVnRXhwKCIvIiwgImciKSwgIlxcIik7DQorCXZhciBvYmpzX2xp bmUgPSAiIjsNCisJdmFyIHNyY3NfbGluZSA9ICIiOw0KKw0KKwl2YXIgc3ViX2J1aWxkID0gIiQo QlVJTERfRElSKVxcIjsNCisNCisJLyogaWYgbW9kdWxlIGRpciBpcyBub3QgYSBjaGlsZCBvZiB0 aGUgbWFpbiBzb3VyY2UgZGlyLA0KKwkgKiB3ZSBuZWVkIHRvIHR3ZWFrIGl0OyB3ZSBzaG91bGQg aGF2ZSBkZXRlY3RlZCBzdWNoIGENCisJICogY2FzZSBpbiBjb25kZW5zZV9wYXRoIGFuZCByZXdy aXR0ZW4gdGhlIHBhdGggdG8NCisJICogYmUgcmVsYXRpdmUuDQorCSAqIFRoaXMgcHJvYmFibHkg YnJlYWtzIGZvciBub24tc2libGluZyBkaXJzICovDQorCWlmIChvYmpfZGlyID09IG51bGwpIHsN CisJCXZhciBidWlsZF9kaXIgPSBkaXIucmVwbGFjZShuZXcgUmVnRXhwKCJeLi5cXFxcIiksICIi KTsNCisJfSBlbHNlIHsNCisJCXZhciBidWlsZF9kaXIgPSBvYmpfZGlyLnJlcGxhY2UobmV3IFJl Z0V4cCgiXi4uXFxcXCIpLCAiIik7DQorCX0NCisNCisJdmFyIG1hbmdsZV9kaXIgPSBidWlsZF9k aXIucmVwbGFjZShuZXcgUmVnRXhwKCJbXFxcXC8uKy1dIiwgImciKSwgIl8iKTsNCisNCisJLyog a2lsbCB0cmFpbGluZyB1bmRlcnNjb3JlcyAqLw0KKwlpZiAobWFuZ2xlX2Rpci5zdWJzdHJpbmco bWFuZ2xlX2Rpci5sZW5ndGggLSAxKSA9PSAiXyIpIHsNCisJCW1hbmdsZV9kaXIgPSBtYW5nbGVf ZGlyLnN1YnN0cmluZygwLCBtYW5nbGVfZGlyLmxlbmd0aCAtIDEpOw0KKwl9DQorDQorCXZhciBi ZF9mbGFnc19uYW1lID0gIkNGTEFHU19CRF8iICsgbWFuZ2xlX2Rpci50b1VwcGVyQ2FzZSgpOw0K Kw0KKwl2YXIgZGlycyA9IGJ1aWxkX2Rpci5zcGxpdCgiXFwiKTsNCisJdmFyIGksIGQgPSAiIjsN CisJZm9yIChpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyBpKyspIHsNCisJCWQgKz0gZGlyc1tpXTsN CisJCWJ1aWxkX2RpcnNbYnVpbGRfZGlycy5sZW5ndGhdID0gZDsNCisJCWQgKz0gIlxcIjsNCisJ fQ0KKwlzdWJfYnVpbGQgKz0gZDsNCisNCisJREVGSU5FKGJkX2ZsYWdzX25hbWUsICIgL0ZkIiAr IHN1Yl9idWlsZCArICIgL0ZwIiArIHN1Yl9idWlsZCArICIgL0ZSIiArIHN1Yl9idWlsZCk7DQor DQorCWZvciAoaSBpbiBmaWxlX2xpc3QpIHsNCisJCXNyYyA9IGZpbGVfbGlzdFtpXTsNCisJCW9i aiA9IHNyYy5yZXBsYWNlKHJlLCAiLm9iaiIpOw0KKwkJdHYgKz0gIiAiICsgc3ViX2J1aWxkICsg b2JqOw0KKw0KKwkJZmlsZS5Xcml0ZUxpbmUoc3ViX2J1aWxkICsgb2JqICsgIjogIiArIGRpciAr ICJcXCIgKyBzcmMpOw0KKwkJZmlsZS5Xcml0ZUxpbmUoIlx0QCQoQ0MpICQoIiArIGZsYWdzICsg IikgIiArIGNvcmVfY2ZsYWdzICsgIiQoQ0ZMQUdTKSAkKCIgKyBiZF9mbGFnc19uYW1lICsgIikg L2MgIiArIGRpciArICJcXCIgKyBzcmMgKyAiIC9GbyIgKyBzdWJfYnVpbGQgKyBvYmopOw0KKwl9 DQorDQorCURFRklORShzeW0sIHR2KTsNCit9DQorDQorZnVuY3Rpb24gQUREX0ZMQUcobmFtZSwg ZmxhZ3MsIHRhcmdldCkgew0KKw0KKwlpZiAodGFyZ2V0ICE9IG51bGwpIHsNCisJCW5hbWUgPSB0 YXJnZXQudG9VcHBlckNhc2UoKSArICJfIiArIG5hbWU7DQorCX0NCisJaWYgKGNvbmZpZ3VyZV9z dWJzdC5FeGlzdHMobmFtZSkpIHsNCisJCXZhciBjdXJyX2ZsYWdzID0gY29uZmlndXJlX3N1YnN0 Lkl0ZW0obmFtZSk7DQorDQorCQlpZiAoY3Vycl9mbGFncy5pbmRleE9mKGZsYWdzKSA+PSAwKSB7 DQorCQkJcmV0dXJuOw0KKwkJfQ0KKw0KKwkJZmxhZ3MgPSBmbGFncyArICIgIiArIGN1cnJfZmxh Z3M7DQorCQljb25maWd1cmVfc3Vic3QuUmVtb3ZlKG5hbWUpOw0KKwl9DQorCWNvbmZpZ3VyZV9z dWJzdC5BZGQobmFtZSwgZmxhZ3MpOw0KK30NCisNCitmdW5jdGlvbiBnZXRfZGVmaW5lKG5hbWUp IHsNCisNCisJcmV0dXJuIGNvbmZpZ3VyZV9zdWJzdC5JdGVtKG5hbWUpOw0KK30NCisNCitmdW5j dGlvbiBFUlJPUihtc2cpIHsNCisNCisgICAgU1RERVJSLldyaXRlQmxhbmtMaW5lcygyKTsNCisJ U1RERVJSLldyaXRlTGluZSgiRVJST1I6ICIgKyBtc2cpOw0KKwlXU2NyaXB0LlF1aXQoMyk7DQor fQ0KKw0KK2Z1bmN0aW9uIFdBUk5JTkcobXNnKSB7DQorDQorCVNUREVSUi5Xcml0ZUxpbmUoIldB Uk5JTkc6ICIgKyBtc2cpOw0KKwlTVERFUlIuV3JpdGVCbGFua0xpbmVzKDEpOw0KK30NCisNCisv KiBTZWFyY2hlcyBhIHNldCBvZiBwYXRocyBmb3IgYSBmaWxlOyByZXR1cm5zIHRoZSBkaXIgaW4g d2hpY2ggdGhlIGZpbGUgd2FzIGZvdW5kLCB0cnVlIGlmIGl0DQord2FzIGZvdW5kIGluIHRoZSBk ZWZhdWx0IGVudiBwYXRoLCBvciBmYWxzZSBpZiBpdCB3YXMgbm90IGZvdW5kIGF0IGFsbC4gZW52 X25hbWUgaXMgdGhlIG9wdGlvbmFsDQorbmFtZSBvZiBhbiBlbnYgdmFyIHNwZWNpZnlpbmcgdGhl IGRlZmF1bHQgcGF0aCB0byBzZWFyY2ggKi8NCitmdW5jdGlvbiBzZWFyY2hfcGF0aHModGhpbmdf dG9fZmluZCwgZXhwbGljaXRfcGF0aCwgZW52X25hbWUpIHsNCisNCisJdmFyIGksIGZvdW5kID0g ZmFsc2UsIHBsYWNlID0gZmFsc2UsIGZpbGUsIGVudjsNCisNCisJU1RET1VULldyaXRlKCJDaGVj a2luZyBmb3IgIiArIHRoaW5nX3RvX2ZpbmQgKyAiIC4uLiAiKTsNCisNCisJaWYgKHRoaW5nX3Rv X2ZpbmQubGVuZ3RoIDwgNikgew0KKwkJU1RET1VULldyaXRlKCIJIik7DQorCX0NCisNCisJdGhp bmdfdG9fZmluZCA9IHRoaW5nX3RvX2ZpbmQucmVwbGFjZShuZXcgUmVnRXhwKCIvIiwgImciKSwg IlxcIik7DQorDQorCWlmIChleHBsaWNpdF9wYXRoICE9IG51bGwpIHsNCisJCWlmICh0eXBlb2Yo ZXhwbGljaXRfcGF0aCkgPT0gInN0cmluZyIpIHsNCisJCQlleHBsaWNpdF9wYXRoID0gZXhwbGlj aXRfcGF0aC5zcGxpdCgiOyIpOw0KKwkJfQ0KKw0KKwkJZm9yIChpID0gMDsgaSA8IGV4cGxpY2l0 X3BhdGgubGVuZ3RoOyBpKyspIHsNCisJCQlmaWxlID0gZ2xvYihleHBsaWNpdF9wYXRoW2ldICsg IlxcIiArIHRoaW5nX3RvX2ZpbmQpOw0KKwkJCWlmIChmaWxlKSB7DQorCQkJCWZvdW5kID0gdHJ1 ZTsNCisJCQkJcGxhY2UgPSBmaWxlWzBdOw0KKwkJCQlwbGFjZSA9IHBsYWNlLnN1YnN0cigwLCBw bGFjZS5sZW5ndGggLSB0aGluZ190b19maW5kLmxlbmd0aCAtIDEpOw0KKwkJCQlicmVhazsNCisJ CQl9DQorCQl9DQorCX0NCisNCisJaWYgKCFmb3VuZCAmJiBlbnZfbmFtZSAhPSBudWxsKSB7DQor CQllbnYgPSBXc2hTaGVsbC5FbnZpcm9ubWVudCgiUHJvY2VzcyIpLkl0ZW0oZW52X25hbWUpOw0K KwkJZW52ID0gZW52LnNwbGl0KCI7Iik7DQorCQlmb3IgKGkgPSAwOyBpIDwgZW52Lmxlbmd0aDsg aSsrKSB7DQorCQkJZmlsZSA9IGdsb2IoZW52W2ldICsgIlxcIiArIHRoaW5nX3RvX2ZpbmQpOw0K KwkJCWlmIChmaWxlKSB7DQorCQkJCWZvdW5kID0gdHJ1ZTsNCisJCQkJcGxhY2UgPSB0cnVlOw0K KwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCX0NCisNCisJaWYgKGZvdW5kICYmIHBsYWNlID09 IHRydWUpIHsNCisJCVNURE9VVC5Xcml0ZUxpbmUoIgk8aW4gZGVmYXVsdCBwYXRoPiIpOw0KKwkJ cGxhY2UgPSBmaWxlWzBdOw0KKwkJcGxhY2UgPSBwbGFjZS5zdWJzdHIoMCwgcGxhY2UubGVuZ3Ro IC0gdGhpbmdfdG9fZmluZC5sZW5ndGggLSAxKTsNCisJfSBlbHNlIGlmIChmb3VuZCkgew0KKwkJ U1RET1VULldyaXRlTGluZSgiCSIgKyBwbGFjZSk7DQorCX0gZWxzZSB7DQorCQlTVERPVVQuV3Jp dGVMaW5lKCIJPG5vdCBmb3VuZD4iKTsNCisJfQ0KKwlyZXR1cm4gcGxhY2U7DQorfQ0KKw0KK2Z1 bmN0aW9uIHdvcmRfd3JhcF9hbmRfaW5kZW50KGluZGVudCwgdGV4dCwgbGluZV9zdWZmaXgsIGlu ZGVudF9jaGFyKSB7DQorDQorCWlmICh0ZXh0ID09IG51bGwpIHsNCisJCXJldHVybiAiIjsNCisJ fQ0KKw0KKwl2YXIgd29yZHMgPSB0ZXh0LnNwbGl0KG5ldyBSZWdFeHAoIlxccysiLCAiZyIpKTsN CisJdmFyIGkgPSAwOw0KKwl2YXIgcmV0X3RleHQgPSAiIjsNCisJdmFyIHRoaXNfbGluZSA9ICIi Ow0KKwl2YXIgdDsNCisJdmFyIHNwYWNlID0gIiI7DQorCXZhciBsaW5lcyA9IDA7DQorDQorCWlm IChsaW5lX3N1ZmZpeCA9PSBudWxsKSB7DQorCQlsaW5lX3N1ZmZpeCA9ICIiOw0KKwl9DQorDQor CWlmIChpbmRlbnRfY2hhciA9PSBudWxsKSB7DQorCQlpbmRlbnRfY2hhciA9ICIgIjsNCisJfQ0K Kw0KKwlmb3IgKGkgPSAwOyBpIDwgaW5kZW50OyBpKyspIHsNCisJCXNwYWNlICs9IGluZGVudF9j aGFyOw0KKwl9DQorDQorCWZvciAoaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7IGkrKykgew0KKwkJ aWYgKHRoaXNfbGluZS5sZW5ndGgpIHsNCisJCQl0ID0gdGhpc19saW5lICsgIiAiICsgd29yZHNb aV07DQorCQl9IGVsc2Ugew0KKwkJCXQgPSB3b3Jkc1tpXTsNCisJCX0NCisNCisJCWlmICh0Lmxl bmd0aCArIGluZGVudCA+IDc4KSB7DQorCQkJaWYgKGxpbmVzKyspIHsNCisJCQkJcmV0X3RleHQg Kz0gc3BhY2U7DQorCQkJfQ0KKwkJCXJldF90ZXh0ICs9IHRoaXNfbGluZSArIGxpbmVfc3VmZml4 ICsgIlxyXG4iOw0KKwkJCXRoaXNfbGluZSA9ICIiOw0KKwkJfQ0KKw0KKwkJaWYgKHRoaXNfbGlu ZS5sZW5ndGgpIHsNCisJCQl0aGlzX2xpbmUgKz0gIiAiICsgd29yZHNbaV07DQorCQl9IGVsc2Ug ew0KKwkJCXRoaXNfbGluZSA9IHdvcmRzW2ldOw0KKwkJfQ0KKwl9DQorDQorCWlmICh0aGlzX2xp bmUubGVuZ3RoKSB7DQorCQlpZiAobGluZXMpDQorCQkJcmV0X3RleHQgKz0gc3BhY2U7DQorCQly ZXRfdGV4dCArPSB0aGlzX2xpbmU7DQorCX0NCisNCisJcmV0dXJuIHJldF90ZXh0Ow0KK30NCisN CitmdW5jdGlvbiBmaWxlX2dldF9jb250ZW50cyhmaWxlbmFtZSkgew0KKw0KKwl2YXIgZiwgYzsN CisNCisJdHJ5IHsNCisJCWYgPSBGU08uT3BlblRleHRGaWxlKGZpbGVuYW1lLCAxKTsNCisJCWMg PSBmLlJlYWRBbGwoKTsNCisJCWYuQ2xvc2UoKTsNCisJCXJldHVybiBjOw0KKwl9IGNhdGNoIChl KSB7DQorCQlTVERPVVQuV3JpdGVMaW5lKCJQcm9ibGVtIHJlYWRpbmcgIiArIGZpbGVuYW1lKTsN CisJCXJldHVybiBmYWxzZTsNCisJfQ0KK30NCisNCitmdW5jdGlvbiBnZW5lcmF0ZV9maWxlcygp IHsNCisNCisJdmFyIGksIGRpciwgYmQsIGxhc3Q7DQorDQorCWdlbmVyYXRlX3NvdXJjZSgpOw0K Kw0KKwlTVERPVVQuV3JpdGVMaW5lKCJHZW5lcmF0aW5nIHNvdXJjZSBmaWxlcyAtIHRoaXMgbWF5 IHRha2UgYSBmZXcgc2Vjb25kcyIpOw0KKwlXU2NyaXB0LlNsZWVwKDM1MDApOw0KKwljaGVja19n ZW5lcmF0aW9uKCk7DQorDQorCS8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGFkZGl0aW9uYWwg b2JqZWN0cyB0byBhZGQNCisJdmFyIHNvdXJjZXMgPSBmaWxlX2dldF9jb250ZW50cygic291cmNl cy50ZW1wIik7DQorCWNvbmZpZ3VyZV9tb2R1bGVfZGlybmFtZSA9IGNvbmRlbnNlX3BhdGgoImV4 dFxcZ3RrK1xcIik7DQorCUVYVEVOU0lPTigicGhwLWd0ayIsIHBocF9ndGtfZmlsZXMgKyBzb3Vy Y2VzLCB0cnVlKTsNCisNCisJU1RET1VULldyaXRlQmxhbmtMaW5lcygxKTsNCisJU1RET1VULldy aXRlTGluZSgiQ3JlYXRpbmcgYnVpbGQgZGlycy4uLiIpOw0KKwlkaXIgPSBnZXRfZGVmaW5lKCJC VUlMRF9ESVIiKTsNCisJYnVpbGRfZGlycy5zb3J0KCk7DQorCWxhc3QgPSBudWxsOw0KKw0KKwlp ZiAoIUZTTy5Gb2xkZXJFeGlzdHMoZGlyKSkgew0KKwkJRlNPLkNyZWF0ZUZvbGRlcihkaXIpOw0K Kwl9DQorDQorCWZvciAoaSA9IDA7IGkgPCBidWlsZF9kaXJzLmxlbmd0aDsgaSsrKSB7DQorCQli ZCA9IEZTTy5CdWlsZFBhdGgoZGlyLCBidWlsZF9kaXJzW2ldKTsNCisJCWlmIChiZCA9PSBsYXN0 KSB7DQorCQkJY29udGludWU7DQorCQl9DQorCQlsYXN0ID0gYmQ7DQorCQlBRERfRkxBRygiQlVJ TERfRElSU19TVUIiLCBiZCk7DQorCQlpZiAoIUZTTy5Gb2xkZXJFeGlzdHMoYmQpKSB7DQorCQkJ RlNPLkNyZWF0ZUZvbGRlcihiZCk7DQorCQl9DQorCX0NCisNCisJZ2VuZXJhdGVfbWFrZWZpbGUo KTsNCisNCisJU1RET1VULldyaXRlTGluZSgiRG9uZS4iKTsNCisJU1RET1VULldyaXRlQmxhbmtM aW5lcygxKTsNCisJU1RET1VULldyaXRlTGluZSgiVHlwZSAnbm1ha2UnIHRvIGJ1aWxkIGFsbCB0 YXJnZXRzLCBvciAnbm1ha2UgcGhwLWd0aycgdG8gYnVpbGQgUEhQLUdUSyBhbG9uZSIpOw0KKwlT VERPVVQuV3JpdGVMaW5lKCIqIENvbmZpZ3VyZWQgUEhQLUdUSyBleHRlbnNpb25zIGNhbiBiZSBi dWlsdCBpbmRpdmlkdWFsbHkgYXQgYSBsYXRlciBzdGFnZSAqIik7DQorfQ0KKw0KK2Z1bmN0aW9u IGdlbmVyYXRlX21ha2VmaWxlKCkgew0KKw0KKyAgICBNRkUuV3JpdGVMaW5lKCIiKTsgLy8gVG8g YXZvaWQgZXJyb3IgaWYgTUZFIHdpbGwgYmUgY29tcGxldGUNCisJTUZFLkNsb3NlKCk7IC8vIE1h a2VmaWxlLmV4dGVuc2lvbnMgaXMgbm93IGNvbXBsZXRlDQorCU1GTy5DbG9zZSgpOyAvLyBNYWtl ZmlsZS5vYmplY3RzIGlzIG5vdyBjb21wbGV0ZQ0KKwl2YXIgTUYgPSBGU08uQ3JlYXRlVGV4dEZp bGUoIk1ha2VmaWxlIiwgdHJ1ZSk7DQorCVNURE9VVC5Xcml0ZUxpbmUoIkdlbmVyYXRpbmcgTWFr ZWZpbGUiKTsNCisNCisJTUYuV3JpdGVMaW5lKCIjIEdlbmVyYXRlZCBieSBjb25maWd1cmUuanMi KTsNCisJTUYuV3JpdGVCbGFua0xpbmVzKDEpOw0KKw0KKwkvKiBzcGl0IG91dCB2YXJpYWJsZSBk ZWZpbml0aW9ucyAqLw0KKwl2YXIga2V5cyA9IChuZXcgVkJBcnJheShjb25maWd1cmVfc3Vic3Qu S2V5cygpKSkudG9BcnJheSgpOw0KKwl2YXIgaTsNCisNCisJZm9yIChpIGluIGtleXMpIHsNCisJ CS8qIFRoZSB0cmFpbGluZyBzcGFjZSBpcyBuZWVkZWQgdG8gcHJldmVudCB0aGUgdHJhaWxpbmcg YmFja3NsYXNoIHRoYXQgaXMgcGFydCBvZg0KKwkJdGhlIGJ1aWxkIGRpciBmbGFncyAoQ0ZMQUdT X0JEX1hYWCkgZnJvbSBiZWluZyBzZWVuIGFzIGEgbGluZSBjb250aW51YXRpb24gY2hhcmFjdGVy ICovDQorCQlNRi5Xcml0ZUxpbmUoa2V5c1tpXSArICI9IiArIGNvbmZpZ3VyZV9zdWJzdC5JdGVt KGtleXNbaV0pICsgIiAiKTsNCisJfQ0KKw0KKwlNRi5Xcml0ZUJsYW5rTGluZXMoMSk7DQorCU1G LldyaXRlTGluZSgiYWxsOiAkKEVYVF9UQVJHRVRTKSIpOw0KKw0KKwlmb3IgKGkgPSBtYWtlX2J1 aWxkcy5sZW5ndGg7IGkgPj0gMDsgaS0tKSB7DQorCQlpZiAoaSA9PSBtYWtlX2J1aWxkcy5sZW5n dGgpIHsNCisJCQlNRi5Xcml0ZUxpbmUoIiFJRiBFWElTVCgkKEJVSUxEX0RJUilcXCQoUEhQR1RL TElCKSkiKTsNCisJCX0NCisJCU1GLldyaXRlTGluZShtYWtlX2J1aWxkc1tpXSk7DQorCX0NCisN CisJaWYgKG1ha2VfYnVpbGRzLmxlbmd0aCA+IDEpIHsNCisJCU1GLldyaXRlTGluZSgiIUVMU0Ui KTsNCisJCU1GLldyaXRlTGluZSgiIU1FU1NBR0UgTm90ZTogJChQSFBHVEtMSUIpIG11c3QgYmUg Y3JlYXRlZCBiZWZvcmUgUEhQLUdUSyBleHRlbnNpb25zIGNhbiBiZSBidWlsdCIpOw0KKwl9DQor CQ0KKwlNRi5Xcml0ZUxpbmUoIiFFTkRJRiIpOw0KKwlNRi5Xcml0ZUxpbmUoImJ1aWxkX2RpcnM6 ICQoQlVJTERfRElSKSAkKEJVSUxEX0RJUlNfU1VCKSIpOw0KKwlNRi5Xcml0ZUJsYW5rTGluZXMo MSk7DQorDQorCVRGID0gRlNPLk9wZW5UZXh0RmlsZSgiTWFrZWZpbGUub2JqZWN0cyIsIDEpOw0K KwlNRi5Xcml0ZShURi5SZWFkQWxsKCkpOw0KKwlURi5DbG9zZSgpOw0KKw0KKwlURiA9IEZTTy5P cGVuVGV4dEZpbGUoIk1ha2VmaWxlLmV4dGVuc2lvbnMiLCAxKTsNCisJTUYuV3JpdGUoVEYuUmVh ZEFsbCgpKTsNCisJVEYuQ2xvc2UoKTsNCisNCisJTUYuQ2xvc2UoKTsNCisNCisJRlNPLkRlbGV0 ZUZpbGUoIk1ha2VmaWxlLm9iamVjdHMiKTsNCisJRlNPLkRlbGV0ZUZpbGUoIk1ha2VmaWxlLmV4 dGVuc2lvbnMiKTsNCit9DQorDQorZnVuY3Rpb24gY29weV9hbmRfc3Vic3Qoc3JjbmFtZSwgZGVz dG5hbWUsIHN1YnN0X2FycmF5KSB7DQorDQorCWlmICghRlNPLkZpbGVFeGlzdHMoc3JjbmFtZSkp IHsNCisJCXNyY25hbWUgPSBjb25maWd1cmVfbW9kdWxlX2Rpcm5hbWUgKyAiXFwiICsgc3JjbmFt ZTsNCisJCWRlc3RuYW1lID0gY29uZmlndXJlX21vZHVsZV9kaXJuYW1lICsgIlxcIiArIGRlc3Ru YW1lOw0KKwl9DQorDQorCXZhciBjb250ZW50ID0gZmlsZV9nZXRfY29udGVudHMoc3JjbmFtZSk7 DQorCXZhciBpOw0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgc3Vic3RfYXJyYXkubGVuZ3RoOyBpKz0y KSB7DQorCQl2YXIgcmUgPSBzdWJzdF9hcnJheVtpXTsNCisJCXZhciByZXAgPSBzdWJzdF9hcnJh eVtpKzFdOw0KKw0KKwkJY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShyZSwgcmVwKTsNCisJfQ0K Kw0KKwl2YXIgZiA9IEZTTy5DcmVhdGVUZXh0RmlsZShkZXN0bmFtZSwgdHJ1ZSk7DQorCWYuV3Jp dGUoY29udGVudCk7DQorCWYuQ2xvc2UoKTsNCit9DQorDQorLy8gZ2xvYiB1c2luZyBzaW1wbGUg ZmlsZW5hbWUgd2lsZGNhcmRzOyByZXR1cm5zIGFuIGFycmF5IG9mIG1hdGNoZXMgZm91bmQgaW4g dGhlIGZpbGVzeXN0ZW0NCitmdW5jdGlvbiBnbG9iKHBhdGhfcGF0dGVybikgew0KKw0KKwl2YXIg cGF0aF9wYXJ0cyA9IHBhdGhfcGF0dGVybi5yZXBsYWNlKG5ldyBSZWdFeHAoIi8iLCAiZyIpLCAi XFwiKS5zcGxpdCgiXFwiKTsNCisJdmFyIHA7DQorCXZhciBiYXNlID0gIiI7DQorCXZhciBpc19w YXRfcmUgPSAvXCovOw0KKw0KKwlpZiAoRlNPLkZpbGVFeGlzdHMocGF0aF9wYXR0ZXJuKSkgew0K KwkJcmV0dXJuIG5ldyBBcnJheShwYXRoX3BhdHRlcm4pOw0KKwl9DQorDQorCS8vIGZpcnN0LCBi dWlsZCBhcyBtdWNoIGFzIHBvc3NpYmxlIHRoYXQgZG9lc24ndCBoYXZlIGEgcGF0dGVybg0KKwlm b3IgKHAgPSAwOyBwIDwgcGF0aF9wYXJ0cy5sZW5ndGg7IHArKykgew0KKwkJaWYgKHBhdGhfcGFy dHNbcF0ubWF0Y2goaXNfcGF0X3JlKSkNCisJCQlicmVhazsNCisJCWlmIChwKQ0KKwkJCWJhc2Ug Kz0gIlxcIjsNCisJCWJhc2UgKz0gcGF0aF9wYXJ0c1twXTsNCisJfQ0KKw0KKwlyZXR1cm4gX2lu bmVyX2dsb2IoYmFzZSwgcCwgcGF0aF9wYXJ0cyk7DQorfQ0KKw0KK2Z1bmN0aW9uIF9pbm5lcl9n bG9iKGJhc2UsIHAsIHBhcnRzKSB7DQorDQorCXZhciBwYXQgPSBwYXJ0c1twXTsNCisJdmFyIGZ1 bGxfbmFtZSA9IGJhc2UgKyAiXFwiICsgcGF0Ow0KKwl2YXIgcmUgPSBudWxsOw0KKwl2YXIgaXRl bXMgPSBudWxsOw0KKw0KKwlpZiAocCA9PSBwYXJ0cy5sZW5ndGgpIHsNCisJCXJldHVybiBmYWxz ZTsNCisJfQ0KKw0KKwlpZiAoRlNPLkZpbGVFeGlzdHMoZnVsbF9uYW1lKSkgew0KKwkJaWYgKHAg PCBwYXJ0cy5sZW5ndGggLSAxKSB7DQorCQkJLy8gd2UgZGlkbid0IHJlYWNoIHRoZSBmdWxsIGV4 dGVudCBvZiB0aGUgcGF0dGVybg0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCXJldHVybiBu ZXcgQXJyYXkoZnVsbF9uYW1lKTsNCisJfQ0KKw0KKwlpZiAoRlNPLkZvbGRlckV4aXN0cyhmdWxs X25hbWUpICYmIHAgPT0gcGFydHMubGVuZ3RoIC0gMSkgew0KKwkJLy8gd2UgaGF2ZSByZWFjaGVk IHRoZSBlbmQgb2YgdGhlIHBhdHRlcm47IG5vIG5lZWQgdG8gcmVjdXJzZQ0KKwkJcmV0dXJuIG5l dyBBcnJheShmdWxsX25hbWUpOw0KKwl9DQorDQorCS8vIENvbnZlcnQgdGhlIHBhdHRlcm4gaW50 byBhIHJlZ2V4cA0KKwlyZSA9IG5ldyBSZWdFeHAoIl4iICsgcGF0LnJlcGxhY2UoL1wuL2csICdc XC4nKS5yZXBsYWNlKC9cKi9nLCAnLionKS5yZXBsYWNlKC9cPy9nLCAnLicpICsgIiQiLCAiaSIp Ow0KKw0KKwlpdGVtcyA9IG5ldyBBcnJheSgpOw0KKw0KKwlpZiAoIUZTTy5Gb2xkZXJFeGlzdHMo YmFzZSkpIHsNCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwl2YXIgZm9sZGVyID0gRlNPLkdl dEZvbGRlcihiYXNlKTsNCisJdmFyIGZjID0gbnVsbDsNCisJdmFyIHN1Yml0ZW1zID0gbnVsbDsN CisJdmFyIGl0ZW1fbmFtZSA9IG51bGw7DQorCXZhciBqOw0KKw0KKwlmYyA9IG5ldyBFbnVtZXJh dG9yKGZvbGRlci5TdWJGb2xkZXJzKTsNCisJZm9yICg7ICFmYy5hdEVuZCgpOyBmYy5tb3ZlTmV4 dCgpKSB7DQorCQlpdGVtX25hbWUgPSBGU08uR2V0RmlsZU5hbWUoZmMuaXRlbSgpKTsNCisNCisJ CWlmIChpdGVtX25hbWUubWF0Y2gocmUpKSB7DQorCQkJLy8gZ290IGEgbWF0Y2g7IGlmIHdlIGFy ZSBhdCB0aGUgZW5kIG9mIHRoZSBwYXR0ZXJuLCBqdXN0IGFkZCB0aGVzZQ0KKwkJCS8vIHRoaW5n cyB0byB0aGUgaXRlbXMgYXJyYXkNCisJCQlpZiAocCA9PSBwYXJ0cy5sZW5ndGggLSAxKSB7DQor CQkJCWl0ZW1zW2l0ZW1zLmxlbmd0aF0gPSBmYy5pdGVtKCk7DQorCQkJfSBlbHNlIHsNCisJCQkJ Ly8gd2Ugc2hvdWxkIHJlY3Vyc2UgYW5kIGRvIG1vcmUgbWF0Y2hlcw0KKwkJCQlzdWJpdGVtcyA9 IF9pbm5lcl9nbG9iKGJhc2UgKyAiXFwiICsgaXRlbV9uYW1lLCBwICsgMSwgcGFydHMpOw0KKwkJ CQlpZiAoc3ViaXRlbXMpIHsNCisJCQkJCWZvciAoaiA9IDA7IGogPCBzdWJpdGVtcy5sZW5ndGg7 IGorKykgew0KKwkJCQkJCWl0ZW1zW2l0ZW1zLmxlbmd0aF0gPSBzdWJpdGVtc1tqXTsNCisJCQkJ CX0NCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvLyBpZiB3ZSBhcmUgYXQgdGhlIGVu ZCBvZiB0aGUgcGF0dGVybiwgd2Ugc2hvdWxkIG1hdGNoIGZpbGVzIHRvbw0KKwlpZiAocCA9PSBw YXJ0cy5sZW5ndGggLSAxKSB7DQorCQlmYyA9IG5ldyBFbnVtZXJhdG9yKGZvbGRlci5GaWxlcyk7 DQorCQlmb3IgKDsgIWZjLmF0RW5kKCk7IGZjLm1vdmVOZXh0KCkpIHsNCisJCQlpdGVtX25hbWUg PSBGU08uR2V0RmlsZU5hbWUoZmMuaXRlbSgpKTsNCisJCQlpZiAoaXRlbV9uYW1lLm1hdGNoKHJl KSkgew0KKwkJCQlpdGVtc1tpdGVtcy5sZW5ndGhdID0gZmMuaXRlbSgpOw0KKwkJCX0NCisJCX0N CisJfQ0KKw0KKwlpZiAoaXRlbXMubGVuZ3RoID09IDApDQorCQlyZXR1cm4gZmFsc2U7DQorDQor CXJldHVybiBpdGVtczsNCit9DQorDQorLyogRW1pdHMgcnVsZSB0byBnZW5lcmF0ZSB2ZXJzaW9u IGluZm8gZm9yIGFuIGV4dGVuc2lvbi4NCitSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSAucmVzIGZp bGUgdGhhdCB3aWxsIGJlIGdlbmVyYXRlZCAqLw0KK2Z1bmN0aW9uIGdlbmVyYXRlX3ZlcnNpb25f aW5mb19yZXNvdXJjZShtYWtlZmlsZXRhcmdldCwgY3JlZGl0c3BhdGgpIHsNCisNCisJLy8gbWFr ZWZpbGV0YXJnZXQgaXMgcGhwLWd0ay5kbGwNCisJLy8gY3JlZGl0c3BhdGggaXMgZXh0XGd0aysN CisNCisJdmFyIHJlc25hbWUgPSBtYWtlZmlsZXRhcmdldCArICIucmVzIjsNCisJdmFyIHJlc19k ZXNjID0gIlBIUC1HVEsgU2NyaXB0IEludGVycHJldGVyIjsNCisJdmFyIHJlc19wcm9kX25hbWUg PSAiUEhQLUdUSyI7DQorCXZhciBjcmVkaXRzOw0KKwl2YXIgdGhhbmtzID0gIlRoYW5rcyB0byBB bmRyZWkgWm1pZXZza2kiOw0KKwl2YXIgbG9nbyA9ICIiOw0KKw0KKwlpZiAoRlNPLkZpbGVFeGlz dHMoY3JlZGl0c3BhdGggKyAnL0NSRURJVFMnKSkgew0KKwkJY3JlZGl0cyA9IEZTTy5PcGVuVGV4 dEZpbGUoY3JlZGl0c3BhdGggKyAnL0NSRURJVFMnLCAxKTsNCisJCXJlc19kZXNjID0gY3JlZGl0 cy5SZWFkTGluZSgpOw0KKwkJdHJ5IHsNCisJCQl0aGFua3MgPSBjcmVkaXRzLlJlYWRMaW5lKCk7 DQorCQl9IGNhdGNoIChlKSB7DQorCQkJdGhhbmtzID0gbnVsbDsNCisJCX0NCisJCWlmICh0aGFu a3MgPT0gbnVsbCkgew0KKwkJCXRoYW5rcyA9ICIiOw0KKwkJfSBlbHNlIHsNCisJCQl0aGFua3Mg PSAiVGhhbmtzIHRvICIgKyB0aGFua3M7DQorCQl9DQorCQljcmVkaXRzLkNsb3NlKCk7DQorCX0N CisNCisJTUZPLldyaXRlTGluZSgiUEhQR1RLRExMX1JFUz0kKEJVSUxEX0RJUilcXCQoUEhQR1RL RExMKS5yZXMiKTsNCisJTUZPLldyaXRlQmxhbmtMaW5lcygxKTsNCisNCisJaWYgKG1ha2VmaWxl dGFyZ2V0Lm1hdGNoKG5ldyBSZWdFeHAoIlxcLmV4ZSQiKSkpIHsNCisJCWxvZ28gPSAiIC9EIFdB TlRfTE9HTyI7DQorCX0NCisNCisJTUZPLldyaXRlTGluZSgiJChQSFBHVEtETExfUkVTKTogd2lu MzJcXHRlbXBsYXRlLnJjIik7DQorCU1GTy5Xcml0ZUxpbmUoIlx0JChSQykgL2ZvICQoUEhQR1RL RExMX1JFUykiICsgbG9nbyArICcgL0QgRklMRV9ERVNDUklQVElPTj0iXFwiJyArIHJlc19kZXNj ICsgJ1xcIiIgL0QgRklMRV9OQU1FPSJcXCIkKFBIUEdUS0RMTClcXCIiIC9EIFBST0RVQ1RfTkFN RT0iXFwiJyArIHJlc19wcm9kX25hbWUgKyAnXFwiIiAvRCBUSEFOS1NfR1VZUz0iXFwiJyArIHRo YW5rcyArICdcXCIiIHdpbjMyXFx0ZW1wbGF0ZS5yYycpOw0KKwlNRk8uV3JpdGVCbGFua0xpbmVz KDEpOw0KKw0KKwlyZXR1cm4gcmVzbmFtZTsNCit9DQorDQorLyogZXhlY3V0ZSBhIGNvbW1hbmQg YW5kIHJldHVybiB0aGUgb3V0cHV0IGFzIGEgc3RyaW5nICovDQorZnVuY3Rpb24gZXhlY3V0ZShj b21tYW5kX2xpbmUpIHsNCisJdmFyIGUgPSBXc2hTaGVsbC5FeGVjKGNvbW1hbmRfbGluZSk7DQor CXZhciByZXQgPSAiIjsNCisNCisJcmV0ID0gZS5TdGRPdXQuUmVhZEFsbCgpOw0KKw0KKwlyZXR1 cm4gcmV0Ow0KK30NCisNCisvLyBXaGljaCB2ZXJzaW9uIG9mIHRoZSBjb21waWxlciBkbyB3ZSBo YXZlPw0KIGZ1bmN0aW9uIHByb2JlX21zdmNfY29tcGlsZXJfdmVyc2lvbihDTCkgew0KLQl2YXIg Y29tbWFuZCA9ICdjbWQgL2MgIiInICsgQ0wgKyAnIiAtdiInOw0KLQl2YXIgdmVyc2lvbiA9IGV4 ZWN1dGUoY29tbWFuZCArICciIDI+JjEiJyk7DQorCXZhciBjb21tYW5kID0gJ2NtZCAvYyAnICsg Q0wgKyAnIC12JzsNCisJdmFyIHZlcnNpb24gPSBleGVjdXRlKGNvbW1hbmQgKyAnIDI+JjEnKTsN CiANCiAJaWYgKHZlcnNpb24ubWF0Y2goLyhcZCtcLlxkKykvKSkgew0KIAkJcmV0dXJuIFJlZ0V4 cC4kMS5zcGxpdCgiLiIpLmpvaW4oIiIpOw0KIAl9DQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8vIFBv a2UgYXJvdW5kIGZvciBzb21lIGhlYWRlcnMKLWZ1bmN0aW9uIHByb2JlX2Jhc2ljX2hlYWRlcnMo KQotewotCXZhciBwOwotCi0JLy8gaGFjayB0byBjYXRjaCBjb21tb24gbG9jYXRpb24gb2YgbGli cwotCWlmICh0eXBlb2YocCkgPT0gInN0cmluZyIpIHsKLQkJcCA9IHAucmVwbGFjZShuZXcgUmVn RXhwKCJpbmNsdWRlJCIpLCAibGliIik7Ci0JCUFERF9GTEFHKCJMREZMQUdTIiwgJy9saWJwYXRo OiInICsgcCArICciICcpOwotCQlwaHBfdXN1YWxfbGliX3N1c3BlY3RzICs9ICI7IiArIHA7Ci0J fQotCi0JLy8gTWFrZSBzdXJlIHRoYXQgdHNybSwgbWFpbiBhbmQgWkVORCBnZXQgYWRkZWQgdG8g dGhlIGluY2x1ZGVzCi0JdmFyIHBocF9kaXIgPSBDSEVDS19IRUFERVIoJ1plbmQvemVuZC5oJyk7 Ci0JQUREX0ZMQUcoJ0NGTEFHUycsICcvSSAiJyArIHBocF9kaXIgKyAnIiAnKTsKLQlBRERfRkxB RygnQ0ZMQUdTJywgJy9JICInICsgcGhwX2RpciArICdcXFRTUk0iICcpOwotCUFERF9GTEFHKCdD RkxBR1MnLCAnL0kgIicgKyBwaHBfZGlyICsgJ1xcbWFpbiIgJyk7Ci0JQUREX0ZMQUcoJ0NGTEFH UycsICcvSSAiJyArIHBocF9kaXIgKyAnXFxaZW5kIiAnKTsKLX0KLQotLyogbm9uLWZ1bmN0aW9u cyAqLwotCi1pZiAoIUZTTy5GaWxlRXhpc3RzKCJidWlsZGNvbmYuYmF0IikpIHsKLQlTVERFUlIu V3JpdGVMaW5lKCJNdXN0IGJlIHJ1biBmcm9tIHRoZSByb290IG9mIHRoZSBQSFAtR1RLIHNvdXJj ZSIpOwotCVdTY3JpcHQuUXVpdCgxMCk7Ci19CisNCisJcmV0dXJuIDA7DQorfQ0KKw0KKy8vIFBv a2UgYXJvdW5kIGZvciBzb21lIGhlYWRlcnMNCitmdW5jdGlvbiBwcm9iZV9iYXNpY19oZWFkZXJz KCkNCit7DQorCXZhciBwOw0KKw0KKwkvLyBoYWNrIHRvIGNhdGNoIGNvbW1vbiBsb2NhdGlvbiBv ZiBsaWJzDQorCWlmICh0eXBlb2YocCkgPT0gInN0cmluZyIpIHsNCisJCXAgPSBwLnJlcGxhY2Uo bmV3IFJlZ0V4cCgiaW5jbHVkZSQiKSwgImxpYiIpOw0KKwkJQUREX0ZMQUcoIkxERkxBR1MiLCAn L2xpYnBhdGg6IicgKyBwICsgJyIgJyk7DQorCQlwaHBfdXN1YWxfbGliX3N1c3BlY3RzICs9ICI7 IiArIHA7DQorCX0NCisNCisJLy8gTWFrZSBzdXJlIHRoYXQgdHNybSwgbWFpbiBhbmQgWkVORCBn ZXQgYWRkZWQgdG8gdGhlIGluY2x1ZGVzDQorCXZhciBwaHBfZGlyID0gQ0hFQ0tfSEVBREVSKCda ZW5kL3plbmQuaCcpOw0KKwlBRERfRkxBRygnQ0ZMQUdTJywgJy9JICInICsgcGhwX2RpciArICci ICcpOw0KKwlBRERfRkxBRygnQ0ZMQUdTJywgJy9JICInICsgcGhwX2RpciArICdcXFRTUk0iICcp Ow0KKwlBRERfRkxBRygnQ0ZMQUdTJywgJy9JICInICsgcGhwX2RpciArICdcXG1haW4iICcpOw0K KwlBRERfRkxBRygnQ0ZMQUdTJywgJy9JICInICsgcGhwX2RpciArICdcXFplbmQiICcpOw0KK30N CisNCisvKiBub24tZnVuY3Rpb25zICovDQorDQoraWYgKCFGU08uRmlsZUV4aXN0cygiYnVpbGRj b25mLmJhdCIpKSB7DQorCVNUREVSUi5Xcml0ZUxpbmUoIk11c3QgYmUgcnVuIGZyb20gdGhlIHJv b3Qgb2YgdGhlIFBIUC1HVEsgc291cmNlIik7DQorCVdTY3JpcHQuUXVpdCgxMCk7DQorfQ== --61c2eea4dd17d53a008762f3e141f5a1b85a71a6--