From mboxrd@z Thu Jan 1 00:00:00 1970 From: vijay.kilari@gmail.com Subject: [RFC PATCH v1 02/21] x86: NUMA: Refactor NUMA code Date: Thu, 9 Feb 2017 21:26:54 +0530 Message-ID: <1486655834-9708-3-git-send-email-vijay.kilari@gmail.com> References: <1486655834-9708-1-git-send-email-vijay.kilari@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cbr7q-0007oW-E9 for xen-devel@lists.xenproject.org; Thu, 09 Feb 2017 15:59:14 +0000 Received: by mail-pf0-f193.google.com with SMTP id y143so478423pfb.1 for ; Thu, 09 Feb 2017 07:59:12 -0800 (PST) In-Reply-To: <1486655834-9708-1-git-send-email-vijay.kilari@gmail.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: julien.grall@arm.com, sstabellini@kernel.org, andre.przywara@arm.com, dario.faggioli@citrix.com Cc: xen-devel@lists.xenproject.org, Vijaya Kumar K List-Id: xen-devel@lists.xenproject.org RnJvbTogVmlqYXlhIEt1bWFyIEsgPFZpamF5YS5LdW1hckBjYXZpdW0uY29tPgoKTW92ZSBjb21t b24gZ2VuZXJpYyBOVU1BIGNvZGUgdG8geGVuL2NvbW1vbi9udW1hLmMgZnJvbQp4ZW4vYXJjaC94 ODYvbnVtYS5jLiBBbHNvIG1vdmUgZ2VuZXJpYyBjb2RlIGluIGhlYWRlciBmaWxlCnhlbi9pbmNs dWRlL2FzbS14ODYvbnVtYS5oIHRvIHhlbi9pbmNsdWRlL3hlbi9udW1hLmgKClRoaXMgY29tbW9u IGNvZGUgY2FuIGJlIHJlLXVzZWQgbGF0ZXIgZm9yIEFSTS4KClNpZ25lZC1vZmYtYnk6IFZpamF5 YSBLdW1hciBLIDxWaWpheWEuS3VtYXJAY2F2aXVtLmNvbT4KLS0tCiB4ZW4vYXJjaC94ODYvbnVt YS5jICAgICAgICB8IDI5OSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K IHhlbi9jb21tb24vTWFrZWZpbGUgICAgICAgIHwgICAxICsKIHhlbi9jb21tb24vbnVtYS5jICAg ICAgICAgIHwgMzQyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KwogeGVuL2luY2x1ZGUvYXNtLXg4Ni9udW1hLmggfCAgNDcgLS0tLS0tLQogeGVuL2luY2x1ZGUv eGVuL251bWEuaCAgICAgfCAgNTQgKysrKysrKwogNSBmaWxlcyBjaGFuZ2VkLCAzOTcgaW5zZXJ0 aW9ucygrKSwgMzQ2IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3hlbi9hcmNoL3g4Ni9udW1h LmMgYi94ZW4vYXJjaC94ODYvbnVtYS5jCmluZGV4IDZmNGQ0MzguLmJjNzg3ZTAgMTAwNjQ0Ci0t LSBhL3hlbi9hcmNoL3g4Ni9udW1hLmMKKysrIGIveGVuL2FyY2gveDg2L251bWEuYwpAQCAtMjUs MjcgKzI1LDEyIEBAIGN1c3RvbV9wYXJhbSgibnVtYSIsIG51bWFfc2V0dXApOwogI2RlZmluZSBE cHJpbnRrKHguLi4pCiAjZW5kaWYKIAotLyogZnJvbSBwcm90by5oICovCi0jZGVmaW5lIHJvdW5k X3VwKHgseSkgKCgoKHgpKyh5KSktMSkgJiAofigoeSktMSkpKQotCi1zdHJ1Y3Qgbm9kZV9kYXRh IG5vZGVfZGF0YVtNQVhfTlVNTk9ERVNdOwotCi0vKiBNYXBwaW5nIGZyb20gcGR4IHRvIG5vZGUg aWQgKi8KLWludCBtZW1ub2RlX3NoaWZ0Owotc3RhdGljIHR5cGVvZigqbWVtbm9kZW1hcCkgX21l bW5vZGVtYXBbNjRdOwotdW5zaWduZWQgbG9uZyBtZW1ub2RlbWFwc2l6ZTsKLXU4ICptZW1ub2Rl bWFwOwotCi1ub2RlaWRfdCBjcHVfdG9fbm9kZVtOUl9DUFVTXSBfX3JlYWRfbW9zdGx5ID0gewot ICAgIFswIC4uLiBOUl9DUFVTLTFdID0gTlVNQV9OT19OT0RFCi19OwogLyoKICAqIEtlZXAgQklP UydzIENQVTJub2RlIGluZm9ybWF0aW9uLCBzaG91bGQgbm90IGJlIHVzZWQgZm9yIG1lbW9yeSBh bGxvY2Fpb24KICAqLwogbm9kZWlkX3QgYXBpY2lkX3RvX25vZGVbTUFYX0xPQ0FMX0FQSUNdID0g ewogICAgIFswIC4uLiBNQVhfTE9DQUxfQVBJQy0xXSA9IE5VTUFfTk9fTk9ERQogfTsKLWNwdW1h c2tfdCBub2RlX3RvX2NwdW1hc2tbTUFYX05VTU5PREVTXSBfX3JlYWRfbW9zdGx5OwogCiBub2Rl bWFza190IF9fcmVhZF9tb3N0bHkgbm9kZV9vbmxpbmVfbWFwID0geyB7IFswXSA9IDFVTCB9IH07 CiAKQEAgLTU3LDEzNCArNDIsNiBAQCBpbnQgc3JhdF9kaXNhYmxlZCh2b2lkKQogICAgIHJldHVy biBudW1hX29mZiB8fCBhY3BpX251bWEgPCAwOwogfQogCi0vKgotICogR2l2ZW4gYSBzaGlmdCB2 YWx1ZSwgdHJ5IHRvIHBvcHVsYXRlIG1lbW5vZGVtYXBbXQotICogUmV0dXJucyA6Ci0gKiAxIGlm IE9LCi0gKiAwIGlmIG1lbW5vZG1hcFtdIHRvbyBzbWFsbCAob2Ygc2hpZnQgdG9vIHNtYWxsKQot ICogLTEgaWYgbm9kZSBvdmVybGFwIG9yIGxvc3QgcmFtIChzaGlmdCB0b28gYmlnKQotICovCi1z dGF0aWMgaW50IF9faW5pdCBwb3B1bGF0ZV9tZW1ub2RlbWFwKGNvbnN0IHN0cnVjdCBub2RlICpu b2RlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bW5vZGVz LCBpbnQgc2hpZnQsIG5vZGVpZF90ICpub2RlaWRzKQotewotICAgIHVuc2lnbmVkIGxvbmcgc3Bk eCwgZXBkeDsKLSAgICBpbnQgaSwgcmVzID0gLTE7Ci0KLSAgICBtZW1zZXQobWVtbm9kZW1hcCwg TlVNQV9OT19OT0RFLCBtZW1ub2RlbWFwc2l6ZSAqIHNpemVvZigqbWVtbm9kZW1hcCkpOwotICAg IGZvciAoIGkgPSAwOyBpIDwgbnVtbm9kZXM7IGkrKyApCi0gICAgewotICAgICAgICBzcGR4ID0g cGFkZHJfdG9fcGR4KG5vZGVzW2ldLnN0YXJ0KTsKLSAgICAgICAgZXBkeCA9IHBhZGRyX3RvX3Bk eChub2Rlc1tpXS5lbmQgLSAxKSArIDE7Ci0gICAgICAgIGlmICggc3BkeCA+PSBlcGR4ICkKLSAg ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAoIChlcGR4ID4+IHNoaWZ0KSA+PSBtZW1u b2RlbWFwc2l6ZSApCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgZG8gewotICAgICAg ICAgICAgaWYgKCBtZW1ub2RlbWFwW3NwZHggPj4gc2hpZnRdICE9IE5VTUFfTk9fTk9ERSApCi0g ICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgICAgICBpZiAoICFub2RlaWRzICkK LSAgICAgICAgICAgICAgICBtZW1ub2RlbWFwW3NwZHggPj4gc2hpZnRdID0gaTsKLSAgICAgICAg ICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtZW1ub2RlbWFwW3NwZHggPj4gc2hpZnRdID0gbm9k ZWlkc1tpXTsKLQotICAgICAgICAgICAgc3BkeCArPSAoMVVMIDw8IHNoaWZ0KTsKLSAgICAgICAg fSB3aGlsZSAoIHNwZHggPCBlcGR4ICk7Ci0gICAgICAgIHJlcyA9IDE7Ci0gICAgfQotCi0gICAg cmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGludCBfX2luaXQgYWxsb2NhdGVfY2FjaGVhbGlnbmVk X21lbW5vZGVtYXAodm9pZCkKLXsKLSAgICB1bnNpZ25lZCBsb25nIHNpemUgPSBQRk5fVVAobWVt bm9kZW1hcHNpemUgKiBzaXplb2YoKm1lbW5vZGVtYXApKTsKLSAgICB1bnNpZ25lZCBsb25nIG1m biA9IGFsbG9jX2Jvb3RfcGFnZXMoc2l6ZSwgMSk7Ci0KLSAgICBpZiAoICFtZm4gKQotICAgIHsK LSAgICAgICAgcHJpbnRrKEtFUk5fRVJSCi0gICAgICAgICAgICAgICAiTlVNQTogVW5hYmxlIHRv IGFsbG9jYXRlIE1lbW9yeSB0byBOb2RlIGhhc2ggbWFwXG4iKTsKLSAgICAgICAgbWVtbm9kZW1h cHNpemUgPSAwOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgbWVtbm9kZW1hcCA9 IG1mbl90b192aXJ0KG1mbik7Ci0gICAgbWZuIDw8PSBQQUdFX1NISUZUOwotICAgIHNpemUgPDw9 IFBBR0VfU0hJRlQ7Ci0gICAgcHJpbnRrKEtFUk5fREVCVUcgIk5VTUE6IEFsbG9jYXRlZCBtZW1u b2RlbWFwIGZyb20gJWx4IC0gJWx4XG4iLAotICAgICAgICAgICBtZm4sIG1mbiArIHNpemUpOwot ICAgIG1lbW5vZGVtYXBzaXplID0gc2l6ZSAvIHNpemVvZigqbWVtbm9kZW1hcCk7Ci0KLSAgICBy ZXR1cm4gMDsKLX0KLQotLyoKLSAqIFRoZSBMU0Igb2YgYWxsIHN0YXJ0IGFuZCBlbmQgYWRkcmVz c2VzIGluIHRoZSBub2RlIG1hcCBpcyB0aGUgdmFsdWUgb2YgdGhlCi0gKiBtYXhpbXVtIHBvc3Np YmxlIHNoaWZ0LgotICovCi1zdGF0aWMgaW50IF9faW5pdCBleHRyYWN0X2xzYl9mcm9tX25vZGVz KGNvbnN0IHN0cnVjdCBub2RlICpub2RlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgaW50IG51bW5vZGVzKQotewotICAgIGludCBpLCBub2Rlc191c2VkID0gMDsK LSAgICB1bnNpZ25lZCBsb25nIHNwZHgsIGVwZHg7Ci0gICAgdW5zaWduZWQgbG9uZyBiaXRmaWVs ZCA9IDAsIG1lbXRvcCA9IDA7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IG51bW5vZGVzOyBpKysg KQotICAgIHsKLSAgICAgICAgc3BkeCA9IHBhZGRyX3RvX3BkeChub2Rlc1tpXS5zdGFydCk7Ci0g ICAgICAgIGVwZHggPSBwYWRkcl90b19wZHgobm9kZXNbaV0uZW5kIC0gMSkgKyAxOwotICAgICAg ICBpZiAoIHNwZHggPj0gZXBkeCApCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgYml0 ZmllbGQgfD0gc3BkeDsKLSAgICAgICAgbm9kZXNfdXNlZCsrOwotICAgICAgICBpZiAoIGVwZHgg PiBtZW10b3AgKQotICAgICAgICAgICAgbWVtdG9wID0gZXBkeDsKLSAgICB9Ci0gICAgaWYgKCBu b2Rlc191c2VkIDw9IDEgKQotICAgICAgICBpID0gQklUU19QRVJfTE9ORyAtIDE7Ci0gICAgZWxz ZQotICAgICAgICBpID0gZmluZF9maXJzdF9iaXQoJmJpdGZpZWxkLCBzaXplb2YodW5zaWduZWQg bG9uZykqOCk7Ci0gICAgbWVtbm9kZW1hcHNpemUgPSAobWVtdG9wID4+IGkpICsgMTsKLSAgICBy ZXR1cm4gaTsKLX0KLQotaW50IF9faW5pdCBjb21wdXRlX2hhc2hfc2hpZnQoc3RydWN0IG5vZGUg Km5vZGVzLCBpbnQgbnVtbm9kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rl aWRfdCAqbm9kZWlkcykKLXsKLSAgICBpbnQgc2hpZnQ7Ci0KLSAgICBzaGlmdCA9IGV4dHJhY3Rf bHNiX2Zyb21fbm9kZXMobm9kZXMsIG51bW5vZGVzKTsKLSAgICBpZiAoIG1lbW5vZGVtYXBzaXpl IDw9IEFSUkFZX1NJWkUoX21lbW5vZGVtYXApICkKLSAgICAgICAgbWVtbm9kZW1hcCA9IF9tZW1u b2RlbWFwOwotICAgIGVsc2UgaWYgKCBhbGxvY2F0ZV9jYWNoZWFsaWduZWRfbWVtbm9kZW1hcCgp ICkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIHByaW50ayhLRVJOX0RFQlVHICJOVU1BOiBVc2lu ZyAlZCBmb3IgdGhlIGhhc2ggc2hpZnQuXG4iLCBzaGlmdCk7Ci0KLSAgICBpZiAoIHBvcHVsYXRl X21lbW5vZGVtYXAobm9kZXMsIG51bW5vZGVzLCBzaGlmdCwgbm9kZWlkcykgIT0gMSApCi0gICAg ewotICAgICAgICBwcmludGsoS0VSTl9JTkZPICJZb3VyIG1lbW9yeSBpcyBub3QgYWxpZ25lZCB5 b3UgbmVlZCB0byAiCi0gICAgICAgICAgICAgICAicmVidWlsZCB5b3VyIGh5cGVydmlzb3Igd2l0 aCBhIGJpZ2dlciBOT0RFTUFQU0laRSAiCi0gICAgICAgICAgICAgICAic2hpZnQ9JWRcbiIsIHNo aWZ0KTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHJldHVybiBzaGlmdDsKLX0K LS8qIGluaXRpYWxpemUgTk9ERV9EQVRBIGdpdmVuIG5vZGVpZCBhbmQgc3RhcnQvZW5kICovCi12 b2lkIF9faW5pdCBzZXR1cF9ub2RlX2Jvb3RtZW0obm9kZWlkX3Qgbm9kZWlkLCB1NjQgc3RhcnQs IHU2NCBlbmQpCi17IAotICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCBlbmRfcGZuOwotCi0g ICAgc3RhcnRfcGZuID0gc3RhcnQgPj4gUEFHRV9TSElGVDsKLSAgICBlbmRfcGZuID0gZW5kID4+ IFBBR0VfU0hJRlQ7Ci0KLSAgICBOT0RFX0RBVEEobm9kZWlkKS0+bm9kZV9zdGFydF9wZm4gPSBz dGFydF9wZm47Ci0gICAgTk9ERV9EQVRBKG5vZGVpZCktPm5vZGVfc3Bhbm5lZF9wYWdlcyA9IGVu ZF9wZm4gLSBzdGFydF9wZm47Ci0KLSAgICBub2RlX3NldF9vbmxpbmUobm9kZWlkKTsKLX0gCi0K IHZvaWQgX19pbml0IG51bWFfaW5pdF9hcnJheSh2b2lkKQogewogICAgIGludCByciwgaTsKQEAg LTI4OCwxNiArMTQ1LDYgQEAgdm9pZCBfX2luaXQgbnVtYV9pbml0bWVtX2luaXQodW5zaWduZWQg bG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbikKICAgICAgICAgICAgICAgICAg ICAgKHU2NCllbmRfcGZuIDw8IFBBR0VfU0hJRlQpOwogfQogCi12b2lkIG51bWFfYWRkX2NwdShp bnQgY3B1KQotewotICAgIGNwdW1hc2tfc2V0X2NwdShjcHUsICZub2RlX3RvX2NwdW1hc2tbY3B1 X3RvX25vZGUoY3B1KV0pOwotfSAKLQotdm9pZCBudW1hX3NldF9ub2RlKGludCBjcHUsIG5vZGVp ZF90IG5vZGUpCi17Ci0gICAgY3B1X3RvX25vZGVbY3B1XSA9IG5vZGU7Ci19Ci0KIC8qIFtudW1h PW9mZl0gKi8KIHN0YXRpYyBfX2luaXQgaW50IG51bWFfc2V0dXAoY2hhciAqb3B0KSAKIHsgCkBA IC0zNzMsMTQ5ICsyMjAsMyBAQCB1bnNpZ25lZCBpbnQgX19pbml0IGFyY2hfZ2V0X2RtYV9iaXRz aXplKHZvaWQpCiAgICAgICAgICAgICAgICAgIGZsc2wobm9kZV9zdGFydF9wZm4obm9kZSkgKyBu b2RlX3NwYW5uZWRfcGFnZXMobm9kZSkgLyA0IC0gMSkKICAgICAgICAgICAgICAgICAgKyBQQUdF X1NISUZULCAzMik7CiB9Ci0KLXN0YXRpYyB2b2lkIGR1bXBfbnVtYSh1bnNpZ25lZCBjaGFyIGtl eSkKLXsKLSAgICBzX3RpbWVfdCBub3cgPSBOT1coKTsKLSAgICB1bnNpZ25lZCBpbnQgaSwgaiwg bjsKLSAgICBpbnQgZXJyOwotICAgIHN0cnVjdCBkb21haW4gKmQ7Ci0gICAgc3RydWN0IHBhZ2Vf aW5mbyAqcGFnZTsKLSAgICB1bnNpZ25lZCBpbnQgcGFnZV9udW1fbm9kZVtNQVhfTlVNTk9ERVNd OwotICAgIGNvbnN0IHN0cnVjdCB2bnVtYV9pbmZvICp2bnVtYTsKLQotICAgIHByaW50aygiJyVj JyBwcmVzc2VkIC0+IGR1bXBpbmcgbnVtYSBpbmZvIChub3ctMHglWDolMDhYKVxuIiwga2V5LAot ICAgICAgICAgICAodTMyKShub3c+PjMyKSwgKHUzMilub3cpOwotCi0gICAgZm9yX2VhY2hfb25s aW5lX25vZGUgKCBpICkKLSAgICB7Ci0gICAgICAgIHBhZGRyX3QgcGEgPSBwZm5fdG9fcGFkZHIo bm9kZV9zdGFydF9wZm4oaSkgKyAxKTsKLQotICAgICAgICBwcmludGsoIk5PREUldSBzdGFydC0+ JWx1IHNpemUtPiVsdSBmcmVlLT4lbHVcbiIsCi0gICAgICAgICAgICAgICBpLCBub2RlX3N0YXJ0 X3BmbihpKSwgbm9kZV9zcGFubmVkX3BhZ2VzKGkpLAotICAgICAgICAgICAgICAgYXZhaWxfbm9k ZV9oZWFwX3BhZ2VzKGkpKTsKLSAgICAgICAgLyogc2FuaXR5IGNoZWNrIHBoeXNfdG9fbmlkKCkg Ki8KLSAgICAgICAgaWYgKCBwaHlzX3RvX25pZChwYSkgIT0gaSApCi0gICAgICAgICAgICBwcmlu dGsoInBoeXNfdG9fbmlkKCUiUFJJcGFkZHIiKSAtPiAlZCBzaG91bGQgYmUgJXVcbiIsCi0gICAg ICAgICAgICAgICAgICAgcGEsIHBoeXNfdG9fbmlkKHBhKSwgaSk7Ci0gICAgfQotCi0gICAgaiA9 IGNwdW1hc2tfZmlyc3QoJmNwdV9vbmxpbmVfbWFwKTsKLSAgICBuID0gMDsKLSAgICBmb3JfZWFj aF9vbmxpbmVfY3B1ICggaSApCi0gICAgewotICAgICAgICBpZiAoIGkgIT0gaiArIG4gfHwgY3B1 X3RvX25vZGVbal0gIT0gY3B1X3RvX25vZGVbaV0gKQotICAgICAgICB7Ci0gICAgICAgICAgICBp ZiAoIG4gPiAxICkKLSAgICAgICAgICAgICAgICBwcmludGsoIkNQVSV1Li4uJXUgLT4gTk9ERSVk XG4iLCBqLCBqICsgbiAtIDEsIGNwdV90b19ub2RlW2pdKTsKLSAgICAgICAgICAgIGVsc2UKLSAg ICAgICAgICAgICAgICBwcmludGsoIkNQVSV1IC0+IE5PREUlZFxuIiwgaiwgY3B1X3RvX25vZGVb al0pOwotICAgICAgICAgICAgaiA9IGk7Ci0gICAgICAgICAgICBuID0gMTsKLSAgICAgICAgfQot ICAgICAgICBlbHNlCi0gICAgICAgICAgICArK247Ci0gICAgfQotICAgIGlmICggbiA+IDEgKQot ICAgICAgICBwcmludGsoIkNQVSV1Li4uJXUgLT4gTk9ERSVkXG4iLCBqLCBqICsgbiAtIDEsIGNw dV90b19ub2RlW2pdKTsKLSAgICBlbHNlCi0gICAgICAgIHByaW50aygiQ1BVJXUgLT4gTk9ERSVk XG4iLCBqLCBjcHVfdG9fbm9kZVtqXSk7Ci0KLSAgICByY3VfcmVhZF9sb2NrKCZkb21saXN0X3Jl YWRfbG9jayk7Ci0KLSAgICBwcmludGsoIk1lbW9yeSBsb2NhdGlvbiBvZiBlYWNoIGRvbWFpbjpc biIpOwotICAgIGZvcl9lYWNoX2RvbWFpbiAoIGQgKQotICAgIHsKLSAgICAgICAgcHJvY2Vzc19w ZW5kaW5nX3NvZnRpcnFzKCk7Ci0KLSAgICAgICAgcHJpbnRrKCJEb21haW4gJXUgKHRvdGFsOiAl dSk6XG4iLCBkLT5kb21haW5faWQsIGQtPnRvdF9wYWdlcyk7Ci0KLSAgICAgICAgZm9yX2VhY2hf b25saW5lX25vZGUgKCBpICkKLSAgICAgICAgICAgIHBhZ2VfbnVtX25vZGVbaV0gPSAwOwotCi0g ICAgICAgIHNwaW5fbG9jaygmZC0+cGFnZV9hbGxvY19sb2NrKTsKLSAgICAgICAgcGFnZV9saXN0 X2Zvcl9lYWNoKHBhZ2UsICZkLT5wYWdlX2xpc3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkg PSBwaHlzX3RvX25pZCgocGFkZHJfdClwYWdlX3RvX21mbihwYWdlKSA8PCBQQUdFX1NISUZUKTsK LSAgICAgICAgICAgIHBhZ2VfbnVtX25vZGVbaV0rKzsKLSAgICAgICAgfQotICAgICAgICBzcGlu X3VubG9jaygmZC0+cGFnZV9hbGxvY19sb2NrKTsKLQotICAgICAgICBmb3JfZWFjaF9vbmxpbmVf bm9kZSAoIGkgKQotICAgICAgICAgICAgcHJpbnRrKCIgICAgTm9kZSAldTogJXVcbiIsIGksIHBh Z2VfbnVtX25vZGVbaV0pOwotCi0gICAgICAgIGlmICggIXJlYWRfdHJ5bG9jaygmZC0+dm51bWFf cndsb2NrKSApCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBpZiAoICFkLT52bnVt YSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlYWRfdW5sb2NrKCZkLT52bnVtYV9yd2xvY2sp OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICB2bnVtYSA9IGQt PnZudW1hOwotICAgICAgICBwcmludGsoIiAgICAgJXUgdm5vZGVzLCAldSB2Y3B1cywgZ3Vlc3Qg cGh5c2ljYWwgbGF5b3V0OlxuIiwKLSAgICAgICAgICAgICAgIHZudW1hLT5ucl92bm9kZXMsIGQt Pm1heF92Y3B1cyk7Ci0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgdm51bWEtPm5yX3Zub2Rlczsg aSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgdW5zaWduZWQgaW50IHN0YXJ0X2NwdSA9IH4w VTsKLQotICAgICAgICAgICAgZXJyID0gc25wcmludGYoa2V5aGFuZGxlcl9zY3JhdGNoLCAxMiwg IiUzdSIsCi0gICAgICAgICAgICAgICAgICAgIHZudW1hLT52bm9kZV90b19wbm9kZVtpXSk7Ci0g ICAgICAgICAgICBpZiAoIGVyciA8IDAgfHwgdm51bWEtPnZub2RlX3RvX3Bub2RlW2ldID09IE5V TUFfTk9fTk9ERSApCi0gICAgICAgICAgICAgICAgc3RybGNweShrZXloYW5kbGVyX3NjcmF0Y2gs ICI/Pz8iLCBzaXplb2Yoa2V5aGFuZGxlcl9zY3JhdGNoKSk7Ci0KLSAgICAgICAgICAgIHByaW50 aygiICAgICAgICUzdTogcG5vZGUgJXMsIiwgaSwga2V5aGFuZGxlcl9zY3JhdGNoKTsKLQotICAg ICAgICAgICAgcHJpbnRrKCIgdmNwdXMgIik7Ci0KLSAgICAgICAgICAgIGZvciAoIGogPSAwOyBq IDwgZC0+bWF4X3ZjcHVzOyBqKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlm ICggIShqICYgMHgzZikgKQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzX3BlbmRpbmdfc29m dGlycXMoKTsKLQotICAgICAgICAgICAgICAgIGlmICggdm51bWEtPnZjcHVfdG9fdm5vZGVbal0g PT0gaSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXJ0 X2NwdSA9PSB+MFUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAg ICAgICBwcmludGsoIiVkIiwgaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9jcHUg PSBqOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAg ICAgICAgIGVsc2UgaWYgKCBzdGFydF9jcHUgIT0gfjBVICkKLSAgICAgICAgICAgICAgICB7Ci0g ICAgICAgICAgICAgICAgICAgIGlmICggaiAtIDEgIT0gc3RhcnRfY3B1ICkKLSAgICAgICAgICAg ICAgICAgICAgICAgIHByaW50aygiLSVkICIsIGogLSAxKTsKLSAgICAgICAgICAgICAgICAgICAg ZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIgIik7Ci0gICAgICAgICAgICAg ICAgICAgIHN0YXJ0X2NwdSA9IH4wVTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9 Ci0KLSAgICAgICAgICAgIGlmICggc3RhcnRfY3B1ICE9IH4wVSAgJiYgc3RhcnRfY3B1ICE9IGog LSAxICkKLSAgICAgICAgICAgICAgICBwcmludGsoIi0lZCIsIGogLSAxKTsKLQotICAgICAgICAg ICAgcHJpbnRrKCJcbiIpOwotCi0gICAgICAgICAgICBmb3IgKCBqID0gMDsgaiA8IHZudW1hLT5u cl92bWVtcmFuZ2VzOyBqKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgg dm51bWEtPnZtZW1yYW5nZVtqXS5uaWQgPT0gaSApCi0gICAgICAgICAgICAgICAgICAgIHByaW50 aygiICAgICAgICAgICAlMDE2IlBSSXg2NCIgLSAlMDE2IlBSSXg2NCJcbiIsCi0gICAgICAgICAg ICAgICAgICAgICAgICAgICB2bnVtYS0+dm1lbXJhbmdlW2pdLnN0YXJ0LAotICAgICAgICAgICAg ICAgICAgICAgICAgICAgdm51bWEtPnZtZW1yYW5nZVtqXS5lbmQpOwotICAgICAgICAgICAgfQot ICAgICAgICB9Ci0KLSAgICAgICAgcmVhZF91bmxvY2soJmQtPnZudW1hX3J3bG9jayk7Ci0gICAg fQotCi0gICAgcmN1X3JlYWRfdW5sb2NrKCZkb21saXN0X3JlYWRfbG9jayk7Ci19Ci0KLXN0YXRp YyBfX2luaXQgaW50IHJlZ2lzdGVyX251bWFfdHJpZ2dlcih2b2lkKQotewotICAgIHJlZ2lzdGVy X2tleWhhbmRsZXIoJ3UnLCBkdW1wX251bWEsICJkdW1wIE5VTUEgaW5mbyIsIDEpOwotICAgIHJl dHVybiAwOwotfQotX19pbml0Y2FsbChyZWdpc3Rlcl9udW1hX3RyaWdnZXIpOwotCmRpZmYgLS1n aXQgYS94ZW4vY29tbW9uL01ha2VmaWxlIGIveGVuL2NvbW1vbi9NYWtlZmlsZQppbmRleCAwZmVk MzBiLi5jMWJkMmZmIDEwMDY0NAotLS0gYS94ZW4vY29tbW9uL01ha2VmaWxlCisrKyBiL3hlbi9j b21tb24vTWFrZWZpbGUKQEAgLTYzLDYgKzYzLDcgQEAgb2JqLXkgKz0gd2FpdC5vCiBvYmotYmlu LXkgKz0gd2FybmluZy5pbml0Lm8KIG9iai0kKENPTkZJR19YRU5PUFJPRikgKz0geGVub3Byb2Yu bwogb2JqLXkgKz0geG1hbGxvY190bHNmLm8KK29iai15ICs9IG51bWEubwogCiBvYmotYmluLSQo Q09ORklHX1g4NikgKz0gJChmb3JlYWNoIG4sZGVjb21wcmVzcyBidW56aXAyIHVueHogdW5sem1h IHVubHpvIHVubHo0IGVhcmx5Y3BpbywkKG4pLmluaXQubykKIApkaWZmIC0tZ2l0IGEveGVuL2Nv bW1vbi9udW1hLmMgYi94ZW4vY29tbW9uL251bWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwLi41OWRjYjYzCi0tLSAvZGV2L251bGwKKysrIGIveGVuL2NvbW1vbi9udW1hLmMK QEAgLTAsMCArMSwzNDIgQEAKKy8qCisgKiBDb21tb24gTlVNQSBoYW5kbGluZyBmdW5jdGlvbnMg Zm9yIHg4NiBhbmQgYXJtLgorICogT3JpZ2luYWwgY29kZSBleHRyYWN0ZWQgZnJvbSBhcmNoL3g4 Ni9udW1hLmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy ZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVl IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9y CisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJv Z3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAor ICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy cmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg UFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl IGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBJ ZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworCisjaW5j bHVkZSA8eGVuL21tLmg+CisjaW5jbHVkZSA8eGVuL3N0cmluZy5oPgorI2luY2x1ZGUgPHhlbi9p bml0Lmg+CisjaW5jbHVkZSA8eGVuL2N0eXBlLmg+CisjaW5jbHVkZSA8eGVuL25vZGVtYXNrLmg+ CisjaW5jbHVkZSA8eGVuL251bWEuaD4KKyNpbmNsdWRlIDx4ZW4va2V5aGFuZGxlci5oPgorI2lu Y2x1ZGUgPHhlbi90aW1lLmg+CisjaW5jbHVkZSA8eGVuL3NtcC5oPgorI2luY2x1ZGUgPHhlbi9w Zm4uaD4KKyNpbmNsdWRlIDx4ZW4vc2NoZWQuaD4KKyNpbmNsdWRlIDx4ZW4vZXJybm8uaD4KKyNp bmNsdWRlIDx4ZW4vc29mdGlycS5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorCitzdHJ1Y3Qg bm9kZV9kYXRhIG5vZGVfZGF0YVtNQVhfTlVNTk9ERVNdOworCisvKiBNYXBwaW5nIGZyb20gcGR4 IHRvIG5vZGUgaWQgKi8KK2ludCBtZW1ub2RlX3NoaWZ0OwordW5zaWduZWQgbG9uZyBtZW1ub2Rl bWFwc2l6ZTsKK3U4ICptZW1ub2RlbWFwOwordHlwZW9mKCptZW1ub2RlbWFwKSBfbWVtbm9kZW1h cFs2NF07CisKK25vZGVpZF90IGNwdV90b19ub2RlW05SX0NQVVNdIF9fcmVhZF9tb3N0bHkgPSB7 CisgICAgWzAgLi4uIE5SX0NQVVMtMV0gPSBOVU1BX05PX05PREUKK307CisKK2NwdW1hc2tfdCBu b2RlX3RvX2NwdW1hc2tbTUFYX05VTU5PREVTXSBfX3JlYWRfbW9zdGx5OworCisvKgorICogR2l2 ZW4gYSBzaGlmdCB2YWx1ZSwgdHJ5IHRvIHBvcHVsYXRlIG1lbW5vZGVtYXBbXQorICogUmV0dXJu cyA6CisgKiAxIGlmIE9LCisgKiAwIGlmIG1lbW5vZG1hcFtdIHRvbyBzbWFsbCAob2Ygc2hpZnQg dG9vIHNtYWxsKQorICogLTEgaWYgbm9kZSBvdmVybGFwIG9yIGxvc3QgcmFtIChzaGlmdCB0b28g YmlnKQorICovCitzdGF0aWMgaW50IF9faW5pdCBwb3B1bGF0ZV9tZW1ub2RlbWFwKGNvbnN0IHN0 cnVjdCBub2RlICpub2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg aW50IG51bW5vZGVzLCBpbnQgc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIG5vZGVpZF90ICpub2RlaWRzKQoreworICAgIHVuc2lnbmVkIGxvbmcgc3BkeCwgZXBk eDsKKyAgICBpbnQgaSwgcmVzID0gLTE7CisKKyAgICBtZW1zZXQobWVtbm9kZW1hcCwgTlVNQV9O T19OT0RFLCBtZW1ub2RlbWFwc2l6ZSAqIHNpemVvZigqbWVtbm9kZW1hcCkpOworICAgIGZvciAo IGkgPSAwOyBpIDwgbnVtbm9kZXM7IGkrKyApCisgICAgeworICAgICAgICBzcGR4ID0gcGFkZHJf dG9fcGR4KG5vZGVzW2ldLnN0YXJ0KTsKKyAgICAgICAgZXBkeCA9IHBhZGRyX3RvX3BkeChub2Rl c1tpXS5lbmQgLSAxKSArIDE7CisgICAgICAgIGlmICggc3BkeCA+PSBlcGR4ICkKKyAgICAgICAg ICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoIChlcGR4ID4+IHNoaWZ0KSA+PSBtZW1ub2RlbWFw c2l6ZSApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAg aWYgKCBtZW1ub2RlbWFwW3NwZHggPj4gc2hpZnRdICE9IE5VTUFfTk9fTk9ERSApCisgICAgICAg ICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICBpZiAoICFub2RlaWRzICkKKyAgICAg ICAgICAgICAgICBtZW1ub2RlbWFwW3NwZHggPj4gc2hpZnRdID0gaTsKKyAgICAgICAgICAgIGVs c2UKKyAgICAgICAgICAgICAgICBtZW1ub2RlbWFwW3NwZHggPj4gc2hpZnRdID0gbm9kZWlkc1tp XTsKKworICAgICAgICAgICAgc3BkeCArPSAoMVVMIDw8IHNoaWZ0KTsKKyAgICAgICAgfSB3aGls ZSAoIHNwZHggPCBlcGR4ICk7CisgICAgICAgIHJlcyA9IDE7CisgICAgfQorCisgICAgcmV0dXJu IHJlczsKK30KKworc3RhdGljIGludCBfX2luaXQgYWxsb2NhdGVfY2FjaGVhbGlnbmVkX21lbW5v ZGVtYXAodm9pZCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIHNpemUgPSBQRk5fVVAobWVtbm9kZW1h cHNpemUgKiBzaXplb2YoKm1lbW5vZGVtYXApKTsKKyAgICB1bnNpZ25lZCBsb25nIG1mbjsKKwor ICAgIG1mbiA9IGFsbG9jX2Jvb3RfcGFnZXMoc2l6ZSwgMSk7CisgICAgaWYgKCAhbWZuICkKKyAg ICB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUgorICAgICAgICAgICAgICAgIk5VTUE6IFVuYWJs ZSB0byBhbGxvY2F0ZSBNZW1vcnkgdG8gTm9kZSBoYXNoIG1hcFxuIik7CisgICAgICAgIG1lbW5v ZGVtYXBzaXplID0gMDsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG1lbW5vZGVt YXAgPSBtZm5fdG9fdmlydChtZm4pOworICAgIG1mbiA8PD0gUEFHRV9TSElGVDsKKyAgICBzaXpl IDw8PSBQQUdFX1NISUZUOworICAgIHByaW50ayhLRVJOX0RFQlVHICJOVU1BOiBBbGxvY2F0ZWQg bWVtbm9kZW1hcCBmcm9tICVseCAtICVseFxuIiwKKyAgICAgICAgICAgbWZuLCBtZm4gKyBzaXpl KTsKKyAgICBtZW1ub2RlbWFwc2l6ZSA9IHNpemUgLyBzaXplb2YoKm1lbW5vZGVtYXApOworCisg ICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgTFNCIG9mIGFsbCBzdGFydCBhbmQgZW5kIGFk ZHJlc3NlcyBpbiB0aGUgbm9kZSBtYXAgaXMgdGhlIHZhbHVlIG9mIHRoZQorICogbWF4aW11bSBw b3NzaWJsZSBzaGlmdC4KKyAqLworc3RhdGljIGludCBfX2luaXQgZXh0cmFjdF9sc2JfZnJvbV9u b2Rlcyhjb25zdCBzdHJ1Y3Qgbm9kZSAqbm9kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGludCBudW1ub2RlcykKK3sKKyAgICBpbnQgaSwgbm9kZXNfdXNlZCA9 IDA7CisgICAgdW5zaWduZWQgbG9uZyBzcGR4LCBlcGR4OworICAgIHVuc2lnbmVkIGxvbmcgYml0 ZmllbGQgPSAwLCBtZW10b3AgPSAwOworCisgICAgZm9yICggaSA9IDA7IGkgPCBudW1ub2Rlczsg aSsrICkKKyAgICB7CisgICAgICAgIHNwZHggPSBwYWRkcl90b19wZHgobm9kZXNbaV0uc3RhcnQp OworICAgICAgICBlcGR4ID0gcGFkZHJfdG9fcGR4KG5vZGVzW2ldLmVuZCAtIDEpICsgMTsKKyAg ICAgICAgaWYgKCBzcGR4ID49IGVwZHggKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAg IGJpdGZpZWxkIHw9IHNwZHg7CisgICAgICAgIG5vZGVzX3VzZWQrKzsKKyAgICAgICAgaWYgKCBl cGR4ID4gbWVtdG9wICkKKyAgICAgICAgICAgIG1lbXRvcCA9IGVwZHg7CisgICAgfQorICAgIGlm ICggbm9kZXNfdXNlZCA8PSAxICkKKyAgICAgICAgaSA9IEJJVFNfUEVSX0xPTkcgLSAxOworICAg IGVsc2UKKyAgICAgICAgaSA9IGZpbmRfZmlyc3RfYml0KCZiaXRmaWVsZCwgc2l6ZW9mKHVuc2ln bmVkIGxvbmcpKjgpOworCisgICAgbWVtbm9kZW1hcHNpemUgPSAobWVtdG9wID4+IGkpICsgMTsK KworICAgIHJldHVybiBpOworfQorCitpbnQgX19pbml0IGNvbXB1dGVfaGFzaF9zaGlmdChzdHJ1 Y3Qgbm9kZSAqbm9kZXMsIGludCBudW1ub2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIG5vZGVpZF90ICpub2RlaWRzKQoreworICAgIGludCBzaGlmdDsKKworICAgIHNoaWZ0ID0g ZXh0cmFjdF9sc2JfZnJvbV9ub2Rlcyhub2RlcywgbnVtbm9kZXMpOworICAgIGlmICggbWVtbm9k ZW1hcHNpemUgPD0gQVJSQVlfU0laRShfbWVtbm9kZW1hcCkgKQorICAgICAgICBtZW1ub2RlbWFw ID0gX21lbW5vZGVtYXA7CisgICAgZWxzZSBpZiAoIGFsbG9jYXRlX2NhY2hlYWxpZ25lZF9tZW1u b2RlbWFwKCkgKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcHJpbnRrKEtFUk5fREVCVUcgIk5V TUE6IFVzaW5nICVkIGZvciB0aGUgaGFzaCBzaGlmdC5cbiIsIHNoaWZ0KTsKKworICAgIGlmICgg cG9wdWxhdGVfbWVtbm9kZW1hcChub2RlcywgbnVtbm9kZXMsIHNoaWZ0LCBub2RlaWRzKSAhPSAx ICkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIllvdXIgbWVtb3J5IGlzIG5vdCBh bGlnbmVkIHlvdSBuZWVkIHRvICIKKyAgICAgICAgICAgICAgICJyZWJ1aWxkIHlvdXIgaHlwZXJ2 aXNvciB3aXRoIGEgYmlnZ2VyIE5PREVNQVBTSVpFICIKKyAgICAgICAgICAgICAgICJzaGlmdD0l ZFxuIiwgc2hpZnQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIHNo aWZ0OworfQorCisvKiBpbml0aWFsaXplIE5PREVfREFUQSBnaXZlbiBub2RlaWQgYW5kIHN0YXJ0 L2VuZCAqLwordm9pZCBfX2luaXQgc2V0dXBfbm9kZV9ib290bWVtKG5vZGVpZF90IG5vZGVpZCwg dTY0IHN0YXJ0LCB1NjQgZW5kKQoreworICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCBlbmRf cGZuOworCisgICAgc3RhcnRfcGZuID0gc3RhcnQgPj4gUEFHRV9TSElGVDsKKyAgICBlbmRfcGZu ID0gZW5kID4+IFBBR0VfU0hJRlQ7CisKKyAgICBOT0RFX0RBVEEobm9kZWlkKS0+bm9kZV9pZCA9 IG5vZGVpZDsKKyAgICBOT0RFX0RBVEEobm9kZWlkKS0+bm9kZV9zdGFydF9wZm4gPSBzdGFydF9w Zm47CisgICAgTk9ERV9EQVRBKG5vZGVpZCktPm5vZGVfc3Bhbm5lZF9wYWdlcyA9IGVuZF9wZm4g LSBzdGFydF9wZm47CisKKyAgICBub2RlX3NldF9vbmxpbmUobm9kZWlkKTsKK30KKwordm9pZCBu dW1hX2FkZF9jcHUoaW50IGNwdSkKK3sKKyAgICBjcHVtYXNrX3NldF9jcHUoY3B1LCAmbm9kZV90 b19jcHVtYXNrW2NwdV90b19ub2RlKGNwdSldKTsKK30KKwordm9pZCBudW1hX3NldF9ub2RlKGlu dCBjcHUsIG5vZGVpZF90IG5vZGUpCit7CisgICAgY3B1X3RvX25vZGVbY3B1XSA9IG5vZGU7Cit9 CisKK0VYUE9SVF9TWU1CT0wobm9kZV90b19jcHVtYXNrKTsKK0VYUE9SVF9TWU1CT0wobWVtbm9k ZV9zaGlmdCk7CitFWFBPUlRfU1lNQk9MKG1lbW5vZGVtYXApOworRVhQT1JUX1NZTUJPTChub2Rl X2RhdGEpOworCitzdGF0aWMgdm9pZCBkdW1wX251bWEodW5zaWduZWQgY2hhciBrZXkpCit7Cisg ICAgc190aW1lX3Qgbm93ID0gTk9XKCk7CisgICAgdW5zaWduZWQgaW50IGksIGosIG47CisgICAg aW50IGVycjsKKyAgICBzdHJ1Y3QgZG9tYWluICpkOworICAgIHN0cnVjdCBwYWdlX2luZm8gKnBh Z2U7CisgICAgdW5zaWduZWQgaW50IHBhZ2VfbnVtX25vZGVbTUFYX05VTU5PREVTXSA9IHswfTsK KyAgICBjb25zdCBzdHJ1Y3Qgdm51bWFfaW5mbyAqdm51bWE7CisKKyAgICBwcmludGsoIiclYycg cHJlc3NlZCAtPiBkdW1waW5nIG51bWEgaW5mbyAobm93LTB4JVg6JTA4WClcbiIsIGtleSwKKyAg ICAgICAgICAgKHUzMikobm93Pj4zMiksICh1MzIpbm93KTsKKworICAgIGZvcl9lYWNoX29ubGlu ZV9ub2RlICggaSApCisgICAgeworICAgICAgICBwYWRkcl90IHBhID0gKHBhZGRyX3QpKE5PREVf REFUQShpKS0+bm9kZV9zdGFydF9wZm4gKyAxKTw8IFBBR0VfU0hJRlQ7CisgICAgICAgIHByaW50 aygiaWR4JWQgLT4gTk9ERSVkIHN0YXJ0LT4lbHUgc2l6ZS0+JWx1IGZyZWUtPiVsdVxuIiwKKyAg ICAgICAgICAgICAgIGksIE5PREVfREFUQShpKS0+bm9kZV9pZCwKKyAgICAgICAgICAgICAgIE5P REVfREFUQShpKS0+bm9kZV9zdGFydF9wZm4sCisgICAgICAgICAgICAgICBOT0RFX0RBVEEoaSkt Pm5vZGVfc3Bhbm5lZF9wYWdlcywKKyAgICAgICAgICAgICAgIGF2YWlsX25vZGVfaGVhcF9wYWdl cyhpKSk7CisgICAgICAgIC8qIHNhbml0eSBjaGVjayBwaHlzX3RvX25pZCgpICovCisgICAgICAg IHByaW50aygicGh5c190b19uaWQoJSJQUklwYWRkciIpIC0+ICVkIHNob3VsZCBiZSAlZFxuIiwg cGEsCisgICAgICAgICAgICAgICBwaHlzX3RvX25pZChwYSksCisgICAgICAgICAgICAgICBOT0RF X0RBVEEoaSktPm5vZGVfaWQpOworICAgIH0KKworICAgIGogPSBjcHVtYXNrX2ZpcnN0KCZjcHVf b25saW5lX21hcCk7CisgICAgbiA9IDA7CisgICAgZm9yX2VhY2hfb25saW5lX2NwdSAoIGkgKQor ICAgIHsKKyAgICAgICAgaWYgKCBpICE9IGogKyBuIHx8IGNwdV90b19ub2RlW2pdICE9IGNwdV90 b19ub2RlW2ldICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBuID4gMSApCisgICAgICAg ICAgICAgICAgcHJpbnRrKCJDUFUldS4uLiV1IC0+IE5PREUlZFxuIiwgaiwgaiArIG4gLSAxLCBj cHVfdG9fbm9kZVtqXSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRr KCJDUFUldSAtPiBOT0RFJWRcbiIsIGosIGNwdV90b19ub2RlW2pdKTsKKyAgICAgICAgICAgIGog PSBpOworICAgICAgICAgICAgbiA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAg ICAgICAgKytuOworICAgIH0KKyAgICBpZiAoIG4gPiAxICkKKyAgICAgICAgcHJpbnRrKCJDUFUl dS4uLiV1IC0+IE5PREUlZFxuIiwgaiwgaiArIG4gLSAxLCBjcHVfdG9fbm9kZVtqXSk7CisgICAg ZWxzZQorICAgICAgICBwcmludGsoIkNQVSV1IC0+IE5PREUlZFxuIiwgaiwgY3B1X3RvX25vZGVb al0pOworCisgICAgcmN1X3JlYWRfbG9jaygmZG9tbGlzdF9yZWFkX2xvY2spOworCisgICAgcHJp bnRrKCJNZW1vcnkgbG9jYXRpb24gb2YgZWFjaCBkb21haW46XG4iKTsKKyAgICBmb3JfZWFjaF9k b21haW4gKCBkICkKKyAgICB7CisgICAgICAgIHByb2Nlc3NfcGVuZGluZ19zb2Z0aXJxcygpOwor ICAgICAgICBwcmludGsoIkRvbWFpbiAldSAodG90YWw6ICV1KTpcbiIsIGQtPmRvbWFpbl9pZCwg ZC0+dG90X3BhZ2VzKTsKKworICAgICAgICBmb3JfZWFjaF9vbmxpbmVfbm9kZSAoIGkgKQorICAg ICAgICAgICAgcGFnZV9udW1fbm9kZVtpXSA9IDA7CisKKyAgICAgICAgc3Bpbl9sb2NrKCZkLT5w YWdlX2FsbG9jX2xvY2spOworICAgICAgICBwYWdlX2xpc3RfZm9yX2VhY2gocGFnZSwgJmQtPnBh Z2VfbGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgaSA9IHBoeXNfdG9fbmlkKChwYWRkcl90 KXBhZ2VfdG9fbWZuKHBhZ2UpIDw8IFBBR0VfU0hJRlQpOworICAgICAgICAgICAgcGFnZV9udW1f bm9kZVtpXSsrOworICAgICAgICB9CisgICAgICAgIHNwaW5fdW5sb2NrKCZkLT5wYWdlX2FsbG9j X2xvY2spOworCisgICAgICAgIGZvcl9lYWNoX29ubGluZV9ub2RlICggaSApCisgICAgICAgICAg ICBwcmludGsoIiAgICBOb2RlICV1OiAldVxuIiwgaSwgcGFnZV9udW1fbm9kZVtpXSk7CisKKyAg ICAgICAgaWYgKCAhcmVhZF90cnlsb2NrKCZkLT52bnVtYV9yd2xvY2spICkKKyAgICAgICAgICAg IGNvbnRpbnVlOworCisgICAgICAgIGlmICggIWQtPnZudW1hICkKKyAgICAgICAgeworICAgICAg ICAgICAgcmVhZF91bmxvY2soJmQtPnZudW1hX3J3bG9jayk7CisgICAgICAgICAgICBjb250aW51 ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZudW1hID0gZC0+dm51bWE7CisgICAgICAgIHByaW50 aygiICAgICAldSB2bm9kZXMsICV1IHZjcHVzLCBndWVzdCBwaHlzaWNhbCBsYXlvdXQ6XG4iLAor ICAgICAgICAgICAgICAgdm51bWEtPm5yX3Zub2RlcywgZC0+bWF4X3ZjcHVzKTsKKyAgICAgICAg Zm9yICggaSA9IDA7IGkgPCB2bnVtYS0+bnJfdm5vZGVzOyBpKysgKQorICAgICAgICB7CisgICAg ICAgICAgICB1bnNpZ25lZCBpbnQgc3RhcnRfY3B1ID0gfjBVOworCisgICAgICAgICAgICBlcnIg PSBzbnByaW50ZihrZXloYW5kbGVyX3NjcmF0Y2gsIDEyLCAiJTN1IiwKKyAgICAgICAgICAgICAg ICAgICAgdm51bWEtPnZub2RlX3RvX3Bub2RlW2ldKTsKKyAgICAgICAgICAgIGlmICggZXJyIDwg MCB8fCB2bnVtYS0+dm5vZGVfdG9fcG5vZGVbaV0gPT0gTlVNQV9OT19OT0RFICkKKyAgICAgICAg ICAgICAgICBzdHJsY3B5KGtleWhhbmRsZXJfc2NyYXRjaCwgIj8/PyIsIHNpemVvZihrZXloYW5k bGVyX3NjcmF0Y2gpKTsKKworICAgICAgICAgICAgcHJpbnRrKCIgICAgICAgJTN1OiBwbm9kZSAl cywiLCBpLCBrZXloYW5kbGVyX3NjcmF0Y2gpOworCisgICAgICAgICAgICBwcmludGsoIiB2Y3B1 cyAiKTsKKworICAgICAgICAgICAgZm9yICggaiA9IDA7IGogPCBkLT5tYXhfdmNwdXM7IGorKyAp CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCAhKGogJiAweDNmKSApCisgICAg ICAgICAgICAgICAgICAgIHByb2Nlc3NfcGVuZGluZ19zb2Z0aXJxcygpOworCisgICAgICAgICAg ICAgICAgaWYgKCB2bnVtYS0+dmNwdV90b192bm9kZVtqXSA9PSBpICkKKyAgICAgICAgICAgICAg ICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhcnRfY3B1ID09IH4wVSApCisgICAgICAg ICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiJWQiLCBqKTsK KyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2NwdSA9IGo7CisgICAgICAgICAgICAgICAg ICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHN0YXJ0 X2NwdSAhPSB+MFUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYg KCBqIC0gMSAhPSBzdGFydF9jcHUgKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIt JWQgIiwgaiAtIDEpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAg ICAgICAgICBwcmludGsoIiAiKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRfY3B1ID0gfjBV OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBz dGFydF9jcHUgIT0gfjBVICAmJiBzdGFydF9jcHUgIT0gaiAtIDEgKQorICAgICAgICAgICAgICAg IHByaW50aygiLSVkIiwgaiAtIDEpOworCisgICAgICAgICAgICBwcmludGsoIlxuIik7CisKKyAg ICAgICAgICAgIGZvciAoIGogPSAwOyBqIDwgdm51bWEtPm5yX3ZtZW1yYW5nZXM7IGorKyApCisg ICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCB2bnVtYS0+dm1lbXJhbmdlW2pdLm5p ZCA9PSBpICkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIgICAgICAgICAgICUwMTYiUFJJ eDY0IiAtICUwMTYiUFJJeDY0IlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZudW1h LT52bWVtcmFuZ2Vbal0uc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2bnVtYS0+ dm1lbXJhbmdlW2pdLmVuZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBy ZWFkX3VubG9jaygmZC0+dm51bWFfcndsb2NrKTsKKyAgICB9CisKKyAgICByY3VfcmVhZF91bmxv Y2soJmRvbWxpc3RfcmVhZF9sb2NrKTsKK30KKworc3RhdGljIF9faW5pdCBpbnQgcmVnaXN0ZXJf bnVtYV90cmlnZ2VyKHZvaWQpCit7CisgICAgcmVnaXN0ZXJfa2V5aGFuZGxlcigndScsIGR1bXBf bnVtYSwgImR1bXAgTlVNQSBpbmZvIiwgMSk7CisgICAgcmV0dXJuIDA7Cit9CitfX2luaXRjYWxs KHJlZ2lzdGVyX251bWFfdHJpZ2dlcik7CisKZGlmZiAtLWdpdCBhL3hlbi9pbmNsdWRlL2FzbS14 ODYvbnVtYS5oIGIveGVuL2luY2x1ZGUvYXNtLXg4Ni9udW1hLmgKaW5kZXggMjQ3OTIzOC4uNjFi Y2Q4ZSAxMDA2NDQKLS0tIGEveGVuL2luY2x1ZGUvYXNtLXg4Ni9udW1hLmgKKysrIGIveGVuL2lu Y2x1ZGUvYXNtLXg4Ni9udW1hLmgKQEAgLTE3LDY0ICsxNywxNyBAQCBleHRlcm4gY3B1bWFza190 ICAgICBub2RlX3RvX2NwdW1hc2tbXTsKICNkZWZpbmUgbm9kZV90b19maXJzdF9jcHUobm9kZSkg IChfX2Zmcyhub2RlX3RvX2NwdW1hc2tbbm9kZV0pKQogI2RlZmluZSBub2RlX3RvX2NwdW1hc2so bm9kZSkgICAgKG5vZGVfdG9fY3B1bWFza1tub2RlXSkKIAotc3RydWN0IG5vZGUgeyAKLQl1NjQg c3RhcnQsZW5kOyAKLX07Ci0KLWV4dGVybiBpbnQgY29tcHV0ZV9oYXNoX3NoaWZ0KHN0cnVjdCBu b2RlICpub2RlcywgaW50IG51bW5vZGVzLAotCQkJICAgICAgbm9kZWlkX3QgKm5vZGVpZHMpOwog ZXh0ZXJuIG5vZGVpZF90IHB4bV90b19ub2RlKHVuc2lnbmVkIGludCBweG0pOwogCiAjZGVmaW5l IFpPTkVfQUxJR04gKDFVTCA8PCAoTUFYX09SREVSK1BBR0VfU0hJRlQpKQotI2RlZmluZSBWSVJU VUFMX0JVR19PTih4KSAKIAotZXh0ZXJuIHZvaWQgbnVtYV9hZGRfY3B1KGludCBjcHUpOwogZXh0 ZXJuIHZvaWQgbnVtYV9pbml0X2FycmF5KHZvaWQpOwogZXh0ZXJuIGJvb2xfdCBudW1hX29mZjsK IAotCiBleHRlcm4gaW50IHNyYXRfZGlzYWJsZWQodm9pZCk7Ci1leHRlcm4gdm9pZCBudW1hX3Nl dF9ub2RlKGludCBjcHUsIG5vZGVpZF90IG5vZGUpOwotZXh0ZXJuIG5vZGVpZF90IHNldHVwX25v ZGUodW5zaWduZWQgaW50IHB4bSk7CiBleHRlcm4gdm9pZCBzcmF0X2RldGVjdF9ub2RlKGludCBj cHUpOwogCi1leHRlcm4gdm9pZCBzZXR1cF9ub2RlX2Jvb3RtZW0obm9kZWlkX3Qgbm9kZWlkLCB1 NjQgc3RhcnQsIHU2NCBlbmQpOwogZXh0ZXJuIG5vZGVpZF90IGFwaWNpZF90b19ub2RlW107Ci1l eHRlcm4gdm9pZCBpbml0X2NwdV90b19ub2RlKHZvaWQpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQg Y2xlYXJfbm9kZV9jcHVtYXNrKGludCBjcHUpCi17Ci0JY3B1bWFza19jbGVhcl9jcHUoY3B1LCAm bm9kZV90b19jcHVtYXNrW2NwdV90b19ub2RlKGNwdSldKTsKLX0KLQotLyogU2ltcGxlIHBlcmZl Y3QgaGFzaCB0byBtYXAgcGR4IHRvIG5vZGUgbnVtYmVycyAqLwotZXh0ZXJuIGludCBtZW1ub2Rl X3NoaWZ0OyAKLWV4dGVybiB1bnNpZ25lZCBsb25nIG1lbW5vZGVtYXBzaXplOwotZXh0ZXJuIHU4 ICptZW1ub2RlbWFwOwotCi1zdHJ1Y3Qgbm9kZV9kYXRhIHsKLSAgICB1bnNpZ25lZCBsb25nIG5v ZGVfc3RhcnRfcGZuOwotICAgIHVuc2lnbmVkIGxvbmcgbm9kZV9zcGFubmVkX3BhZ2VzOwotfTsK LQotZXh0ZXJuIHN0cnVjdCBub2RlX2RhdGEgbm9kZV9kYXRhW107Ci0KLXN0YXRpYyBpbmxpbmUg X19hdHRyaWJ1dGVfXygocHVyZSkpIG5vZGVpZF90IHBoeXNfdG9fbmlkKHBhZGRyX3QgYWRkcikK LXsgCi0Jbm9kZWlkX3QgbmlkOwotCVZJUlRVQUxfQlVHX09OKChwYWRkcl90b19wZHgoYWRkcikg Pj4gbWVtbm9kZV9zaGlmdCkgPj0gbWVtbm9kZW1hcHNpemUpOwotCW5pZCA9IG1lbW5vZGVtYXBb cGFkZHJfdG9fcGR4KGFkZHIpID4+IG1lbW5vZGVfc2hpZnRdOyAKLQlWSVJUVUFMX0JVR19PTihu aWQgPj0gTUFYX05VTU5PREVTIHx8ICFub2RlX2RhdGFbbmlkXSk7IAotCXJldHVybiBuaWQ7IAot fSAKLQotI2RlZmluZSBOT0RFX0RBVEEobmlkKQkJKCYobm9kZV9kYXRhW25pZF0pKQotCi0jZGVm aW5lIG5vZGVfc3RhcnRfcGZuKG5pZCkJKE5PREVfREFUQShuaWQpLT5ub2RlX3N0YXJ0X3BmbikK LSNkZWZpbmUgbm9kZV9zcGFubmVkX3BhZ2VzKG5pZCkJKE5PREVfREFUQShuaWQpLT5ub2RlX3Nw YW5uZWRfcGFnZXMpCi0jZGVmaW5lIG5vZGVfZW5kX3BmbihuaWQpICAgICAgIChOT0RFX0RBVEEo bmlkKS0+bm9kZV9zdGFydF9wZm4gKyBcCi0JCQkJIE5PREVfREFUQShuaWQpLT5ub2RlX3NwYW5u ZWRfcGFnZXMpCi0KIGV4dGVybiBpbnQgdmFsaWRfbnVtYV9yYW5nZSh1NjQgc3RhcnQsIHU2NCBl bmQsIG5vZGVpZF90IG5vZGUpOwogCiB2b2lkIHNyYXRfcGFyc2VfcmVnaW9ucyh1NjQgYWRkcik7 CmRpZmYgLS1naXQgYS94ZW4vaW5jbHVkZS94ZW4vbnVtYS5oIGIveGVuL2luY2x1ZGUveGVuL251 bWEuaAppbmRleCA3YWVmMWE4Li5kZDMzYzkyIDEwMDY0NAotLS0gYS94ZW4vaW5jbHVkZS94ZW4v bnVtYS5oCisrKyBiL3hlbi9pbmNsdWRlL3hlbi9udW1hLmgKQEAgLTE4LDQgKzE4LDU4IEBACiAg ICgoKGQpLT52Y3B1ICE9IE5VTEwgJiYgKGQpLT52Y3B1WzBdICE9IE5VTEwpIFwKICAgID8gdmNw dV90b19ub2RlKChkKS0+dmNwdVswXSkgOiBOVU1BX05PX05PREUpCiAKK3N0cnVjdCBub2RlIHsK Kwl1NjQgc3RhcnQsZW5kOworfTsKKworc3RydWN0IG5vZGVfZGF0YSB7CisgICAgdW5zaWduZWQg bG9uZyBub2RlX3N0YXJ0X3BmbjsKKyAgICB1bnNpZ25lZCBsb25nIG5vZGVfc3Bhbm5lZF9wYWdl czsKKyAgICBub2RlaWRfdCAgICAgIG5vZGVfaWQ7Cit9OworCisjZGVmaW5lIE5PREVfREFUQShu aWQpCQkoJihub2RlX2RhdGFbbmlkXSkpCisjZGVmaW5lIFZJUlRVQUxfQlVHX09OKHgpCisKKyNp ZmRlZiBDT05GSUdfTlVNQQorZXh0ZXJuIHZvaWQgaW5pdF9jcHVfdG9fbm9kZSh2b2lkKTsKKwor c3RhdGljIGlubGluZSB2b2lkIGNsZWFyX25vZGVfY3B1bWFzayhpbnQgY3B1KQoreworCWNwdW1h c2tfY2xlYXJfY3B1KGNwdSwgJm5vZGVfdG9fY3B1bWFza1tjcHVfdG9fbm9kZShjcHUpXSk7Cit9 CisKKy8qIFNpbXBsZSBwZXJmZWN0IGhhc2ggdG8gbWFwIHBkeCB0byBub2RlIG51bWJlcnMgKi8K K2V4dGVybiBpbnQgbWVtbm9kZV9zaGlmdDsKK2V4dGVybiB1bnNpZ25lZCBsb25nIG1lbW5vZGVt YXBzaXplOworZXh0ZXJuIHU4ICptZW1ub2RlbWFwOworZXh0ZXJuIHR5cGVvZigqbWVtbm9kZW1h cCkgX21lbW5vZGVtYXBbXTsKKworZXh0ZXJuIHN0cnVjdCBub2RlX2RhdGEgbm9kZV9kYXRhW107 CisKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXygocHVyZSkpIG5vZGVpZF90IHBoeXNfdG9f bmlkKHBhZGRyX3QgYWRkcikKK3sKKwlub2RlaWRfdCBuaWQ7CisJVklSVFVBTF9CVUdfT04oKHBh ZGRyX3RvX3BkeChhZGRyKSA+PiBtZW1ub2RlX3NoaWZ0KSA+PSBtZW1ub2RlbWFwc2l6ZSk7CisJ bmlkID0gbWVtbm9kZW1hcFtwYWRkcl90b19wZHgoYWRkcikgPj4gbWVtbm9kZV9zaGlmdF07CisJ VklSVFVBTF9CVUdfT04obmlkID49IE1BWF9OVU1OT0RFUyB8fCAhbm9kZV9kYXRhW25pZF0pOwor CXJldHVybiBuaWQ7Cit9CisKKyNkZWZpbmUgbm9kZV9zdGFydF9wZm4obmlkKQkoTk9ERV9EQVRB KG5pZCktPm5vZGVfc3RhcnRfcGZuKQorI2RlZmluZSBub2RlX3NwYW5uZWRfcGFnZXMobmlkKQko Tk9ERV9EQVRBKG5pZCktPm5vZGVfc3Bhbm5lZF9wYWdlcykKKyNkZWZpbmUgbm9kZV9lbmRfcGZu KG5pZCkgICAgICAgKE5PREVfREFUQShuaWQpLT5ub2RlX3N0YXJ0X3BmbiArIFwKKwkJCQkgTk9E RV9EQVRBKG5pZCktPm5vZGVfc3Bhbm5lZF9wYWdlcykKKworI2Vsc2UKKyNkZWZpbmUgaW5pdF9j cHVfdG9fbm9kZSgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBjbGVhcl9ub2RlX2NwdW1hc2so Y3B1KSBkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBDT05GSUdfTlVNQSAqLworCitleHRlcm4g dm9pZCBudW1hX2FkZF9jcHUoaW50IGNwdSk7CitleHRlcm4gbm9kZWlkX3Qgc2V0dXBfbm9kZSh1 bnNpZ25lZCBpbnQgcHhtKTsKK2V4dGVybiB2b2lkIG51bWFfc2V0X25vZGUoaW50IGNwdSwgbm9k ZWlkX3Qgbm9kZSk7CitleHRlcm4gdm9pZCBzZXR1cF9ub2RlX2Jvb3RtZW0obm9kZWlkX3Qgbm9k ZWlkLCB1NjQgc3RhcnQsIHU2NCBlbmQpOworZXh0ZXJuIGludCBjb21wdXRlX2hhc2hfc2hpZnQo c3RydWN0IG5vZGUgKm5vZGVzLCBpbnQgbnVtbm9kZXMsCisJCQkgICAgICBub2RlaWRfdCAqbm9k ZWlkcyk7CiAjZW5kaWYgLyogX1hFTl9OVU1BX0ggKi8KLS0gCjIuNy40CgoKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVsIG1haWxpbmcgbGlz dApYZW4tZGV2ZWxAbGlzdHMueGVuLm9yZwpodHRwczovL2xpc3RzLnhlbi5vcmcveGVuLWRldmVs Cg==