From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by sourceware.org (Postfix) with ESMTP id 292733858C2F for ; Thu, 25 Aug 2022 09:09:51 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 292733858C2F Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 1D2B8D6E; Thu, 25 Aug 2022 02:09:55 -0700 (PDT) Received: from [10.57.18.40] (unknown [10.57.18.40]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 9FB5A3FAF5; Thu, 25 Aug 2022 02:09:49 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------Zka9Q4dj0T1a0D3h4W2cOA1i" Message-ID: Date: Thu, 25 Aug 2022 10:09:43 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.12.0 Subject: Re: [PATCH] Teach vectorizer to deal with bitfield accesses (was: [RFC] Teach vectorizer to deal with bitfield reads) Content-Language: en-US To: Richard Biener Cc: Jakub Jelinek , Richard Sandiford , "gcc-patches@gcc.gnu.org" References: <4a6f2350-f070-1473-63a5-3232968d3a89@arm.com> <4ea91767-de43-9d30-5bd2-a9a0759760c7@arm.com> <69abe824-94f5-95b5-fb7f-6fa076973e05@arm.com> <8f805fb1-d4ae-b0e3-ff26-57fd2c1fc1f7@arm.com> From: "Andre Vieira (lists)" In-Reply-To: X-Spam-Status: No, score=-22.3 required=5.0 tests=BAYES_00,GIT_PATCH_0,KAM_DMARC_NONE,KAM_DMARC_STATUS,KAM_LAZY_DOMAIN_SECURITY,KAM_LOTSOFHASH,NICE_REPLY_A,SPF_HELO_NONE,SPF_NONE,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: This is a multi-part message in MIME format. --------------Zka9Q4dj0T1a0D3h4W2cOA1i Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 17/08/2022 13:49, Richard Biener wrote: > Yes, of course. What you need to do is subtract DECL_FIELD_BIT_OFFSET > of the representative from DECL_FIELD_BIT_OFFSET of the original bitfield > access - that's the offset within the representative (by construction > both fields share DECL_FIELD_OFFSET). Doh! That makes sense... >> So instead I change bitpos such that: >> align_of_representative = TYPE_ALIGN (TREE_TYPE (representative)); >> bitpos -= bitpos.to_constant () / align_of_representative * >> align_of_representative; > ? Not sure why alignment comes into play here? Yeah just forget about this... it was my ill attempt at basically doing what you described above. > Not sure what you are saying but "yes", all shifting and masking should > happen in the type of the representative. > > + tree bitpos_tree = build_int_cst (bitsizetype, bitpos); > > for your convenience there's bitsize_int (bitpos) you can use. > > I don't think you are using the correct bitpos though, you fail to > adjust it for the BIT_FIELD_REF/BIT_INSERT_EXPR. Not sure I understand what you mean? I do adjust it, I've changed it now so it should hopefully be clearer. > > + build_int_cst (bitsizetype, TYPE_PRECISION > (bf_type)), > > the size of the bitfield reference is DECL_SIZE of the original > FIELD_DECL - it might be bigger than the precision of its type. > You probably want to double-check it's equal to the precision > (because of the insert but also because of all the masking) and > refuse to lower if not. I added a check for this but out of curiosity, how can the DECL_SIZE of a bitfield FIELD_DECL be different than it's type's precision? > > +/* Return TRUE if there are bitfields to lower in this LOOP. Fill > TO_LOWER > + with data structures representing these bitfields. */ > + > +static bool > +bitfields_to_lower_p (class loop *loop, > + vec &reads_to_lower, > + vec &writes_to_lower) > +{ > + basic_block *bbs = get_loop_body (loop); > + gimple_stmt_iterator gsi; > > as said I'd prefer to do this walk as part of the other walks we > already do - if and if only because get_loop_body () is a DFS > walk over the loop body (you should at least share that). I'm now sharing the use of ifc_bbs. The reason why I'd rather not share the walk over them is because it becomes quite complex to split out the decision to not lower if's because there are none, for which we will still want to lower bitfields, versus not lowering if's when they are there but aren't lowerable at which point we will forego lowering bitfields since we will not vectorize this loop anyway. > > + value = fold_build1 (NOP_EXPR, load_type, value); > > fold_convert (load_type, value) > > + if (!CONSTANT_CLASS_P (value)) > + { > + pattern_stmt > + = gimple_build_assign (vect_recog_temp_ssa_var (load_type, > NULL), > + value); > + value = gimple_get_lhs (pattern_stmt); > > there's in principle > > gimple_seq stmts = NULL; > value = gimple_convert (&stmts, load_type, value); > if (!gimple_seq_empty_p (stmts)) > { > pattern_stmt = gimple_seq_first_stmt (stmts); > append_pattern_def_seq (vinfo, stmt_info, pattern_stmt); > } > > though a append_pattern_def_seq helper to add a convenience sequence > would be nice to have here. Ended up using the existing 'vect_convert_input', seems to do nicely here. > You probably want to double-check your lowering code by > bootstrapping / testing with -ftree-loop-if-convert. Done, this lead me to find a new failure mode, where the type of the first operand of BIT_FIELD_REF was a FP type (TF mode), which then lead to failures when constructing the masking and shifting. I ended up adding a nop-conversion to an INTEGER type of the same width first if necessary. Also did a follow-up bootstrap with the addition of `-ftree-vectorize` and `-fno-vect-cost-model` to further test the codegen. All seems to be working on aarch64-linux-gnu. --------------Zka9Q4dj0T1a0D3h4W2cOA1i Content-Type: text/plain; charset=UTF-8; name="vect_bitfield3.patch" Content-Disposition: attachment; filename="vect_bitfield3.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3ZlY3QvdmVjdC1iaXRmaWVsZC1y ZWFkLTEuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3ZlY3QvdmVjdC1iaXRmaWVsZC1yZWFk LTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwLi4wMWNmMzRmYjQ0NDg0Y2E5MjZjYTVkZTk5ZWVmNzZkZDk5 YjY5ZTkyCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdmVjdC92 ZWN0LWJpdGZpZWxkLXJlYWQtMS5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qIHsgZGctcmVxdWly ZS1lZmZlY3RpdmUtdGFyZ2V0IHZlY3RfaW50IH0gKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5o PgorI2luY2x1ZGUgInRyZWUtdmVjdC5oIgorCitleHRlcm4gdm9pZCBhYm9ydCh2b2lkKTsK Kworc3RydWN0IHMgeyBpbnQgaSA6IDMxOyB9OworCisjZGVmaW5lIEVMVDAgezB9CisjZGVm aW5lIEVMVDEgezF9CisjZGVmaW5lIEVMVDIgezJ9CisjZGVmaW5lIEVMVDMgezN9CisjZGVm aW5lIE4gMzIKKyNkZWZpbmUgUkVTIDQ4CitzdHJ1Y3QgcyBBW05dCisgID0geyBFTFQwLCBF TFQxLCBFTFQyLCBFTFQzLCBFTFQwLCBFTFQxLCBFTFQyLCBFTFQzLAorICAgICAgRUxUMCwg RUxUMSwgRUxUMiwgRUxUMywgRUxUMCwgRUxUMSwgRUxUMiwgRUxUMywKKyAgICAgIEVMVDAs IEVMVDEsIEVMVDIsIEVMVDMsIEVMVDAsIEVMVDEsIEVMVDIsIEVMVDMsCisgICAgICBFTFQw LCBFTFQxLCBFTFQyLCBFTFQzLCBFTFQwLCBFTFQxLCBFTFQyLCBFTFQzfTsKKworaW50IF9f YXR0cmlidXRlX18gKChub2lwYSkpCitmKHN0cnVjdCBzICpwdHIsIHVuc2lnbmVkIG4pIHsK KyAgICBpbnQgcmVzID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkKKyAg ICAgIHJlcyArPSBwdHJbaV0uaTsKKyAgICByZXR1cm4gcmVzOworfQorCitpbnQgbWFpbiAo dm9pZCkKK3sKKyAgY2hlY2tfdmVjdCAoKTsKKworICBpZiAoZigmQVswXSwgTikgIT0gUkVT KQorICAgIGFib3J0ICgpOworCisgIHJldHVybiAwOworfQorCisvKiB7IGRnLWZpbmFsIHsg c2Nhbi10cmVlLWR1bXAtdGltZXMgInZlY3Rvcml6ZWQgMSBsb29wcyIgMSAidmVjdCIgfSB9 ICovCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy5kZy92ZWN0L3ZlY3QtYml0Zmll bGQtcmVhZC0yLmMgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy92ZWN0L3ZlY3QtYml0ZmllbGQt cmVhZC0yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMWE0YTE1NzljMTQ3OGI5NDA3YWQyMWIxOWU4ZmJk Y2E5ZjY3NGI0MgotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3Zl Y3QvdmVjdC1iaXRmaWVsZC1yZWFkLTIuYwpAQCAtMCwwICsxLDQzIEBACisvKiB7IGRnLXJl cXVpcmUtZWZmZWN0aXZlLXRhcmdldCB2ZWN0X2ludCB9ICovCisKKyNpbmNsdWRlIDxzdGRh cmcuaD4KKyNpbmNsdWRlICJ0cmVlLXZlY3QuaCIKKworZXh0ZXJuIHZvaWQgYWJvcnQodm9p ZCk7CisKK3N0cnVjdCBzIHsKKyAgICB1bnNpZ25lZCBpIDogMzE7CisgICAgY2hhciBhIDog NDsKK307CisKKyNkZWZpbmUgTiAzMgorI2RlZmluZSBFTFQwIHsweDdGRkZGRkZGVUwsIDB9 CisjZGVmaW5lIEVMVDEgezB4N0ZGRkZGRkZVTCwgMX0KKyNkZWZpbmUgRUxUMiB7MHg3RkZG RkZGRlVMLCAyfQorI2RlZmluZSBFTFQzIHsweDdGRkZGRkZGVUwsIDN9CisjZGVmaW5lIFJF UyA0OAorc3RydWN0IHMgQVtOXQorICA9IHsgRUxUMCwgRUxUMSwgRUxUMiwgRUxUMywgRUxU MCwgRUxUMSwgRUxUMiwgRUxUMywKKyAgICAgIEVMVDAsIEVMVDEsIEVMVDIsIEVMVDMsIEVM VDAsIEVMVDEsIEVMVDIsIEVMVDMsCisgICAgICBFTFQwLCBFTFQxLCBFTFQyLCBFTFQzLCBF TFQwLCBFTFQxLCBFTFQyLCBFTFQzLAorICAgICAgRUxUMCwgRUxUMSwgRUxUMiwgRUxUMywg RUxUMCwgRUxUMSwgRUxUMiwgRUxUM307CisKK2ludCBfX2F0dHJpYnV0ZV9fICgobm9pcGEp KQorZihzdHJ1Y3QgcyAqcHRyLCB1bnNpZ25lZCBuKSB7CisgICAgaW50IHJlcyA9IDA7Cisg ICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpCisgICAgICByZXMgKz0gcHRyW2ldLmE7 CisgICAgcmV0dXJuIHJlczsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGNoZWNrX3Zl Y3QgKCk7CisKKyAgaWYgKGYoJkFbMF0sIE4pICE9IFJFUykKKyAgICBhYm9ydCAoKTsKKwor ICByZXR1cm4gMDsKK30KKworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVz ICJ2ZWN0b3JpemVkIDEgbG9vcHMiIDEgInZlY3QiIH0gfSAqLwpkaWZmIC0tZ2l0IGEvZ2Nj L3Rlc3RzdWl0ZS9nY2MuZGcvdmVjdC92ZWN0LWJpdGZpZWxkLXJlYWQtMy5jIGIvZ2NjL3Rl c3RzdWl0ZS9nY2MuZGcvdmVjdC92ZWN0LWJpdGZpZWxkLXJlYWQtMy5jCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAuLjIxNjYxMWEyOWZkOGJiZmJhZmRiZGI3OWQ3OTBlNTIwZjQ0YmE2NzIKLS0tIC9kZXYv bnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy92ZWN0L3ZlY3QtYml0ZmllbGQtcmVh ZC0zLmMKQEAgLTAsMCArMSw0MyBAQAorLyogeyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJn ZXQgdmVjdF9pbnQgfSAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSAidHJl ZS12ZWN0LmgiCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCitleHRlcm4gdm9pZCBhYm9ydCh2 b2lkKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgYzsKKyAgICBpbnQgIGI7Cisg ICAgYm9vbCBhIDogMTsKK30gc3RydWN0X3Q7CisKKyNkZWZpbmUgTiAxNgorI2RlZmluZSBF TFRfRiB7IDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIDAgfQorI2RlZmluZSBFTFRfVCB7IDB4 RkZGRkZGRkYsIDB4RkZGRkZGRkYsIDEgfQorCitzdHJ1Y3RfdCB2ZWN0X2ZhbHNlW05dID0g eyBFTFRfRiwgRUxUX0YsIEVMVF9GLCBFTFRfRiwgRUxUX0YsIEVMVF9GLCBFTFRfRiwgRUxU X0YsCisJCQkgICBFTFRfRiwgRUxUX0YsIEVMVF9GLCBFTFRfRiwgRUxUX0YsIEVMVF9GLCBF TFRfRiwgRUxUX0YgIH07CitzdHJ1Y3RfdCB2ZWN0X3RydWVbTl0gID0geyBFTFRfRiwgRUxU X0YsIEVMVF9ULCBFTFRfRiwgRUxUX0YsIEVMVF9GLCBFTFRfRiwgRUxUX0YsCisJCQkgICBF TFRfRiwgRUxUX0YsIEVMVF9ULCBFTFRfRiwgRUxUX0YsIEVMVF9GLCBFTFRfRiwgRUxUX0Yg IH07CitpbnQgbWFpbiAodm9pZCkKK3sKKyAgdW5zaWduZWQgcmV0ID0gMDsKKyAgZm9yICh1 bnNpZ25lZCBpID0gMDsgaSA8IE47IGkrKykKKyAgeworICAgICAgcmV0IHw9IHZlY3RfZmFs c2VbaV0uYTsKKyAgfQorICBpZiAocmV0KQorICAgIGFib3J0ICgpOworCisgIGZvciAodW5z aWduZWQgaSA9IDA7IGkgPCBOOyBpKyspCisgIHsKKyAgICAgIHJldCB8PSB2ZWN0X3RydWVb aV0uYTsKKyAgfQorICBpZiAoIXJldCkKKyAgICBhYm9ydCAoKTsKKworICByZXR1cm4gMDsK K30KKworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVzICJ2ZWN0b3JpemVk IDIgbG9vcHMiIDEgInZlY3QiIH0gfSAqLwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9n Y2MuZGcvdmVjdC92ZWN0LWJpdGZpZWxkLXJlYWQtNC5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2Mu ZGcvdmVjdC92ZWN0LWJpdGZpZWxkLXJlYWQtNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjViYzljNDEy ZTk2MTZhZWZjYmY0OWE0NTE4ZjE2MDMzODBhNTRiMmYKLS0tIC9kZXYvbnVsbAorKysgYi9n Y2MvdGVzdHN1aXRlL2djYy5kZy92ZWN0L3ZlY3QtYml0ZmllbGQtcmVhZC00LmMKQEAgLTAs MCArMSw0NSBAQAorLyogeyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgdmVjdF9pbnQg fSAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSAidHJlZS12ZWN0LmgiCisK K2V4dGVybiB2b2lkIGFib3J0KHZvaWQpOworCitzdHJ1Y3QgcyB7CisgICAgdW5zaWduZWQg aSA6IDMxOworICAgIGNoYXIgeCA6IDI7CisgICAgY2hhciBhIDogNDsKK307CisKKyNkZWZp bmUgTiAzMgorI2RlZmluZSBFTFQwIHsweDdGRkZGRkZGVUwsIDMsIDB9CisjZGVmaW5lIEVM VDEgezB4N0ZGRkZGRkZVTCwgMywgMX0KKyNkZWZpbmUgRUxUMiB7MHg3RkZGRkZGRlVMLCAz LCAyfQorI2RlZmluZSBFTFQzIHsweDdGRkZGRkZGVUwsIDMsIDN9CisjZGVmaW5lIFJFUyA0 OAorc3RydWN0IHMgQVtOXQorICA9IHsgRUxUMCwgRUxUMSwgRUxUMiwgRUxUMywgRUxUMCwg RUxUMSwgRUxUMiwgRUxUMywKKyAgICAgIEVMVDAsIEVMVDEsIEVMVDIsIEVMVDMsIEVMVDAs IEVMVDEsIEVMVDIsIEVMVDMsCisgICAgICBFTFQwLCBFTFQxLCBFTFQyLCBFTFQzLCBFTFQw LCBFTFQxLCBFTFQyLCBFTFQzLAorICAgICAgRUxUMCwgRUxUMSwgRUxUMiwgRUxUMywgRUxU MCwgRUxUMSwgRUxUMiwgRUxUM307CisKK2ludCBfX2F0dHJpYnV0ZV9fICgobm9pcGEpKQor ZihzdHJ1Y3QgcyAqcHRyLCB1bnNpZ25lZCBuKSB7CisgICAgaW50IHJlcyA9IDA7CisgICAg Zm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpCisgICAgICByZXMgKz0gcHRyW2ldLmE7Cisg ICAgcmV0dXJuIHJlczsKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgIGNoZWNrX3ZlY3Qg KCk7CisKKyAgaWYgKGYoJkFbMF0sIE4pICE9IFJFUykKKyAgICBhYm9ydCAoKTsKKworICBy ZXR1cm4gMDsKK30KKworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVzICJ2 ZWN0b3JpemVkIDEgbG9vcHMiIDEgInZlY3QiIH0gfSAqLworCmRpZmYgLS1naXQgYS9nY2Mv dGVzdHN1aXRlL2djYy5kZy92ZWN0L3ZlY3QtYml0ZmllbGQtd3JpdGUtMS5jIGIvZ2NjL3Rl c3RzdWl0ZS9nY2MuZGcvdmVjdC92ZWN0LWJpdGZpZWxkLXdyaXRlLTEuYwpuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwLi4xOTY4M2QyNzdiMWFkZTEwMzQ0OTYxMzZmMWQwM2JiMmI0NDY5MDBmCi0tLSAvZGV2 L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdmVjdC92ZWN0LWJpdGZpZWxkLXdy aXRlLTEuYwpAQCAtMCwwICsxLDM5IEBACisvKiB7IGRnLXJlcXVpcmUtZWZmZWN0aXZlLXRh cmdldCB2ZWN0X2ludCB9ICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlICJ0 cmVlLXZlY3QuaCIKKworZXh0ZXJuIHZvaWQgYWJvcnQodm9pZCk7CisKK3N0cnVjdCBzIHsg aW50IGkgOiAzMTsgfTsKKworI2RlZmluZSBOIDMyCisjZGVmaW5lIFYgNQorc3RydWN0IHMg QVtOXTsKKwordm9pZCBfX2F0dHJpYnV0ZV9fICgobm9pcGEpKQorZihzdHJ1Y3QgcyAqcHRy LCB1bnNpZ25lZCBuKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpCisgICAg ICBwdHJbaV0uaSA9IFY7Cit9CisKK3ZvaWQgX19hdHRyaWJ1dGVfXyAoKG5vaXBhKSkKK2No ZWNrX2Yoc3RydWN0IHMgKnB0cikgeworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBO OyArK2kpCisgICAgICBpZiAocHRyW2ldLmkgIT0gVikKKwlhYm9ydCAoKTsKK30KKworaW50 IG1haW4gKHZvaWQpCit7CisgIGNoZWNrX3ZlY3QgKCk7CisgIF9fYnVpbHRpbl9tZW1zZXQg KCZBWzBdLCAwLCBzaXplb2Yoc3RydWN0IHMpICogTik7CisKKyAgZigmQVswXSwgTik7Cisg IGNoZWNrX2YgKCZBWzBdKTsKKworICByZXR1cm4gMDsKK30KKworLyogeyBkZy1maW5hbCB7 IHNjYW4tdHJlZS1kdW1wLXRpbWVzICJ2ZWN0b3JpemVkIDEgbG9vcHMiIDEgInZlY3QiIH0g fSAqLworCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy5kZy92ZWN0L3ZlY3QtYml0 ZmllbGQtd3JpdGUtMi5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdmVjdC92ZWN0LWJpdGZp ZWxkLXdyaXRlLTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5kNTUwZGQzNWFiNzVlYjY3ZjZlNTNmODlm YmY1NWI3MzE1ZTUwYmM5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2Mu ZGcvdmVjdC92ZWN0LWJpdGZpZWxkLXdyaXRlLTIuYwpAQCAtMCwwICsxLDQyIEBACisvKiB7 IGRnLXJlcXVpcmUtZWZmZWN0aXZlLXRhcmdldCB2ZWN0X2ludCB9ICovCisKKyNpbmNsdWRl IDxzdGRhcmcuaD4KKyNpbmNsdWRlICJ0cmVlLXZlY3QuaCIKKworZXh0ZXJuIHZvaWQgYWJv cnQodm9pZCk7CisKK3N0cnVjdCBzIHsKKyAgICB1bnNpZ25lZCBpIDogMzE7CisgICAgY2hh ciBhIDogNDsKK307CisKKyNkZWZpbmUgTiAzMgorI2RlZmluZSBWIDUKK3N0cnVjdCBzIEFb Tl07CisKK3ZvaWQgX19hdHRyaWJ1dGVfXyAoKG5vaXBhKSkKK2Yoc3RydWN0IHMgKnB0ciwg dW5zaWduZWQgbikgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKQorICAgICAg cHRyW2ldLmEgPSBWOworfQorCit2b2lkIF9fYXR0cmlidXRlX18gKChub2lwYSkpCitjaGVj a19mKHN0cnVjdCBzICpwdHIpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTjsg KytpKQorICAgICAgaWYgKHB0cltpXS5hICE9IFYpCisJYWJvcnQgKCk7Cit9CisKK2ludCBt YWluICh2b2lkKQoreworICBjaGVja192ZWN0ICgpOworICBfX2J1aWx0aW5fbWVtc2V0ICgm QVswXSwgMCwgc2l6ZW9mKHN0cnVjdCBzKSAqIE4pOworCisgIGYoJkFbMF0sIE4pOworICBj aGVja19mICgmQVswXSk7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIHsgZGctZmluYWwgeyBz Y2FuLXRyZWUtZHVtcC10aW1lcyAidmVjdG9yaXplZCAxIGxvb3BzIiAxICJ2ZWN0IiB9IH0g Ki8KKwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvdmVjdC92ZWN0LWJpdGZp ZWxkLXdyaXRlLTMuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3ZlY3QvdmVjdC1iaXRmaWVs ZC13cml0ZS0zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMzMwM2QyNjEwZmY5NzJkOTg2YmUxNzI5NjJj MTI5NjM0ZWU2NDI1NAotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRn L3ZlY3QvdmVjdC1iaXRmaWVsZC13cml0ZS0zLmMKQEAgLTAsMCArMSw0MyBAQAorLyogeyBk Zy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQgdmVjdF9pbnQgfSAqLworCisjaW5jbHVkZSA8 c3RkYXJnLmg+CisjaW5jbHVkZSAidHJlZS12ZWN0LmgiCisKK2V4dGVybiB2b2lkIGFib3J0 KHZvaWQpOworCitzdHJ1Y3QgcyB7CisgICAgdW5zaWduZWQgaSA6IDMxOworICAgIGNoYXIg eCA6IDI7CisgICAgY2hhciBhIDogNDsKK307CisKKyNkZWZpbmUgTiAzMgorI2RlZmluZSBW IDUKK3N0cnVjdCBzIEFbTl07CisKK3ZvaWQgX19hdHRyaWJ1dGVfXyAoKG5vaXBhKSkKK2Yo c3RydWN0IHMgKnB0ciwgdW5zaWduZWQgbikgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwg bjsgKytpKQorICAgICAgcHRyW2ldLmEgPSBWOworfQorCit2b2lkIF9fYXR0cmlidXRlX18g KChub2lwYSkpCitjaGVja19mKHN0cnVjdCBzICpwdHIpIHsKKyAgICBmb3IgKHVuc2lnbmVk IGkgPSAwOyBpIDwgTjsgKytpKQorICAgICAgaWYgKHB0cltpXS5hICE9IFYpCisJYWJvcnQg KCk7Cit9CisKK2ludCBtYWluICh2b2lkKQoreworICBjaGVja192ZWN0ICgpOworICBfX2J1 aWx0aW5fbWVtc2V0ICgmQVswXSwgMCwgc2l6ZW9mKHN0cnVjdCBzKSAqIE4pOworCisgIGYo JkFbMF0sIE4pOworICBjaGVja19mICgmQVswXSk7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8q IHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyAidmVjdG9yaXplZCAxIGxvb3Bz IiAxICJ2ZWN0IiB9IH0gKi8KKwpkaWZmIC0tZ2l0IGEvZ2NjL3RyZWUtaWYtY29udi5jYyBi L2djYy90cmVlLWlmLWNvbnYuY2MKaW5kZXggMWM4ZTFhNDUyMzRiOGMzNTY1ZWRhYWNkNTVh YmJlZTIzZDhlYTI0MC4uYzVjNmQ5MzdhNjQ1ZTljYWEwMDkyYzk0MWM1MmM1MTkyMzYzYmJk NyAxMDA2NDQKLS0tIGEvZ2NjL3RyZWUtaWYtY29udi5jYworKysgYi9nY2MvdHJlZS1pZi1j b252LmNjCkBAIC05MSw2ICs5MSw3IEBAIGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUg Q09QWUlORzMuICBJZiBub3Qgc2VlCiAjaW5jbHVkZSAidHJlZS1wYXNzLmgiCiAjaW5jbHVk ZSAic3NhLmgiCiAjaW5jbHVkZSAiZXhwbWVkLmgiCisjaW5jbHVkZSAiZXhwci5oIgogI2lu Y2x1ZGUgIm9wdGFicy1xdWVyeS5oIgogI2luY2x1ZGUgImdpbXBsZS1wcmV0dHktcHJpbnQu aCIKICNpbmNsdWRlICJhbGlhcy5oIgpAQCAtMTIzLDYgKzEyNCw5IEBAIGFsb25nIHdpdGgg R0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCiAjaW5jbHVkZSAidHJl ZS12ZWN0b3JpemVyLmgiCiAjaW5jbHVkZSAidHJlZS1laC5oIgogCisvKiBGb3IgbGFuZ19o b29rcy50eXBlcy50eXBlX2Zvcl9tb2RlLiAgKi8KKyNpbmNsdWRlICJsYW5naG9va3MuaCIK KwogLyogT25seSBoYW5kbGUgUEhJcyB3aXRoIG5vIG1vcmUgYXJndW1lbnRzIHVubGVzcyB3 ZSBhcmUgYXNrZWQgdG8gYnkKICAgIHNpbWQgcHJhZ21hLiAgKi8KICNkZWZpbmUgTUFYX1BI SV9BUkdfTlVNIFwKQEAgLTE0NSw2ICsxNDksMTIgQEAgc3RhdGljIGJvb2wgbmVlZF90b19y ZXdyaXRlX3VuZGVmaW5lZDsKICAgIGJlZm9yZSBwaGlfY29udmVydGlibGVfYnlfZGVnZW5l cmF0aW5nX2FyZ3MuICAqLwogc3RhdGljIGJvb2wgYW55X2NvbXBsaWNhdGVkX3BoaTsKIAor LyogVHJ1ZSBpZiB3ZSBoYXZlIGJpdGZpZWxkIGFjY2Vzc2VzIHdlIGNhbiBsb3dlci4gICov CitzdGF0aWMgYm9vbCBuZWVkX3RvX2xvd2VyX2JpdGZpZWxkczsKKworLyogVHJ1ZSBpZiB0 aGVyZSBpcyBhbnkgaWZjdnRpbmcgdG8gYmUgZG9uZS4gICovCitzdGF0aWMgYm9vbCBuZWVk X3RvX2lmY3Z0OworCiAvKiBIYXNoIGZvciBzdHJ1Y3QgaW5uZXJtb3N0X2xvb3BfYmVoYXZp b3IuICBJdCBkZXBlbmRzIG9uIHRoZSB1c2VyIHRvCiAgICBmcmVlIHRoZSBtZW1vcnkuICAq LwogCkBAIC0xNDExLDE1ICsxNDIxLDYgQEAgaWZfY29udmVydGlibGVfbG9vcF9wXzEgKGNs YXNzIGxvb3AgKmxvb3AsIHZlYzxkYXRhX3JlZmVyZW5jZV9wPiAqcmVmcykKIAogICBjYWxj dWxhdGVfZG9taW5hbmNlX2luZm8gKENESV9ET01JTkFUT1JTKTsKIAotICAvKiBBbGxvdyBz dGF0ZW1lbnRzIHRoYXQgY2FuIGJlIGhhbmRsZWQgZHVyaW5nIGlmLWNvbnZlcnNpb24uICAq LwotICBpZmNfYmJzID0gZ2V0X2xvb3BfYm9keV9pbl9pZl9jb252X29yZGVyIChsb29wKTsK LSAgaWYgKCFpZmNfYmJzKQotICAgIHsKLSAgICAgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBf ZmxhZ3MgJiBUREZfREVUQUlMUykpCi0JZnByaW50ZiAoZHVtcF9maWxlLCAiSXJyZWR1Y2li bGUgbG9vcFxuIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCiAgIGZvciAoaSA9 IDA7IGkgPCBsb29wLT5udW1fbm9kZXM7IGkrKykKICAgICB7CiAgICAgICBiYXNpY19ibG9j ayBiYiA9IGlmY19iYnNbaV07CkBAIC0yODk4LDE4ICsyODk5LDIyIEBAIHZlcnNpb25fbG9v cF9mb3JfaWZfY29udmVyc2lvbiAoY2xhc3MgbG9vcCAqbG9vcCwgdmVjPGdpbXBsZSAqPiAq cHJlZHMpCiAgIGNsYXNzIGxvb3AgKm5ld19sb29wOwogICBnaW1wbGUgKmc7CiAgIGdpbXBs ZV9zdG10X2l0ZXJhdG9yIGdzaTsKLSAgdW5zaWduZWQgaW50IHNhdmVfbGVuZ3RoOworICB1 bnNpZ25lZCBpbnQgc2F2ZV9sZW5ndGggPSAwOwogCiAgIGcgPSBnaW1wbGVfYnVpbGRfY2Fs bF9pbnRlcm5hbCAoSUZOX0xPT1BfVkVDVE9SSVpFRCwgMiwKIAkJCQkgIGJ1aWxkX2ludF9j c3QgKGludGVnZXJfdHlwZV9ub2RlLCBsb29wLT5udW0pLAogCQkJCSAgaW50ZWdlcl96ZXJv X25vZGUpOwogICBnaW1wbGVfY2FsbF9zZXRfbGhzIChnLCBjb25kKTsKIAotICAvKiBTYXZl IEJCLT5hdXggYXJvdW5kIGxvb3BfdmVyc2lvbiBhcyB0aGF0IHVzZXMgdGhlIHNhbWUgZmll bGQuICAqLwotICBzYXZlX2xlbmd0aCA9IGxvb3AtPmlubmVyID8gbG9vcC0+aW5uZXItPm51 bV9ub2RlcyA6IGxvb3AtPm51bV9ub2RlczsKLSAgdm9pZCAqKnNhdmVkX3ByZWRzID0gWEFM TE9DQVZFQyAodm9pZCAqLCBzYXZlX2xlbmd0aCk7Ci0gIGZvciAodW5zaWduZWQgaSA9IDA7 IGkgPCBzYXZlX2xlbmd0aDsgaSsrKQotICAgIHNhdmVkX3ByZWRzW2ldID0gaWZjX2Jic1tp XS0+YXV4OworICB2b2lkICoqc2F2ZWRfcHJlZHMgPSBOVUxMOworICBpZiAoYW55X2NvbXBs aWNhdGVkX3BoaSB8fCBuZWVkX3RvX3ByZWRpY2F0ZSkKKyAgICB7CisgICAgICAvKiBTYXZl IEJCLT5hdXggYXJvdW5kIGxvb3BfdmVyc2lvbiBhcyB0aGF0IHVzZXMgdGhlIHNhbWUgZmll bGQuICAqLworICAgICAgc2F2ZV9sZW5ndGggPSBsb29wLT5pbm5lciA/IGxvb3AtPmlubmVy LT5udW1fbm9kZXMgOiBsb29wLT5udW1fbm9kZXM7CisgICAgICBzYXZlZF9wcmVkcyA9IFhB TExPQ0FWRUMgKHZvaWQgKiwgc2F2ZV9sZW5ndGgpOworICAgICAgZm9yICh1bnNpZ25lZCBp ID0gMDsgaSA8IHNhdmVfbGVuZ3RoOyBpKyspCisJc2F2ZWRfcHJlZHNbaV0gPSBpZmNfYmJz W2ldLT5hdXg7CisgICAgfQogCiAgIGluaXRpYWxpemVfb3JpZ2luYWxfY29weV90YWJsZXMg KCk7CiAgIC8qIEF0IHRoaXMgcG9pbnQgd2UgaW52YWxpZGF0ZSBwb3JmaWxlIGNvbmZpc3Rl bmN5IHVudGlsIElGTl9MT09QX1ZFQ1RPUklaRUQKQEAgLTI5MjEsOCArMjkyNiw5IEBAIHZl cnNpb25fbG9vcF9mb3JfaWZfY29udmVyc2lvbiAoY2xhc3MgbG9vcCAqbG9vcCwgdmVjPGdp bXBsZSAqPiAqcHJlZHMpCiAJCQkgICBwcm9maWxlX3Byb2JhYmlsaXR5OjphbHdheXMgKCks IHRydWUpOwogICBmcmVlX29yaWdpbmFsX2NvcHlfdGFibGVzICgpOwogCi0gIGZvciAodW5z aWduZWQgaSA9IDA7IGkgPCBzYXZlX2xlbmd0aDsgaSsrKQotICAgIGlmY19iYnNbaV0tPmF1 eCA9IHNhdmVkX3ByZWRzW2ldOworICBpZiAoYW55X2NvbXBsaWNhdGVkX3BoaSB8fCBuZWVk X3RvX3ByZWRpY2F0ZSkKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2F2ZV9sZW5n dGg7IGkrKykKKyAgICAgIGlmY19iYnNbaV0tPmF1eCA9IHNhdmVkX3ByZWRzW2ldOwogCiAg IGlmIChuZXdfbG9vcCA9PSBOVUxMKQogICAgIHJldHVybiBOVUxMOwpAQCAtMjk5OCw3ICsz MDA0LDcgQEAgaWZjdnRfc3BsaXRfY3JpdGljYWxfZWRnZXMgKGNsYXNzIGxvb3AgKmxvb3As IGJvb2wgYWdncmVzc2l2ZV9pZl9jb252KQogICBhdXRvX3ZlYzxlZGdlPiBjcml0aWNhbF9l ZGdlczsKIAogICAvKiBMb29wIGlzIG5vdCB3ZWxsIGZvcm1lZC4gICovCi0gIGlmIChudW0g PD0gMiB8fCBsb29wLT5pbm5lciB8fCAhc2luZ2xlX2V4aXQgKGxvb3ApKQorICBpZiAobG9v cC0+aW5uZXIpCiAgICAgcmV0dXJuIGZhbHNlOwogCiAgIGJvZHkgPSBnZXRfbG9vcF9ib2R5 IChsb29wKTsKQEAgLTMyNTksNiArMzI2NSwyMDAgQEAgaWZjdnRfaG9pc3RfaW52YXJpYW50 cyAoY2xhc3MgbG9vcCAqbG9vcCwgZWRnZSBwZSkKICAgZnJlZSAoYm9keSk7CiB9CiAKKy8q IFJldHVybnMgdGhlIERFQ0xfRklFTERfQklUX09GRlNFVCBvZiB0aGUgYml0ZmllbGQgYWNj ZXNzZSBpbiBzdG10IGlmZiBpdHMKKyAgIHR5cGUgbW9kZSBpcyBub3QgQkxLbW9kZS4gIElm IEJJVFBPUyBpcyBub3QgTlVMTCBpdCB3aWxsIGhvbGQgdGhlIHBvbHlfaW50NjQKKyAgIHZh bHVlIG9mIHRoZSBERUNMX0ZJRUxEX0JJVF9PRkZTRVQgb2YgdGhlIGJpdGZpZWxkIGFjY2Vz cyBhbmQgU1RSVUNUX0VYUFIsCisgICBpZiBub3QgTlVMTCwgd2lsbCBob2xkIHRoZSB0cmVl IHJlcHJlc2VudGluZyB0aGUgYmFzZSBzdHJ1Y3Qgb2YgdGhpcworICAgYml0ZmllbGQuICAq LworCitzdGF0aWMgdHJlZQorZ2V0X2JpdGZpZWxkX3JlcCAoZ2Fzc2lnbiAqc3RtdCwgYm9v bCB3cml0ZSwgdHJlZSAqYml0cG9zLAorCQkgIHRyZWUgKnN0cnVjdF9leHByKQoreworICB0 cmVlIGNvbXBfcmVmID0gd3JpdGUgPyBnaW1wbGVfYXNzaWduX2xocyAoc3RtdCkKKwkJCTog Z2ltcGxlX2Fzc2lnbl9yaHMxIChzdG10KTsKKworICB0cmVlIGZpZWxkX2RlY2wgPSBUUkVF X09QRVJBTkQgKGNvbXBfcmVmLCAxKTsKKyAgdHJlZSByZXBfZGVjbCA9IERFQ0xfQklUX0ZJ RUxEX1JFUFJFU0VOVEFUSVZFIChmaWVsZF9kZWNsKTsKKworICAvKiBCYWlsIG91dCBpZiB0 aGUgcmVwcmVzZW50YXRpdmUgaXMgQkxLbW9kZSBhcyB3ZSB3aWxsIG5vdCBiZSBhYmxlIHRv CisgICAgIHZlY3Rvcml6ZSB0aGlzLiAgKi8KKyAgaWYgKFRZUEVfTU9ERSAoVFJFRV9UWVBF IChyZXBfZGVjbCkpID09IEVfQkxLbW9kZSkKKyAgICByZXR1cm4gTlVMTF9UUkVFOworCisg IC8qIEJhaWwgb3V0IGlmIHRoZSBERUNMX1NJWkUgb2YgdGhlIGZpZWxkX2RlY2wgaXNuJ3Qg dGhlIHNhbWUgYXMgdGhlIEJGJ3MKKyAgICAgcHJlY2lzaW9uLiAgKi8KKyAgdW5zaWduZWQg SE9TVF9XSURFX0lOVCBkZWNsX3NpemUgPSB0cmVlX3RvX3Vod2kgKERFQ0xfU0laRSAoZmll bGRfZGVjbCkpOworICBpZiAoVFlQRV9QUkVDSVNJT04gKFRSRUVfVFlQRSAoZ2ltcGxlX2Fz c2lnbl9saHMgKHN0bXQpKSkgIT0gZGVjbF9zaXplKQorICAgIHJldHVybiBOVUxMX1RSRUU7 CisKKyAgaWYgKHN0cnVjdF9leHByKQorICAgICpzdHJ1Y3RfZXhwciA9IFRSRUVfT1BFUkFO RCAoY29tcF9yZWYsIDApOworCisgIGlmIChiaXRwb3MpCisgICAgKmJpdHBvcworICAgICAg PSBmb2xkX2J1aWxkMiAoTUlOVVNfRVhQUiwgYml0c2l6ZXR5cGUsCisJCSAgICAgREVDTF9G SUVMRF9CSVRfT0ZGU0VUIChmaWVsZF9kZWNsKSwKKwkJICAgICBERUNMX0ZJRUxEX0JJVF9P RkZTRVQgKHJlcF9kZWNsKSk7CisKKyAgcmV0dXJuIHJlcF9kZWNsOworCit9CisKKy8qIExv d2VycyB0aGUgYml0ZmllbGQgZGVzY3JpYmVkIGJ5IERBVEEuCisgICBGb3IgYSB3cml0ZSBs aWtlOgorCisgICBzdHJ1Y3QuYmYgPSBfMTsKKworICAgbG93ZXIgdG86CisKKyAgIF9faWZj XzEgPSBzdHJ1Y3QuPHJlcHJlc2VudGF0aXZlPjsKKyAgIF9faWZjXzIgPSBCSVRfSU5TRVJU X0VYUFIgKF9faWZjXzEsIF8xLCBiaXRwb3MpOworICAgc3RydWN0LjxyZXByZXNlbnRhdGl2 ZT4gPSBfX2lmY18yOworCisgICBGb3IgYSByZWFkOgorCisgICBfMSA9IHN0cnVjdC5iZjsK KworICAgIGxvd2VyIHRvOgorCisgICAgX19pZmNfMSA9IHN0cnVjdC48cmVwcmVzZW50YXRp dmU+OworICAgIF8xID0gIEJJVF9GSUVMRF9SRUYgKF9faWZjXzEsIGJpdHNpemUsIGJpdHBv cyk7CisKKyAgICB3aGVyZSByZXByZXNlbnRhdGl2ZSBpcyBhIGxlZ2FsIGxvYWQgdGhhdCBj b250YWlucyB0aGUgYml0ZmllbGQgdmFsdWUsCisgICAgYml0c2l6ZSBpcyB0aGUgc2l6ZSBv ZiB0aGUgYml0ZmllbGQgYW5kIGJpdHBvcyB0aGUgb2Zmc2V0IHRvIHRoZSBzdGFydCBvZgor ICAgIHRoZSBiaXRmaWVsZCB3aXRoaW4gdGhlIHJlcHJlc2VudGF0aXZlLiAgKi8KKworc3Rh dGljIHZvaWQKK2xvd2VyX2JpdGZpZWxkIChnYXNzaWduICpzdG10LCBib29sIHdyaXRlKQor eworICB0cmVlIHN0cnVjdF9leHByOworICB0cmVlIGJpdHBvczsKKyAgdHJlZSByZXBfZGVj bCA9IGdldF9iaXRmaWVsZF9yZXAgKHN0bXQsIHdyaXRlLCAmYml0cG9zLCAmc3RydWN0X2V4 cHIpOworICB0cmVlIHJlcF90eXBlID0gVFJFRV9UWVBFIChyZXBfZGVjbCk7CisgIHRyZWUg YmZfdHlwZSA9IFRSRUVfVFlQRSAoZ2ltcGxlX2Fzc2lnbl9saHMgKHN0bXQpKTsKKworICBn aW1wbGVfc3RtdF9pdGVyYXRvciBnc2kgPSBnc2lfZm9yX3N0bXQgKHN0bXQpOworICBpZiAo ZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQorICAgIHsKKyAgICAg IGZwcmludGYgKGR1bXBfZmlsZSwgIkxvd2VyaW5nOlxuIik7CisgICAgICBwcmludF9naW1w bGVfc3RtdCAoZHVtcF9maWxlLCBzdG10LCAwLCBUREZfU0xJTSk7CisgICAgICBmcHJpbnRm IChkdW1wX2ZpbGUsICJ0bzpcbiIpOworICAgIH0KKworICAvKiBSRVBfQ09NUF9SRUYgaXMg YSBDT01QT05FTlRfUkVGIGZvciB0aGUgcmVwcmVzZW50YXRpdmUuICBORVdfVkFMIGlzIGl0 J3MKKyAgICAgZGVmaW5pbmcgU1NBX05BTUUuICAqLworICB0cmVlIHJlcF9jb21wX3JlZiA9 IGJ1aWxkMyAoQ09NUE9ORU5UX1JFRiwgcmVwX3R5cGUsIHN0cnVjdF9leHByLCByZXBfZGVj bCwKKwkJCSAgICAgIE5VTExfVFJFRSk7CisgIHRyZWUgbmV3X3ZhbCA9IGlmY190ZW1wX3Zh ciAocmVwX3R5cGUsIHJlcF9jb21wX3JlZiwgJmdzaSk7CisKKyAgaWYgKGR1bXBfZmlsZSAm JiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkKKyAgICBwcmludF9naW1wbGVfc3RtdCAo ZHVtcF9maWxlLCBTU0FfTkFNRV9ERUZfU1RNVCAobmV3X3ZhbCksIDAsIFRERl9TTElNKTsK KworICBpZiAod3JpdGUpCisgICAgeworICAgICAgbmV3X3ZhbCA9IGlmY190ZW1wX3ZhciAo cmVwX3R5cGUsCisJCQkgICAgICBidWlsZDMgKEJJVF9JTlNFUlRfRVhQUiwgcmVwX3R5cGUs IG5ld192YWwsCisJCQkJICAgICAgdW5zaGFyZV9leHByIChnaW1wbGVfYXNzaWduX3JoczEg KHN0bXQpKSwKKwkJCQkgICAgICBiaXRwb3MpLCAmZ3NpKTsKKworICAgICAgaWYgKGR1bXBf ZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkKKwlwcmludF9naW1wbGVfc3Rt dCAoZHVtcF9maWxlLCBTU0FfTkFNRV9ERUZfU1RNVCAobmV3X3ZhbCksIDAsIFRERl9TTElN KTsKKworICAgICAgZ2ltcGxlICpuZXdfc3RtdCA9IGdpbXBsZV9idWlsZF9hc3NpZ24gKHVu c2hhcmVfZXhwciAocmVwX2NvbXBfcmVmKSwKKwkJCQkJICAgICAgbmV3X3ZhbCk7CisgICAg ICBnaW1wbGVfc2V0X3Z1c2UgKG5ld19zdG10LCBnaW1wbGVfdnVzZSAoc3RtdCkpOworICAg ICAgdHJlZSB2ZGVmID0gZ2ltcGxlX3ZkZWYgKHN0bXQpOworICAgICAgZ2ltcGxlX3NldF92 ZGVmIChuZXdfc3RtdCwgdmRlZik7CisgICAgICBTU0FfTkFNRV9ERUZfU1RNVCAodmRlZikg PSBuZXdfc3RtdDsKKyAgICAgIGdzaV9pbnNlcnRfYmVmb3JlICgmZ3NpLCBuZXdfc3RtdCwg R1NJX1NBTUVfU1RNVCk7CisKKyAgICAgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3Mg JiBUREZfREVUQUlMUykpCisJcHJpbnRfZ2ltcGxlX3N0bXQgKGR1bXBfZmlsZSwgbmV3X3N0 bXQsIDAsIFRERl9TTElNKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB0cmVlIGJm ciA9IGJ1aWxkMyAoQklUX0ZJRUxEX1JFRiwgYmZfdHlwZSwgbmV3X3ZhbCwKKwkJCSBidWls ZF9pbnRfY3N0IChiaXRzaXpldHlwZSwgVFlQRV9QUkVDSVNJT04gKGJmX3R5cGUpKSwKKwkJ CSBiaXRwb3MpOworICAgICAgbmV3X3ZhbCA9IGlmY190ZW1wX3ZhciAoYmZfdHlwZSwgYmZy LCAmZ3NpKTsKKyAgICAgIHJlZHVuZGFudF9zc2FfbmFtZXMuc2FmZV9wdXNoIChzdGQ6Om1h a2VfcGFpciAoZ2ltcGxlX2Fzc2lnbl9saHMgKHN0bXQpLAorCQkJCQkJICAgICBuZXdfdmFs KSk7CisKKyAgICAgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlM UykpCisJcHJpbnRfZ2ltcGxlX3N0bXQgKGR1bXBfZmlsZSwgU1NBX05BTUVfREVGX1NUTVQg KG5ld192YWwpLCAwLCBUREZfU0xJTSk7CisgICAgfQorCisgIGdzaV9yZW1vdmUgKCZnc2ks IHRydWUpOworfQorCisvKiBSZXR1cm4gVFJVRSBpZiB0aGVyZSBhcmUgYml0ZmllbGRzIHRv IGxvd2VyIGluIHRoaXMgTE9PUC4gIEZpbGwgVE9fTE9XRVIKKyAgIHdpdGggZGF0YSBzdHJ1 Y3R1cmVzIHJlcHJlc2VudGluZyB0aGVzZSBiaXRmaWVsZHMuICAqLworCitzdGF0aWMgYm9v bAorYml0ZmllbGRzX3RvX2xvd2VyX3AgKGNsYXNzIGxvb3AgKmxvb3AsCisJCSAgICAgIHZl YyA8Z2Fzc2lnbiAqPiAmcmVhZHNfdG9fbG93ZXIsCisJCSAgICAgIHZlYyA8Z2Fzc2lnbiAq PiAmd3JpdGVzX3RvX2xvd2VyKQoreworICBnaW1wbGVfc3RtdF9pdGVyYXRvciBnc2k7CisK KyAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkKKyAgICB7 CisgICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICJBbmFseXppbmcgbG9vcCAlZCBmb3IgYml0 ZmllbGRzOlxuIiwgbG9vcC0+bnVtKTsKKyAgICB9CisKKyAgZm9yICh1bnNpZ25lZCBpID0g MDsgaSA8IGxvb3AtPm51bV9ub2RlczsgKytpKQorICAgIHsKKyAgICAgIGJhc2ljX2Jsb2Nr IGJiID0gaWZjX2Jic1tpXTsKKyAgICAgIGZvciAoZ3NpID0gZ3NpX3N0YXJ0X2JiIChiYik7 ICFnc2lfZW5kX3AgKGdzaSk7IGdzaV9uZXh0ICgmZ3NpKSkKKwl7CisJICBnYXNzaWduICpz dG10ID0gZHluX2Nhc3Q8Z2Fzc2lnbio+IChnc2lfc3RtdCAoZ3NpKSk7CisJICBpZiAoIXN0 bXQpCisJICAgIGNvbnRpbnVlOworCisJICB0cmVlIG9wID0gZ2ltcGxlX2Fzc2lnbl9saHMg KHN0bXQpOworCSAgYm9vbCB3cml0ZSA9IFRSRUVfQ09ERSAob3ApID09IENPTVBPTkVOVF9S RUY7CisKKwkgIGlmICghd3JpdGUpCisJICAgIG9wID0gZ2ltcGxlX2Fzc2lnbl9yaHMxIChz dG10KTsKKworCSAgaWYgKFRSRUVfQ09ERSAob3ApICE9IENPTVBPTkVOVF9SRUYpCisJICAg IGNvbnRpbnVlOworCisJICBpZiAoREVDTF9CSVRfRklFTERfVFlQRSAoVFJFRV9PUEVSQU5E IChvcCwgMSkpKQorCSAgICB7CisJICAgICAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFn cyAmIFRERl9ERVRBSUxTKSkKKwkJcHJpbnRfZ2ltcGxlX3N0bXQgKGR1bXBfZmlsZSwgc3Rt dCwgMCwgVERGX1NMSU0pOworCisJICAgICAgaWYgKCFJTlRFR1JBTF9UWVBFX1AgKFRSRUVf VFlQRSAob3ApKSkKKwkJeworCQkgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBU REZfREVUQUlMUykpCisJCSAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICJcdCBCaXRmaWVsZCBO TyBPSyB0byBsb3dlciwiCisJCQkJCSIgZmllbGQgdHlwZSBpcyBub3QgSW50ZWdyYWwuXG4i KTsKKwkJICByZXR1cm4gZmFsc2U7CisJCX0KKworCSAgICAgIGlmICghZ2V0X2JpdGZpZWxk X3JlcCAoc3RtdCwgd3JpdGUsIE5VTEwsIE5VTEwpKQorCQl7CisJCSAgaWYgKGR1bXBfZmls ZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkKKwkJICAgIGZwcmludGYgKGR1bXBf ZmlsZSwgIlx0IEJpdGZpZWxkIE5PVCBPSyB0byBsb3dlciwiCisJCQkJCSIgcmVwcmVzZW50 YXRpdmUgaXMgQkxLbW9kZS5cbiIpOworCQkgIHJldHVybiBmYWxzZTsKKwkJfQorCisJICAg ICAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkKKwkJZnBy aW50ZiAoZHVtcF9maWxlLCAiXHRCaXRmaWVsZCBPSyB0byBsb3dlci5cbiIpOworCSAgICAg IGlmICh3cml0ZSkKKwkJd3JpdGVzX3RvX2xvd2VyLnNhZmVfcHVzaCAoc3RtdCk7CisJICAg ICAgZWxzZQorCQlyZWFkc190b19sb3dlci5zYWZlX3B1c2ggKHN0bXQpOworCSAgICB9CisJ fQorICAgIH0KKyAgcmV0dXJuICFyZWFkc190b19sb3dlci5pc19lbXB0eSAoKSB8fCAhd3Jp dGVzX3RvX2xvd2VyLmlzX2VtcHR5ICgpOworfQorCisKIC8qIElmLWNvbnZlcnQgTE9PUCB3 aGVuIGl0IGlzIGxlZ2FsLiAgRm9yIHRoZSBtb21lbnQgdGhpcyBwYXNzIGhhcyBubwogICAg cHJvZml0YWJpbGl0eSBhbmFseXNpcy4gIFJldHVybnMgbm9uLXplcm8gdG9kbyBmbGFncyB3 aGVuIHNvbWV0aGluZwogICAgY2hhbmdlZC4gICovCkBAIC0zMjY5LDEyICszNDY5LDE2IEBA IHRyZWVfaWZfY29udmVyc2lvbiAoY2xhc3MgbG9vcCAqbG9vcCwgdmVjPGdpbXBsZSAqPiAq cHJlZHMpCiAgIHVuc2lnbmVkIGludCB0b2RvID0gMDsKICAgYm9vbCBhZ2dyZXNzaXZlX2lm X2NvbnY7CiAgIGNsYXNzIGxvb3AgKnJsb29wOworICBhdXRvX3ZlYyA8Z2Fzc2lnbiAqLCA0 PiByZWFkc190b19sb3dlcjsKKyAgYXV0b192ZWMgPGdhc3NpZ24gKiwgND4gd3JpdGVzX3Rv X2xvd2VyOwogICBiaXRtYXAgZXhpdF9iYnM7CiAgIGVkZ2UgcGU7CiAKICBhZ2FpbjoKICAg cmxvb3AgPSBOVUxMOwogICBpZmNfYmJzID0gTlVMTDsKKyAgbmVlZF90b19sb3dlcl9iaXRm aWVsZHMgPSBmYWxzZTsKKyAgbmVlZF90b19pZmN2dCA9IGZhbHNlOwogICBuZWVkX3RvX3By ZWRpY2F0ZSA9IGZhbHNlOwogICBuZWVkX3RvX3Jld3JpdGVfdW5kZWZpbmVkID0gZmFsc2U7 CiAgIGFueV9jb21wbGljYXRlZF9waGkgPSBmYWxzZTsKQEAgLTMyOTAsMTYgKzM0OTQsNDAg QEAgdHJlZV9pZl9jb252ZXJzaW9uIChjbGFzcyBsb29wICpsb29wLCB2ZWM8Z2ltcGxlICo+ ICpwcmVkcykKIAlhZ2dyZXNzaXZlX2lmX2NvbnYgPSB0cnVlOwogICAgIH0KIAotICBpZiAo IWlmY3Z0X3NwbGl0X2NyaXRpY2FsX2VkZ2VzIChsb29wLCBhZ2dyZXNzaXZlX2lmX2NvbnYp KQorICBpZiAoIXNpbmdsZV9leGl0IChsb29wKSkKICAgICBnb3RvIGNsZWFudXA7CiAKLSAg aWYgKCFpZl9jb252ZXJ0aWJsZV9sb29wX3AgKGxvb3ApCi0gICAgICB8fCAhZGJnX2NudCAo aWZfY29udmVyc2lvbl90cmVlKSkKKyAgLyogSWYgdGhlcmUgYXJlIG1vcmUgdGhhbiB0d28g QkJzIGluIHRoZSBsb29wIHRoZW4gdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGlmCisgICAgIHRv IGNvbnZlcnQuICAqLworICBpZiAobG9vcC0+bnVtX25vZGVzID4gMgorICAgICAgJiYgIWlm Y3Z0X3NwbGl0X2NyaXRpY2FsX2VkZ2VzIChsb29wLCBhZ2dyZXNzaXZlX2lmX2NvbnYpKQog ICAgIGdvdG8gY2xlYW51cDsKIAotICBpZiAoKG5lZWRfdG9fcHJlZGljYXRlIHx8IGFueV9j b21wbGljYXRlZF9waGkpCi0gICAgICAmJiAoKCFmbGFnX3RyZWVfbG9vcF92ZWN0b3JpemUg JiYgIWxvb3AtPmZvcmNlX3ZlY3Rvcml6ZSkKLQkgIHx8IGxvb3AtPmRvbnRfdmVjdG9yaXpl KSkKKyAgaWZjX2JicyA9IGdldF9sb29wX2JvZHlfaW5faWZfY29udl9vcmRlciAobG9vcCk7 CisgIGlmICghaWZjX2JicykKKyAgICB7CisgICAgICBpZiAoZHVtcF9maWxlICYmIChkdW1w X2ZsYWdzICYgVERGX0RFVEFJTFMpKQorCWZwcmludGYgKGR1bXBfZmlsZSwgIklycmVkdWNp YmxlIGxvb3BcbiIpOworICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKworICBpZiAobG9v cC0+bnVtX25vZGVzID4gMikKKyAgICB7CisgICAgICBuZWVkX3RvX2lmY3Z0ID0gdHJ1ZTsK KworICAgICAgaWYgKCFpZl9jb252ZXJ0aWJsZV9sb29wX3AgKGxvb3ApIHx8ICFkYmdfY250 IChpZl9jb252ZXJzaW9uX3RyZWUpKQorCWdvdG8gY2xlYW51cDsKKworICAgICAgaWYgKChu ZWVkX3RvX3ByZWRpY2F0ZSB8fCBhbnlfY29tcGxpY2F0ZWRfcGhpKQorCSAgJiYgKCghZmxh Z190cmVlX2xvb3BfdmVjdG9yaXplICYmICFsb29wLT5mb3JjZV92ZWN0b3JpemUpCisJICAg ICAgfHwgbG9vcC0+ZG9udF92ZWN0b3JpemUpKQorCWdvdG8gY2xlYW51cDsKKyAgICB9CisK KyAgbmVlZF90b19sb3dlcl9iaXRmaWVsZHMgPSBiaXRmaWVsZHNfdG9fbG93ZXJfcCAobG9v cCwgcmVhZHNfdG9fbG93ZXIsCisJCQkJCQkgIHdyaXRlc190b19sb3dlcik7CisKKyAgaWYg KCFuZWVkX3RvX2lmY3Z0ICYmICFuZWVkX3RvX2xvd2VyX2JpdGZpZWxkcykKICAgICBnb3Rv IGNsZWFudXA7CiAKICAgLyogVGhlIGVkZ2UgdG8gaW5zZXJ0IGludmFyaWFudCBzdG10cyBv bi4gICovCkBAIC0zMzEwLDcgKzM1MzgsOCBAQCB0cmVlX2lmX2NvbnZlcnNpb24gKGNsYXNz IGxvb3AgKmxvb3AsIHZlYzxnaW1wbGUgKj4gKnByZWRzKQogICAgICBFaXRoZXIgdmVyc2lv biB0aGlzIGxvb3AsIG9yIGlmIHRoZSBwYXR0ZXJuIGlzIHJpZ2h0IGZvciBvdXRlci1sb29w CiAgICAgIHZlY3Rvcml6YXRpb24sIHZlcnNpb24gdGhlIG91dGVyIGxvb3AuICBJbiB0aGUg bGF0dGVyIGNhc2Ugd2Ugd2lsbAogICAgICBzdGlsbCBpZi1jb252ZXJ0IHRoZSBvcmlnaW5h bCBpbm5lciBsb29wLiAgKi8KLSAgaWYgKG5lZWRfdG9fcHJlZGljYXRlCisgIGlmIChuZWVk X3RvX2xvd2VyX2JpdGZpZWxkcworICAgICAgfHwgbmVlZF90b19wcmVkaWNhdGUKICAgICAg IHx8IGFueV9jb21wbGljYXRlZF9waGkKICAgICAgIHx8IGZsYWdfdHJlZV9sb29wX2lmX2Nv bnZlcnQgIT0gMSkKICAgICB7CkBAIC0zMzUwLDEwICszNTc5LDMxIEBAIHRyZWVfaWZfY29u dmVyc2lvbiAoY2xhc3MgbG9vcCAqbG9vcCwgdmVjPGdpbXBsZSAqPiAqcHJlZHMpCiAJcGUg PSBzaW5nbGVfcHJlZF9lZGdlIChnaW1wbGVfYmIgKHByZWRzLT5sYXN0ICgpKSk7CiAgICAg fQogCi0gIC8qIE5vdyBhbGwgc3RhdGVtZW50cyBhcmUgaWYtY29udmVydGlibGUuICBDb21i aW5lIGFsbCB0aGUgYmFzaWMKLSAgICAgYmxvY2tzIGludG8gb25lIGh1Z2UgYmFzaWMgYmxv Y2sgZG9pbmcgdGhlIGlmLWNvbnZlcnNpb24KLSAgICAgb24tdGhlLWZseS4gICovCi0gIGNv bWJpbmVfYmxvY2tzIChsb29wKTsKKyAgaWYgKG5lZWRfdG9fbG93ZXJfYml0ZmllbGRzKQor ICAgIHsKKyAgICAgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlM UykpCisJeworCSAgZnByaW50ZiAoZHVtcF9maWxlLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLVxuIik7CisJICBmcHJpbnRmIChkdW1wX2ZpbGUsICJTdGFydCBsb3dlcmluZyBiaXRm aWVsZHNcbiIpOworCX0KKyAgICAgIHdoaWxlICghcmVhZHNfdG9fbG93ZXIuaXNfZW1wdHkg KCkpCisJbG93ZXJfYml0ZmllbGQgKHJlYWRzX3RvX2xvd2VyLnBvcCAoKSwgZmFsc2UpOwor ICAgICAgd2hpbGUgKCF3cml0ZXNfdG9fbG93ZXIuaXNfZW1wdHkgKCkpCisJbG93ZXJfYml0 ZmllbGQgKHdyaXRlc190b19sb3dlci5wb3AgKCksIHRydWUpOworCisgICAgICBpZiAoZHVt cF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQorCXsKKwkgIGZwcmludGYg KGR1bXBfZmlsZSwgIkRvbmUgbG93ZXJpbmcgYml0ZmllbGRzXG4iKTsKKwkgIGZwcmludGYg KGR1bXBfZmlsZSwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCX0KKyAgICB9 CisgIGlmIChuZWVkX3RvX2lmY3Z0KQorICAgIHsKKyAgICAgIC8qIE5vdyBhbGwgc3RhdGVt ZW50cyBhcmUgaWYtY29udmVydGlibGUuICBDb21iaW5lIGFsbCB0aGUgYmFzaWMKKwkgYmxv Y2tzIGludG8gb25lIGh1Z2UgYmFzaWMgYmxvY2sgZG9pbmcgdGhlIGlmLWNvbnZlcnNpb24K Kwkgb24tdGhlLWZseS4gICovCisgICAgICBjb21iaW5lX2Jsb2NrcyAobG9vcCk7CisgICAg fQogCiAgIC8qIFBlcmZvcm0gbG9jYWwgQ1NFLCB0aGlzIGVzcC4gaGVscHMgdGhlIHZlY3Rv cml6ZXIgYW5hbHlzaXMgaWYgbG9hZHMKICAgICAgYW5kIHN0b3JlcyBhcmUgaW52b2x2ZWQu ICBDU0Ugb25seSB0aGUgbG9vcCBib2R5LCBub3QgdGhlIGVudHJ5CkBAIC0zMzkzLDYgKzM2 NDMsOCBAQCB0cmVlX2lmX2NvbnZlcnNpb24gKGNsYXNzIGxvb3AgKmxvb3AsIHZlYzxnaW1w bGUgKj4gKnByZWRzKQogICBpZiAocmxvb3AgIT0gTlVMTCkKICAgICB7CiAgICAgICBsb29w ID0gcmxvb3A7CisgICAgICByZWFkc190b19sb3dlci50cnVuY2F0ZSAoMCk7CisgICAgICB3 cml0ZXNfdG9fbG93ZXIudHJ1bmNhdGUgKDApOwogICAgICAgZ290byBhZ2FpbjsKICAgICB9 CiAKZGlmZiAtLWdpdCBhL2djYy90cmVlLXZlY3QtZGF0YS1yZWZzLmNjIGIvZ2NjL3RyZWUt dmVjdC1kYXRhLXJlZnMuY2MKaW5kZXggYjI3OWE4MjU1MWViNzAzNzk4MDRkNDA1OTgzYWU1 ZGM0NGI2NmJmNS4uZTkzY2RjNzI3ZGE0YmI3ODYzYjJhZDEzZjI5ZjdkNTUwNDkyYWRlYSAx MDA2NDQKLS0tIGEvZ2NjL3RyZWUtdmVjdC1kYXRhLXJlZnMuY2MKKysrIGIvZ2NjL3RyZWUt dmVjdC1kYXRhLXJlZnMuY2MKQEAgLTQzMDEsNyArNDMwMSw4IEBAIHZlY3RfZmluZF9zdG10 X2RhdGFfcmVmZXJlbmNlIChsb29wX3AgbG9vcCwgZ2ltcGxlICpzdG10LAogICAgICAgZnJl ZV9kYXRhX3JlZiAoZHIpOwogICAgICAgcmV0dXJuIG9wdF9yZXN1bHQ6OmZhaWx1cmVfYXQg KHN0bXQsCiAJCQkJICAgICAibm90IHZlY3Rvcml6ZWQ6IgotCQkJCSAgICAgIiBzdGF0ZW1l bnQgaXMgYml0ZmllbGQgYWNjZXNzICVHIiwgc3RtdCk7CisJCQkJICAgICAiIHN0YXRlbWVu dCBpcyBhbiB1bnN1cHBvcnRlZCIKKwkJCQkgICAgICIgYml0ZmllbGQgYWNjZXNzICVHIiwg c3RtdCk7CiAgICAgfQogCiAgIGlmIChEUl9CQVNFX0FERFJFU1MgKGRyKQpkaWZmIC0tZ2l0 IGEvZ2NjL3RyZWUtdmVjdC1wYXR0ZXJucy5jYyBiL2djYy90cmVlLXZlY3QtcGF0dGVybnMu Y2MKaW5kZXggZGZiZmI3MWIzYzY5YTAyMDVjY2MxYjI4N2NiNTBmYTAyYTcwOTQyZS4uNzMx YjdjMmJjMTk2MmZmMjIyODhjNDQzOTY3OWMwYjExMjMyY2I0YSAxMDA2NDQKLS0tIGEvZ2Nj L3RyZWUtdmVjdC1wYXR0ZXJucy5jYworKysgYi9nY2MvdHJlZS12ZWN0LXBhdHRlcm5zLmNj CkBAIC0zNSw2ICszNSw4IEBAIGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlO RzMuICBJZiBub3Qgc2VlCiAjaW5jbHVkZSAidHJlZS1laC5oIgogI2luY2x1ZGUgImdpbXBs aWZ5LmgiCiAjaW5jbHVkZSAiZ2ltcGxlLWl0ZXJhdG9yLmgiCisjaW5jbHVkZSAiZ2ltcGxl LWZvbGQuaCIKKyNpbmNsdWRlICJnaW1wbGlmeS1tZS5oIgogI2luY2x1ZGUgImNmZ2xvb3Au aCIKICNpbmNsdWRlICJ0cmVlLXZlY3Rvcml6ZXIuaCIKICNpbmNsdWRlICJkdW1wZmlsZS5o IgpAQCAtMTgyOCw2ICsxODMwLDI5NCBAQCB2ZWN0X3JlY29nX3dpZGVuX3N1bV9wYXR0ZXJu ICh2ZWNfaW5mbyAqdmluZm8sCiAgIHJldHVybiBwYXR0ZXJuX3N0bXQ7CiB9CiAKKy8qIEZ1 bmN0aW9uIHZlY3RfcmVjb2dfYml0ZmllbGRfcmVmX3BhdHRlcm4KKworICAgVHJ5IHRvIGZp bmQgdGhlIGZvbGxvd2luZyBwYXR0ZXJuOgorCisgICBfMiA9IEJJVF9GSUVMRF9SRUYgKF8x LCBiaXRzaXplLCBiaXRwb3MpOworICAgXzMgPSAodHlwZV9vdXQpIF8yOworCisgICB3aGVy ZSB0eXBlX291dCBpcyBhIG5vbi1iaXRmaWVsZCB0eXBlLCB0aGF0IGlzIHRvIHNheSwgaXQn cyBwcmVjaXNpb24gbWF0Y2hlcworICAgMl4oVFlQRV9TSVpFKHR5cGVfb3V0KSAtIChUWVBF X1VOU0lHTkVEICh0eXBlX291dCkgPyAxIDogMikpLgorCisgICBJbnB1dDoKKworICAgKiBT VE1UX1ZJTkZPOiBUaGUgc3RtdCBmcm9tIHdoaWNoIHRoZSBwYXR0ZXJuIHNlYXJjaCBiZWdp bnMuCisgICBoZXJlIGl0IHN0YXJ0cyB3aXRoOgorICAgXzMgPSAodHlwZV9vdXQpIF8yOwor CisgICBPdXRwdXQ6CisKKyAgICogVFlQRV9PVVQ6IFRoZSB2ZWN0b3IgdHlwZSBvZiB0aGUg b3V0cHV0IG9mIHRoaXMgcGF0dGVybi4KKworICAgKiBSZXR1cm4gdmFsdWU6IEEgbmV3IHN0 bXQgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcmVwbGFjZSB0aGUgc2VxdWVuY2Ugb2YKKyAgIHN0 bXRzIHRoYXQgY29uc3RpdHV0ZSB0aGUgcGF0dGVybi4gSWYgdGhlIHByZWNpc2lvbiBvZiB0 eXBlX291dCBpcyBiaWdnZXIKKyAgIHRoYW4gdGhlIHByZWNpc2lvbiB0eXBlIG9mIF8xIHdl IHBlcmZvcm0gdGhlIHdpZGVuaW5nIGJlZm9yZSB0aGUgc2hpZnRpbmcsCisgICBzaW5jZSB0 aGUgbmV3IHByZWNpc2lvbiB3aWxsIGJlIGxhcmdlIGVub3VnaCB0byBzaGlmdCB0aGUgdmFs dWUgYW5kIG1vdmluZworICAgd2lkZW5pbmcgb3BlcmF0aW9ucyB1cCB0aGUgc3RhdGVtZW50 IGNoYWluIGVuYWJsZXMgdGhlIGdlbmVyYXRpb24gb2YKKyAgIHdpZGVuaW5nIGxvYWRzLiAg SWYgd2UgYXJlIHdpZGVuaW5nIGFuZCB0aGUgb3BlcmF0aW9uIGFmdGVyIHRoZSBwYXR0ZXJu IGlzCisgICBhbiBhZGRpdGlvbiB0aGVuIHdlIG1hc2sgZmlyc3QgYW5kIHNoaWZ0IGxhdGVy LCB0byBlbmFibGUgdGhlIGdlbmVyYXRpb24gb2YKKyAgIHNoaWZ0aW5nIGFkZHMuICBJbiB0 aGUgY2FzZSBvZiBuYXJyb3dpbmcgd2Ugd2lsbCBhbHdheXMgbWFzayBmaXJzdCwgc2hpZnQK KyAgIGxhc3QgYW5kIHRoZW4gcGVyZm9ybSBhIG5hcnJvd2luZyBvcGVyYXRpb24uICBUaGlz IHdpbGwgZW5hYmxlIHRoZQorICAgZ2VuZXJhdGlvbiBvZiBuYXJyb3dpbmcgc2hpZnRzLgor CisgICBXaWRlbmluZyB3aXRoIG1hc2sgZmlyc3QsIHNoaWZ0IGxhdGVyOgorICAgcGF0dDEg PSAodHlwZV9vdXQpIF8xOworICAgcGF0dDIgPSBwYXR0MSAmICgoKDEgPDwgYml0c2l6ZSkg LSAxKSA8PCBiaXRwb3MpOworICAgXzMgPSBwYXR0MiA+PiBiaXRwb3M7CisKKyAgIFdpZGVu aW5nIHdpdGggc2hpZnQgZmlyc3QsIG1hc2sgbGFzdDoKKyAgIHBhdHQxID0gKHR5cGVfb3V0 KSBfMTsKKyAgIHBhdHQyID0gcGF0dDEgPj4gYml0cG9zOworICAgXzMgPSBwYXR0MiAmICgo MSA8PGJpdHNpemUpIC0gMSk7CisKKyAgIE5hcnJvd2luZzoKKyAgIHBhdHQxID0gXzEgJiAo KCgxIDw8IGJpdHNpemUpIC0gMSkgPDwgYml0cG9zKTsKKyAgIHBhdHQyID0gcGF0dDEgPj4g Yml0cG9zOworICAgXzMgPSAodHlwZV9vdXQpIHBhdHQyOworCisgICBUaGUgc2hpZnRpbmcg aXMgYWx3YXlzIG9wdGlvbmFsIGRlcGVuZGluZyBvbiB3aGV0aGVyIGJpdHBvcyAhPSAwLgor CisqLworCitzdGF0aWMgZ2ltcGxlICoKK3ZlY3RfcmVjb2dfYml0ZmllbGRfcmVmX3BhdHRl cm4gKHZlY19pbmZvICp2aW5mbywgc3RtdF92ZWNfaW5mbyBzdG10X2luZm8sCisJCQkJIHRy ZWUgKnR5cGVfb3V0KQoreworICBnYXNzaWduICpmaXJzdF9zdG10ID0gZHluX2Nhc3QgPGdh c3NpZ24gKj4gKHN0bXRfaW5mby0+c3RtdCk7CisKKyAgaWYgKCFmaXJzdF9zdG10KQorICAg IHJldHVybiBOVUxMOworCisgIGdhc3NpZ24gKmJmX3N0bXQ7CisgIGlmIChDT05WRVJUX0VY UFJfQ09ERV9QIChnaW1wbGVfYXNzaWduX3Joc19jb2RlIChmaXJzdF9zdG10KSkKKyAgICAg ICYmIFRSRUVfQ09ERSAoZ2ltcGxlX2Fzc2lnbl9yaHMxIChmaXJzdF9zdG10KSkgPT0gU1NB X05BTUUpCisgICAgeworICAgICAgZ2ltcGxlICpzZWNvbmRfc3RtdAorCT0gU1NBX05BTUVf REVGX1NUTVQgKGdpbXBsZV9hc3NpZ25fcmhzMSAoZmlyc3Rfc3RtdCkpOworICAgICAgaWYg KCFzZWNvbmRfc3RtdCB8fCBnaW1wbGVfY29kZSAoc2Vjb25kX3N0bXQpICE9IEdJTVBMRV9B U1NJR04KKwkgIHx8IGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKHNlY29uZF9zdG10KSAhPSBC SVRfRklFTERfUkVGKQorCXJldHVybiBOVUxMOworICAgICAgYmZfc3RtdCA9IHN0YXRpY19j YXN0IDxnYXNzaWduICo+IChzZWNvbmRfc3RtdCk7CisgICAgfQorICBlbHNlCisgICAgcmV0 dXJuIE5VTEw7CisKKyAgdHJlZSBiZl9yZWYgPSBnaW1wbGVfYXNzaWduX3JoczEgKGJmX3N0 bXQpOworICB0cmVlIGxocyA9IFRSRUVfT1BFUkFORCAoYmZfcmVmLCAwKTsKKworICBpZiAo IUlOVEVHUkFMX1RZUEVfUCAoVFJFRV9UWVBFIChiZl9yZWYpKSkKKyAgICByZXR1cm4gTlVM TDsKKworICBnaW1wbGUgKnVzZV9zdG10LCAqcGF0dGVybl9zdG10OworICB1c2Vfb3BlcmFu ZF9wIHVzZV9wOworICB0cmVlIHJldCA9IGdpbXBsZV9hc3NpZ25fbGhzIChmaXJzdF9zdG10 KTsKKyAgdHJlZSByZXRfdHlwZSA9IFRSRUVfVFlQRSAocmV0KTsKKyAgYm9vbCBzaGlmdF9m aXJzdCA9IHRydWU7CisKKyAgLyogV2UgbW92ZSB0aGUgY29udmVyc2lvbiBlYXJsaWVyIGlm IHRoZSBsb2FkZWQgdHlwZSBpcyBzbWFsbGVyIHRoYW4gdGhlCisgICAgIHJldHVybiB0eXBl IHRvIGVuYWJsZSB0aGUgdXNlIG9mIHdpZGVuaW5nIGxvYWRzLiAgKi8KKyAgaWYgKFRZUEVf UFJFQ0lTSU9OIChUUkVFX1RZUEUgKGxocykpIDwgVFlQRV9QUkVDSVNJT04gKHJldF90eXBl KQorICAgICAgJiYgIXVzZWxlc3NfdHlwZV9jb252ZXJzaW9uX3AgKFRSRUVfVFlQRSAobGhz KSwgcmV0X3R5cGUpKQorICAgIHsKKyAgICAgIHBhdHRlcm5fc3RtdAorCT0gZ2ltcGxlX2J1 aWxkX2Fzc2lnbiAodmVjdF9yZWNvZ190ZW1wX3NzYV92YXIgKHJldF90eXBlLCBOVUxMKSwK KwkJCSAgICAgICBOT1BfRVhQUiwgbGhzKTsKKyAgICAgIGxocyA9IGdpbXBsZV9nZXRfbGhz IChwYXR0ZXJuX3N0bXQpOworICAgICAgYXBwZW5kX3BhdHRlcm5fZGVmX3NlcSAodmluZm8s IHN0bXRfaW5mbywgcGF0dGVybl9zdG10KTsKKyAgICB9CisgIGVsc2UgaWYgKCF1c2VsZXNz X3R5cGVfY29udmVyc2lvbl9wIChUUkVFX1RZUEUgKGxocyksIHJldF90eXBlKSkKKyAgICAv KiBJZiB3ZSBhcmUgZG9pbmcgdGhlIGNvbnZlcnNpb24gbGFzdCB0aGVuIGFsc28gZGVsYXkg dGhlIHNoaWZ0IGFzIHdlIG1heQorICAgICAgIGJlIGFibGUgdG8gY29tYmluZSB0aGUgc2hp ZnQgYW5kIGNvbnZlcnNpb24gaW4gY2VydGFpbiBjYXNlcy4gICovCisgICAgc2hpZnRfZmly c3QgPSBmYWxzZTsKKworICB0cmVlIHZlY3R5cGUgPSBnZXRfdmVjdHlwZV9mb3Jfc2NhbGFy X3R5cGUgKHZpbmZvLCBUUkVFX1RZUEUgKGxocykpOworICAvKiBJZiB0aGUgZmlyc3Qgb3Bl cmFuZCBvZiB0aGUgQklUX0ZJRUxEX1JFRiBpcyBub3QgYW4gSU5URUdFUiB0eXBlLCBjb252 ZXJ0CisgICAgIGl0IHRvIG9uZSBvZiB0aGUgc2FtZSB3aWR0aCBzbyB3ZSBjYW4gcGVyZm9y bSB0aGUgbmVjZXNzYXJ5IG1hc2tpbmcgYW5kCisgICAgIHNoaWZ0aW5nLiAgKi8KKyAgaWYg KCFJTlRFR1JBTF9UWVBFX1AgKFRSRUVfVFlQRSAobGhzKSkpCisgICAgeworICAgICAgdHJl ZSBpbnRfdHlwZQorCT0gYnVpbGRfbm9uc3RhbmRhcmRfaW50ZWdlcl90eXBlIChUWVBFX1BS RUNJU0lPTiAoVFJFRV9UWVBFIChsaHMpKSwKKwkJCQkJICB0cnVlKTsKKyAgICAgIHBhdHRl cm5fc3RtdAorCT0gZ2ltcGxlX2J1aWxkX2Fzc2lnbiAodmVjdF9yZWNvZ190ZW1wX3NzYV92 YXIgKGludF90eXBlLCBOVUxMKSwKKwkJCSAgICAgICBOT1BfRVhQUiwgbGhzKTsKKyAgICAg IHZlY3R5cGUgPSBnZXRfdmVjdHlwZV9mb3Jfc2NhbGFyX3R5cGUgKHZpbmZvLCBpbnRfdHlw ZSk7CisgICAgICBsaHMgPSBnaW1wbGVfYXNzaWduX2xocyAocGF0dGVybl9zdG10KTsKKyAg ICAgIGFwcGVuZF9wYXR0ZXJuX2RlZl9zZXEgKHZpbmZvLCBzdG10X2luZm8sIHBhdHRlcm5f c3RtdCwgdmVjdHlwZSk7CisgICAgfQorCisgIC8qIElmIHRoZSBvbmx5IHVzZSBvZiB0aGUg cmVzdWx0IG9mIHRoaXMgQklUX0ZJRUxEX1JFRiArIENPTlZFUlQgaXMgYQorICAgICBQTFVT X0VYUFIgdGhlbiBkbyB0aGUgc2hpZnQgbGFzdCBhcyBzb21lIHRhcmdldHMgY2FuIGNvbWJp bmUgdGhlIHNoaWZ0IGFuZAorICAgICBhZGQgaW50byBhIHNpbmdsZSBpbnN0cnVjdGlvbi4g ICovCisgIGlmIChzaW5nbGVfaW1tX3VzZSAoZ2ltcGxlX2Fzc2lnbl9saHMgKGZpcnN0X3N0 bXQpLCAmdXNlX3AsICZ1c2Vfc3RtdCkpCisgICAgeworICAgICAgaWYgKGdpbXBsZV9jb2Rl ICh1c2Vfc3RtdCkgPT0gR0lNUExFX0FTU0lHTgorCSAgJiYgZ2ltcGxlX2Fzc2lnbl9yaHNf Y29kZSAodXNlX3N0bXQpID09IFBMVVNfRVhQUikKKwlzaGlmdF9maXJzdCA9IGZhbHNlOwor ICAgIH0KKworICB1bnNpZ25lZCBIT1NUX1dJREVfSU5UIHNoaWZ0X24gPSBiaXRfZmllbGRf b2Zmc2V0IChiZl9yZWYpLnRvX2NvbnN0YW50ICgpOworICB1bnNpZ25lZCBIT1NUX1dJREVf SU5UIG1hc2tfd2lkdGggPSBiaXRfZmllbGRfc2l6ZSAoYmZfcmVmKS50b19jb25zdGFudCAo KTsKKyAgdW5zaWduZWQgaW50IHByZWMgPSBUWVBFX1BSRUNJU0lPTiAoVFJFRV9UWVBFIChs aHMpKTsKKyAgaWYgKHNoaWZ0X2ZpcnN0KQorICAgIHsKKyAgICAgIGlmIChzaGlmdF9uKQor CXsKKwkgIHBhdHRlcm5fc3RtdAorCSAgICA9IGdpbXBsZV9idWlsZF9hc3NpZ24gKHZlY3Rf cmVjb2dfdGVtcF9zc2FfdmFyIChUUkVFX1RZUEUgKGxocyksCisJCQkJCQkJICAgIE5VTEwp LAorCQkJCSAgIFJTSElGVF9FWFBSLCBsaHMsCisJCQkJICAgYnVpbGRfaW50X2NzdCAoc2l6 ZXR5cGUsIHNoaWZ0X24pKTsKKwkgIGxocyA9IGdpbXBsZV9hc3NpZ25fbGhzIChwYXR0ZXJu X3N0bXQpOworCSAgYXBwZW5kX3BhdHRlcm5fZGVmX3NlcSAodmluZm8sIHN0bXRfaW5mbywg cGF0dGVybl9zdG10LCB2ZWN0eXBlKTsKKwl9CisKKyAgICAgIHRyZWUgbWFzayA9IHdpZGVf aW50X3RvX3RyZWUgKFRSRUVfVFlQRSAobGhzKSwKKwkJCQkgICAgd2k6Om1hc2sgKG1hc2tf d2lkdGgsIGZhbHNlLCBwcmVjKSk7CisKKyAgICAgIHBhdHRlcm5fc3RtdAorCT0gZ2ltcGxl X2J1aWxkX2Fzc2lnbiAodmVjdF9yZWNvZ190ZW1wX3NzYV92YXIgKFRSRUVfVFlQRSAobGhz KSwKKwkJCQkJCQlOVUxMKSwKKwkJCSAgICAgICBCSVRfQU5EX0VYUFIsIGxocywgbWFzayk7 CisgICAgICBsaHMgPSBnaW1wbGVfYXNzaWduX2xocyAocGF0dGVybl9zdG10KTsKKyAgICB9 CisgIGVsc2UKKyAgICB7CisgICAgICB0cmVlIG1hc2sgPSB3aWRlX2ludF90b190cmVlIChU UkVFX1RZUEUgKGxocyksCisJCQkJICAgIHdpOjpzaGlmdGVkX21hc2sgKHNoaWZ0X24sIG1h c2tfd2lkdGgsCisJCQkJCQkgICAgICBmYWxzZSwgcHJlYykpOworICAgICAgcGF0dGVybl9z dG10CisJPSBnaW1wbGVfYnVpbGRfYXNzaWduICh2ZWN0X3JlY29nX3RlbXBfc3NhX3ZhciAo VFJFRV9UWVBFIChsaHMpLAorCQkJCQkJCU5VTEwpLAorCQkJICAgICAgIEJJVF9BTkRfRVhQ UiwgbGhzLCBtYXNrKTsKKyAgICAgIGxocyA9IGdpbXBsZV9hc3NpZ25fbGhzIChwYXR0ZXJu X3N0bXQpOworICAgICAgaWYgKHNoaWZ0X24pCisJeworCSAgYXBwZW5kX3BhdHRlcm5fZGVm X3NlcSAodmluZm8sIHN0bXRfaW5mbywgcGF0dGVybl9zdG10LCB2ZWN0eXBlKTsKKwkgIHBh dHRlcm5fc3RtdAorCSAgICA9IGdpbXBsZV9idWlsZF9hc3NpZ24gKHZlY3RfcmVjb2dfdGVt cF9zc2FfdmFyIChUUkVFX1RZUEUgKGxocyksCisJCQkJCQkJICAgIE5VTEwpLAorCQkJCSAg IFJTSElGVF9FWFBSLCBsaHMsCisJCQkJICAgYnVpbGRfaW50X2NzdCAoc2l6ZXR5cGUsIHNo aWZ0X24pKTsKKwkgIGxocyA9IGdpbXBsZV9hc3NpZ25fbGhzIChwYXR0ZXJuX3N0bXQpOwor CX0KKyAgICB9CisKKyAgaWYgKCF1c2VsZXNzX3R5cGVfY29udmVyc2lvbl9wIChUUkVFX1RZ UEUgKGxocyksIHJldF90eXBlKSkKKyAgICB7CisgICAgICBhcHBlbmRfcGF0dGVybl9kZWZf c2VxICh2aW5mbywgc3RtdF9pbmZvLCBwYXR0ZXJuX3N0bXQsIHZlY3R5cGUpOworICAgICAg cGF0dGVybl9zdG10CisJPSBnaW1wbGVfYnVpbGRfYXNzaWduICh2ZWN0X3JlY29nX3RlbXBf c3NhX3ZhciAocmV0X3R5cGUsIE5VTEwpLAorCQkJICAgICAgIE5PUF9FWFBSLCBsaHMpOwor ICAgICAgbGhzID0gZ2ltcGxlX2dldF9saHMgKHBhdHRlcm5fc3RtdCk7CisgICAgfQorCisg ICp0eXBlX291dCA9IFNUTVRfVklORk9fVkVDVFlQRSAoc3RtdF9pbmZvKTsKKyAgdmVjdF9w YXR0ZXJuX2RldGVjdGVkICgiYml0ZmllbGRfcmVmIHBhdHRlcm4iLCBzdG10X2luZm8tPnN0 bXQpOworCisgIHJldHVybiBwYXR0ZXJuX3N0bXQ7Cit9CisKKy8qIEZ1bmN0aW9uIHZlY3Rf cmVjb2dfYml0X2luc2VydF9wYXR0ZXJuCisKKyAgIFRyeSB0byBmaW5kIHRoZSBmb2xsb3dp bmcgcGF0dGVybjoKKworICAgXzMgPSBCSVRfSU5TRVJUX0VYUFIgKF8xLCBfMiwgYml0cG9z KTsKKworICAgSW5wdXQ6CisKKyAgICogU1RNVF9WSU5GTzogVGhlIHN0bXQgd2Ugd2FudCB0 byByZXBsYWNlLgorCisgICBPdXRwdXQ6CisKKyAgICogVFlQRV9PVVQ6IFRoZSB2ZWN0b3Ig dHlwZSBvZiB0aGUgb3V0cHV0IG9mIHRoaXMgcGF0dGVybi4KKworICAgKiBSZXR1cm4gdmFs dWU6IEEgbmV3IHN0bXQgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcmVwbGFjZSB0aGUgc2VxdWVu Y2Ugb2YKKyAgIHN0bXRzIHRoYXQgY29uc3RpdHV0ZSB0aGUgcGF0dGVybi4gSW4gdGhpcyBj YXNlIGl0IHdpbGwgYmU6CisgICBwYXR0MSA9IF8yIDw8IGJpdHBvczsJICAgICAgLy8gU2hp ZnQgdmFsdWUgaW50byBwbGFjZQorICAgcGF0dDIgPSBwYXR0MSAmIChtYXNrIDw8IGJpdHBv cyk7ICAvLyBDbGVhcmluZyBvZiB0aGUgbm9uLXJlbGV2YW50IGJpdHMgaW4gdGhlCisJCQkJ ICAgICAgLy8gJ3RvLXdyaXRlIHZhbHVlJy4KKyAgIHBhdHQzID0gXzEgJiB+KG1hc2sgPDwg Yml0cG9zKTsgICAgLy8gQ2xlYXJpbmcgdGhlIGJpdHMgd2Ugd2FudCB0byB3cml0ZSB0bywK KwkJCQkgICAgICAvLyBmcm9tIHRoZSB2YWx1ZSB3ZSB3YW50IHRvIHdyaXRlIHRvLgorICAg XzMgPSBwYXR0MyB8IHBhdHQyOwkJICAgICAgLy8gV3JpdGUgYml0cy4KKworCisgICB3aGVy ZSBtYXNrID0gKCgxIDw8IFRZUEVfUFJFQ0lTSU9OIChfMikpIC0gMSksIGEgbWFzayB0byBr ZWVwIHRoZSBudW1iZXIgb2YKKyAgIGJpdHMgY29ycmVzcG9uZGluZyB0byB0aGUgcmVhbCBz aXplIG9mIHRoZSBiaXRmaWVsZCB2YWx1ZSB3ZSBhcmUgd3JpdGluZyB0by4KKworKi8KKwor c3RhdGljIGdpbXBsZSAqCit2ZWN0X3JlY29nX2JpdF9pbnNlcnRfcGF0dGVybiAodmVjX2lu Zm8gKnZpbmZvLCBzdG10X3ZlY19pbmZvIHN0bXRfaW5mbywKKwkJCSAgICAgICB0cmVlICp0 eXBlX291dCkKK3sKKyAgZ2Fzc2lnbiAqYmZfc3RtdCA9IGR5bl9jYXN0IDxnYXNzaWduICo+ IChzdG10X2luZm8tPnN0bXQpOworICBpZiAoIWJmX3N0bXQgfHwgZ2ltcGxlX2Fzc2lnbl9y aHNfY29kZSAoYmZfc3RtdCkgIT0gQklUX0lOU0VSVF9FWFBSKQorICAgIHJldHVybiBOVUxM OworCisgIHRyZWUgbG9hZCA9IGdpbXBsZV9hc3NpZ25fcmhzMSAoYmZfc3RtdCk7CisgIHRy ZWUgdmFsdWUgPSBnaW1wbGVfYXNzaWduX3JoczIgKGJmX3N0bXQpOworICB0cmVlIG9mZnNl dCA9IGdpbXBsZV9hc3NpZ25fcmhzMyAoYmZfc3RtdCk7CisKKyAgdHJlZSBiZl90eXBlID0g VFJFRV9UWVBFICh2YWx1ZSk7CisgIHRyZWUgbG9hZF90eXBlID0gVFJFRV9UWVBFIChsb2Fk KTsKKworICBpZiAoIUlOVEVHUkFMX1RZUEVfUCAobG9hZF90eXBlKSkKKyAgICByZXR1cm4g TlVMTDsKKworICBnaW1wbGUgKnBhdHRlcm5fc3RtdDsKKworICB2ZWN0X3VucHJvbW90ZWRf dmFsdWUgdW5wcm9tOworICB1bnByb20uc2V0X29wICh2YWx1ZSwgdmVjdF9pbnRlcm5hbF9k ZWYpOworICB2YWx1ZSA9IHZlY3RfY29udmVydF9pbnB1dCAodmluZm8sIHN0bXRfaW5mbywg bG9hZF90eXBlLCAmdW5wcm9tLAorCQkJICAgICAgZ2V0X3ZlY3R5cGVfZm9yX3NjYWxhcl90 eXBlICh2aW5mbywgbG9hZF90eXBlKSk7CisKKyAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBz aGlmdF9uID0gdHJlZV90b191aHdpIChvZmZzZXQpOworICBpZiAoc2hpZnRfbikKKyAgICB7 CisgICAgICBwYXR0ZXJuX3N0bXQKKwk9IGdpbXBsZV9idWlsZF9hc3NpZ24gKHZlY3RfcmVj b2dfdGVtcF9zc2FfdmFyIChsb2FkX3R5cGUsIE5VTEwpLAorCQkJICAgICAgIExTSElGVF9F WFBSLCB2YWx1ZSwgb2Zmc2V0KTsKKyAgICAgIGFwcGVuZF9wYXR0ZXJuX2RlZl9zZXEgKHZp bmZvLCBzdG10X2luZm8sIHBhdHRlcm5fc3RtdCk7CisgICAgICB2YWx1ZSA9IGdpbXBsZV9n ZXRfbGhzIChwYXR0ZXJuX3N0bXQpOworICAgIH0KKworICB1bnNpZ25lZCBIT1NUX1dJREVf SU5UIG1hc2tfd2lkdGggPSBUWVBFX1BSRUNJU0lPTiAoYmZfdHlwZSk7CisgIHVuc2lnbmVk IGludCBwcmVjID0gVFlQRV9QUkVDSVNJT04gKGxvYWRfdHlwZSk7CisgIHRyZWUgbWFza190 CisgICAgPSB3aWRlX2ludF90b190cmVlIChsb2FkX3R5cGUsCisJCQl3aTo6c2hpZnRlZF9t YXNrIChzaGlmdF9uLCBtYXNrX3dpZHRoLCBmYWxzZSwgcHJlYykpOworCisgIC8qIENsZWFy IGJpdHMgd2UgZG9uJ3Qgd2FudCB0byB3cml0ZSBiYWNrIGZyb20gdmFsdWUgYW5kIHNoaWZ0 IGl0IGluIHBsYWNlLiAgKi8KKyAgZ2ltcGxlX3NlcSBzdG10cyA9IE5VTEw7CisgIHZhbHVl ID0gZ2ltcGxlX2J1aWxkICgmc3RtdHMsIEJJVF9BTkRfRVhQUiwgbG9hZF90eXBlLCB2YWx1 ZSwgbWFza190KTsKKyAgaWYgKCFnaW1wbGVfc2VxX2VtcHR5X3AgKHN0bXRzKSkKKyAgICB7 CisgICAgICBwYXR0ZXJuX3N0bXQgPSBnaW1wbGVfc2VxX2ZpcnN0X3N0bXQgKHN0bXRzKTsK KyAgICAgIGFwcGVuZF9wYXR0ZXJuX2RlZl9zZXEgKHZpbmZvLCBzdG10X2luZm8sIHBhdHRl cm5fc3RtdCk7CisgICAgfQorCisgIC8qIE1hc2sgb2ZmIHRoZSBiaXRzIGluIHRoZSBsb2Fk ZWQgdmFsdWUuICAqLworICBtYXNrX3QgPSB3aWRlX2ludF90b190cmVlIChsb2FkX3R5cGUs CisJCQkgICAgIHdpOjpzaGlmdGVkX21hc2sgKHNoaWZ0X24sIG1hc2tfd2lkdGgsIHRydWUs IHByZWMpKTsKKyAgdHJlZSBsaHMgPSB2ZWN0X3JlY29nX3RlbXBfc3NhX3ZhciAobG9hZF90 eXBlLCBOVUxMKTsKKyAgcGF0dGVybl9zdG10ID0gZ2ltcGxlX2J1aWxkX2Fzc2lnbiAobGhz LCBCSVRfQU5EX0VYUFIsbG9hZCwgbWFza190KTsKKyAgYXBwZW5kX3BhdHRlcm5fZGVmX3Nl cSAodmluZm8sIHN0bXRfaW5mbywgcGF0dGVybl9zdG10KTsKKworICAvKiBDb21wb3NlIHRo ZSB2YWx1ZSB0byB3cml0ZSBiYWNrLiAgKi8KKyAgcGF0dGVybl9zdG10CisgICAgPSBnaW1w bGVfYnVpbGRfYXNzaWduICh2ZWN0X3JlY29nX3RlbXBfc3NhX3ZhciAobG9hZF90eXBlLCBO VUxMKSwKKwkJCSAgIEJJVF9JT1JfRVhQUiwgbGhzLCB2YWx1ZSk7CisKKyAgKnR5cGVfb3V0 ID0gU1RNVF9WSU5GT19WRUNUWVBFIChzdG10X2luZm8pOworICB2ZWN0X3BhdHRlcm5fZGV0 ZWN0ZWQgKCJiaXRfaW5zZXJ0IHBhdHRlcm4iLCBzdG10X2luZm8tPnN0bXQpOworCisgIHJl dHVybiBwYXR0ZXJuX3N0bXQ7Cit9CisKKwogLyogUmVjb2duaXplIGNhc2VzIGluIHdoaWNo IGFuIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgaW4gb25lIHR5cGUgV1RZUEUKICAgIGJ1dCBj b3VsZCBiZSBkb25lIG1vcmUgZWZmaWNpZW50bHkgaW4gYSBuYXJyb3dlciB0eXBlIE5UWVBF LiAgRm9yIGV4YW1wbGUsCiAgICBpZiB3ZSBoYXZlOgpAQCAtNTYyMyw2ICs1OTEzLDggQEAg c3RydWN0IHZlY3RfcmVjb2dfZnVuYwogICAgdGFrZW4gd2hpY2ggbWVhbnMgdXN1YWxseSB0 aGUgbW9yZSBjb21wbGV4IG9uZSBuZWVkcyB0byBwcmVjZWVkIHRoZQogICAgbGVzcyBjb21w bGVzIG9uZXggKHdpZGVuX3N1bSBvbmx5IGFmdGVyIGRvdF9wcm9kIG9yIHNhZCBmb3IgZXhh bXBsZSkuICAqLwogc3RhdGljIHZlY3RfcmVjb2dfZnVuYyB2ZWN0X3ZlY3RfcmVjb2dfZnVu Y19wdHJzW10gPSB7CisgIHsgdmVjdF9yZWNvZ19iaXRmaWVsZF9yZWZfcGF0dGVybiwgImJp dGZpZWxkX3JlZiIgfSwKKyAgeyB2ZWN0X3JlY29nX2JpdF9pbnNlcnRfcGF0dGVybiwgImJp dF9pbnNlcnQiIH0sCiAgIHsgdmVjdF9yZWNvZ19vdmVyX3dpZGVuaW5nX3BhdHRlcm4sICJv dmVyX3dpZGVuaW5nIiB9LAogICAvKiBNdXN0IGNvbWUgYWZ0ZXIgb3Zlcl93aWRlbmluZywg d2hpY2ggbmFycm93cyB0aGUgc2hpZnQgYXMgbXVjaCBhcwogICAgICBwb3NzaWJsZSBiZWZv cmVoYW5kLiAgKi8K --------------Zka9Q4dj0T1a0D3h4W2cOA1i--