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 0D5553858C2F for ; Tue, 16 Aug 2022 10:24:58 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 0D5553858C2F 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 77E4F113E; Tue, 16 Aug 2022 03:24:58 -0700 (PDT) Received: from [10.1.38.159] (E121495.arm.com [10.1.38.159]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id CEBF03F70D; Tue, 16 Aug 2022 03:24:56 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------YSUfl00EYy8aWkCtl3z0KuXF" Message-ID: Date: Tue, 16 Aug 2022 11:24:44 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.11.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.5 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 X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 16 Aug 2022 10:25:03 -0000 This is a multi-part message in MIME format. --------------YSUfl00EYy8aWkCtl3z0KuXF Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hi, New version of the patch attached, but haven't recreated the ChangeLog yet, just waiting to see if this is what you had in mind. See also some replies to your comments in-line below: On 09/08/2022 15:34, Richard Biener wrote: > @@ -2998,7 +3013,7 @@ ifcvt_split_critical_edges (class loop *loop, bool > aggressive_if_conv) > auto_vec critical_edges; > > /* Loop is not well formed. */ > - if (num <= 2 || loop->inner || !single_exit (loop)) > + if (num <= 2 || loop->inner) > return false; > > body = get_loop_body (loop); > > this doesn't appear in the ChangeLog nor is it clear to me why it's > needed? Likewise So both these and... > > - /* Save BB->aux around loop_version as that uses the same field. */ > - save_length = loop->inner ? loop->inner->num_nodes : loop->num_nodes; > - void **saved_preds = XALLOCAVEC (void *, save_length); > - for (unsigned i = 0; i < save_length; i++) > - saved_preds[i] = ifc_bbs[i]->aux; > + void **saved_preds = NULL; > + if (any_complicated_phi || need_to_predicate) > + { > + /* Save BB->aux around loop_version as that uses the same field. > */ > + save_length = loop->inner ? loop->inner->num_nodes : > loop->num_nodes; > + saved_preds = XALLOCAVEC (void *, save_length); > + for (unsigned i = 0; i < save_length; i++) > + saved_preds[i] = ifc_bbs[i]->aux; > + } > > is that just premature optimization? .. these changes are to make sure we can still use the loop versioning code even for cases where there are bitfields to lower but no ifcvts (i.e. num of BBs <= 2). I wasn't sure about the loop-inner condition and the small examples I tried it seemed to work, that is loop version seems to be able to handle nested loops. The single_exit condition is still required for both, because the code to create the loop versions depends on it. It does look like I missed this in the ChangeLog... > + /* BITSTART and BITEND describe the region we can safely load from > inside the > + structure. BITPOS is the bit position of the value inside the > + representative that we will end up loading OFFSET bytes from the > start > + of the struct. BEST_MODE is the mode describing the optimal size of > the > + representative chunk we load. If this is a write we will store the > same > + sized representative back, after we have changed the appropriate > bits. */ > + get_bit_range (&bitstart, &bitend, comp_ref, &bitpos, &offset); > > I think you need to give up when get_bit_range sets bitstart = bitend to > zero > > + if (get_best_mode (bitsize, bitpos.to_constant (), bitstart, bitend, > + TYPE_ALIGN (TREE_TYPE (struct_expr)), > + INT_MAX, false, &best_mode)) > > + tree rep_decl = build_decl (UNKNOWN_LOCATION, FIELD_DECL, > + NULL_TREE, rep_type); > + /* Load from the start of 'offset + bitpos % alignment'. */ > + uint64_t extra_offset = bitpos.to_constant (); > > you shouldn't build a new FIELD_DECL. Either you use > DECL_BIT_FIELD_REPRESENTATIVE directly or you use a > BIT_FIELD_REF accessing the "representative". > DECL_BIT_FIELD_REPRESENTATIVE exists so it can maintain > a variable field offset, you can also subset that with an > intermediate BIT_FIELD_REF if DECL_BIT_FIELD_REPRESENTATIVE is > too large for your taste. > > I'm not sure all the offset calculation you do is correct, but > since you shouldn't invent a new FIELD_DECL it probably needs > to change anyway ... I can use the DECL_BIT_FIELD_REPRESENTATIVE, but I'll still need some offset calculation/extraction. It's easier to example with an example: In vect-bitfield-read-3.c the struct: typedef struct {     int  c;     int  b;     bool a : 1; } struct_t; and field access 'vect_false[i].a' or 'vect_true[i].a' will lead to a DECL_BIT_FIELD_REPRESENTATIVE of TYPE_SIZE of 8 (and TYPE_PRECISION is also 8 as expected). However, the DECL_FIELD_OFFSET of either the original field decl, the actual bitfield member, or the DECL_BIT_FIELD_REPRESENTATIVE is 0 and the DECL_FIELD_BIT_OFFSET is 64. These will lead to the correct load: _1 = vect_false[i].D; D here being the representative is an 8-bit load from vect_false[i] + 64bits. So all good there. However, when we construct BIT_FIELD_REF we can't simply use DECL_FIELD_BIT_OFFSET (field_decl) as the BIT_FIELD_REF's bitpos.  During `verify_gimple` it checks that bitpos + bitsize < TYPE_SIZE (TREE_TYPE (load)) where BIT_FIELD_REF (load, bitsize, bitpos). 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; I've now rewritten this to: poly_int64 q,r; if (can_trunc_div_p(bitpos, align_of_representative, &q, &r))   bitpos = r; It makes it slightly clearer, also because I no longer need the changes to the original tree offset as I'm just using D for the load. > Note that for optimization it will be important that all > accesses to the bitfield members of the same bitfield use the > same underlying area (CSE and store-forwarding will thank you). > > + > + need_to_lower_bitfields = bitfields_to_lower_p (loop, > &bitfields_to_lower); > + if (!ifcvt_split_critical_edges (loop, aggressive_if_conv) > + && !need_to_lower_bitfields) > goto cleanup; > > so we lower bitfields even when we cannot split critical edges? > why? > > + need_to_ifcvt > + = if_convertible_loop_p (loop) && dbg_cnt (if_conversion_tree); > + if (!need_to_ifcvt && !need_to_lower_bitfields) > goto cleanup; > > likewise - if_convertible_loop_p performs other checks, the only > one we want to elide is the loop->num_nodes <= 2 check since > we want to lower bitfields in single-block loops as well. That > means we only have to scan for bitfield accesses in the first > block "prematurely". So I would interwind the need_to_lower_bitfields > into if_convertible_loop_p and if_convertible_loop_p_1 and > put the loop->num_nodes <= 2 after it when !need_to_lower_bitfields. I'm not sure I understood this. But I'd rather keep the 'need_to_ifcvt' (new) and 'need_to_lower_bitfields' separate. One thing I did change is that we no longer check for bitfields to lower if there are if-stmts that we can't lower, since we will not be vectorizing this loop anyway so no point in wasting time lowering bitfields. At the same time though, I'd like to be able to lower-bitfields if there are no ifcvts. > + if (!useless_type_conversion_p (TREE_TYPE (lhs), ret_type)) > + { > + pattern_stmt > + = gimple_build_assign (vect_recog_temp_ssa_var (ret_type, NULL), > + NOP_EXPR, lhs); > + lhs = gimple_get_lhs (pattern_stmt); > + append_pattern_def_seq (vinfo, stmt_info, pattern_stmt); > + } > > hm - so you have for example > > int _1 = MEM; > int:3 _2 = BIT_FIELD_REF <_1, ...> > type _3 = (type) _2; > > and that _3 = (type) _2 is because of integer promotion and you > perform all the shifting in that type. I suppose you should > verify that the cast is indeed promoting, not narrowing, since > otherwise you'll produce wrong code? That said, shouldn't you > perform the shift / mask in the type of _1 instead? (the hope > is, of course, that typeof (_1) == type in most cases) > > Similar comments apply to vect_recog_bit_insert_pattern. Good shout, hadn't realized that yet because of how the testcases didn't have that problem, but when using the REPRESENTATIVE macro they do test that now. I don't think the bit_insert is a problem though. In bit_insert, 'value' always has the relevant bits starting at its LSB. So regardless of whether the load (and store) type is larger or smaller than the type, performing the shifts and masks in this type should be OK as you'll only be 'cutting off' the MSB's which would be the ones that would get truncated anyway? Or am missing something here? --------------YSUfl00EYy8aWkCtl3z0KuXF Content-Type: text/plain; charset=UTF-8; name="vect_bitfield2.patch" Content-Disposition: attachment; filename="vect_bitfield2.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 YmJlZTIzZDhlYTI0MC4uZjQ1MGRiYjE5MjI1ODZiM2Q0MDUyODFmNjA1ZmIwZDhhN2ZjOGZj MiAxMDA2NDQKLS0tIGEvZ2NjL3RyZWUtaWYtY29udi5jYworKysgYi9nY2MvdHJlZS1pZi1j b252LmNjCkBAIC05MSw2ICs5MSw3IEBAIGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUg Q09QWUlORzMuICBJZiBub3Qgc2VlCiAjaW5jbHVkZSAidHJlZS1wYXNzLmgiCiAjaW5jbHVk ZSAic3NhLmgiCiAjaW5jbHVkZSAiZXhwbWVkLmgiCisjaW5jbHVkZSAiZXhwci5oIgogI2lu Y2x1ZGUgIm9wdGFicy1xdWVyeS5oIgogI2luY2x1ZGUgImdpbXBsZS1wcmV0dHktcHJpbnQu aCIKICNpbmNsdWRlICJhbGlhcy5oIgpAQCAtMTIzLDYgKzEyNCw5IEBAIGFsb25nIHdpdGgg R0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCiAjaW5jbHVkZSAidHJl ZS12ZWN0b3JpemVyLmgiCiAjaW5jbHVkZSAidHJlZS1laC5oIgogCisvKiBGb3IgbGFuZ19o b29rcy50eXBlcy50eXBlX2Zvcl9tb2RlLiAgKi8KKyNpbmNsdWRlICJsYW5naG9va3MuaCIK KwogLyogT25seSBoYW5kbGUgUEhJcyB3aXRoIG5vIG1vcmUgYXJndW1lbnRzIHVubGVzcyB3 ZSBhcmUgYXNrZWQgdG8gYnkKICAgIHNpbWQgcHJhZ21hLiAgKi8KICNkZWZpbmUgTUFYX1BI SV9BUkdfTlVNIFwKQEAgLTE0NSw2ICsxNDksMTIgQEAgc3RhdGljIGJvb2wgbmVlZF90b19y ZXdyaXRlX3VuZGVmaW5lZDsKICAgIGJlZm9yZSBwaGlfY29udmVydGlibGVfYnlfZGVnZW5l cmF0aW5nX2FyZ3MuICAqLwogc3RhdGljIGJvb2wgYW55X2NvbXBsaWNhdGVkX3BoaTsKIAor LyogVHJ1ZSBpZiB3ZSBoYXZlIGJpdGZpZWxkIGFjY2Vzc2VzIHdlIGNhbiBsb3dlci4gICov CitzdGF0aWMgYm9vbCBuZWVkX3RvX2xvd2VyX2JpdGZpZWxkczsKKworLyogVHJ1ZSBpZiB0 aGVyZSBpcyBhbnkgaWZjdnRpbmcgdG8gYmUgZG9uZS4gICovCitzdGF0aWMgYm9vbCBuZWVk X3RvX2lmY3Z0OworCiAvKiBIYXNoIGZvciBzdHJ1Y3QgaW5uZXJtb3N0X2xvb3BfYmVoYXZp b3IuICBJdCBkZXBlbmRzIG9uIHRoZSB1c2VyIHRvCiAgICBmcmVlIHRoZSBtZW1vcnkuICAq LwogCkBAIC0yODk4LDE4ICsyOTA4LDIyIEBAIHZlcnNpb25fbG9vcF9mb3JfaWZfY29udmVy c2lvbiAoY2xhc3MgbG9vcCAqbG9vcCwgdmVjPGdpbXBsZSAqPiAqcHJlZHMpCiAgIGNsYXNz IGxvb3AgKm5ld19sb29wOwogICBnaW1wbGUgKmc7CiAgIGdpbXBsZV9zdG10X2l0ZXJhdG9y IGdzaTsKLSAgdW5zaWduZWQgaW50IHNhdmVfbGVuZ3RoOworICB1bnNpZ25lZCBpbnQgc2F2 ZV9sZW5ndGggPSAwOwogCiAgIGcgPSBnaW1wbGVfYnVpbGRfY2FsbF9pbnRlcm5hbCAoSUZO X0xPT1BfVkVDVE9SSVpFRCwgMiwKIAkJCQkgIGJ1aWxkX2ludF9jc3QgKGludGVnZXJfdHlw ZV9ub2RlLCBsb29wLT5udW0pLAogCQkJCSAgaW50ZWdlcl96ZXJvX25vZGUpOwogICBnaW1w bGVfY2FsbF9zZXRfbGhzIChnLCBjb25kKTsKIAotICAvKiBTYXZlIEJCLT5hdXggYXJvdW5k IGxvb3BfdmVyc2lvbiBhcyB0aGF0IHVzZXMgdGhlIHNhbWUgZmllbGQuICAqLwotICBzYXZl X2xlbmd0aCA9IGxvb3AtPmlubmVyID8gbG9vcC0+aW5uZXItPm51bV9ub2RlcyA6IGxvb3At Pm51bV9ub2RlczsKLSAgdm9pZCAqKnNhdmVkX3ByZWRzID0gWEFMTE9DQVZFQyAodm9pZCAq LCBzYXZlX2xlbmd0aCk7Ci0gIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzYXZlX2xlbmd0 aDsgaSsrKQotICAgIHNhdmVkX3ByZWRzW2ldID0gaWZjX2Jic1tpXS0+YXV4OworICB2b2lk ICoqc2F2ZWRfcHJlZHMgPSBOVUxMOworICBpZiAoYW55X2NvbXBsaWNhdGVkX3BoaSB8fCBu ZWVkX3RvX3ByZWRpY2F0ZSkKKyAgICB7CisgICAgICAvKiBTYXZlIEJCLT5hdXggYXJvdW5k IGxvb3BfdmVyc2lvbiBhcyB0aGF0IHVzZXMgdGhlIHNhbWUgZmllbGQuICAqLworICAgICAg c2F2ZV9sZW5ndGggPSBsb29wLT5pbm5lciA/IGxvb3AtPmlubmVyLT5udW1fbm9kZXMgOiBs b29wLT5udW1fbm9kZXM7CisgICAgICBzYXZlZF9wcmVkcyA9IFhBTExPQ0FWRUMgKHZvaWQg Kiwgc2F2ZV9sZW5ndGgpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNhdmVf bGVuZ3RoOyBpKyspCisJc2F2ZWRfcHJlZHNbaV0gPSBpZmNfYmJzW2ldLT5hdXg7CisgICAg fQogCiAgIGluaXRpYWxpemVfb3JpZ2luYWxfY29weV90YWJsZXMgKCk7CiAgIC8qIEF0IHRo aXMgcG9pbnQgd2UgaW52YWxpZGF0ZSBwb3JmaWxlIGNvbmZpc3RlbmN5IHVudGlsIElGTl9M T09QX1ZFQ1RPUklaRUQKQEAgLTI5MjEsOCArMjkzNSw5IEBAIHZlcnNpb25fbG9vcF9mb3Jf aWZfY29udmVyc2lvbiAoY2xhc3MgbG9vcCAqbG9vcCwgdmVjPGdpbXBsZSAqPiAqcHJlZHMp CiAJCQkgICBwcm9maWxlX3Byb2JhYmlsaXR5OjphbHdheXMgKCksIHRydWUpOwogICBmcmVl X29yaWdpbmFsX2NvcHlfdGFibGVzICgpOwogCi0gIGZvciAodW5zaWduZWQgaSA9IDA7IGkg PCBzYXZlX2xlbmd0aDsgaSsrKQotICAgIGlmY19iYnNbaV0tPmF1eCA9IHNhdmVkX3ByZWRz W2ldOworICBpZiAoYW55X2NvbXBsaWNhdGVkX3BoaSB8fCBuZWVkX3RvX3ByZWRpY2F0ZSkK KyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2F2ZV9sZW5ndGg7IGkrKykKKyAgICAg IGlmY19iYnNbaV0tPmF1eCA9IHNhdmVkX3ByZWRzW2ldOwogCiAgIGlmIChuZXdfbG9vcCA9 PSBOVUxMKQogICAgIHJldHVybiBOVUxMOwpAQCAtMjk5OCw3ICszMDEzLDcgQEAgaWZjdnRf c3BsaXRfY3JpdGljYWxfZWRnZXMgKGNsYXNzIGxvb3AgKmxvb3AsIGJvb2wgYWdncmVzc2l2 ZV9pZl9jb252KQogICBhdXRvX3ZlYzxlZGdlPiBjcml0aWNhbF9lZGdlczsKIAogICAvKiBM b29wIGlzIG5vdCB3ZWxsIGZvcm1lZC4gICovCi0gIGlmIChudW0gPD0gMiB8fCBsb29wLT5p bm5lciB8fCAhc2luZ2xlX2V4aXQgKGxvb3ApKQorICBpZiAobG9vcC0+aW5uZXIpCiAgICAg cmV0dXJuIGZhbHNlOwogCiAgIGJvZHkgPSBnZXRfbG9vcF9ib2R5IChsb29wKTsKQEAgLTMy NTksNiArMzI3NCwxOTYgQEAgaWZjdnRfaG9pc3RfaW52YXJpYW50cyAoY2xhc3MgbG9vcCAq bG9vcCwgZWRnZSBwZSkKICAgZnJlZSAoYm9keSk7CiB9CiAKKy8qIFJldHVybnMgdGhlIERF Q0xfRklFTERfQklUX09GRlNFVCBvZiB0aGUgYml0ZmllbGQgYWNjZXNzZSBpbiBzdG10IGlm ZiBpdHMKKyAgIHR5cGUgbW9kZSBpcyBub3QgQkxLbW9kZS4gIElmIEJJVFBPUyBpcyBub3Qg TlVMTCBpdCB3aWxsIGhvbGQgdGhlIHBvbHlfaW50NjQKKyAgIHZhbHVlIG9mIHRoZSBERUNM X0ZJRUxEX0JJVF9PRkZTRVQgb2YgdGhlIGJpdGZpZWxkIGFjY2VzcyBhbmQgU1RSVUNUX0VY UFIsCisgICBpZiBub3QgTlVMTCwgd2lsbCBob2xkIHRoZSB0cmVlIHJlcHJlc2VudGluZyB0 aGUgYmFzZSBzdHJ1Y3Qgb2YgdGhpcworICAgYml0ZmllbGQuICAqLworCitzdGF0aWMgdHJl ZQorZ2V0X2JpdGZpZWxkX3JlcCAoZ2Fzc2lnbiAqc3RtdCwgYm9vbCB3cml0ZSwgcG9seV9p bnQ2NCAqYml0cG9zLAorCQkgIHRyZWUgKnN0cnVjdF9leHByKQoreworICB0cmVlIGNvbXBf cmVmID0gd3JpdGUgPyBnaW1wbGVfZ2V0X2xocyAoc3RtdCkKKwkJCTogZ2ltcGxlX2Fzc2ln bl9yaHMxIChzdG10KTsKKworICBpZiAoc3RydWN0X2V4cHIpCisgICAgKnN0cnVjdF9leHBy ID0gVFJFRV9PUEVSQU5EIChjb21wX3JlZiwgMCk7CisKKyAgdHJlZSBmaWVsZF9kZWNsID0g VFJFRV9PUEVSQU5EIChjb21wX3JlZiwgMSk7CisgIGlmIChiaXRwb3MpCisgICAgKmJpdHBv cyA9IHRyZWVfdG9fcG9seV9pbnQ2NCAoREVDTF9GSUVMRF9CSVRfT0ZGU0VUIChmaWVsZF9k ZWNsKSk7CisKKyAgdHJlZSByZXBfZGVjbCA9IERFQ0xfQklUX0ZJRUxEX1JFUFJFU0VOVEFU SVZFIChmaWVsZF9kZWNsKTsKKyAgLyogQmFpbCBvdXQgaWYgdGhlIHJlcHJlc2VudGF0aXZl IGlzIEJMS21vZGUgYXMgd2Ugd2lsbCBub3QgYmUgYWJsZSB0bworICAgICB2ZWN0b3JpemUg dGhpcy4gICovCisgIGlmIChUWVBFX01PREUgKFRSRUVfVFlQRSAocmVwX2RlY2wpKSA9PSBF X0JMS21vZGUpCisgICAgcmV0dXJuIE5VTExfVFJFRTsKKworICByZXR1cm4gcmVwX2RlY2w7 CisKK30KKworLyogTG93ZXJzIHRoZSBiaXRmaWVsZCBkZXNjcmliZWQgYnkgREFUQS4KKyAg IEZvciBhIHdyaXRlIGxpa2U6CisKKyAgIHN0cnVjdC5iZiA9IF8xOworCisgICBsb3dlciB0 bzoKKworICAgX19pZmNfMSA9IHN0cnVjdC48cmVwcmVzZW50YXRpdmU+OworICAgX19pZmNf MiA9IEJJVF9JTlNFUlRfRVhQUiAoX19pZmNfMSwgXzEsIGJpdHBvcyk7CisgICBzdHJ1Y3Qu PHJlcHJlc2VudGF0aXZlPiA9IF9faWZjXzI7CisKKyAgIEZvciBhIHJlYWQ6CisKKyAgIF8x ID0gc3RydWN0LmJmOworCisgICAgbG93ZXIgdG86CisKKyAgICBfX2lmY18xID0gc3RydWN0 LjxyZXByZXNlbnRhdGl2ZT47CisgICAgXzEgPSAgQklUX0ZJRUxEX1JFRiAoX19pZmNfMSwg Yml0c2l6ZSwgYml0cG9zKTsKKworICAgIHdoZXJlIHJlcHJlc2VudGF0aXZlIGlzIGEgbGVn YWwgbG9hZCB0aGF0IGNvbnRhaW5zIHRoZSBiaXRmaWVsZCB2YWx1ZSwKKyAgICBiaXRzaXpl IGlzIHRoZSBzaXplIG9mIHRoZSBiaXRmaWVsZCBhbmQgYml0cG9zIHRoZSBvZmZzZXQgdG8g dGhlIHN0YXJ0IG9mCisgICAgdGhlIGJpdGZpZWxkIHdpdGhpbiB0aGUgcmVwcmVzZW50YXRp dmUuICAqLworCitzdGF0aWMgdm9pZAorbG93ZXJfYml0ZmllbGQgKGdhc3NpZ24gKnN0bXQs IGJvb2wgd3JpdGUpCit7CisgIHRyZWUgc3RydWN0X2V4cHI7CisgIHBvbHlfaW50NjQgYml0 cG9zOworICB0cmVlIHJlcF9kZWNsID0gZ2V0X2JpdGZpZWxkX3JlcCAoc3RtdCwgd3JpdGUs ICZiaXRwb3MsICZzdHJ1Y3RfZXhwcik7CisgIHRyZWUgcmVwX3R5cGUgPSBUUkVFX1RZUEUg KHJlcF9kZWNsKTsKKyAgdHJlZSBiZl90eXBlID0gVFJFRV9UWVBFIChnaW1wbGVfZ2V0X2xo cyAoc3RtdCkpOworCisgIGdpbXBsZV9zdG10X2l0ZXJhdG9yIGdzaSA9IGdzaV9mb3Jfc3Rt dCAoc3RtdCk7CisgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlM UykpCisgICAgeworICAgICAgZnByaW50ZiAoZHVtcF9maWxlLCAiTG93ZXJpbmc6XG4iKTsK KyAgICAgIHByaW50X2dpbXBsZV9zdG10IChkdW1wX2ZpbGUsIHN0bXQsIDAsIFRERl9TTElN KTsKKyAgICAgIGZwcmludGYgKGR1bXBfZmlsZSwgInRvOlxuIik7CisgICAgfQorCisgIC8q IEJJVFBPUyByZXByZXNlbnRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgYml0IG9mIHRo ZSBiaXRmaWVsZCBmaWVsZCB3ZQorICAgICBhcmUgYWNjZXNzaW5nLiAgSG93ZXZlciwgc29t ZXRpbWVzIGl0IGNhbiBiZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgc3RydWN0LAorICAgICBh bmQgc29tZXRpbWVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSByZXByZXNlbnRhdGl2ZSB3ZSBh cmUgbG9hZGluZy4gIEZvcgorICAgICB0aGUgZmlyc3QsIHRoZSBmb2xsb3dpbmcgY29kZSB3 aWxsIGFkYXB0IEJJVFBPUyB0byB0aGUgbGF0dGVyIHNpbmNlIHRoYXQKKyAgICAgaXMgdGhl IHZhbHVlIEJJVF9GSUVMRF9SRUYgaXMgZXhwZWN0aW5nIGFzIGJpdHBvc2l0aW9uLiAgRm9y IHRoZSBsYXR0ZXIKKyAgICAgdGhpcyBzaG91bGQgbm8gZWZmZWN0LiAgKi8KKyAgSE9TVF9X SURFX0lOVCBxOworICBwb2x5X2ludDY0IHI7CisgIHBvbHlfaW50NjQgcmVwX2FsaWduID0g VFlQRV9BTElHTiAocmVwX3R5cGUpOworICBpZiAoY2FuX2Rpdl90cnVuY19wIChiaXRwb3Ms IHJlcF9hbGlnbiwgJnEsICZyKSkKKyAgICBiaXRwb3MgPSByOworCisgIC8qIFJFUF9DT01Q X1JFRiBpcyBhIENPTVBPTkVOVF9SRUYgZm9yIHRoZSByZXByZXNlbnRhdGl2ZS4gIE5FV19W QUwgaXMgaXQncworICAgICBkZWZpbmluZyBTU0FfTkFNRS4gICovCisgIHRyZWUgcmVwX2Nv bXBfcmVmID0gYnVpbGQzIChDT01QT05FTlRfUkVGLCByZXBfdHlwZSwgc3RydWN0X2V4cHIs IHJlcF9kZWNsLAorCQkJICAgICAgTlVMTF9UUkVFKTsKKyAgdHJlZSBuZXdfdmFsID0gaWZj X3RlbXBfdmFyIChyZXBfdHlwZSwgcmVwX2NvbXBfcmVmLCAmZ3NpKTsKKworICBpZiAoZHVt cF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQorICAgIHByaW50X2dpbXBs ZV9zdG10IChkdW1wX2ZpbGUsIFNTQV9OQU1FX0RFRl9TVE1UIChuZXdfdmFsKSwgMCwgVERG X1NMSU0pOworCisgIHRyZWUgYml0cG9zX3RyZWUgPSBidWlsZF9pbnRfY3N0IChiaXRzaXpl dHlwZSwgYml0cG9zKTsKKyAgaWYgKHdyaXRlKQorICAgIHsKKyAgICAgIG5ld192YWwgPSBp ZmNfdGVtcF92YXIgKHJlcF90eXBlLAorCQkJICAgICAgYnVpbGQzIChCSVRfSU5TRVJUX0VY UFIsIHJlcF90eXBlLCBuZXdfdmFsLAorCQkJCSAgICAgIHVuc2hhcmVfZXhwciAoZ2ltcGxl X2Fzc2lnbl9yaHMxIChzdG10KSksCisJCQkJICAgICAgYml0cG9zX3RyZWUpLCAmZ3NpKTsK KworICAgICAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkK KwlwcmludF9naW1wbGVfc3RtdCAoZHVtcF9maWxlLCBTU0FfTkFNRV9ERUZfU1RNVCAobmV3 X3ZhbCksIDAsIFRERl9TTElNKTsKKworICAgICAgZ2ltcGxlICpuZXdfc3RtdCA9IGdpbXBs ZV9idWlsZF9hc3NpZ24gKHVuc2hhcmVfZXhwciAocmVwX2NvbXBfcmVmKSwKKwkJCQkJICAg ICAgbmV3X3ZhbCk7CisgICAgICBnaW1wbGVfc2V0X3Z1c2UgKG5ld19zdG10LCBnaW1wbGVf dnVzZSAoc3RtdCkpOworICAgICAgdHJlZSB2ZGVmID0gZ2ltcGxlX3ZkZWYgKHN0bXQpOwor ICAgICAgZ2ltcGxlX3NldF92ZGVmIChuZXdfc3RtdCwgdmRlZik7CisgICAgICBTU0FfTkFN RV9ERUZfU1RNVCAodmRlZikgPSBuZXdfc3RtdDsKKyAgICAgIGdzaV9pbnNlcnRfYmVmb3Jl ICgmZ3NpLCBuZXdfc3RtdCwgR1NJX1NBTUVfU1RNVCk7CisKKyAgICAgIGlmIChkdW1wX2Zp bGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlMUykpCisJcHJpbnRfZ2ltcGxlX3N0bXQg KGR1bXBfZmlsZSwgbmV3X3N0bXQsIDAsIFRERl9TTElNKTsKKyAgICB9CisgIGVsc2UKKyAg ICB7CisgICAgICB0cmVlIGJmciA9IGJ1aWxkMyAoQklUX0ZJRUxEX1JFRiwgYmZfdHlwZSwg bmV3X3ZhbCwKKwkJCSBidWlsZF9pbnRfY3N0IChiaXRzaXpldHlwZSwgVFlQRV9QUkVDSVNJ T04gKGJmX3R5cGUpKSwKKwkJCSBiaXRwb3NfdHJlZSk7CisgICAgICBuZXdfdmFsID0gaWZj X3RlbXBfdmFyIChiZl90eXBlLCBiZnIsICZnc2kpOworICAgICAgcmVkdW5kYW50X3NzYV9u YW1lcy5zYWZlX3B1c2ggKHN0ZDo6bWFrZV9wYWlyIChnaW1wbGVfZ2V0X2xocyAoc3RtdCks CisJCQkJCQkgICAgIG5ld192YWwpKTsKKworICAgICAgaWYgKGR1bXBfZmlsZSAmJiAoZHVt cF9mbGFncyAmIFRERl9ERVRBSUxTKSkKKwlwcmludF9naW1wbGVfc3RtdCAoZHVtcF9maWxl LCBTU0FfTkFNRV9ERUZfU1RNVCAobmV3X3ZhbCksIDAsIFRERl9TTElNKTsKKyAgICB9CisK KyAgZ3NpX3JlbW92ZSAoJmdzaSwgdHJ1ZSk7Cit9CisKKy8qIFJldHVybiBUUlVFIGlmIHRo ZXJlIGFyZSBiaXRmaWVsZHMgdG8gbG93ZXIgaW4gdGhpcyBMT09QLiAgRmlsbCBUT19MT1dF UgorICAgd2l0aCBkYXRhIHN0cnVjdHVyZXMgcmVwcmVzZW50aW5nIHRoZXNlIGJpdGZpZWxk cy4gICovCisKK3N0YXRpYyBib29sCitiaXRmaWVsZHNfdG9fbG93ZXJfcCAoY2xhc3MgbG9v cCAqbG9vcCwKKwkJICAgICAgdmVjIDxnYXNzaWduICo+ICZyZWFkc190b19sb3dlciwKKwkJ ICAgICAgdmVjIDxnYXNzaWduICo+ICZ3cml0ZXNfdG9fbG93ZXIpCit7CisgIGJhc2ljX2Js b2NrICpiYnMgPSBnZXRfbG9vcF9ib2R5IChsb29wKTsKKyAgZ2ltcGxlX3N0bXRfaXRlcmF0 b3IgZ3NpOworCisgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlM UykpCisgICAgeworICAgICAgZnByaW50ZiAoZHVtcF9maWxlLCAiQW5hbHl6aW5nIGxvb3Ag JWQgZm9yIGJpdGZpZWxkczpcbiIsIGxvb3AtPm51bSk7CisgICAgfQorCisgIGZvciAodW5z aWduZWQgaSA9IDA7IGkgPCBsb29wLT5udW1fbm9kZXM7ICsraSkKKyAgICB7CisgICAgICBi YXNpY19ibG9jayBiYiA9IGJic1tpXTsKKyAgICAgIGZvciAoZ3NpID0gZ3NpX3N0YXJ0X2Ji IChiYik7ICFnc2lfZW5kX3AgKGdzaSk7IGdzaV9uZXh0ICgmZ3NpKSkKKwl7CisJICBnYXNz aWduICpzdG10ID0gZHluX2Nhc3Q8Z2Fzc2lnbio+IChnc2lfc3RtdCAoZ3NpKSk7CisJICBp ZiAoIXN0bXQpCisJICAgIGNvbnRpbnVlOworCisJICB0cmVlIG9wID0gZ2ltcGxlX2dldF9s aHMgKHN0bXQpOworCSAgYm9vbCB3cml0ZSA9IFRSRUVfQ09ERSAob3ApID09IENPTVBPTkVO VF9SRUY7CisKKwkgIGlmICghd3JpdGUpCisJICAgIG9wID0gZ2ltcGxlX2Fzc2lnbl9yaHMx IChzdG10KTsKKworCSAgaWYgKFRSRUVfQ09ERSAob3ApICE9IENPTVBPTkVOVF9SRUYpCisJ ICAgIGNvbnRpbnVlOworCisJICBpZiAoREVDTF9CSVRfRklFTERfVFlQRSAoVFJFRV9PUEVS QU5EIChvcCwgMSkpKQorCSAgICB7CisJICAgICAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9m bGFncyAmIFRERl9ERVRBSUxTKSkKKwkJcHJpbnRfZ2ltcGxlX3N0bXQgKGR1bXBfZmlsZSwg c3RtdCwgMCwgVERGX1NMSU0pOworCisJICAgICAgaWYgKCFnZXRfYml0ZmllbGRfcmVwIChz dG10LCB3cml0ZSwgTlVMTCwgTlVMTCkpCisJCXsKKwkJICBpZiAoZHVtcF9maWxlICYmIChk dW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQorCQkgICAgZnByaW50ZiAoZHVtcF9maWxlLCAi XHQgQml0ZmllbGQgTk9UIE9LIHRvIGxvd2VyLCIKKwkJCQkJIiByZXByZXNlbnRhdGl2ZSBp cyBCTEttb2RlLlxuIik7CisJCSAgcmV0dXJuIGZhbHNlOworCQl9CisKKwkgICAgICBpZiAo ZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQorCQlmcHJpbnRmIChk dW1wX2ZpbGUsICJcdEJpdGZpZWxkIE9LIHRvIGxvd2VyLlxuIik7CisJICAgICAgaWYgKHdy aXRlKQorCQl3cml0ZXNfdG9fbG93ZXIuc2FmZV9wdXNoIChzdG10KTsKKwkgICAgICBlbHNl CisJCXJlYWRzX3RvX2xvd2VyLnNhZmVfcHVzaCAoc3RtdCk7CisJICAgIH0KKwl9CisgICAg fQorICByZXR1cm4gIXJlYWRzX3RvX2xvd2VyLmlzX2VtcHR5ICgpIHx8ICF3cml0ZXNfdG9f bG93ZXIuaXNfZW1wdHkgKCk7Cit9CisKKwogLyogSWYtY29udmVydCBMT09QIHdoZW4gaXQg aXMgbGVnYWwuICBGb3IgdGhlIG1vbWVudCB0aGlzIHBhc3MgaGFzIG5vCiAgICBwcm9maXRh YmlsaXR5IGFuYWx5c2lzLiAgUmV0dXJucyBub24temVybyB0b2RvIGZsYWdzIHdoZW4gc29t ZXRoaW5nCiAgICBjaGFuZ2VkLiAgKi8KQEAgLTMyNjksMTIgKzM0NzQsMTggQEAgdHJlZV9p Zl9jb252ZXJzaW9uIChjbGFzcyBsb29wICpsb29wLCB2ZWM8Z2ltcGxlICo+ICpwcmVkcykK ICAgdW5zaWduZWQgaW50IHRvZG8gPSAwOwogICBib29sIGFnZ3Jlc3NpdmVfaWZfY29udjsK ICAgY2xhc3MgbG9vcCAqcmxvb3A7CisgIHZlYyA8Z2Fzc2lnbiAqPiByZWFkc190b19sb3dl cjsKKyAgdmVjIDxnYXNzaWduICo+IHdyaXRlc190b19sb3dlcjsKICAgYml0bWFwIGV4aXRf YmJzOwogICBlZGdlIHBlOwogCiAgYWdhaW46CisgIHJlYWRzX3RvX2xvd2VyLmNyZWF0ZSAo NCk7CisgIHdyaXRlc190b19sb3dlci5jcmVhdGUgKDQpOwogICBybG9vcCA9IE5VTEw7CiAg IGlmY19iYnMgPSBOVUxMOworICBuZWVkX3RvX2xvd2VyX2JpdGZpZWxkcyA9IGZhbHNlOwor ICBuZWVkX3RvX2lmY3Z0ID0gZmFsc2U7CiAgIG5lZWRfdG9fcHJlZGljYXRlID0gZmFsc2U7 CiAgIG5lZWRfdG9fcmV3cml0ZV91bmRlZmluZWQgPSBmYWxzZTsKICAgYW55X2NvbXBsaWNh dGVkX3BoaSA9IGZhbHNlOwpAQCAtMzI5MCwxNiArMzUwMSwzMCBAQCB0cmVlX2lmX2NvbnZl cnNpb24gKGNsYXNzIGxvb3AgKmxvb3AsIHZlYzxnaW1wbGUgKj4gKnByZWRzKQogCWFnZ3Jl c3NpdmVfaWZfY29udiA9IHRydWU7CiAgICAgfQogCi0gIGlmICghaWZjdnRfc3BsaXRfY3Jp dGljYWxfZWRnZXMgKGxvb3AsIGFnZ3Jlc3NpdmVfaWZfY29udikpCisgIGlmICghc2luZ2xl X2V4aXQgKGxvb3ApKQogICAgIGdvdG8gY2xlYW51cDsKIAotICBpZiAoIWlmX2NvbnZlcnRp YmxlX2xvb3BfcCAobG9vcCkKLSAgICAgIHx8ICFkYmdfY250IChpZl9jb252ZXJzaW9uX3Ry ZWUpKQotICAgIGdvdG8gY2xlYW51cDsKKyAgLyogSWYgdGhlcmUgYXJlIG1vcmUgdGhhbiB0 d28gQkJzIGluIHRoZSBsb29wIHRoZW4gdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGlmCisgICAg IHRvIGNvbnZlcnQuICAqLworICBpZiAobG9vcC0+bnVtX25vZGVzID4gMikKKyAgICB7Cisg ICAgICBuZWVkX3RvX2lmY3Z0ID0gdHJ1ZTsKKyAgICAgIGlmICghaWZjdnRfc3BsaXRfY3Jp dGljYWxfZWRnZXMgKGxvb3AsIGFnZ3Jlc3NpdmVfaWZfY29udikpCisJZ290byBjbGVhbnVw OworCisgICAgICBpZiAoIWlmX2NvbnZlcnRpYmxlX2xvb3BfcCAobG9vcCkgfHwgIWRiZ19j bnQgKGlmX2NvbnZlcnNpb25fdHJlZSkpCisJZ290byBjbGVhbnVwOworCisgICAgICBpZiAo KG5lZWRfdG9fcHJlZGljYXRlIHx8IGFueV9jb21wbGljYXRlZF9waGkpCisJICAmJiAoKCFm bGFnX3RyZWVfbG9vcF92ZWN0b3JpemUgJiYgIWxvb3AtPmZvcmNlX3ZlY3Rvcml6ZSkKKwkg ICAgICB8fCBsb29wLT5kb250X3ZlY3Rvcml6ZSkpCisJZ290byBjbGVhbnVwOworICAgIH0K IAotICBpZiAoKG5lZWRfdG9fcHJlZGljYXRlIHx8IGFueV9jb21wbGljYXRlZF9waGkpCi0g ICAgICAmJiAoKCFmbGFnX3RyZWVfbG9vcF92ZWN0b3JpemUgJiYgIWxvb3AtPmZvcmNlX3Zl Y3Rvcml6ZSkKLQkgIHx8IGxvb3AtPmRvbnRfdmVjdG9yaXplKSkKKyAgbmVlZF90b19sb3dl cl9iaXRmaWVsZHMgPSBiaXRmaWVsZHNfdG9fbG93ZXJfcCAobG9vcCwgcmVhZHNfdG9fbG93 ZXIsCisJCQkJCQkgIHdyaXRlc190b19sb3dlcik7CisKKyAgaWYgKCFuZWVkX3RvX2lmY3Z0 ICYmICFuZWVkX3RvX2xvd2VyX2JpdGZpZWxkcykKICAgICBnb3RvIGNsZWFudXA7CiAKICAg LyogVGhlIGVkZ2UgdG8gaW5zZXJ0IGludmFyaWFudCBzdG10cyBvbi4gICovCkBAIC0zMzEw LDcgKzM1MzUsOCBAQCB0cmVlX2lmX2NvbnZlcnNpb24gKGNsYXNzIGxvb3AgKmxvb3AsIHZl YzxnaW1wbGUgKj4gKnByZWRzKQogICAgICBFaXRoZXIgdmVyc2lvbiB0aGlzIGxvb3AsIG9y IGlmIHRoZSBwYXR0ZXJuIGlzIHJpZ2h0IGZvciBvdXRlci1sb29wCiAgICAgIHZlY3Rvcml6 YXRpb24sIHZlcnNpb24gdGhlIG91dGVyIGxvb3AuICBJbiB0aGUgbGF0dGVyIGNhc2Ugd2Ug d2lsbAogICAgICBzdGlsbCBpZi1jb252ZXJ0IHRoZSBvcmlnaW5hbCBpbm5lciBsb29wLiAg Ki8KLSAgaWYgKG5lZWRfdG9fcHJlZGljYXRlCisgIGlmIChuZWVkX3RvX2xvd2VyX2JpdGZp ZWxkcworICAgICAgfHwgbmVlZF90b19wcmVkaWNhdGUKICAgICAgIHx8IGFueV9jb21wbGlj YXRlZF9waGkKICAgICAgIHx8IGZsYWdfdHJlZV9sb29wX2lmX2NvbnZlcnQgIT0gMSkKICAg ICB7CkBAIC0zMzUwLDEwICszNTc2LDMxIEBAIHRyZWVfaWZfY29udmVyc2lvbiAoY2xhc3Mg bG9vcCAqbG9vcCwgdmVjPGdpbXBsZSAqPiAqcHJlZHMpCiAJcGUgPSBzaW5nbGVfcHJlZF9l ZGdlIChnaW1wbGVfYmIgKHByZWRzLT5sYXN0ICgpKSk7CiAgICAgfQogCi0gIC8qIE5vdyBh bGwgc3RhdGVtZW50cyBhcmUgaWYtY29udmVydGlibGUuICBDb21iaW5lIGFsbCB0aGUgYmFz aWMKLSAgICAgYmxvY2tzIGludG8gb25lIGh1Z2UgYmFzaWMgYmxvY2sgZG9pbmcgdGhlIGlm LWNvbnZlcnNpb24KLSAgICAgb24tdGhlLWZseS4gICovCi0gIGNvbWJpbmVfYmxvY2tzIChs b29wKTsKKyAgaWYgKG5lZWRfdG9fbG93ZXJfYml0ZmllbGRzKQorICAgIHsKKyAgICAgIGlm IChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlMUykpCisJeworCSAgZnBy aW50ZiAoZHVtcF9maWxlLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJICBm cHJpbnRmIChkdW1wX2ZpbGUsICJTdGFydCBsb3dlcmluZyBiaXRmaWVsZHNcbiIpOworCX0K KyAgICAgIHdoaWxlICghcmVhZHNfdG9fbG93ZXIuaXNfZW1wdHkgKCkpCisJbG93ZXJfYml0 ZmllbGQgKHJlYWRzX3RvX2xvd2VyLnBvcCAoKSwgZmFsc2UpOworICAgICAgd2hpbGUgKCF3 cml0ZXNfdG9fbG93ZXIuaXNfZW1wdHkgKCkpCisJbG93ZXJfYml0ZmllbGQgKHdyaXRlc190 b19sb3dlci5wb3AgKCksIHRydWUpOworCisgICAgICBpZiAoZHVtcF9maWxlICYmIChkdW1w X2ZsYWdzICYgVERGX0RFVEFJTFMpKQorCXsKKwkgIGZwcmludGYgKGR1bXBfZmlsZSwgIkRv bmUgbG93ZXJpbmcgYml0ZmllbGRzXG4iKTsKKwkgIGZwcmludGYgKGR1bXBfZmlsZSwgIi0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCX0KKyAgICB9CisgIGlmIChuZWVkX3Rv X2lmY3Z0KQorICAgIHsKKyAgICAgIC8qIE5vdyBhbGwgc3RhdGVtZW50cyBhcmUgaWYtY29u dmVydGlibGUuICBDb21iaW5lIGFsbCB0aGUgYmFzaWMKKwkgYmxvY2tzIGludG8gb25lIGh1 Z2UgYmFzaWMgYmxvY2sgZG9pbmcgdGhlIGlmLWNvbnZlcnNpb24KKwkgb24tdGhlLWZseS4g ICovCisgICAgICBjb21iaW5lX2Jsb2NrcyAobG9vcCk7CisgICAgfQogCiAgIC8qIFBlcmZv cm0gbG9jYWwgQ1NFLCB0aGlzIGVzcC4gaGVscHMgdGhlIHZlY3Rvcml6ZXIgYW5hbHlzaXMg aWYgbG9hZHMKICAgICAgYW5kIHN0b3JlcyBhcmUgaW52b2x2ZWQuICBDU0Ugb25seSB0aGUg bG9vcCBib2R5LCBub3QgdGhlIGVudHJ5CkBAIC0zMzgwLDYgKzM2MjcsOCBAQCB0cmVlX2lm X2NvbnZlcnNpb24gKGNsYXNzIGxvb3AgKmxvb3AsIHZlYzxnaW1wbGUgKj4gKnByZWRzKQog ICB0b2RvIHw9IFRPRE9fY2xlYW51cF9jZmc7CiAKICBjbGVhbnVwOgorICByZWFkc190b19s b3dlci5yZWxlYXNlICgpOworICB3cml0ZXNfdG9fbG93ZXIucmVsZWFzZSAoKTsKICAgaWYg KGlmY19iYnMpCiAgICAgewogICAgICAgdW5zaWduZWQgaW50IGk7CmRpZmYgLS1naXQgYS9n Y2MvdHJlZS12ZWN0LWRhdGEtcmVmcy5jYyBiL2djYy90cmVlLXZlY3QtZGF0YS1yZWZzLmNj CmluZGV4IGIyNzlhODI1NTFlYjcwMzc5ODA0ZDQwNTk4M2FlNWRjNDRiNjZiZjUuLmU5M2Nk YzcyN2RhNGJiNzg2M2IyYWQxM2YyOWY3ZDU1MDQ5MmFkZWEgMTAwNjQ0Ci0tLSBhL2djYy90 cmVlLXZlY3QtZGF0YS1yZWZzLmNjCisrKyBiL2djYy90cmVlLXZlY3QtZGF0YS1yZWZzLmNj CkBAIC00MzAxLDcgKzQzMDEsOCBAQCB2ZWN0X2ZpbmRfc3RtdF9kYXRhX3JlZmVyZW5jZSAo bG9vcF9wIGxvb3AsIGdpbXBsZSAqc3RtdCwKICAgICAgIGZyZWVfZGF0YV9yZWYgKGRyKTsK ICAgICAgIHJldHVybiBvcHRfcmVzdWx0OjpmYWlsdXJlX2F0IChzdG10LAogCQkJCSAgICAg Im5vdCB2ZWN0b3JpemVkOiIKLQkJCQkgICAgICIgc3RhdGVtZW50IGlzIGJpdGZpZWxkIGFj Y2VzcyAlRyIsIHN0bXQpOworCQkJCSAgICAgIiBzdGF0ZW1lbnQgaXMgYW4gdW5zdXBwb3J0 ZWQiCisJCQkJICAgICAiIGJpdGZpZWxkIGFjY2VzcyAlRyIsIHN0bXQpOwogICAgIH0KIAog ICBpZiAoRFJfQkFTRV9BRERSRVNTIChkcikKZGlmZiAtLWdpdCBhL2djYy90cmVlLXZlY3Qt cGF0dGVybnMuY2MgYi9nY2MvdHJlZS12ZWN0LXBhdHRlcm5zLmNjCmluZGV4IGRmYmZiNzFi M2M2OWEwMjA1Y2NjMWIyODdjYjUwZmEwMmE3MDk0MmUuLjU0ODZhYTcyYTMzMjc0ZGI5NTRh YmYyNzVjMmMzMGRhZTNhY2NjMWMgMTAwNjQ0Ci0tLSBhL2djYy90cmVlLXZlY3QtcGF0dGVy bnMuY2MKKysrIGIvZ2NjL3RyZWUtdmVjdC1wYXR0ZXJucy5jYwpAQCAtMzUsNiArMzUsNyBA QCBhbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQog I2luY2x1ZGUgInRyZWUtZWguaCIKICNpbmNsdWRlICJnaW1wbGlmeS5oIgogI2luY2x1ZGUg ImdpbXBsZS1pdGVyYXRvci5oIgorI2luY2x1ZGUgImdpbXBsaWZ5LW1lLmgiCiAjaW5jbHVk ZSAiY2ZnbG9vcC5oIgogI2luY2x1ZGUgInRyZWUtdmVjdG9yaXplci5oIgogI2luY2x1ZGUg ImR1bXBmaWxlLmgiCkBAIC0xODI4LDYgKzE4MjksMjA2IEBAIHZlY3RfcmVjb2dfd2lkZW5f c3VtX3BhdHRlcm4gKHZlY19pbmZvICp2aW5mbywKICAgcmV0dXJuIHBhdHRlcm5fc3RtdDsK IH0KIAorLyogRnVuY3Rpb24gdmVjdF9yZWNvZ19iaXRmaWVsZF9yZWZfcGF0dGVybgorCisg ICBUcnkgdG8gZmluZCB0aGUgZm9sbG93aW5nIHBhdHRlcm46CisKKyAgIF8yID0gQklUX0ZJ RUxEX1JFRiAoXzEsIGJpdHNpemUsIGJpdHBvcyk7CisgICBfMyA9ICh0eXBlKSBfMjsKKwor ICAgd2hlcmUgdHlwZSBpcyBhIG5vbi1iaXRmaWVsZCB0eXBlLCB0aGF0IGlzIHRvIHNheSwg aXQncyBwcmVjaXNpb24gbWF0Y2hlcworICAgMl4oVFlQRV9TSVpFKHR5cGUpIC0gKFRZUEVf VU5TSUdORUQgKHR5cGUpID8gMSA6IDIpKS4KKworICAgSW5wdXQ6CisKKyAgICogU1RNVF9W SU5GTzogVGhlIHN0bXQgZnJvbSB3aGljaCB0aGUgcGF0dGVybiBzZWFyY2ggYmVnaW5zLgor ICAgaGVyZSBpdCBzdGFydHMgd2l0aDoKKyAgIF8zID0gKHR5cGUpIF8yOworCisgICBPdXRw dXQ6CisKKyAgICogVFlQRV9PVVQ6IFRoZSB2ZWN0b3IgdHlwZSBvZiB0aGUgb3V0cHV0IG9m IHRoaXMgcGF0dGVybi4KKworICAgKiBSZXR1cm4gdmFsdWU6IEEgbmV3IHN0bXQgdGhhdCB3 aWxsIGJlIHVzZWQgdG8gcmVwbGFjZSB0aGUgc2VxdWVuY2Ugb2YKKyAgIHN0bXRzIHRoYXQg Y29uc3RpdHV0ZSB0aGUgcGF0dGVybi4gSW4gdGhpcyBjYXNlIGl0IHdpbGwgYmU6CisgICBw YXR0MSA9ICh0eXBlKSBfMTsKKyAgIHBhdHQyID0gcGF0dDEgPj4gYml0cG9zOworICAgXzMg PSBwYXR0MiAmICgoMSA8PCBiaXRzaXplKSAtIDEpOworCisqLworCitzdGF0aWMgZ2ltcGxl ICoKK3ZlY3RfcmVjb2dfYml0ZmllbGRfcmVmX3BhdHRlcm4gKHZlY19pbmZvICp2aW5mbywg c3RtdF92ZWNfaW5mbyBzdG10X2luZm8sCisJCQkJIHRyZWUgKnR5cGVfb3V0KQoreworICBn YXNzaWduICpub3Bfc3RtdCA9IGR5bl9jYXN0IDxnYXNzaWduICo+IChzdG10X2luZm8tPnN0 bXQpOworICBpZiAoIW5vcF9zdG10CisgICAgICB8fCAhQ09OVkVSVF9FWFBSX0NPREVfUCAo Z2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAobm9wX3N0bXQpKQorICAgICAgfHwgVFJFRV9DT0RF IChnaW1wbGVfYXNzaWduX3JoczEgKG5vcF9zdG10KSkgIT0gU1NBX05BTUUpCisgICAgcmV0 dXJuIE5VTEw7CisKKyAgZ2Fzc2lnbiAqYmZfc3RtdAorICAgID0gZHluX2Nhc3QgPGdhc3Np Z24gKj4gKFNTQV9OQU1FX0RFRl9TVE1UIChnaW1wbGVfYXNzaWduX3JoczEgKG5vcF9zdG10 KSkpOworCisgIGlmICghYmZfc3RtdCB8fCBnaW1wbGVfYXNzaWduX3Joc19jb2RlIChiZl9z dG10KSAhPSBCSVRfRklFTERfUkVGKQorICAgIHJldHVybiBOVUxMOworCisgIHRyZWUgYmZf cmVmID0gZ2ltcGxlX2Fzc2lnbl9yaHMxIChiZl9zdG10KTsKKyAgdHJlZSBsaHMgPSBUUkVF X09QRVJBTkQgKGJmX3JlZiwgMCk7CisKKyAgaWYgKCFJTlRFR1JBTF9UWVBFX1AgKFRSRUVf VFlQRSAobGhzKSkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgZ2ltcGxlICpwYXR0ZXJuX3N0 bXQ7CisgIHRyZWUgcmV0X3R5cGUgPSBUUkVFX1RZUEUgKGdpbXBsZV9hc3NpZ25fbGhzIChu b3Bfc3RtdCkpOworCisgIC8qIFdlIG1vdmUgdGhlIGNvbnZlcnNpb24gZWFybGllciBpZiB0 aGUgbG9hZGVkIHR5cGUgaXMgc21hbGxlciB0aGFuIHRoZQorICAgICByZXR1cm4gdHlwZSB0 byBlbmFibGUgdGhlIHVzZSBvZiB3aWRlbmluZyBsb2Fkcy4gICovCisgIGlmIChUWVBFX1BS RUNJU0lPTiAoVFJFRV9UWVBFIChsaHMpKSA8IFRZUEVfUFJFQ0lTSU9OIChyZXRfdHlwZSkK KyAgICAgICYmICF1c2VsZXNzX3R5cGVfY29udmVyc2lvbl9wIChUUkVFX1RZUEUgKGxocyks IHJldF90eXBlKSkKKyAgICB7CisgICAgICBwYXR0ZXJuX3N0bXQKKwk9IGdpbXBsZV9idWls ZF9hc3NpZ24gKHZlY3RfcmVjb2dfdGVtcF9zc2FfdmFyIChyZXRfdHlwZSwgTlVMTCksCisJ CQkgICAgICAgTk9QX0VYUFIsIGxocyk7CisgICAgICBsaHMgPSBnaW1wbGVfZ2V0X2xocyAo cGF0dGVybl9zdG10KTsKKyAgICAgIGFwcGVuZF9wYXR0ZXJuX2RlZl9zZXEgKHZpbmZvLCBz dG10X2luZm8sIHBhdHRlcm5fc3RtdCk7CisgICAgfQorCisgIHVuc2lnbmVkIEhPU1RfV0lE RV9JTlQgc2hpZnRfbiA9IGJpdF9maWVsZF9vZmZzZXQgKGJmX3JlZikudG9fY29uc3RhbnQg KCk7CisgIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgbWFza19pID0gYml0X2ZpZWxkX3NpemUg KGJmX3JlZikudG9fY29uc3RhbnQgKCk7CisgIHRyZWUgbWFzayA9IGJ1aWxkX2ludF9jc3Qg KFRSRUVfVFlQRSAobGhzKSwKKwkJCSAgICAgKCgxVUxMIDw8IG1hc2tfaSkgLSAxKSA8PCBz aGlmdF9uKTsKKyAgcGF0dGVybl9zdG10CisgICAgPSBnaW1wbGVfYnVpbGRfYXNzaWduICh2 ZWN0X3JlY29nX3RlbXBfc3NhX3ZhciAoVFJFRV9UWVBFIChsaHMpLCBOVUxMKSwKKwkJCSAg IEJJVF9BTkRfRVhQUiwgbGhzLCBtYXNrKTsKKyAgbGhzID0gZ2ltcGxlX2dldF9saHMgKHBh dHRlcm5fc3RtdCk7CisgIGlmIChzaGlmdF9uKQorICAgIHsKKyAgICAgIGFwcGVuZF9wYXR0 ZXJuX2RlZl9zZXEgKHZpbmZvLCBzdG10X2luZm8sIHBhdHRlcm5fc3RtdCwKKwkJCSAgICAg IGdldF92ZWN0eXBlX2Zvcl9zY2FsYXJfdHlwZSAodmluZm8sCisJCQkJCQkJICAgVFJFRV9U WVBFIChsaHMpKSk7CisgICAgICBwYXR0ZXJuX3N0bXQKKwk9IGdpbXBsZV9idWlsZF9hc3Np Z24gKHZlY3RfcmVjb2dfdGVtcF9zc2FfdmFyIChUUkVFX1RZUEUgKGxocyksIE5VTEwpLAor CQkJICAgICAgIFJTSElGVF9FWFBSLCBsaHMsCisJCQkgICAgICAgYnVpbGRfaW50X2NzdCAo c2l6ZXR5cGUsIHNoaWZ0X24pKTsKKyAgICAgIGxocyA9IGdpbXBsZV9nZXRfbGhzIChwYXR0 ZXJuX3N0bXQpOworICAgIH0KKworICBpZiAoIXVzZWxlc3NfdHlwZV9jb252ZXJzaW9uX3Ag KFRSRUVfVFlQRSAobGhzKSwgcmV0X3R5cGUpKQorICAgIHsKKyAgICAgIGFwcGVuZF9wYXR0 ZXJuX2RlZl9zZXEgKHZpbmZvLCBzdG10X2luZm8sIHBhdHRlcm5fc3RtdCk7CisgICAgICBw YXR0ZXJuX3N0bXQKKwk9IGdpbXBsZV9idWlsZF9hc3NpZ24gKHZlY3RfcmVjb2dfdGVtcF9z c2FfdmFyIChyZXRfdHlwZSwgTlVMTCksCisJCQkgICAgICAgTk9QX0VYUFIsIGxocyk7Cisg ICAgICBsaHMgPSBnaW1wbGVfZ2V0X2xocyAocGF0dGVybl9zdG10KTsKKyAgICB9CisKKyAg KnR5cGVfb3V0ID0gU1RNVF9WSU5GT19WRUNUWVBFIChzdG10X2luZm8pOworICB2ZWN0X3Bh dHRlcm5fZGV0ZWN0ZWQgKCJiaXRmaWVsZF9yZWYgcGF0dGVybiIsIHN0bXRfaW5mby0+c3Rt dCk7CisKKyAgcmV0dXJuIHBhdHRlcm5fc3RtdDsKK30KKworLyogRnVuY3Rpb24gdmVjdF9y ZWNvZ19iaXRfaW5zZXJ0X3BhdHRlcm4KKworICAgVHJ5IHRvIGZpbmQgdGhlIGZvbGxvd2lu ZyBwYXR0ZXJuOgorCisgICBfMyA9IEJJVF9JTlNFUlRfRVhQUiAoXzEsIF8yLCBiaXRwb3Mp OworCisgICBJbnB1dDoKKworICAgKiBTVE1UX1ZJTkZPOiBUaGUgc3RtdCB3ZSB3YW50IHRv IHJlcGxhY2UuCisKKyAgIE91dHB1dDoKKworICAgKiBUWVBFX09VVDogVGhlIHZlY3RvciB0 eXBlIG9mIHRoZSBvdXRwdXQgb2YgdGhpcyBwYXR0ZXJuLgorCisgICAqIFJldHVybiB2YWx1 ZTogQSBuZXcgc3RtdCB0aGF0IHdpbGwgYmUgdXNlZCB0byByZXBsYWNlIHRoZSBzZXF1ZW5j ZSBvZgorICAgc3RtdHMgdGhhdCBjb25zdGl0dXRlIHRoZSBwYXR0ZXJuLiBJbiB0aGlzIGNh c2UgaXQgd2lsbCBiZToKKyAgIHBhdHQxID0gXzIgJiBtYXNrOwkJICAgIC8vIENsZWFyaW5n IG9mIHRoZSBub24tcmVsZXZhbnQgYml0cyBpbiB0aGUKKwkJCQkgICAgLy8gJ3RvLXdyaXRl IHZhbHVlJy4KKyAgIHBhdHQyID0gcGF0dDEgPDwgYml0cG9zOwkgICAgLy8gU2hpZnQgdGhl IGNsZWFuZWQgdmFsdWUgaW4gdG8gcGxhY2UuCisgICBwYXR0MyA9IF8xICYgfihtYXNrIDw8 IGJpdHBvcyk7ICAvLyBDbGVhcmluZyB0aGUgYml0cyB3ZSB3YW50IHRvIHdyaXRlIHRvLAor CQkJCSAgICAvLyBmcm9tIHRoZSB2YWx1ZSB3ZSB3YW50IHRvIHdyaXRlIHRvLgorICAgXzMg PSBwYXR0MyB8IHBhdHQyOwkJICAgIC8vIFdyaXRlIGJpdHMuCisKKworICAgd2hlcmUgbWFz ayA9ICgoMSA8PCBUWVBFX1BSRUNJU0lPTiAoXzIpKSAtIDEpLCBhIG1hc2sgdG8ga2VlcCB0 aGUgbnVtYmVyIG9mCisgICBiaXRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlYWwgc2l6ZSBv ZiB0aGUgYml0ZmllbGQgdmFsdWUgd2UgYXJlIHdyaXRpbmcgdG8uCisKKyovCisKK3N0YXRp YyBnaW1wbGUgKgordmVjdF9yZWNvZ19iaXRfaW5zZXJ0X3BhdHRlcm4gKHZlY19pbmZvICp2 aW5mbywgc3RtdF92ZWNfaW5mbyBzdG10X2luZm8sCisJCQkgICAgICAgdHJlZSAqdHlwZV9v dXQpCit7CisgIGdhc3NpZ24gKmJmX3N0bXQgPSBkeW5fY2FzdCA8Z2Fzc2lnbiAqPiAoc3Rt dF9pbmZvLT5zdG10KTsKKyAgaWYgKCFiZl9zdG10IHx8IGdpbXBsZV9hc3NpZ25fcmhzX2Nv ZGUgKGJmX3N0bXQpICE9IEJJVF9JTlNFUlRfRVhQUikKKyAgICByZXR1cm4gTlVMTDsKKwor ICB0cmVlIGxvYWQgPSBnaW1wbGVfYXNzaWduX3JoczEgKGJmX3N0bXQpOworICB0cmVlIHZh bHVlID0gZ2ltcGxlX2Fzc2lnbl9yaHMyIChiZl9zdG10KTsKKyAgdHJlZSBvZmZzZXQgPSBn aW1wbGVfYXNzaWduX3JoczMgKGJmX3N0bXQpOworCisgIHRyZWUgYmZfdHlwZSA9IFRSRUVf VFlQRSAodmFsdWUpOworICB0cmVlIGxvYWRfdHlwZSA9IFRSRUVfVFlQRSAobG9hZCk7CisK KyAgaWYgKCFJTlRFR1JBTF9UWVBFX1AgKGxvYWRfdHlwZSkpCisgICAgcmV0dXJuIE5VTEw7 CisKKyAgZ2ltcGxlICpwYXR0ZXJuX3N0bXQ7CisKKyAgaWYgKCF1c2VsZXNzX3R5cGVfY29u dmVyc2lvbl9wIChUUkVFX1RZUEUgKHZhbHVlKSwgbG9hZF90eXBlKSkKKyAgICB7CisgICAg ICB2YWx1ZSA9IGZvbGRfYnVpbGQxIChOT1BfRVhQUiwgbG9hZF90eXBlLCB2YWx1ZSk7Cisg ICAgICBpZiAoIUNPTlNUQU5UX0NMQVNTX1AgKHZhbHVlKSkKKwl7CisJICBwYXR0ZXJuX3N0 bXQKKwkgICAgPSBnaW1wbGVfYnVpbGRfYXNzaWduICh2ZWN0X3JlY29nX3RlbXBfc3NhX3Zh ciAobG9hZF90eXBlLCBOVUxMKSwKKwkJCQkgICB2YWx1ZSk7CisJICB2YWx1ZSA9IGdpbXBs ZV9nZXRfbGhzIChwYXR0ZXJuX3N0bXQpOworCSAgYXBwZW5kX3BhdHRlcm5fZGVmX3NlcSAo dmluZm8sIHN0bXRfaW5mbywgcGF0dGVybl9zdG10KTsKKwl9CisgICAgfQorCisgIHVuc2ln bmVkIEhPU1RfV0lERV9JTlQgbWFza19pID0gKDFVTEwgPDwgVFlQRV9QUkVDSVNJT04gKGJm X3R5cGUpKSAtIDE7CisgIHRyZWUgbWFza190ID0gYnVpbGRfaW50X2NzdCAobG9hZF90eXBl LCBtYXNrX2kpOworICAvKiBDbGVhciBiaXRzIHdlIGRvbid0IHdhbnQgdG8gd3JpdGUgYmFj ayBmcm9tIHZhbHVlIGFuZCBzaGlmdCBpdCBpbiBwbGFjZS4gICovCisgIHBhdHRlcm5fc3Rt dAorICAgID0gZ2ltcGxlX2J1aWxkX2Fzc2lnbiAodmVjdF9yZWNvZ190ZW1wX3NzYV92YXIg KGxvYWRfdHlwZSwgTlVMTCksCisJCQkgICBmb2xkX2J1aWxkMiAoQklUX0FORF9FWFBSLCBs b2FkX3R5cGUsIHZhbHVlLAorCQkJCQltYXNrX3QpKTsKKyAgYXBwZW5kX3BhdHRlcm5fZGVm X3NlcSAodmluZm8sIHN0bXRfaW5mbywgcGF0dGVybl9zdG10KTsKKyAgdW5zaWduZWQgSE9T VF9XSURFX0lOVCBzaGlmdF9uID0gdHJlZV90b191aHdpIChvZmZzZXQpOworICBpZiAoc2hp ZnRfbikKKyAgICB7CisgICAgICBwYXR0ZXJuX3N0bXQKKwk9IGdpbXBsZV9idWlsZF9hc3Np Z24gKHZlY3RfcmVjb2dfdGVtcF9zc2FfdmFyIChsb2FkX3R5cGUsIE5VTEwpLAorCQkJICAg ICAgIExTSElGVF9FWFBSLCB2YWx1ZSwgb2Zmc2V0KTsKKyAgICAgIGFwcGVuZF9wYXR0ZXJu X2RlZl9zZXEgKHZpbmZvLCBzdG10X2luZm8sIHBhdHRlcm5fc3RtdCk7CisgICAgICB2YWx1 ZSA9IGdpbXBsZV9nZXRfbGhzIChwYXR0ZXJuX3N0bXQpOworICAgIH0KKyAgLyogTWFzayBv ZmYgdGhlIGJpdHMgaW4gdGhlIGxvYWRlZCB2YWx1ZS4gICovCisgIG1hc2tfaSA8PD0gc2hp ZnRfbjsKKyAgbWFza19pID0gfm1hc2tfaTsKKyAgbWFza190ID0gYnVpbGRfaW50X2NzdCAo bG9hZF90eXBlLCBtYXNrX2kpOworCisgIHRyZWUgbGhzID0gdmVjdF9yZWNvZ190ZW1wX3Nz YV92YXIgKGxvYWRfdHlwZSwgTlVMTCk7CisgIHBhdHRlcm5fc3RtdCA9IGdpbXBsZV9idWls ZF9hc3NpZ24gKGxocywgQklUX0FORF9FWFBSLGxvYWQsIG1hc2tfdCk7CisgIGFwcGVuZF9w YXR0ZXJuX2RlZl9zZXEgKHZpbmZvLCBzdG10X2luZm8sIHBhdHRlcm5fc3RtdCk7CisKKyAg LyogQ29tcG9zZSB0aGUgdmFsdWUgdG8gd3JpdGUgYmFjay4gICovCisgIHBhdHRlcm5fc3Rt dAorICAgID0gZ2ltcGxlX2J1aWxkX2Fzc2lnbiAodmVjdF9yZWNvZ190ZW1wX3NzYV92YXIg KGxvYWRfdHlwZSwgTlVMTCksCisJCQkgICBCSVRfSU9SX0VYUFIsIGxocywgdmFsdWUpOwor CisgICp0eXBlX291dCA9IFNUTVRfVklORk9fVkVDVFlQRSAoc3RtdF9pbmZvKTsKKyAgdmVj dF9wYXR0ZXJuX2RldGVjdGVkICgiYml0X2luc2VydCBwYXR0ZXJuIiwgc3RtdF9pbmZvLT5z dG10KTsKKworICByZXR1cm4gcGF0dGVybl9zdG10OworfQorCisKIC8qIFJlY29nbml6ZSBj YXNlcyBpbiB3aGljaCBhbiBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIGluIG9uZSB0eXBlIFdU WVBFCiAgICBidXQgY291bGQgYmUgZG9uZSBtb3JlIGVmZmljaWVudGx5IGluIGEgbmFycm93 ZXIgdHlwZSBOVFlQRS4gIEZvciBleGFtcGxlLAogICAgaWYgd2UgaGF2ZToKQEAgLTU2MjMs NiArNTgyNCw4IEBAIHN0cnVjdCB2ZWN0X3JlY29nX2Z1bmMKICAgIHRha2VuIHdoaWNoIG1l YW5zIHVzdWFsbHkgdGhlIG1vcmUgY29tcGxleCBvbmUgbmVlZHMgdG8gcHJlY2VlZCB0aGUK ICAgIGxlc3MgY29tcGxlcyBvbmV4ICh3aWRlbl9zdW0gb25seSBhZnRlciBkb3RfcHJvZCBv ciBzYWQgZm9yIGV4YW1wbGUpLiAgKi8KIHN0YXRpYyB2ZWN0X3JlY29nX2Z1bmMgdmVjdF92 ZWN0X3JlY29nX2Z1bmNfcHRyc1tdID0geworICB7IHZlY3RfcmVjb2dfYml0ZmllbGRfcmVm X3BhdHRlcm4sICJiaXRmaWVsZF9yZWYiIH0sCisgIHsgdmVjdF9yZWNvZ19iaXRfaW5zZXJ0 X3BhdHRlcm4sICJiaXRfaW5zZXJ0IiB9LAogICB7IHZlY3RfcmVjb2dfb3Zlcl93aWRlbmlu Z19wYXR0ZXJuLCAib3Zlcl93aWRlbmluZyIgfSwKICAgLyogTXVzdCBjb21lIGFmdGVyIG92 ZXJfd2lkZW5pbmcsIHdoaWNoIG5hcnJvd3MgdGhlIHNoaWZ0IGFzIG11Y2ggYXMKICAgICAg cG9zc2libGUgYmVmb3JlaGFuZC4gICovCg== --------------YSUfl00EYy8aWkCtl3z0KuXF--