Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:47561 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 61233 invoked from network); 24 Mar 2010 15:01:26 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 24 Mar 2010 15:01:26 -0000 Authentication-Results: pb1.pair.com smtp.mail=martin@divbyzero.net; spf=permerror; sender-id=unknown Authentication-Results: pb1.pair.com header.from=martin@divbyzero.net; sender-id=unknown Received-SPF: error (pb1.pair.com: domain divbyzero.net from 87.230.111.147 cause and error) X-PHP-List-Original-Sender: martin@divbyzero.net X-Host-Fingerprint: 87.230.111.147 mx.bauer-kirch.de Linux 2.6 Received: from [87.230.111.147] ([87.230.111.147:50097] helo=mx.bauer-kirch.de) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id E8/B5-33174-3492AAB4 for ; Wed, 24 Mar 2010 10:01:25 -0500 Received: by mx.bauer-kirch.de with ESMTP id 1NuS5A-0005Ed-P0 for ; Wed, 24 Mar 2010 16:01:21 +0100 Message-ID: <4BAA293F.8020207@divbyzero.net> Date: Wed, 24 Mar 2010 16:01:19 +0100 User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.1.8) Gecko/20100227 Thunderbird/3.0.3 MIME-Version: 1.0 To: internals@lists.php.net Content-Type: multipart/mixed; boundary="------------060700090708000703010800" Subject: Support for Jenkins's one-at-a-time hashing function From: martin@divbyzero.net (Martin Jansen) --------------060700090708000703010800 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Inspired by the recent addition of FNV hashing, I had a look at how hard it would be to add support for Jenkins's one-at-a-time hashing to ext/hash. The result is attached to this mail. I don't think I have karma for php-src, so given enough interest feel free to commit the patch. - Martin --------------060700090708000703010800 Content-Type: text/plain; x-mac-type="0"; x-mac-creator="0"; name="hash-joaat.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="hash-joaat.patch" SW5kZXg6IHBocF9oYXNoLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcGhwX2hhc2guaAkocmV2aXNp b24gMjk2NzA3KQorKysgcGhwX2hhc2guaAkod29ya2luZyBjb3B5KQpAQCAtODIsNiArODIs NyBAQAogZXh0ZXJuIGNvbnN0IHBocF9oYXNoX29wcyBwaHBfaGFzaF9zYWxzYTIwX29wczsK IGV4dGVybiBjb25zdCBwaHBfaGFzaF9vcHMgcGhwX2hhc2hfZm52MTMyX29wczsKIGV4dGVy biBjb25zdCBwaHBfaGFzaF9vcHMgcGhwX2hhc2hfZm52MTY0X29wczsKK2V4dGVybiBjb25z dCBwaHBfaGFzaF9vcHMgcGhwX2hhc2hfam9hYXRfb3BzOwogCiAjZGVmaW5lIFBIUF9IQVNI X0hBVkFMX09QUyhwLGIpCWV4dGVybiBjb25zdCBwaHBfaGFzaF9vcHMgcGhwX2hhc2hfIyNw IyNoYXZhbCMjYiMjX29wczsKIApJbmRleDogcGhwX2hhc2hfam9hYXQuaAo9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09Ci0tLSBwaHBfaGFzaF9qb2FhdC5oCShyZXZpc2lvbiAwKQorKysgcGhwX2hhc2hfam9h YXQuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAgKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0rCisgIHwgUEhQIFZlcnNpb24gNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICArLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAg fCBDb3B5cmlnaHQgKGMpIDE5OTctMjAxMCBUaGUgUEhQIEdyb3VwICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8CisgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICB8IFRoaXMgc291 cmNlIGZpbGUgaXMgc3ViamVjdCB0byB2ZXJzaW9uIDMuMDEgb2YgdGhlIFBIUCBsaWNlbnNl LCAgICAgIHwKKyAgfCB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhl IGZpbGUgTElDRU5TRSwgYW5kIGlzICAgICAgICB8CisgIHwgYXZhaWxhYmxlIHRocm91Z2gg dGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoZSBmb2xsb3dpbmcgdXJsOiAgICAgICAgICAgfAor ICB8IGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMDEudHh0ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwKKyAgfCBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29w eSBvZiB0aGUgUEhQIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG8gICB8CisgIHwgb2J0YWlu IGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhIG5vdGUgdG8g ICAgICAgICAgfAorICB8IGxpY2Vuc2VAcGhwLm5ldCBzbyB3ZSBjYW4gbWFpbCB5b3UgYSBj b3B5IGltbWVkaWF0ZWx5LiAgICAgICAgICAgICAgIHwKKyAgKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0r CisgIHwgQXV0aG9yOiBNYXJ0aW4gSmFuc2VuIDxtakBwaHAubmV0PiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAKKyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisqLworCisv KiAkSWQqLworCisjaWZuZGVmIFBIUF9IQVNIX0pPQUFUX0gKKyNkZWZpbmUgUEhQX0hBU0hf Sk9BQVRfSAorCit0eXBlZGVmIHN0cnVjdCB7CisJcGhwX2hhc2hfdWludDMyIHN0YXRlOwor fSBQSFBfSk9BQVRfQ1RYOworCitQSFBfSEFTSF9BUEkgdm9pZCBQSFBfSk9BQVRJbml0KFBI UF9KT0FBVF9DVFggKmNvbnRleHQpOworUEhQX0hBU0hfQVBJIHZvaWQgUEhQX0pPQUFUVXBk YXRlKFBIUF9KT0FBVF9DVFggKmNvbnRleHQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlucHV0 LCB1bnNpZ25lZCBpbnQgaW5wdXRMZW4pOworUEhQX0hBU0hfQVBJIHZvaWQgUEhQX0pPQUFU RmluYWwodW5zaWduZWQgY2hhciBkaWdlc3RbMTZdLCBQSFBfSk9BQVRfQ1RYICogY29udGV4 dCk7CisKK3N0YXRpYyBwaHBfaGFzaF91aW50MzIgam9hYXRfYnVmKHZvaWQgKmJ1Ziwgc2l6 ZV90IGxlbik7CisKKyNlbmRpZgorCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogdGFi LXdpZHRoOiA0CisgKiBjLWJhc2ljLW9mZnNldDogNAorICogRW5kOgorICogdmltNjAwOiBu b2V0IHN3PTQgdHM9NCBmZG09bWFya2VyCisgKiB2aW08NjAwOiBub2V0IHN3PTQgdHM9NAor ICovCkluZGV4OiB0ZXN0cy9oYXNoX2FsZ29zLnBocHQKPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gdGVz dHMvaGFzaF9hbGdvcy5waHB0CShyZXZpc2lvbiAyOTY3MDcpCisrKyB0ZXN0cy9oYXNoX2Fs Z29zLnBocHQJKHdvcmtpbmcgY29weSkKQEAgLTE4LDcgKzE4LDcgQEAKID09PURvbmU9PT0K IC0tRVhQRUNURi0tCiAqKiogVGVzdGluZyBoYXNoX2FsZ29zKCkgOiBiYXNpYyBmdW5jdGlv bmFsaXR5ICoqKgotYXJyYXkoNDIpIHsKK2FycmF5KDQ1KSB7CiAgIFswXT0+CiAgIHN0cmlu ZygzKSAibWQyIgogICBbMV09PgpAQCAtNzQsMzQgKzc0LDQwIEBACiAgIFsyNl09PgogICBz dHJpbmcoNykgInNhbHNhMjAiCiAgIFsyN109PgorICBzdHJpbmcoNikgImZudjEzMiIKKyAg WzI4XT0+CisgIHN0cmluZyg2KSAiZm52MTY0IgorICBbMjldPT4KKyAgc3RyaW5nKDUpICJq b2FhdCIKKyAgWzMwXT0+CiAgIHN0cmluZygxMCkgImhhdmFsMTI4LDMiCi0gIFsyOF09Pgor ICBbMzFdPT4KICAgc3RyaW5nKDEwKSAiaGF2YWwxNjAsMyIKLSAgWzI5XT0+CisgIFszMl09 PgogICBzdHJpbmcoMTApICJoYXZhbDE5MiwzIgotICBbMzBdPT4KKyAgWzMzXT0+CiAgIHN0 cmluZygxMCkgImhhdmFsMjI0LDMiCi0gIFszMV09PgorICBbMzRdPT4KICAgc3RyaW5nKDEw KSAiaGF2YWwyNTYsMyIKLSAgWzMyXT0+CisgIFszNV09PgogICBzdHJpbmcoMTApICJoYXZh bDEyOCw0IgotICBbMzNdPT4KKyAgWzM2XT0+CiAgIHN0cmluZygxMCkgImhhdmFsMTYwLDQi Ci0gIFszNF09PgorICBbMzddPT4KICAgc3RyaW5nKDEwKSAiaGF2YWwxOTIsNCIKLSAgWzM1 XT0+CisgIFszOF09PgogICBzdHJpbmcoMTApICJoYXZhbDIyNCw0IgotICBbMzZdPT4KKyAg WzM5XT0+CiAgIHN0cmluZygxMCkgImhhdmFsMjU2LDQiCi0gIFszN109PgorICBbNDBdPT4K ICAgc3RyaW5nKDEwKSAiaGF2YWwxMjgsNSIKLSAgWzM4XT0+CisgIFs0MV09PgogICBzdHJp bmcoMTApICJoYXZhbDE2MCw1IgotICBbMzldPT4KKyAgWzQyXT0+CiAgIHN0cmluZygxMCkg ImhhdmFsMTkyLDUiCi0gIFs0MF09PgorICBbNDNdPT4KICAgc3RyaW5nKDEwKSAiaGF2YWwy MjQsNSIKLSAgWzQxXT0+CisgIFs0NF09PgogICBzdHJpbmcoMTApICJoYXZhbDI1Niw1Igog fQogPT09RG9uZT09PQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKSW5kZXg6IHRlc3Rz L2pvYWF0LnBocHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gdGVzdHMvam9hYXQucGhwdAkocmV2aXNp b24gMCkKKysrIHRlc3RzL2pvYWF0LnBocHQJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMzQg QEAKKy0tVEVTVC0tCitKZW5raW5zJ3Mgb25lLWF0LWEtdGltZQorLS1TS0lQSUYtLQorPD9w aHAgZXh0ZW5zaW9uX2xvYWRlZCgnaGFzaCcpIG9yIGRpZSAoJ1NraXAgLSBoYXNoIGV4dGVu c2lvbiBub3QgYXZhaWxhYmxlJyk7ID8+CistLUZJTEUtLQorPD9waHAKKyR0ZXN0cyA9IGFy cmF5KAorCWFycmF5KCJoZWxsbyB3b3JsZCIsICIzZTRhNWE1NyIpLAorCWFycmF5KCIiLCAw KSwKKwlhcnJheSgiIiwgIjAwMDAwMCIpLAorCWFycmF5KCJhIiwgImNhMmU5NDQyIiksCisJ YXJyYXkoImFhIiwgIjcwODE3MzhlIiksCispOworCiskaSA9IDA7CiskcGFzcyA9IHRydWU7 CisKK2ZvcmVhY2ggKCR0ZXN0cyBhcyAkdGVzdCkgeworCSsrJGk7CisJCisJJHJlc3VsdCA9 IGhhc2goImpvYWF0IiwgJHRlc3RbMF0pOworCWlmICgkcmVzdWx0ICE9ICR0ZXN0WzFdKSB7 CisJCWVjaG8gIkl0ZXJhdGlvbiAiIC4gJGkgLiAiIGZhaWxlZCAtIGV4cGVjdGVkICciIC4g JHRlc3RbMV0gLiAiJywgZ290ICciIC4gJHJlc3VsdCAuICInIGZvciAnIiAuICR0ZXN0WzFd IC4gIidcbiI7CisKKwkJJHBhc3MgPSBmYWxzZTsKKwl9Cit9CisKK2lmKCRwYXNzKSB7Cisg ICAgZWNobyAiUEFTUyI7Cit9Cis/PgorLS1FWFBFQ1QtLQorUEFTUwpJbmRleDogaGFzaC5j Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0KLS0tIGhhc2guYwkocmV2aXNpb24gMjk2NzA3KQorKysgaGFzaC5j CSh3b3JraW5nIGNvcHkpCkBAIC03OSw2ICs3OSw3IEBACiAJeyJGTlYxQTMyIiwgImZudjFh MzIiLCAzMH0sCiAJeyJGTlYxNjQiLCAiZm52MTY0IiwgMzF9LAogCXsiRk5WMUE2NCIsICJm bnYxYTY0IiwgMzJ9LAorCXsiSk9BQVQiLCAiam9hYXQiLCAzM30sCiB9OwogI2VuZGlmCiAK QEAgLTg0Nyw2ICs4NDgsNyBAQAogCXBocF9oYXNoX3JlZ2lzdGVyX2FsZ28oInNhbHNhMjAi LAkJJnBocF9oYXNoX3NhbHNhMjBfb3BzKTsKIAlwaHBfaGFzaF9yZWdpc3Rlcl9hbGdvKCJm bnYxMzIiLAkJJnBocF9oYXNoX2ZudjEzMl9vcHMpOwogCXBocF9oYXNoX3JlZ2lzdGVyX2Fs Z28oImZudjE2NCIsCQkmcGhwX2hhc2hfZm52MTY0X29wcyk7CisJcGhwX2hhc2hfcmVnaXN0 ZXJfYWxnbygiam9hYXQiLAkJCSZwaHBfaGFzaF9qb2FhdF9vcHMpOwogCiAJUEhQX0hBU0hf SEFWQUxfUkVHSVNURVIoMywxMjgpOwogCVBIUF9IQVNIX0hBVkFMX1JFR0lTVEVSKDMsMTYw KTsKSW5kZXg6IGhhc2hfam9hYXQuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBoYXNoX2pvYWF0LmMJ KHJldmlzaW9uIDApCisrKyBoYXNoX2pvYWF0LmMJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs MTAwIEBACisvKgorICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgfCBQSFAgVmVyc2lvbiA1ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 CisgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICB8IENvcHlyaWdodCAoYykgMTk5Ny0yMDEwIFRo ZSBQSFAgR3JvdXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0rCisgIHwgVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHZlcnNp b24gMy4wMSBvZiB0aGUgUEhQIGxpY2Vuc2UsICAgICAgfAorICB8IHRoYXQgaXMgYnVuZGxl ZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLCBhbmQgaXMgICAgICAg IHwKKyAgfCBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhlIGZv bGxvd2luZyB1cmw6ICAgICAgICAgICB8CisgIHwgaHR0cDovL3d3dy5waHAubmV0L2xpY2Vu c2UvM18wMS50eHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICB8IElm IHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBQSFAgbGljZW5zZSBhbmQgYXJl IHVuYWJsZSB0byAgIHwKKyAgfCBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13 ZWIsIHBsZWFzZSBzZW5kIGEgbm90ZSB0byAgICAgICAgICB8CisgIHwgbGljZW5zZUBwaHAu bmV0IHNvIHdlIGNhbiBtYWlsIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuICAgICAgICAgICAg ICAgfAorICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgfCBBdXRob3I6IE1hcnRpbiBKYW5zZW4g PG1qQHBocC5uZXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICst LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tKworKi8KKworLyogJElkJCAqLworCisvKiBJbXBsZW1lbnRzIEpl bmtpbnMncyBvbmUtYXQtYS10aW1lIGhhc2hpbmcgYWxnb3JpdGhtIGFzIHByZXNlbnRlZCBv bgorICogaHR0cDovL3d3dy5idXJ0bGVidXJ0bGUubmV0L2JvYi9oYXNoL2Rvb2JzLmh0bWwu CisgKi8KKworI2luY2x1ZGUgInBocF9oYXNoLmgiCisjaW5jbHVkZSAicGhwX2hhc2hfam9h YXQuaCIKKworY29uc3QgcGhwX2hhc2hfb3BzIHBocF9oYXNoX2pvYWF0X29wcyA9IHsKKwko cGhwX2hhc2hfaW5pdF9mdW5jX3QpIFBIUF9KT0FBVEluaXQsCisJKHBocF9oYXNoX3VwZGF0 ZV9mdW5jX3QpIFBIUF9KT0FBVFVwZGF0ZSwKKwkocGhwX2hhc2hfZmluYWxfZnVuY190KSBQ SFBfSk9BQVRGaW5hbCwKKwkocGhwX2hhc2hfY29weV9mdW5jX3QpIHBocF9oYXNoX2NvcHks CisJNCwKKwk0LAorCXNpemVvZihQSFBfSk9BQVRfQ1RYKQorfTsKKworUEhQX0hBU0hfQVBJ IHZvaWQgUEhQX0pPQUFUSW5pdChQSFBfSk9BQVRfQ1RYICpjb250ZXh0KQoreworCWNvbnRl eHQtPnN0YXRlID0gMDsKK30KKworUEhQX0hBU0hfQVBJIHZvaWQgUEhQX0pPQUFUVXBkYXRl KFBIUF9KT0FBVF9DVFggKmNvbnRleHQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlucHV0LCB1 bnNpZ25lZCBpbnQgaW5wdXRMZW4pCit7CisJY29udGV4dC0+c3RhdGUgPSBqb2FhdF9idWYo KHZvaWQgKilpbnB1dCwgaW5wdXRMZW4pOworfQorCitQSFBfSEFTSF9BUEkgdm9pZCBQSFBf Sk9BQVRGaW5hbCh1bnNpZ25lZCBjaGFyIGRpZ2VzdFs0XSwgUEhQX0pPQUFUX0NUWCAqIGNv bnRleHQpCit7CisjaWZkZWYgV09SRFNfQklHRU5ESUFOCisJbWVtY3B5KGRpZ2VzdCwgJmNv bnRleHQtPnN0YXRlLCA0KTsKKyNlbHNlCisJaW50IGkgPSAwOworCXVuc2lnbmVkIGNoYXIg KmMgPSAodW5zaWduZWQgY2hhciAqKSAmY29udGV4dC0+c3RhdGU7CisKKwlmb3IgKGkgPSAw OyBpIDwgNDsgaSsrKSB7CisJCWRpZ2VzdFtpXSA9IGNbMyAtIGldOworCX0KKyNlbmRpZgor ICAgIGNvbnRleHQtPnN0YXRlID0gMDsKK30KKworLyoKKyAqIGpvYWF0X2J1ZiAtIHBlcmZv cm0gYSBKZW5raW5zJ3Mgb25lLWF0LWEtdGltZSBoYXNoIG9uIGEgYnVmZmVyCisgKgorICog aW5wdXQ6CisgKiAgYnVmIC0gc3RhcnQgb2YgYnVmZmVyIHRvIGhhc2gKKyAqICBsZW4gLSBs ZW5ndGggb2YgYnVmZmVyIGluIG9jdGV0cworICoKKyAqIHJldHVybnM6CisgKiAgMzIgYml0 IGhhc2ggYXMgYSBzdGF0aWMgaGFzaCB0eXBlCisgKi8KK3N0YXRpYyBwaHBfaGFzaF91aW50 MzIKK2pvYWF0X2J1Zih2b2lkICpidWYsIHNpemVfdCBsZW4pCit7CisgICAgcGhwX2hhc2hf dWludDMyIGh2YWw7CisgICAgc2l6ZV90IGk7CisgICAgdW5zaWduZWQgY2hhciAqaW5wdXQg PSAodW5zaWduZWQgY2hhciAqKWJ1ZjsKKyAKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBp KyspIHsKKyAgICAgICAgaHZhbCArPSBpbnB1dFtpXTsKKyAgICAgICAgaHZhbCArPSAoaHZh bCA8PCAxMCk7CisgICAgICAgIGh2YWwgXj0gKGh2YWwgPj4gNik7CisgICAgfQorCisgICAg aHZhbCArPSAoaHZhbCA8PCAzKTsKKyAgICBodmFsIF49IChodmFsID4+IDExKTsKKyAgICBo dmFsICs9IChodmFsIDw8IDE1KTsKKworICAgIHJldHVybiBodmFsOworfQorCisvKgorICog TG9jYWwgdmFyaWFibGVzOgorICogdGFiLXdpZHRoOiA0CisgKiBjLWJhc2ljLW9mZnNldDog NAorICogRW5kOgorICogdmltNjAwOiBub2V0IHN3PTQgdHM9NCBmZG09bWFya2VyCisgKiB2 aW08NjAwOiBub2V0IHN3PTQgdHM9NAorICovCkluZGV4OiBjb25maWcubTQKPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQotLS0gY29uZmlnLm00CShyZXZpc2lvbiAyOTY3MDcpCisrKyBjb25maWcubTQJKHdv cmtpbmcgY29weSkKQEAgLTI3LDExICsyNywxMSBAQAogICAKICAgRVhUX0hBU0hfU09VUkNF Uz0iaGFzaC5jIGhhc2hfbWQuYyBoYXNoX3NoYS5jIGhhc2hfcmlwZW1kLmMgaGFzaF9oYXZh bC5jIFwKICAgICBoYXNoX3RpZ2VyLmMgaGFzaF9nb3N0LmMgaGFzaF9zbmVmcnUuYyBoYXNo X3doaXJscG9vbC5jIGhhc2hfYWRsZXIzMi5jIFwKLSAgICBoYXNoX2NyYzMyLmMgaGFzaF9z YWxzYS5jIGhhc2hfZm52LmMiCisgICAgaGFzaF9jcmMzMi5jIGhhc2hfc2Fsc2EuYyBoYXNo X2Zudi5jIGhhc2hfam9hYXQuYyIKICAgRVhUX0hBU0hfSEVBREVSUz0icGhwX2hhc2guaCBw aHBfaGFzaF9tZC5oIHBocF9oYXNoX3NoYS5oIHBocF9oYXNoX3JpcGVtZC5oIFwKICAgICBw aHBfaGFzaF9oYXZhbC5oIHBocF9oYXNoX3RpZ2VyLmggcGhwX2hhc2hfZ29zdC5oIHBocF9o YXNoX3NuZWZydS5oIFwKICAgICBwaHBfaGFzaF93aGlybHBvb2wuaCBwaHBfaGFzaF9hZGxl cjMyLmggcGhwX2hhc2hfY3JjMzIuaCBwaHBfaGFzaF9zYWxzYS5oIFwKLSAgICBwaHBfaGFz aF9mbnYuaCBwaHBfaGFzaF90eXBlcy5oIgorICAgIHBocF9oYXNoX2Zudi5oIHBocF9oYXNo X2pvYWF0LmggcGhwX2hhc2hfdHlwZXMuaCIKICAgCiAgIFBIUF9ORVdfRVhURU5TSU9OKGhh c2gsICRFWFRfSEFTSF9TT1VSQ0VTLCAkZXh0X3NoYXJlZCkKICAgaWZkZWYoW1BIUF9JTlNU QUxMX0hFQURFUlNdLCBbCg== --------------060700090708000703010800--