From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id DE7553857806 for ; Tue, 24 May 2022 00:58:44 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org DE7553857806 Received: from mail-il1-f199.google.com (mail-il1-f199.google.com [209.85.166.199]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-467-hWp6-Im2MNiQ0bDrgMa0dg-1; Mon, 23 May 2022 20:58:42 -0400 X-MC-Unique: hWp6-Im2MNiQ0bDrgMa0dg-1 Received: by mail-il1-f199.google.com with SMTP id a3-20020a924443000000b002d1bc79da14so1302011ilm.15 for ; Mon, 23 May 2022 17:58:42 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:to:cc:references:from:in-reply-to; bh=KI201lzrZQaigmd6AN+nx4w3otMflfAr4wHrFXiFy7I=; b=je9JqWnv/B7/V2VVKjr7WpuTnQ80qBe/5GJv4rfgT3B5awSZOYXp/mk8s4kzkv0iTP hipMFhD5xg0D+Mtg3RPBZnEqINrckzCbXiKxxH35iR8NRnXGLqfGzhAo7b2NMemU5P0e 7n+gWxfr7MBDpj4oRpC2F+oAQZY9SVafo/LpwgxufkWxZFsUMY+sC3YC+3PL9O+sSglP TGmEdZQUaek+FtwhrUiB5EqHq6kbnBUmz1D/CP78xnSjmfHO80iVVppXA+dDh/R7Suzx q0yhq5sQQ+rejpaCGSxKI5zuFzFhT9pRJSe0CMZlBB1nlUmXJ5OgAG4nCWJT7QXuV8OF LNug== X-Gm-Message-State: AOAM531ToaIQsWRmD8PbdOdbjZaeLSW0886YOYKkdD5jYp+ZyLOSapiH JaeQ5KUbdfqaCzgwVM1HCbjOxp83WY2r30/5cRZ/kbgoYrW1wToVfYUC0KvttIGIZCG2OY7Scwc W/WdhF9FeEBVaEiDZuw== X-Received: by 2002:a5d:8b45:0:b0:641:2e54:7367 with SMTP id c5-20020a5d8b45000000b006412e547367mr11124732iot.20.1653353922112; Mon, 23 May 2022 17:58:42 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyr5nXKj93QKkH5qy3wnHPftNWD+CsPNaCQ/VliNpyn5PsOWp0l1/0ApbkK0EzYk3xd+MjPQw== X-Received: by 2002:a5d:8b45:0:b0:641:2e54:7367 with SMTP id c5-20020a5d8b45000000b006412e547367mr11124724iot.20.1653353921820; Mon, 23 May 2022 17:58:41 -0700 (PDT) Received: from [192.168.0.41] (97-118-121-109.hlrn.qwest.net. [97.118.121.109]) by smtp.gmail.com with ESMTPSA id q2-20020a056638040200b0032b5316724dsm3139750jap.22.2022.05.23.17.58.40 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 23 May 2022 17:58:41 -0700 (PDT) Message-ID: Date: Mon, 23 May 2022 18:58:40 -0600 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.4.0 Subject: Re: [PATCH] middle-end/105604 - snprintf dianostics and non-constant sizes/offsets To: Richard Biener Cc: gcc-patches@gcc.gnu.org References: <20220516091616.7D3DF13ADC@imap2.suse-dmz.suse.de> <642482b0-f682-c97e-7c23-a35379178742@redhat.com> <654a6fc8-cfa0-a5da-afbb-1d50db3aee59@redhat.com> From: Martin Sebor In-Reply-To: X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="------------m7uMFPBzmLAVC7ai9ptKVaVY" Content-Language: en-US X-Spam-Status: No, score=-15.6 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, NICE_REPLY_A, RCVD_IN_DNSWL_LOW, 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, 24 May 2022 00:58:48 -0000 This is a multi-part message in MIME format. --------------m7uMFPBzmLAVC7ai9ptKVaVY Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 5/19/22 05:39, Richard Biener wrote: > On Wed, 18 May 2022, Martin Sebor wrote: > >> On 5/18/22 00:26, Richard Biener wrote: >>> On Tue, 17 May 2022, Martin Sebor wrote: >>> >>>> On 5/16/22 03:16, Richard Biener wrote: >>>>> The following tries to correct get_origin_and_offset_r not handling >>>>> non-constant sizes of array elements in ARRAY_REFs and non-constant >>>>> offsets of COMPONENT_REFs. It isn't exactly clear how such failures >>>>> should be treated in this API and existing handling isn't consistent >>>>> here either. The following applies two different variants, treating >>>>> non-constant array sizes like non-constant array indices and >>>>> treating non-constant offsets of COMPONENT_REFs by terminating >>>>> the recursion (not sure what that means to the callers). >>>>> >>>>> Basically the code failed to use component_ref_field_offset and >>>>> array_ref_element_size and instead relies on inappropriate >>>>> helpers (that shouldn't exist in the first place ...). The code >>>>> is also not safe-guarded against overflows in the final offset/size >>>>> computations but I'm not trying to rectify that. >>>>> >>>>> Martin - can you comment on how the API should handle such >>>>> situations? >>>> >>>> It looks like the -Wrestrict warning here ignores offsets equal to >>>> HOST_WIDE_INT_MIN so presumably setting dst_offset (via *fldoff) to >>>> that should avoid it. Or maybe to HWI_MAX as it does for variable >>>> offsets. >>> >>> Can you suggest wording for the function comment as to how it handles >>> the case when offset or size cannot be determined exactly? The >>> comment currently only suggests that the caller possibly cannot >>> trust fldsize or off when the function returns NULL but the actual >>> implementation differs from that. >> >> >> >>> >>>> It also looks like the function only handles constant offsets and >>>> sizes, and I have a vague recollection of enhancing it to work with >>>> ranges. That should avoid the overflow problem too. >>> >>> So the correct thing is to return NULL? >> >> No, I don't think so. The recursive get_origin_and_offset_r() assumes >> its own invocations never return null (the one place it does that should >> probably be moved to the nonrecursive caller). >> >>> >>> Is the patch OK as-is? >> >> It's an improvement but it's not complete as the following also ICEs >> (albeit somewhere else): >> >> void* f (void); >> >> void g (int n) >> { >> struct { >> char a[n], b[]; >> } *p = f (); >> >> __builtin_sprintf (p->b, "%s", p->a); >> } >> >> With the ICE fixed the warning triggers. That's not ideal but it's >> unavoidable given the IR (I believe I mentioned this caveat some time >> back). This is the same as for: >> >> struct { >> char a[8], b[8]; >> } *p = f (); >> >> __builtin_sprintf (&p->b[n], "%s", p->a); >> >> because the IR looks more or less the same for &p->a[n] as it is for >> &p->b[n]. >> >>> As said, I'm not sure how the caller interprets >>> the result and how it can distinguish the exact vs. non-exact cases >>> or what a "conservative" inexact answer would be. >> >> The warning triggers in both the certain cases and the inexact >> ones like the one above when an overlap cannot be ruled out. To >> differentiate the two it's phrased as "may overlap". The handling >> is in maybe_warn_overlap(). >> >>> >>> Please help properly documenting this API. >> >> I can spend some time in the next few days to page it all in, see >> if I can clean it up a bit in addition to fixing the ICEs and >> improve the comment. Let me know if you have a different >> preference. > > That works for me - thanks for taking it from here. Attached is a slightly enhanced patch that fixes both of the ICEs, improves the comments, and adds more tests. I tested it on x86_64. Let me know if there's something else you'd like me to do here. Martin --------------m7uMFPBzmLAVC7ai9ptKVaVY Content-Type: text/x-patch; charset=UTF-8; name="gcc-105604.diff" Content-Disposition: attachment; filename="gcc-105604.diff" Content-Transfer-Encoding: base64 UFIgbWlkZGxlLWVuZC8xMDU2MDQgLSBJQ0U6IGluIHRyZWVfdG9fc2h3aSB3aXRoIHZsYSBpbiBz dHJ1Y3QgYW5kIHNwcmludGYKCmdjYy9DaGFuZ2VMb2c6CgoJUFIgbWlkZGxlLWVuZC8xMDU2MDQK CSogZ2ltcGxlLXNzYS1zcHJpbnRmLmNjIChzZXRfYWdncmVnYXRlX3NpemVfYW5kX29mZnNldCk6 IEFkZCBjb21tZW50cy4KCShnZXRfb3JpZ2luX2FuZF9vZmZzZXRfcik6IFJlbW92ZSBudWxsIGhh bmRsaW5nLiAgSGFuZGxlIHZhcmlhYmxlIGFycmF5CglzaXplcy4KCShnZXRfb3JpZ2luX2FuZF9v ZmZzZXQpOiBIYW5kbGUgbnVsbCBhcmd1bWVudCBoZXJlLiAgU2ltcGxpZnkuCgkoYWxpYXNfb2Zm c2V0KToKCSogcG9pbnRlci1xdWVyeS5jYyAoZmllbGRfYXRfb2Zmc2V0KTogVXBkYXRlIGNvbW1l bnQuCgpnY2MvdGVzdHN1aXRlL0NoYW5nZUxvZzoKCglQUiBtaWRkbGUtZW5kLzEwNTYwNAoJKiBn Y2MuZGcvV3Jlc3RyaWN0LTI0LmM6IE5ldyB0ZXN0LgoJKiBnY2MuZGcvV3Jlc3RyaWN0LTI1LmM6 IE5ldyB0ZXN0LgoJKiBnY2MuZGcvV3Jlc3RyaWN0LTI2LmM6IE5ldyB0ZXN0LgoKZGlmZiAtLWdp dCBhL2djYy9naW1wbGUtc3NhLXNwcmludGYuY2MgYi9nY2MvZ2ltcGxlLXNzYS1zcHJpbnRmLmNj CmluZGV4IDgyMDIxMjk2NjdlLi42YmQyNzMwMjIxMyAxMDA2NDQKLS0tIGEvZ2NjL2dpbXBsZS1z c2Etc3ByaW50Zi5jYworKysgYi9nY2MvZ2ltcGxlLXNzYS1zcHJpbnRmLmNjCkBAIC0yMjMyLDgg KzIyMzIsOSBAQCBmb3JtYXRfY2hhcmFjdGVyIChjb25zdCBkaXJlY3RpdmUgJmRpciwgdHJlZSBh cmcsIHBvaW50ZXJfcXVlcnkgJnB0cl9xcnkpCiB9CiAKIC8qIElmIFRZUEUgaXMgYW4gYXJyYXkg b3Igc3RydWN0IG9yIHVuaW9uLCBpbmNyZW1lbnQgKkZMRE9GRiBieSB0aGUgc3RhcnRpbmcKLSAg IG9mZnNldCBvZiB0aGUgbWVtYmVyIHRoYXQgKk9GRiBwb2ludCBpbnRvIGFuZCBzZXQgKkZMRFNJ WkUgdG8gaXRzIHNpemUKLSAgIGluIGJ5dGVzIGFuZCBkZWNyZW1lbnQgKk9GRiBieSB0aGUgc2Ft ZS4gIE90aGVyd2lzZSBkbyBub3RoaW5nLiAgKi8KKyAgIG9mZnNldCBvZiB0aGUgbWVtYmVyIHRo YXQgKk9GRiBwb2ludHMgaW50byBpZiBvbmUgY2FuIGJlIGRldGVybWluZWQgYW5kCisgICBzZXQg KkZMRFNJWkUgdG8gaXRzIHNpemUgaW4gYnl0ZXMgYW5kIGRlY3JlbWVudCAqT0ZGIGJ5IHRoZSBz YW1lLgorICAgT3RoZXJ3aXNlIGRvIG5vdGhpbmcuICAqLwogCiBzdGF0aWMgdm9pZAogc2V0X2Fn Z3JlZ2F0ZV9zaXplX2FuZF9vZmZzZXQgKHRyZWUgdHlwZSwgSE9TVF9XSURFX0lOVCAqZmxkb2Zm LApAQCAtMjI0OSw5ICsyMjUwLDkgQEAgc2V0X2FnZ3JlZ2F0ZV9zaXplX2FuZF9vZmZzZXQgKHRy ZWUgdHlwZSwgSE9TVF9XSURFX0lOVCAqZmxkb2ZmLAogICAgICAgaWYgKGFycmF5X2VsdF9hdF9v ZmZzZXQgKHR5cGUsICpvZmYsICZpbmRleCwgJmFycnNpemUpKQogCXsKIAkgICpmbGRvZmYgKz0g aW5kZXg7Ci0JICAqb2ZmIC09IGluZGV4OwogCSAgKmZsZHNpemUgPSBhcnJzaXplOwogCX0KKyAg ICAgIC8qIE90aGVyd2lzZSBsZWF2ZSAqRkxET0ZGIGV0IGFsLiB1bmNoYW5nZWQuICAqLwogICAg IH0KICAgZWxzZSBpZiAoUkVDT1JEX09SX1VOSU9OX1RZUEVfUCAodHlwZSkpCiAgICAgewpAQCAt MjI2OSwxMSArMjI3MCwxMiBAQCBzZXRfYWdncmVnYXRlX3NpemVfYW5kX29mZnNldCAodHJlZSB0 eXBlLCBIT1NUX1dJREVfSU5UICpmbGRvZmYsCiAJICAqZmxkb2ZmICs9IGluZGV4OwogCSAgKm9m ZiAtPSBpbmRleDsKIAl9CisgICAgICAvKiBPdGhlcndpc2UgbGVhdmUgKkZMRE9GRiBldCBhbC4g dW5jaGFuZ2VkLiAgKi8KICAgICB9CiB9CiAKLS8qIEZvciBhbiBleHByZXNzaW9uIFggb2YgcG9p bnRlciB0eXBlLCByZWN1cnNpdmVseSB0cnkgdG8gZmluZCB0aGUgc2FtZQotICAgb3JpZ2luIChv YmplY3Qgb3IgcG9pbnRlcikgYXMgWSBpdCByZWZlcmVuY2VzIGFuZCByZXR1cm4gc3VjaCBhIFku CisvKiBGb3IgYW4gZXhwcmVzc2lvbiBYIG9mIHBvaW50ZXIgdHlwZSwgcmVjdXJzaXZlbHkgdHJ5 IHRvIGZpbmQgaXRzIG9yaWdpbgorICAgKGVpdGhlciBvYmplY3QgREVDTCBvciBwb2ludGVyIHN1 Y2ggYXMgUEFSTV9ERUNMKSBZIGFuZCByZXR1cm4gc3VjaCBhIFkuCiAgICBXaGVuIFggcmVmZXJz IHRvIGFuIGFycmF5IGVsZW1lbnQgb3Igc3RydWN0IG1lbWJlciwgc2V0ICpGTERPRkYgdG8KICAg IHRoZSBvZmZzZXQgb2YgdGhlIGVsZW1lbnQgb3IgbWVtYmVyIGZyb20gdGhlIGJlZ2lubmluZyBv ZiB0aGUgIm1vc3QKICAgIGRlcml2ZWQiIG9iamVjdCBhbmQgKkZMRFNJWkUgdG8gaXRzIHNpemUu ICBXaGVuIG5vbm51bGwsIHNldCAqT0ZGIHRvCkBAIC0yMjg0LDkgKzIyODYsNiBAQCBzdGF0aWMg dHJlZQogZ2V0X29yaWdpbl9hbmRfb2Zmc2V0X3IgKHRyZWUgeCwgSE9TVF9XSURFX0lOVCAqZmxk b2ZmLCBIT1NUX1dJREVfSU5UICpmbGRzaXplLAogCQkJIEhPU1RfV0lERV9JTlQgKm9mZikKIHsK LSAgaWYgKCF4KQotICAgIHJldHVybiBOVUxMX1RSRUU7Ci0KICAgSE9TVF9XSURFX0lOVCBzaXpl YnVmID0gLTE7CiAgIGlmICghZmxkc2l6ZSkKICAgICBmbGRzaXplID0gJnNpemVidWY7CkBAIC0y MzA4LDIzICsyMzA3LDMzIEBAIGdldF9vcmlnaW5fYW5kX29mZnNldF9yICh0cmVlIHgsIEhPU1Rf V0lERV9JTlQgKmZsZG9mZiwgSE9TVF9XSURFX0lOVCAqZmxkc2l6ZSwKIAogICAgIGNhc2UgQVJS QVlfUkVGOgogICAgICAgewotCXRyZWUgb2Zmc2V0ID0gVFJFRV9PUEVSQU5EICh4LCAxKTsKLQlI T1NUX1dJREVfSU5UIGlkeCA9ICh0cmVlX2ZpdHNfdWh3aV9wIChvZmZzZXQpCi0JCQkgICAgID8g dHJlZV90b191aHdpIChvZmZzZXQpIDogSE9TVF9XSURFX0lOVF9NQVgpOworCXRyZWUgc3ViID0g VFJFRV9PUEVSQU5EICh4LCAxKTsKKwl1bnNpZ25lZCBIT1NUX1dJREVfSU5UIGlkeCA9CisJICB0 cmVlX2ZpdHNfdWh3aV9wIChzdWIpID8gdHJlZV90b191aHdpIChzdWIpIDogSE9TVF9XSURFX0lO VF9NQVg7CiAKLQl0cmVlIGVsdHlwZSA9IFRSRUVfVFlQRSAoeCk7Ci0JaWYgKFRSRUVfQ09ERSAo ZWx0eXBlKSA9PSBJTlRFR0VSX1RZUEUpCisJdHJlZSBlbHN6ID0gYXJyYXlfcmVmX2VsZW1lbnRf c2l6ZSAoeCk7CisJdW5zaWduZWQgSE9TVF9XSURFX0lOVCBlbGJ5dGVzID0KKwkgIHRyZWVfZml0 c19zaHdpX3AgKGVsc3opID8gdHJlZV90b19zaHdpIChlbHN6KSA6IEhPU1RfV0lERV9JTlRfTUFY OworCisJdW5zaWduZWQgSE9TVF9XSURFX0lOVCBieXRlb2ZmID0gaWR4ICogZWxieXRlczsKKwor CWlmIChieXRlb2ZmIDwgSE9TVF9XSURFX0lOVF9NQVgKKwkgICAgJiYgZWxieXRlcyA8IEhPU1Rf V0lERV9JTlRfTUFYCisJICAgICYmIGJ5dGVvZmYgLyBlbGJ5dGVzID09IGlkeCkKIAkgIHsKKwkg ICAgLyogRm9yIGluLWJvdW5kcyBjb25zdGFudCBvZmZzZXRzIGludG8gY29uc3RhbnQtc2l6ZWQg YXJyYXlzCisJICAgICAgIGJ1bXAgdXAgKk9GRiwgYW5kIGZvciB3aGF0J3MgbGlrZWx5IGFycmF5 cyBvciBzdHJ1Y3RzIG9mCisJICAgICAgIGFycmF5cywgYWxzbyAqRkxET0ZGLCBhcyBuZWNlc3Nh cnkuICAqLwogCSAgICBpZiAob2ZmKQotCSAgICAgICpvZmYgPSBpZHg7CisJICAgICAgKm9mZiAr PSBieXRlb2ZmOworCSAgICBpZiAoZWxieXRlcyA+IDEpCisJICAgICAgKmZsZG9mZiArPSBieXRl b2ZmOwogCSAgfQotCWVsc2UgaWYgKGlkeCA8IEhPU1RfV0lERV9JTlRfTUFYKQotCSAgKmZsZG9m ZiArPSBpZHggKiBpbnRfc2l6ZV9pbl9ieXRlcyAoZWx0eXBlKTsKIAllbHNlCi0JICAqZmxkb2Zm ID0gaWR4OworCSAgKmZsZG9mZiA9IEhPU1RfV0lERV9JTlRfTUFYOwogCiAJeCA9IFRSRUVfT1BF UkFORCAoeCwgMCk7Ci0JcmV0dXJuIGdldF9vcmlnaW5fYW5kX29mZnNldF9yICh4LCBmbGRvZmYs IGZsZHNpemUsIG51bGxwdHIpOworCXJldHVybiBnZXRfb3JpZ2luX2FuZF9vZmZzZXRfciAoeCwg Zmxkb2ZmLCBmbGRzaXplLCBvZmYpOwogICAgICAgfQogCiAgICAgY2FzZSBNRU1fUkVGOgpAQCAt MjM1MCw4ICsyMzU5LDE0IEBAIGdldF9vcmlnaW5fYW5kX29mZnNldF9yICh0cmVlIHgsIEhPU1Rf V0lERV9JTlQgKmZsZG9mZiwgSE9TVF9XSURFX0lOVCAqZmxkc2l6ZSwKIAogICAgIGNhc2UgQ09N UE9ORU5UX1JFRjoKICAgICAgIHsKKwl0cmVlIGZvZmYgPSBjb21wb25lbnRfcmVmX2ZpZWxkX29m ZnNldCAoeCk7CiAJdHJlZSBmbGQgPSBUUkVFX09QRVJBTkQgKHgsIDEpOwotCSpmbGRvZmYgKz0g aW50X2J5dGVfcG9zaXRpb24gKGZsZCk7CisJaWYgKCF0cmVlX2ZpdHNfc2h3aV9wIChmb2ZmKQor CSAgICB8fCAhdHJlZV9maXRzX3Nod2lfcCAoREVDTF9GSUVMRF9CSVRfT0ZGU0VUIChmbGQpKSkK KwkgIHJldHVybiB4OworCSpmbGRvZmYgKz0gKHRyZWVfdG9fc2h3aSAoZm9mZikKKwkJICAgICsg KHRyZWVfdG9fc2h3aSAoREVDTF9GSUVMRF9CSVRfT0ZGU0VUIChmbGQpKQorCQkgICAgICAgLyBC SVRTX1BFUl9VTklUKSk7CiAKIAlnZXRfb3JpZ2luX2FuZF9vZmZzZXRfciAoZmxkLCBmbGRvZmYs IGZsZHNpemUsIG9mZik7CiAJeCA9IFRSRUVfT1BFUkFORCAoeCwgMCk7CkBAIC0yNDExLDMwICsy NDI2LDI1IEBAIGdldF9vcmlnaW5fYW5kX29mZnNldF9yICh0cmVlIHgsIEhPU1RfV0lERV9JTlQg KmZsZG9mZiwgSE9TVF9XSURFX0lOVCAqZmxkc2l6ZSwKICAgcmV0dXJuIHg7CiB9CiAKLS8qIE5v bnJlY3Vyc2l2ZSB2ZXJzaW9uIG9mIHRoZSBhYm92ZS4gICovCisvKiBOb25yZWN1cnNpdmUgdmVy c2lvbiBvZiB0aGUgYWJvdmUuCisgICBUaGUgZnVuY3Rpb24gbmV2ZXIgcmV0dXJucyBudWxsIHVu bGVzcyBYIGlzIG51bGwgdG8gYmVnaW4gd2l0aC4gICovCiAKIHN0YXRpYyB0cmVlCiBnZXRfb3Jp Z2luX2FuZF9vZmZzZXQgKHRyZWUgeCwgSE9TVF9XSURFX0lOVCAqZmxkb2ZmLCBIT1NUX1dJREVf SU5UICpvZmYsCiAJCSAgICAgICBIT1NUX1dJREVfSU5UICpmbGRzaXplID0gbnVsbHB0cikKIHsK KyAgaWYgKCF4KQorICAgIHJldHVybiBOVUxMX1RSRUU7CisKICAgSE9TVF9XSURFX0lOVCBzaXpl YnVmOwogICBpZiAoIWZsZHNpemUpCiAgICAgZmxkc2l6ZSA9ICZzaXplYnVmOwogCisgIC8qIElu dmFsaWRhdGUgKkZMRFNJWkUuICAqLwogICAqZmxkc2l6ZSA9IC0xOworICAqZmxkb2ZmID0gKm9m ZiA9IDA7CiAKLSAgKmZsZG9mZiA9ICpvZmYgPSAqZmxkc2l6ZSA9IDA7Ci0gIHRyZWUgb3JpZyA9 IGdldF9vcmlnaW5fYW5kX29mZnNldF9yICh4LCBmbGRvZmYsIGZsZHNpemUsIG9mZik7Ci0gIGlm ICghb3JpZykKLSAgICByZXR1cm4gTlVMTF9UUkVFOwotCi0gIGlmICghKmZsZG9mZiAmJiAqb2Zm ID09ICpmbGRzaXplKQotICAgIHsKLSAgICAgICpmbGRvZmYgPSAqb2ZmOwotICAgICAgKm9mZiA9 IDA7Ci0gICAgfQotCi0gIHJldHVybiBvcmlnOworICByZXR1cm4gZ2V0X29yaWdpbl9hbmRfb2Zm c2V0X3IgKHgsIGZsZG9mZiwgZmxkc2l6ZSwgb2ZmKTsKIH0KIAogLyogSWYgQVJHIHJlZmVycyB0 byB0aGUgc2FtZSAoc3ViKW9iamVjdCBvciBhcnJheSBlbGVtZW50IGFzIGRlc2NyaWJlZApAQCAt MjQ1NCw3ICsyNDY0LDggQEAgYWxpYXNfb2Zmc2V0ICh0cmVlIGFyZywgSE9TVF9XSURFX0lOVCAq YXJnX3NpemUsCiAgICAgcmV0dXJuIEhPU1RfV0lERV9JTlRfTUlOOwogCiAgIC8qIFRoZSB0d28g YXJndW1lbnRzIG1heSByZWZlciB0byB0aGUgc2FtZSBvYmplY3QuICBJZiB0aGV5IGJvdGggcmVm ZXIKLSAgICAgdG8gYSBzdHJ1Y3QgbWVtYmVyLCBzZWUgaWYgdGhlIG1lbWJlcnMgYXJlIG9uZSBh bmQgdGhlIHNhbWUuICAqLworICAgICB0byBhIHN0cnVjdCBtZW1iZXIsIHNlZSBpZiB0aGUgbWVt YmVycyBhcmUgb25lIGFuZCB0aGUgc2FtZS4gIElmIHNvLAorICAgICByZXR1cm4gdGhlIG9mZnNl dCBpbnRvIHRoZSBtZW1iZXIuICAqLwogICBIT1NUX1dJREVfSU5UIGFyZ19vZmYgPSAwLCBhcmdf ZmxkID0gMDsKIAogICB0cmVlIGFyZ19vcmlnID0gZ2V0X29yaWdpbl9hbmRfb2Zmc2V0IChhcmcs ICZhcmdfZmxkLCAmYXJnX29mZiwgYXJnX3NpemUpOwpkaWZmIC0tZ2l0IGEvZ2NjL3BvaW50ZXIt cXVlcnkuY2MgYi9nY2MvcG9pbnRlci1xdWVyeS5jYwppbmRleCA2NDY2MDZlNjM0NC4uYjdhNmZi NzhmODMgMTAwNjQ0Ci0tLSBhL2djYy9wb2ludGVyLXF1ZXJ5LmNjCisrKyBiL2djYy9wb2ludGVy LXF1ZXJ5LmNjCkBAIC0yNDQ4LDkgKzI0NDgsMTMgQEAgZmllbGRfYXRfb2Zmc2V0ICh0cmVlIHR5 cGUsIHRyZWUgc3RhcnRfYWZ0ZXIsIEhPU1RfV0lERV9JTlQgb2ZmLAogICAgICAgLyogVGhlIG9m ZnNldCBvZiBGTEQgd2l0aGluIGl0cyBpbW1lZGlhdGVseSBlbmNsb3Npbmcgc3RydWN0dXJlLiAg Ki8KICAgICAgIEhPU1RfV0lERV9JTlQgZmxkcG9zID0gbmV4dF9wb3MgPCAwID8gaW50X2J5dGVf cG9zaXRpb24gKGZsZCkgOiBuZXh0X3BvczsKIAorICAgICAgdHJlZSB0eXBlc2l6ZSA9IFRZUEVf U0laRV9VTklUIChmbGR0eXBlKTsKKyAgICAgIGlmICh0eXBlc2l6ZSAmJiBUUkVFX0NPREUgKHR5 cGVzaXplKSAhPSBJTlRFR0VSX0NTVCkKKwkvKiBCYWlsIGlmIEZMRCBpcyBhIHZhcmlhYmxlIGxl bmd0aCBtZW1iZXIuICAqLworCXJldHVybiBOVUxMX1RSRUU7CisKICAgICAgIC8qIElmIHRoZSBz aXplIGlzIG5vdCBhdmFpbGFibGUgdGhlIGZpZWxkIGlzIGEgZmxleGlibGUgYXJyYXkKIAkgbWVt YmVyLiAgVHJlYXQgdGhpcyBjYXNlIGFzIHN1Y2Nlc3MuICAqLwotICAgICAgdHJlZSB0eXBlc2l6 ZSA9IFRZUEVfU0laRV9VTklUIChmbGR0eXBlKTsKICAgICAgIEhPU1RfV0lERV9JTlQgZmxkc2l6 ZSA9ICh0cmVlX2ZpdHNfdWh3aV9wICh0eXBlc2l6ZSkKIAkJCSAgICAgICA/IHRyZWVfdG9fdWh3 aSAodHlwZXNpemUpCiAJCQkgICAgICAgOiBvZmYpOwpAQCAtMjQ2NCw3ICsyNDY4LDExIEBAIGZp ZWxkX2F0X29mZnNldCAodHJlZSB0eXBlLCB0cmVlIHN0YXJ0X2FmdGVyLCBIT1NUX1dJREVfSU5U IG9mZiwKIAl7CiAJICAvKiBJZiBPRkYgaXMgZXF1YWwgdG8gdGhlIG9mZnNldCBvZiB0aGUgbmV4 dCBmaWVsZCBjb250aW51ZQogCSAgICAgdG8gaXQgYW5kIHNraXAgdGhlIGFycmF5L3N0cnVjdCBi dXNpbmVzcyBiZWxvdy4gICovCi0JICBuZXh0X3BvcyA9IGludF9ieXRlX3Bvc2l0aW9uIChuZXh0 X2ZsZCk7CisJICB0cmVlIHBvcyA9IGJ5dGVfcG9zaXRpb24gKG5leHRfZmxkKTsKKwkgIGlmICgh dHJlZV9maXRzX3Nod2lfcCAocG9zKSkKKwkgICAgLyogQmFpbCBpZiBORVhUX0ZMRCBpcyBhIHZh cmlhYmxlIGxlbmd0aCBtZW1iZXIuICAqLworCSAgICByZXR1cm4gTlVMTF9UUkVFOworCSAgbmV4 dF9wb3MgPSB0cmVlX3RvX3Nod2kgKHBvcyk7CiAJICAqbmV4dG9mZiA9ICpmbGRvZmYgKyBuZXh0 X3BvczsKIAkgIGlmICgqbmV4dG9mZiA9PSBvZmYgJiYgVFJFRV9DT0RFICh0eXBlKSAhPSBVTklP Tl9UWVBFKQogCSAgICBjb250aW51ZTsKZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRn L1dyZXN0cmljdC0yNC5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvV3Jlc3RyaWN0LTI0LmMKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmQyMjRkODBmODdhCi0tLSAvZGV2 L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvV3Jlc3RyaWN0LTI0LmMKQEAgLTAsMCAr MSwzNSBAQAorLyogUFIgdHJlZS1vcHRpbWl6YXRpb24vMTA1NjA0ICAtIElDRTogaW4gdHJlZV90 b19zaHdpIHdpdGggdmxhIGluIHN0cnVjdAorICAgYW5kIHNwcmludGYKKyAgIHsgZGctZG8gY29t cGlsZSB9CisgICB7IGRnLW9wdGlvbnMgIi1PMiAtV2FsbCAtV3Jlc3RyaWN0IiB9ICovCisKK2V4 dGVybiBpbnQgc3ByaW50ZiAoY2hhciosIGNvbnN0IGNoYXIqLCAuLi4pOworCitleHRlcm4gdm9p ZCogc2luayAodm9pZCosIC4uLik7CisKK3N0cnVjdCB7CisgIGxvbmcgdXNlcnM7CisgIGxvbmcg c2l6ZTsKKyAgY2hhciAqZGF0YTsKK30gKiBtYWluX3RyYW5zOworCit2b2lkICptYWluX19fdHJh bnNfdG1wXzE7CisKK2ludCB1c2VycyA9IDA7CisKK3ZvaWQgdGVzdCAodm9pZCkKK3sKKyAgc3Ry dWN0IHsKKyAgICBsb25nIHVzZXJzOworICAgIGxvbmcgc2l6ZTsKKyAgICBjaGFyICpkYXRhOwor ICAgIGludCBsaW5rc1t1c2Vyc107CisgICAgY2hhciBidWZbXTsKKyAgfSAqdHJhbnMgPSBzaW5r ICgwKTsKKworICB0cmFucy0+ZGF0YSA9IHRyYW5zLT5idWY7CisgIG1haW5fX190cmFuc190bXBf MSA9IHRyYW5zOworICBtYWluX3RyYW5zID0gbWFpbl9fX3RyYW5zX3RtcF8xOworICBzcHJpbnRm IChtYWluX3RyYW5zLT5kYXRhLCAidGVzdCIpOworICBzaW5rIChtYWluX3RyYW5zLT5kYXRhKTsK K30KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL1dyZXN0cmljdC0yNS5jIGIvZ2Nj L3Rlc3RzdWl0ZS9nY2MuZGcvV3Jlc3RyaWN0LTI1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAwMDAuLmExNWY1NmQ3NDI0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3Rz dWl0ZS9nY2MuZGcvV3Jlc3RyaWN0LTI1LmMKQEAgLTAsMCArMSwxNjUgQEAKKy8qIFBSIHRyZWUt b3B0aW1pemF0aW9uLzEwNTYwNCAgLSBJQ0U6IGluIHRyZWVfdG9fc2h3aSB3aXRoIHZsYSBpbiBz dHJ1Y3QKKyAgIGFuZCBzcHJpbnRmCisgICB7IGRnLWRvIGNvbXBpbGUgfQorICAgeyBkZy1vcHRp b25zICItTzIgLVdhbGwgLVdyZXN0cmljdCIgfSAqLworCitleHRlcm4gaW50IHNwcmludGYgKGNo YXIqLCBjb25zdCBjaGFyKiwgLi4uKTsKKwordm9pZCogc2luayAodm9pZCopOworCisKK3ZvaWQg c3ByaW50Zl9TX2E4X2FuX2JuIChpbnQgbiwgaW50IGksIGludCBqKQoreworICBzdHJ1Y3Qgewor ICAgIGNoYXIgYThbOF0sIGFuW25dLCBibltuXTsKKyAgfSAqcCA9IHNpbmsgKDApOworCisgIHsK KyAgICBjaGFyICpkID0gcC0+YTggKyBpOworICAgIGNoYXIgKnMgPSBwLT5hODsKKyAgICBzcHJp bnRmIChkLCAiJXMiLCBzKTsgICAgICAgLy8geyBkZy13YXJuaW5nICJhcmd1bWVudCAzIG1heSBv dmVybGFwIiB9CisgICAgc2luayAocCk7CisgIH0KKworICB7CisgICAgY2hhciAqZCA9IHAtPmE4 OworICAgIGNoYXIgKnMgPSBwLT5hOCArIGo7CisgICAgc3ByaW50ZiAoZCwgIiVzIiwgcyk7ICAg ICAgIC8vIHsgZGctd2FybmluZyAiYXJndW1lbnQgMyBtYXkgb3ZlcmxhcCIgfQorICAgIHNpbmsg KHApOworICB9CisKKyAgeworICAgIGNoYXIgKmQgPSBwLT5hOCArIGk7CisgICAgY2hhciAqcyA9 IHAtPmE4ICsgajsKKyAgICBzcHJpbnRmIChkLCAiJXMiLCBzKTsgICAgICAgLy8geyBkZy13YXJu aW5nICJhcmd1bWVudCAzIG1heSBvdmVybGFwIiB9CisgICAgc2luayAocCk7CisgIH0KKworICB7 CisgICAgY2hhciAqZCA9IHAtPmE4ICsgaTsKKyAgICBjaGFyICpzID0gcC0+YW47CisgICAgc3By aW50ZiAoZCwgIiVzIiwgcyk7CisgICAgc2luayAocCk7CisgIH0KKworICB7CisgICAgY2hhciAq ZCA9IHAtPmE4OworICAgIGNoYXIgKnMgPSBwLT5hbiArIGo7CisgICAgc3ByaW50ZiAoZCwgIiVz Iiwgcyk7CisgICAgc2luayAocCk7CisgIH0KKworICB7CisgICAgY2hhciAqZCA9IHAtPmE4ICsg aTsKKyAgICBjaGFyICpzID0gcC0+YW4gKyBqOworICAgIHNwcmludGYgKGQsICIlcyIsIHMpOwor ICAgIHNpbmsgKHApOworICB9CisKKyAgeworICAgIC8qIFRoZSBJTCBtYWtlcyBpdCBpbXBvc3Np YmxlIHRvIHJ1bGUgb3V0IGFuIG92ZXJsYXAgYmV0d2VlbgorICAgICAgIHAtPmE4ICsgaSBhbmQg cC0+Ym4gKyBpIHNvIHRoZSAibWF5IG92ZXJsYXAiIHdhcm5pbmcgdHJpZ2dlcnMuICAqLworICAg IGNoYXIgKmQgPSBwLT5hOCArIGk7CisgICAgY2hhciAqcyA9IHAtPmJuOworICAgIHNwcmludGYg KGQsICIlcyIsIHMpOyAgICAgICAvLyB7IGRnLWJvZ3VzICItV3Jlc3RyaWN0IiAicHI/Pz8/Pz8i IHsgeGZhaWwgKi0qLSogfSB9CisgICAgc2luayAocCk7CisgIH0KKworICB7CisgICAgY2hhciAq ZCA9IHAtPmE4OworICAgIGNoYXIgKnMgPSBwLT5ibiArIGo7CisgICAgc3ByaW50ZiAoZCwgIiVz Iiwgcyk7ICAgICAgIC8vIHsgZGctYm9ndXMgIi1XcmVzdHJpY3QiICJwcj8/Pz8/PyIgeyB4ZmFp bCAqLSotKiB9IH0KKyAgICBzaW5rIChwKTsKKyAgfQorCisgIHsKKyAgICBjaGFyICpkID0gcC0+ YTggKyBpOworICAgIGNoYXIgKnMgPSBwLT5ibiArIGo7CisgICAgc3ByaW50ZiAoZCwgIiVzIiwg cyk7ICAgICAgIC8vIHsgZGctYm9ndXMgIi1XcmVzdHJpY3QiICJwcj8/Pz8/PyIgeyB4ZmFpbCAq LSotKiB9IH0KKyAgICBzaW5rIChwKTsKKyAgfQorCisgIHsKKyAgICBjaGFyICpkID0gcC0+YW4g KyBpOworICAgIGNoYXIgKnMgPSBwLT5ibjsKKyAgICBzcHJpbnRmIChkLCAiJXMiLCBzKTsKKyAg ICBzaW5rIChwKTsKKyAgfQorCisgIHsKKyAgICBjaGFyICpkID0gcC0+YW47CisgICAgY2hhciAq cyA9IHAtPmJuICsgajsKKyAgICBzcHJpbnRmIChkLCAiJXMiLCBzKTsKKyAgICBzaW5rIChwKTsK KyAgfQorCisgIHsKKyAgICBjaGFyICpkID0gcC0+YW4gKyBpOworICAgIGNoYXIgKnMgPSBwLT5i biArIGo7CisgICAgc3ByaW50ZiAoZCwgIiVzIiwgcyk7CisgICAgc2luayAocCk7CisgIH0KKwor ICB7CisgICAgY2hhciAqZCA9IHAtPmFuICsgaTsKKyAgICBjaGFyICpzID0gcC0+YTg7CisgICAg c3ByaW50ZiAoZCwgIiVzIiwgcyk7CisgICAgc2luayAocCk7CisgIH0KKworICB7CisgICAgY2hh ciAqZCA9IHAtPmFuOworICAgIGNoYXIgKnMgPSBwLT5hOCArIGo7CisgICAgc3ByaW50ZiAoZCwg IiVzIiwgcyk7CisgICAgc2luayAocCk7CisgIH0KKworICB7CisgICAgY2hhciAqZCA9IHAtPmFu ICsgaTsKKyAgICBjaGFyICpzID0gcC0+YTggKyBqOworICAgIHNwcmludGYgKGQsICIlcyIsIHMp OworICAgIHNpbmsgKHApOworICB9CisKKyAgeworICAgIGNoYXIgKmQgPSBwLT5ibiArIGk7Cisg ICAgY2hhciAqcyA9IHAtPmE4OworICAgIHNwcmludGYgKGQsICIlcyIsIHMpOyAgICAgICAvLyB7 IGRnLWJvZ3VzICItV3Jlc3RyaWN0IiAicHI/Pz8/Pz8iIHsgeGZhaWwgKi0qLSogfSB9CisgICAg c2luayAocCk7CisgIH0KKworICB7CisgICAgY2hhciAqZCA9IHAtPmJuOworICAgIGNoYXIgKnMg PSBwLT5hOCArIGo7CisgICAgc3ByaW50ZiAoZCwgIiVzIiwgcyk7ICAgICAgIC8vIHsgZGctYm9n dXMgIi1XcmVzdHJpY3QiICJwcj8/Pz8/PyIgeyB4ZmFpbCAqLSotKiB9IH0KKyAgICBzaW5rIChw KTsKKyAgfQorCisgIHsKKyAgICBjaGFyICpkID0gcC0+Ym4gKyBpOworICAgIGNoYXIgKnMgPSBw LT5hOCArIGo7CisgICAgc3ByaW50ZiAoZCwgIiVzIiwgcyk7ICAgICAgIC8vIHsgZGctYm9ndXMg Ii1XcmVzdHJpY3QiICJwcj8/Pz8/PyIgeyB4ZmFpbCAqLSotKiB9IH0KKyAgICBzaW5rIChwKTsK KyAgfQorCisgIHsKKyAgICBjaGFyICpkID0gcC0+Ym4gKyBpOworICAgIGNoYXIgKnMgPSBwLT5i bjsKKyAgICBzcHJpbnRmIChkLCAiJXMiLCBzKTsgICAgICAgLy8geyBkZy13YXJuaW5nICJtYXkg b3ZlcmxhcCIgfQorICAgIHNpbmsgKHApOworICB9CisKKyAgeworICAgIGNoYXIgKmQgPSBwLT5i bjsKKyAgICBjaGFyICpzID0gcC0+Ym4gKyBqOworICAgIHNwcmludGYgKGQsICIlcyIsIHMpOyAg ICAgICAvLyB7IGRnLXdhcm5pbmcgIm1heSBvdmVybGFwIiB9CisgICAgc2luayAocCk7CisgIH0K KworICB7CisgICAgY2hhciAqZCA9IHAtPmJuICsgaTsKKyAgICBjaGFyICpzID0gcC0+Ym4gKyBq OworICAgIHNwcmludGYgKGQsICIlcyIsIHMpOyAgICAgICAvLyB7IGRnLXdhcm5pbmcgIm1heSBv dmVybGFwIiB9CisgICAgc2luayAocCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3Vp dGUvZ2NjLmRnL1dyZXN0cmljdC0yNi5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvV3Jlc3RyaWN0 LTI2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmExMGM0MjZhMDgx Ci0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvV3Jlc3RyaWN0LTI2LmMK QEAgLTAsMCArMSwxMTQgQEAKKy8qIFZlcmlmeSB0aGF0IHNwcmludGYgY2FsbHMgd2l0aCBhcnJh eXMgb3Igc3RydWN0IG9mIGFycmF5cyBkb24ndAorICAgY2F1c2UgLVdyZXN0cmljdCBmYWxzZSBw b3NpdGl2ZXMuCisgICB7IGRnLWRvIGNvbXBpbGUgfQorICAgeyBkZy1vcHRpb25zICItTzIgLVdh bGwgLVdyZXN0cmljdCAtZnRyYWNrLW1hY3JvLWV4cGFuc2lvbj0wIiB9ICovCisKKyNkZWZpbmUg c3ByaW50ZihkLCBmLCAuLi4pIChzcHJpbnRmIChkLCBmLCBfX1ZBX0FSR1NfXyksIHNpbmsgKGQp KQorCitleHRlcm4gdm9pZCBzaW5rICh2b2lkKiwgLi4uKTsKK2V4dGVybiBpbnQgKHNwcmludGYp IChjaGFyKiwgY29uc3QgY2hhciosIC4uLik7CisKK2V4dGVybiBjaGFyIGNhW11bMl1bOF07CisK K3ZvaWQgdGVzdF9hcnJheV9vZl9hcnJheXMgKHZvaWQpCit7CisgIHNwcmludGYgKGNhWzBdWzBd LCAiJXMiLCBjYVswXVswXSk7ICAgICAvLyB7IGRnLXdhcm5pbmcgIi1XcmVzdHJpY3QiIH0KKyAg c3ByaW50ZiAoY2FbMF1bMF0sICIlcyIsIGNhWzBdWzFdKTsKKyAgc3ByaW50ZiAoY2FbMF1bMF0s ICIlcyIsIGNhWzFdWzBdKTsKKyAgc3ByaW50ZiAoY2FbMF1bMF0sICIlcyIsIGNhWzFdWzFdKTsK KworICBzcHJpbnRmIChjYVswXVsxXSwgIiVzIiwgY2FbMF1bMF0pOworICBzcHJpbnRmIChjYVsw XVsxXSwgIiVzIiwgY2FbMF1bMV0pOyAgICAgLy8geyBkZy13YXJuaW5nICItV3Jlc3RyaWN0IiB9 CisgIHNwcmludGYgKGNhWzBdWzFdLCAiJXMiLCBjYVsxXVswXSk7CisgIHNwcmludGYgKGNhWzBd WzFdLCAiJXMiLCBjYVsxXVsxXSk7CisKKyAgc3ByaW50ZiAoY2FbMV1bMF0sICIlcyIsIGNhWzBd WzBdKTsKKyAgc3ByaW50ZiAoY2FbMV1bMF0sICIlcyIsIGNhWzBdWzFdKTsKKyAgc3ByaW50ZiAo Y2FbMV1bMF0sICIlcyIsIGNhWzFdWzBdKTsgICAgIC8vIHsgZGctd2FybmluZyAiLVdyZXN0cmlj dCIgfQorICBzcHJpbnRmIChjYVsxXVswXSwgIiVzIiwgY2FbMV1bMV0pOworCisgIHNwcmludGYg KGNhWzFdWzFdLCAiJXMiLCBjYVswXVswXSk7CisgIHNwcmludGYgKGNhWzFdWzFdLCAiJXMiLCBj YVswXVsxXSk7CisgIHNwcmludGYgKGNhWzFdWzFdLCAiJXMiLCBjYVsxXVswXSk7CisgIHNwcmlu dGYgKGNhWzFdWzFdLCAiJXMiLCBjYVsxXVsxXSk7ICAgICAvLyB7IGRnLXdhcm5pbmcgIi1XcmVz dHJpY3QiIH0KK30KKworCitzdHJ1Y3QgQQoreworICBjaGFyIGFbMl1bMl1bOF07CisgIGNoYXIg YlsyXVsyXVs4XTsKKyAgY2hhciBjWzJdWzJdWzhdOworfTsKKworZXh0ZXJuIHN0cnVjdCBBIGFh W11bMl07CisKK3ZvaWQgdGVzdF9hcnJheV9vZl9zdHJ1Y3RzICh2b2lkKQoreworICAvLyBWZXJp ZnkgdGhhdCBjYWxscyB3aXRoIHRoZSBzYW1lIGVsZW1lbnRzIG9mIHRoZSBzYW1lIGFycmF5IHRy aWdnZXIKKyAgLy8gd2FybmluZ3MgYXMgZXhwZWN0ZWQuCisgIHNwcmludGYgKGFhWzBdWzBdLmFb MF1bMF0sICIlcyIsIGFhWzBdWzBdLmFbMF1bMF0pOyAgICAgLy8geyBkZy13YXJuaW5nICItV3Jl c3RyaWN0IiB9CisgIHNwcmludGYgKGFhWzBdWzBdLmFbMF1bMV0sICIlcyIsIGFhWzBdWzBdLmFb MF1bMV0pOyAgICAgLy8geyBkZy13YXJuaW5nICItV3Jlc3RyaWN0IiB9CisgIHNwcmludGYgKGFh WzBdWzBdLmFbMV1bMF0sICIlcyIsIGFhWzBdWzBdLmFbMV1bMF0pOyAgICAgLy8geyBkZy13YXJu aW5nICItV3Jlc3RyaWN0IiB9CisgIHNwcmludGYgKGFhWzBdWzBdLmFbMV1bMV0sICIlcyIsIGFh WzBdWzBdLmFbMV1bMV0pOyAgICAgLy8geyBkZy13YXJuaW5nICItV3Jlc3RyaWN0IiB9CisgIHNw cmludGYgKGFhWzBdWzFdLmFbMF1bMF0sICIlcyIsIGFhWzBdWzFdLmFbMF1bMF0pOyAgICAgLy8g eyBkZy13YXJuaW5nICItV3Jlc3RyaWN0IiB9CisgIHNwcmludGYgKGFhWzBdWzFdLmFbMF1bMV0s ICIlcyIsIGFhWzBdWzFdLmFbMF1bMV0pOyAgICAgLy8geyBkZy13YXJuaW5nICItV3Jlc3RyaWN0 IiB9CisgIHNwcmludGYgKGFhWzBdWzFdLmFbMV1bMF0sICIlcyIsIGFhWzBdWzFdLmFbMV1bMF0p OyAgICAgLy8geyBkZy13YXJuaW5nICItV3Jlc3RyaWN0IiB9CisgIHNwcmludGYgKGFhWzBdWzFd LmFbMV1bMV0sICIlcyIsIGFhWzBdWzFdLmFbMV1bMV0pOyAgICAgLy8geyBkZy13YXJuaW5nICIt V3Jlc3RyaWN0IiB9CisgIHNwcmludGYgKGFhWzFdWzBdLmFbMF1bMF0sICIlcyIsIGFhWzFdWzBd LmFbMF1bMF0pOyAgICAgLy8geyBkZy13YXJuaW5nICItV3Jlc3RyaWN0IiB9CisgIHNwcmludGYg KGFhWzFdWzBdLmFbMF1bMV0sICIlcyIsIGFhWzFdWzBdLmFbMF1bMV0pOyAgICAgLy8geyBkZy13 YXJuaW5nICItV3Jlc3RyaWN0IiB9CisgIHNwcmludGYgKGFhWzFdWzBdLmFbMV1bMF0sICIlcyIs IGFhWzFdWzBdLmFbMV1bMF0pOyAgICAgLy8geyBkZy13YXJuaW5nICItV3Jlc3RyaWN0IiB9Cisg IHNwcmludGYgKGFhWzFdWzBdLmFbMV1bMV0sICIlcyIsIGFhWzFdWzBdLmFbMV1bMV0pOyAgICAg Ly8geyBkZy13YXJuaW5nICItV3Jlc3RyaWN0IiB9CisgIHNwcmludGYgKGFhWzFdWzFdLmFbMF1b MF0sICIlcyIsIGFhWzFdWzFdLmFbMF1bMF0pOyAgICAgLy8geyBkZy13YXJuaW5nICItV3Jlc3Ry aWN0IiB9CisgIHNwcmludGYgKGFhWzFdWzFdLmFbMF1bMV0sICIlcyIsIGFhWzFdWzFdLmFbMF1b MV0pOyAgICAgLy8geyBkZy13YXJuaW5nICItV3Jlc3RyaWN0IiB9CisgIHNwcmludGYgKGFhWzFd WzFdLmFbMV1bMF0sICIlcyIsIGFhWzFdWzFdLmFbMV1bMF0pOyAgICAgLy8geyBkZy13YXJuaW5n ICItV3Jlc3RyaWN0IiB9CisgIHNwcmludGYgKGFhWzFdWzFdLmFbMV1bMV0sICIlcyIsIGFhWzFd WzFdLmFbMV1bMV0pOyAgICAgLy8geyBkZy13YXJuaW5nICItV3Jlc3RyaWN0IiB9CisKKyNkZWZp bmUgTk9XQVJOKCkKKworICAvLyBFeGhhdXN0aXZlbHkgdmVyaWZ5IHRoYXQgY2FsbHMgd2l0aCBk aWZmZXJlbnQgZWxlbWVudHMgb2YgdGhlIHNhbWUKKyAgLy8gYXJyYXkgZG9uJ3QgY2F1c2UgZmFs c2UgcG9zaXRpdmVzLgorI3VuZGVmIE5PV0FSTgorI2RlZmluZSBOT1dBUk4oRCwgUykJCQkJXAor ICBzcHJpbnRmIChEWzBdWzBdLCAiJXMiLCBTWzBdWzBdKTsJCVwKKyAgc3ByaW50ZiAoRFswXVsw XSwgIiVzIiwgU1swXVsxXSk7CQlcCisgIHNwcmludGYgKERbMF1bMF0sICIlcyIsIFNbMV1bMF0p OwkJXAorICBzcHJpbnRmIChEWzBdWzBdLCAiJXMiLCBTWzFdWzFdKTsJCVwKKyAgc3ByaW50ZiAo RFswXVsxXSwgIiVzIiwgU1swXVswXSk7CQlcCisgIHNwcmludGYgKERbMF1bMV0sICIlcyIsIFNb MF1bMV0pOwkJXAorICBzcHJpbnRmIChEWzBdWzFdLCAiJXMiLCBTWzFdWzBdKTsJCVwKKyAgc3By aW50ZiAoRFswXVsxXSwgIiVzIiwgU1sxXVsxXSk7CQlcCisgIHNwcmludGYgKERbMV1bMF0sICIl cyIsIFNbMF1bMF0pOwkJXAorICBzcHJpbnRmIChEWzFdWzBdLCAiJXMiLCBTWzBdWzFdKTsJCVwK KyAgc3ByaW50ZiAoRFsxXVswXSwgIiVzIiwgU1sxXVswXSk7CQlcCisgIHNwcmludGYgKERbMV1b MF0sICIlcyIsIFNbMV1bMV0pOwkJXAorICBzcHJpbnRmIChEWzFdWzFdLCAiJXMiLCBTWzBdWzBd KTsJCVwKKyAgc3ByaW50ZiAoRFsxXVsxXSwgIiVzIiwgU1swXVsxXSk7CQlcCisgIHNwcmludGYg KERbMV1bMV0sICIlcyIsIFNbMV1bMF0pOwkJXAorICBzcHJpbnRmIChEWzFdWzFdLCAiJXMiLCBT WzFdWzFdKQorCisgIE5PV0FSTiAoYWFbMF1bMF0uYSwgYWFbMF1bMV0uYSk7CisgIE5PV0FSTiAo YWFbMF1bMF0uYSwgYWFbMV1bMF0uYSk7CisgIE5PV0FSTiAoYWFbMF1bMF0uYSwgYWFbMV1bMV0u YSk7CisKKyAgTk9XQVJOIChhYVswXVsxXS5hLCBhYVswXVswXS5hKTsKKyAgTk9XQVJOIChhYVsw XVsxXS5hLCBhYVsxXVswXS5hKTsKKyAgTk9XQVJOIChhYVswXVsxXS5hLCBhYVsxXVsxXS5hKTsK KworICBOT1dBUk4gKGFhWzFdWzBdLmEsIGFhWzBdWzBdLmEpOworICBOT1dBUk4gKGFhWzFdWzBd LmEsIGFhWzBdWzFdLmEpOworICBOT1dBUk4gKGFhWzFdWzBdLmEsIGFhWzFdWzFdLmEpOworCisj ZGVmaW5lIE5PV0FSTl9NRU0oTTEsIE0yKQkJCVwKKyAgTk9XQVJOIChhYVswXVswXS5NMSwgYWFb MF1bMF0uTTIpOwkJXAorICBOT1dBUk4gKGFhWzBdWzBdLk0xLCBhYVswXVsxXS5NMik7CQlcCisg IE5PV0FSTiAoYWFbMF1bMF0uTTEsIGFhWzFdWzBdLk0yKTsJCVwKKyAgTk9XQVJOIChhYVswXVsw XS5NMSwgYWFbMV1bMV0uTTIpCisKKyAgTk9XQVJOX01FTSAoYSwgYik7CisgIE5PV0FSTl9NRU0g KGEsIGMpOworICBOT1dBUk5fTUVNIChiLCBhKTsKKyAgTk9XQVJOX01FTSAoYiwgYyk7CisgIE5P V0FSTl9NRU0gKGMsIGEpOworICBOT1dBUk5fTUVNIChjLCBiKTsKK30K --------------m7uMFPBzmLAVC7ai9ptKVaVY--