From mboxrd@z Thu Jan 1 00:00:00 1970 MIME-Version: 1.0 In-Reply-To: References: Date: Sat, 15 Jan 2011 13:25:09 +0200 Message-ID: From: Pavel Zholkover To: Fans of the OS Plan 9 from Bell Labs <9fans@9fans.net> Content-Type: multipart/mixed; boundary=0016e6584246b726f30499e0cd7d Subject: Re: [9fans] plan9 go output faults on 9vx but ok on cpu Topicbox-Message-UUID: 99751908-ead6-11e9-9d60-3106f5b1d025 --0016e6584246b726f30499e0cd7d Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable On Sat, Jan 15, 2011 at 12:40 PM, wrote: >> If you try applying http://codereview.appspot.com/3816043/ you can get >> pretty far.. > > Could you provide more detailed instructions, please? =A0Mercurial seems > very helpful, but the learning curve can be quite steep. =A0I presume > this requires hg to be involved? > > ++L > There is some trouble using patch to apply the raw patches from the Rietveld code review site as Skip found out, So I've attached a diff without the hg history stuff. Pavel --0016e6584246b726f30499e0cd7d Content-Type: text/x-patch; charset=GB2312; name="issue3816043_43001.diff" Content-Disposition: attachment; filename="issue3816043_43001.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_giyfgmoy0 ZGlmZiAtciAwOWFiODY1ZDg3NWMgc3JjL3BrZy9vcy9NYWtlZmlsZQotLS0gYS9zcmMvcGtnL29z L01ha2VmaWxlCUZyaSBKYW4gMTQgMjM6MDA6MDIgMjAxMSAtMDgwMAorKysgYi9zcmMvcGtnL29z L01ha2VmaWxlCVNhdCBKYW4gMTUgMTM6MDA6MTMgMjAxMSArMDIwMApAQCAtMTksMjQgKzE5LDQy IEBACiAJdHlwZXMuZ29cCiAKIEdPRklMRVNfZnJlZWJzZD1cCisJZXJyb3JfcG9zaXguZ29cCiAJ ZW52X3VuaXguZ29cCisJZmlsZV9wb3NpeC5nb1wKIAlmaWxlX3VuaXguZ29cCiAJc3lzX2JzZC5n b1wKKwlleGVjX3VuaXguZ28KIAogR09GSUxFU19kYXJ3aW49XAorCWVycm9yX3Bvc2l4LmdvXAog CWVudl91bml4LmdvXAorCWZpbGVfcG9zaXguZ29cCiAJZmlsZV91bml4LmdvXAogCXN5c19ic2Qu Z29cCisJZXhlY191bml4LmdvCiAKIEdPRklMRVNfbGludXg9XAorCWVycm9yX3Bvc2l4LmdvXAog CWVudl91bml4LmdvXAorCWZpbGVfcG9zaXguZ29cCiAJZmlsZV91bml4LmdvXAogCXN5c19saW51 eC5nb1wKKwlleGVjX3VuaXguZ28KIAogR09GSUxFU193aW5kb3dzPVwKKwllcnJvcl9wb3NpeC5n b1wKIAllbnZfd2luZG93cy5nb1wKKwlmaWxlX3Bvc2l4LmdvXAogCWZpbGVfd2luZG93cy5nb1wK IAlzeXNfd2luZG93cy5nb1wKKwlleGVjX3VuaXguZ28KKworR09GSUxFU19wbGFuOT1cCisJZXJy b3JfcGxhbjkuZ29cCisJZW52X3BsYW45LmdvXAorCWZpbGVfcGxhbjkuZ29cCisJc3lzX3BsYW45 LmdvXAogCiBHT0ZJTEVTKz0kKEdPRklMRVNfJChHT09TKSkKIApkaWZmIC1yIDA5YWI4NjVkODc1 YyBzcmMvcGtnL29zL2Rpcl9wbGFuOS5nbwotLS0gL2Rldi9udWxsCVRodSBKYW4gMDEgMDA6MDA6 MDAgMTk3MCArMDAwMAorKysgYi9zcmMvcGtnL29zL2Rpcl9wbGFuOS5nbwlTYXQgSmFuIDE1IDEz OjAwOjEzIDIwMTEgKzAyMDAKQEAgLTAsMCArMSwyNzMgQEAKKy8vIENvcHlyaWdodCAyMDA5IFRo ZSBHbyBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNl IGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUKKy8vIGxpY2Vuc2UgdGhhdCBjYW4gYmUg Zm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworcGFja2FnZSBvcworCitpbXBvcnQgKAorCSJz eXNjYWxsIgorKQorCitjb25zdCAoCisJYmxvY2tTaXplID0gNDA5NiAvLyBUT0RPKHIpOiB1c2Ug c3RhdGZzCispCisKK3R5cGUgZGlySW5mbyBpbnQKKworCisvLyBSZWFkZGlyIHJlYWRzIHRoZSBj b250ZW50cyBvZiB0aGUgZGlyZWN0b3J5IGFzc29jaWF0ZWQgd2l0aCBmaWxlIGFuZAorLy8gcmV0 dXJucyBhbiBhcnJheSBvZiB1cCB0byBjb3VudCBGaWxlSW5mbyBzdHJ1Y3R1cmVzLCBhcyB3b3Vs ZCBiZSByZXR1cm5lZAorLy8gYnkgTHN0YXQsIGluIGRpcmVjdG9yeSBvcmRlci4gIFN1YnNlcXVl bnQgY2FsbHMgb24gdGhlIHNhbWUgZmlsZSB3aWxsIHlpZWxkCisvLyBmdXJ0aGVyIEZpbGVJbmZv cy4KKy8vIEEgbmVnYXRpdmUgY291bnQgbWVhbnMgdG8gcmVhZCB1bnRpbCBFT0YuCisvLyBSZWFk ZGlyIHJldHVybnMgdGhlIGFycmF5IGFuZCBhbiBFcnJvciwgaWYgYW55LgorZnVuYyAoZmlsZSAq RmlsZSkgUmVhZGRpcihjb3VudCBpbnQpIChmaSBbXUZpbGVJbmZvLCBlcnIgRXJyb3IpIHsKKwlz aXplIDo9IGNvdW50CisJaWYgc2l6ZSA8IDAgeworCQlzaXplID0gMTAwCisJfQorCisJLy8gVG9E bzogSW52ZXN0aWdhdGUgYSBidWcgaW4gYWxsb2NhdGlvbi9tZW1vcnkvc2xpY2UgYXBwZW5kIHdo ZW4gbW9yZSB0aGFuIG9uZSBpdGVyYXRpb24gb2YgUmVhZCBpcyBkb25lLgorCXJlc3VsdCA6PSBt YWtlKFtdRmlsZUluZm8sIDAsIHNpemUpCisJYnVmIDo9IG1ha2UoW11ieXRlLCBzeXNjYWxsLlNU QVRNQVggLyo0NDgqLyApCisKKwl2YXIgZSBFcnJvciA9IG5pbAorCWZvciBlID09IG5pbCB7CisJ CW4sIGUgOj0gZmlsZS5SZWFkKGJ1ZikKKworCQlpZiBlICE9IG5pbCB7CisJCQlpZiBlID09IEVP RiB7CisJCQkJYnJlYWsKKwkJCX0KKworCQkJcmV0dXJuIFtdRmlsZUluZm97fSwgJlBhdGhFcnJv cnsicmVhZGRpciIsIGZpbGUubmFtZSwgZX0KKwkJfQorCisJCWlmIG4gPCBzeXNjYWxsLlNUQVRG SVhMRU4geworCQkJcmV0dXJuIFtdRmlsZUluZm97fSwgJlBhdGhFcnJvcnsicmVhZGRpciIsIGZp bGUubmFtZSwgc3lzY2FsbC5FdG9vc21hbGx9CisJCX0KKworCQlmb3IgaSA6PSAwOyBpIDwgbjsg eworCQkJbSwgXyA6PSBnYml0MTYoYnVmW2k6XSkKKwkJCW0gKz0gMgorCisJCQlpZiBtIDwgc3lz Y2FsbC5TVEFURklYTEVOIHsKKwkJCQlyZXR1cm4gW11GaWxlSW5mb3t9LCAmUGF0aEVycm9yeyJy ZWFkZGlyIiwgZmlsZS5uYW1lLCBzeXNjYWxsLkViYWRzdGF0fQorCQkJfQorCisJCQlkLCBlIDo9 IFVubWFyc2hhbERpcihidWZbaSA6IGkraW50KG0pXSkKKworCQkJaWYgZSAhPSBuaWwgeworCQkJ CXJldHVybiBbXUZpbGVJbmZve30sICZQYXRoRXJyb3J7InJlYWRkaXIiLCBmaWxlLm5hbWUsIGV9 CisJCQl9CisKKwkJCXZhciBmIEZpbGVJbmZvCisJCQlmaWxlSW5mb0Zyb21TdGF0KCZmLCBkKQor CisJCQlyZXN1bHQgPSBhcHBlbmQocmVzdWx0LCBmKQorCisJCQlpZiBjb3VudCA+IDAgJiYgbGVu KHJlc3VsdCkgPj0gY291bnQgeworCQkJCWJyZWFrCisJCQl9CisKKwkJCWkgKz0gaW50KG0pCisJ CX0KKwl9CisKKwlpZiBlICE9IG5pbCAmJiBlICE9IEVPRiB7CisJCXJldHVybiBbXUZpbGVJbmZv e30sIGUKKwl9CisKKwlyZXR1cm4gcmVzdWx0LCBuaWwKK30KKworZnVuYyAoZmlsZSAqRmlsZSkg UmVhZGRpcm5hbWVzKGNvdW50IGludCkgKG5hbWVzIFtdc3RyaW5nLCBlcnIgRXJyb3IpIHsKKwlm aSwgZSA6PSBmaWxlLlJlYWRkaXIoY291bnQpCisKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBb XXN0cmluZ3t9LCBlCisJfQorCisJbmFtZXMgPSBtYWtlKFtdc3RyaW5nLCBsZW4oZmkpKQorCWVy ciA9IG5pbAorCisJZm9yIGksIF8gOj0gcmFuZ2UgZmkgeworCQluYW1lc1tpXSA9IGZpW2ldLk5h bWUKKwl9CisKKwlyZXR1cm4KK30KKwordHlwZSBEaXIgc3RydWN0IHsKKwlUeXBlICAgdWludDE2 CisJRGV2ICAgIHVpbnQzMgorCVFpZCAgICBRaWQKKwlNb2RlICAgdWludDMyCisJQXRpbWUgIHVp bnQzMgorCU10aW1lICB1aW50MzIKKwlMZW5ndGggdWludDY0CisJTmFtZSAgIHN0cmluZworCVVp ZCAgICBzdHJpbmcKKwlHaWQgICAgc3RyaW5nCisJTXVpZCAgIHN0cmluZworfQorCit0eXBlIFFp ZCBzdHJ1Y3QgeworCVBhdGggdWludDY0CisJVmVycyB1aW50MzIKKwlUeXBlIHVpbnQ4Cit9CisK KwordmFyIG51bGxEaXIgPSBEaXJ7CisJXnVpbnQxNigwKSwKKwledWludDMyKDApLAorCVFpZHte dWludDY0KDApLCBedWludDMyKDApLCBedWludDgoMCl9LAorCV51aW50MzIoMCksCisJXnVpbnQz MigwKSwKKwledWludDMyKDApLAorCV51aW50NjQoMCksCisJIiIsCisJIiIsCisJIiIsCisJIiIs Cit9CisKK2Z1bmMgcGRpcihiIFtdYnl0ZSwgZCAqRGlyKSBbXWJ5dGUgeworCW4gOj0gbGVuKGIp CisJYiA9IHBiaXQxNihiLCAwKSAvLyBsZW5ndGgsIGZpbGxlZCBpbiBsYXRlcgkKKwliID0gcGJp dDE2KGIsIGQuVHlwZSkKKwliID0gcGJpdDMyKGIsIGQuRGV2KQorCWIgPSBwcWlkKGIsIGQuUWlk KQorCWIgPSBwYml0MzIoYiwgZC5Nb2RlKQorCWIgPSBwYml0MzIoYiwgZC5BdGltZSkKKwliID0g cGJpdDMyKGIsIGQuTXRpbWUpCisJYiA9IHBiaXQ2NChiLCBkLkxlbmd0aCkKKwliID0gcHN0cmlu ZyhiLCBkLk5hbWUpCisJYiA9IHBzdHJpbmcoYiwgZC5VaWQpCisJYiA9IHBzdHJpbmcoYiwgZC5H aWQpCisJYiA9IHBzdHJpbmcoYiwgZC5NdWlkKQorCXBiaXQxNihiWzA6bl0sIHVpbnQxNihsZW4o YiktKG4rMikpKQorCXJldHVybiBiCit9CisKK2Z1bmMgVW5tYXJzaGFsRGlyKGIgW11ieXRlKSAo ZCAqRGlyLCBlcnIgRXJyb3IpIHsKKwluIDo9IHVpbnQxNigwKQorCW4sIGIgPSBnYml0MTYoYikK KworCWlmIGludChuKSAhPSBsZW4oYikgeworCQlyZXR1cm4gbmlsLCBzeXNjYWxsLkViYWRzdGF0 CisJfQorCisJZCA9IG5ldyhEaXIpCisJZC5UeXBlLCBiID0gZ2JpdDE2KGIpCisJZC5EZXYsIGIg PSBnYml0MzIoYikKKwlkLlFpZCwgYiA9IGdxaWQoYikKKwlkLk1vZGUsIGIgPSBnYml0MzIoYikK KwlkLkF0aW1lLCBiID0gZ2JpdDMyKGIpCisJZC5NdGltZSwgYiA9IGdiaXQzMihiKQorCWQuTGVu Z3RoLCBiID0gZ2JpdDY0KGIpCisJZC5OYW1lLCBiID0gZ3N0cmluZyhiKQorCWQuVWlkLCBiID0g Z3N0cmluZyhiKQorCWQuR2lkLCBiID0gZ3N0cmluZyhiKQorCWQuTXVpZCwgYiA9IGdzdHJpbmco YikKKworCWlmIGxlbihiKSAhPSAwIHsKKwkJcmV0dXJuIG5pbCwgc3lzY2FsbC5FYmFkc3RhdAor CX0KKworCXJldHVybiBkLCBuaWwKK30KKworZnVuYyBncWlkKGIgW11ieXRlKSAoUWlkLCBbXWJ5 dGUpIHsKKwl2YXIgcSBRaWQKKwlxLlBhdGgsIGIgPSBnYml0NjQoYikKKwlxLlZlcnMsIGIgPSBn Yml0MzIoYikKKwlxLlR5cGUsIGIgPSBnYml0OChiKQorCXJldHVybiBxLCBiCit9CisKK2Z1bmMg cHFpZChiIFtdYnl0ZSwgcSBRaWQpIFtdYnl0ZSB7CisJYiA9IHBiaXQ2NChiLCBxLlBhdGgpCisJ YiA9IHBiaXQzMihiLCBxLlZlcnMpCisJYiA9IHBiaXQ4KGIsIHEuVHlwZSkKKwlyZXR1cm4gYgor fQorCitmdW5jIGdiaXQ4KGIgW11ieXRlKSAodWludDgsIFtdYnl0ZSkgeworCXJldHVybiB1aW50 OChiWzBdKSwgYlsxOl0KK30KKworZnVuYyBnYml0MTYoYiBbXWJ5dGUpICh1aW50MTYsIFtdYnl0 ZSkgeworCXJldHVybiB1aW50MTYoYlswXSkgfCB1aW50MTYoYlsxXSk8PDgsIGJbMjpdCit9CisK K2Z1bmMgZ2JpdDMyKGIgW11ieXRlKSAodWludDMyLCBbXWJ5dGUpIHsKKwlyZXR1cm4gdWludDMy KGJbMF0pIHwgdWludDMyKGJbMV0pPDw4IHwgdWludDMyKGJbMl0pPDwxNiB8IHVpbnQzMihiWzNd KTw8MjQsIGJbNDpdCit9CisKK2Z1bmMgZ2JpdDY0KGIgW11ieXRlKSAodWludDY0LCBbXWJ5dGUp IHsKKwlsbywgYiA6PSBnYml0MzIoYikKKwloaSwgYiA6PSBnYml0MzIoYikKKwlyZXR1cm4gdWlu dDY0KGhpKTw8MzIgfCB1aW50NjQobG8pLCBiCit9CisKK2Z1bmMgZ3N0cmluZyhiIFtdYnl0ZSkg KHN0cmluZywgW11ieXRlKSB7CisJbiwgYiA6PSBnYml0MTYoYikKKwlyZXR1cm4gc3RyaW5nKGJb MDpuXSksIGJbbjpdCit9CisKK2Z1bmMgcGJpdDgoYiBbXWJ5dGUsIHggdWludDgpIFtdYnl0ZSB7 CisJbiA6PSBsZW4oYikKKwlpZiBuKzEgPiBjYXAoYikgeworCQluYiA6PSBtYWtlKFtdYnl0ZSwg biwgMTAwKzIqY2FwKGIpKQorCQljb3B5KG5iLCBiKQorCQliID0gbmIKKwl9CisJYiA9IGJbMCA6 IG4rMV0KKwliW25dID0geAorCXJldHVybiBiCit9CisKK2Z1bmMgcGJpdDE2KGIgW11ieXRlLCB4 IHVpbnQxNikgW11ieXRlIHsKKwluIDo9IGxlbihiKQorCWlmIG4rMiA+IGNhcChiKSB7CisJCW5i IDo9IG1ha2UoW11ieXRlLCBuLCAxMDArMipjYXAoYikpCisJCWNvcHkobmIsIGIpCisJCWIgPSBu YgorCX0KKwliID0gYlswIDogbisyXQorCWJbbl0gPSBieXRlKHgpCisJYltuKzFdID0gYnl0ZSh4 ID4+IDgpCisJcmV0dXJuIGIKK30KKworZnVuYyBwYml0MzIoYiBbXWJ5dGUsIHggdWludDMyKSBb XWJ5dGUgeworCW4gOj0gbGVuKGIpCisJaWYgbis0ID4gY2FwKGIpIHsKKwkJbmIgOj0gbWFrZShb XWJ5dGUsIG4sIDEwMCsyKmNhcChiKSkKKwkJY29weShuYiwgYikKKwkJYiA9IG5iCisJfQorCWIg PSBiWzAgOiBuKzRdCisJYltuXSA9IGJ5dGUoeCkKKwliW24rMV0gPSBieXRlKHggPj4gOCkKKwli W24rMl0gPSBieXRlKHggPj4gMTYpCisJYltuKzNdID0gYnl0ZSh4ID4+IDI0KQorCXJldHVybiBi Cit9CisKK2Z1bmMgcGJpdDY0KGIgW11ieXRlLCB4IHVpbnQ2NCkgW11ieXRlIHsKKwliID0gcGJp dDMyKGIsIHVpbnQzMih4KSkKKwliID0gcGJpdDMyKGIsIHVpbnQzMih4Pj4zMikpCisJcmV0dXJu IGIKK30KKworZnVuYyBwc3RyaW5nKGIgW11ieXRlLCBzIHN0cmluZykgW11ieXRlIHsKKwlpZiBs ZW4ocykgPj0gMTw8MTYgeworCQlwYW5pYyhOZXdFcnJvcigic3RyaW5nIHRvbyBsb25nIikpCisJ fQorCWIgPSBwYml0MTYoYiwgdWludDE2KGxlbihzKSkpCisJYiA9IGFwcGVuZChiLCBbXWJ5dGUo cykuLi4pCisJcmV0dXJuIGIKK30KZGlmZiAtciAwOWFiODY1ZDg3NWMgc3JjL3BrZy9vcy9lbnZf cGxhbjkuZ28KLS0tIC9kZXYvbnVsbAlUaHUgSmFuIDAxIDAwOjAwOjAwIDE5NzAgKzAwMDAKKysr IGIvc3JjL3BrZy9vcy9lbnZfcGxhbjkuZ28JU2F0IEphbiAxNSAxMzowMDoxMyAyMDExICswMjAw CkBAIC0wLDAgKzEsMTMxIEBACisvLyBDb3B5cmlnaHQgMjAxMCBUaGUgR28gQXV0aG9ycy4gIEFs bCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5l ZCBieSBhIEJTRC1zdHlsZQorLy8gbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElD RU5TRSBmaWxlLgorCisvLyBQbGFuIDkgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorCitwYWNrYWdl IG9zCisKK2ltcG9ydCAoCisJInN5c2NhbGwiCisJInN5bmMiCispCisKKy8vIEVOT0VOViBpcyB0 aGUgRXJyb3IgaW5kaWNhdGluZyB0aGF0IGFuIGVudmlyb25tZW50IHZhcmlhYmxlIGRvZXMgbm90 IGV4aXN0LgordmFyIEVOT0VOViA9IE5ld0Vycm9yKCJubyBzdWNoIGVudmlyb25tZW50IHZhcmlh YmxlIikKKwordmFyIGVudiBtYXBbc3RyaW5nXXN0cmluZwordmFyIG9uY2Ugc3luYy5PbmNlCisK K2Z1bmMgY29weWVudigpIHsKKwllbnYgPSBtYWtlKG1hcFtzdHJpbmddc3RyaW5nKQorCisJZiwg ZSA6PSBPcGVuKCIjZSIsIE9fUkRPTkxZLCAwKQorCWlmIGlzZXJyb3IoZSkgeworCQlwYW5pYyhl KQorCX0KKworCWZpLCBlIDo9IGYuUmVhZGRpcigtMSkKKwlpZiBpc2Vycm9yKGUpIHsKKwkJZi5D bG9zZSgpCisJCXBhbmljKGUpCisJfQorCWYuQ2xvc2UoKQorCisJYnVmIDo9IG1ha2UoW11ieXRl LCA0MDk2KQorCWZvciBpLCBfIDo9IHJhbmdlIGZpIHsKKwkJaWYgZiwgZSA9IE9wZW4oIiNlLyIr ZmlbaV0uTmFtZSwgT19SRE9OTFksIDApOyBpc2Vycm9yKGUpIHsKKwkJCWNvbnRpbnVlCisJCX0K KworCQlpZiBmaVtpXS5TaXplID4gaW50NjQoY2FwKGJ1ZikpIHsKKwkJCWZpW2ldLlNpemUgPSBp bnQ2NChjYXAoYnVmKSkgLSAxCisJCX0KKworCQlpZiBmaVtpXS5TaXplID4gMCB7CisJCQluLCBl IDo9IGYuUmVhZChidWZbMDpmaVtpXS5TaXplXSkKKworCQkJaWYgIWlzZXJyb3IoZSkgeworCQkJ CWJ1ZltuXSA9IDAKKwkJCQllbnZbZmlbaV0uTmFtZV0gPSBzdHJpbmcoYnVmWzA6bl0pCisJCQl9 CisJCX0gZWxzZSB7CisJCQllbnZbZmlbaV0uTmFtZV0gPSAiIgorCQl9CisKKwkJZi5DbG9zZSgp CisJfQorfQorCisvLyBHZXRlbnZlcnJvciByZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIHRoZSBlbnZp cm9ubWVudCB2YXJpYWJsZSBuYW1lZCBieSB0aGUga2V5LgorLy8gSXQgcmV0dXJucyB0aGUgdmFs dWUgYW5kIGFuIGVycm9yLCBpZiBhbnkuCitmdW5jIEdldGVudmVycm9yKGtleSBzdHJpbmcpICh2 YWx1ZSBzdHJpbmcsIGVyciBFcnJvcikgeworCW9uY2UuRG8oY29weWVudikKKworCWlmIGxlbihr ZXkpID09IDAgeworCQlyZXR1cm4gIiIsIHN5c2NhbGwuRW5vbmV4aXN0CisJfQorCXYsIG9rIDo9 IGVudltrZXldCisJaWYgIW9rIHsKKwkJcmV0dXJuICIiLCBFTk9FTlYKKwl9CisJcmV0dXJuIHYs IG5pbAorfQorCisvLyBHZXRlbnYgcmV0cmlldmVzIHRoZSB2YWx1ZSBvZiB0aGUgZW52aXJvbm1l bnQgdmFyaWFibGUgbmFtZWQgYnkgdGhlIGtleS4KKy8vIEl0IHJldHVybnMgdGhlIHZhbHVlLCB3 aGljaCB3aWxsIGJlIGVtcHR5IGlmIHRoZSB2YXJpYWJsZSBpcyBub3QgcHJlc2VudC4KK2Z1bmMg R2V0ZW52KGtleSBzdHJpbmcpIHN0cmluZyB7CisJdiwgXyA6PSBHZXRlbnZlcnJvcihrZXkpCisJ cmV0dXJuIHYKK30KKworLy8gU2V0ZW52IHNldHMgdGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVu dCB2YXJpYWJsZSBuYW1lZCBieSB0aGUga2V5LgorLy8gSXQgcmV0dXJucyBhbiBFcnJvciwgaWYg YW55LgorZnVuYyBTZXRlbnYoa2V5LCB2YWx1ZSBzdHJpbmcpIEVycm9yIHsKKwlvbmNlLkRvKGNv cHllbnYpCisKKwlpZiBsZW4oa2V5KSA9PSAwIHsKKwkJcmV0dXJuIHN5c2NhbGwuRW5vbmV4aXN0 CisJfQorCisJZiwgZSA6PSBPcGVuKCIjZS8iK2tleSwgT19XUk9OTFl8T19DUkVBVCwgMDY2NikK KwlpZiBpc2Vycm9yKGUpIHsKKwkJcmV0dXJuIGUKKwl9CisJZGVmZXIgZi5DbG9zZSgpCisKKwlf LCBlID0gZi5Xcml0ZShzeXNjYWxsLlN0cmluZ0J5dGVTbGljZSh2YWx1ZSkpCisKKwllbnZba2V5 XSA9IHZhbHVlCisJcmV0dXJuIG5pbAorfQorCisvLyBDbGVhcmVudiBkZWxldGVzIGFsbCBlbnZp cm9ubWVudCB2YXJpYWJsZXMuCitmdW5jIENsZWFyZW52KCkgeworCW9uY2UuRG8oY29weWVudikg Ly8gcHJldmVudCBjb3B5ZW52IGluIEdldGVudi9TZXRlbnYKKwllbnYgPSBtYWtlKG1hcFtzdHJp bmddc3RyaW5nKQorCisJc3lzY2FsbC5SYXdTeXNjYWxsKHN5c2NhbGwuU1lTX1JGT1JLLCBzeXNj YWxsLlJGQ0VOVkcsIDAsIDApCit9CisKKy8vIEVudmlyb24gcmV0dXJucyBhbiBhcnJheSBvZiBz dHJpbmdzIHJlcHJlc2VudGluZyB0aGUgZW52aXJvbm1lbnQsCisvLyBpbiB0aGUgZm9ybSAia2V5 PXZhbHVlIi4KK2Z1bmMgRW52aXJvbigpIFtdc3RyaW5nIHsKKwlvbmNlLkRvKGNvcHllbnYpCisJ YSA6PSBtYWtlKFtdc3RyaW5nLCBsZW4oZW52KSkKKwlpIDo9IDAKKwlmb3IgaywgdiA6PSByYW5n ZSBlbnYgeworCQkvLyBjaGVjayBpIDwgbGVuKGEpIGZvciBzYWZldHksCisJCS8vIGluIGNhc2Ug ZW52IGlzIGNoYW5naW5nIHVuZGVyZm9vdC4KKwkJaWYgaSA8IGxlbihhKSB7CisJCQlhW2ldID0g ayArICI9IiArIHYKKwkJCWkrKworCQl9CisJfQorCXJldHVybiBhWzA6aV0KK30KKworLy8gVGVt cERpciByZXR1cm5zIHRoZSBkZWZhdWx0IGRpcmVjdG9yeSB0byB1c2UgZm9yIHRlbXBvcmFyeSBm aWxlcy4KK2Z1bmMgVGVtcERpcigpIHN0cmluZyB7CisJcmV0dXJuICIvdG1wIgorfQpkaWZmIC1y IDA5YWI4NjVkODc1YyBzcmMvcGtnL29zL2Vycm9yLmdvCi0tLSBhL3NyYy9wa2cvb3MvZXJyb3Iu Z28JRnJpIEphbiAxNCAyMzowMDowMiAyMDExIC0wODAwCisrKyBiL3NyYy9wa2cvb3MvZXJyb3Iu Z28JU2F0IEphbiAxNSAxMzowMDoxMyAyMDExICswMjAwCkBAIC00LDggKzQsNiBAQAogCiBwYWNr YWdlIG9zCiAKLWltcG9ydCBzeXNjYWxsICJzeXNjYWxsIgotCiAvLyBBbiBFcnJvciBjYW4gcmVw cmVzZW50IGFueSBwcmludGFibGUgZXJyb3IgY29uZGl0aW9uLgogdHlwZSBFcnJvciBpbnRlcmZh Y2UgewogCVN0cmluZygpIHN0cmluZwpAQCAtMjYsNjEgKzI0LDYgQEAKIC8vIE5ld0Vycm9yIGNv bnZlcnRzIHMgdG8gYW4gRXJyb3JTdHJpbmcsIHdoaWNoIHNhdGlzZmllcyB0aGUgRXJyb3IgaW50 ZXJmYWNlLgogZnVuYyBOZXdFcnJvcihzIHN0cmluZykgRXJyb3IgeyByZXR1cm4gRXJyb3JTdHJp bmcocykgfQogCi0vLyBFcnJubyBpcyB0aGUgVW5peCBlcnJvciBudW1iZXIuICBOYW1lcyBzdWNo IGFzIEVJTlZBTCBhcmUgc2ltcGxlCi0vLyB3cmFwcGVycyB0byBjb252ZXJ0IHRoZSBlcnJvciBu dW1iZXIgaW50byBhbiBFcnJvci4KLXR5cGUgRXJybm8gaW50NjQKLQotZnVuYyAoZSBFcnJubykg U3RyaW5nKCkgc3RyaW5nIHsgcmV0dXJuIHN5c2NhbGwuRXJyc3RyKGludChlKSkgfQotCi1mdW5j IChlIEVycm5vKSBUZW1wb3JhcnkoKSBib29sIHsKLQlyZXR1cm4gZSA9PSBFcnJubyhzeXNjYWxs LkVJTlRSKSB8fCBlLlRpbWVvdXQoKQotfQotCi1mdW5jIChlIEVycm5vKSBUaW1lb3V0KCkgYm9v bCB7Ci0JcmV0dXJuIGUgPT0gRXJybm8oc3lzY2FsbC5FQUdBSU4pIHx8IGUgPT0gRXJybm8oc3lz Y2FsbC5FV09VTERCTE9DSykKLX0KLQotLy8gQ29tbW9ubHkga25vd24gVW5peCBlcnJvcnMuCi12 YXIgKAotCUVQRVJNICAgICAgICBFcnJvciA9IEVycm5vKHN5c2NhbGwuRVBFUk0pCi0JRU5PRU5U ICAgICAgIEVycm9yID0gRXJybm8oc3lzY2FsbC5FTk9FTlQpCi0JRVNSQ0ggICAgICAgIEVycm9y ID0gRXJybm8oc3lzY2FsbC5FU1JDSCkKLQlFSU5UUiAgICAgICAgRXJyb3IgPSBFcnJubyhzeXNj YWxsLkVJTlRSKQotCUVJTyAgICAgICAgICBFcnJvciA9IEVycm5vKHN5c2NhbGwuRUlPKQotCUVO WElPICAgICAgICBFcnJvciA9IEVycm5vKHN5c2NhbGwuRU5YSU8pCi0JRTJCSUcgICAgICAgIEVy cm9yID0gRXJybm8oc3lzY2FsbC5FMkJJRykKLQlFTk9FWEVDICAgICAgRXJyb3IgPSBFcnJubyhz eXNjYWxsLkVOT0VYRUMpCi0JRUJBREYgICAgICAgIEVycm9yID0gRXJybm8oc3lzY2FsbC5FQkFE RikKLQlFQ0hJTEQgICAgICAgRXJyb3IgPSBFcnJubyhzeXNjYWxsLkVDSElMRCkKLQlFREVBRExL ICAgICAgRXJyb3IgPSBFcnJubyhzeXNjYWxsLkVERUFETEspCi0JRU5PTUVNICAgICAgIEVycm9y ID0gRXJybm8oc3lzY2FsbC5FTk9NRU0pCi0JRUFDQ0VTICAgICAgIEVycm9yID0gRXJybm8oc3lz Y2FsbC5FQUNDRVMpCi0JRUZBVUxUICAgICAgIEVycm9yID0gRXJybm8oc3lzY2FsbC5FRkFVTFQp Ci0JRUJVU1kgICAgICAgIEVycm9yID0gRXJybm8oc3lzY2FsbC5FQlVTWSkKLQlFRVhJU1QgICAg ICAgRXJyb3IgPSBFcnJubyhzeXNjYWxsLkVFWElTVCkKLQlFWERFViAgICAgICAgRXJyb3IgPSBF cnJubyhzeXNjYWxsLkVYREVWKQotCUVOT0RFViAgICAgICBFcnJvciA9IEVycm5vKHN5c2NhbGwu RU5PREVWKQotCUVOT1RESVIgICAgICBFcnJvciA9IEVycm5vKHN5c2NhbGwuRU5PVERJUikKLQlF SVNESVIgICAgICAgRXJyb3IgPSBFcnJubyhzeXNjYWxsLkVJU0RJUikKLQlFSU5WQUwgICAgICAg RXJyb3IgPSBFcnJubyhzeXNjYWxsLkVJTlZBTCkKLQlFTkZJTEUgICAgICAgRXJyb3IgPSBFcnJu byhzeXNjYWxsLkVORklMRSkKLQlFTUZJTEUgICAgICAgRXJyb3IgPSBFcnJubyhzeXNjYWxsLkVN RklMRSkKLQlFTk9UVFkgICAgICAgRXJyb3IgPSBFcnJubyhzeXNjYWxsLkVOT1RUWSkKLQlFRkJJ RyAgICAgICAgRXJyb3IgPSBFcnJubyhzeXNjYWxsLkVGQklHKQotCUVOT1NQQyAgICAgICBFcnJv ciA9IEVycm5vKHN5c2NhbGwuRU5PU1BDKQotCUVTUElQRSAgICAgICBFcnJvciA9IEVycm5vKHN5 c2NhbGwuRVNQSVBFKQotCUVST0ZTICAgICAgICBFcnJvciA9IEVycm5vKHN5c2NhbGwuRVJPRlMp Ci0JRU1MSU5LICAgICAgIEVycm9yID0gRXJybm8oc3lzY2FsbC5FTUxJTkspCi0JRVBJUEUgICAg ICAgIEVycm9yID0gRXJybm8oc3lzY2FsbC5FUElQRSkKLQlFQUdBSU4gICAgICAgRXJyb3IgPSBF cnJubyhzeXNjYWxsLkVBR0FJTikKLQlFRE9NICAgICAgICAgRXJyb3IgPSBFcnJubyhzeXNjYWxs LkVET00pCi0JRVJBTkdFICAgICAgIEVycm9yID0gRXJybm8oc3lzY2FsbC5FUkFOR0UpCi0JRUFE RFJJTlVTRSAgIEVycm9yID0gRXJybm8oc3lzY2FsbC5FQUREUklOVVNFKQotCUVDT05OUkVGVVNF RCBFcnJvciA9IEVycm5vKHN5c2NhbGwuRUNPTk5SRUZVU0VEKQotCUVOQU1FVE9PTE9ORyBFcnJv ciA9IEVycm5vKHN5c2NhbGwuRU5BTUVUT09MT05HKQotCUVBRk5PU1VQUE9SVCBFcnJvciA9IEVy cm5vKHN5c2NhbGwuRUFGTk9TVVBQT1JUKQotKQotCiAvLyBQYXRoRXJyb3IgcmVjb3JkcyBhbiBl cnJvciBhbmQgdGhlIG9wZXJhdGlvbiBhbmQgZmlsZSBwYXRoIHRoYXQgY2F1c2VkIGl0LgogdHlw ZSBQYXRoRXJyb3Igc3RydWN0IHsKIAlPcCAgICBzdHJpbmcKQEAgLTg5LDI1ICszMiwzIEBACiB9 CiAKIGZ1bmMgKGUgKlBhdGhFcnJvcikgU3RyaW5nKCkgc3RyaW5nIHsgcmV0dXJuIGUuT3AgKyAi ICIgKyBlLlBhdGggKyAiOiAiICsgZS5FcnJvci5TdHJpbmcoKSB9Ci0KLS8vIFN5c2NhbGxFcnJv ciByZWNvcmRzIGFuIGVycm9yIGZyb20gYSBzcGVjaWZpYyBzeXN0ZW0gY2FsbC4KLXR5cGUgU3lz Y2FsbEVycm9yIHN0cnVjdCB7Ci0JU3lzY2FsbCBzdHJpbmcKLQlFcnJubyAgIEVycm5vCi19Ci0K LWZ1bmMgKGUgKlN5c2NhbGxFcnJvcikgU3RyaW5nKCkgc3RyaW5nIHsgcmV0dXJuIGUuU3lzY2Fs bCArICI6ICIgKyBlLkVycm5vLlN0cmluZygpIH0KLQotLy8gTm90ZTogSWYgdGhlIG5hbWUgb2Yg dGhlIGZ1bmN0aW9uIE5ld1N5c2NhbGxFcnJvciBjaGFuZ2VzLAotLy8gcGtnL2dvL2RvYy9kb2Mu Z28gc2hvdWxkIGJlIGFkanVzdGVkIHNpbmNlIGl0IGhhcmR3aXJlcwotLy8gdGhpcyBuYW1lIGlu IGEgaGV1cmlzdGljLgotCi0vLyBOZXdTeXNjYWxsRXJyb3IgcmV0dXJucywgYXMgYW4gRXJyb3Is IGEgbmV3IFN5c2NhbGxFcnJvcgotLy8gd2l0aCB0aGUgZ2l2ZW4gc3lzdGVtIGNhbGwgbmFtZSBh bmQgZXJyb3IgbnVtYmVyLgotLy8gQXMgYSBjb252ZW5pZW5jZSwgaWYgZXJybm8gaXMgMCwgTmV3 U3lzY2FsbEVycm9yIHJldHVybnMgbmlsLgotZnVuYyBOZXdTeXNjYWxsRXJyb3Ioc3lzY2FsbCBz dHJpbmcsIGVycm5vIGludCkgRXJyb3IgewotCWlmIGVycm5vID09IDAgewotCQlyZXR1cm4gbmls Ci0JfQotCXJldHVybiAmU3lzY2FsbEVycm9ye3N5c2NhbGwsIEVycm5vKGVycm5vKX0KLX0KZGlm ZiAtciAwOWFiODY1ZDg3NWMgc3JjL3BrZy9vcy9lcnJvcl9wbGFuOS5nbwotLS0gL2Rldi9udWxs CVRodSBKYW4gMDEgMDA6MDA6MDAgMTk3MCArMDAwMAorKysgYi9zcmMvcGtnL29zL2Vycm9yX3Bs YW45LmdvCVNhdCBKYW4gMTUgMTM6MDA6MTMgMjAxMSArMDIwMApAQCAtMCwwICsxLDQ4IEBACisv LyBDb3B5cmlnaHQgMjAxMCBUaGUgR28gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8v IFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlCisvLyBs aWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK3BhY2thZ2Ug b3MKKworaW1wb3J0IHN5c2NhbGwgInN5c2NhbGwiCisKKy8vIFN5c2NhbGxFcnJvciByZWNvcmRz IGFuIGVycm9yIGZyb20gYSBzcGVjaWZpYyBzeXN0ZW0gY2FsbC4KK3R5cGUgU3lzY2FsbEVycm9y IHN0cnVjdCB7CisJU3lzY2FsbCBzdHJpbmcKKwlFcnIgICAgIHN0cmluZworfQorCitmdW5jIChl ICpTeXNjYWxsRXJyb3IpIFN0cmluZygpIHN0cmluZyB7IHJldHVybiBlLlN5c2NhbGwgKyAiOiAi ICsgZS5FcnIgfQorCisvLyBOb3RlOiBJZiB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gTmV3U3lz Y2FsbEVycm9yIGNoYW5nZXMsCisvLyBwa2cvZ28vZG9jL2RvYy5nbyBzaG91bGQgYmUgYWRqdXN0 ZWQgc2luY2UgaXQgaGFyZHdpcmVzCisvLyB0aGlzIG5hbWUgaW4gYSBoZXVyaXN0aWMuCisKKy8v IE5ld1N5c2NhbGxFcnJvciByZXR1cm5zLCBhcyBhbiBFcnJvciwgYSBuZXcgU3lzY2FsbEVycm9y CisvLyB3aXRoIHRoZSBnaXZlbiBzeXN0ZW0gY2FsbCBuYW1lIGFuZCBlcnJvciBudW1iZXIuCisv LyBBcyBhIGNvbnZlbmllbmNlLCBpZiBlcnJubyBpcyAwLCBOZXdTeXNjYWxsRXJyb3IgcmV0dXJu cyBuaWwuCitmdW5jIE5ld1N5c2NhbGxFcnJvcihzeXNjYWxsIHN0cmluZywgZXJyIHN5c2NhbGwu RXJyb3IpIEVycm9yIHsKKwlpZiBlcnIgPT0gbmlsIHsKKwkJcmV0dXJuIG5pbAorCX0KKwlyZXR1 cm4gJlN5c2NhbGxFcnJvcntzeXNjYWxsLCBlcnIuU3RyaW5nKCl9Cit9CisKK3ZhciAoCisJRUlO VkFMICAgICAgIEVycm9yID0gc3lzY2FsbC5FYmFkYXJnCisJRU5PVERJUiAgICAgIEVycm9yID0g c3lzY2FsbC5Fbm90ZGlyCisJRU5PRU5UICAgICAgIEVycm9yID0gc3lzY2FsbC5Fbm9uZXhpc3QK KwlFTkFNRVRPT0xPTkcgRXJyb3IgPSBOZXdFcnJvcigiZmlsZSBuYW1lIHRvbyBsb25nIikKKwlF UElQRSAgICAgICAgPSBzeXNjYWxsLkVQSVBFCisKKwlFUkFOR0UgRXJyb3IgPSBOZXdFcnJvcigi bWF0aCByZXN1bHQgbm90IHJlcHJlc2VudGFibGUiKQorCUVFWElTVCBFcnJvciA9IHN5c2NhbGwu RWV4aXN0CisKKwlFUExBTjkgRXJyb3IgPSBOZXdFcnJvcigibm90IHN1cHBvcnRlZCBieSBwbGFu IDkiKQorKQorCitmdW5jIGlzZXJyb3IoZXJyIHN5c2NhbGwuRXJyb3IpIGJvb2wgeworCXJldHVy biBlcnIgIT0gbmlsCit9CisKK2Z1bmMgRXJybm8oZSBzeXNjYWxsLkVycm9yKSBzeXNjYWxsLkVy cm9yIHsgcmV0dXJuIGUgfQpkaWZmIC1yIDA5YWI4NjVkODc1YyBzcmMvcGtnL29zL2Vycm9yX3Bv c2l4LmdvCi0tLSAvZGV2L251bGwJVGh1IEphbiAwMSAwMDowMDowMCAxOTcwICswMDAwCisrKyBi L3NyYy9wa2cvb3MvZXJyb3JfcG9zaXguZ28JU2F0IEphbiAxNSAxMzowMDoxMyAyMDExICswMjAw CkBAIC0wLDAgKzEsODggQEAKKy8vIENvcHlyaWdodCAyMDA5IFRoZSBHbyBBdXRob3JzLiBBbGwg cmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQg YnkgYSBCU0Qtc3R5bGUKKy8vIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VO U0UgZmlsZS4KKworcGFja2FnZSBvcworCitpbXBvcnQgc3lzY2FsbCAic3lzY2FsbCIKKworLy8g RXJybm8gaXMgdGhlIFVuaXggZXJyb3IgbnVtYmVyLiAgTmFtZXMgc3VjaCBhcyBFSU5WQUwgYXJl IHNpbXBsZQorLy8gd3JhcHBlcnMgdG8gY29udmVydCB0aGUgZXJyb3IgbnVtYmVyIGludG8gYW4g RXJyb3IuCit0eXBlIEVycm5vIGludDY0CisKK2Z1bmMgKGUgRXJybm8pIFN0cmluZygpIHN0cmlu ZyB7IHJldHVybiBzeXNjYWxsLkVycnN0cihpbnQoZSkpIH0KKworZnVuYyAoZSBFcnJubykgVGVt cG9yYXJ5KCkgYm9vbCB7CisJcmV0dXJuIGUgPT0gRXJybm8oc3lzY2FsbC5FSU5UUikgfHwgZS5U aW1lb3V0KCkKK30KKworZnVuYyAoZSBFcnJubykgVGltZW91dCgpIGJvb2wgeworCXJldHVybiBl ID09IEVycm5vKHN5c2NhbGwuRUFHQUlOKSB8fCBlID09IEVycm5vKHN5c2NhbGwuRVdPVUxEQkxP Q0spCit9CisKKy8vIENvbW1vbmx5IGtub3duIFVuaXggZXJyb3JzLgordmFyICgKKwlFUEVSTSAg ICAgICAgRXJyb3IgPSBFcnJubyhzeXNjYWxsLkVQRVJNKQorCUVOT0VOVCAgICAgICBFcnJvciA9 IEVycm5vKHN5c2NhbGwuRU5PRU5UKQorCUVTUkNIICAgICAgICBFcnJvciA9IEVycm5vKHN5c2Nh bGwuRVNSQ0gpCisJRUlOVFIgICAgICAgIEVycm9yID0gRXJybm8oc3lzY2FsbC5FSU5UUikKKwlF SU8gICAgICAgICAgRXJyb3IgPSBFcnJubyhzeXNjYWxsLkVJTykKKwlFTlhJTyAgICAgICAgRXJy b3IgPSBFcnJubyhzeXNjYWxsLkVOWElPKQorCUUyQklHICAgICAgICBFcnJvciA9IEVycm5vKHN5 c2NhbGwuRTJCSUcpCisJRU5PRVhFQyAgICAgIEVycm9yID0gRXJybm8oc3lzY2FsbC5FTk9FWEVD KQorCUVCQURGICAgICAgICBFcnJvciA9IEVycm5vKHN5c2NhbGwuRUJBREYpCisJRUNISUxEICAg ICAgIEVycm9yID0gRXJybm8oc3lzY2FsbC5FQ0hJTEQpCisJRURFQURMSyAgICAgIEVycm9yID0g RXJybm8oc3lzY2FsbC5FREVBRExLKQorCUVOT01FTSAgICAgICBFcnJvciA9IEVycm5vKHN5c2Nh bGwuRU5PTUVNKQorCUVBQ0NFUyAgICAgICBFcnJvciA9IEVycm5vKHN5c2NhbGwuRUFDQ0VTKQor CUVGQVVMVCAgICAgICBFcnJvciA9IEVycm5vKHN5c2NhbGwuRUZBVUxUKQorCUVCVVNZICAgICAg ICBFcnJvciA9IEVycm5vKHN5c2NhbGwuRUJVU1kpCisJRUVYSVNUICAgICAgIEVycm9yID0gRXJy bm8oc3lzY2FsbC5FRVhJU1QpCisJRVhERVYgICAgICAgIEVycm9yID0gRXJybm8oc3lzY2FsbC5F WERFVikKKwlFTk9ERVYgICAgICAgRXJyb3IgPSBFcnJubyhzeXNjYWxsLkVOT0RFVikKKwlFTk9U RElSICAgICAgRXJyb3IgPSBFcnJubyhzeXNjYWxsLkVOT1RESVIpCisJRUlTRElSICAgICAgIEVy cm9yID0gRXJybm8oc3lzY2FsbC5FSVNESVIpCisJRUlOVkFMICAgICAgIEVycm9yID0gRXJybm8o c3lzY2FsbC5FSU5WQUwpCisJRU5GSUxFICAgICAgIEVycm9yID0gRXJybm8oc3lzY2FsbC5FTkZJ TEUpCisJRU1GSUxFICAgICAgIEVycm9yID0gRXJybm8oc3lzY2FsbC5FTUZJTEUpCisJRU5PVFRZ ICAgICAgIEVycm9yID0gRXJybm8oc3lzY2FsbC5FTk9UVFkpCisJRUZCSUcgICAgICAgIEVycm9y ID0gRXJybm8oc3lzY2FsbC5FRkJJRykKKwlFTk9TUEMgICAgICAgRXJyb3IgPSBFcnJubyhzeXNj YWxsLkVOT1NQQykKKwlFU1BJUEUgICAgICAgRXJyb3IgPSBFcnJubyhzeXNjYWxsLkVTUElQRSkK KwlFUk9GUyAgICAgICAgRXJyb3IgPSBFcnJubyhzeXNjYWxsLkVST0ZTKQorCUVNTElOSyAgICAg ICBFcnJvciA9IEVycm5vKHN5c2NhbGwuRU1MSU5LKQorCUVQSVBFICAgICAgICBFcnJvciA9IEVy cm5vKHN5c2NhbGwuRVBJUEUpCisJRUFHQUlOICAgICAgIEVycm9yID0gRXJybm8oc3lzY2FsbC5F QUdBSU4pCisJRURPTSAgICAgICAgIEVycm9yID0gRXJybm8oc3lzY2FsbC5FRE9NKQorCUVSQU5H RSAgICAgICBFcnJvciA9IEVycm5vKHN5c2NhbGwuRVJBTkdFKQorCUVBRERSSU5VU0UgICBFcnJv ciA9IEVycm5vKHN5c2NhbGwuRUFERFJJTlVTRSkKKwlFQ09OTlJFRlVTRUQgRXJyb3IgPSBFcnJu byhzeXNjYWxsLkVDT05OUkVGVVNFRCkKKwlFTkFNRVRPT0xPTkcgRXJyb3IgPSBFcnJubyhzeXNj YWxsLkVOQU1FVE9PTE9ORykKKwlFQUZOT1NVUFBPUlQgRXJyb3IgPSBFcnJubyhzeXNjYWxsLkVB Rk5PU1VQUE9SVCkKKykKKworLy8gU3lzY2FsbEVycm9yIHJlY29yZHMgYW4gZXJyb3IgZnJvbSBh IHNwZWNpZmljIHN5c3RlbSBjYWxsLgordHlwZSBTeXNjYWxsRXJyb3Igc3RydWN0IHsKKwlTeXNj YWxsIHN0cmluZworCUVycm5vICAgRXJybm8KK30KKworZnVuYyAoZSAqU3lzY2FsbEVycm9yKSBT dHJpbmcoKSBzdHJpbmcgeyByZXR1cm4gZS5TeXNjYWxsICsgIjogIiArIGUuRXJybm8uU3RyaW5n KCkgfQorCisvLyBOb3RlOiBJZiB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gTmV3U3lzY2FsbEVy cm9yIGNoYW5nZXMsCisvLyBwa2cvZ28vZG9jL2RvYy5nbyBzaG91bGQgYmUgYWRqdXN0ZWQgc2lu Y2UgaXQgaGFyZHdpcmVzCisvLyB0aGlzIG5hbWUgaW4gYSBoZXVyaXN0aWMuCisKKy8vIE5ld1N5 c2NhbGxFcnJvciByZXR1cm5zLCBhcyBhbiBFcnJvciwgYSBuZXcgU3lzY2FsbEVycm9yCisvLyB3 aXRoIHRoZSBnaXZlbiBzeXN0ZW0gY2FsbCBuYW1lIGFuZCBlcnJvciBudW1iZXIuCisvLyBBcyBh IGNvbnZlbmllbmNlLCBpZiBlcnJubyBpcyAwLCBOZXdTeXNjYWxsRXJyb3IgcmV0dXJucyBuaWwu CitmdW5jIE5ld1N5c2NhbGxFcnJvcihzeXNjYWxsIHN0cmluZywgZXJybm8gaW50KSBFcnJvciB7 CisJaWYgZXJybm8gPT0gMCB7CisJCXJldHVybiBuaWwKKwl9CisJcmV0dXJuICZTeXNjYWxsRXJy b3J7c3lzY2FsbCwgRXJybm8oZXJybm8pfQorfQorCitmdW5jIGlzZXJyb3IoZXJybm8gaW50KSBi b29sIHsKKwlyZXR1cm4gZXJybm8gIT0gMAorfQpkaWZmIC1yIDA5YWI4NjVkODc1YyBzcmMvcGtn L29zL2V4ZWMuZ28KLS0tIGEvc3JjL3BrZy9vcy9leGVjLmdvCUZyaSBKYW4gMTQgMjM6MDA6MDIg MjAxMSAtMDgwMAorKysgYi9zcmMvcGtnL29zL2V4ZWMuZ28JU2F0IEphbiAxNSAxMzowMDoxMyAy MDExICswMjAwCkBAIC04LDE0NSArOCw2IEBACiAJInN5c2NhbGwiCiApCiAKLS8vIEZvcmtFeGVj IGZvcmtzIHRoZSBjdXJyZW50IHByb2Nlc3MgYW5kIGludm9rZXMgRXhlYyB3aXRoIHRoZSBwcm9n cmFtLCBhcmd1bWVudHMsCi0vLyBhbmQgZW52aXJvbm1lbnQgc3BlY2lmaWVkIGJ5IG5hbWUsIGFy Z3YsIGFuZCBlbnZ2LiAgSXQgcmV0dXJucyB0aGUgcHJvY2VzcwotLy8gaWQgb2YgdGhlIGZvcmtl ZCBwcm9jZXNzIGFuZCBhbiBFcnJvciwgaWYgYW55LiAgVGhlIGZkIGFycmF5IHNwZWNpZmllcyB0 aGUKLS8vIGZpbGUgZGVzY3JpcHRvcnMgdG8gYmUgc2V0IHVwIGluIHRoZSBuZXcgcHJvY2Vzczog ZmRbMF0gd2lsbCBiZSBVbml4IGZpbGUKLS8vIGRlc2NyaXB0b3IgMCAoc3RhbmRhcmQgaW5wdXQp LCBmZFsxXSBkZXNjcmlwdG9yIDEsIGFuZCBzbyBvbi4gIEEgbmlsIGVudHJ5Ci0vLyB3aWxsIGNh dXNlIHRoZSBjaGlsZCB0byBoYXZlIG5vIG9wZW4gZmlsZSBkZXNjcmlwdG9yIHdpdGggdGhhdCBp bmRleC4KLS8vIElmIGRpciBpcyBub3QgZW1wdHksIHRoZSBjaGlsZCBjaGRpcnMgaW50byB0aGUg ZGlyZWN0b3J5IGJlZm9yZSBleGVjaW5nIHRoZSBwcm9ncmFtLgotZnVuYyBGb3JrRXhlYyhuYW1l IHN0cmluZywgYXJndiBbXXN0cmluZywgZW52diBbXXN0cmluZywgZGlyIHN0cmluZywgZmQgW10q RmlsZSkgKHBpZCBpbnQsIGVyciBFcnJvcikgewotCWlmIGVudnYgPT0gbmlsIHsKLQkJZW52diA9 IEVudmlyb24oKQotCX0KLQkvLyBDcmVhdGUgYXJyYXkgb2YgaW50ZWdlciAoc3lzdGVtKSBmZHMu Ci0JaW50ZmQgOj0gbWFrZShbXWludCwgbGVuKGZkKSkKLQlmb3IgaSwgZiA6PSByYW5nZSBmZCB7 Ci0JCWlmIGYgPT0gbmlsIHsKLQkJCWludGZkW2ldID0gLTEKLQkJfSBlbHNlIHsKLQkJCWludGZk W2ldID0gZi5GZCgpCi0JCX0KLQl9Ci0KLQlwLCBlIDo9IHN5c2NhbGwuRm9ya0V4ZWMobmFtZSwg YXJndiwgZW52diwgZGlyLCBpbnRmZCkKLQlpZiBlICE9IDAgewotCQlyZXR1cm4gMCwgJlBhdGhF cnJvcnsiZm9yay9leGVjIiwgbmFtZSwgRXJybm8oZSl9Ci0JfQotCXJldHVybiBwLCBuaWwKLX0K LQotLy8gRXhlYyByZXBsYWNlcyB0aGUgY3VycmVudCBwcm9jZXNzIHdpdGggYW4gZXhlY3V0aW9u IG9mIHRoZQotLy8gbmFtZWQgYmluYXJ5LCB3aXRoIGFyZ3VtZW50cyBhcmd2IGFuZCBlbnZpcm9u bWVudCBlbnZ2LgotLy8gSWYgc3VjY2Vzc2Z1bCwgRXhlYyBuZXZlciByZXR1cm5zLiAgSWYgaXQg ZmFpbHMsIGl0IHJldHVybnMgYW4gRXJyb3IuCi0vLyBGb3JrRXhlYyBpcyBhbG1vc3QgYWx3YXlz IGEgYmV0dGVyIHdheSB0byBleGVjdXRlIGEgcHJvZ3JhbS4KLWZ1bmMgRXhlYyhuYW1lIHN0cmlu ZywgYXJndiBbXXN0cmluZywgZW52diBbXXN0cmluZykgRXJyb3IgewotCWlmIGVudnYgPT0gbmls IHsKLQkJZW52diA9IEVudmlyb24oKQotCX0KLQllIDo9IHN5c2NhbGwuRXhlYyhuYW1lLCBhcmd2 LCBlbnZ2KQotCWlmIGUgIT0gMCB7Ci0JCXJldHVybiAmUGF0aEVycm9yeyJleGVjIiwgbmFtZSwg RXJybm8oZSl9Ci0JfQotCXJldHVybiBuaWwKLX0KLQotLy8gVE9ETyhyc2MpOiBTaG91bGQgb3Mg aW1wbGVtZW50IGl0cyBvd24gc3lzY2FsbC5XYWl0U3RhdHVzCi0vLyB3cmFwcGVyIHdpdGggdGhl IG1ldGhvZHMsIG9yIGlzIGV4cG9zaW5nIHRoZSB1bmRlcmx5aW5nIG9uZSBlbm91Z2g/Ci0vLwot Ly8gVE9ETyhyc2MpOiBDZXJ0YWlubHkgbmVlZCB0byBoYXZlIFJ1c2FnZSBzdHJ1Y3QsCi0vLyBz aW5jZSBzeXNjYWxsIG9uZSBtaWdodCBoYXZlIGRpZmZlcmVudCBmaWVsZCB0eXBlcyBhY3Jvc3MK LS8vIGRpZmZlcmVudCBPUy4KLQotLy8gV2FpdG1zZyBzdG9yZXMgdGhlIGluZm9ybWF0aW9uIGFi b3V0IGFuIGV4aXRlZCBwcm9jZXNzIGFzIHJlcG9ydGVkIGJ5IFdhaXQuCi10eXBlIFdhaXRtc2cg c3RydWN0IHsKLQlQaWQgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIC8vIFRoZSBwcm9j ZXNzJ3MgaWQuCi0Jc3lzY2FsbC5XYWl0U3RhdHVzICAgICAgICAgICAgICAgICAvLyBTeXN0ZW0t ZGVwZW5kZW50IHN0YXR1cyBpbmZvLgotCVJ1c2FnZSAgICAgICAgICAgICAqc3lzY2FsbC5SdXNh Z2UgLy8gU3lzdGVtLWRlcGVuZGVudCByZXNvdXJjZSB1c2FnZSBpbmZvLgotfQotCi0vLyBPcHRp b25zIGZvciBXYWl0LgotY29uc3QgKAotCVdOT0hBTkcgICA9IHN5c2NhbGwuV05PSEFORyAgLy8g RG9uJ3Qgd2FpdCBpZiBubyBwcm9jZXNzIGhhcyBleGl0ZWQuCi0JV1NUT1BQRUQgID0gc3lzY2Fs bC5XU1RPUFBFRCAvLyBJZiBzZXQsIHN0YXR1cyBvZiBzdG9wcGVkIHN1YnByb2Nlc3NlcyBpcyBh bHNvIHJlcG9ydGVkLgotCVdVTlRSQUNFRCA9IFdTVE9QUEVECi0JV1JVU0FHRSAgID0gMSA8PCAy MCAvLyBSZWNvcmQgcmVzb3VyY2UgdXNhZ2UuCi0pCi0KLS8vIFdSVVNBR0UgbXVzdCBub3QgYmUg dG9vIGhpZ2ggYSBiaXQsIHRvIGF2b2lkIGNsYXNoaW5nIHdpdGggTGludXgncwotLy8gV0NMT05F LCBXQUxMLCBhbmQgV05PVEhSRUFEIGZsYWdzLCB3aGljaCBzaXQgaW4gdGhlIHRvcCBmZXcgYml0 cyBvZgotLy8gdGhlIG9wdGlvbnMKLQotLy8gV2FpdCB3YWl0cyBmb3IgcHJvY2VzcyBwaWQgdG8g ZXhpdCBvciBzdG9wLCBhbmQgdGhlbiByZXR1cm5zIGEKLS8vIFdhaXRtc2cgZGVzY3JpYmluZyBp dHMgc3RhdHVzIGFuZCBhbiBFcnJvciwgaWYgYW55LiBUaGUgb3B0aW9ucwotLy8gKFdOT0hBTkcg ZXRjLikgYWZmZWN0IHRoZSBiZWhhdmlvciBvZiB0aGUgV2FpdCBjYWxsLgotZnVuYyBXYWl0KHBp ZCBpbnQsIG9wdGlvbnMgaW50KSAodyAqV2FpdG1zZywgZXJyIEVycm9yKSB7Ci0JdmFyIHN0YXR1 cyBzeXNjYWxsLldhaXRTdGF0dXMKLQl2YXIgcnVzYWdlICpzeXNjYWxsLlJ1c2FnZQotCWlmIG9w dGlvbnMmV1JVU0FHRSAhPSAwIHsKLQkJcnVzYWdlID0gbmV3KHN5c2NhbGwuUnVzYWdlKQotCQlv cHRpb25zIF49IFdSVVNBR0UKLQl9Ci0JcGlkMSwgZSA6PSBzeXNjYWxsLldhaXQ0KHBpZCwgJnN0 YXR1cywgb3B0aW9ucywgcnVzYWdlKQotCWlmIGUgIT0gMCB7Ci0JCXJldHVybiBuaWwsIE5ld1N5 c2NhbGxFcnJvcigid2FpdCIsIGUpCi0JfQotCXcgPSBuZXcoV2FpdG1zZykKLQl3LlBpZCA9IHBp ZDEKLQl3LldhaXRTdGF0dXMgPSBzdGF0dXMKLQl3LlJ1c2FnZSA9IHJ1c2FnZQotCXJldHVybiB3 LCBuaWwKLX0KLQotLy8gQ29udmVydCBpIHRvIGRlY2ltYWwgc3RyaW5nLgotZnVuYyBpdG9kKGkg aW50KSBzdHJpbmcgewotCWlmIGkgPT0gMCB7Ci0JCXJldHVybiAiMCIKLQl9Ci0KLQl1IDo9IHVp bnQ2NChpKQotCWlmIGkgPCAwIHsKLQkJdSA9IC11Ci0JfQotCi0JLy8gQXNzZW1ibGUgZGVjaW1h bCBpbiByZXZlcnNlIG9yZGVyLgotCXZhciBiIFszMl1ieXRlCi0JYnAgOj0gbGVuKGIpCi0JZm9y IDsgdSA+IDA7IHUgLz0gMTAgewotCQlicC0tCi0JCWJbYnBdID0gYnl0ZSh1JTEwKSArICcwJwot CX0KLQotCWlmIGkgPCAwIHsKLQkJYnAtLQotCQliW2JwXSA9ICctJwotCX0KLQotCXJldHVybiBz dHJpbmcoYlticDpdKQotfQotCi1mdW5jICh3IFdhaXRtc2cpIFN0cmluZygpIHN0cmluZyB7Ci0J Ly8gVE9ETyhhdXN0aW4pIFVzZSBzaWduYWwgbmFtZXMgd2hlbiBwb3NzaWJsZT8KLQlyZXMgOj0g IiIKLQlzd2l0Y2ggewotCWNhc2Ugdy5FeGl0ZWQoKToKLQkJcmVzID0gImV4aXQgc3RhdHVzICIg KyBpdG9kKHcuRXhpdFN0YXR1cygpKQotCWNhc2Ugdy5TaWduYWxlZCgpOgotCQlyZXMgPSAic2ln bmFsICIgKyBpdG9kKHcuU2lnbmFsKCkpCi0JY2FzZSB3LlN0b3BwZWQoKToKLQkJcmVzID0gInN0 b3Agc2lnbmFsICIgKyBpdG9kKHcuU3RvcFNpZ25hbCgpKQotCQlpZiB3LlN0b3BTaWduYWwoKSA9 PSBzeXNjYWxsLlNJR1RSQVAgJiYgdy5UcmFwQ2F1c2UoKSAhPSAwIHsKLQkJCXJlcyArPSAiICh0 cmFwICIgKyBpdG9kKHcuVHJhcENhdXNlKCkpICsgIikiCi0JCX0KLQljYXNlIHcuQ29udGludWVk KCk6Ci0JCXJlcyA9ICJjb250aW51ZWQiCi0JfQotCWlmIHcuQ29yZUR1bXAoKSB7Ci0JCXJlcyAr PSAiIChjb3JlIGR1bXBlZCkiCi0JfQotCXJldHVybiByZXMKLX0KLQogLy8gR2V0cGlkIHJldHVy bnMgdGhlIHByb2Nlc3MgaWQgb2YgdGhlIGNhbGxlci4KIGZ1bmMgR2V0cGlkKCkgaW50IHsgcmV0 dXJuIHN5c2NhbGwuR2V0cGlkKCkgfQogCmRpZmYgLXIgMDlhYjg2NWQ4NzVjIHNyYy9wa2cvb3Mv ZXhlY191bml4LmdvCi0tLSAvZGV2L251bGwJVGh1IEphbiAwMSAwMDowMDowMCAxOTcwICswMDAw CisrKyBiL3NyYy9wa2cvb3MvZXhlY191bml4LmdvCVNhdCBKYW4gMTUgMTM6MDA6MTMgMjAxMSAr MDIwMApAQCAtMCwwICsxLDE0OCBAQAorLy8gQ29weXJpZ2h0IDIwMDkgVGhlIEdvIEF1dGhvcnMu IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zl cm5lZCBieSBhIEJTRC1zdHlsZQorLy8gbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUg TElDRU5TRSBmaWxlLgorCitwYWNrYWdlIG9zCisKK2ltcG9ydCAoCisJInN5c2NhbGwiCispCisK Ky8vIEZvcmtFeGVjIGZvcmtzIHRoZSBjdXJyZW50IHByb2Nlc3MgYW5kIGludm9rZXMgRXhlYyB3 aXRoIHRoZSBwcm9ncmFtLCBhcmd1bWVudHMsCisvLyBhbmQgZW52aXJvbm1lbnQgc3BlY2lmaWVk IGJ5IG5hbWUsIGFyZ3YsIGFuZCBlbnZ2LiAgSXQgcmV0dXJucyB0aGUgcHJvY2VzcworLy8gaWQg b2YgdGhlIGZvcmtlZCBwcm9jZXNzIGFuZCBhbiBFcnJvciwgaWYgYW55LiAgVGhlIGZkIGFycmF5 IHNwZWNpZmllcyB0aGUKKy8vIGZpbGUgZGVzY3JpcHRvcnMgdG8gYmUgc2V0IHVwIGluIHRoZSBu ZXcgcHJvY2VzczogZmRbMF0gd2lsbCBiZSBVbml4IGZpbGUKKy8vIGRlc2NyaXB0b3IgMCAoc3Rh bmRhcmQgaW5wdXQpLCBmZFsxXSBkZXNjcmlwdG9yIDEsIGFuZCBzbyBvbi4gIEEgbmlsIGVudHJ5 CisvLyB3aWxsIGNhdXNlIHRoZSBjaGlsZCB0byBoYXZlIG5vIG9wZW4gZmlsZSBkZXNjcmlwdG9y IHdpdGggdGhhdCBpbmRleC4KKy8vIElmIGRpciBpcyBub3QgZW1wdHksIHRoZSBjaGlsZCBjaGRp cnMgaW50byB0aGUgZGlyZWN0b3J5IGJlZm9yZSBleGVjaW5nIHRoZSBwcm9ncmFtLgorZnVuYyBG b3JrRXhlYyhuYW1lIHN0cmluZywgYXJndiBbXXN0cmluZywgZW52diBbXXN0cmluZywgZGlyIHN0 cmluZywgZmQgW10qRmlsZSkgKHBpZCBpbnQsIGVyciBFcnJvcikgeworCWlmIGVudnYgPT0gbmls IHsKKwkJZW52diA9IEVudmlyb24oKQorCX0KKwkvLyBDcmVhdGUgYXJyYXkgb2YgaW50ZWdlciAo c3lzdGVtKSBmZHMuCisJaW50ZmQgOj0gbWFrZShbXWludCwgbGVuKGZkKSkKKwlmb3IgaSwgZiA6 PSByYW5nZSBmZCB7CisJCWlmIGYgPT0gbmlsIHsKKwkJCWludGZkW2ldID0gLTEKKwkJfSBlbHNl IHsKKwkJCWludGZkW2ldID0gZi5GZCgpCisJCX0KKwl9CisKKwlwLCBlIDo9IHN5c2NhbGwuRm9y a0V4ZWMobmFtZSwgYXJndiwgZW52diwgZGlyLCBpbnRmZCkKKwlpZiBlICE9IDAgeworCQlyZXR1 cm4gMCwgJlBhdGhFcnJvcnsiZm9yay9leGVjIiwgbmFtZSwgRXJybm8oZSl9CisJfQorCXJldHVy biBwLCBuaWwKK30KKworLy8gRXhlYyByZXBsYWNlcyB0aGUgY3VycmVudCBwcm9jZXNzIHdpdGgg YW4gZXhlY3V0aW9uIG9mIHRoZQorLy8gbmFtZWQgYmluYXJ5LCB3aXRoIGFyZ3VtZW50cyBhcmd2 IGFuZCBlbnZpcm9ubWVudCBlbnZ2LgorLy8gSWYgc3VjY2Vzc2Z1bCwgRXhlYyBuZXZlciByZXR1 cm5zLiAgSWYgaXQgZmFpbHMsIGl0IHJldHVybnMgYW4gRXJyb3IuCisvLyBGb3JrRXhlYyBpcyBh bG1vc3QgYWx3YXlzIGEgYmV0dGVyIHdheSB0byBleGVjdXRlIGEgcHJvZ3JhbS4KK2Z1bmMgRXhl YyhuYW1lIHN0cmluZywgYXJndiBbXXN0cmluZywgZW52diBbXXN0cmluZykgRXJyb3IgeworCWlm IGVudnYgPT0gbmlsIHsKKwkJZW52diA9IEVudmlyb24oKQorCX0KKwllIDo9IHN5c2NhbGwuRXhl YyhuYW1lLCBhcmd2LCBlbnZ2KQorCWlmIGUgIT0gMCB7CisJCXJldHVybiAmUGF0aEVycm9yeyJl eGVjIiwgbmFtZSwgRXJybm8oZSl9CisJfQorCXJldHVybiBuaWwKK30KKworLy8gVE9ETyhyc2Mp OiBTaG91bGQgb3MgaW1wbGVtZW50IGl0cyBvd24gc3lzY2FsbC5XYWl0U3RhdHVzCisvLyB3cmFw cGVyIHdpdGggdGhlIG1ldGhvZHMsIG9yIGlzIGV4cG9zaW5nIHRoZSB1bmRlcmx5aW5nIG9uZSBl bm91Z2g/CisvLworLy8gVE9ETyhyc2MpOiBDZXJ0YWlubHkgbmVlZCB0byBoYXZlIFJ1c2FnZSBz dHJ1Y3QsCisvLyBzaW5jZSBzeXNjYWxsIG9uZSBtaWdodCBoYXZlIGRpZmZlcmVudCBmaWVsZCB0 eXBlcyBhY3Jvc3MKKy8vIGRpZmZlcmVudCBPUy4KKworLy8gV2FpdG1zZyBzdG9yZXMgdGhlIGlu Zm9ybWF0aW9uIGFib3V0IGFuIGV4aXRlZCBwcm9jZXNzIGFzIHJlcG9ydGVkIGJ5IFdhaXQuCit0 eXBlIFdhaXRtc2cgc3RydWN0IHsKKwlQaWQgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAg IC8vIFRoZSBwcm9jZXNzJ3MgaWQuCisJc3lzY2FsbC5XYWl0U3RhdHVzICAgICAgICAgICAgICAg ICAvLyBTeXN0ZW0tZGVwZW5kZW50IHN0YXR1cyBpbmZvLgorCVJ1c2FnZSAgICAgICAgICAgICAq c3lzY2FsbC5SdXNhZ2UgLy8gU3lzdGVtLWRlcGVuZGVudCByZXNvdXJjZSB1c2FnZSBpbmZvLgor fQorCisvLyBPcHRpb25zIGZvciBXYWl0LgorY29uc3QgKAorCVdOT0hBTkcgICA9IHN5c2NhbGwu V05PSEFORyAgLy8gRG9uJ3Qgd2FpdCBpZiBubyBwcm9jZXNzIGhhcyBleGl0ZWQuCisJV1NUT1BQ RUQgID0gc3lzY2FsbC5XU1RPUFBFRCAvLyBJZiBzZXQsIHN0YXR1cyBvZiBzdG9wcGVkIHN1YnBy b2Nlc3NlcyBpcyBhbHNvIHJlcG9ydGVkLgorCVdVTlRSQUNFRCA9IFdTVE9QUEVECisJV1JVU0FH RSAgID0gMSA8PCAyMCAvLyBSZWNvcmQgcmVzb3VyY2UgdXNhZ2UuCispCisKKy8vIFdSVVNBR0Ug bXVzdCBub3QgYmUgdG9vIGhpZ2ggYSBiaXQsIHRvIGF2b2lkIGNsYXNoaW5nIHdpdGggTGludXgn cworLy8gV0NMT05FLCBXQUxMLCBhbmQgV05PVEhSRUFEIGZsYWdzLCB3aGljaCBzaXQgaW4gdGhl IHRvcCBmZXcgYml0cyBvZgorLy8gdGhlIG9wdGlvbnMKKworLy8gV2FpdCB3YWl0cyBmb3IgcHJv Y2VzcyBwaWQgdG8gZXhpdCBvciBzdG9wLCBhbmQgdGhlbiByZXR1cm5zIGEKKy8vIFdhaXRtc2cg ZGVzY3JpYmluZyBpdHMgc3RhdHVzIGFuZCBhbiBFcnJvciwgaWYgYW55LiBUaGUgb3B0aW9ucwor Ly8gKFdOT0hBTkcgZXRjLikgYWZmZWN0IHRoZSBiZWhhdmlvciBvZiB0aGUgV2FpdCBjYWxsLgor ZnVuYyBXYWl0KHBpZCBpbnQsIG9wdGlvbnMgaW50KSAodyAqV2FpdG1zZywgZXJyIEVycm9yKSB7 CisJdmFyIHN0YXR1cyBzeXNjYWxsLldhaXRTdGF0dXMKKwl2YXIgcnVzYWdlICpzeXNjYWxsLlJ1 c2FnZQorCWlmIG9wdGlvbnMmV1JVU0FHRSAhPSAwIHsKKwkJcnVzYWdlID0gbmV3KHN5c2NhbGwu UnVzYWdlKQorCQlvcHRpb25zIF49IFdSVVNBR0UKKwl9CisJcGlkMSwgZSA6PSBzeXNjYWxsLldh aXQ0KHBpZCwgJnN0YXR1cywgb3B0aW9ucywgcnVzYWdlKQorCWlmIGUgIT0gMCB7CisJCXJldHVy biBuaWwsIE5ld1N5c2NhbGxFcnJvcigid2FpdCIsIGUpCisJfQorCXcgPSBuZXcoV2FpdG1zZykK Kwl3LlBpZCA9IHBpZDEKKwl3LldhaXRTdGF0dXMgPSBzdGF0dXMKKwl3LlJ1c2FnZSA9IHJ1c2Fn ZQorCXJldHVybiB3LCBuaWwKK30KKworLy8gQ29udmVydCBpIHRvIGRlY2ltYWwgc3RyaW5nLgor ZnVuYyBpdG9kKGkgaW50KSBzdHJpbmcgeworCWlmIGkgPT0gMCB7CisJCXJldHVybiAiMCIKKwl9 CisKKwl1IDo9IHVpbnQ2NChpKQorCWlmIGkgPCAwIHsKKwkJdSA9IC11CisJfQorCisJLy8gQXNz ZW1ibGUgZGVjaW1hbCBpbiByZXZlcnNlIG9yZGVyLgorCXZhciBiIFszMl1ieXRlCisJYnAgOj0g bGVuKGIpCisJZm9yIDsgdSA+IDA7IHUgLz0gMTAgeworCQlicC0tCisJCWJbYnBdID0gYnl0ZSh1 JTEwKSArICcwJworCX0KKworCWlmIGkgPCAwIHsKKwkJYnAtLQorCQliW2JwXSA9ICctJworCX0K KworCXJldHVybiBzdHJpbmcoYlticDpdKQorfQorCitmdW5jICh3IFdhaXRtc2cpIFN0cmluZygp IHN0cmluZyB7CisJLy8gVE9ETyhhdXN0aW4pIFVzZSBzaWduYWwgbmFtZXMgd2hlbiBwb3NzaWJs ZT8KKwlyZXMgOj0gIiIKKwlzd2l0Y2ggeworCWNhc2Ugdy5FeGl0ZWQoKToKKwkJcmVzID0gImV4 aXQgc3RhdHVzICIgKyBpdG9kKHcuRXhpdFN0YXR1cygpKQorCWNhc2Ugdy5TaWduYWxlZCgpOgor CQlyZXMgPSAic2lnbmFsICIgKyBpdG9kKHcuU2lnbmFsKCkpCisJY2FzZSB3LlN0b3BwZWQoKToK KwkJcmVzID0gInN0b3Agc2lnbmFsICIgKyBpdG9kKHcuU3RvcFNpZ25hbCgpKQorCQlpZiB3LlN0 b3BTaWduYWwoKSA9PSBzeXNjYWxsLlNJR1RSQVAgJiYgdy5UcmFwQ2F1c2UoKSAhPSAwIHsKKwkJ CXJlcyArPSAiICh0cmFwICIgKyBpdG9kKHcuVHJhcENhdXNlKCkpICsgIikiCisJCX0KKwljYXNl IHcuQ29udGludWVkKCk6CisJCXJlcyA9ICJjb250aW51ZWQiCisJfQorCWlmIHcuQ29yZUR1bXAo KSB7CisJCXJlcyArPSAiIChjb3JlIGR1bXBlZCkiCisJfQorCXJldHVybiByZXMKK30KZGlmZiAt ciAwOWFiODY1ZDg3NWMgc3JjL3BrZy9vcy9maWxlLmdvCi0tLSBhL3NyYy9wa2cvb3MvZmlsZS5n bwlGcmkgSmFuIDE0IDIzOjAwOjAyIDIwMTEgLTA4MDAKKysrIGIvc3JjL3BrZy9vcy9maWxlLmdv CVNhdCBKYW4gMTUgMTM6MDA6MTMgMjAxMSArMDIwMApAQCAtODMsMTAgKzgzLDEwIEBACiAJaWYg biA8IDAgewogCQluID0gMAogCX0KLQlpZiBuID09IDAgJiYgZSA9PSAwIHsKKwlpZiBuID09IDAg JiYgIWlzZXJyb3IoZSkgewogCQlyZXR1cm4gMCwgRU9GCiAJfQotCWlmIGUgIT0gMCB7CisJaWYg aXNlcnJvcihlKSB7CiAJCWVyciA9ICZQYXRoRXJyb3J7InJlYWQiLCBmaWxlLm5hbWUsIEVycm5v KGUpfQogCX0KIAlyZXR1cm4gbiwgZXJyCkBAIC0xMDIsMTAgKzEwMiwxMCBAQAogCX0KIAlmb3Ig bGVuKGIpID4gMCB7CiAJCW0sIGUgOj0gc3lzY2FsbC5QcmVhZChmaWxlLmZkLCBiLCBvZmYpCi0J CWlmIG0gPT0gMCAmJiBlID09IDAgeworCQlpZiBtID09IDAgJiYgIWlzZXJyb3IoZSkgewogCQkJ cmV0dXJuIG4sIEVPRgogCQl9Ci0JCWlmIGUgIT0gMCB7CisJCWlmIGlzZXJyb3IoZSkgewogCQkJ ZXJyID0gJlBhdGhFcnJvcnsicmVhZCIsIGZpbGUubmFtZSwgRXJybm8oZSl9CiAJCQlicmVhawog CQl9CkBAIC0xMjcsMTUgKzEyNywxMCBAQAogCWlmIG4gPCAwIHsKIAkJbiA9IDAKIAl9Ci0JaWYg ZSA9PSBzeXNjYWxsLkVQSVBFIHsKLQkJZmlsZS5uZXBpcGUrKwotCQlpZiBmaWxlLm5lcGlwZSA+ PSAxMCB7Ci0JCQlFeGl0KHN5c2NhbGwuRVBJUEUpCi0JCX0KLQl9IGVsc2UgewotCQlmaWxlLm5l cGlwZSA9IDAKLQl9Ci0JaWYgZSAhPSAwIHsKKworCWVwaXBlY2hlY2soZmlsZSwgZSkKKworCWlm IGlzZXJyb3IoZSkgewogCQllcnIgPSAmUGF0aEVycm9yeyJ3cml0ZSIsIGZpbGUubmFtZSwgRXJy bm8oZSl9CiAJfQogCXJldHVybiBuLCBlcnIKQEAgLTE1MCw3ICsxNDUsNyBAQAogCX0KIAlmb3Ig bGVuKGIpID4gMCB7CiAJCW0sIGUgOj0gc3lzY2FsbC5Qd3JpdGUoZmlsZS5mZCwgYiwgb2ZmKQot CQlpZiBlICE9IDAgeworCQlpZiBpc2Vycm9yKGUpIHsKIAkJCWVyciA9ICZQYXRoRXJyb3J7Indy aXRlIiwgZmlsZS5uYW1lLCBFcnJubyhlKX0KIAkJCWJyZWFrCiAJCX0KQEAgLTE2NywxMCArMTYy LDEwIEBACiAvLyBJdCByZXR1cm5zIHRoZSBuZXcgb2Zmc2V0IGFuZCBhbiBFcnJvciwgaWYgYW55 LgogZnVuYyAoZmlsZSAqRmlsZSkgU2VlayhvZmZzZXQgaW50NjQsIHdoZW5jZSBpbnQpIChyZXQg aW50NjQsIGVyciBFcnJvcikgewogCXIsIGUgOj0gc3lzY2FsbC5TZWVrKGZpbGUuZmQsIG9mZnNl dCwgd2hlbmNlKQotCWlmIGUgPT0gMCAmJiBmaWxlLmRpcmluZm8gIT0gbmlsICYmIHIgIT0gMCB7 CisJaWYgIWlzZXJyb3IoZSkgJiYgZmlsZS5kaXJpbmZvICE9IG5pbCAmJiByICE9IDAgewogCQll ID0gc3lzY2FsbC5FSVNESVIKIAl9Ci0JaWYgZSAhPSAwIHsKKwlpZiBpc2Vycm9yKGUpIHsKIAkJ cmV0dXJuIDAsICZQYXRoRXJyb3J7InNlZWsiLCBmaWxlLm5hbWUsIEVycm5vKGUpfQogCX0KIAly ZXR1cm4gciwgbmlsCkBAIC0xODcsNzEgKzE4MiwxOSBAQAogCXJldHVybiBmaWxlLldyaXRlKGIp CiB9CiAKLS8vIFBpcGUgcmV0dXJucyBhIGNvbm5lY3RlZCBwYWlyIG9mIEZpbGVzOyByZWFkcyBm cm9tIHIgcmV0dXJuIGJ5dGVzIHdyaXR0ZW4gdG8gdy4KLS8vIEl0IHJldHVybnMgdGhlIGZpbGVz IGFuZCBhbiBFcnJvciwgaWYgYW55LgotZnVuYyBQaXBlKCkgKHIgKkZpbGUsIHcgKkZpbGUsIGVy ciBFcnJvcikgewotCXZhciBwIFsyXWludAotCi0JLy8gU2VlIC4uL3N5c2NhbGwvZXhlYy5nbyBm b3IgZGVzY3JpcHRpb24gb2YgbG9jay4KLQlzeXNjYWxsLkZvcmtMb2NrLlJMb2NrKCkKLQllIDo9 IHN5c2NhbGwuUGlwZShwWzA6XSkKLQlpZiBlICE9IDAgewotCQlzeXNjYWxsLkZvcmtMb2NrLlJV bmxvY2soKQotCQlyZXR1cm4gbmlsLCBuaWwsIE5ld1N5c2NhbGxFcnJvcigicGlwZSIsIGUpCi0J fQotCXN5c2NhbGwuQ2xvc2VPbkV4ZWMocFswXSkKLQlzeXNjYWxsLkNsb3NlT25FeGVjKHBbMV0p Ci0Jc3lzY2FsbC5Gb3JrTG9jay5SVW5sb2NrKCkKLQotCXJldHVybiBOZXdGaWxlKHBbMF0sICJ8 MCIpLCBOZXdGaWxlKHBbMV0sICJ8MSIpLCBuaWwKLX0KLQogLy8gTWtkaXIgY3JlYXRlcyBhIG5l dyBkaXJlY3Rvcnkgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHBlcm1pc3Npb24gYml0cy4K IC8vIEl0IHJldHVybnMgYW4gZXJyb3IsIGlmIGFueS4KIGZ1bmMgTWtkaXIobmFtZSBzdHJpbmcs IHBlcm0gdWludDMyKSBFcnJvciB7CiAJZSA6PSBzeXNjYWxsLk1rZGlyKG5hbWUsIHBlcm0pCi0J aWYgZSAhPSAwIHsKKwlpZiBpc2Vycm9yKGUpIHsKIAkJcmV0dXJuICZQYXRoRXJyb3J7Im1rZGly IiwgbmFtZSwgRXJybm8oZSl9CiAJfQogCXJldHVybiBuaWwKIH0KIAotLy8gU3RhdCByZXR1cm5z IGEgRmlsZUluZm8gc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIG5hbWVkIGZpbGUgYW5kIGFuIGVy cm9yLCBpZiBhbnkuCi0vLyBJZiBuYW1lIG5hbWVzIGEgdmFsaWQgc3ltYm9saWMgbGluaywgdGhl IHJldHVybmVkIEZpbGVJbmZvIGRlc2NyaWJlcwotLy8gdGhlIGZpbGUgcG9pbnRlZCBhdCBieSB0 aGUgbGluayBhbmQgaGFzIGZpLkZvbGxvd2VkU3ltbGluayBzZXQgdG8gdHJ1ZS4KLS8vIElmIG5h bWUgbmFtZXMgYW4gaW52YWxpZCBzeW1ib2xpYyBsaW5rLCB0aGUgcmV0dXJuZWQgRmlsZUluZm8g ZGVzY3JpYmVzCi0vLyB0aGUgbGluayBpdHNlbGYgYW5kIGhhcyBmaS5Gb2xsb3dlZFN5bWxpbmsg c2V0IHRvIGZhbHNlLgotZnVuYyBTdGF0KG5hbWUgc3RyaW5nKSAoZmkgKkZpbGVJbmZvLCBlcnIg RXJyb3IpIHsKLQl2YXIgbHN0YXQsIHN0YXQgc3lzY2FsbC5TdGF0X3QKLQllIDo9IHN5c2NhbGwu THN0YXQobmFtZSwgJmxzdGF0KQotCWlmIGUgIT0gMCB7Ci0JCXJldHVybiBuaWwsICZQYXRoRXJy b3J7InN0YXQiLCBuYW1lLCBFcnJubyhlKX0KLQl9Ci0Jc3RhdHAgOj0gJmxzdGF0Ci0JaWYgbHN0 YXQuTW9kZSZzeXNjYWxsLlNfSUZNVCA9PSBzeXNjYWxsLlNfSUZMTksgewotCQllIDo9IHN5c2Nh bGwuU3RhdChuYW1lLCAmc3RhdCkKLQkJaWYgZSA9PSAwIHsKLQkJCXN0YXRwID0gJnN0YXQKLQkJ fQotCX0KLQlyZXR1cm4gZmlsZUluZm9Gcm9tU3RhdChuYW1lLCBuZXcoRmlsZUluZm8pLCAmbHN0 YXQsIHN0YXRwKSwgbmlsCi19Ci0KLS8vIExzdGF0IHJldHVybnMgdGhlIEZpbGVJbmZvIHN0cnVj dHVyZSBkZXNjcmliaW5nIHRoZSBuYW1lZCBmaWxlIGFuZCBhbgotLy8gZXJyb3IsIGlmIGFueS4g IElmIHRoZSBmaWxlIGlzIGEgc3ltYm9saWMgbGluaywgdGhlIHJldHVybmVkIEZpbGVJbmZvCi0v LyBkZXNjcmliZXMgdGhlIHN5bWJvbGljIGxpbmsuICBMc3RhdCBtYWtlcyBubyBhdHRlbXB0IHRv IGZvbGxvdyB0aGUgbGluay4KLWZ1bmMgTHN0YXQobmFtZSBzdHJpbmcpIChmaSAqRmlsZUluZm8s IGVyciBFcnJvcikgewotCXZhciBzdGF0IHN5c2NhbGwuU3RhdF90Ci0JZSA6PSBzeXNjYWxsLkxz dGF0KG5hbWUsICZzdGF0KQotCWlmIGUgIT0gMCB7Ci0JCXJldHVybiBuaWwsICZQYXRoRXJyb3J7 ImxzdGF0IiwgbmFtZSwgRXJybm8oZSl9Ci0JfQotCXJldHVybiBmaWxlSW5mb0Zyb21TdGF0KG5h bWUsIG5ldyhGaWxlSW5mbyksICZzdGF0LCAmc3RhdCksIG5pbAotfQotCiAvLyBDaGRpciBjaGFu Z2VzIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBuYW1lZCBkaXJlY3Rvcnku CiBmdW5jIENoZGlyKGRpciBzdHJpbmcpIEVycm9yIHsKLQlpZiBlIDo9IHN5c2NhbGwuQ2hkaXIo ZGlyKTsgZSAhPSAwIHsKKwlpZiBlIDo9IHN5c2NhbGwuQ2hkaXIoZGlyKTsgaXNlcnJvcihlKSB7 CiAJCXJldHVybiAmUGF0aEVycm9yeyJjaGRpciIsIGRpciwgRXJybm8oZSl9CiAJfQogCXJldHVy biBuaWwKQEAgLTI2MCwxNzkgKzIwMyw4IEBACiAvLyBDaGRpciBjaGFuZ2VzIHRoZSBjdXJyZW50 IHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBmaWxlLAogLy8gd2hpY2ggbXVzdCBiZSBhIGRpcmVj dG9yeS4KIGZ1bmMgKGYgKkZpbGUpIENoZGlyKCkgRXJyb3IgewotCWlmIGUgOj0gc3lzY2FsbC5G Y2hkaXIoZi5mZCk7IGUgIT0gMCB7CisJaWYgZSA6PSBzeXNjYWxsLkZjaGRpcihmLmZkKTsgaXNl cnJvcihlKSB7CiAJCXJldHVybiAmUGF0aEVycm9yeyJjaGRpciIsIGYubmFtZSwgRXJybm8oZSl9 CiAJfQogCXJldHVybiBuaWwKIH0KLQotLy8gUmVtb3ZlIHJlbW92ZXMgdGhlIG5hbWVkIGZpbGUg b3IgZGlyZWN0b3J5LgotZnVuYyBSZW1vdmUobmFtZSBzdHJpbmcpIEVycm9yIHsKLQkvLyBTeXN0 ZW0gY2FsbCBpbnRlcmZhY2UgZm9yY2VzIHVzIHRvIGtub3cKLQkvLyB3aGV0aGVyIG5hbWUgaXMg YSBmaWxlIG9yIGRpcmVjdG9yeS4KLQkvLyBUcnkgYm90aDogaXQgaXMgY2hlYXBlciBvbiBhdmVy YWdlIHRoYW4KLQkvLyBkb2luZyBhIFN0YXQgcGx1cyB0aGUgcmlnaHQgb25lLgotCWUgOj0gc3lz Y2FsbC5VbmxpbmsobmFtZSkKLQlpZiBlID09IDAgewotCQlyZXR1cm4gbmlsCi0JfQotCWUxIDo9 IHN5c2NhbGwuUm1kaXIobmFtZSkKLQlpZiBlMSA9PSAwIHsKLQkJcmV0dXJuIG5pbAotCX0KLQot CS8vIEJvdGggZmFpbGVkOiBmaWd1cmUgb3V0IHdoaWNoIGVycm9yIHRvIHJldHVybi4KLQkvLyBP UyBYIGFuZCBMaW51eCBkaWZmZXIgb24gd2hldGhlciB1bmxpbmsoZGlyKQotCS8vIHJldHVybnMg RUlTRElSLCBzbyBjYW4ndCB1c2UgdGhhdC4gIEhvd2V2ZXIsCi0JLy8gYm90aCBhZ3JlZSB0aGF0 IHJtZGlyKGZpbGUpIHJldHVybnMgRU5PVERJUiwKLQkvLyBzbyB3ZSBjYW4gdXNlIHRoYXQgdG8g ZGVjaWRlIHdoaWNoIGVycm9yIGlzIHJlYWwuCi0JLy8gUm1kaXIgbWlnaHQgYWxzbyByZXR1cm4g RU5PVERJUiBpZiBnaXZlbiBhIGJhZAotCS8vIGZpbGUgcGF0aCwgbGlrZSAvZXRjL3Bhc3N3ZC9m b28sIGJ1dCBpbiB0aGF0IGNhc2UsCi0JLy8gYm90aCBlcnJvcnMgd2lsbCBiZSBFTk9URElSLCBz byBpdCdzIG9rYXkgdG8KLQkvLyB1c2UgdGhlIGVycm9yIGZyb20gdW5saW5rLgotCS8vIEZvciB3 aW5kb3dzIHN5c2NhbGwuRU5PVERJUiBpcyBzZXQKLQkvLyB0byBzeXNjYWxsLkVSUk9SX0RJUkVD VE9SWSwgaG9wZWZ1bGx5IGl0IHNob3VsZAotCS8vIGRvIHRoZSB0cmljay4KLQlpZiBlMSAhPSBz eXNjYWxsLkVOT1RESVIgewotCQllID0gZTEKLQl9Ci0JcmV0dXJuICZQYXRoRXJyb3J7InJlbW92 ZSIsIG5hbWUsIEVycm5vKGUpfQotfQotCi0vLyBMaW5rRXJyb3IgcmVjb3JkcyBhbiBlcnJvciBk dXJpbmcgYSBsaW5rIG9yIHN5bWxpbmsgb3IgcmVuYW1lCi0vLyBzeXN0ZW0gY2FsbCBhbmQgdGhl IHBhdGhzIHRoYXQgY2F1c2VkIGl0LgotdHlwZSBMaW5rRXJyb3Igc3RydWN0IHsKLQlPcCAgICBz dHJpbmcKLQlPbGQgICBzdHJpbmcKLQlOZXcgICBzdHJpbmcKLQlFcnJvciBFcnJvcgotfQotCi1m dW5jIChlICpMaW5rRXJyb3IpIFN0cmluZygpIHN0cmluZyB7Ci0JcmV0dXJuIGUuT3AgKyAiICIg KyBlLk9sZCArICIgIiArIGUuTmV3ICsgIjogIiArIGUuRXJyb3IuU3RyaW5nKCkKLX0KLQotLy8g TGluayBjcmVhdGVzIGEgaGFyZCBsaW5rLgotZnVuYyBMaW5rKG9sZG5hbWUsIG5ld25hbWUgc3Ry aW5nKSBFcnJvciB7Ci0JZSA6PSBzeXNjYWxsLkxpbmsob2xkbmFtZSwgbmV3bmFtZSkKLQlpZiBl ICE9IDAgewotCQlyZXR1cm4gJkxpbmtFcnJvcnsibGluayIsIG9sZG5hbWUsIG5ld25hbWUsIEVy cm5vKGUpfQotCX0KLQlyZXR1cm4gbmlsCi19Ci0KLS8vIFN5bWxpbmsgY3JlYXRlcyBhIHN5bWJv bGljIGxpbmsuCi1mdW5jIFN5bWxpbmsob2xkbmFtZSwgbmV3bmFtZSBzdHJpbmcpIEVycm9yIHsK LQllIDo9IHN5c2NhbGwuU3ltbGluayhvbGRuYW1lLCBuZXduYW1lKQotCWlmIGUgIT0gMCB7Ci0J CXJldHVybiAmTGlua0Vycm9yeyJzeW1saW5rIiwgb2xkbmFtZSwgbmV3bmFtZSwgRXJybm8oZSl9 Ci0JfQotCXJldHVybiBuaWwKLX0KLQotLy8gUmVhZGxpbmsgcmVhZHMgdGhlIGNvbnRlbnRzIG9m IGEgc3ltYm9saWMgbGluazogdGhlIGRlc3RpbmF0aW9uIG9mCi0vLyB0aGUgbGluay4gIEl0IHJl dHVybnMgdGhlIGNvbnRlbnRzIGFuZCBhbiBFcnJvciwgaWYgYW55LgotZnVuYyBSZWFkbGluayhu YW1lIHN0cmluZykgKHN0cmluZywgRXJyb3IpIHsKLQlmb3IgbGVuIDo9IDEyODsgOyBsZW4gKj0g MiB7Ci0JCWIgOj0gbWFrZShbXWJ5dGUsIGxlbikKLQkJbiwgZSA6PSBzeXNjYWxsLlJlYWRsaW5r KG5hbWUsIGIpCi0JCWlmIGUgIT0gMCB7Ci0JCQlyZXR1cm4gIiIsICZQYXRoRXJyb3J7InJlYWRs aW5rIiwgbmFtZSwgRXJybm8oZSl9Ci0JCX0KLQkJaWYgbiA8IGxlbiB7Ci0JCQlyZXR1cm4gc3Ry aW5nKGJbMDpuXSksIG5pbAotCQl9Ci0JfQotCS8vIFNpbGVuY2UgNmcuCi0JcmV0dXJuICIiLCBu aWwKLX0KLQotLy8gUmVuYW1lIHJlbmFtZXMgYSBmaWxlLgotZnVuYyBSZW5hbWUob2xkbmFtZSwg bmV3bmFtZSBzdHJpbmcpIEVycm9yIHsKLQllIDo9IHN5c2NhbGwuUmVuYW1lKG9sZG5hbWUsIG5l d25hbWUpCi0JaWYgZSAhPSAwIHsKLQkJcmV0dXJuICZMaW5rRXJyb3J7InJlbmFtZSIsIG9sZG5h bWUsIG5ld25hbWUsIEVycm5vKGUpfQotCX0KLQlyZXR1cm4gbmlsCi19Ci0KLS8vIENobW9kIGNo YW5nZXMgdGhlIG1vZGUgb2YgdGhlIG5hbWVkIGZpbGUgdG8gbW9kZS4KLS8vIElmIHRoZSBmaWxl IGlzIGEgc3ltYm9saWMgbGluaywgaXQgY2hhbmdlcyB0aGUgbW9kZSBvZiB0aGUgbGluaydzIHRh cmdldC4KLWZ1bmMgQ2htb2QobmFtZSBzdHJpbmcsIG1vZGUgdWludDMyKSBFcnJvciB7Ci0JaWYg ZSA6PSBzeXNjYWxsLkNobW9kKG5hbWUsIG1vZGUpOyBlICE9IDAgewotCQlyZXR1cm4gJlBhdGhF cnJvcnsiY2htb2QiLCBuYW1lLCBFcnJubyhlKX0KLQl9Ci0JcmV0dXJuIG5pbAotfQotCi0vLyBD aG1vZCBjaGFuZ2VzIHRoZSBtb2RlIG9mIHRoZSBmaWxlIHRvIG1vZGUuCi1mdW5jIChmICpGaWxl KSBDaG1vZChtb2RlIHVpbnQzMikgRXJyb3IgewotCWlmIGUgOj0gc3lzY2FsbC5GY2htb2QoZi5m ZCwgbW9kZSk7IGUgIT0gMCB7Ci0JCXJldHVybiAmUGF0aEVycm9yeyJjaG1vZCIsIGYubmFtZSwg RXJybm8oZSl9Ci0JfQotCXJldHVybiBuaWwKLX0KLQotLy8gQ2hvd24gY2hhbmdlcyB0aGUgbnVt ZXJpYyB1aWQgYW5kIGdpZCBvZiB0aGUgbmFtZWQgZmlsZS4KLS8vIElmIHRoZSBmaWxlIGlzIGEg c3ltYm9saWMgbGluaywgaXQgY2hhbmdlcyB0aGUgdWlkIGFuZCBnaWQgb2YgdGhlIGxpbmsncyB0 YXJnZXQuCi1mdW5jIENob3duKG5hbWUgc3RyaW5nLCB1aWQsIGdpZCBpbnQpIEVycm9yIHsKLQlp ZiBlIDo9IHN5c2NhbGwuQ2hvd24obmFtZSwgdWlkLCBnaWQpOyBlICE9IDAgewotCQlyZXR1cm4g JlBhdGhFcnJvcnsiY2hvd24iLCBuYW1lLCBFcnJubyhlKX0KLQl9Ci0JcmV0dXJuIG5pbAotfQot Ci0vLyBMY2hvd24gY2hhbmdlcyB0aGUgbnVtZXJpYyB1aWQgYW5kIGdpZCBvZiB0aGUgbmFtZWQg ZmlsZS4KLS8vIElmIHRoZSBmaWxlIGlzIGEgc3ltYm9saWMgbGluaywgaXQgY2hhbmdlcyB0aGUg dWlkIGFuZCBnaWQgb2YgdGhlIGxpbmsgaXRzZWxmLgotZnVuYyBMY2hvd24obmFtZSBzdHJpbmcs IHVpZCwgZ2lkIGludCkgRXJyb3IgewotCWlmIGUgOj0gc3lzY2FsbC5MY2hvd24obmFtZSwgdWlk LCBnaWQpOyBlICE9IDAgewotCQlyZXR1cm4gJlBhdGhFcnJvcnsibGNob3duIiwgbmFtZSwgRXJy bm8oZSl9Ci0JfQotCXJldHVybiBuaWwKLX0KLQotLy8gQ2hvd24gY2hhbmdlcyB0aGUgbnVtZXJp YyB1aWQgYW5kIGdpZCBvZiB0aGUgbmFtZWQgZmlsZS4KLWZ1bmMgKGYgKkZpbGUpIENob3duKHVp ZCwgZ2lkIGludCkgRXJyb3IgewotCWlmIGUgOj0gc3lzY2FsbC5GY2hvd24oZi5mZCwgdWlkLCBn aWQpOyBlICE9IDAgewotCQlyZXR1cm4gJlBhdGhFcnJvcnsiY2hvd24iLCBmLm5hbWUsIEVycm5v KGUpfQotCX0KLQlyZXR1cm4gbmlsCi19Ci0KLS8vIFRydW5jYXRlIGNoYW5nZXMgdGhlIHNpemUg b2YgdGhlIGZpbGUuCi0vLyBJdCBkb2VzIG5vdCBjaGFuZ2UgdGhlIEkvTyBvZmZzZXQuCi1mdW5j IChmICpGaWxlKSBUcnVuY2F0ZShzaXplIGludDY0KSBFcnJvciB7Ci0JaWYgZSA6PSBzeXNjYWxs LkZ0cnVuY2F0ZShmLmZkLCBzaXplKTsgZSAhPSAwIHsKLQkJcmV0dXJuICZQYXRoRXJyb3J7InRy dW5jYXRlIiwgZi5uYW1lLCBFcnJubyhlKX0KLQl9Ci0JcmV0dXJuIG5pbAotfQotCi0vLyBTeW5j IGNvbW1pdHMgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIGZpbGUgdG8gc3RhYmxlIHN0b3Jh Z2UuCi0vLyBUeXBpY2FsbHksIHRoaXMgbWVhbnMgZmx1c2hpbmcgdGhlIGZpbGUgc3lzdGVtJ3Mg aW4tbWVtb3J5IGNvcHkKLS8vIG9mIHJlY2VudGx5IHdyaXR0ZW4gZGF0YSB0byBkaXNrLgotZnVu YyAoZmlsZSAqRmlsZSkgU3luYygpIChlcnIgRXJyb3IpIHsKLQlpZiBmaWxlID09IG5pbCB7Ci0J CXJldHVybiBFSU5WQUwKLQl9Ci0JaWYgZSA6PSBzeXNjYWxsLkZzeW5jKGZpbGUuZmQpOyBlICE9 IDAgewotCQlyZXR1cm4gTmV3U3lzY2FsbEVycm9yKCJmc3luYyIsIGUpCi0JfQotCXJldHVybiBu aWwKLX0KLQotLy8gQ2h0aW1lcyBjaGFuZ2VzIHRoZSBhY2Nlc3MgYW5kIG1vZGlmaWNhdGlvbiB0 aW1lcyBvZiB0aGUgbmFtZWQKLS8vIGZpbGUsIHNpbWlsYXIgdG8gdGhlIFVuaXggdXRpbWUoKSBv ciB1dGltZXMoKSBmdW5jdGlvbnMuCi0vLwotLy8gVGhlIGFyZ3VtZW50IHRpbWVzIGFyZSBpbiBu YW5vc2Vjb25kcywgYWx0aG91Z2ggdGhlIHVuZGVybHlpbmcKLS8vIGZpbGVzeXN0ZW0gbWF5IHRy dW5jYXRlIG9yIHJvdW5kIHRoZSB2YWx1ZXMgdG8gYSBtb3JlCi0vLyBjb2Fyc2UgdGltZSB1bml0 LgotZnVuYyBDaHRpbWVzKG5hbWUgc3RyaW5nLCBhdGltZV9ucyBpbnQ2NCwgbXRpbWVfbnMgaW50 NjQpIEVycm9yIHsKLQl2YXIgdXRpbWVzIFsyXXN5c2NhbGwuVGltZXZhbAotCXV0aW1lc1swXSA9 IHN5c2NhbGwuTnNlY1RvVGltZXZhbChhdGltZV9ucykKLQl1dGltZXNbMV0gPSBzeXNjYWxsLk5z ZWNUb1RpbWV2YWwobXRpbWVfbnMpCi0JaWYgZSA6PSBzeXNjYWxsLlV0aW1lcyhuYW1lLCB1dGlt ZXNbMDpdKTsgZSAhPSAwIHsKLQkJcmV0dXJuICZQYXRoRXJyb3J7ImNodGltZXMiLCBuYW1lLCBF cnJubyhlKX0KLQl9Ci0JcmV0dXJuIG5pbAotfQpkaWZmIC1yIDA5YWI4NjVkODc1YyBzcmMvcGtn L29zL2ZpbGVfcGxhbjkuZ28KLS0tIC9kZXYvbnVsbAlUaHUgSmFuIDAxIDAwOjAwOjAwIDE5NzAg KzAwMDAKKysrIGIvc3JjL3BrZy9vcy9maWxlX3BsYW45LmdvCVNhdCBKYW4gMTUgMTM6MDA6MTMg MjAxMSArMDIwMApAQCAtMCwwICsxLDIwNCBAQAorLy8gQ29weXJpZ2h0IDIwMDEwIFRoZSBHbyBB dXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUg aXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUKKy8vIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQg aW4gdGhlIExJQ0VOU0UgZmlsZS4KKworcGFja2FnZSBvcworCitpbXBvcnQgKAorCSJydW50aW1l IgorCSJzeXNjYWxsIgorKQorCitmdW5jIGVwaXBlY2hlY2soZmlsZSAqRmlsZSwgZSBzeXNjYWxs LkVycm9yKSB7Cit9CisKKworLy8gRGV2TnVsbCBpcyB0aGUgbmFtZSBvZiB0aGUgb3BlcmF0aW5n IHN5c3RlbSdzIGBgbnVsbCBkZXZpY2UuJycKKy8vIE9uIFVuaXgtbGlrZSBzeXN0ZW1zLCBpdCBp cyAiL2Rldi9udWxsIjsgb24gV2luZG93cywgIk5VTCIuCitjb25zdCBEZXZOdWxsID0gIiNjL251 bGwiCisKKy8vIE9wZW4gb3BlbnMgdGhlIG5hbWVkIGZpbGUgd2l0aCBzcGVjaWZpZWQgZmxhZyAo T19SRE9OTFkgZXRjLikgYW5kIHBlcm0uCisvLyBJZiBzdWNjZXNzZnVsLCBtZXRob2RzIG9uIHRo ZSByZXR1cm5lZCBGaWxlIGNhbiBiZSB1c2VkIGZvciBJL08uCisvLyBJdCByZXR1cm5zIHRoZSBG aWxlIGFuZCBhbiBFcnJvciwgaWYgYW55LgorZnVuYyBPcGVuKG5hbWUgc3RyaW5nLCBmbGFnIGlu dCwgcGVybSB1aW50MzIpIChmaWxlICpGaWxlLCBlcnIgRXJyb3IpIHsKKwl2YXIgZmQgaW50CisJ dmFyIGUgc3lzY2FsbC5FcnJvcgorCisJaWYgZmxhZyZPX0NSRUFUID09IE9fQ1JFQVQgeworCQlm ZCwgZSA9IHN5c2NhbGwuQ3JlYXRlKG5hbWUsIGZsYWcgJiBeT19DUkVBVCwgcGVybSkKKwl9IGVs c2UgeworCQlmZCwgZSA9IHN5c2NhbGwuT3BlbihuYW1lLCBmbGFnKQorCX0KKworCWlmIGUgIT0g bmlsIHsKKwkJcmV0dXJuIG5pbCwgJlBhdGhFcnJvcnsib3BlbiIsIG5hbWUsIGV9CisJfQorCisJ cmV0dXJuIE5ld0ZpbGUoZmQsIG5hbWUpLCBuaWwKK30KKworLy8gQ2xvc2UgY2xvc2VzIHRoZSBG aWxlLCByZW5kZXJpbmcgaXQgdW51c2FibGUgZm9yIEkvTy4KKy8vIEl0IHJldHVybnMgYW4gRXJy b3IsIGlmIGFueS4KK2Z1bmMgKGZpbGUgKkZpbGUpIENsb3NlKCkgRXJyb3IgeworCWlmIGZpbGUg PT0gbmlsIHx8IGZpbGUuZmQgPCAwIHsKKwkJcmV0dXJuIHN5c2NhbGwuRWJhZGZkCisJfQorCXZh ciBlcnIgRXJyb3IKKwlpZiBlIDo9IHN5c2NhbGwuQ2xvc2UoZmlsZS5mZCk7IGUgIT0gbmlsIHsK KwkJZXJyID0gJlBhdGhFcnJvcnsiY2xvc2UiLCBmaWxlLm5hbWUsIGV9CisJfQorCWZpbGUuZmQg PSAtMSAvLyBzbyBpdCBjYW4ndCBiZSBjbG9zZWQgYWdhaW4KKworCS8vIG5vIG5lZWQgZm9yIGEg ZmluYWxpemVyIGFueW1vcmUKKwlydW50aW1lLlNldEZpbmFsaXplcihmaWxlLCBuaWwpCisJcmV0 dXJuIGVycgorfQorCisvLyBTdGF0IHJldHVybnMgdGhlIEZpbGVJbmZvIHN0cnVjdHVyZSBkZXNj cmliaW5nIGZpbGUuCisvLyBJdCByZXR1cm5zIHRoZSBGaWxlSW5mbyBhbmQgYW4gZXJyb3IsIGlm IGFueS4KK2Z1bmMgKGZpbGUgKkZpbGUpIFN0YXQoKSAoZmkgKkZpbGVJbmZvLCBlcnIgRXJyb3Ip IHsKKwlyZXR1cm4gZGlyc3RhdChmaWxlKQorfQorCisvLyBUcnVuY2F0ZSBjaGFuZ2VzIHRoZSBz aXplIG9mIHRoZSBmaWxlLgorLy8gSXQgZG9lcyBub3QgY2hhbmdlIHRoZSBJL08gb2Zmc2V0Lgor ZnVuYyAoZiAqRmlsZSkgVHJ1bmNhdGUoc2l6ZSBpbnQ2NCkgRXJyb3IgeworCWQgOj0gbnVsbERp cgorCisJZC5MZW5ndGggPSB1aW50NjQoc2l6ZSkKKworCWlmIGUgOj0gc3lzY2FsbC5Gd3N0YXQo Zi5mZCwgcGRpcihuaWwsICZkKSk7IGlzZXJyb3IoZSkgeworCQlyZXR1cm4gJlBhdGhFcnJvcnsi dHJ1bmNhdGUiLCBmLm5hbWUsIGV9CisJfQorCXJldHVybiBuaWwKK30KKworCisvLyBTeW5jIGNv bW1pdHMgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIGZpbGUgdG8gc3RhYmxlIHN0b3JhZ2Uu CisvLyBUeXBpY2FsbHksIHRoaXMgbWVhbnMgZmx1c2hpbmcgdGhlIGZpbGUgc3lzdGVtJ3MgaW4t bWVtb3J5IGNvcHkKKy8vIG9mIHJlY2VudGx5IHdyaXR0ZW4gZGF0YSB0byBkaXNrLgorZnVuYyAo ZiAqRmlsZSkgU3luYygpIChlcnIgRXJyb3IpIHsKKwlpZiBmID09IG5pbCB7CisJCXJldHVybiBF SU5WQUwKKwl9CisKKwlkIDo9IG51bGxEaXIKKworCWlmIGUgOj0gc3lzY2FsbC5Gd3N0YXQoZi5m ZCwgcGRpcihuaWwsICZkKSk7IGlzZXJyb3IoZSkgeworCQlyZXR1cm4gTmV3U3lzY2FsbEVycm9y KCJmc3luYyIsIGUpCisJfQorCisJcmV0dXJuIG5pbAorfQorCisvLyBUcnVuY2F0ZSBjaGFuZ2Vz IHRoZSBzaXplIG9mIHRoZSBuYW1lZCBmaWxlLgorLy8gSWYgdGhlIGZpbGUgaXMgYSBzeW1ib2xp YyBsaW5rLCBpdCBjaGFuZ2VzIHRoZSBzaXplIG9mIHRoZSBsaW5rJ3MgdGFyZ2V0LgorZnVuYyBU cnVuY2F0ZShuYW1lIHN0cmluZywgc2l6ZSBpbnQ2NCkgRXJyb3IgeworCWQgOj0gbnVsbERpcgor CisJZC5MZW5ndGggPSB1aW50NjQoc2l6ZSkKKworCWlmIGUgOj0gc3lzY2FsbC5Xc3RhdChuYW1l LCBwZGlyKG5pbCwgJmQpKTsgaXNlcnJvcihlKSB7CisJCXJldHVybiAmUGF0aEVycm9yeyJ0cnVu Y2F0ZSIsIG5hbWUsIGV9CisJfQorCXJldHVybiBuaWwKK30KKworLy8gUmVtb3ZlIHJlbW92ZXMg dGhlIG5hbWVkIGZpbGUgb3IgZGlyZWN0b3J5LgorZnVuYyBSZW1vdmUobmFtZSBzdHJpbmcpIEVy cm9yIHsKKwlpZiBlIDo9IHN5c2NhbGwuUmVtb3ZlKG5hbWUpOyBpc2Vycm9yKGUpIHsKKwkJcmV0 dXJuICZQYXRoRXJyb3J7InJlbW92ZSIsIG5hbWUsIGV9CisJfQorCXJldHVybiBuaWwKK30KKwor ZnVuYyBSZW5hbWUob2xkbmFtZSwgbmV3bmFtZSBzdHJpbmcpIEVycm9yIHsKKwlkIDo9IG51bGxE aXIKKworCWQuTmFtZSA9IG5ld25hbWUKKworCWlmIGUgOj0gc3lzY2FsbC5Xc3RhdChvbGRuYW1l LCBwZGlyKG5pbCwgJmQpKTsgaXNlcnJvcihlKSB7CisJCXJldHVybiAmUGF0aEVycm9yeyJyZW5h bWUiLCBvbGRuYW1lLCBlfQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgQ2htb2QobmFtZSBz dHJpbmcsIG1vZGUgdWludDMyKSBFcnJvciB7CisJZCA6PSBudWxsRGlyCisKKwlkLk1vZGUgPSBt b2RlICYgMDc3NworCisJaWYgZSA6PSBzeXNjYWxsLldzdGF0KG5hbWUsIHBkaXIobmlsLCAmZCkp OyBpc2Vycm9yKGUpIHsKKwkJcmV0dXJuICZQYXRoRXJyb3J7ImNobW9kIiwgbmFtZSwgZX0KKwl9 CisJcmV0dXJuIG5pbAorfQorCitmdW5jIENob3duUGxhbjkobmFtZSwgdWlkLCBnaWQgc3RyaW5n KSBFcnJvciB7CisJZCA6PSBudWxsRGlyCisKKwlkLlVpZCA9IHVpZAorCWQuR2lkID0gZ2lkCisK KwlpZiBlIDo9IHN5c2NhbGwuV3N0YXQobmFtZSwgcGRpcihuaWwsICZkKSk7IGlzZXJyb3IoZSkg eworCQlyZXR1cm4gJlBhdGhFcnJvcnsiY2hvd25fcGxhbjkiLCBuYW1lLCBlfQorCX0KKwlyZXR1 cm4gbmlsCit9CisKKy8vIENodGltZXMgY2hhbmdlcyB0aGUgYWNjZXNzIGFuZCBtb2RpZmljYXRp b24gdGltZXMgb2YgdGhlIG5hbWVkCisvLyBmaWxlLCBzaW1pbGFyIHRvIHRoZSBVbml4IHV0aW1l KCkgb3IgdXRpbWVzKCkgZnVuY3Rpb25zLgorLy8KKy8vIFRoZSBhcmd1bWVudCB0aW1lcyBhcmUg aW4gbmFub3NlY29uZHMsIGFsdGhvdWdoIHRoZSB1bmRlcmx5aW5nCisvLyBmaWxlc3lzdGVtIG1h eSB0cnVuY2F0ZSBvciByb3VuZCB0aGUgdmFsdWVzIHRvIGEgbW9yZQorLy8gY29hcnNlIHRpbWUg dW5pdC4KK2Z1bmMgQ2h0aW1lcyhuYW1lIHN0cmluZywgYXRpbWVfbnMgaW50NjQsIG10aW1lX25z IGludDY0KSBFcnJvciB7CisJZCA6PSBudWxsRGlyCisKKwlkLkF0aW1lID0gdWludDMyKGF0aW1l X25zIC8gMWU5KQorCWQuTXRpbWUgPSB1aW50MzIobXRpbWVfbnMgLyAxZTkpCisKKwlpZiBlIDo9 IHN5c2NhbGwuV3N0YXQobmFtZSwgcGRpcihuaWwsICZkKSk7IGlzZXJyb3IoZSkgeworCQlyZXR1 cm4gJlBhdGhFcnJvcnsiY2h0aW1lcyIsIG5hbWUsIGV9CisJfQorCXJldHVybiBuaWwKK30KKwor ZnVuYyBQaXBlKCkgKHIgKkZpbGUsIHcgKkZpbGUsIGVyciBFcnJvcikgeworCXZhciBwIFsyXWlu dAorCisJaWYgZSA6PSBzeXNjYWxsLlBpcGUocFswOl0pOyBpc2Vycm9yKGUpIHsKKwkJcmV0dXJu IG5pbCwgbmlsLCBOZXdTeXNjYWxsRXJyb3IoInBpcGUiLCBlKQorCX0KKworCXJldHVybiBOZXdG aWxlKHBbMF0sICJ8MCIpLCBOZXdGaWxlKHBbMV0sICJ8MSIpLCBuaWwKK30KKworCisvLyBub3Qg c3VwcG9ydGVkIG9uIFBsYW4gOQorCisvLyBMaW5rIGNyZWF0ZXMgYSBoYXJkIGxpbmsuCitmdW5j IExpbmsob2xkbmFtZSwgbmV3bmFtZSBzdHJpbmcpIEVycm9yIHsKKwlyZXR1cm4gRVBMQU45Cit9 CisKK2Z1bmMgU3ltbGluayhvbGRuYW1lLCBuZXduYW1lIHN0cmluZykgRXJyb3IgeworCXJldHVy biBFUExBTjkKK30KKworZnVuYyBSZWFkbGluayhuYW1lIHN0cmluZykgKHN0cmluZywgRXJyb3Ip IHsKKwlyZXR1cm4gIiIsIEVQTEFOOQorfQorCitmdW5jIENob3duKG5hbWUgc3RyaW5nLCB1aWQs IGdpZCBpbnQpIEVycm9yIHsKKwlyZXR1cm4gRVBMQU45Cit9CisKK2Z1bmMgTGNob3duKG5hbWUg c3RyaW5nLCB1aWQsIGdpZCBpbnQpIEVycm9yIHsKKwlyZXR1cm4gRVBMQU45Cit9CisKKy8vIENo b3duIGNoYW5nZXMgdGhlIG51bWVyaWMgdWlkIGFuZCBnaWQgb2YgdGhlIG5hbWVkIGZpbGUuCitm dW5jIChmICpGaWxlKSBDaG93bih1aWQsIGdpZCBpbnQpIEVycm9yIHsKKwlyZXR1cm4gRVBMQU45 Cit9CmRpZmYgLXIgMDlhYjg2NWQ4NzVjIHNyYy9wa2cvb3MvZmlsZV9wb3NpeC5nbwotLS0gL2Rl di9udWxsCVRodSBKYW4gMDEgMDA6MDA6MDAgMTk3MCArMDAwMAorKysgYi9zcmMvcGtnL29zL2Zp bGVfcG9zaXguZ28JU2F0IEphbiAxNSAxMzowMDoxMyAyMDExICswMjAwCkBAIC0wLDAgKzEsMjQ2 IEBACisvLyBDb3B5cmlnaHQgMjAwOSBUaGUgR28gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZl ZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxl CisvLyBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8v IFRoZSBvcyBwYWNrYWdlIHByb3ZpZGVzIGEgcGxhdGZvcm0taW5kZXBlbmRlbnQgaW50ZXJmYWNl IHRvIG9wZXJhdGluZworLy8gc3lzdGVtIGZ1bmN0aW9uYWxpdHkuICBUaGUgZGVzaWduIGlzIFVu aXgtbGlrZS4KK3BhY2thZ2Ugb3MKKworaW1wb3J0ICgKKwkic3lzY2FsbCIKKykKKworZnVuYyBl cGlwZWNoZWNrKGZpbGUgKkZpbGUsIGUgaW50KSB7CisJaWYgZSA9PSBzeXNjYWxsLkVQSVBFIHsK KwkJZmlsZS5uZXBpcGUrKworCQlpZiBmaWxlLm5lcGlwZSA+PSAxMCB7CisJCQlFeGl0KHN5c2Nh bGwuRVBJUEUpCisJCX0KKwl9IGVsc2UgeworCQlmaWxlLm5lcGlwZSA9IDAKKwl9Cit9CisKKwor Ly8gUGlwZSByZXR1cm5zIGEgY29ubmVjdGVkIHBhaXIgb2YgRmlsZXM7IHJlYWRzIGZyb20gciBy ZXR1cm4gYnl0ZXMgd3JpdHRlbiB0byB3LgorLy8gSXQgcmV0dXJucyB0aGUgZmlsZXMgYW5kIGFu IEVycm9yLCBpZiBhbnkuCitmdW5jIFBpcGUoKSAociAqRmlsZSwgdyAqRmlsZSwgZXJyIEVycm9y KSB7CisJdmFyIHAgWzJdaW50CisKKwkvLyBTZWUgLi4vc3lzY2FsbC9leGVjLmdvIGZvciBkZXNj cmlwdGlvbiBvZiBsb2NrLgorCXN5c2NhbGwuRm9ya0xvY2suUkxvY2soKQorCWUgOj0gc3lzY2Fs bC5QaXBlKHBbMDpdKQorCWlmIGlzZXJyb3IoZSkgeworCQlzeXNjYWxsLkZvcmtMb2NrLlJVbmxv Y2soKQorCQlyZXR1cm4gbmlsLCBuaWwsIE5ld1N5c2NhbGxFcnJvcigicGlwZSIsIGUpCisJfQor CXN5c2NhbGwuQ2xvc2VPbkV4ZWMocFswXSkKKwlzeXNjYWxsLkNsb3NlT25FeGVjKHBbMV0pCisJ c3lzY2FsbC5Gb3JrTG9jay5SVW5sb2NrKCkKKworCXJldHVybiBOZXdGaWxlKHBbMF0sICJ8MCIp LCBOZXdGaWxlKHBbMV0sICJ8MSIpLCBuaWwKK30KKworLy8gU3RhdCByZXR1cm5zIGEgRmlsZUlu Zm8gc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIG5hbWVkIGZpbGUgYW5kIGFuIGVycm9yLCBpZiBh bnkuCisvLyBJZiBuYW1lIG5hbWVzIGEgdmFsaWQgc3ltYm9saWMgbGluaywgdGhlIHJldHVybmVk IEZpbGVJbmZvIGRlc2NyaWJlcworLy8gdGhlIGZpbGUgcG9pbnRlZCBhdCBieSB0aGUgbGluayBh bmQgaGFzIGZpLkZvbGxvd2VkU3ltbGluayBzZXQgdG8gdHJ1ZS4KKy8vIElmIG5hbWUgbmFtZXMg YW4gaW52YWxpZCBzeW1ib2xpYyBsaW5rLCB0aGUgcmV0dXJuZWQgRmlsZUluZm8gZGVzY3JpYmVz CisvLyB0aGUgbGluayBpdHNlbGYgYW5kIGhhcyBmaS5Gb2xsb3dlZFN5bWxpbmsgc2V0IHRvIGZh bHNlLgorZnVuYyBTdGF0KG5hbWUgc3RyaW5nKSAoZmkgKkZpbGVJbmZvLCBlcnIgRXJyb3IpIHsK Kwl2YXIgbHN0YXQsIHN0YXQgc3lzY2FsbC5TdGF0X3QKKwllIDo9IHN5c2NhbGwuTHN0YXQobmFt ZSwgJmxzdGF0KQorCWlmIGlzZXJyb3IoZSkgeworCQlyZXR1cm4gbmlsLCAmUGF0aEVycm9yeyJz dGF0IiwgbmFtZSwgRXJybm8oZSl9CisJfQorCXN0YXRwIDo9ICZsc3RhdAorCWlmIGxzdGF0Lk1v ZGUmc3lzY2FsbC5TX0lGTVQgPT0gc3lzY2FsbC5TX0lGTE5LIHsKKwkJZSA6PSBzeXNjYWxsLlN0 YXQobmFtZSwgJnN0YXQpCisJCWlmICFpc2Vycm9yKGUpIHsKKwkJCXN0YXRwID0gJnN0YXQKKwkJ fQorCX0KKwlyZXR1cm4gZmlsZUluZm9Gcm9tU3RhdChuYW1lLCBuZXcoRmlsZUluZm8pLCAmbHN0 YXQsIHN0YXRwKSwgbmlsCit9CisKKy8vIExzdGF0IHJldHVybnMgdGhlIEZpbGVJbmZvIHN0cnVj dHVyZSBkZXNjcmliaW5nIHRoZSBuYW1lZCBmaWxlIGFuZCBhbgorLy8gZXJyb3IsIGlmIGFueS4g IElmIHRoZSBmaWxlIGlzIGEgc3ltYm9saWMgbGluaywgdGhlIHJldHVybmVkIEZpbGVJbmZvCisv LyBkZXNjcmliZXMgdGhlIHN5bWJvbGljIGxpbmsuICBMc3RhdCBtYWtlcyBubyBhdHRlbXB0IHRv IGZvbGxvdyB0aGUgbGluay4KK2Z1bmMgTHN0YXQobmFtZSBzdHJpbmcpIChmaSAqRmlsZUluZm8s IGVyciBFcnJvcikgeworCXZhciBzdGF0IHN5c2NhbGwuU3RhdF90CisJZSA6PSBzeXNjYWxsLkxz dGF0KG5hbWUsICZzdGF0KQorCWlmIGlzZXJyb3IoZSkgeworCQlyZXR1cm4gbmlsLCAmUGF0aEVy cm9yeyJsc3RhdCIsIG5hbWUsIEVycm5vKGUpfQorCX0KKwlyZXR1cm4gZmlsZUluZm9Gcm9tU3Rh dChuYW1lLCBuZXcoRmlsZUluZm8pLCAmc3RhdCwgJnN0YXQpLCBuaWwKK30KKworLy8gUmVtb3Zl IHJlbW92ZXMgdGhlIG5hbWVkIGZpbGUgb3IgZGlyZWN0b3J5LgorZnVuYyBSZW1vdmUobmFtZSBz dHJpbmcpIEVycm9yIHsKKwkvLyBTeXN0ZW0gY2FsbCBpbnRlcmZhY2UgZm9yY2VzIHVzIHRvIGtu b3cKKwkvLyB3aGV0aGVyIG5hbWUgaXMgYSBmaWxlIG9yIGRpcmVjdG9yeS4KKwkvLyBUcnkgYm90 aDogaXQgaXMgY2hlYXBlciBvbiBhdmVyYWdlIHRoYW4KKwkvLyBkb2luZyBhIFN0YXQgcGx1cyB0 aGUgcmlnaHQgb25lLgorCWUgOj0gc3lzY2FsbC5VbmxpbmsobmFtZSkKKwlpZiAhaXNlcnJvcihl KSB7CisJCXJldHVybiBuaWwKKwl9CisJZTEgOj0gc3lzY2FsbC5SbWRpcihuYW1lKQorCWlmICFp c2Vycm9yKGUxKSB7CisJCXJldHVybiBuaWwKKwl9CisKKwkvLyBCb3RoIGZhaWxlZDogZmlndXJl IG91dCB3aGljaCBlcnJvciB0byByZXR1cm4uCisJLy8gT1MgWCBhbmQgTGludXggZGlmZmVyIG9u IHdoZXRoZXIgdW5saW5rKGRpcikKKwkvLyByZXR1cm5zIEVJU0RJUiwgc28gY2FuJ3QgdXNlIHRo YXQuICBIb3dldmVyLAorCS8vIGJvdGggYWdyZWUgdGhhdCBybWRpcihmaWxlKSByZXR1cm5zIEVO T1RESVIsCisJLy8gc28gd2UgY2FuIHVzZSB0aGF0IHRvIGRlY2lkZSB3aGljaCBlcnJvciBpcyBy ZWFsLgorCS8vIFJtZGlyIG1pZ2h0IGFsc28gcmV0dXJuIEVOT1RESVIgaWYgZ2l2ZW4gYSBiYWQK KwkvLyBmaWxlIHBhdGgsIGxpa2UgL2V0Yy9wYXNzd2QvZm9vLCBidXQgaW4gdGhhdCBjYXNlLAor CS8vIGJvdGggZXJyb3JzIHdpbGwgYmUgRU5PVERJUiwgc28gaXQncyBva2F5IHRvCisJLy8gdXNl IHRoZSBlcnJvciBmcm9tIHVubGluay4KKwkvLyBGb3Igd2luZG93cyBzeXNjYWxsLkVOT1RESVIg aXMgc2V0CisJLy8gdG8gc3lzY2FsbC5FUlJPUl9ESVJFQ1RPUlksIGhvcGVmdWxseSBpdCBzaG91 bGQKKwkvLyBkbyB0aGUgdHJpY2suCisJaWYgZTEgIT0gc3lzY2FsbC5FTk9URElSIHsKKwkJZSA9 IGUxCisJfQorCXJldHVybiAmUGF0aEVycm9yeyJyZW1vdmUiLCBuYW1lLCBFcnJubyhlKX0KK30K KworLy8gTGlua0Vycm9yIHJlY29yZHMgYW4gZXJyb3IgZHVyaW5nIGEgbGluayBvciBzeW1saW5r IG9yIHJlbmFtZQorLy8gc3lzdGVtIGNhbGwgYW5kIHRoZSBwYXRocyB0aGF0IGNhdXNlZCBpdC4K K3R5cGUgTGlua0Vycm9yIHN0cnVjdCB7CisJT3AgICAgc3RyaW5nCisJT2xkICAgc3RyaW5nCisJ TmV3ICAgc3RyaW5nCisJRXJyb3IgRXJyb3IKK30KKworZnVuYyAoZSAqTGlua0Vycm9yKSBTdHJp bmcoKSBzdHJpbmcgeworCXJldHVybiBlLk9wICsgIiAiICsgZS5PbGQgKyAiICIgKyBlLk5ldyAr ICI6ICIgKyBlLkVycm9yLlN0cmluZygpCit9CisKKy8vIExpbmsgY3JlYXRlcyBhIGhhcmQgbGlu ay4KK2Z1bmMgTGluayhvbGRuYW1lLCBuZXduYW1lIHN0cmluZykgRXJyb3IgeworCWUgOj0gc3lz Y2FsbC5MaW5rKG9sZG5hbWUsIG5ld25hbWUpCisJaWYgaXNlcnJvcihlKSB7CisJCXJldHVybiAm TGlua0Vycm9yeyJsaW5rIiwgb2xkbmFtZSwgbmV3bmFtZSwgRXJybm8oZSl9CisJfQorCXJldHVy biBuaWwKK30KKworLy8gU3ltbGluayBjcmVhdGVzIGEgc3ltYm9saWMgbGluay4KK2Z1bmMgU3lt bGluayhvbGRuYW1lLCBuZXduYW1lIHN0cmluZykgRXJyb3IgeworCWUgOj0gc3lzY2FsbC5TeW1s aW5rKG9sZG5hbWUsIG5ld25hbWUpCisJaWYgaXNlcnJvcihlKSB7CisJCXJldHVybiAmTGlua0Vy cm9yeyJzeW1saW5rIiwgb2xkbmFtZSwgbmV3bmFtZSwgRXJybm8oZSl9CisJfQorCXJldHVybiBu aWwKK30KKworLy8gUmVhZGxpbmsgcmVhZHMgdGhlIGNvbnRlbnRzIG9mIGEgc3ltYm9saWMgbGlu azogdGhlIGRlc3RpbmF0aW9uIG9mCisvLyB0aGUgbGluay4gIEl0IHJldHVybnMgdGhlIGNvbnRl bnRzIGFuZCBhbiBFcnJvciwgaWYgYW55LgorZnVuYyBSZWFkbGluayhuYW1lIHN0cmluZykgKHN0 cmluZywgRXJyb3IpIHsKKwlmb3IgbGVuIDo9IDEyODsgOyBsZW4gKj0gMiB7CisJCWIgOj0gbWFr ZShbXWJ5dGUsIGxlbikKKwkJbiwgZSA6PSBzeXNjYWxsLlJlYWRsaW5rKG5hbWUsIGIpCisJCWlm IGlzZXJyb3IoZSkgeworCQkJcmV0dXJuICIiLCAmUGF0aEVycm9yeyJyZWFkbGluayIsIG5hbWUs IEVycm5vKGUpfQorCQl9CisJCWlmIG4gPCBsZW4geworCQkJcmV0dXJuIHN0cmluZyhiWzA6bl0p LCBuaWwKKwkJfQorCX0KKwkvLyBTaWxlbmNlIDZnLgorCXJldHVybiAiIiwgbmlsCit9CisKKy8v IFJlbmFtZSByZW5hbWVzIGEgZmlsZS4KK2Z1bmMgUmVuYW1lKG9sZG5hbWUsIG5ld25hbWUgc3Ry aW5nKSBFcnJvciB7CisJZSA6PSBzeXNjYWxsLlJlbmFtZShvbGRuYW1lLCBuZXduYW1lKQorCWlm IGlzZXJyb3IoZSkgeworCQlyZXR1cm4gJkxpbmtFcnJvcnsicmVuYW1lIiwgb2xkbmFtZSwgbmV3 bmFtZSwgRXJybm8oZSl9CisJfQorCXJldHVybiBuaWwKK30KKworLy8gQ2htb2QgY2hhbmdlcyB0 aGUgbW9kZSBvZiB0aGUgbmFtZWQgZmlsZSB0byBtb2RlLgorLy8gSWYgdGhlIGZpbGUgaXMgYSBz eW1ib2xpYyBsaW5rLCBpdCBjaGFuZ2VzIHRoZSBtb2RlIG9mIHRoZSBsaW5rJ3MgdGFyZ2V0Lgor ZnVuYyBDaG1vZChuYW1lIHN0cmluZywgbW9kZSB1aW50MzIpIEVycm9yIHsKKwlpZiBlIDo9IHN5 c2NhbGwuQ2htb2QobmFtZSwgbW9kZSk7IGlzZXJyb3IoZSkgeworCQlyZXR1cm4gJlBhdGhFcnJv cnsiY2htb2QiLCBuYW1lLCBFcnJubyhlKX0KKwl9CisJcmV0dXJuIG5pbAorfQorCisvLyBDaG1v ZCBjaGFuZ2VzIHRoZSBtb2RlIG9mIHRoZSBmaWxlIHRvIG1vZGUuCitmdW5jIChmICpGaWxlKSBD aG1vZChtb2RlIHVpbnQzMikgRXJyb3IgeworCWlmIGUgOj0gc3lzY2FsbC5GY2htb2QoZi5mZCwg bW9kZSk7IGlzZXJyb3IoZSkgeworCQlyZXR1cm4gJlBhdGhFcnJvcnsiY2htb2QiLCBmLm5hbWUs IEVycm5vKGUpfQorCX0KKwlyZXR1cm4gbmlsCit9CisKKy8vIENob3duIGNoYW5nZXMgdGhlIG51 bWVyaWMgdWlkIGFuZCBnaWQgb2YgdGhlIG5hbWVkIGZpbGUuCisvLyBJZiB0aGUgZmlsZSBpcyBh IHN5bWJvbGljIGxpbmssIGl0IGNoYW5nZXMgdGhlIHVpZCBhbmQgZ2lkIG9mIHRoZSBsaW5rJ3Mg dGFyZ2V0LgorZnVuYyBDaG93bihuYW1lIHN0cmluZywgdWlkLCBnaWQgaW50KSBFcnJvciB7CisJ aWYgZSA6PSBzeXNjYWxsLkNob3duKG5hbWUsIHVpZCwgZ2lkKTsgaXNlcnJvcihlKSB7CisJCXJl dHVybiAmUGF0aEVycm9yeyJjaG93biIsIG5hbWUsIEVycm5vKGUpfQorCX0KKwlyZXR1cm4gbmls Cit9CisKKy8vIExjaG93biBjaGFuZ2VzIHRoZSBudW1lcmljIHVpZCBhbmQgZ2lkIG9mIHRoZSBu YW1lZCBmaWxlLgorLy8gSWYgdGhlIGZpbGUgaXMgYSBzeW1ib2xpYyBsaW5rLCBpdCBjaGFuZ2Vz IHRoZSB1aWQgYW5kIGdpZCBvZiB0aGUgbGluayBpdHNlbGYuCitmdW5jIExjaG93bihuYW1lIHN0 cmluZywgdWlkLCBnaWQgaW50KSBFcnJvciB7CisJaWYgZSA6PSBzeXNjYWxsLkxjaG93bihuYW1l LCB1aWQsIGdpZCk7IGlzZXJyb3IoZSkgeworCQlyZXR1cm4gJlBhdGhFcnJvcnsibGNob3duIiwg bmFtZSwgRXJybm8oZSl9CisJfQorCXJldHVybiBuaWwKK30KKworLy8gQ2hvd24gY2hhbmdlcyB0 aGUgbnVtZXJpYyB1aWQgYW5kIGdpZCBvZiB0aGUgbmFtZWQgZmlsZS4KK2Z1bmMgKGYgKkZpbGUp IENob3duKHVpZCwgZ2lkIGludCkgRXJyb3IgeworCWlmIGUgOj0gc3lzY2FsbC5GY2hvd24oZi5m ZCwgdWlkLCBnaWQpOyBpc2Vycm9yKGUpIHsKKwkJcmV0dXJuICZQYXRoRXJyb3J7ImNob3duIiwg Zi5uYW1lLCBFcnJubyhlKX0KKwl9CisJcmV0dXJuIG5pbAorfQorCisvLyBUcnVuY2F0ZSBjaGFu Z2VzIHRoZSBzaXplIG9mIHRoZSBmaWxlLgorLy8gSXQgZG9lcyBub3QgY2hhbmdlIHRoZSBJL08g b2Zmc2V0LgorZnVuYyAoZiAqRmlsZSkgVHJ1bmNhdGUoc2l6ZSBpbnQ2NCkgRXJyb3IgeworCWlm IGUgOj0gc3lzY2FsbC5GdHJ1bmNhdGUoZi5mZCwgc2l6ZSk7IGlzZXJyb3IoZSkgeworCQlyZXR1 cm4gJlBhdGhFcnJvcnsidHJ1bmNhdGUiLCBmLm5hbWUsIEVycm5vKGUpfQorCX0KKwlyZXR1cm4g bmlsCit9CisKKy8vIFN5bmMgY29tbWl0cyB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgZmls ZSB0byBzdGFibGUgc3RvcmFnZS4KKy8vIFR5cGljYWxseSwgdGhpcyBtZWFucyBmbHVzaGluZyB0 aGUgZmlsZSBzeXN0ZW0ncyBpbi1tZW1vcnkgY29weQorLy8gb2YgcmVjZW50bHkgd3JpdHRlbiBk YXRhIHRvIGRpc2suCitmdW5jIChmaWxlICpGaWxlKSBTeW5jKCkgKGVyciBFcnJvcikgeworCWlm IGZpbGUgPT0gbmlsIHsKKwkJcmV0dXJuIEVJTlZBTAorCX0KKwlpZiBlIDo9IHN5c2NhbGwuRnN5 bmMoZmlsZS5mZCk7IGlzZXJyb3IoZSkgeworCQlyZXR1cm4gTmV3U3lzY2FsbEVycm9yKCJmc3lu YyIsIGUpCisJfQorCXJldHVybiBuaWwKK30KKworLy8gQ2h0aW1lcyBjaGFuZ2VzIHRoZSBhY2Nl c3MgYW5kIG1vZGlmaWNhdGlvbiB0aW1lcyBvZiB0aGUgbmFtZWQKKy8vIGZpbGUsIHNpbWlsYXIg dG8gdGhlIFVuaXggdXRpbWUoKSBvciB1dGltZXMoKSBmdW5jdGlvbnMuCisvLworLy8gVGhlIGFy Z3VtZW50IHRpbWVzIGFyZSBpbiBuYW5vc2Vjb25kcywgYWx0aG91Z2ggdGhlIHVuZGVybHlpbmcK Ky8vIGZpbGVzeXN0ZW0gbWF5IHRydW5jYXRlIG9yIHJvdW5kIHRoZSB2YWx1ZXMgdG8gYSBtb3Jl CisvLyBjb2Fyc2UgdGltZSB1bml0LgorZnVuYyBDaHRpbWVzKG5hbWUgc3RyaW5nLCBhdGltZV9u cyBpbnQ2NCwgbXRpbWVfbnMgaW50NjQpIEVycm9yIHsKKwl2YXIgdXRpbWVzIFsyXXN5c2NhbGwu VGltZXZhbAorCXV0aW1lc1swXSA9IHN5c2NhbGwuTnNlY1RvVGltZXZhbChhdGltZV9ucykKKwl1 dGltZXNbMV0gPSBzeXNjYWxsLk5zZWNUb1RpbWV2YWwobXRpbWVfbnMpCisJaWYgZSA6PSBzeXNj YWxsLlV0aW1lcyhuYW1lLCB1dGltZXNbMDpdKTsgaXNlcnJvcihlKSB7CisJCXJldHVybiAmUGF0 aEVycm9yeyJjaHRpbWVzIiwgbmFtZSwgRXJybm8oZSl9CisJfQorCXJldHVybiBuaWwKK30KZGlm ZiAtciAwOWFiODY1ZDg3NWMgc3JjL3BrZy9vcy9wcm9jLmdvCi0tLSBhL3NyYy9wa2cvb3MvcHJv Yy5nbwlGcmkgSmFuIDE0IDIzOjAwOjAyIDIwMTEgLTA4MDAKKysrIGIvc3JjL3BrZy9vcy9wcm9j LmdvCVNhdCBKYW4gMTUgMTM6MDA6MTMgMjAxMSArMDIwMApAQCAtMjYsOCArMjYsOCBAQAogCiAv LyBHZXRncm91cHMgcmV0dXJucyBhIGxpc3Qgb2YgdGhlIG51bWVyaWMgaWRzIG9mIGdyb3VwcyB0 aGF0IHRoZSBjYWxsZXIgYmVsb25ncyB0by4KIGZ1bmMgR2V0Z3JvdXBzKCkgKFtdaW50LCBFcnJv cikgewotCWdpZHMsIGVycm5vIDo9IHN5c2NhbGwuR2V0Z3JvdXBzKCkKLQlyZXR1cm4gZ2lkcywg TmV3U3lzY2FsbEVycm9yKCJnZXRncm91cHMiLCBlcnJubykKKwlnaWRzLCBlIDo9IHN5c2NhbGwu R2V0Z3JvdXBzKCkKKwlyZXR1cm4gZ2lkcywgTmV3U3lzY2FsbEVycm9yKCJnZXRncm91cHMiLCBl KQogfQogCiAvLyBFeGl0IGNhdXNlcyB0aGUgY3VycmVudCBwcm9ncmFtIHRvIGV4aXQgd2l0aCB0 aGUgZ2l2ZW4gc3RhdHVzIGNvZGUuCmRpZmYgLXIgMDlhYjg2NWQ4NzVjIHNyYy9wa2cvb3Mvc3Rh dF9wbGFuOS5nbwotLS0gL2Rldi9udWxsCVRodSBKYW4gMDEgMDA6MDA6MDAgMTk3MCArMDAwMAor KysgYi9zcmMvcGtnL29zL3N0YXRfcGxhbjkuZ28JU2F0IEphbiAxNSAxMzowMDoxMyAyMDExICsw MjAwCkBAIC0wLDAgKzEsODEgQEAKKy8vIENvcHlyaWdodCAyMDEwIFRoZSBHbyBBdXRob3JzLiBB bGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJu ZWQgYnkgYSBCU0Qtc3R5bGUKKy8vIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJ Q0VOU0UgZmlsZS4KKworcGFja2FnZSBvcworCitpbXBvcnQgInN5c2NhbGwiCisKK2Z1bmMgZmls ZUluZm9Gcm9tU3RhdChmaSAqRmlsZUluZm8sIGQgKkRpcikgKkZpbGVJbmZvIHsKKwlmaS5EZXYg PSB1aW50NjQoZC5RaWQuVmVycykgfCB1aW50NjQoZC5RaWQuVHlwZTw8MzIpCisJZmkuSW5vID0g ZC5RaWQuUGF0aAorCisJZmkuTW9kZSA9IHVpbnQzMihkLk1vZGUpICYgMDc3NworCWlmIChkLk1v ZGUgJiBzeXNjYWxsLkRNRElSKSA9PSBzeXNjYWxsLkRNRElSIHsKKwkJZmkuTW9kZSB8PSBzeXNj YWxsLlNfSUZESVIKKwl9IGVsc2UgeworCQlmaS5Nb2RlIHw9IHN5c2NhbGwuU19JRlJFRworCX0K KworCWZpLlNpemUgPSBpbnQ2NChkLkxlbmd0aCkKKwlmaS5BdGltZV9ucyA9IDFlOSAqIGludDY0 KGQuQXRpbWUpCisJZmkuTXRpbWVfbnMgPSAxZTkgKiBpbnQ2NChkLk10aW1lKQorCWZpLk5hbWUg PSBkLk5hbWUKKwlmaS5Gb2xsb3dlZFN5bWxpbmsgPSBmYWxzZQorCXJldHVybiBmaQorfQorCisv LyBhcmcgaXMgYW4gb3BlbiAqRmlsZSBvciBhIHBhdGggc3RyaW5nLiAKK2Z1bmMgZGlyc3RhdChh cmcgaW50ZXJmYWNle30pIChmaSAqRmlsZUluZm8sIGVyciBFcnJvcikgeworCXZhciBuYW1lIHN0 cmluZworCW5kIDo9IHN5c2NhbGwuU1RBVEZJWExFTiArIDE2KjQKKworCWZvciBpIDo9IDA7IGkg PCAyOyBpKysgeyAvKiBzaG91bGQgd29yayBieSB0aGUgc2Vjb25kIHRyeSAqLworCQlidWYgOj0g bWFrZShbXWJ5dGUsIG5kKQorCisJCXZhciBuIGludAorCQl2YXIgZSBzeXNjYWxsLkVycm9yCisK KwkJc3dpdGNoIHN5c2NhbGxfYXJnIDo9IGFyZy4odHlwZSkgeworCQljYXNlICpGaWxlOgorCQkJ bmFtZSA9IHN5c2NhbGxfYXJnLm5hbWUKKwkJCW4sIGUgPSBzeXNjYWxsLkZzdGF0KHN5c2NhbGxf YXJnLmZkLCBidWYpCisJCWNhc2Ugc3RyaW5nOgorCQkJbmFtZSA9IHN5c2NhbGxfYXJnCisJCQlu LCBlID0gc3lzY2FsbC5TdGF0KG5hbWUsIGJ1ZikKKwkJfQorCisJCWlmIGUgIT0gbmlsIHsKKwkJ CXJldHVybiBuaWwsICZQYXRoRXJyb3J7InN0YXQiLCBuYW1lLCBlfQorCQl9CisKKwkJaWYgbiA8 IHN5c2NhbGwuU1RBVEZJWExFTiB7CisJCQlyZXR1cm4gbmlsLCAmUGF0aEVycm9yeyJzdGF0Iiwg bmFtZSwgc3lzY2FsbC5FdG9vc21hbGx9CisJCX0KKworCQludG1wLCBfIDo9IGdiaXQxNihidWYp CisJCW5kID0gaW50KG50bXApCisKKwkJaWYgbmQgPD0gbiB7CisJCQlkLCBlIDo9IFVubWFyc2hh bERpcihidWZbOm5dKQorCisJCQlpZiBlICE9IG5pbCB7CisJCQkJcmV0dXJuIG5pbCwgJlBhdGhF cnJvcnsic3RhdCIsIG5hbWUsIGV9CisJCQl9CisKKwkJCXJldHVybiBmaWxlSW5mb0Zyb21TdGF0 KG5ldyhGaWxlSW5mbyksIGQpLCBuaWwKKwkJfQorCX0KKworCXJldHVybiBuaWwsICZQYXRoRXJy b3J7InN0YXQiLCBuYW1lLCBzeXNjYWxsLkViYWRzdGF0fQorfQorCisKKy8vIFN0YXQgcmV0dXJu cyBhIEZpbGVJbmZvIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBuYW1lZCBmaWxlIGFuZCBhbiBl cnJvciwgaWYgYW55LgorZnVuYyBTdGF0KG5hbWUgc3RyaW5nKSAoZmkgKkZpbGVJbmZvLCBlcnIg RXJyb3IpIHsKKwlyZXR1cm4gZGlyc3RhdChuYW1lKQorfQorCitmdW5jIExzdGF0KG5hbWUgc3Ry aW5nKSAoZmkgKkZpbGVJbmZvLCBlcnIgRXJyb3IpIHsKKwlyZXR1cm4gZGlyc3RhdChuYW1lKQor fQpkaWZmIC1yIDA5YWI4NjVkODc1YyBzcmMvcGtnL29zL3N5c19wbGFuOS5nbwotLS0gL2Rldi9u dWxsCVRodSBKYW4gMDEgMDA6MDA6MDAgMTk3MCArMDAwMAorKysgYi9zcmMvcGtnL29zL3N5c19w bGFuOS5nbwlTYXQgSmFuIDE1IDEzOjAwOjEzIDIwMTEgKzAyMDAKQEAgLTAsMCArMSwyNyBAQAor Ly8gQ29weXJpZ2h0IDIwMDkgVGhlIEdvIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisv LyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZQorLy8g bGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBQbGFu IDktc3BlY2lmaWMKKworcGFja2FnZSBvcworCisKK2Z1bmMgSG9zdG5hbWUoKSAobmFtZSBzdHJp bmcsIGVyciBFcnJvcikgeworCWYsIGVyciA6PSBPcGVuKCIjZS9zeXNuYW1lIiwgT19SRE9OTFks IDApCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiAiIiwgZXJyCisJfQorCWRlZmVyIGYuQ2xv c2UoKQorCisJdmFyIGJ1ZiBbNTEyXWJ5dGUgLy8gRW5vdWdoIGZvciBhIEROUyBuYW1lLgorCW4s IGVyciA6PSBmLlJlYWQoYnVmWzA6XSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuICIiLCBl cnIKKwl9CisKKwlpZiBuID4gMCAmJiBidWZbbi0xXSA9PSAnXG4nIHsKKwkJbi0tCisJfQorCXJl dHVybiBzdHJpbmcoYnVmWzA6bl0pLCBuaWwKK30KZGlmZiAtciAwOWFiODY1ZDg3NWMgc3JjL3Br Zy9vcy90aW1lLmdvCi0tLSBhL3NyYy9wa2cvb3MvdGltZS5nbwlGcmkgSmFuIDE0IDIzOjAwOjAy IDIwMTEgLTA4MDAKKysrIGIvc3JjL3BrZy9vcy90aW1lLmdvCVNhdCBKYW4gMTUgMTM6MDA6MTMg MjAxMSArMDIwMApAQCAtMTMsOCArMTMsOCBAQAogLy8gdGltZSBpcyB0aGUgVW5peCBlcG9jaC4K IGZ1bmMgVGltZSgpIChzZWMgaW50NjQsIG5zZWMgaW50NjQsIGVyciBFcnJvcikgewogCXZhciB0 diBzeXNjYWxsLlRpbWV2YWwKLQlpZiBlcnJubyA6PSBzeXNjYWxsLkdldHRpbWVvZmRheSgmdHYp OyBlcnJubyAhPSAwIHsKLQkJcmV0dXJuIDAsIDAsIE5ld1N5c2NhbGxFcnJvcigiZ2V0dGltZW9m ZGF5IiwgZXJybm8pCisJaWYgZSA6PSBzeXNjYWxsLkdldHRpbWVvZmRheSgmdHYpOyBpc2Vycm9y KGUpIHsKKwkJcmV0dXJuIDAsIDAsIE5ld1N5c2NhbGxFcnJvcigiZ2V0dGltZW9mZGF5IiwgZSkK IAl9CiAJcmV0dXJuIGludDY0KHR2LlNlYyksIGludDY0KHR2LlVzZWMpICogMTAwMCwgZXJyCiB9 CmRpZmYgLXIgMDlhYjg2NWQ4NzVjIHNyYy9wa2cvcnVudGltZS9wbGFuOS8zODYvcnQwLnMKLS0t IGEvc3JjL3BrZy9ydW50aW1lL3BsYW45LzM4Ni9ydDAucwlGcmkgSmFuIDE0IDIzOjAwOjAyIDIw MTEgLTA4MDAKKysrIGIvc3JjL3BrZy9ydW50aW1lL3BsYW45LzM4Ni9ydDAucwlTYXQgSmFuIDE1 IDEzOjAwOjEzIDIwMTEgKzAyMDAKQEAgLTMsNyArMyw3IEBACiAvLyBsaWNlbnNlIHRoYXQgY2Fu IGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKIFRFWFQgX3J0MF8zODZfcGxhbjkoU0Ip LDcsICQwCi0JTU9WTAlBWCwgX3RvcyhTQikKKwlNT1ZMCUFYLCBzeXNjYWxswrdfdG9zKFNCKQog CQogCS8vIG1vdmUgYXJndW1lbnRzIGRvd24gdG8gbWFrZSByb29tIGZvcgogCS8vIG0gYW5kIGcg YXQgdG9wIG9mIHN0YWNrLCByaWdodCBiZWZvcmUgVG9zLgpAQCAtMjksNCArMjksNCBAQAogCiBE QVRBICBydW50aW1lwrdpc3BsYW45KFNCKS80LCAkMQogR0xPQkwgcnVudGltZcK3aXNwbGFuOShT QiksICQ0Ci1HTE9CTCBfdG9zKFNCKSwgJDQKK0dMT0JMIHN5c2NhbGzCt190b3MoU0IpLCAkNApk aWZmIC1yIDA5YWI4NjVkODc1YyBzcmMvcGtnL3N5c2NhbGwvTWFrZWZpbGUKLS0tIGEvc3JjL3Br Zy9zeXNjYWxsL01ha2VmaWxlCUZyaSBKYW4gMTQgMjM6MDA6MDIgMjAxMSAtMDgwMAorKysgYi9z cmMvcGtnL3N5c2NhbGwvTWFrZWZpbGUJU2F0IEphbiAxNSAxMzowMDoxMyAyMDExICswMjAwCkBA IC0zMiw2ICszMiw4IEBACiAKIEdPRklMRVNfd2luZG93cz1cCiAJZXhlY193aW5kb3dzLmdvCisJ CitHT0ZJTEVTX3BsYW45PQogCiBPRklMRVM9XAogCWFzbV8kKEdPT1MpXyQoR09BUkNIKS4kT1wK ZGlmZiAtciAwOWFiODY1ZDg3NWMgc3JjL3BrZy9zeXNjYWxsL2FzbV9wbGFuOV8zODYucwotLS0g L2Rldi9udWxsCVRodSBKYW4gMDEgMDA6MDA6MDAgMTk3MCArMDAwMAorKysgYi9zcmMvcGtnL3N5 c2NhbGwvYXNtX3BsYW45XzM4Ni5zCVNhdCBKYW4gMTUgMTM6MDA6MTMgMjAxMSArMDIwMApAQCAt MCwwICsxLDE3NiBAQAorLy8gQ29weXJpZ2h0IDIwMDkgVGhlIEdvIEF1dGhvcnMuIEFsbCByaWdo dHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBh IEJTRC1zdHlsZQorLy8gbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBm aWxlLgorCisvLworLy8gU3lzdGVtIGNhbGwgc3VwcG9ydCBmb3IgMzg2LCBQbGFuIDkKKy8vCisK Ky8vIGZ1bmMgU3lzY2FsbCh0cmFwIGludDMyLCBhMSwgYTIsIGEzIGludDMyKSAocjEsIHIyLCBl cnIgdWludHB0cik7CisvLyBmdW5jIFN5c2NhbGxFcnJzdHIodHJhcCB1aW50cHRyLCBhMSwgYTIs IGEzIHVpbnRwdHIpIChyIHVpbnRwdHIsIGVyciBzdHJpbmcpOworLy8gZnVuYyBTeXNjYWxsNih0 cmFwIGludDMyLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2IGludDMyKSAocjEsIHIyLCBlcnIgdWlu dHB0cik7CisvLyBmdW5jIFN5c2NhbGxFcnJzdHI2KHRyYXAgdWludHB0ciwgYTEsIGEyLCBhMywg YTQsIGE1LCBhNiB1aW50cHRyKSAociB1aW50cHRyLCBlcnIgc3RyaW5nKTsKKy8vIFRyYXAgIyBp biBBWCwgYXJncyBvbiBzdGFjayBhYm92ZSBjYWxsZXIgcGMuCisKK1RFWFQJwrdTeXNjYWxsKFNC KSw3LCQwCisJQ0FMTAlydW50aW1lwrdlbnRlcnN5c2NhbGwoU0IpCisJTU9WTAk0KFNQKSwgQVgJ Ly8gc3lzY2FsbCBlbnRyeQorCS8vIHNsaWRlIGFyZ3MgZG93biBvbiB0b3Agb2Ygc3lzdGVtIGNh bGwgbnVtYmVyCisJTEVBTAkJOChTUCksIFNJCisJTEVBTAkJNChTUCksIERJCisJQ0xECisJTU9W U0wKKwlNT1ZTTAorCU1PVlNMCisJSU5UCSQ2NAorCU1PVkwJQVgsIHIxKzIwKFNQKQorCU1PVkwJ JDAsIHIyKzI0KFNQKQorCU1PVkwJJDAsIGVycisyOChTUCkJCQorCUNBTEwJcnVudGltZcK3ZXhp dHN5c2NhbGwoU0IpCisJUkVUCisKKworVEVYVAnCt1N5c2NhbGw2KFNCKSw3LCQwCisJQ0FMTAly dW50aW1lwrdlbnRlcnN5c2NhbGwoU0IpCisJTU9WTAk0KFNQKSwgQVgJLy8gc3lzY2FsbCBlbnRy eQorCS8vIHNsaWRlIGFyZ3MgZG93biBvbiB0b3Agb2Ygc3lzdGVtIGNhbGwgbnVtYmVyCisJTEVB TAkJOChTUCksIFNJCisJTEVBTAkJNChTUCksIERJCisJQ0xECisJTU9WU0wKKwlNT1ZTTAorCU1P VlNMCisJTU9WU0wKKwlNT1ZTTAorCU1PVlNMCisJSU5UCSQ2NAorCU1PVkwJQVgsIHIxKzMyKFNQ KQorCU1PVkwJJDAsIHIyKzM2KFNQKQorCU1PVkwJJDAsIGVycis0MChTUCkJCQorCUNBTEwJcnVu dGltZcK3ZXhpdHN5c2NhbGwoU0IpCisJUkVUCisKK1RFWFQJwrdTeXNjYWxsRXJyc3RyKFNCKSw3 LCQwCisJQ0FMTAlydW50aW1lwrdlbnRlcnN5c2NhbGwoU0IpCisJTU9WTAk0KFNQKSwgQVgJLy8g c3lzY2FsbCBlbnRyeQorCS8vIHNsaWRlIGFyZ3MgZG93biBvbiB0b3Agb2Ygc3lzdGVtIGNhbGwg bnVtYmVyCisJTEVBTAkJOChTUCksIFNJCisJTEVBTAkJNChTUCksIERJCisJQ0xECisJTU9WU0wK KwlNT1ZTTAorCU1PVlNMCisJSU5UCSQ2NAorCU1PVkwJQVgsIHIrMjAoU1ApCisJQ01QTAlBWCwg JC0xCisJSk5FCW9rMworCisJU1VCTAkkOCwgU1AKKwlDQUxMCXN5c2NhbGzCt2VycnN0cihTQikK KwlNT1ZMCVNQLCBTSQorCUFEREwJJDgsIFNQCisJSk1QCWNvcHlyZXN1bHQzCisJCitvazM6CisJ TEVBTAlydW50aW1lwrdlbXB0eXN0cmluZyhTQiksIFNJCQorCQorY29weXJlc3VsdDM6CisJTEVB TAllcnIrMjQoU1ApLCBESQorCisJQ0xECisJTU9WU0wKKwlNT1ZTTAorCisJQ0FMTAlydW50aW1l wrdleGl0c3lzY2FsbChTQikKKwlSRVQKKworCitURVhUCcK3U3lzY2FsbEVycnN0cjYoU0IpLDcs JDAKKwlDQUxMCXJ1bnRpbWXCt2VudGVyc3lzY2FsbChTQikKKwlNT1ZMCTQoU1ApLCBBWAkvLyBz eXNjYWxsIGVudHJ5CisJLy8gc2xpZGUgYXJncyBkb3duIG9uIHRvcCBvZiBzeXN0ZW0gY2FsbCBu dW1iZXIKKwlMRUFMCQk4KFNQKSwgU0kKKwlMRUFMCQk0KFNQKSwgREkKKwlDTEQKKwlNT1ZTTAor CU1PVlNMCisJTU9WU0wKKwlNT1ZTTAorCU1PVlNMCisJTU9WU0wKKwlJTlQJJDY0CisJTU9WTAlB WCwgciszMihTUCkKKwlDTVBMCUFYLCAkLTEKKwlKTkUJb2s0CisJCisJU1VCTAkkOCwgU1AKKwlD QUxMCXN5c2NhbGzCt2VycnN0cihTQikKKwlNT1ZMCVNQLCBTSQorCUFEREwJJDgsIFNQCisJSk1Q CWNvcHlyZXN1bHQ0CisJCitvazQ6CisJTEVBTAlydW50aW1lwrdlbXB0eXN0cmluZyhTQiksIFNJ CisJCitjb3B5cmVzdWx0NDoKKwlMRUFMCWVyciszNihTUCksIERJCisKKwlDTEQKKwlNT1ZTTAor CU1PVlNMCisKKwlDQUxMCXJ1bnRpbWXCt2V4aXRzeXNjYWxsKFNCKQorCVJFVAorCisKK1RFWFQg wrdSYXdTeXNjYWxsKFNCKSw3LCQwCisJTU9WTAk0KFNQKSwgQVgJLy8gc3lzY2FsbCBlbnRyeQor CS8vIHNsaWRlIGFyZ3MgZG93biBvbiB0b3Agb2Ygc3lzdGVtIGNhbGwgbnVtYmVyCisJTEVBTAkJ OChTUCksIFNJCisJTEVBTAkJNChTUCksIERJCisJQ0xECisJTU9WU0wKKwlNT1ZTTAorCU1PVlNM CisJSU5UCSQ2NAorCU1PVkwJQVgsIHIxKzIwKFNQKQorCU1PVkwJJDAsIHIyKzI0KFNQKQorCU1P VkwJJDAsIGVycisyOChTUCkKKwlSRVQKKworCisjZGVmaW5lIFNZU19TRUVLIDM5CS8qIGZyb20g enN5c251bV9wbGFuOV8zODYuZ28gKi8KKworLy9mdW5jIHNlZWsocGxhY2Vob2xkZXIgdWludHB0 ciwgZmQgaW50LCBvZmZzZXQgaW50NjQsIHdoZW5jZSBpbnQpIChuZXdvZmZzZXQgaW50NjQsIGVy ciBzdHJpbmcpCitURVhUIMK3c2VlayhTQiksNywkMAorCUNBTEwJcnVudGltZcK3ZW50ZXJzeXNj YWxsKFNCKQorCQorCUxFQUwJbmV3b2Zmc2V0KzI0KFNQKSwgQVgKKwlNT1ZMCUFYLCBwbGFjZWhv bGRlcis0KFNQKQorCQorCU1PVkwJJFNZU19TRUVLLCBBWAkvLyBzeXNjYWxsIGVudHJ5CisJSU5U CSQ2NAorCQorCUNNUEwJQVgsICQtMQorCUpORQlvazYKKwlNT1ZMCUFYLCAyNChTUCkJLy8gbmV3 b2Zmc2V0IGxvdworCU1PVkwJQVgsIDI4KFNQKQkvLyBuZXdvZmZzZXQgaGlnaAorCQorCVNVQkwJ JDgsIFNQCisJQ0FMTAlzeXNjYWxswrdlcnJzdHIoU0IpCisJTU9WTAlTUCwgU0kKKwlBRERMCSQ4 LCBTUAkKKwlKTVAJY29weXJlc3VsdDYKKwkKK29rNjoKKwlMRUFMCXJ1bnRpbWXCt2VtcHR5c3Ry aW5nKFNCKSwgU0kKKwkKK2NvcHlyZXN1bHQ2OgorCUxFQUwJZXJyKzMyKFNQKSwgREkKKworCUNM RAorCU1PVlNMCisJTU9WU0wKKworCUNBTEwJcnVudGltZcK3ZXhpdHN5c2NhbGwoU0IpCisJUkVU CmRpZmYgLXIgMDlhYjg2NWQ4NzVjIHNyYy9wa2cvc3lzY2FsbC9ta2FsbC5zaAotLS0gYS9zcmMv cGtnL3N5c2NhbGwvbWthbGwuc2gJRnJpIEphbiAxNCAyMzowMDowMiAyMDExIC0wODAwCisrKyBi L3NyYy9wa2cvc3lzY2FsbC9ta2FsbC5zaAlTYXQgSmFuIDE1IDEzOjAwOjEzIDIwMTEgKzAyMDAK QEAgLTE1NCw2ICsxNTQsMTIgQEAKIAlta3R5cGVzPQogCW1rZXJyb3JzPSIuL21rZXJyb3JzX3dp bmRvd3Muc2ggLWYgLW0zMiIKIAk7OworcGxhbjlfMzg2KQorCW1rZXJyb3JzPQorCW1rc3lzY2Fs bD0iLi9ta3N5c2NhbGxfcGxhbjkuc2ggLWwzMiIKKwlta3N5c251bT0iLi9ta3N5c251bV9wbGFu OS5zaCAvbWVkaWEvc3lzL3NyYy9saWJjLzlzeXNjYWxsL3N5cy5oIgorCW1rdHlwZXM9ImdvZGVm cyAtZ3N5c2NhbGwgLWYgLW0zMiIKKwk7OwogKikKIAllY2hvICd1bnJlY29nbml6ZWQgJEdPT1Nf JEdPQVJDSDogJyAiJEdPT1NBUkNIIiAxPiYyCiAJZXhpdCAxCmRpZmYgLXIgMDlhYjg2NWQ4NzVj IHNyYy9wa2cvc3lzY2FsbC9ta3N5c2NhbGxfcGxhbjkuYXdrCi0tLSAvZGV2L251bGwJVGh1IEph biAwMSAwMDowMDowMCAxOTcwICswMDAwCisrKyBiL3NyYy9wa2cvc3lzY2FsbC9ta3N5c2NhbGxf cGxhbjkuYXdrCVNhdCBKYW4gMTUgMTM6MDA6MTMgMjAxMSArMDIwMApAQCAtMCwwICsxLDIwNSBA QAorZnVuY3Rpb24gcGFyc2VfbGluZShsaW5lKSB7CisKKwlpbmFyZ3NfYmVnaW4gPSBtYXRjaChs aW5lLCAvXCgoW14oKV0qKVwpLykKKwkKKwlpZihpbmFyZ3NfYmVnaW4gPT0gMCkKKwkJcmV0dXJu IDAKKworCWZuYW1lID0gc3Vic3RyKGxpbmUsIDEsIGluYXJnc19iZWdpbi0xKQorCXN1YigvZnVu Y1sgXHRdKy8sICIiLCBmbmFtZSkKKworCWluYXJnc190bXAgPSBzdWJzdHIobGluZSwgaW5hcmdz X2JlZ2luKzEsIFJMRU5HVEgtMikKKwlvdXRhcmdzX3RtcCA9IHN1YnN0cihsaW5lLCBpbmFyZ3Nf YmVnaW4rUkxFTkdUSCwgbGVuZ3RoKGxpbmUpKQorCQorCW91dGFyZ3NfYmVnaW4gPSBtYXRjaChv dXRhcmdzX3RtcCwgL1woKFteKCldKilcKS8pCisJaWYob3V0YXJnc19iZWdpbiA9PSAwKQorCQlv dXRhcmdzX3RtcCA9ICIiCisJZWxzZQorCQlvdXRhcmdzX3RtcCA9IHN1YnN0cihvdXRhcmdzX3Rt cCwgb3V0YXJnc19iZWdpbisxLCBSTEVOR1RILTIpCisJCisJcGFyc2VfYXJnX3R5cGVzKGluYXJn c190bXAsIGluYXJncywgaW5hcmdfdHlwZXMpCisJcGFyc2VfYXJnX3R5cGVzKG91dGFyZ3NfdG1w LCBvdXRhcmdzLCBvdXRhcmdfdHlwZXMpCisJCisJcmV0dXJuIDEKK30KKworZnVuY3Rpb24gcGFy c2VfYXJnX3R5cGVzKGFyZ3Nfc3RyLCBhcmdzLCBhcmdfdHlwZXMpIHsKKwlhcmdfaW5kZXggPSAx CisKKwlkZWxldGUgYXJnc190bXAKKwlkZWxldGUgYXJncworCWRlbGV0ZSBhcmdfdHlwZXMKKwkK KwlzcGxpdChhcmdzX3N0ciwgYXJnc190bXAsIC9bIFx0XSosWyBcdF0qLykKKwlmb3IoaT0xOyBp IDw9IGxlbmd0aChhcmdzX3RtcCk7IGkrKykgeworCQlhcmduYW1lID0gYXJnc190bXBbaV0JCisK KwkJdHlwZV9iZWdpbiA9IG1hdGNoKGFyZ3NfdG1wW2ldLCAvWyBcdF0rLykKKwkJaWYgKHR5cGVf YmVnaW4gPT0gMCkgeworCQkJYXJnX3R5cGVzW2FyZ25hbWVdID0gIiIKKwkJfSBlbHNlIHsKKwkJ CWFyZ25hbWUgPSBzdWJzdHIoYXJnc190bXBbaV0sIDEsIHR5cGVfYmVnaW4tMSkKKwkJCXR5cGUg PSAgc3Vic3RyKGFyZ3NfdG1wW2ldLCB0eXBlX2JlZ2luK1JMRU5HVEgsIGxlbmd0aChhcmdzX3Rt cFtpXSkpCisJCQlzdWIoL15bIFx0XSsvLCAiIiwgdHlwZSkKKwkJCXN1YigvWyBcdF0rJC8sICIi LCB0eXBlKQkJCQorCQkJYXJnX3R5cGVzW2FyZ25hbWVdID0gdHlwZQorCQkJCisJCQlmb3IgKGog PSBhcmdfaW5kZXg7IGogPiAwOyBqLS0pIHsKKwkJCQlpZiAoYXJnX3R5cGVzW2FyZ3Nbal1dICE9 ICIiKQorCQkJCQlicmVhaworCQkJCQkKKwkJCQlhcmdfdHlwZXNbYXJnc1tqXV0gPSBhcmdfdHlw ZXNbYXJnbmFtZV0KKwkJCX0JCQorCQl9CisJCQorCQlzdWIoL15bIFx0XSsvLCAiIiwgYXJnbmFt ZSkKKwkJc3ViKC9bIFx0XSskLywgIiIsIGFyZ25hbWUpCisJCQorCQlpZiAoYXJnbmFtZSA9PSAi IikKKwkJCWNvbnRpbnVlCisJCQorCQlhcmdzW2FyZ19pbmRleCsrXSA9IGFyZ25hbWUKKwl9Cit9 IAorCitCRUdJTiB7CisJcHJpbnRmKCIvLyAlc1xuIiwgY21kbGluZSkKKwlwcmludCAiLy8gTUFD SElORSBHRU5FUkFURUQgQlkgVEhFIENPTU1BTkQgQUJPVkUgRE8gTk9UIEVESVRcbiIKKwlwcmlu dCAicGFja2FnZSBzeXNjYWxsXG4iCisJcHJpbnQgImltcG9ydCBcInVuc2FmZVwiXG4iCit9CisK KworL15cL1wvc3lzWyBcdF0rLyB7CisKKwlwcmludCAiLy8gVEhJUyBGSUxFIElTIEdFTkVSQVRF RCBCWSBUSEUgQ09NTUFORCBBVCBUSEUgVE9QIERPIE5PVCBFRElUXG5cbiIKKworCXN1YigvXlwv XC9zeXNbIFx0XSsvLCAiZnVuYyAiLCAkMCkKKwlwcmludGYoIiVzIHtcbiIsICQwKQorCisJaWYg KCFwYXJzZV9saW5lKCQwKSkKKwkJbmV4dAorCisJIyBQcmVwYXJlIGFyZ3VtZW50cyB0byBTeXNj YWxsLgorCWRlbGV0ZSBzeXNjYWxsX2FyZ3MKKwlzeXNjYWxsX2FyZ19pbmRleCA9IDEKKwlwdHJp bmRleCA9IDAKKworCWZvciAoaT0xOyBpIDw9IGxlbmd0aChpbmFyZ3MpOyBpKyspIHsKKwkJbmFt ZSA9IGluYXJnc1tpXQorCQl0eXBlID0gaW5hcmdfdHlwZXNbbmFtZV0KKwkJCisJCWlmICh0eXBl IH4gL15cKi8pIHsKKwkJCXN5c2NhbGxfYXJnc1tzeXNjYWxsX2FyZ19pbmRleCsrXSA9IHNwcmlu dGYoInVpbnRwdHIodW5zYWZlLlBvaW50ZXIoJXMpKSIsIG5hbWUpCisJCX0gZWxzZSBpZiAodHlw ZSA9PSAic3RyaW5nIikgeworCQkJc3lzY2FsbF9hcmdzW3N5c2NhbGxfYXJnX2luZGV4KytdID0g c3ByaW50ZigidWludHB0cih1bnNhZmUuUG9pbnRlcihTdHJpbmdCeXRlUHRyKCVzKSkpIiwgbmFt ZSkKKwkJfSBlbHNlIGlmICh0eXBlIH4gL1xbXF0oLiopLykgeworCQkJIyBDb252ZXJ0IHNsaWNl IGludG8gcG9pbnRlciwgbGVuZ3RoLgorCQkJIyBIYXZlIHRvIGJlIGNhcmVmdWwgbm90IHRvIHRh a2UgYWRkcmVzcyBvZiAmYVswXSBpZiBsZW4gPT0gMDoKKwkJCSMgcGFzcyBuaWwgaW4gdGhhdCBj YXNlLgorCQkJCisJCQlwcmludGYoIlx0dmFyIF9wJWQgdW5zYWZlLlBvaW50ZXJcbiIsIHB0cmlu ZGV4KQorCQkJcHJpbnRmKCJcdGlmIGxlbiglcykgPiAwIHtcblx0XHRfcCVkID0gdW5zYWZlLlBv aW50ZXIoJiVzWzBdKVxuXHR9XG4iLCBuYW1lLCBwdHJpbmRleCwgbmFtZSkKKwkJCQorCQkJc3lz Y2FsbF9hcmdzW3N5c2NhbGxfYXJnX2luZGV4KytdID0gc3ByaW50ZigidWludHB0cihfcCVkKSIs IHB0cmluZGV4KQorCQkJc3lzY2FsbF9hcmdzW3N5c2NhbGxfYXJnX2luZGV4KytdID0gc3ByaW50 ZigidWludHB0cihsZW4oJXMpKSIsIG5hbWUpCisJCQlwdHJpbmRleCsrCisJCX0gZWxzZSBpZiAo dHlwZSA9PSAiaW50NjQiICYmIF8zMmJpdCAhPSAiIikgeworCQkJaWYgKF8zMmJpdCA9PSAiYmln LWVuZGlhbiIpIHsKKwkJCQlzeXNjYWxsX2FyZ3Nbc3lzY2FsbF9hcmdfaW5kZXgrK10gPSBzcHJp bnRmKCJ1aW50cHRyKCVzPj4zMikiLCBuYW1lKQorCQkJCXN5c2NhbGxfYXJnc1tzeXNjYWxsX2Fy Z19pbmRleCsrXSA9IHNwcmludGYoInVpbnRwdHIoJXMpIiwgbmFtZSkKKwkJCX0gZWxzZSB7CisJ CQkJc3lzY2FsbF9hcmdzW3N5c2NhbGxfYXJnX2luZGV4KytdID0gc3ByaW50ZigidWludHB0cigl cykiLCBuYW1lKQorCQkJCXN5c2NhbGxfYXJnc1tzeXNjYWxsX2FyZ19pbmRleCsrXSA9IHNwcmlu dGYoInVpbnRwdHIoJXM+PjMyKSIsIG5hbWUpCisJCQl9CisJCX0gZWxzZSB7CisJCQlzeXNjYWxs X2FyZ3Nbc3lzY2FsbF9hcmdfaW5kZXgrK10gPSBzcHJpbnRmKCJ1aW50cHRyKCVzKSIsIG5hbWUp CisJCX0JCQorCX0KKwkKKwkjIERldGVybWluZSB3aGljaCBmb3JtIHRvIHVzZTsgcGFkIGFyZ3Mg d2l0aCB6ZXJvcy4KKwlhc20gPSAiU3lzY2FsbCIKKwkKKwllcnJzdHIgPSAwCisJaWYgKCJlcnIi IGluIG91dGFyZ190eXBlcyAmJiBvdXRhcmdfdHlwZXNbImVyciJdID09ICJFcnJvciIpIHsKKwkJ YXNtID0gYXNtICJFcnJzdHIiCisJCWVycnN0ciA9IDEKKwl9CisKKwlpZiAoc3lzY2FsbF9hcmdf aW5kZXggPD0gNCkgeworCQlmb3IgKDsgc3lzY2FsbF9hcmdfaW5kZXggPD0gMzsgc3lzY2FsbF9h cmdfaW5kZXgrKykKKwkJCXN5c2NhbGxfYXJnc1tzeXNjYWxsX2FyZ19pbmRleF0gPSAiMCIKKwl9 IGVsc2UgaWYgKHN5c2NhbGxfYXJnX2luZGV4IDw9IDcpIHsKKwkJYXNtID0gYXNtICI2IgorCQlm b3IgKDsgc3lzY2FsbF9hcmdfaW5kZXggPD0gNjsgc3lzY2FsbF9hcmdfaW5kZXgrKykKKwkJCXN5 c2NhbGxfYXJnc1tzeXNjYWxsX2FyZ19pbmRleF0gPSAiMCIKKwl9IGVsc2UgeworCQlwcmludCAi dG9vIG1hbnkgYXJndW1lbnRzIHRvIHN5c3RlbSBjYWxsXG4iCisJCWV4aXQgMQorCX0KKworCXN5 c2NhbGxfcmV0ID0gIiIKKwkKKwlpZiAobGVuZ3RoKG91dGFyZ3MpID4gMCkgewkJCisJCWlmIChl cnJzdHIpIHsKKwkJCXN5c2NhbGxfcmV0ID0gc3lzY2FsbF9yZXQgInIwLGUiCisJCX0gZWxzZSB7 CisjCQkJaWYob3V0YXJnX3R5cGVzW291dGFyZ3NbMV1dID09ICJpbnQ2NCIgJiYgXzMyYml0ICE9 ICIiKSB7CisjCQkJIyA2NC1iaXQgbnVtYmVyIGluIHIxOnIwIG9yIHIwOnIxLgorIwkJCQlzeXNj YWxsX3JldCA9ICJyMCxyMSxfIgorIwkJCX0gZWxzZSB7CisJCQkJc3lzY2FsbF9yZXQgPSAicjAs XyxfIgorIwkJCX0KKwkJfQorCX0KKwkKKwlzeXNuYW1lID0gIlNZU18iIHRvdXBwZXIoZm5hbWUp CisKKwkjIEFjdHVhbGwgY2FsbC4KKwlpZiAoc3lzY2FsbF9yZXQgPT0gIiIpCisJCXByaW50Zigi XHQlcyglcyIsIGFzbSwgc3lzbmFtZSkKKwllbHNlCisJCXByaW50ZigiXHQlcyA6PSAlcyglcyIs IHN5c2NhbGxfcmV0LCBhc20sIHN5c25hbWUpCisJCisJZm9yIChpPTE7IGkgPD0gbGVuZ3RoKHN5 c2NhbGxfYXJncyk7IGkrKykgeworCQlwcmludGYoIiwgJXMiLCBzeXNjYWxsX2FyZ3NbaV0pCisJ fQorCisJcHJpbnQgIilcbiIKKwkKKwkjIHNldCBSZXR1cm4gdmFsdWVzLgorCWZvciAoaT0xOyBp IDw9IGxlbmd0aChvdXRhcmdzKTsgaSsrKSB7CisJCW5hbWUgPSBvdXRhcmdzW2ldCisJCXR5cGUg PSBvdXRhcmdfdHlwZXNbbmFtZV0KKwkJCisJCSMgU2hvdWxkIGJlIHRoZSBsYXN0IG91dHB1dCB2 YXJpYWJsZS4KKwkJaWYgKG5hbWUgPT0gImVyciIgJiYgdHlwZSA9PSAiRXJyb3IiKQorCQkJYnJl YWsKKwkKKwkJaWYodHlwZSA9PSAiaW50NjQiICYmIF8zMmJpdCAhPSAiIikgeworCQkJcHJpbnQg InN5c3RlbSBjYWxsIHJldHVybmluZyA2NCBiaXQgdmFsdWVcbiIKKwkJCWV4aXQgMQkJCQorIwkJ CSMgNjQtYml0IG51bWJlciBpbiByMTpyMCBvciByMDpyMS4KKyMJCQlpZihfMzJiaXQgPT0gImJp Zy1lbmRpYW4iKSB7CisjCQkJCXByaW50ZigiXHQlcyA9IGludDY0KHIwKTw8MzIgfCBpbnQ2NChy MSkiLCBuYW1lKTsKKyMJCQl9IGVsc2UgeworIwkJCQlwcmludGYoIlx0JXMgPSBpbnQ2NChyMSk8 PDMyIHwgaW50NjQocjApIiwgbmFtZSk7CisjCQkJfQorIwkJCWJyZWFrCisJCX0gZWxzZSBpZiAo dHlwZSA9PSAiYm9vbCIpIHsKKwkJCXByaW50ZigiXHQlcyA9IHIlZCAhPSAwXG4iLCBuYW1lLCBp LTEpCisJCX0gZWxzZSB7CisJCQlwcmludGYoIlx0JXMgPSAlcyhyJWQpXG4iLCBuYW1lLCB0eXBl LCBpLTEpCisJCX0KKwl9CQorCisJaWYgKGVycnN0cikgeworCQlwcmludCAiXHRlcnIgPSBuaWwi CisJCXByaW50ICJcdGlmIGludChyMCkgPT0gLTEgeyIKKwkJcHJpbnQgIlx0XHRlcnIgPSBOZXdF cnJvcihlKSIKKwkJcHJpbnQgIlx0fSIKKwl9CisKKwlwcmludCAiXHRyZXR1cm5cbn0iCisJCit9 CmRpZmYgLXIgMDlhYjg2NWQ4NzVjIHNyYy9wa2cvc3lzY2FsbC9ta3N5c2NhbGxfcGxhbjkuc2gK LS0tIC9kZXYvbnVsbAlUaHUgSmFuIDAxIDAwOjAwOjAwIDE5NzAgKzAwMDAKKysrIGIvc3JjL3Br Zy9zeXNjYWxsL21rc3lzY2FsbF9wbGFuOS5zaAlTYXQgSmFuIDE1IDEzOjAwOjEzIDIwMTEgKzAy MDAKQEAgLTAsMCArMSwzMiBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDEwIFRoZSBHbyBB dXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBp cyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZQorIyBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGlu IHRoZSBMSUNFTlNFIGZpbGUuCisKKyMgVGhpcyBwcm9ncmFtIHJlYWRzIGEgZmlsZSBjb250YWlu aW5nIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyMgKGxpa2Ugc3lzY2FsbF9wbGFuOS5nbykgYW5kIGdl bmVyYXRlcyBzeXN0ZW0gY2FsbCBib2RpZXMuCisjIFRoZSBwcm90b3R5cGVzIGFyZSBtYXJrZWQg YnkgbGluZXMgYmVnaW5uaW5nIHdpdGggIi8vc3lzIgorIyBhbmQgcmVhZCBsaWtlIGZ1bmMgZGVj bGFyYXRpb25zIGlmIC8vc3lzIGlzIHJlcGxhY2VkIGJ5IGZ1bmMsIGJ1dDoKKyMJKiBUaGUgcGFy YW1ldGVyIGxpc3RzIG11c3QgZ2l2ZSBhIG5hbWUgZm9yIGVhY2ggYXJndW1lbnQuCisjCSAgVGhp cyBpbmNsdWRlcyByZXR1cm4gcGFyYW1ldGVycy4KKyMJKiBJZiB0aGUgcmV0dXJuIHBhcmFtZXRl ciBpcyBhbiBlcnJvciBzdHJpbmcsCisjCSAgYXMgcmV0dXJuZWQgYnkgZXJyc3RyLiBJdCBtdXN0 IGJlIG5hbWVkIGVyciwgb2YgdHlwZSBFcnJvcgorIwkgIGFuZCBiZSB0aGUgbGFzdCByZXR1cm4g cGFyYW1ldGVyLgorCitjbWRsaW5lPSJta3N5c2NhbGxfcGxhbjkuc2ggJEAiIAorXzMyYml0PSIi CisKK2lmIFsgIiQxIiA9PSAnLWIzMicgXTsgdGhlbgorCV8zMmJpdD0iYmlnLWVuZGlhbiIKK2Vs aWYgWyAiJDEiID09ICctbDMyJyBdOyB0aGVuCisJXzMyYml0PSJsaXR0bGUtZW5kaWFuIgorZmkK KworYXdrIC12IF8zMmJpdD0iJHtfMzJiaXR9IiAtdiBjbWRsaW5lPSIke2NtZGxpbmV9IiAtZiBt a3N5c2NhbGxfcGxhbjkuYXdrICIkMiIKKworI2lmKCRBUkdWWzBdID1+IC9eLS8pIHsKKyMJcHJp bnQgU1RERVJSICJ1c2FnZTogbWtzeXNjYWxsLnNoIFstYjMyIHwgLWwzMl0gW2ZpbGUgLi4uXVxu IjsKKyMJZXhpdCAxOworI30KKworCmRpZmYgLXIgMDlhYjg2NWQ4NzVjIHNyYy9wa2cvc3lzY2Fs bC9ta3N5c251bV9wbGFuOS5zaAotLS0gL2Rldi9udWxsCVRodSBKYW4gMDEgMDA6MDA6MDAgMTk3 MCArMDAwMAorKysgYi9zcmMvcGtnL3N5c2NhbGwvbWtzeXNudW1fcGxhbjkuc2gJU2F0IEphbiAx NSAxMzowMDoxMyAyMDExICswMjAwCkBAIC0wLDAgKzEsMjMgQEAKKyMhL2Jpbi9zaAorIyBDb3B5 cmlnaHQgMjAwOSBUaGUgR28gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgVXNlIG9m IHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUKKyMgbGljZW5zZSB0 aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLiMgQ29weXJpZ2h0IDIwMDkgVGhl IEdvIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIFVzZSBvZiB0aGlzIHNvdXJjZSBj b2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlCisjIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91 bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworQ09NTUFORD0ibWtzeXNudW1fcGxhbjkuc2ggJEAi CisKK2NhdCA8PEVPRgorLy8gJENPTU1BTkQKKy8vIE1BQ0hJTkUgR0VORVJBVEVEIEJZIFRIRSBB Qk9WRSBDT01NQU5EOyBETyBOT1QgRURJVAorCitwYWNrYWdlIHN5c2NhbGwKKworY29uc3QoCitF T0YKKworY2F0ICQxIHwgc2VkIC1yICdzL14jZGVmaW5lWyBcdF0oW0EtWjAtOV9dKylbIFx0XSso WzAtOV0rKS9cdFNZU19cMT1cMi9nJyB8IGdyZXAgLXYgU1lTX18KKworY2F0IDw8RU9GCispCitF T0YKZGlmZiAtciAwOWFiODY1ZDg3NWMgc3JjL3BrZy9zeXNjYWxsL3N5c2NhbGxfcGxhbjkuZ28K LS0tIC9kZXYvbnVsbAlUaHUgSmFuIDAxIDAwOjAwOjAwIDE5NzAgKzAwMDAKKysrIGIvc3JjL3Br Zy9zeXNjYWxsL3N5c2NhbGxfcGxhbjkuZ28JU2F0IEphbiAxNSAxMzowMDoxMyAyMDExICswMjAw CkBAIC0wLDAgKzEsMzY4IEBACisvLyBDb3B5cmlnaHQgMjAxMCBUaGUgR28gQXV0aG9ycy4gQWxs IHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVk IGJ5IGEgQlNELXN0eWxlCisvLyBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNF TlNFIGZpbGUuCisKKy8vIFBsYW4gOSBzeXN0ZW0gY2FsbHMuCisvLyBUaGlzIGZpbGUgaXMgY29t cGlsZWQgYXMgb3JkaW5hcnkgR28gY29kZSwKKy8vIGJ1dCBpdCBpcyBhbHNvIGlucHV0IHRvIG1r c3lzY2FsbCwKKy8vIHdoaWNoIHBhcnNlcyB0aGUgLy9zeXMgbGluZXMgYW5kIGdlbmVyYXRlcyBz eXN0ZW0gY2FsbCBzdHVicy4KKy8vIE5vdGUgdGhhdCBzb21ldGltZXMgd2UgdXNlIGEgbG93ZXJj YXNlIC8vc3lzIG5hbWUgYW5kCisvLyB3cmFwIGl0IGluIG91ciBvd24gbmljZXIgaW1wbGVtZW50 YXRpb24uCisKK3BhY2thZ2Ugc3lzY2FsbAorCitpbXBvcnQgInVuc2FmZSIKKworY29uc3QgT1Mg PSAicGxhbjkiCisKK2NvbnN0IEltcGxlbWVudHNHZXR3ZCA9IHRydWUKKworLy8gc2hhbWVsZXNz bHkgY29waWVkIGZyb20gb3MuZXJyb3IuCisvLyBBbiBFcnJvciBjYW4gcmVwcmVzZW50IGFueSBw cmludGFibGUgZXJyb3IgY29uZGl0aW9uLgordHlwZSBFcnJvciBpbnRlcmZhY2UgeworCVN0cmlu ZygpIHN0cmluZworfQorCisvLyBBIGhlbHBlciB0eXBlIHRoYXQgY2FuIGJlIGVtYmVkZGVkIG9y IHdyYXBwZWQgdG8gc2ltcGxpZnkgc2F0aXNmeWluZworLy8gRXJyb3IuCit0eXBlIEVycm9yU3Ry aW5nIHN0cmluZworCitmdW5jIChlIEVycm9yU3RyaW5nKSBTdHJpbmcoKSBzdHJpbmcgeyByZXR1 cm4gc3RyaW5nKGUpIH0KKworLy8gTmV3RXJyb3IgY29udmVydHMgcyB0byBhbiBFcnJvclN0cmlu Zywgd2hpY2ggc2F0aXNmaWVzIHRoZSBFcnJvciBpbnRlcmZhY2UuCitmdW5jIE5ld0Vycm9yKHMg c3RyaW5nKSBFcnJvciB7IHJldHVybiBFcnJvclN0cmluZyhzKSB9CisKK3ZhciAoCisJU3RkaW4g ID0gMAorCVN0ZG91dCA9IDEKKwlTdGRlcnIgPSAyCispCisKK2Z1bmMgU3lzY2FsbEVycnN0cih0 cmFwLCBhMSwgYTIsIGEzIHVpbnRwdHIpIChyIHVpbnRwdHIsIGVyciBzdHJpbmcpCitmdW5jIFN5 c2NhbGxFcnJzdHI2KHRyYXAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYgdWludHB0cikgKHIgdWlu dHB0ciwgZXJyIHN0cmluZykKKworLy8gUGxhbiA5IGVycm9ycwordmFyICgKKwlFbm9lcnJvciAg ICBFcnJvciA9IE5ld0Vycm9yKCJubyBlcnJvciIpCisJRW1vdW50ICAgICAgRXJyb3IgPSBOZXdF cnJvcigiaW5jb25zaXN0ZW50IG1vdW50IikKKwlFdW5tb3VudCAgICBFcnJvciA9IE5ld0Vycm9y KCJub3QgbW91bnRlZCIpCisJRWlzbXRwdCAgICAgRXJyb3IgPSBOZXdFcnJvcigiaXMgYSBtb3Vu dCBwb2ludCIpCisJRXVuaW9uICAgICAgRXJyb3IgPSBOZXdFcnJvcigibm90IGluIHVuaW9uIikK KwlFbW91bnRycGMgICBFcnJvciA9IE5ld0Vycm9yKCJtb3VudCBycGMgZXJyb3IiKQorCUVzaHV0 ZG93biAgIEVycm9yID0gTmV3RXJyb3IoImRldmljZSBzaHV0IGRvd24iKQorCUVub2NyZWF0ZSAg IEVycm9yID0gTmV3RXJyb3IoIm1vdW50ZWQgZGlyZWN0b3J5IGZvcmJpZHMgY3JlYXRpb24iKQor CUVub25leGlzdCAgIEVycm9yID0gTmV3RXJyb3IoImZpbGUgZG9lcyBub3QgZXhpc3QiKQorCUVl eGlzdCAgICAgIEVycm9yID0gTmV3RXJyb3IoImZpbGUgYWxyZWFkeSBleGlzdHMiKQorCUViYWRz aGFycCAgIEVycm9yID0gTmV3RXJyb3IoInVua25vd24gZGV2aWNlIGluICMgZmlsZW5hbWUiKQor CUVub3RkaXIgICAgIEVycm9yID0gTmV3RXJyb3IoIm5vdCBhIGRpcmVjdG9yeSIpCisJRWlzZGly ICAgICAgRXJyb3IgPSBOZXdFcnJvcigiZmlsZSBpcyBhIGRpcmVjdG9yeSIpCisJRWJhZGNoYXIg ICAgRXJyb3IgPSBOZXdFcnJvcigiYmFkIGNoYXJhY3RlciBpbiBmaWxlIG5hbWUiKQorCUVmaWxl bmFtZSAgIEVycm9yID0gTmV3RXJyb3IoImZpbGUgbmFtZSBzeW50YXgiKQorCUVwZXJtICAgICAg IEVycm9yID0gTmV3RXJyb3IoInBlcm1pc3Npb24gZGVuaWVkIikKKwlFYmFkdXNlZmQgICBFcnJv ciA9IE5ld0Vycm9yKCJpbmFwcHJvcHJpYXRlIHVzZSBvZiBmZCIpCisJRWJhZGFyZyAgICAgRXJy b3IgPSBOZXdFcnJvcigiYmFkIGFyZyBpbiBzeXN0ZW0gY2FsbCIpCisJRWludXNlICAgICAgRXJy b3IgPSBOZXdFcnJvcigiZGV2aWNlIG9yIG9iamVjdCBhbHJlYWR5IGluIHVzZSIpCisJRWlvICAg ICAgICAgRXJyb3IgPSBOZXdFcnJvcigiaS9vIGVycm9yIikKKwlFdG9vYmlnICAgICBFcnJvciA9 IE5ld0Vycm9yKCJyZWFkIG9yIHdyaXRlIHRvbyBsYXJnZSIpCisJRXRvb3NtYWxsICAgRXJyb3Ig PSBOZXdFcnJvcigicmVhZCBvciB3cml0ZSB0b28gc21hbGwiKQorCUVub3BvcnQgICAgIEVycm9y ID0gTmV3RXJyb3IoIm5ldHdvcmsgcG9ydCBub3QgYXZhaWxhYmxlIikKKwlFaHVuZ3VwICAgICBF cnJvciA9IE5ld0Vycm9yKCJpL28gb24gaHVuZ3VwIGNoYW5uZWwiKQorCUViYWRjdGwgICAgIEVy cm9yID0gTmV3RXJyb3IoImJhZCBwcm9jZXNzIG9yIGNoYW5uZWwgY29udHJvbCByZXF1ZXN0IikK KwlFbm9kZXYgICAgICBFcnJvciA9IE5ld0Vycm9yKCJubyBmcmVlIGRldmljZXMiKQorCUVwcm9j ZGllZCAgIEVycm9yID0gTmV3RXJyb3IoInByb2Nlc3MgZXhpdGVkIikKKwlFbm9jaGlsZCAgICBF cnJvciA9IE5ld0Vycm9yKCJubyBsaXZpbmcgY2hpbGRyZW4iKQorCUVpb2xvYWQgICAgIEVycm9y ID0gTmV3RXJyb3IoImkvbyBlcnJvciBpbiBkZW1hbmQgbG9hZCIpCisJRW5vdm1lbSAgICAgRXJy b3IgPSBOZXdFcnJvcigidmlydHVhbCBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKQorCUViYWRm ZCAgICAgIEVycm9yID0gTmV3RXJyb3IoImZkIG91dCBvZiByYW5nZSBvciBub3Qgb3BlbiIpCisJ RW5vZmQgICAgICAgRXJyb3IgPSBOZXdFcnJvcigibm8gZnJlZSBmaWxlIGRlc2NyaXB0b3JzIikK KwlFaXNzdHJlYW0gICBFcnJvciA9IE5ld0Vycm9yKCJzZWVrIG9uIGEgc3RyZWFtIikKKwlFYmFk ZXhlYyAgICBFcnJvciA9IE5ld0Vycm9yKCJleGVjIGhlYWRlciBpbnZhbGlkIikKKwlFdGltZWRv dXQgICBFcnJvciA9IE5ld0Vycm9yKCJjb25uZWN0aW9uIHRpbWVkIG91dCIpCisJRWNvbnJlZnVz ZWQgRXJyb3IgPSBOZXdFcnJvcigiY29ubmVjdGlvbiByZWZ1c2VkIikKKwlFY29uaW51c2UgICBF cnJvciA9IE5ld0Vycm9yKCJjb25uZWN0aW9uIGluIHVzZSIpCisJRWludHIgICAgICAgRXJyb3Ig PSBOZXdFcnJvcigiaW50ZXJydXB0ZWQiKQorCUVub21lbSAgICAgIEVycm9yID0gTmV3RXJyb3Io Imtlcm5lbCBhbGxvY2F0ZSBmYWlsZWQiKQorCUVub3N3YXAgICAgIEVycm9yID0gTmV3RXJyb3Io InN3YXAgc3BhY2UgZnVsbCIpCisJRXNvdmVybGFwICAgRXJyb3IgPSBOZXdFcnJvcigic2VnbWVu dHMgb3ZlcmxhcCIpCisJRW1vdXNlc2V0ICAgRXJyb3IgPSBOZXdFcnJvcigibW91c2UgdHlwZSBh bHJlYWR5IHNldCIpCisJRXNob3J0ICAgICAgRXJyb3IgPSBOZXdFcnJvcigiaS9vIGNvdW50IHRv byBzbWFsbCIpCisJRWdyZWcgICAgICAgRXJyb3IgPSBOZXdFcnJvcigiam1rIGFkZGVkIHJlZW50 cmFuY3kgZm9yIHRocmVhZHMiKQorCUViYWRzcGVjICAgIEVycm9yID0gTmV3RXJyb3IoImJhZCBh dHRhY2ggc3BlY2lmaWVyIikKKwlFbm9yZWcgICAgICBFcnJvciA9IE5ld0Vycm9yKCJwcm9jZXNz IGhhcyBubyBzYXZlZCByZWdpc3RlcnMiKQorCUVub2F0dGFjaCAgIEVycm9yID0gTmV3RXJyb3Io Im1vdW50L2F0dGFjaCBkaXNhbGxvd2VkIikKKwlFc2hvcnRzdGF0ICBFcnJvciA9IE5ld0Vycm9y KCJzdGF0IGJ1ZmZlciB0b28gc21hbGwiKQorCUViYWRzdGF0ICAgIEVycm9yID0gTmV3RXJyb3Io Im1hbGZvcm1lZCBzdGF0IGJ1ZmZlciIpCisJRW5lZ29mZiAgICAgRXJyb3IgPSBOZXdFcnJvcigi bmVnYXRpdmUgaS9vIG9mZnNldCIpCisJRWNtZGFyZ3MgICAgRXJyb3IgPSBOZXdFcnJvcigid3Jv bmcgI2FyZ3MgaW4gY29udHJvbCBtZXNzYWdlIikKKwlFYmFkaXAgICAgICBFcnJvciA9IE5ld0Vy cm9yKCJiYWQgaXAgYWRkcmVzcyBzeW50YXgiKQorCUVkaXJzZWVrICAgIEVycm9yID0gTmV3RXJy b3IoInNlZWsgaW4gZGlyZWN0b3J5IikKKykKKwordmFyICgKKwlFSVNESVIgRXJyb3IgPSBFaXNk aXIKKwlFUElQRSAgRXJyb3IgPSBFaW8KKykKKworZnVuYyBhdG9pKGJ1ZiBbXWJ5dGUpIGludCB7 CisJcmVzIDo9IDAKKworCWZvciBpIDo9IDA7IGkgPCBsZW4oYnVmKTsgaSsrIHsKKwkJcmVzICo9 IDEwCisJCXJlcyArPSBpbnQoYnVmW2ldIC0gJzAnKQorCX0KKworCXJldHVybiByZXMKK30KKwor ZnVuYyBmaW5kbnVsbChzIFtdYnl0ZSkgaW50IHsKKwlsIDo9IDAKKwlmb3IgOyAobCA8IGxlbihz KSkgJiYgKHNbbF0gIT0gMCk7IGwrKyB7CisJfQorCisJcmV0dXJuIGwKK30KKworCisvKgorICog V3JhcHBlZAorICovCisKK2Z1bmMgR2V0cGFnZXNpemUoKSBpbnQgeyByZXR1cm4gNDA5NiB9CisK Ky8vc3lzCWV4aXRzKG1zZyAqYnl0ZSkKK2Z1bmMgRXhpdHMobXNnICpzdHJpbmcpIHsKKwlpZiBt c2cgPT0gbmlsIHsKKwkJZXhpdHMobmlsKQorCX0KKworCWV4aXRzKFN0cmluZ0J5dGVQdHIoKm1z ZykpCit9CisKK2Z1bmMgRXhpdChjb2RlIGludCkgeworCWlmIGNvZGUgPT0gMCB7CisJCUV4aXRz KG5pbCkKKwl9CisKKwltc2cgOj0gc3RyKGNvZGUpCisJRXhpdHMoJm1zZykKK30KKwordmFyIF90 b3MgKlRvcyAvLyBwcm92aWRlZCBieSBydW50aW1lIHJ0MC5zCitmdW5jIEdldHBpZCgpIChwaWQg aW50KSB7CisJcmV0dXJuIGludChfdG9zLlBpZCkKK30KKworZnVuYyBHZXRwcGlkKCkgKHBwaWQg aW50KSB7CisJdmFyIGIgWzEyXWJ5dGUKKworCWZkLCBlIDo9IE9wZW4oIiNjL3BwaWQiLCBPX1JE T05MWSkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiAtMQorCX0KKwlkZWZlciBDbG9zZShmZCkK KworCW4sIGUgOj0gUHJlYWQoZmQsIGJbOl0sIDApCisKKwltIDo9IDAKKwlmb3IgOyBtIDwgbiAm JiBiW21dID09ICcgJzsgbSsrIHsKKwl9CisKKwlyZXR1cm4gYXRvaShiW20gOiBuLTFdKQorfQor CisKK2Z1bmMgUmVhZChmZCBpbnQsIHAgW11ieXRlKSAobiBpbnQsIGVyciBFcnJvcikgeworCXJl dHVybiBQcmVhZChmZCwgcCwgLTEpCit9CisKK2Z1bmMgV3JpdGUoZmQgaW50LCBwIFtdYnl0ZSkg KG4gaW50LCBlcnIgRXJyb3IpIHsKKwlyZXR1cm4gUHdyaXRlKGZkLCBwLCAtMSkKK30KKworZnVu YyBHZXR3ZCgpICh3ZCBzdHJpbmcsIGVyciBFcnJvcikgeworCWZkLCBlIDo9IE9wZW4oIi4iLCBP X1JET05MWSkKKworCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuICIiLCBlCisJfQorCWRlZmVyIENs b3NlKGZkKQorCisJcmV0dXJuIEZkMnBhdGgoZmQpCit9CisKKy8vc3lzCWZkMnBhdGgoZmQgaW50 LCBidWYgW11ieXRlKSAoZXJyIEVycm9yKQorZnVuYyBGZDJwYXRoKGZkIGludCkgKHBhdGggc3Ry aW5nLCBlcnIgRXJyb3IpIHsKKwl2YXIgYnVmIFs1MTJdYnl0ZQorCisJZSA6PSBmZDJwYXRoKGZk LCBidWZbOl0pCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gIiIsIGUKKwl9CisKKwlidWZbbGVu KGJ1ZiktMV0gPSAwCisJcmV0dXJuIHN0cmluZyhidWZbOmZpbmRudWxsKGJ1Zls6XSldKSwgbmls Cit9CisKKy8vc3lzCXBpcGUocCAqWzJdX0NfaW50KSAoZXJyIEVycm9yKQorZnVuYyBQaXBlKHAg W11pbnQpIChlcnIgRXJyb3IpIHsKKwlpZiBsZW4ocCkgIT0gMiB7CisJCXJldHVybiBOZXdFcnJv cigiYmFkIGFyZyBpbiBzeXN0ZW0gY2FsbCIpCisJfQorCXZhciBwcCBbMl1fQ19pbnQKKwllcnIg PSBwaXBlKCZwcCkKKwlwWzBdID0gaW50KHBwWzBdKQorCXBbMV0gPSBpbnQocHBbMV0pCisJcmV0 dXJuCit9CisKKworLy9zeXMJc2xlZXAobWlsbGlzZWNzIGludDMyKSAoZXJyIEVycm9yKQorZnVu YyBTbGVlcChuc2VjIGludDY0KSAoZXJyIEVycm9yKSB7CisJcmV0dXJuIHNsZWVwKGludDMyKChu c2VjICsgOTk5KSAvIDFlNikpCit9CisKKy8vIFVuZGVybHlpbmcgc3lzdGVtIGNhbGwgd3JpdGVz IHRvIG5ld29mZnNldCB2aWEgcG9pbnRlci4KKy8vIEltcGxlbWVudGVkIGluIGFzc2VtYmx5IHRv IGF2b2lkIGFsbG9jYXRpb24uCitmdW5jIHNlZWsocGxhY2Vob2xkZXIgdWludHB0ciwgZmQgaW50 LCBvZmZzZXQgaW50NjQsIHdoZW5jZSBpbnQpIChuZXdvZmZzZXQgaW50NjQsIGVyciBzdHJpbmcp CisKK2Z1bmMgU2VlayhmZCBpbnQsIG9mZnNldCBpbnQ2NCwgd2hlbmNlIGludCkgKG5ld29mZnNl dCBpbnQ2NCwgZXJyIEVycm9yKSB7CisJbmV3b2Zmc2V0LCBlIDo9IHNlZWsoMCwgZmQsIG9mZnNl dCwgd2hlbmNlKQorCisJZXJyID0gbmlsCisJaWYgbmV3b2Zmc2V0ID09IC0xIHsKKwkJZXJyID0g TmV3RXJyb3IoZSkKKwl9CisJcmV0dXJuCit9CisKK2Z1bmMgTWtkaXIocGF0aCBzdHJpbmcsIG1v ZGUgdWludDMyKSAoZXJyIEVycm9yKSB7CisJZmQsIGVyciA6PSBDcmVhdGUocGF0aCwgT19SRE9O TFksIERNRElSfG1vZGUpCisKKwlpZiBmZCAhPSAtMSB7CisJCUNsb3NlKGZkKQorCX0KKworCXJl dHVybgorfQorCit0eXBlIFdhaXRtc2cgc3RydWN0IHsKKwlQaWQgIGludAorCVRpbWUgWzNddWlu dDMyCisJTXNnICBzdHJpbmcKK30KKworLy9zeXMJYXdhaXQocyBbXWJ5dGUpIChuIGludCwgZXJy IEVycm9yKQorZnVuYyBBd2FpdChtc2cgKldhaXRtc2cpIChlcnIgRXJyb3IpIHsKKwl2YXIgcyBb NTEyXWJ5dGUKKworCWVuZCwgZXJyIDo9IGF3YWl0KHNbOl0pCisKKwlpZiBlcnIgIT0gbmlsIHx8 IG1zZyA9PSBuaWwgeworCQlyZXR1cm4KKwl9CisKKwlzZXAgOj0gbWFrZShbXWludCwgMCwgNykK KworCWZvciBpIDo9IDA7IGkgPCBlbmQ7IGkrKyB7CisJCWlmIHNbaV0gPT0gJyAnIHsKKwkJCXNl cCA9IGFwcGVuZChzZXAsIGkpCisJCX0KKwl9CisJc2VwID0gYXBwZW5kKHNlcCwgZW5kKQorCisJ bXNnLlBpZCA9IGF0b2koc1swOnNlcFswXV0pCisKKwlmb3IgaSA6PSAwOyBpIDwgMzsgaSsrIHsK KwkJbXNnLlRpbWVbaV0gPSB1aW50MzIoYXRvaShzW3NlcFtpXSsxIDogc2VwW2krMV1dKSkKKwl9 CisKKwltc2cuTXNnID0gc3RyaW5nKHNbc2VwWzNdKzIgOiBzZXBbbGVuKHNlcCktMV0tMV0pCisK KwlyZXR1cm4KK30KKworZnVuYyBGY2hkaXIoZmQgaW50KSAoZXJyIEVycm9yKSB7CisJcGF0aCwg ZXJyIDo9IEZkMnBhdGgoZmQpCisKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCisJ cmV0dXJuIENoZGlyKHBhdGgpCit9CisKK3R5cGUgVGltZXZhbCBzdHJ1Y3QgeworCVNlYyAgaW50 MzIKKwlVc2VjIGludDMyCit9CisKK2Z1bmMgTnNlY1RvVGltZXZhbChuc2VjIGludDY0KSAodHYg VGltZXZhbCkgeworCW5zZWMgKz0gOTk5IC8vIHJvdW5kIHVwIHRvIG1pY3Jvc2Vjb25kCisJdHYu VXNlYyA9IGludDMyKG5zZWMgJSAxZTkgLyAxZTMpCisJdHYuU2VjID0gaW50MzIobnNlYyAvIDFl OSkKKwlyZXR1cm4KK30KKworZnVuYyBHZXR0aW1lb2ZkYXkodHYgKlRpbWV2YWwpIChlcnIgRXJy b3IpIHsKKwl2YXIgYiBbOF1ieXRlCisJdmFyIG5zZWMgaW50NjQKKworCWZkLCBlIDo9IE9wZW4o IiNjL2JpbnRpbWUiLCBPX1JET05MWSkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQor CWRlZmVyIENsb3NlKGZkKQorCisJXywgZSA9IFByZWFkKGZkLCBiWzpdLCAwKQorCisJaWYgZSAh PSBuaWwgeworCQlyZXR1cm4gZQorCX0KKworCW5zZWMgPSBpbnQ2NChiWzBdKTw8NTYgfAorCQlp bnQ2NChiWzFdKTw8NDggfAorCQlpbnQ2NChiWzJdKTw8NDAgfAorCQlpbnQ2NChiWzNdKTw8MzIg fAorCQlpbnQ2NChiWzRdKTw8MjQgfAorCQlpbnQ2NChiWzVdKTw8MTYgfAorCQlpbnQ2NChiWzZd KTw8OCB8CisJCWludDY0KGJbN10pCisKKwkqdHYgPSBOc2VjVG9UaW1ldmFsKG5zZWMpCisKKwly ZXR1cm4gZQorfQorCitmdW5jIGVycnN0cigpIHN0cmluZyB7CisJZXJyX2J1ZmZlciA6PSBtYWtl KFtdYnl0ZSwgRVJSTUFYKQorCisJUmF3U3lzY2FsbChTWVNfRVJSU1RSLCB1aW50cHRyKHVuc2Fm ZS5Qb2ludGVyKCZlcnJfYnVmZmVyWzBdKSksIHVpbnRwdHIobGVuKGVycl9idWZmZXIpKSwgMCkK KworCWVycl9idWZmZXJbbGVuKGVycl9idWZmZXIpLTFdID0gMAorCXJldHVybiBzdHJpbmcoZXJy X2J1ZmZlcls6ZmluZG51bGwoZXJyX2J1ZmZlcildKQorfQorCitmdW5jIEdldGVnaWQoKSAoZWdp ZCBpbnQpIHsgcmV0dXJuIC0xIH0KK2Z1bmMgR2V0ZXVpZCgpIChldWlkIGludCkgeyByZXR1cm4g LTEgfQorZnVuYyBHZXRnaWQoKSAoZ2lkIGludCkgICB7IHJldHVybiAtMSB9CitmdW5jIEdldHVp ZCgpICh1aWQgaW50KSAgIHsgcmV0dXJuIC0xIH0KKworZnVuYyBHZXRncm91cHMoKSAoZ2lkcyBb XWludCwgZXJyIEVycm9yKSB7CisJcmV0dXJuIG1ha2UoW11pbnQsIDApLCBuaWwKK30KKworLy9z eXMJRHVwKG9sZGZkIGludCwgbmV3ZmQgaW50KSAoZmQgaW50LCBlcnIgRXJyb3IpCisvL3N5cwlP cGVuKHBhdGggc3RyaW5nLCBtb2RlIGludCkgKGZkIGludCwgZXJyIEVycm9yKQorLy9zeXMJQ3Jl YXRlKHBhdGggc3RyaW5nLCBtb2RlIGludCwgcGVybSB1aW50MzIpIChmZCBpbnQsIGVyciBFcnJv cikKKy8vc3lzCVJlbW92ZShwYXRoIHN0cmluZykgKGVyciBFcnJvcikKKy8vc3lzCVByZWFkKGZk IGludCwgcCBbXWJ5dGUsIG9mZnNldCBpbnQ2NCkgKG4gaW50LCBlcnIgRXJyb3IpCisvL3N5cwlQ d3JpdGUoZmQgaW50LCBwIFtdYnl0ZSwgb2Zmc2V0IGludDY0KSAobiBpbnQsIGVyciBFcnJvcikK Ky8vc3lzCUNsb3NlKGZkIGludCkgKGVyciBFcnJvcikKKy8vc3lzCUNoZGlyKHBhdGggc3RyaW5n KSAoZXJyIEVycm9yKQorLy9zeXMJQmluZChuYW1lLCBvbGQgc3RyaW5nLCBmbGFnIGludCkgKGVy ciBFcnJvcikKKy8vc3lzCU1vdW50KGZkLCBhZmQgaW50LCBvbGQgc3RyaW5nLCBmbGFnIGludCwg YW5hbWUgc3RyaW5nKSAoZXJyIEVycm9yKQorLy9zeXMJVW5tb3VudChuYW1lLCBvbGQgc3RyaW5n KSAoZXJyIEVycm9yKQorLy9zeXMJU3RhdChwYXRoIHN0cmluZywgZWRpciBbXWJ5dGUpIChuIGlu dCwgZXJyIEVycm9yKQorLy9zeXMJRnN0YXQoZmQgaW50LCBlZGlyIFtdYnl0ZSkgKG4gaW50LCBl cnIgRXJyb3IpCisvL3N5cwlXc3RhdChwYXRoIHN0cmluZywgZWRpciBbXWJ5dGUpIChlcnIgRXJy b3IpCisvL3N5cwlGd3N0YXQoZmQgaW50LCBlZGlyIFtdYnl0ZSkgKGVyciBFcnJvcikKZGlmZiAt ciAwOWFiODY1ZDg3NWMgc3JjL3BrZy9zeXNjYWxsL3N5c2NhbGxfcGxhbjlfMzg2LmdvCi0tLSAv ZGV2L251bGwJVGh1IEphbiAwMSAwMDowMDowMCAxOTcwICswMDAwCisrKyBiL3NyYy9wa2cvc3lz Y2FsbC9zeXNjYWxsX3BsYW45XzM4Ni5nbwlTYXQgSmFuIDE1IDEzOjAwOjEzIDIwMTEgKzAyMDAK QEAgLTAsMCArMSw1IEBACisvLyBDb3B5cmlnaHQgMjAwOSBUaGUgR28gQXV0aG9ycy4gQWxsIHJp Z2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5 IGEgQlNELXN0eWxlCisvLyBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNF IGZpbGUuCisKK3BhY2thZ2Ugc3lzY2FsbApkaWZmIC1yIDA5YWI4NjVkODc1YyBzcmMvcGtnL3N5 c2NhbGwvdHlwZXNfcGxhbjkuYwotLS0gL2Rldi9udWxsCVRodSBKYW4gMDEgMDA6MDA6MDAgMTk3 MCArMDAwMAorKysgYi9zcmMvcGtnL3N5c2NhbGwvdHlwZXNfcGxhbjkuYwlTYXQgSmFuIDE1IDEz OjAwOjEzIDIwMTEgKzAyMDAKQEAgLTAsMCArMSwxMTYgQEAKKy8vIENvcHlyaWdodCAyMDA5IFRo ZSBHbyBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNl IGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUKKy8vIGxpY2Vuc2UgdGhhdCBjYW4gYmUg Zm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLyoKK0lucHV0IHRvIGdvZGVmcy4gIFNlZSBh bHNvIG1rZXJyb3JzLnNoIGFuZCBta2FsbC5zaAorKi8KKwordHlwZWRlZiB1bnNpZ25lZCBzaG9y dCB1c2hvcnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWNoYXI7Cit0eXBlZGVmIHVuc2lnbmVk IGxvbmcgdWxvbmc7Cit0eXBlZGVmIHVuc2lnbmVkIGludCB1aW50OwordHlwZWRlZiBsb25nIGxv bmcgdmxvbmc7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1dmxvbmc7CisKK3R5cGVkZWYg aW50ICRfQ19pbnQ7CisKK2VudW0geworCU9SRUFEICAgPSAwLCAgICAgICAvKiBvcGVuIGZvciBy ZWFkICovCisJT1dSSVRFICA9IDEsICAgICAgIC8qIHdyaXRlICovCisJT1JEV1IgICA9IDIsICAg ICAgIC8qIHJlYWQgYW5kIHdyaXRlICovCisJCisJJE9fUkRPTkxZICAgPSBPUkVBRCwKKwkkT19X Uk9OTFkgICA9IE9XUklURSwKKwkkT19SRFdSICAgICA9IE9SRFdSLAorCQorCU9FWEVDICAgPSAz LCAgICAgICAvKiBleGVjdXRlLCA9PSByZWFkIGJ1dCBjaGVjayBleGVjdXRlIHBlcm1pc3Npb24g Ki8KKwlPVFJVTkMgID0gMTYsICAgICAgLyogb3InZWQgaW4gKGV4Y2VwdCBmb3IgZXhlYyksIHRy dW5jYXRlIGZpbGUgZmlyc3QgKi8KKwlPQ0VYRUMgID0gMzIsICAgICAgLyogb3InZWQgaW4sIGNs b3NlIG9uIGV4ZWMgKi8KKwkKKwkkT19DTE9FWEVDICA9IE9DRVhFQywKKwkKKwlPUkNMT1NFID0g NjQsICAgICAgLyogb3InZWQgaW4sIHJlbW92ZSBvbiBjbG9zZSAqLworCU9FWENMICAgPSAweDEw MDAsICAvKiBvcidlZCBpbiwgZXhjbHVzaXZlIHVzZSAoY3JlYXRlIG9ubHkpICovCisJJE9fRVhD TCA9IE9FWENMLAorCQorCSRTVEFUTUFYID0gNjU1MzVVLAorCSRFUlJNQVggPSAxMjgsCisJCisJ JE1PUkRFUgkJPSAweDAwMDMsCS8qIG1hc2sgZm9yIGJpdHMgZGVmaW5pbmcgb3JkZXIgb2YgbW91 bnRpbmcgKi8KKwkkTVJFUEwJCT0gMHgwMDAwLAkvKiBtb3VudCByZXBsYWNlcyBvYmplY3QgKi8K KwkkTUJFRk9SRQk9IDB4MDAwMSwJLyogbW91bnQgZ29lcyBiZWZvcmUgb3RoZXJzIGluIHVuaW9u IGRpcmVjdG9yeSAqLworCSRNQUZURVIJCT0gMHgwMDAyLAkvKiBtb3VudCBnb2VzIGFmdGVyIG90 aGVycyBpbiB1bmlvbiBkaXJlY3RvcnkgKi8KKwkkTUNSRUFURQk9IDB4MDAwNCwJLyogcGVybWl0 IGNyZWF0aW9uIGluIG1vdW50ZWQgZGlyZWN0b3J5ICovCisJJE1DQUNIRQkJPSAweDAwMTAsCS8q IGNhY2hlIHNvbWUgZGF0YSAqLworCSRNTUFTSwkJPSAweDAwMTcsCS8qIGFsbCBiaXRzIG9uICov CisJCisJJFJGTkFNRUcgICAgICAgICA9ICgxPDwwKSwKKwkkUkZFTlZHICAgICAgICAgID0gKDE8 PDEpLAorCSRSRkZERyAgICAgICAgICAgPSAoMTw8MiksCisJJFJGTk9URUcgICAgICAgICA9ICgx PDwzKSwKKwkkUkZQUk9DICAgICAgICAgID0gKDE8PDQpLAorCSRSRk1FTSAgICAgICAgICAgPSAo MTw8NSksCisJJFJGTk9XQUlUICAgICAgICA9ICgxPDw2KSwKKwkkUkZDTkFNRUcgICAgICAgID0g KDE8PDEwKSwKKwkkUkZDRU5WRyAgICAgICAgID0gKDE8PDExKSwKKwkkUkZDRkRHICAgICAgICAg ID0gKDE8PDEyKSwKKwkkUkZSRU5EICAgICAgICAgID0gKDE8PDEzKSwKKwkkUkZOT01OVCAgICAg ICAgID0gKDE8PDE0KSwKKwkKKy8qIGJpdHMgaW4gUWlkLnR5cGUgKi8KKwkkUVRESVIgPSAweDgw LAkJLyogdHlwZSBiaXQgZm9yIGRpcmVjdG9yaWVzICovCisJJFFUQVBQRU5EID0gMHg0MCwJCS8q IHR5cGUgYml0IGZvciBhcHBlbmQgb25seSBmaWxlcyAqLworCSRRVEVYQ0wgPSAweDIwLAkJLyog dHlwZSBiaXQgZm9yIGV4Y2x1c2l2ZSB1c2UgZmlsZXMgKi8KKwkkUVRNT1VOVCA9IDB4MTAsCQkv KiB0eXBlIGJpdCBmb3IgbW91bnRlZCBjaGFubmVsICovCisJJFFUQVVUSCA9IDB4MDgsCQkvKiB0 eXBlIGJpdCBmb3IgYXV0aGVudGljYXRpb24gZmlsZSAqLworCSRRVFRNUCA9IDB4MDQsCQkvKiB0 eXBlIGJpdCBmb3Igbm90LWJhY2tlZC11cCBmaWxlICovCisJJFFURklMRSA9IDB4MDAsCQkvKiBw bGFpbiBmaWxlICovCisJCisJCisJLyogYml0cyBpbiBEaXIubW9kZSAqLworCSRETURJUiA9IDB4 ODAwMDAwMDAsCS8qIG1vZGUgYml0IGZvciBkaXJlY3RvcmllcyAqLworCSRETUFQUEVORCA9IDB4 NDAwMDAwMDAsCS8qIG1vZGUgYml0IGZvciBhcHBlbmQgb25seSBmaWxlcyAqLworCSRETUVYQ0wg PSAweDIwMDAwMDAwLAkvKiBtb2RlIGJpdCBmb3IgZXhjbHVzaXZlIHVzZSBmaWxlcyAqLworCSRE TU1PVU5UID0gMHgxMDAwMDAwMCwJLyogbW9kZSBiaXQgZm9yIG1vdW50ZWQgY2hhbm5lbCAqLwor CSRETUFVVEggPSAweDA4MDAwMDAwLAkvKiBtb2RlIGJpdCBmb3IgYXV0aGVudGljYXRpb24gZmls ZSAqLworCSRETVRNUCA9IDB4MDQwMDAwMDAsCS8qIG1vZGUgYml0IGZvciBub24tYmFja2VkLXVw IGZpbGVzICovCisJJERNUkVBRCA9IDB4NCwJCS8qIG1vZGUgYml0IGZvciByZWFkIHBlcm1pc3Np b24gKi8KKwkkRE1XUklURSA9IDB4MiwJCS8qIG1vZGUgYml0IGZvciB3cml0ZSBwZXJtaXNzaW9u ICovCisJJERNRVhFQyA9IDB4MSwJCS8qIG1vZGUgYml0IGZvciBleGVjdXRlIHBlcm1pc3Npb24g Ki8KKwkKKwlCSVQ4U1ogPSAxLAorCUJJVDE2U1ogPSAyLAorCUJJVDMyU1ogPSA0LAorCUJJVDY0 U1ogPSA4LAorCVFJRFNaID0gKEJJVDhTWitCSVQzMlNaK0JJVDY0U1opLAorCisJLyogU1RBVEZJ WExFTiBpbmNsdWRlcyBsZWFkaW5nIDE2LWJpdCBjb3VudCAqLworCS8qIFRoZSBjb3VudCwgaG93 ZXZlciwgZXhjbHVkZXMgaXRzZWxmOyB0b3RhbCBzaXplIGlzIEJJVDE2U1orY291bnQgKi8KKwkk U1RBVEZJWExFTiA9IChCSVQxNlNaK1FJRFNaKzUqQklUMTZTWis0KkJJVDMyU1orMSpCSVQ2NFNa KSwJLyogYW1vdW50IG9mIGZpeGVkIGxlbmd0aCBkYXRhIGluIGEgc3RhdCBidWZmZXIgKi8KKwkK K307CisKKworc3RydWN0IFByb2YJCQkvKiBQZXIgcHJvY2VzcyBwcm9maWxpbmcgKi8KK3sKKwlz dHJ1Y3QgUGxpbmsJKnBwOwkvKiBrbm93biB0byBiZSAwKHB0cikgKi8KKwlzdHJ1Y3QgUGxpbmsJ Km5leHQ7CS8qIGtub3duIHRvIGJlIDQocHRyKSAqLworCXN0cnVjdCBQbGluawkqbGFzdDsKKwlz dHJ1Y3QgUGxpbmsJKmZpcnN0OworCXVsb25nCQlwaWQ7CisJdWxvbmcJCXdoYXQ7Cit9OworCitz dHJ1Y3QgVG9zIHsKKwlzdHJ1Y3QgUHJvZglwcm9mOworCXV2bG9uZwkJY3ljbGVmcmVxOwkvKiBj eWNsZSBjbG9jayBmcmVxdWVuY3kgaWYgdGhlcmUgaXMgb25lLCAwIG90aGVyd2lzZSAqLworCXZs b25nCQlrY3ljbGVzOwkvKiBjeWNsZXMgc3BlbnQgaW4ga2VybmVsICovCisJdmxvbmcJCXBjeWNs ZXM7CS8qIGN5Y2xlcyBzcGVudCBpbiBwcm9jZXNzIChrZXJuZWwgKyB1c2VyKSAqLworCXVsb25n CQlwaWQ7CQkvKiBtaWdodCBhcyB3ZWxsIHB1dCB0aGUgcGlkIGhlcmUgKi8KKwl1bG9uZwkJY2xv Y2s7CisJLyogdG9wIG9mIHN0YWNrIGlzIGhlcmUgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IFBy b2YgJFByb2Y7Cit0eXBlZGVmIHN0cnVjdCBUb3MgJFRvczsKZGlmZiAtciAwOWFiODY1ZDg3NWMg c3JjL3BrZy9zeXNjYWxsL3plcnJvcnNfcGxhbjlfMzg2LmdvCi0tLSAvZGV2L251bGwJVGh1IEph biAwMSAwMDowMDowMCAxOTcwICswMDAwCisrKyBiL3NyYy9wa2cvc3lzY2FsbC96ZXJyb3JzX3Bs YW45XzM4Ni5nbwlTYXQgSmFuIDE1IDEzOjAwOjEzIDIwMTEgKzAyMDAKQEAgLTAsMCArMSwyNSBA QAorcGFja2FnZSBzeXNjYWxsCisKKy8vIENvbnN0YW50cworY29uc3QgKAorCS8vIEludmVudGVk IHZhbHVlcyB0byBzdXBwb3J0IHdoYXQgcGFja2FnZSBvcyBleHBlY3RzLgorCU9fQ1JFQVQgICAg PSAweDAyMDAwCisJT19OT0NUVFkgICA9IDB4MDAwMDAKKwlPX1RSVU5DICAgID0gMHgwMDAwMAor CU9fTk9OQkxPQ0sgPSAweDAwMDAwCisJT19BUFBFTkQgICA9IDB4MDAwMDAKKwlPX1NZTkMgICAg ID0gMHgwMDAwMAorCU9fQVNZTkMgICAgPSAweDAwMDAwCisKKworCVNfSUZNVCAgID0gMHgxZjAw MAorCVNfSUZJRk8gID0gMHgxMDAwCisJU19JRkNIUiAgPSAweDIwMDAKKwlTX0lGRElSICA9IDB4 NDAwMAorCVNfSUZCTEsgID0gMHg2MDAwCisJU19JRlJFRyAgPSAweDgwMDAKKwlTX0lGTE5LICA9 IDB4YTAwMAorCVNfSUZTT0NLID0gMHhjMDAwCispCisKKy8vIEVycm9yIHRhYmxlCmRpZmYgLXIg MDlhYjg2NWQ4NzVjIHNyYy9wa2cvc3lzY2FsbC96c3lzY2FsbF9wbGFuOV8zODYuZ28KLS0tIC9k ZXYvbnVsbAlUaHUgSmFuIDAxIDAwOjAwOjAwIDE5NzAgKzAwMDAKKysrIGIvc3JjL3BrZy9zeXNj YWxsL3pzeXNjYWxsX3BsYW45XzM4Ni5nbwlTYXQgSmFuIDE1IDEzOjAwOjEzIDIwMTEgKzAyMDAK QEAgLTAsMCArMSwyODMgQEAKKy8vIG1rc3lzY2FsbF9wbGFuOS5zaCAtbDMyIHN5c2NhbGxfcGxh bjkuZ28gc3lzY2FsbF9wbGFuOV8zODYuZ28KKy8vIE1BQ0hJTkUgR0VORVJBVEVEIEJZIFRIRSBD T01NQU5EIEFCT1ZFIERPIE5PVCBFRElUCisKK3BhY2thZ2Ugc3lzY2FsbAorCitpbXBvcnQgInVu c2FmZSIKKworLy8gVEhJUyBGSUxFIElTIEdFTkVSQVRFRCBCWSBUSEUgQ09NTUFORCBBVCBUSEUg VE9QIERPIE5PVCBFRElUCisKKworZnVuYyBleGl0cyhtc2cgKmJ5dGUpIHsKKwlTeXNjYWxsKFNZ U19FWElUUywgdWludHB0cih1bnNhZmUuUG9pbnRlcihtc2cpKSwgMCwgMCkKKworCXJldHVybgor fQorLy8gVEhJUyBGSUxFIElTIEdFTkVSQVRFRCBCWSBUSEUgQ09NTUFORCBBVCBUSEUgVE9QIERP IE5PVCBFRElUCisKKworZnVuYyBmZDJwYXRoKGZkIGludCwgYnVmIFtdYnl0ZSkgKGVyciBFcnJv cikgeworCXZhciBfcDAgdW5zYWZlLlBvaW50ZXIKKwlpZiBsZW4oYnVmKSA+IDAgeworCQlfcDAg PSB1bnNhZmUuUG9pbnRlcigmYnVmWzBdKQorCX0KKwlyMCwgZSA6PSBTeXNjYWxsRXJyc3RyKFNZ U19GRDJQQVRILCB1aW50cHRyKGZkKSwgdWludHB0cihfcDApLCB1aW50cHRyKGxlbihidWYpKSkK KworCWVyciA9IG5pbAorCWlmIGludChyMCkgPT0gLTEgeworCQllcnIgPSBOZXdFcnJvcihlKQor CX0KKwlyZXR1cm4KK30KKy8vIFRISVMgRklMRSBJUyBHRU5FUkFURUQgQlkgVEhFIENPTU1BTkQg QVQgVEhFIFRPUCBETyBOT1QgRURJVAorCisKK2Z1bmMgcGlwZShwICpbMl1fQ19pbnQpIChlcnIg RXJyb3IpIHsKKwlyMCwgZSA6PSBTeXNjYWxsRXJyc3RyKFNZU19QSVBFLCB1aW50cHRyKHVuc2Fm ZS5Qb2ludGVyKHApKSwgMCwgMCkKKworCWVyciA9IG5pbAorCWlmIGludChyMCkgPT0gLTEgewor CQllcnIgPSBOZXdFcnJvcihlKQorCX0KKwlyZXR1cm4KK30KKy8vIFRISVMgRklMRSBJUyBHRU5F UkFURUQgQlkgVEhFIENPTU1BTkQgQVQgVEhFIFRPUCBETyBOT1QgRURJVAorCisKK2Z1bmMgc2xl ZXAobWlsbGlzZWNzIGludDMyKSAoZXJyIEVycm9yKSB7CisJcjAsIGUgOj0gU3lzY2FsbEVycnN0 cihTWVNfU0xFRVAsIHVpbnRwdHIobWlsbGlzZWNzKSwgMCwgMCkKKworCWVyciA9IG5pbAorCWlm IGludChyMCkgPT0gLTEgeworCQllcnIgPSBOZXdFcnJvcihlKQorCX0KKwlyZXR1cm4KK30KKy8v IFRISVMgRklMRSBJUyBHRU5FUkFURUQgQlkgVEhFIENPTU1BTkQgQVQgVEhFIFRPUCBETyBOT1Qg RURJVAorCisKK2Z1bmMgYXdhaXQocyBbXWJ5dGUpIChuIGludCwgZXJyIEVycm9yKSB7CisJdmFy IF9wMCB1bnNhZmUuUG9pbnRlcgorCWlmIGxlbihzKSA+IDAgeworCQlfcDAgPSB1bnNhZmUuUG9p bnRlcigmc1swXSkKKwl9CisJcjAsIGUgOj0gU3lzY2FsbEVycnN0cihTWVNfQVdBSVQsIHVpbnRw dHIoX3AwKSwgdWludHB0cihsZW4ocykpLCAwKQorCisJbiA9IGludChyMCkKKwllcnIgPSBuaWwK KwlpZiBpbnQocjApID09IC0xIHsKKwkJZXJyID0gTmV3RXJyb3IoZSkKKwl9CisJcmV0dXJuCit9 CisvLyBUSElTIEZJTEUgSVMgR0VORVJBVEVEIEJZIFRIRSBDT01NQU5EIEFUIFRIRSBUT1AgRE8g Tk9UIEVESVQKKworCitmdW5jIER1cChvbGRmZCBpbnQsIG5ld2ZkIGludCkgKGZkIGludCwgZXJy IEVycm9yKSB7CisJcjAsIGUgOj0gU3lzY2FsbEVycnN0cihTWVNfRFVQLCB1aW50cHRyKG9sZGZk KSwgdWludHB0cihuZXdmZCksIDApCisKKwlmZCA9IGludChyMCkKKwllcnIgPSBuaWwKKwlpZiBp bnQocjApID09IC0xIHsKKwkJZXJyID0gTmV3RXJyb3IoZSkKKwl9CisJcmV0dXJuCit9CisvLyBU SElTIEZJTEUgSVMgR0VORVJBVEVEIEJZIFRIRSBDT01NQU5EIEFUIFRIRSBUT1AgRE8gTk9UIEVE SVQKKworCitmdW5jIE9wZW4ocGF0aCBzdHJpbmcsIG1vZGUgaW50KSAoZmQgaW50LCBlcnIgRXJy b3IpIHsKKwlyMCwgZSA6PSBTeXNjYWxsRXJyc3RyKFNZU19PUEVOLCB1aW50cHRyKHVuc2FmZS5Q b2ludGVyKFN0cmluZ0J5dGVQdHIocGF0aCkpKSwgdWludHB0cihtb2RlKSwgMCkKKworCWZkID0g aW50KHIwKQorCWVyciA9IG5pbAorCWlmIGludChyMCkgPT0gLTEgeworCQllcnIgPSBOZXdFcnJv cihlKQorCX0KKwlyZXR1cm4KK30KKy8vIFRISVMgRklMRSBJUyBHRU5FUkFURUQgQlkgVEhFIENP TU1BTkQgQVQgVEhFIFRPUCBETyBOT1QgRURJVAorCisKK2Z1bmMgQ3JlYXRlKHBhdGggc3RyaW5n LCBtb2RlIGludCwgcGVybSB1aW50MzIpIChmZCBpbnQsIGVyciBFcnJvcikgeworCXIwLCBlIDo9 IFN5c2NhbGxFcnJzdHIoU1lTX0NSRUFURSwgdWludHB0cih1bnNhZmUuUG9pbnRlcihTdHJpbmdC eXRlUHRyKHBhdGgpKSksIHVpbnRwdHIobW9kZSksIHVpbnRwdHIocGVybSkpCisKKwlmZCA9IGlu dChyMCkKKwllcnIgPSBuaWwKKwlpZiBpbnQocjApID09IC0xIHsKKwkJZXJyID0gTmV3RXJyb3Io ZSkKKwl9CisJcmV0dXJuCit9CisvLyBUSElTIEZJTEUgSVMgR0VORVJBVEVEIEJZIFRIRSBDT01N QU5EIEFUIFRIRSBUT1AgRE8gTk9UIEVESVQKKworCitmdW5jIFJlbW92ZShwYXRoIHN0cmluZykg KGVyciBFcnJvcikgeworCXIwLCBlIDo9IFN5c2NhbGxFcnJzdHIoU1lTX1JFTU9WRSwgdWludHB0 cih1bnNhZmUuUG9pbnRlcihTdHJpbmdCeXRlUHRyKHBhdGgpKSksIDAsIDApCisKKwllcnIgPSBu aWwKKwlpZiBpbnQocjApID09IC0xIHsKKwkJZXJyID0gTmV3RXJyb3IoZSkKKwl9CisJcmV0dXJu Cit9CisvLyBUSElTIEZJTEUgSVMgR0VORVJBVEVEIEJZIFRIRSBDT01NQU5EIEFUIFRIRSBUT1Ag RE8gTk9UIEVESVQKKworCitmdW5jIFByZWFkKGZkIGludCwgcCBbXWJ5dGUsIG9mZnNldCBpbnQ2 NCkgKG4gaW50LCBlcnIgRXJyb3IpIHsKKwl2YXIgX3AwIHVuc2FmZS5Qb2ludGVyCisJaWYgbGVu KHApID4gMCB7CisJCV9wMCA9IHVuc2FmZS5Qb2ludGVyKCZwWzBdKQorCX0KKwlyMCwgZSA6PSBT eXNjYWxsRXJyc3RyNihTWVNfUFJFQUQsIHVpbnRwdHIoZmQpLCB1aW50cHRyKF9wMCksIHVpbnRw dHIobGVuKHApKSwgdWludHB0cihvZmZzZXQpLCB1aW50cHRyKG9mZnNldD4+MzIpLCAwKQorCisJ biA9IGludChyMCkKKwllcnIgPSBuaWwKKwlpZiBpbnQocjApID09IC0xIHsKKwkJZXJyID0gTmV3 RXJyb3IoZSkKKwl9CisJcmV0dXJuCit9CisvLyBUSElTIEZJTEUgSVMgR0VORVJBVEVEIEJZIFRI RSBDT01NQU5EIEFUIFRIRSBUT1AgRE8gTk9UIEVESVQKKworCitmdW5jIFB3cml0ZShmZCBpbnQs IHAgW11ieXRlLCBvZmZzZXQgaW50NjQpIChuIGludCwgZXJyIEVycm9yKSB7CisJdmFyIF9wMCB1 bnNhZmUuUG9pbnRlcgorCWlmIGxlbihwKSA+IDAgeworCQlfcDAgPSB1bnNhZmUuUG9pbnRlcigm cFswXSkKKwl9CisJcjAsIGUgOj0gU3lzY2FsbEVycnN0cjYoU1lTX1BXUklURSwgdWludHB0cihm ZCksIHVpbnRwdHIoX3AwKSwgdWludHB0cihsZW4ocCkpLCB1aW50cHRyKG9mZnNldCksIHVpbnRw dHIob2Zmc2V0Pj4zMiksIDApCisKKwluID0gaW50KHIwKQorCWVyciA9IG5pbAorCWlmIGludChy MCkgPT0gLTEgeworCQllcnIgPSBOZXdFcnJvcihlKQorCX0KKwlyZXR1cm4KK30KKy8vIFRISVMg RklMRSBJUyBHRU5FUkFURUQgQlkgVEhFIENPTU1BTkQgQVQgVEhFIFRPUCBETyBOT1QgRURJVAor CisKK2Z1bmMgQ2xvc2UoZmQgaW50KSAoZXJyIEVycm9yKSB7CisJcjAsIGUgOj0gU3lzY2FsbEVy cnN0cihTWVNfQ0xPU0UsIHVpbnRwdHIoZmQpLCAwLCAwKQorCisJZXJyID0gbmlsCisJaWYgaW50 KHIwKSA9PSAtMSB7CisJCWVyciA9IE5ld0Vycm9yKGUpCisJfQorCXJldHVybgorfQorLy8gVEhJ UyBGSUxFIElTIEdFTkVSQVRFRCBCWSBUSEUgQ09NTUFORCBBVCBUSEUgVE9QIERPIE5PVCBFRElU CisKKworZnVuYyBDaGRpcihwYXRoIHN0cmluZykgKGVyciBFcnJvcikgeworCXIwLCBlIDo9IFN5 c2NhbGxFcnJzdHIoU1lTX0NIRElSLCB1aW50cHRyKHVuc2FmZS5Qb2ludGVyKFN0cmluZ0J5dGVQ dHIocGF0aCkpKSwgMCwgMCkKKworCWVyciA9IG5pbAorCWlmIGludChyMCkgPT0gLTEgeworCQll cnIgPSBOZXdFcnJvcihlKQorCX0KKwlyZXR1cm4KK30KKy8vIFRISVMgRklMRSBJUyBHRU5FUkFU RUQgQlkgVEhFIENPTU1BTkQgQVQgVEhFIFRPUCBETyBOT1QgRURJVAorCisKK2Z1bmMgQmluZChu YW1lLCBvbGQgc3RyaW5nLCBmbGFnIGludCkgKGVyciBFcnJvcikgeworCXIwLCBlIDo9IFN5c2Nh bGxFcnJzdHIoU1lTX0JJTkQsIHVpbnRwdHIodW5zYWZlLlBvaW50ZXIoU3RyaW5nQnl0ZVB0cihu YW1lKSkpLCB1aW50cHRyKHVuc2FmZS5Qb2ludGVyKFN0cmluZ0J5dGVQdHIob2xkKSkpLCB1aW50 cHRyKGZsYWcpKQorCisJZXJyID0gbmlsCisJaWYgaW50KHIwKSA9PSAtMSB7CisJCWVyciA9IE5l d0Vycm9yKGUpCisJfQorCXJldHVybgorfQorLy8gVEhJUyBGSUxFIElTIEdFTkVSQVRFRCBCWSBU SEUgQ09NTUFORCBBVCBUSEUgVE9QIERPIE5PVCBFRElUCisKKworZnVuYyBNb3VudChmZCwgYWZk IGludCwgb2xkIHN0cmluZywgZmxhZyBpbnQsIGFuYW1lIHN0cmluZykgKGVyciBFcnJvcikgewor CXIwLCBlIDo9IFN5c2NhbGxFcnJzdHI2KFNZU19NT1VOVCwgdWludHB0cihmZCksIHVpbnRwdHIo YWZkKSwgdWludHB0cih1bnNhZmUuUG9pbnRlcihTdHJpbmdCeXRlUHRyKG9sZCkpKSwgdWludHB0 cihmbGFnKSwgdWludHB0cih1bnNhZmUuUG9pbnRlcihTdHJpbmdCeXRlUHRyKGFuYW1lKSkpLCAw KQorCisJZXJyID0gbmlsCisJaWYgaW50KHIwKSA9PSAtMSB7CisJCWVyciA9IE5ld0Vycm9yKGUp CisJfQorCXJldHVybgorfQorLy8gVEhJUyBGSUxFIElTIEdFTkVSQVRFRCBCWSBUSEUgQ09NTUFO RCBBVCBUSEUgVE9QIERPIE5PVCBFRElUCisKKworZnVuYyBVbm1vdW50KG5hbWUsIG9sZCBzdHJp bmcpIChlcnIgRXJyb3IpIHsKKwlyMCwgZSA6PSBTeXNjYWxsRXJyc3RyKFNZU19VTk1PVU5ULCB1 aW50cHRyKHVuc2FmZS5Qb2ludGVyKFN0cmluZ0J5dGVQdHIobmFtZSkpKSwgdWludHB0cih1bnNh ZmUuUG9pbnRlcihTdHJpbmdCeXRlUHRyKG9sZCkpKSwgMCkKKworCWVyciA9IG5pbAorCWlmIGlu dChyMCkgPT0gLTEgeworCQllcnIgPSBOZXdFcnJvcihlKQorCX0KKwlyZXR1cm4KK30KKy8vIFRI SVMgRklMRSBJUyBHRU5FUkFURUQgQlkgVEhFIENPTU1BTkQgQVQgVEhFIFRPUCBETyBOT1QgRURJ VAorCisKK2Z1bmMgU3RhdChwYXRoIHN0cmluZywgZWRpciBbXWJ5dGUpIChuIGludCwgZXJyIEVy cm9yKSB7CisJdmFyIF9wMCB1bnNhZmUuUG9pbnRlcgorCWlmIGxlbihlZGlyKSA+IDAgeworCQlf cDAgPSB1bnNhZmUuUG9pbnRlcigmZWRpclswXSkKKwl9CisJcjAsIGUgOj0gU3lzY2FsbEVycnN0 cihTWVNfU1RBVCwgdWludHB0cih1bnNhZmUuUG9pbnRlcihTdHJpbmdCeXRlUHRyKHBhdGgpKSks IHVpbnRwdHIoX3AwKSwgdWludHB0cihsZW4oZWRpcikpKQorCisJbiA9IGludChyMCkKKwllcnIg PSBuaWwKKwlpZiBpbnQocjApID09IC0xIHsKKwkJZXJyID0gTmV3RXJyb3IoZSkKKwl9CisJcmV0 dXJuCit9CisvLyBUSElTIEZJTEUgSVMgR0VORVJBVEVEIEJZIFRIRSBDT01NQU5EIEFUIFRIRSBU T1AgRE8gTk9UIEVESVQKKworCitmdW5jIEZzdGF0KGZkIGludCwgZWRpciBbXWJ5dGUpIChuIGlu dCwgZXJyIEVycm9yKSB7CisJdmFyIF9wMCB1bnNhZmUuUG9pbnRlcgorCWlmIGxlbihlZGlyKSA+ IDAgeworCQlfcDAgPSB1bnNhZmUuUG9pbnRlcigmZWRpclswXSkKKwl9CisJcjAsIGUgOj0gU3lz Y2FsbEVycnN0cihTWVNfRlNUQVQsIHVpbnRwdHIoZmQpLCB1aW50cHRyKF9wMCksIHVpbnRwdHIo bGVuKGVkaXIpKSkKKworCW4gPSBpbnQocjApCisJZXJyID0gbmlsCisJaWYgaW50KHIwKSA9PSAt MSB7CisJCWVyciA9IE5ld0Vycm9yKGUpCisJfQorCXJldHVybgorfQorLy8gVEhJUyBGSUxFIElT IEdFTkVSQVRFRCBCWSBUSEUgQ09NTUFORCBBVCBUSEUgVE9QIERPIE5PVCBFRElUCisKKworZnVu YyBXc3RhdChwYXRoIHN0cmluZywgZWRpciBbXWJ5dGUpIChlcnIgRXJyb3IpIHsKKwl2YXIgX3Aw IHVuc2FmZS5Qb2ludGVyCisJaWYgbGVuKGVkaXIpID4gMCB7CisJCV9wMCA9IHVuc2FmZS5Qb2lu dGVyKCZlZGlyWzBdKQorCX0KKwlyMCwgZSA6PSBTeXNjYWxsRXJyc3RyKFNZU19XU1RBVCwgdWlu dHB0cih1bnNhZmUuUG9pbnRlcihTdHJpbmdCeXRlUHRyKHBhdGgpKSksIHVpbnRwdHIoX3AwKSwg dWludHB0cihsZW4oZWRpcikpKQorCisJZXJyID0gbmlsCisJaWYgaW50KHIwKSA9PSAtMSB7CisJ CWVyciA9IE5ld0Vycm9yKGUpCisJfQorCXJldHVybgorfQorLy8gVEhJUyBGSUxFIElTIEdFTkVS QVRFRCBCWSBUSEUgQ09NTUFORCBBVCBUSEUgVE9QIERPIE5PVCBFRElUCisKKworZnVuYyBGd3N0 YXQoZmQgaW50LCBlZGlyIFtdYnl0ZSkgKGVyciBFcnJvcikgeworCXZhciBfcDAgdW5zYWZlLlBv aW50ZXIKKwlpZiBsZW4oZWRpcikgPiAwIHsKKwkJX3AwID0gdW5zYWZlLlBvaW50ZXIoJmVkaXJb MF0pCisJfQorCXIwLCBlIDo9IFN5c2NhbGxFcnJzdHIoU1lTX0ZXU1RBVCwgdWludHB0cihmZCks IHVpbnRwdHIoX3AwKSwgdWludHB0cihsZW4oZWRpcikpKQorCisJZXJyID0gbmlsCisJaWYgaW50 KHIwKSA9PSAtMSB7CisJCWVyciA9IE5ld0Vycm9yKGUpCisJfQorCXJldHVybgorfQpkaWZmIC1y IDA5YWI4NjVkODc1YyBzcmMvcGtnL3N5c2NhbGwvenN5c251bV9wbGFuOV8zODYuZ28KLS0tIC9k ZXYvbnVsbAlUaHUgSmFuIDAxIDAwOjAwOjAwIDE5NzAgKzAwMDAKKysrIGIvc3JjL3BrZy9zeXNj YWxsL3pzeXNudW1fcGxhbjlfMzg2LmdvCVNhdCBKYW4gMTUgMTM6MDA6MTMgMjAxMSArMDIwMApA QCAtMCwwICsxLDQ3IEBACisvLyBta3N5c251bV9wbGFuOS5zaCAvbWVkaWEvc3lzL3NyYy9saWJj LzlzeXNjYWxsL3N5cy5oCisvLyBNQUNISU5FIEdFTkVSQVRFRCBCWSBUSEUgQUJPVkUgQ09NTUFO RDsgRE8gTk9UIEVESVQKKworcGFja2FnZSBzeXNjYWxsCisKK2NvbnN0ICgKKwlTWVNfU1lTUjEg ICAgICA9IDAKKwlTWVNfQklORCAgICAgICA9IDIKKwlTWVNfQ0hESVIgICAgICA9IDMKKwlTWVNf Q0xPU0UgICAgICA9IDQKKwlTWVNfRFVQICAgICAgICA9IDUKKwlTWVNfQUxBUk0gICAgICA9IDYK KwlTWVNfRVhFQyAgICAgICA9IDcKKwlTWVNfRVhJVFMgICAgICA9IDgKKwlTWVNfRkFVVEggICAg ICA9IDEwCisJU1lTX1NFR0JSSyAgICAgPSAxMgorCVNZU19PUEVOICAgICAgID0gMTQKKwlTWVNf T1NFRUsgICAgICA9IDE2CisJU1lTX1NMRUVQICAgICAgPSAxNworCVNZU19SRk9SSyAgICAgID0g MTkKKwlTWVNfUElQRSAgICAgICA9IDIxCisJU1lTX0NSRUFURSAgICAgPSAyMgorCVNZU19GRDJQ QVRIICAgID0gMjMKKwlTWVNfQlJLXyAgICAgICA9IDI0CisJU1lTX1JFTU9WRSAgICAgPSAyNQor CVNZU19OT1RJRlkgICAgID0gMjgKKwlTWVNfTk9URUQgICAgICA9IDI5CisJU1lTX1NFR0FUVEFD SCAgPSAzMAorCVNZU19TRUdERVRBQ0ggID0gMzEKKwlTWVNfU0VHRlJFRSAgICA9IDMyCisJU1lT X1NFR0ZMVVNIICAgPSAzMworCVNZU19SRU5ERVpWT1VTID0gMzQKKwlTWVNfVU5NT1VOVCAgICA9 IDM1CisJU1lTX1NFTUFDUVVJUkUgPSAzNworCVNZU19TRU1SRUxFQVNFID0gMzgKKwlTWVNfU0VF SyAgICAgICA9IDM5CisJU1lTX0ZWRVJTSU9OICAgPSA0MAorCVNZU19FUlJTVFIgICAgID0gNDEK KwlTWVNfU1RBVCAgICAgICA9IDQyCisJU1lTX0ZTVEFUICAgICAgPSA0MworCVNZU19XU1RBVCAg ICAgID0gNDQKKwlTWVNfRldTVEFUICAgICA9IDQ1CisJU1lTX01PVU5UICAgICAgPSA0NgorCVNZ U19BV0FJVCAgICAgID0gNDcKKwlTWVNfUFJFQUQgICAgICA9IDUwCisJU1lTX1BXUklURSAgICAg PSA1MQorKQpkaWZmIC1yIDA5YWI4NjVkODc1YyBzcmMvcGtnL3N5c2NhbGwvenR5cGVzX3BsYW45 XzM4Ni5nbwotLS0gL2Rldi9udWxsCVRodSBKYW4gMDEgMDA6MDA6MDAgMTk3MCArMDAwMAorKysg Yi9zcmMvcGtnL3N5c2NhbGwvenR5cGVzX3BsYW45XzM4Ni5nbwlTYXQgSmFuIDE1IDEzOjAwOjEz IDIwMTEgKzAyMDAKQEAgLTAsMCArMSw3NCBAQAorLy8gZ29kZWZzIC1nc3lzY2FsbCAtZiAtbTMy IHR5cGVzX3BsYW45LmMKKworLy8gTUFDSElORSBHRU5FUkFURUQgLSBETyBOT1QgRURJVC4KKwor cGFja2FnZSBzeXNjYWxsCisKKy8vIENvbnN0YW50cworY29uc3QgKAorCU9fUkRPTkxZICAgPSAw CisJT19XUk9OTFkgICA9IDB4MQorCU9fUkRXUiAgICAgPSAweDIKKwlPX0NMT0VYRUMgID0gMHgy MAorCU9fRVhDTCAgICAgPSAweDEwMDAKKwlTVEFUTUFYICAgID0gMHhmZmZmCisJRVJSTUFYICAg ICA9IDB4ODAKKwlNT1JERVIgICAgID0gMHgzCisJTVJFUEwgICAgICA9IDAKKwlNQkVGT1JFICAg ID0gMHgxCisJTUFGVEVSICAgICA9IDB4MgorCU1DUkVBVEUgICAgPSAweDQKKwlNQ0FDSEUgICAg ID0gMHgxMAorCU1NQVNLICAgICAgPSAweDE3CisJUkZOQU1FRyAgICA9IDB4MQorCVJGRU5WRyAg ICAgPSAweDIKKwlSRkZERyAgICAgID0gMHg0CisJUkZOT1RFRyAgICA9IDB4OAorCVJGUFJPQyAg ICAgPSAweDEwCisJUkZNRU0gICAgICA9IDB4MjAKKwlSRk5PV0FJVCAgID0gMHg0MAorCVJGQ05B TUVHICAgPSAweDQwMAorCVJGQ0VOVkcgICAgPSAweDgwMAorCVJGQ0ZERyAgICAgPSAweDEwMDAK KwlSRlJFTkQgICAgID0gMHgyMDAwCisJUkZOT01OVCAgICA9IDB4NDAwMAorCVFURElSICAgICAg PSAweDgwCisJUVRBUFBFTkQgICA9IDB4NDAKKwlRVEVYQ0wgICAgID0gMHgyMAorCVFUTU9VTlQg ICAgPSAweDEwCisJUVRBVVRIICAgICA9IDB4OAorCVFUVE1QICAgICAgPSAweDQKKwlRVEZJTEUg ICAgID0gMAorCURNRElSICAgICAgPSAweDgwMDAwMDAwCisJRE1BUFBFTkQgICA9IDB4NDAwMDAw MDAKKwlETUVYQ0wgICAgID0gMHgyMDAwMDAwMAorCURNTU9VTlQgICAgPSAweDEwMDAwMDAwCisJ RE1BVVRIICAgICA9IDB4ODAwMDAwMAorCURNVE1QICAgICAgPSAweDQwMDAwMDAKKwlETVJFQUQg ICAgID0gMHg0CisJRE1XUklURSAgICA9IDB4MgorCURNRVhFQyAgICAgPSAweDEKKwlTVEFURklY TEVOID0gMHgzMQorKQorCisvLyBUeXBlcworCit0eXBlIF9DX2ludCBpbnQzMgorCit0eXBlIFBy b2Ygc3RydWN0IHsKKwlQcCAgICAqWzBdYnl0ZSAvKiBzUGxpbmsgKi8KKwlOZXh0ICAqWzBdYnl0 ZSAvKiBzUGxpbmsgKi8KKwlMYXN0ICAqWzBdYnl0ZSAvKiBzUGxpbmsgKi8KKwlGaXJzdCAqWzBd Ynl0ZSAvKiBzUGxpbmsgKi8KKwlQaWQgICB1aW50MzIKKwlXaGF0ICB1aW50MzIKK30KKwordHlw ZSBUb3Mgc3RydWN0IHsKKwlQcm9mICAgICAgUHJvZgorCUN5Y2xlZnJlcSB1aW50NjQKKwlLY3lj bGVzICAgaW50NjQKKwlQY3ljbGVzICAgaW50NjQKKwlQaWQgICAgICAgdWludDMyCisJQ2xvY2sg ICAgIHVpbnQzMgorfQo= --0016e6584246b726f30499e0cd7d--