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.133.124]) by sourceware.org (Postfix) with ESMTPS id 8E0FA3854149 for ; Fri, 16 Sep 2022 13:26:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 8E0FA3854149 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1663334787; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=onb++5d/3C1UBBCYax0K5yMmlUnRmlXhQIDWDdFFvkk=; b=EHtaEiRQnDE3yTkA4H3CkUb0s6sEUwlWvGvWT9qwPjBlPOTRQcLavm/G+SJavQX+ycUPm7 xODbKHtzObwLhvZH+z/5m62twLgilgtiO2iTv6BPmitaHNCLGs7TGtT1dT/MJ2ccB64Yzq 6zN3lJ3XUBhgy9AEAvA8p5CUWK0GWvI= Received: from mail-ot1-f69.google.com (mail-ot1-f69.google.com [209.85.210.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-620-otpdYMdINR-A0JSa-eP9Mw-1; Fri, 16 Sep 2022 09:26:25 -0400 X-MC-Unique: otpdYMdINR-A0JSa-eP9Mw-1 Received: by mail-ot1-f69.google.com with SMTP id t11-20020a9d590b000000b00655fad88dacso7867604oth.1 for ; Fri, 16 Sep 2022 06:26:25 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :x-gm-message-state:from:to:cc:subject:date; bh=onb++5d/3C1UBBCYax0K5yMmlUnRmlXhQIDWDdFFvkk=; b=JSG25nZNK0IufSaBWzGZDVUD7IMONmG2gA2LxRg9dXa9HC+3+wKgqe2UsJx7o9DBZn jEnZzZlU6A4pQqR+1xDgVjgXNyWEJHKMbEhNA6wuCJBPV0t475jMRZsP36WlwJWfZsdd hG9P+eAEqRgZL6IZ38uzI4Z3bi8zAa7GL+W1Izl6it8HB8ICwj0kGr/KA4ALGduszVxo hDhfjlFbpqcSXKpRCqQV6ThfsDo/r326shnnqq9z4ib8px5IlIt6H6P43crRUh3o0xhJ VK4j3m0bwV6CLge1nev6oafXmnXNMhxw6/JK+MWBDQMNSobaLMb090MCi6x86VrLK1xR 7aCw== X-Gm-Message-State: ACrzQf2yCMI00PNvRVuyO7wyoMM1NUaR+p+q7xyr0X+Ba3y65Oo1dN18 BHn9WEpT/Uty27FcsMAdKVYikPQBfFy1ND87BesZiKgWZ4w15YcFl1dxlZpfOpngR+olBWq0XnS C/gKcxi9dBBwOmtRPnSAQEN5jiV2H7raFeg== X-Received: by 2002:a05:6808:1a98:b0:34f:8b40:6263 with SMTP id bm24-20020a0568081a9800b0034f8b406263mr2351108oib.265.1663334784737; Fri, 16 Sep 2022 06:26:24 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5Jp1bS/y9+qN/7GXiwkgMVHmqDI9SbLof1M32HwAMVT1XpawCUQrtYjcYChqKX3DPXSq6QFevnCH3s9rgxDPo= X-Received: by 2002:a05:6808:1a98:b0:34f:8b40:6263 with SMTP id bm24-20020a0568081a9800b0034f8b406263mr2351086oib.265.1663334784294; Fri, 16 Sep 2022 06:26:24 -0700 (PDT) MIME-Version: 1.0 References: <20220915054026.1359564-1-aldyh@redhat.com> In-Reply-To: From: Aldy Hernandez Date: Fri, 16 Sep 2022 15:26:13 +0200 Message-ID: Subject: Re: [PATCH] Rewrite NAN and sign handling in frange To: Aldy Hernandez via Gcc-patches , Richard Biener , Aldy Hernandez , Jakub Jelinek , richard.sandiford@arm.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="000000000000f648d405e8cb4ed8" X-Spam-Status: No, score=-11.9 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE,SPF_NONE,TXREP 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: --000000000000f648d405e8cb4ed8 Content-Type: text/plain; charset="UTF-8" On Fri, Sep 16, 2022 at 10:33 AM Richard Sandiford wrote: > > Aldy Hernandez via Gcc-patches writes: > > On Thu, Sep 15, 2022 at 9:06 AM Richard Biener > > wrote: > >> > >> On Thu, Sep 15, 2022 at 7:41 AM Aldy Hernandez wrote: > >> > > >> > Hi Richard. Hi all. > >> > > >> > The attatched patch rewrites the NAN and sign handling, dropping both > >> > tristates in favor of a pair of boolean flags for NANs, and nothing at > >> > all for signs. The signs are tracked in the range itself, so now it's > >> > possible to describe things like [-0.0, +0.0] +NAN, [+0, +0], [-5, +0], > >> > [+0, 3] -NAN, etc. > >> > > >> > There are a lot of changes, as the tristate was quite pervasive. I > >> > could use another pair of eyes. The code IMO is cleaner and handles > >> > all the cases we discussed. > >> > > >> > Here is an example of the various ranges and how they are displayed: > >> > > >> > [frange] float VARYING NAN ;; Varying includes NAN > >> > [frange] UNDEFINED ;; Empty set as always > >> > [frange] float [] NAN ;; Unknown sign NAN > >> > [frange] float [] -NAN ;; -NAN > >> > [frange] float [] +NAN ;; +NAN > >> > [frange] float [-0.0, 0.0] ;; All zeros. > >> > [frange] float [-0.0, -0.0] NAN ;; -0 or NAN. > >> > [frange] float [-5.0e+0, -1.0e+0] +NAN ;; [-5, -1] or +NAN > >> > [frange] float [-5.0e+0, -0.0] NAN ;; [-5, -0] or +-NAN > >> > [frange] float [-5.0e+0, -0.0] ;; [-5, -0] > >> > [frange] float [5.0e+0, 1.0e+1] ;; [5, 10] > >> > > >> > We could represent an unknown sign with +NAN -NAN if preferred. > >> > >> maybe -+NAN or +-NAN? I prefer to somehow show both signs for clarity > > > > Sure. > > > >> > >> > > >> > Notice the NAN signs are decoupled from the range, so we can represent > >> > a negative range with a positive NAN. For this range, > >> > frange::known_bit() would return false, as only when the signs of the > >> > NANs and range agree can we be certain. > >> > > >> > There is no longer any pessimization of ranges for intersects > >> > involving NANs. Also, union and intersect work with signed zeros: > >> > > >> > // [-0, x] U [+0, x] => [-0, x] > >> > // [ x, -0] U [ x, +0] => [ x, +0] > >> > // [-0, x] ^ [+0, x] => [+0, x] > >> > // [ x, -0] ^ [ x, +0] => [ x, -0] > >> > > >> > The special casing for signed zeros in the singleton code is gone in > >> > favor of just making sure the signs in the range agree, that is > >> > [-0, -0] for example. > >> > > >> > I have removed the idea that a known NAN is a "range", so a NAN is no > >> > longer in the endpoints itself. Requesting the bound of a known NAN > >> > is a hard fail. For that matter, we don't store the actual NAN in the > >> > range. The only information we have are the set of boolean flags. > >> > This way we make sure nothing seeps into the frange. This also means > >> > it's explicit that we don't track anything but the sign in NANs. We > >> > can revisit this if we desire to track signalling or whatever > >> > concoction y'all can imagine. > >> > > >> > All in all, I'm quite happy with this. It does look better, and we > >> > handle all the corner cases we couldn't before. Thanks for the > >> > suggestion. > >> > > >> > Regstrapped with mpfr tests on x86-64 and ppc64le Linux. Selftests > >> > were also run with -ffinite-math-only on x86-64. > >> > > >> > At Jakub's suggestion, I built lapack with associated tests. They > >> > pass on x86-64 and ppc64le Linux with no regressions from mainline. > >> > As a sanity check, I also ran them for -ffinite-math-only on x86 which > >> > (as expected) returned: > >> > > >> > NaN arithmetic did not perform per the ieee spec > >> > > >> > Otherwise, all tests pass for -ffinite-math-only. > >> > > >> > How does this look? > >> > >> Overall it looks good. > >> > >> Reading ::intersect and ::union I find it less clear to spread out the _nan > >> cases into separate functions. > > > > OK, will inline them. > > > >> > >> Can you add a comment to frange that its representation is > >> a single value-range specified by m_type, m_min, m_max > >> unioned with the set of { -NaN, +NaN }? Because somehow > >> the ::undefined_p vs. m_type == VR_UNDEFINED checks are > >> a bit confusing to the occasional reader can we instead use > >> ::nan_p to complement ::undefined_p? > > > > Wouldn't that just make nan_p the same as known_nan? Speaking of > > which, I'm not a big fan of known_nan. Perhaps we should rename all > > the known_foo variants to foo_p variants? Or...maybe even: > > > > // fpclassify like API > > bool isfinite () const; > > bool isinf () const; > > bool maybe_isinf () const; > > bool isnan () const; > > bool maybe_isnan () const; > > bool signbit_p (bool &signbit) const; > > > > That would make it clear how they map to the fpclassify API. And the > > signbit_p() follows what we do for singleton_p(tree *). > > > > isnan() would be your nan_p suggestion. > > FWIW, the reason I didn't do this with the poly_int stuff is that > it makes negative conditions harder to reason about. It's easy for > tired eyes to read: > > !isfinite() > > as meaning "is infinite", especially since there isn't a separate > isinfinite() query. But if isfinite() is equivalent to known_isfinite() > then !isfinite() instead means "might be infinite". !known_isfinite() > IMO makes that more explicit. Ughh, fair enough. I've settled on: bool known_isfinite () const; bool known_isnan () const; bool known_isinf () const; bool maybe_isnan () const; bool maybe_isinf () const; bool signbit_p (bool &signbit) const; Let me know what you think. In this next revision, I have addressed a few of the suggestions by Richi, though I have left the out-of-line handling of NANs for intersect/union because I still find them more readable (for now). This may get shuffled again if we implement frange_base and frange, so hang on. Also, I opted to implement ][ NAN with m_kind == VR_NAN instead of overloading VR_UNDEFINED. This makes the code less confusing. I have retested on x86-64 Linux. Let me know what y'all think. Thanks. Aldy --000000000000f648d405e8cb4ed8 Content-Type: text/x-patch; charset="US-ASCII"; name="0001-Rewrite-NAN-and-sign-handling-in-frange.patch" Content-Disposition: attachment; filename="0001-Rewrite-NAN-and-sign-handling-in-frange.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_l84ijk4i0 RnJvbSAxMzY2YTRjMjFlYjU5NDYxNmMyMjdhM2Q3Njk0YjU0YWNhZjgzZWY4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGR5IEhlcm5hbmRleiA8YWxkeWhAcmVkaGF0LmNvbT4KRGF0 ZTogV2VkLCAxNCBTZXAgMjAyMiAwODozMjozNCArMDIwMApTdWJqZWN0OiBbUEFUQ0hdIFJld3Jp dGUgTkFOIGFuZCBzaWduIGhhbmRsaW5nIGluIGZyYW5nZQoKVGhlIGF0dGF0Y2hlZCBwYXRjaCBy ZXdyaXRlcyB0aGUgTkFOIGFuZCBzaWduIGhhbmRsaW5nLCBkcm9wcGluZyBib3RoCnRyaXN0YXRl cyBpbiBmYXZvciBvZiBhIHBhaXIgb2YgYm9vbGVhbiBmbGFncyBmb3IgTkFOcywgYW5kIG5vdGhp bmcgYXQKYWxsIGZvciBzaWducy4gIFRoZSBzaWducyBhcmUgdHJhY2tlZCBpbiB0aGUgcmFuZ2Ug aXRzZWxmLCBzbyBub3cgaXQncwpwb3NzaWJsZSB0byBkZXNjcmliZSB0aGluZ3MgbGlrZSBbLTAu MCwgKzAuMF0gK05BTiwgWyswLCArMF0sIFstNSwgKzBdLApbKzAsIDNdIC1OQU4sIGV0Yy4KCkhl cmUgaXMgYW4gZXhhbXBsZSBvZiB0aGUgdmFyaW91cyByYW5nZXMgYW5kIGhvdyB0aGV5IGFyZSBk aXNwbGF5ZWQ6CgogICAgW2ZyYW5nZV0gZmxvYXQgVkFSWUlORyBOQU4gOzsgVmFyeWluZyBpbmNs dWRlcyBOQU4KICAgIFtmcmFuZ2VdIFVOREVGSU5FRCAgICAgICAgICAgICAgICAgICAgICA7OyBF bXB0eSBzZXQgYXMgYWx3YXlzCiAgICBbZnJhbmdlXSBmbG9hdCBbXSArLU5BTiAgICAgICAgICAg ICAgICAgOzsgVW5rbm93biBzaWduIE5BTgogICAgW2ZyYW5nZV0gZmxvYXQgW10gLU5BTiAgICAg ICAgICAgICAgICAgIDs7IC1OQU4KICAgIFtmcmFuZ2VdIGZsb2F0IFtdICtOQU4gICAgICAgICAg ICAgICAgICA7OyArTkFOCiAgICBbZnJhbmdlXSBmbG9hdCBbLTAuMCwgMC4wXSAgICAgICAgICAg ICAgOzsgQWxsIHplcm9zLgogICAgW2ZyYW5nZV0gZmxvYXQgWy0wLjAsIC0wLjBdICstTkFOICAg ICAgIDs7IC0wIG9yIE5BTi4KICAgIFtmcmFuZ2VdIGZsb2F0IFstNS4wZSswLCAtMS4wZSswXSAr TkFOICA7OyBbLTUsIC0xXSBvciArTkFOCiAgICBbZnJhbmdlXSBmbG9hdCBbLTUuMGUrMCwgLTAu MF0gKy1OQU4gICAgOzsgWy01LCAtMF0gb3IgTkFOCiAgICBbZnJhbmdlXSBmbG9hdCBbLTUuMGUr MCwgLTAuMF0gICAgICAgICAgOzsgWy01LCAtMF0KICAgIFtmcmFuZ2VdIGZsb2F0IFs1LjBlKzAs IDEuMGUrMV0gICAgICAgICA7OyBbNSwgMTBdCgpOb3RpY2UgdGhlIE5BTiBzaWducyBhcmUgZGVj b3VwbGVkIGZyb20gdGhlIHJhbmdlLCBzbyB3ZSBjYW4gcmVwcmVzZW50CmEgbmVnYXRpdmUgcmFu Z2Ugd2l0aCBhIHBvc2l0aXZlIE5BTi4gIEZvciB0aGlzIHJhbmdlLApmcmFuZ2U6OnNpZ25iaXRf cCgpIHdvdWxkIHJldHVybiBmYWxzZSwgYXMgb25seSB3aGVuIHRoZSBzaWducyBvZiB0aGUKTkFO cyBhbmQgcmFuZ2UgYWdyZWUgY2FuIHdlIGJlIGNlcnRhaW4uCgpUaGVyZSBpcyBubyBsb25nZXIg YW55IHBlc3NpbWl6YXRpb24gb2YgcmFuZ2VzIGZvciBpbnRlcnNlY3RzCmludm9sdmluZyBOQU5z LiAgQWxzbywgdW5pb24gYW5kIGludGVyc2VjdCB3b3JrIHdpdGggc2lnbmVkIHplcm9zOgoKLy8g ICBbLTAsICB4XSBVIFsrMCwgIHhdID0+IFstMCwgIHhdCi8vICAgWyB4LCAtMF0gVSBbIHgsICsw XSA9PiBbIHgsICswXQovLyAgIFstMCwgIHhdIF4gWyswLCAgeF0gPT4gWyswLCAgeF0KLy8gICBb IHgsIC0wXSBeIFsgeCwgKzBdID0+IFsgeCwgLTBdCgpUaGUgc3BlY2lhbCBjYXNpbmcgZm9yIHNp Z25lZCB6ZXJvcyBpbiB0aGUgc2luZ2xldG9uIGNvZGUgaXMgZ29uZSBpbgpmYXZvciBvZiBqdXN0 IG1ha2luZyBzdXJlIHRoZSBzaWducyBpbiB0aGUgcmFuZ2UgYWdyZWUsIHRoYXQgaXMKWy0wLCAt MF0gZm9yIGV4YW1wbGUuCgpJIGhhdmUgcmVtb3ZlZCB0aGUgaWRlYSB0aGF0IGEga25vd24gTkFO IGlzIGEgInJhbmdlIiwgc28gYSBOQU4gaXMgbm8KbG9uZ2VyIGluIHRoZSBlbmRwb2ludHMgaXRz ZWxmLiAgUmVxdWVzdGluZyB0aGUgYm91bmQgb2YgYSBrbm93biBOQU4KaXMgYSBoYXJkIGZhaWwu ICBGb3IgdGhhdCBtYXR0ZXIsIHdlIGRvbid0IHN0b3JlIHRoZSBhY3R1YWwgTkFOIGluIHRoZQpy YW5nZS4gIFRoZSBvbmx5IGluZm9ybWF0aW9uIHdlIGhhdmUgYXJlIHRoZSBzZXQgb2YgYm9vbGVh biBmbGFncy4KVGhpcyB3YXkgd2UgbWFrZSBzdXJlIG5vdGhpbmcgc2VlcHMgaW50byB0aGUgZnJh bmdlLiAgVGhpcyBhbHNvIG1lYW5zCml0J3MgZXhwbGljaXQgdGhhdCB3ZSBkb24ndCB0cmFjayBh bnl0aGluZyBidXQgdGhlIHNpZ24gaW4gTkFOcy4gIFdlCmNhbiByZXZpc2l0IHRoaXMgaWYgd2Ug ZGVzaXJlIHRvIHRyYWNrIHNpZ25hbGxpbmcgb3Igd2hhdGV2ZXIKY29uY29jdGlvbiB5J2FsbCBj YW4gaW1hZ2luZS4KClJlZ3N0cmFwcGVkIHdpdGggbXBmciB0ZXN0cyBvbiB4ODYtNjQgYW5kIHBw YzY0bGUgTGludXguICBTZWxmdGVzdHMKd2VyZSBhbHNvIHJ1biB3aXRoIC1mZmluaXRlLW1hdGgt b25seSBvbiB4ODYtNjQuCgpBdCBKYWt1YidzIHN1Z2dlc3Rpb24sIEkgYnVpbHQgbGFwYWNrIHdp dGggYXNzb2NpYXRlZCB0ZXN0cy4gIFRoZXkKcGFzcyBvbiB4ODYtNjQgYW5kIHBwYzY0bGUgTGlu dXggd2l0aCBubyByZWdyZXNzaW9ucyBmcm9tIG1haW5saW5lLgpBcyBhIHNhbml0eSBjaGVjaywg SSBhbHNvIHJhbiB0aGVtIGZvciAtZmZpbml0ZS1tYXRoLW9ubHkgb24geDg2IHdoaWNoCihhcyBl eHBlY3RlZCkgcmV0dXJuZWQ6CgoJTmFOIGFyaXRobWV0aWMgZGlkIG5vdCBwZXJmb3JtIHBlciB0 aGUgaWVlZSBzcGVjCgpPdGhlcndpc2UsIGFsbCB0ZXN0cyBwYXNzIGZvciAtZmZpbml0ZS1tYXRo LW9ubHkuCgpnY2MvQ2hhbmdlTG9nOgoKCSogcmFuZ2Utb3AtZmxvYXQuY2MgKGZyYW5nZV9hZGRf emVyb3MpOiBSZXBsYWNlIHNldF9zaWduYml0IHdpdGgKCXVuaW9uIG9mIHplcm8uCgkqIHZhbHVl LXF1ZXJ5LmNjIChyYW5nZV9xdWVyeTo6Z2V0X3RyZWVfcmFuZ2UpOiBSZW1vdmUgc2V0X3NpZ25i aXQKCXVzZS4KCSogdmFsdWUtcmFuZ2UtcHJldHR5LXByaW50LmNjICh2cmFuZ2VfcHJpbnRlcjo6 cHJpbnRfZnJhbmdlX3Byb3ApOgoJUmVtb3ZlLgoJKHZyYW5nZV9wcmludGVyOjpwcmludF9mcmFu Z2VfbmFuKTogTmV3LgoJKiB2YWx1ZS1yYW5nZS1wcmV0dHktcHJpbnQuaCAocHJpbnRfZnJhbmdl X3Byb3ApOiBSZW1vdmUuCgkocHJpbnRfZnJhbmdlX25hbik6IE5ldy4KCSogdmFsdWUtcmFuZ2Ut c3RvcmFnZS5jYyAoZnJhbmdlX3N0b3JhZ2Vfc2xvdDo6c2V0X2ZyYW5nZSk6IFNldAoJa2luZCBh bmQgTkFOIGZpZWxkcy4KCShmcmFuZ2Vfc3RvcmFnZV9zbG90OjpnZXRfZnJhbmdlKTogUmVzdG9y ZSBraW5kIGFuZCBOQU4gZmllbGRzLgoJKiB2YWx1ZS1yYW5nZS1zdG9yYWdlLmggKGNsYXNzIGZy YW5nZV9zdG9yYWdlX3Nsb3QpOiBBZGQga2luZCBhbmQKCU5BTiBmaWVsZHMuCgkqIHZhbHVlLXJh bmdlLmNjIChmcmFuZ2U6OnVwZGF0ZV9uYW4pOiBSZW1vdmUuCgkoZnJhbmdlOjpzZXRfc2lnbmJp dCk6IFJlbW92ZS4KCShmcmFuZ2U6OnNldCk6IEFkanVzdCBmb3IgTkFOIGZpZWxkcy4KCShmcmFu Z2U6Om5vcm1hbGl6ZV9raW5kKTogUmVtb3ZlIG1fcHJvcHMuCgkoZnJhbmdlOjpjb21iaW5lX3pl cm9zKTogTmV3LgoJKGZyYW5nZTo6dW5pb25fbmFucyk6IE5ldy4KCShmcmFuZ2U6OnVuaW9uXyk6 IEhhbmRsZSBuZXcgTkFOIGZpZWxkcy4KCShmcmFuZ2U6OmludGVyc2VjdF9uYW5zKTogTmV3LgoJ KGZyYW5nZTo6aW50ZXJzZWN0KTogSGFuZGxlIG5ldyBOQU4gZmllbGRzLgoJKGZyYW5nZTo6b3Bl cmF0b3I9KTogU2FtZS4KCShmcmFuZ2U6Om9wZXJhdG9yPT0pOiBTYW1lLgoJKGZyYW5nZTo6Y29u dGFpbnNfcCk6IFNhbWUuCgkoZnJhbmdlOjpzaW5nbGV0b25fcCk6IFJlbW92ZSBzcGVjaWFsIGNh c2UgZm9yIHNpZ25lZCB6ZXJvcy4KCShmcmFuZ2U6OnZlcmlmeV9yYW5nZSk6IEFkanVzdCBmb3Ig bmV3IE5BTiBmaWVsZHMuCgkoZnJhbmdlOjpzZXRfemVybyk6IEhhbmRsZSBzaWduZWQgemVyb3Mu CgkoZnJhbmdlOjpzZXRfbm9ubmVnYXRpdmUpOiBTYW1lLgoJKHJhbmdlX3Rlc3RzX25hbik6IEFk anVzdCB0ZXN0cy4KCShyYW5nZV90ZXN0c19zaWduZWRfemVyb3MpOiBTYW1lLgoJKHJhbmdlX3Rl c3RzX3NpZ25iaXQpOiBTYW1lLgoJKHJhbmdlX3Rlc3RzX2Zsb2F0cyk6IFNhbWUuCgkqIHZhbHVl LXJhbmdlLmggKGNsYXNzIGZwX3Byb3ApOiBSZW1vdmUuCgkoRlBfUFJPUF9BQ0NFU1NPUik6IFJl bW92ZS4KCShjbGFzcyBmcmFuZ2VfcHJvcHMpOiBSZW1vdmUKCShmcmFuZ2U6Omxvd2VyX2JvdW5k KTogTkFOcyBkb24ndCBoYXZlIGVuZHBvaW50cy4KCShmcmFuZ2U6OnVwcGVyX2JvdW5kKTogU2Ft ZS4KCShmcmFuZ2VfcHJvcHM6Om9wZXJhdG9yPT0pOiBSZW1vdmUuCgkoZnJhbmdlX3Byb3BzOjp1 bmlvbl8pOiBSZW1vdmUuCgkoZnJhbmdlX3Byb3BzOjppbnRlcnNlY3QpOiBSZW1vdmUuCgkoZnJh bmdlOjp1cGRhdGVfbmFuKTogTmV3LgoJKGZyYW5nZTo6Y2xlYXJfbmFuKTogTmV3LgoJKGZyYW5n ZTo6dW5kZWZpbmVkX3ApOiBOZXcuCgkoZnJhbmdlOjpzZXRfbmFuKTogTmV3LgoJKGZyYW5nZTo6 a25vd25fZmluaXRlKTogQWRqdXN0IGZvciBuZXcgTkFOIHJlcHJlc2VudGF0aW9uLgoJKGZyYW5n ZTo6bWF5YmVfaXNuYW4pOiBTYW1lLgoJKGZyYW5nZTo6a25vd25faXNuYW4pOiBTYW1lLgoJKGZy YW5nZTo6c2lnbmJpdF9wKTogU2FtZS4KLS0tCiBnY2MvZ2ltcGxlLXJhbmdlLWZvbGQuY2MgICAg ICAgIHwgICAyICstCiBnY2MvcmFuZ2Utb3AtZmxvYXQuY2MgICAgICAgICAgIHwgIDM4ICstCiBn Y2MvdmFsdWUtcXVlcnkuY2MgICAgICAgICAgICAgIHwgIDExICstCiBnY2MvdmFsdWUtcmFuZ2Ut cHJldHR5LXByaW50LmNjIHwgIDQ1ICsrLQogZ2NjL3ZhbHVlLXJhbmdlLXByZXR0eS1wcmludC5o ICB8ICAgMiArLQogZ2NjL3ZhbHVlLXJhbmdlLXN0b3JhZ2UuY2MgICAgICB8ICAgOSArLQogZ2Nj L3ZhbHVlLXJhbmdlLXN0b3JhZ2UuaCAgICAgICB8ICAgNyArLQogZ2NjL3ZhbHVlLXJhbmdlLmNj ICAgICAgICAgICAgICB8IDYyMSArKysrKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0tLQogZ2Nj L3ZhbHVlLXJhbmdlLmggICAgICAgICAgICAgICB8IDIzMyArKysrKystLS0tLS0KIDkgZmlsZXMg Y2hhbmdlZCwgNDgzIGluc2VydGlvbnMoKyksIDQ4NSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQg YS9nY2MvZ2ltcGxlLXJhbmdlLWZvbGQuY2MgYi9nY2MvZ2ltcGxlLXJhbmdlLWZvbGQuY2MKaW5k ZXggODVlZDZmOWQ0N2UuLmE0NWZjN2FkNGM2IDEwMDY0NAotLS0gYS9nY2MvZ2ltcGxlLXJhbmdl LWZvbGQuY2MKKysrIGIvZ2NjL2dpbXBsZS1yYW5nZS1mb2xkLmNjCkBAIC0xMDMwLDcgKzEwMzAs NyBAQCBmb2xkX3VzaW5nX3JhbmdlOjpyYW5nZV9vZl9idWlsdGluX2ludF9jYWxsIChpcmFuZ2Ug JnIsIGdjYWxsICpjYWxsLAogCWlmIChzcmMuZ2V0X29wZXJhbmQgKHRtcCwgYXJnKSkKIAkgIHsK IAkgICAgYm9vbCBzaWduYml0OwotCSAgICBpZiAodG1wLmtub3duX3NpZ25iaXQgKHNpZ25iaXQp KQorCSAgICBpZiAodG1wLnNpZ25iaXRfcCAoc2lnbmJpdCkpCiAJICAgICAgewogCQlpZiAoc2ln bmJpdCkKIAkJICByLnNldF9ub256ZXJvICh0eXBlKTsKZGlmZiAtLWdpdCBhL2djYy9yYW5nZS1v cC1mbG9hdC5jYyBiL2djYy9yYW5nZS1vcC1mbG9hdC5jYwppbmRleCBmYmMxNGE3MzBhZC4uMWUz OWEwN2FiOTcgMTAwNjQ0Ci0tLSBhL2djYy9yYW5nZS1vcC1mbG9hdC5jYworKysgYi9nY2MvcmFu Z2Utb3AtZmxvYXQuY2MKQEAgLTE1NSw3ICsxNTUsNyBAQCByYW5nZV9vcGVyYXRvcl9mbG9hdDo6 b3AxX29wMl9yZWxhdGlvbiAoY29uc3QgaXJhbmdlICZsaHMgQVRUUklCVVRFX1VOVVNFRCkgY29u cwogc3RhdGljIGlubGluZSBib29sCiBmaW5pdGVfb3BlcmFuZF9wIChjb25zdCBmcmFuZ2UgJm9w MSkKIHsKLSAgcmV0dXJuIGZsYWdfZmluaXRlX21hdGhfb25seSB8fCAhb3AxLm1heWJlX25hbiAo KTsKKyAgcmV0dXJuIGZsYWdfZmluaXRlX21hdGhfb25seSB8fCAhb3AxLm1heWJlX2lzbmFuICgp OwogfQogCiAvLyBSZXR1cm4gVFJVRSBpZiBPUDEgYW5kIE9QMiBhcmUga25vd24gdG8gYmUgZnJl ZSBvZiBOQU5zLgpAQCAtMTYzLDcgKzE2Myw3IEBAIGZpbml0ZV9vcGVyYW5kX3AgKGNvbnN0IGZy YW5nZSAmb3AxKQogc3RhdGljIGlubGluZSBib29sCiBmaW5pdGVfb3BlcmFuZHNfcCAoY29uc3Qg ZnJhbmdlICZvcDEsIGNvbnN0IGZyYW5nZSAmb3AyKQogewotICByZXR1cm4gZmxhZ19maW5pdGVf bWF0aF9vbmx5IHx8ICghb3AxLm1heWJlX25hbiAoKSAmJiAhb3AyLm1heWJlX25hbiAoKSk7Cisg IHJldHVybiBmbGFnX2Zpbml0ZV9tYXRoX29ubHkgfHwgKCFvcDEubWF5YmVfaXNuYW4gKCkgJiYg IW9wMi5tYXliZV9pc25hbiAoKSk7CiB9CiAKIC8vIEZsb2F0aW5nIHZlcnNpb24gb2YgcmVsb3Bf ZWFybHlfcmVzb2x2ZSB0aGF0IHRha2VzIGludG8gYWNjb3VudCBOQU4KQEAgLTIxMywxMiArMjEz LDE2IEBAIGZyYW5nZV9kcm9wX25pbmYgKGZyYW5nZSAmciwgdHJlZSB0eXBlKQogc3RhdGljIGlu bGluZSB2b2lkCiBmcmFuZ2VfYWRkX3plcm9zIChmcmFuZ2UgJnIsIHRyZWUgdHlwZSkKIHsKLSAg aWYgKHIudW5kZWZpbmVkX3AgKCkgfHwgci5rbm93bl9uYW4gKCkpCisgIGlmIChyLnVuZGVmaW5l ZF9wICgpIHx8IHIua25vd25faXNuYW4gKCkpCiAgICAgcmV0dXJuOwogCiAgIGlmIChIT05PUl9T SUdORURfWkVST1MgKHR5cGUpCiAgICAgICAmJiAocmVhbF9pc3plcm8gKCZyLmxvd2VyX2JvdW5k ICgpKSB8fCByZWFsX2lzemVybyAoJnIudXBwZXJfYm91bmQgKCkpKSkKLSAgICByLnNldF9zaWdu Yml0IChmcF9wcm9wOjpWQVJZSU5HKTsKKyAgICB7CisgICAgICBmcmFuZ2UgemVybzsKKyAgICAg IHplcm8uc2V0X3plcm8gKHR5cGUpOworICAgICAgci51bmlvbl8gKHplcm8pOworICAgIH0KIH0K IAogLy8gQnVpbGQgYSByYW5nZSB0aGF0IGlzIDw9IFZBTCBhbmQgc3RvcmUgaXQgaW4gUi4KQEAg LTIyNiw3ICsyMzAsNyBAQCBmcmFuZ2VfYWRkX3plcm9zIChmcmFuZ2UgJnIsIHRyZWUgdHlwZSkK IHN0YXRpYyBib29sCiBidWlsZF9sZSAoZnJhbmdlICZyLCB0cmVlIHR5cGUsIGNvbnN0IGZyYW5n ZSAmdmFsKQogewotICBpZiAodmFsLmtub3duX25hbiAoKSkKKyAgaWYgKHZhbC5rbm93bl9pc25h biAoKSkKICAgICB7CiAgICAgICByLnNldF91bmRlZmluZWQgKCk7CiAgICAgICByZXR1cm4gZmFs c2U7CkBAIC0yNDQsNyArMjQ4LDcgQEAgYnVpbGRfbGUgKGZyYW5nZSAmciwgdHJlZSB0eXBlLCBj b25zdCBmcmFuZ2UgJnZhbCkKIHN0YXRpYyBib29sCiBidWlsZF9sdCAoZnJhbmdlICZyLCB0cmVl IHR5cGUsIGNvbnN0IGZyYW5nZSAmdmFsKQogewotICBpZiAodmFsLmtub3duX25hbiAoKSkKKyAg aWYgKHZhbC5rbm93bl9pc25hbiAoKSkKICAgICB7CiAgICAgICByLnNldF91bmRlZmluZWQgKCk7 CiAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0yNjgsNyArMjcyLDcgQEAgYnVpbGRfbHQgKGZyYW5n ZSAmciwgdHJlZSB0eXBlLCBjb25zdCBmcmFuZ2UgJnZhbCkKIHN0YXRpYyBib29sCiBidWlsZF9n ZSAoZnJhbmdlICZyLCB0cmVlIHR5cGUsIGNvbnN0IGZyYW5nZSAmdmFsKQogewotICBpZiAodmFs Lmtub3duX25hbiAoKSkKKyAgaWYgKHZhbC5rbm93bl9pc25hbiAoKSkKICAgICB7CiAgICAgICBy LnNldF91bmRlZmluZWQgKCk7CiAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0yODYsNyArMjkwLDcg QEAgYnVpbGRfZ2UgKGZyYW5nZSAmciwgdHJlZSB0eXBlLCBjb25zdCBmcmFuZ2UgJnZhbCkKIHN0 YXRpYyBib29sCiBidWlsZF9ndCAoZnJhbmdlICZyLCB0cmVlIHR5cGUsIGNvbnN0IGZyYW5nZSAm dmFsKQogewotICBpZiAodmFsLmtub3duX25hbiAoKSkKKyAgaWYgKHZhbC5rbm93bl9pc25hbiAo KSkKICAgICB7CiAgICAgICByLnNldF91bmRlZmluZWQgKCk7CiAgICAgICByZXR1cm4gZmFsc2U7 CkBAIC01NTEsNyArNTU1LDcgQEAgZm9wZXJhdG9yX2x0Ojpmb2xkX3JhbmdlIChpcmFuZ2UgJnIs IHRyZWUgdHlwZSwKICAgICAgIGVsc2UKIAlyID0gcmFuZ2VfdHJ1ZV9hbmRfZmFsc2UgKHR5cGUp OwogICAgIH0KLSAgZWxzZSBpZiAob3AxLmtub3duX25hbiAoKSB8fCBvcDIua25vd25fbmFuICgp KQorICBlbHNlIGlmIChvcDEua25vd25faXNuYW4gKCkgfHwgb3AyLmtub3duX2lzbmFuICgpKQog ICAgIHIgPSByYW5nZV9mYWxzZSAodHlwZSk7CiAgIGVsc2UKICAgICByID0gcmFuZ2VfdHJ1ZV9h bmRfZmFsc2UgKHR5cGUpOwpAQCAtNjUzLDcgKzY1Nyw3IEBAIGZvcGVyYXRvcl9sZTo6Zm9sZF9y YW5nZSAoaXJhbmdlICZyLCB0cmVlIHR5cGUsCiAgICAgICBlbHNlCiAJciA9IHJhbmdlX3RydWVf YW5kX2ZhbHNlICh0eXBlKTsKICAgICB9Ci0gIGVsc2UgaWYgKG9wMS5rbm93bl9uYW4gKCkgfHwg b3AyLmtub3duX25hbiAoKSkKKyAgZWxzZSBpZiAob3AxLmtub3duX2lzbmFuICgpIHx8IG9wMi5r bm93bl9pc25hbiAoKSkKICAgICByID0gcmFuZ2VfZmFsc2UgKHR5cGUpOwogICBlbHNlCiAgICAg ciA9IHJhbmdlX3RydWVfYW5kX2ZhbHNlICh0eXBlKTsKQEAgLTc0Nyw3ICs3NTEsNyBAQCBmb3Bl cmF0b3JfZ3Q6OmZvbGRfcmFuZ2UgKGlyYW5nZSAmciwgdHJlZSB0eXBlLAogICAgICAgZWxzZQog CXIgPSByYW5nZV90cnVlX2FuZF9mYWxzZSAodHlwZSk7CiAgICAgfQotICBlbHNlIGlmIChvcDEu a25vd25fbmFuICgpIHx8IG9wMi5rbm93bl9uYW4gKCkpCisgIGVsc2UgaWYgKG9wMS5rbm93bl9p c25hbiAoKSB8fCBvcDIua25vd25faXNuYW4gKCkpCiAgICAgciA9IHJhbmdlX2ZhbHNlICh0eXBl KTsKICAgZWxzZQogICAgIHIgPSByYW5nZV90cnVlX2FuZF9mYWxzZSAodHlwZSk7CkBAIC04NDks NyArODUzLDcgQEAgZm9wZXJhdG9yX2dlOjpmb2xkX3JhbmdlIChpcmFuZ2UgJnIsIHRyZWUgdHlw ZSwKICAgICAgIGVsc2UKIAlyID0gcmFuZ2VfdHJ1ZV9hbmRfZmFsc2UgKHR5cGUpOwogICAgIH0K LSAgZWxzZSBpZiAob3AxLmtub3duX25hbiAoKSB8fCBvcDIua25vd25fbmFuICgpKQorICBlbHNl IGlmIChvcDEua25vd25faXNuYW4gKCkgfHwgb3AyLmtub3duX2lzbmFuICgpKQogICAgIHIgPSBy YW5nZV9mYWxzZSAodHlwZSk7CiAgIGVsc2UKICAgICByID0gcmFuZ2VfdHJ1ZV9hbmRfZmFsc2Ug KHR5cGUpOwpAQCAtOTMyLDEwICs5MzYsMTAgQEAgZm9wZXJhdG9yX3Vub3JkZXJlZDo6Zm9sZF9y YW5nZSAoaXJhbmdlICZyLCB0cmVlIHR5cGUsCiAJCQkJIHJlbGF0aW9uX2tpbmQpIGNvbnN0CiB7 CiAgIC8vIFVOT1JERVJFRCBpcyBUUlVFIGlmIGVpdGhlciBvcGVyYW5kIGlzIGEgTkFOLgotICBp ZiAob3AxLmtub3duX25hbiAoKSB8fCBvcDIua25vd25fbmFuICgpKQorICBpZiAob3AxLmtub3du X2lzbmFuICgpIHx8IG9wMi5rbm93bl9pc25hbiAoKSkKICAgICByID0gcmFuZ2VfdHJ1ZSAodHlw ZSk7CiAgIC8vIFVOT1JERVJFRCBpcyBGQUxTRSBpZiBuZWl0aGVyIG9wZXJhbmQgaXMgYSBOQU4u Ci0gIGVsc2UgaWYgKCFvcDEubWF5YmVfbmFuICgpICYmICFvcDIubWF5YmVfbmFuICgpKQorICBl bHNlIGlmICghb3AxLm1heWJlX2lzbmFuICgpICYmICFvcDIubWF5YmVfaXNuYW4gKCkpCiAgICAg ciA9IHJhbmdlX2ZhbHNlICh0eXBlKTsKICAgZWxzZQogICAgIHIgPSByYW5nZV90cnVlX2FuZF9m YWxzZSAodHlwZSk7CkBAIC05NTQsNyArOTU4LDcgQEAgZm9wZXJhdG9yX3Vub3JkZXJlZDo6b3Ax X3JhbmdlIChmcmFuZ2UgJnIsIHRyZWUgdHlwZSwKICAgICAgIHIuc2V0X3ZhcnlpbmcgKHR5cGUp OwogICAgICAgLy8gU2luY2UgYXQgbGVhc3Qgb25lIG9wZXJhbmQgbXVzdCBiZSBOQU4sIGlmIG9u ZSBvZiB0aGVtIGlzCiAgICAgICAvLyBub3QsIHRoZSBvdGhlciBtdXN0IGJlLgotICAgICAgaWYg KCFvcDIubWF5YmVfbmFuICgpKQorICAgICAgaWYgKCFvcDIubWF5YmVfaXNuYW4gKCkpCiAJci5z ZXRfbmFuICh0eXBlKTsKICAgICAgIGJyZWFrOwogCkBAIC05OTgsOSArMTAwMiw5IEBAIGZvcGVy YXRvcl9vcmRlcmVkOjpmb2xkX3JhbmdlIChpcmFuZ2UgJnIsIHRyZWUgdHlwZSwKIAkJCSAgICAg ICBjb25zdCBmcmFuZ2UgJm9wMSwgY29uc3QgZnJhbmdlICZvcDIsCiAJCQkgICAgICAgcmVsYXRp b25fa2luZCkgY29uc3QKIHsKLSAgaWYgKCFvcDEubWF5YmVfbmFuICgpICYmICFvcDIubWF5YmVf bmFuICgpKQorICBpZiAoIW9wMS5tYXliZV9pc25hbiAoKSAmJiAhb3AyLm1heWJlX2lzbmFuICgp KQogICAgIHIgPSByYW5nZV90cnVlICh0eXBlKTsKLSAgZWxzZSBpZiAob3AxLmtub3duX25hbiAo KSB8fCBvcDIua25vd25fbmFuICgpKQorICBlbHNlIGlmIChvcDEua25vd25faXNuYW4gKCkgfHwg b3AyLmtub3duX2lzbmFuICgpKQogICAgIHIgPSByYW5nZV9mYWxzZSAodHlwZSk7CiAgIGVsc2UK ICAgICByID0gcmFuZ2VfdHJ1ZV9hbmRfZmFsc2UgKHR5cGUpOwpkaWZmIC0tZ2l0IGEvZ2NjL3Zh bHVlLXF1ZXJ5LmNjIGIvZ2NjL3ZhbHVlLXF1ZXJ5LmNjCmluZGV4IGVhNmU0Yjk3OWFkLi4wYmRk NjcwOTgyYiAxMDA2NDQKLS0tIGEvZ2NjL3ZhbHVlLXF1ZXJ5LmNjCisrKyBiL2djYy92YWx1ZS1x dWVyeS5jYwpAQCAtMjE5LDE3ICsyMTksOCBAQCByYW5nZV9xdWVyeTo6Z2V0X3RyZWVfcmFuZ2Ug KHZyYW5nZSAmciwgdHJlZSBleHByLCBnaW1wbGUgKnN0bXQpCiAgICAgICB7CiAJZnJhbmdlICZm ID0gYXNfYSA8ZnJhbmdlPiAocik7CiAJZi5zZXQgKGV4cHIsIGV4cHIpOwotCi0JLy8gU2luZ2xl dG9ucyBmcm9tIHRoZSB0cmVlIHdvcmxkIGhhdmUga25vd24gcHJvcGVydGllcy4KLQlSRUFMX1ZB TFVFX1RZUEUgKnJ2ID0gVFJFRV9SRUFMX0NTVF9QVFIgKGV4cHIpOwotCWlmIChyZWFsX2lzbmFu IChydikpCi0JICBmLnVwZGF0ZV9uYW4gKGZwX3Byb3A6OllFUyk7Ci0JZWxzZQorCWlmICghcmVh bF9pc25hbiAoVFJFRV9SRUFMX0NTVF9QVFIgKGV4cHIpKSkKIAkgIGYuY2xlYXJfbmFuICgpOwot CWlmIChyZWFsX2lzbmVnIChydikpCi0JICBmLnNldF9zaWduYml0IChmcF9wcm9wOjpZRVMpOwot CWVsc2UKLQkgIGYuc2V0X3NpZ25iaXQgKGZwX3Byb3A6Ok5PKTsKIAlyZXR1cm4gdHJ1ZTsKICAg ICAgIH0KIApkaWZmIC0tZ2l0IGEvZ2NjL3ZhbHVlLXJhbmdlLXByZXR0eS1wcmludC5jYyBiL2dj Yy92YWx1ZS1yYW5nZS1wcmV0dHktcHJpbnQuY2MKaW5kZXggYjEyNGU0NmNiOWUuLmViNzQ0MjIy OWJhIDEwMDY0NAotLS0gYS9nY2MvdmFsdWUtcmFuZ2UtcHJldHR5LXByaW50LmNjCisrKyBiL2dj Yy92YWx1ZS1yYW5nZS1wcmV0dHktcHJpbnQuY2MKQEAgLTEzNCwzNCArMTM0LDM5IEBAIHZyYW5n ZV9wcmludGVyOjp2aXNpdCAoY29uc3QgZnJhbmdlICZyKSBjb25zdAogICBpZiAoci52YXJ5aW5n X3AgKCkpCiAgICAgewogICAgICAgcHBfc3RyaW5nIChwcCwgIlZBUllJTkciKTsKKyAgICAgIHBy aW50X2ZyYW5nZV9uYW4gKHIpOwogICAgICAgcmV0dXJuOwogICAgIH0KICAgcHBfY2hhcmFjdGVy IChwcCwgJ1snKTsKLSAgZHVtcF9nZW5lcmljX25vZGUgKHBwLAotCQkgICAgIGJ1aWxkX3JlYWwg KHR5cGUsIHIubG93ZXJfYm91bmQgKCkpLCAwLCBUREZfTk9ORSwgZmFsc2UpOwotICBwcF9zdHJp bmcgKHBwLCAiLCAiKTsKLSAgZHVtcF9nZW5lcmljX25vZGUgKHBwLAotCQkgICAgIGJ1aWxkX3Jl YWwgKHR5cGUsIHIudXBwZXJfYm91bmQgKCkpLCAwLCBUREZfTk9ORSwgZmFsc2UpOwotICBwcF9z dHJpbmcgKHBwLCAiXSAiKTsKLQotICBwcmludF9mcmFuZ2VfcHJvcCAoIk5BTiIsIHIuZ2V0X25h biAoKSk7Ci0gIHByaW50X2ZyYW5nZV9wcm9wICgiU0lHTiIsIHIuZ2V0X3NpZ25iaXQgKCkpOwor ICBib29sIGhhc19lbmRwb2ludHMgPSAhci5rbm93bl9pc25hbiAoKTsKKyAgaWYgKGhhc19lbmRw b2ludHMpCisgICAgeworICAgICAgZHVtcF9nZW5lcmljX25vZGUgKHBwLAorCQkJIGJ1aWxkX3Jl YWwgKHR5cGUsIHIubG93ZXJfYm91bmQgKCkpLCAwLCBUREZfTk9ORSwgZmFsc2UpOworICAgICAg cHBfc3RyaW5nIChwcCwgIiwgIik7CisgICAgICBkdW1wX2dlbmVyaWNfbm9kZSAocHAsCisJCQkg YnVpbGRfcmVhbCAodHlwZSwgci51cHBlcl9ib3VuZCAoKSksIDAsIFRERl9OT05FLCBmYWxzZSk7 CisgICAgfQorICBwcF9jaGFyYWN0ZXIgKHBwLCAnXScpOworICBwcmludF9mcmFuZ2VfbmFuIChy KTsKIH0KIAotLy8gUHJpbnQgdGhlIEZQIHByb3BlcnRpZXMgaW4gYW4gZnJhbmdlLgorLy8gUHJp bnQgdGhlIE5BTiBpbmZvIGZvciBhbiBmcmFuZ2UuCiAKIHZvaWQKLXZyYW5nZV9wcmludGVyOjpw cmludF9mcmFuZ2VfcHJvcCAoY29uc3QgY2hhciAqc3RyLCBjb25zdCBmcF9wcm9wICZwcm9wKSBj b25zdAordnJhbmdlX3ByaW50ZXI6OnByaW50X2ZyYW5nZV9uYW4gKGNvbnN0IGZyYW5nZSAmcikg Y29uc3QKIHsKLSAgaWYgKHByb3AudmFyeWluZ19wICgpKQotICAgIHJldHVybjsKLQotICBpZiAo cHJvcC55ZXNfcCAoKSkKLSAgICBwcF9zdHJpbmcgKHBwLCBzdHIpOwotICBlbHNlIGlmIChwcm9w Lm5vX3AgKCkpCisgIGlmIChyLm1heWJlX2lzbmFuICgpKQogICAgIHsKLSAgICAgIHBwX2NoYXJh Y3RlciAocHAsICchJyk7Ci0gICAgICBwcF9zdHJpbmcgKHBwLCBzdHIpOworICAgICAgaWYgKHIu bV9wb3NfbmFuICYmIHIubV9uZWdfbmFuKQorCXsKKwkgIHBwX3N0cmluZyAocHAsICIgKy1OQU4i KTsKKwkgIHJldHVybjsKKwl9CisgICAgICBib29sIG5hbl9zaWduID0gci5tX25lZ19uYW47Cisg ICAgICBpZiAobmFuX3NpZ24pCisJcHBfc3RyaW5nIChwcCwgIiAtTkFOIik7CisgICAgICBlbHNl CisJcHBfc3RyaW5nIChwcCwgIiArTkFOIik7CiAgICAgfQotICBwcF9jaGFyYWN0ZXIgKHBwLCAn ICcpOwogfQpkaWZmIC0tZ2l0IGEvZ2NjL3ZhbHVlLXJhbmdlLXByZXR0eS1wcmludC5oIGIvZ2Nj L3ZhbHVlLXJhbmdlLXByZXR0eS1wcmludC5oCmluZGV4IGFkMDZjOTNjMDQ0Li4yMGMyNjU5OGZl NyAxMDA2NDQKLS0tIGEvZ2NjL3ZhbHVlLXJhbmdlLXByZXR0eS1wcmludC5oCisrKyBiL2djYy92 YWx1ZS1yYW5nZS1wcmV0dHktcHJpbnQuaApAQCAtMzEsNyArMzEsNyBAQCBwdWJsaWM6CiBwcml2 YXRlOgogICB2b2lkIHByaW50X2lyYW5nZV9ib3VuZCAoY29uc3Qgd2lkZV9pbnQgJncsIHRyZWUg dHlwZSkgY29uc3Q7CiAgIHZvaWQgcHJpbnRfaXJhbmdlX2JpdG1hc2tzIChjb25zdCBpcmFuZ2Ug JikgY29uc3Q7Ci0gIHZvaWQgcHJpbnRfZnJhbmdlX3Byb3AgKGNvbnN0IGNoYXIgKnN0ciwgY29u c3QgZnBfcHJvcCAmKSBjb25zdDsKKyAgdm9pZCBwcmludF9mcmFuZ2VfbmFuIChjb25zdCBmcmFu Z2UgJikgY29uc3Q7CiAKICAgcHJldHR5X3ByaW50ZXIgKnBwOwogfTsKZGlmZiAtLWdpdCBhL2dj Yy92YWx1ZS1yYW5nZS1zdG9yYWdlLmNjIGIvZ2NjL3ZhbHVlLXJhbmdlLXN0b3JhZ2UuY2MKaW5k ZXggYjdhMjNmYTk4MjUuLmRlNzU3NWVkNDhkIDEwMDY0NAotLS0gYS9nY2MvdmFsdWUtcmFuZ2Ut c3RvcmFnZS5jYworKysgYi9nY2MvdmFsdWUtcmFuZ2Utc3RvcmFnZS5jYwpAQCAtMjUzLDkgKzI1 MywxMSBAQCBmcmFuZ2Vfc3RvcmFnZV9zbG90OjpzZXRfZnJhbmdlIChjb25zdCBmcmFuZ2UgJnIp CiAgIGdjY19jaGVja2luZ19hc3NlcnQgKGZpdHNfcCAocikpOwogICBnY2NfY2hlY2tpbmdfYXNz ZXJ0ICghci51bmRlZmluZWRfcCAoKSk7CiAKKyAgbV9raW5kID0gci5tX2tpbmQ7CiAgIG1fbWlu ID0gci5tX21pbjsKICAgbV9tYXggPSByLm1fbWF4OwotICBtX3Byb3BzID0gci5tX3Byb3BzOwor ICBtX3Bvc19uYW4gPSByLm1fcG9zX25hbjsKKyAgbV9uZWdfbmFuID0gci5tX25lZ19uYW47CiB9 CiAKIHZvaWQKQEAgLTI2NCwxMSArMjY2LDEyIEBAIGZyYW5nZV9zdG9yYWdlX3Nsb3Q6OmdldF9m cmFuZ2UgKGZyYW5nZSAmciwgdHJlZSB0eXBlKSBjb25zdAogICBnY2NfY2hlY2tpbmdfYXNzZXJ0 IChyLnN1cHBvcnRzX3R5cGVfcCAodHlwZSkpOwogCiAgIHIuc2V0X3VuZGVmaW5lZCAoKTsKLSAg ci5tX2tpbmQgPSBWUl9SQU5HRTsKLSAgci5tX3Byb3BzID0gbV9wcm9wczsKKyAgci5tX2tpbmQg PSBtX2tpbmQ7CiAgIHIubV90eXBlID0gdHlwZTsKICAgci5tX21pbiA9IG1fbWluOwogICByLm1f bWF4ID0gbV9tYXg7CisgIHIubV9wb3NfbmFuID0gbV9wb3NfbmFuOworICByLm1fbmVnX25hbiA9 IG1fbmVnX25hbjsKICAgci5ub3JtYWxpemVfa2luZCAoKTsKIAogICBpZiAoZmxhZ19jaGVja2lu ZykKZGlmZiAtLWdpdCBhL2djYy92YWx1ZS1yYW5nZS1zdG9yYWdlLmggYi9nY2MvdmFsdWUtcmFu Z2Utc3RvcmFnZS5oCmluZGV4IGY1MDY3ODlmM2QxLi4wY2Y5NWViZjdjMSAxMDA2NDQKLS0tIGEv Z2NjL3ZhbHVlLXJhbmdlLXN0b3JhZ2UuaAorKysgYi9nY2MvdmFsdWUtcmFuZ2Utc3RvcmFnZS5o CkBAIC0xMTMsMTIgKzExMywxMSBAQCBjbGFzcyBHVFkgKCgpKSBmcmFuZ2Vfc3RvcmFnZV9zbG90 CiAgIGZyYW5nZV9zdG9yYWdlX3Nsb3QgKGNvbnN0IGZyYW5nZSAmcikgeyBzZXRfZnJhbmdlIChy KTsgfQogICBESVNBQkxFX0NPUFlfQU5EX0FTU0lHTiAoZnJhbmdlX3N0b3JhZ2Vfc2xvdCk7CiAK LSAgLy8gV2UgY2FuIGdldCBhd2F5IHdpdGgganVzdCBzdG9yaW5nIHRoZSBwcm9wZXJ0aWVzIGFu ZCB0aGUKLSAgLy8gZW5kcG9pbnRzIGJlY2F1c2UgdGhlIHR5cGUgY2FuIGJlIGdvdHRlbiBmcm9t IHRoZSBTU0EsIGFuZAotICAvLyBVTkRFRklORUQgaXMgdW5zdXBwb3J0ZWQsIHNvIGl0IGNhbiBv bmx5IGJlIGEgVlJfUkFOR0UuCisgIGVudW0gdmFsdWVfcmFuZ2Vfa2luZCBtX2tpbmQ7CiAgIFJF QUxfVkFMVUVfVFlQRSBtX21pbjsKICAgUkVBTF9WQUxVRV9UWVBFIG1fbWF4OwotICBmcmFuZ2Vf cHJvcHMgbV9wcm9wczsKKyAgYm9vbCBtX3Bvc19uYW47CisgIGJvb2wgbV9uZWdfbmFuOwogfTsK IAogY2xhc3Mgb2JzdGFja192cmFuZ2VfYWxsb2NhdG9yIGZpbmFsOiBwdWJsaWMgdnJhbmdlX2Fs bG9jYXRvcgpkaWZmIC0tZ2l0IGEvZ2NjL3ZhbHVlLXJhbmdlLmNjIGIvZ2NjL3ZhbHVlLXJhbmdl LmNjCmluZGV4IGQ3NTlmY2YxNzhjLi41NWEyMTZlZmQ4YiAxMDA2NDQKLS0tIGEvZ2NjL3ZhbHVl LXJhbmdlLmNjCisrKyBiL2djYy92YWx1ZS1yYW5nZS5jYwpAQCAtMjY3LDEwNiArMjY3LDI0IEBA IHRyZWVfY29tcGFyZSAodHJlZV9jb2RlIGNvZGUsIHRyZWUgb3AxLCB0cmVlIG9wMikKICAgcmV0 dXJuICFpbnRlZ2VyX3plcm9wIChmb2xkX2J1aWxkMiAoY29kZSwgaW50ZWdlcl90eXBlX25vZGUs IG9wMSwgb3AyKSk7CiB9CiAKLS8vIFNldCB0aGUgTkFOIHByb3BlcnR5LiAgQWRqdXN0IHRoZSBy YW5nZSBpZiBhcHBvcHJpYXRlLgotCi12b2lkCi1mcmFuZ2U6OnVwZGF0ZV9uYW4gKGZwX3Byb3A6 OmtpbmQgaykKLXsKLSAgaWYgKGsgPT0gZnBfcHJvcDo6WUVTKQotICAgIHsKLSAgICAgIGlmICgh bWF5YmVfbmFuICgpKQotCXsKLQkgIHNldF91bmRlZmluZWQgKCk7Ci0JICByZXR1cm47Ci0JfQot ICAgICAgZ2NjX2NoZWNraW5nX2Fzc2VydCAoIXVuZGVmaW5lZF9wICgpKTsKLSAgICAgIHNldF9u YW4gKG1fdHlwZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChrID09IGZwX3Byb3A6 Ok5PICYmIGtub3duX25hbiAoKSkKLSAgICB7Ci0gICAgICBzZXRfdW5kZWZpbmVkICgpOwotICAg ICAgcmV0dXJuOwotICAgIH0KLQotICAvLyBTZXR0aW5nIFZBUllJTkcgb24gYW4gb2J2aW91c2x5 IE5BTiByYW5nZSBpcyBhIG5vLW9wLgotICBpZiAoayA9PSBmcF9wcm9wOjpWQVJZSU5HICYmIHJl YWxfaXNuYW4gKCZtX21pbikpCi0gICAgcmV0dXJuOwotCi0gIG1fcHJvcHMuc2V0X25hbiAoayk7 Ci0gIG5vcm1hbGl6ZV9raW5kICgpOwotICBpZiAoZmxhZ19jaGVja2luZykKLSAgICB2ZXJpZnlf cmFuZ2UgKCk7Ci19Ci0KLS8vIFNldCB0aGUgU0lHTkJJVCBwcm9wZXJ0eS4gIEFkanVzdCB0aGUg cmFuZ2UgaWYgYXBwcm9wcmlhdGUuCi0KLXZvaWQKLWZyYW5nZTo6c2V0X3NpZ25iaXQgKGZwX3By b3A6OmtpbmQgaykKLXsKLSAgZ2NjX2NoZWNraW5nX2Fzc2VydCAobV90eXBlKTsKLQotICAvLyBO byBhZGRpdGlvbmFsIGFkanVzdG1lbnRzIGFyZSBuZWVkZWQgZm9yIGEgTkFOLgotICBpZiAoa25v d25fbmFuICgpKQotICAgIHsKLSAgICAgIG1fcHJvcHMuc2V0X3NpZ25iaXQgKGspOwotICAgICAg cmV0dXJuOwotICAgIH0KLSAgLy8gSWdub3JlIHNpZ24gY2hhbmdlcyB3aGVuIHRoZXkncmUgc2V0 IGNvcnJlY3RseS4KLSAgaWYgKCFtYXliZV9uYW4gKCkpCi0gICAgewotICAgICAgLy8gSXQncyBu ZWdhdGl2ZSBhbmQgd2UncmUgdHJ5aW5nIHRvIG1ha2UgaXQgbmVnYXRpdmUgb3IgdmFyeWluZy4K LSAgICAgIGlmIChyZWFsX2xlc3MgKCZtX21heCwgJmRjb25zdDApICYmIChrID09IGZwX3Byb3A6 OllFUwotCQkJCQkgICB8fCBrID09IGZwX3Byb3A6OlZBUllJTkcpKQotCXJldHVybjsKLSAgICAg IC8vIEl0J3MgcG9zaXRpdmUgYW5kIHdlJ3JlIHRyeWluZyB0byBtYWtlIGl0IHBvc2l0aXZlIG9y IHZhcnlpbmcuCi0gICAgICBpZiAocmVhbF9sZXNzICgmZGNvbnN0MCwgJm1fbWluKSAmJiAoayA9 PSBmcF9wcm9wOjpOTwotCQkJCQkgICB8fCBrID09IGZwX3Byb3A6OlZBUllJTkcpKQotCXJldHVy bjsKLSAgICB9Ci0gIC8vIEFkanVzdCB0aGUgcmFuZ2UgZGVwZW5kaW5nIG9uIHRoZSBzaWduIGJp dC4KLSAgaWYgKGsgPT0gZnBfcHJvcDo6WUVTKQotICAgIHsKLSAgICAgIC8vIENyb3AgdGhlIHJh bmdlIHRvIFstSU5GLCAwXS4KLSAgICAgIGZyYW5nZSBjcm9wIChtX3R5cGUsIGRjb25zdG5pbmYs IGRjb25zdDApOwotICAgICAgaW50ZXJzZWN0IChjcm9wKTsKLSAgICAgIGlmICghdW5kZWZpbmVk X3AgKCkpCi0JbV9wcm9wcy5zZXRfc2lnbmJpdCAoZnBfcHJvcDo6WUVTKTsKLSAgICB9Ci0gIGVs c2UgaWYgKGsgPT0gZnBfcHJvcDo6Tk8pCi0gICAgewotICAgICAgLy8gQ3JvcCB0aGUgcmFuZ2Ug dG8gWzAsICtJTkZdLgotICAgICAgZnJhbmdlIGNyb3AgKG1fdHlwZSwgZGNvbnN0MCwgZGNvbnN0 aW5mKTsKLSAgICAgIGludGVyc2VjdCAoY3JvcCk7Ci0gICAgICBpZiAoIXVuZGVmaW5lZF9wICgp KQotCW1fcHJvcHMuc2V0X3NpZ25iaXQgKGZwX3Byb3A6Ok5PKTsKLSAgICB9Ci0gIGVsc2UKLSAg ICB7Ci0gICAgICBtX3Byb3BzLnNldF9zaWduYml0IChmcF9wcm9wOjpWQVJZSU5HKTsKLSAgICAg IG5vcm1hbGl6ZV9raW5kICgpOwotICAgIH0KLQotICBpZiAoZmxhZ19jaGVja2luZykKLSAgICB2 ZXJpZnlfcmFuZ2UgKCk7Ci19Ci0KIC8vIFNldHRlciBmb3IgZnJhbmdlcy4KIAogdm9pZAogZnJh bmdlOjpzZXQgKHRyZWUgbWluLCB0cmVlIG1heCwgdmFsdWVfcmFuZ2Vfa2luZCBraW5kKQogewot ICBpZiAoa2luZCA9PSBWUl9VTkRFRklORUQpCisgIHN3aXRjaCAoa2luZCkKICAgICB7CisgICAg Y2FzZSBWUl9VTkRFRklORUQ6CiAgICAgICBzZXRfdW5kZWZpbmVkICgpOwogICAgICAgcmV0dXJu OwotICAgIH0KLSAgLy8gVHJlYXQgVlJfQU5USV9SQU5HRSBhbmQgVlJfVkFSWUlORyBhcyB2YXJ5 aW5nLgotICBpZiAoa2luZCAhPSBWUl9SQU5HRSkKLSAgICB7CisgICAgY2FzZSBWUl9WQVJZSU5H OgorICAgIGNhc2UgVlJfQU5USV9SQU5HRToKICAgICAgIHNldF92YXJ5aW5nIChUUkVFX1RZUEUg KG1pbikpOwogICAgICAgcmV0dXJuOworICAgIGNhc2UgVlJfUkFOR0U6CisgICAgICBicmVhazsK KyAgICBkZWZhdWx0OgorICAgICAgZ2NjX3VucmVhY2hhYmxlICgpOwogICAgIH0KIAogICAvLyBI YW5kbGUgTkFOcy4KQEAgLTM3NSwyNCArMjkzLDI1IEBAIGZyYW5nZTo6c2V0ICh0cmVlIG1pbiwg dHJlZSBtYXgsIHZhbHVlX3JhbmdlX2tpbmQga2luZCkKICAgICAgIGdjY19jaGVja2luZ19hc3Nl cnQgKHJlYWxfaWRlbnRpY2FsIChUUkVFX1JFQUxfQ1NUX1BUUiAobWluKSwKIAkJCQkJICAgVFJF RV9SRUFMX0NTVF9QVFIgKG1heCkpKTsKICAgICAgIHRyZWUgdHlwZSA9IFRSRUVfVFlQRSAobWlu KTsKLSAgICAgIHNldF9uYW4gKHR5cGUpOworICAgICAgYm9vbCBzaWduID0gcmVhbF9pc25lZyAo VFJFRV9SRUFMX0NTVF9QVFIgKG1pbikpOworICAgICAgc2V0X25hbiAodHlwZSwgc2lnbik7CiAg ICAgICByZXR1cm47CiAgICAgfQogCiAgIG1fa2luZCA9IGtpbmQ7CiAgIG1fdHlwZSA9IFRSRUVf VFlQRSAobWluKTsKLSAgbV9wcm9wcy5zZXRfdmFyeWluZyAoKTsKICAgbV9taW4gPSAqVFJFRV9S RUFMX0NTVF9QVFIgKG1pbik7CiAgIG1fbWF4ID0gKlRSRUVfUkVBTF9DU1RfUFRSIChtYXgpOwot Ci0gIC8vIFNldCBTSUdOQklUIHByb3BlcnR5IGZvciBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgcmFu Z2VzLgotICBpZiAocmVhbF9sZXNzICgmbV9tYXgsICZkY29uc3QwKSkKLSAgICBtX3Byb3BzLnNp Z25iaXRfc2V0X3llcyAoKTsKLSAgZWxzZSBpZiAocmVhbF9sZXNzICgmZGNvbnN0MCwgJm1fbWlu KSkKLSAgICBtX3Byb3BzLnNpZ25iaXRfc2V0X25vICgpOwotCi0gIGlmICghSE9OT1JfTkFOUyAo bV90eXBlKSkKLSAgICBtX3Byb3BzLm5hbl9zZXRfbm8gKCk7CisgIGlmIChIT05PUl9OQU5TICht X3R5cGUpKQorICAgIHsKKyAgICAgIG1fcG9zX25hbiA9IHRydWU7CisgICAgICBtX25lZ19uYW4g PSB0cnVlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1fcG9zX25hbiA9IGZhbHNlOwor ICAgICAgbV9uZWdfbmFuID0gZmFsc2U7CisgICAgfQogCiAgIC8vIENoZWNrIGZvciBzd2FwcGVk IHJhbmdlcy4KICAgZ2NjX2NoZWNraW5nX2Fzc2VydCAodHJlZV9jb21wYXJlIChMRV9FWFBSLCBt aW4sIG1heCkpOwpAQCAtNDIzLDE4ICszNDIsMTEgQEAgZnJhbmdlOjpzZXQgKHRyZWUgdHlwZSwK IGJvb2wKIGZyYW5nZTo6bm9ybWFsaXplX2tpbmQgKCkKIHsKLSAgLy8gVW5kZWZpbmVkIGlzIHZp cmFsLgotICBpZiAobV9wcm9wcy5uYW5fdW5kZWZpbmVkX3AgKCkgfHwgbV9wcm9wcy5zaWduYml0 X3VuZGVmaW5lZF9wICgpKQotICAgIHsKLSAgICAgIHNldF91bmRlZmluZWQgKCk7Ci0gICAgICBy ZXR1cm4gdHJ1ZTsKLSAgICB9CiAgIGlmIChtX2tpbmQgPT0gVlJfUkFOR0UKICAgICAgICYmIHJl YWxfaXNpbmYgKCZtX21pbiwgMSkKICAgICAgICYmIHJlYWxfaXNpbmYgKCZtX21heCwgMCkpCiAg ICAgewotICAgICAgLy8gTm8gRlAgcHJvcGVydGllcyBzZXQgbWVhbnMgdmFyeWluZy4KLSAgICAg IGlmIChtX3Byb3BzLnZhcnlpbmdfcCAoKSkKKyAgICAgIGlmIChtX3Bvc19uYW4gJiYgbV9uZWdf bmFuKQogCXsKIAkgIHNldF92YXJ5aW5nIChtX3R5cGUpOwogCSAgcmV0dXJuIHRydWU7CkBAIC00 NDIsOCArMzU0LDcgQEAgZnJhbmdlOjpub3JtYWxpemVfa2luZCAoKQogICAgIH0KICAgZWxzZSBp ZiAobV9raW5kID09IFZSX1ZBUllJTkcpCiAgICAgewotICAgICAgLy8gSWYgYSBWQVJZSU5HIGhh cyBhbnkgRlAgcHJvcGVydGllcywgaXQncyBubyBsb25nZXIgVkFSWUlORy4KLSAgICAgIGlmICgh bV9wcm9wcy52YXJ5aW5nX3AgKCkpCisgICAgICBpZiAoIW1fcG9zX25hbiB8fCAhbV9uZWdfbmFu KQogCXsKIAkgIG1fa2luZCA9IFZSX1JBTkdFOwogCSAgbV9taW4gPSBkY29uc3RuaW5mOwpAQCAt NDUxLDkgKzM2Miw3MCBAQCBmcmFuZ2U6Om5vcm1hbGl6ZV9raW5kICgpCiAJICByZXR1cm4gdHJ1 ZTsKIAl9CiAgICAgfQorICBlbHNlIGlmIChtX2tpbmQgPT0gVlJfTkFOICYmICFtX3Bvc19uYW4g JiYgIW1fbmVnX25hbikKKyAgICBzZXRfdW5kZWZpbmVkICgpOwogICByZXR1cm4gZmFsc2U7CiB9 CiAKKy8vIFVuaW9uIG9yIGludGVyc2VjdCB0aGUgemVybyBlbmRwb2ludHMgb2YgdHdvIHJhbmdl cy4gIEZvciBleGFtcGxlOgorLy8gICBbLTAsICB4XSBVIFsrMCwgIHhdID0+IFstMCwgIHhdCisv LyAgIFsgeCwgLTBdIFUgWyB4LCArMF0gPT4gWyB4LCArMF0KKy8vICAgWy0wLCAgeF0gXiBbKzAs ICB4XSA9PiBbKzAsICB4XQorLy8gICBbIHgsIC0wXSBeIFsgeCwgKzBdID0+IFsgeCwgLTBdCisv LworLy8gVU5JT05fUCBpcyB0cnVlIHdoZW4gcGVyZm9ybWluZyBhIHVuaW9uLCBvciBmYWxzZSB3 aGVuIGludGVyc2VjdGluZy4KKworYm9vbAorZnJhbmdlOjpjb21iaW5lX3plcm9zIChjb25zdCBm cmFuZ2UgJnIsIGJvb2wgdW5pb25fcCkKK3sKKyAgZ2NjX2NoZWNraW5nX2Fzc2VydCAoIXVuZGVm aW5lZF9wICgpICYmICFrbm93bl9pc25hbiAoKSk7CisKKyAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7 CisgIGlmIChyZWFsX2lzemVybyAoJm1fbWluKSAmJiByZWFsX2lzemVybyAoJnIubV9taW4pCisg ICAgICAmJiByZWFsX2lzbmVnICgmbV9taW4pICE9IHJlYWxfaXNuZWcgKCZyLm1fbWluKSkKKyAg ICB7CisgICAgICBtX21pbi5zaWduID0gdW5pb25fcDsKKyAgICAgIGNoYW5nZWQgPSB0cnVlOwor ICAgIH0KKyAgaWYgKHJlYWxfaXN6ZXJvICgmbV9tYXgpICYmIHJlYWxfaXN6ZXJvICgmci5tX21h eCkKKyAgICAgICYmIHJlYWxfaXNuZWcgKCZtX21heCkgIT0gcmVhbF9pc25lZyAoJnIubV9tYXgp KQorICAgIHsKKyAgICAgIG1fbWF4LnNpZ24gPSAhdW5pb25fcDsKKyAgICAgIGNoYW5nZWQgPSB0 cnVlOworICAgIH0KKyAgLy8gSWYgdGhlIHNpZ25zIGFyZSBzd2FwcGVkLCB0aGUgcmVzdWx0aW5n IHJhbmdlIGlzIGVtcHR5LgorICBpZiAobV9taW4uc2lnbiA9PSAwICYmIG1fbWF4LnNpZ24gPT0g MSkKKyAgICB7CisgICAgICBpZiAobWF5YmVfaXNuYW4gKCkpCisJbV9raW5kID0gVlJfTkFOOwor ICAgICAgZWxzZQorCW1fa2luZCA9IFZSX1VOREVGSU5FRDsKKyAgICAgIGNoYW5nZWQgPSB0cnVl OworICAgIH0KKyAgcmV0dXJuIGNoYW5nZWQ7Cit9CisKKy8vIFVuaW9uIHR3byByYW5nZXMgd2hl biBvbmUgaXMga25vd24gdG8gYmUgYSBOQU4uCisKK2Jvb2wKK2ZyYW5nZTo6dW5pb25fbmFucyAo Y29uc3QgZnJhbmdlICZyKQoreworICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChrbm93bl9pc25hbiAo KSB8fCByLmtub3duX2lzbmFuICgpKTsKKworICBpZiAoa25vd25faXNuYW4gKCkpCisgICAgewor ICAgICAgbV9raW5kID0gci5tX2tpbmQ7CisgICAgICBtX21pbiA9IHIubV9taW47CisgICAgICBt X21heCA9IHIubV9tYXg7CisgICAgfQorICBtX3Bvc19uYW4gfD0gci5tX3Bvc19uYW47CisgIG1f bmVnX25hbiB8PSByLm1fbmVnX25hbjsKKyAgbm9ybWFsaXplX2tpbmQgKCk7CisgIGlmIChmbGFn X2NoZWNraW5nKQorICAgIHZlcmlmeV9yYW5nZSAoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKIGJv b2wKIGZyYW5nZTo6dW5pb25fIChjb25zdCB2cmFuZ2UgJnYpCiB7CkBAIC00NjcsMjkgKzQzOSwx OCBAQCBmcmFuZ2U6OnVuaW9uXyAoY29uc3QgdnJhbmdlICZ2KQogICAgICAgcmV0dXJuIHRydWU7 CiAgICAgfQogCi0gIC8vIElmIG9uZSBzaWRlIGhhcyBhIE5BTiwgdGhlIHVuaW9uIGlzIHRoZSBv dGhlciBzaWRlLCBwbHVzIHRoZSB1bmlvbgotICAvLyBvZiB0aGUgcHJvcGVydGllcyBhbmQgdGhl IHBvc3NpYmlsaXR5IG9mIGEgTkFOLgotICBpZiAoa25vd25fbmFuICgpKQorICAvLyBDb21iaW5l IE5BTiBpbmZvLgorICBpZiAoa25vd25faXNuYW4gKCkgfHwgci5rbm93bl9pc25hbiAoKSkKKyAg ICByZXR1cm4gdW5pb25fbmFucyAocik7CisgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICBpZiAo bV9wb3NfbmFuICE9IHIubV9wb3NfbmFuIHx8IG1fbmVnX25hbiAhPSByLm1fbmVnX25hbikKICAg ICB7Ci0gICAgICBmcmFuZ2VfcHJvcHMgc2F2ZSA9IG1fcHJvcHM7Ci0gICAgICAqdGhpcyA9IHI7 Ci0gICAgICBtX3Byb3BzID0gc2F2ZTsKLSAgICAgIG1fcHJvcHMudW5pb25fIChyLm1fcHJvcHMp OwotICAgICAgdXBkYXRlX25hbiAoZnBfcHJvcDo6VkFSWUlORyk7Ci0gICAgICBpZiAoZmxhZ19j aGVja2luZykKLQl2ZXJpZnlfcmFuZ2UgKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0g IGlmIChyLmtub3duX25hbiAoKSkKLSAgICB7Ci0gICAgICBtX3Byb3BzLnVuaW9uXyAoci5tX3By b3BzKTsKLSAgICAgIHVwZGF0ZV9uYW4gKGZwX3Byb3A6OlZBUllJTkcpOwotICAgICAgaWYgKGZs YWdfY2hlY2tpbmcpCi0JdmVyaWZ5X3JhbmdlICgpOwotICAgICAgcmV0dXJuIHRydWU7CisgICAg ICBtX3Bvc19uYW4gfD0gci5tX3Bvc19uYW47CisgICAgICBtX25lZ19uYW4gfD0gci5tX25lZ19u YW47CisgICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgICB9CiAKLSAgYm9vbCBjaGFuZ2VkID0gbV9w cm9wcy51bmlvbl8gKHIubV9wcm9wcyk7CisgIC8vIENvbWJpbmUgZW5kcG9pbnRzLgogICBpZiAo cmVhbF9sZXNzICgmci5tX21pbiwgJm1fbWluKSkKICAgICB7CiAgICAgICBtX21pbiA9IHIubV9t aW47CkBAIC01MDAsMTMgKzQ2MSwzNCBAQCBmcmFuZ2U6OnVuaW9uXyAoY29uc3QgdnJhbmdlICZ2 KQogICAgICAgbV9tYXggPSByLm1fbWF4OwogICAgICAgY2hhbmdlZCA9IHRydWU7CiAgICAgfQot ICBjaGFuZ2VkIHw9IG5vcm1hbGl6ZV9raW5kICgpOwogCisgIGlmIChIT05PUl9TSUdORURfWkVS T1MgKG1fdHlwZSkpCisgICAgY2hhbmdlZCB8PSBjb21iaW5lX3plcm9zIChyLCB0cnVlKTsKKwor ICBjaGFuZ2VkIHw9IG5vcm1hbGl6ZV9raW5kICgpOwogICBpZiAoZmxhZ19jaGVja2luZykKICAg ICB2ZXJpZnlfcmFuZ2UgKCk7CiAgIHJldHVybiBjaGFuZ2VkOwogfQogCisvLyBJbnRlcnNlY3Qg dHdvIHJhbmdlcyB3aGVuIG9uZSBpcyBrbm93biB0byBiZSBhIE5BTi4KKworYm9vbAorZnJhbmdl OjppbnRlcnNlY3RfbmFucyAoY29uc3QgZnJhbmdlICZyKQoreworICBnY2NfY2hlY2tpbmdfYXNz ZXJ0IChrbm93bl9pc25hbiAoKSB8fCByLmtub3duX2lzbmFuICgpKTsKKworICBtX3Bvc19uYW4g Jj0gci5tX3Bvc19uYW47CisgIG1fbmVnX25hbiAmPSByLm1fbmVnX25hbjsKKyAgaWYgKG1heWJl X2lzbmFuICgpKQorICAgIG1fa2luZCA9IFZSX05BTjsKKyAgZWxzZQorICAgIG1fa2luZCA9IFZS X1VOREVGSU5FRDsKKyAgaWYgKGZsYWdfY2hlY2tpbmcpCisgICAgdmVyaWZ5X3JhbmdlICgpOwor ICByZXR1cm4gdHJ1ZTsKK30KKwogYm9vbAogZnJhbmdlOjppbnRlcnNlY3QgKGNvbnN0IHZyYW5n ZSAmdikKIHsKQEAgLTUyNSwyNSArNTA3LDE4IEBAIGZyYW5nZTo6aW50ZXJzZWN0IChjb25zdCB2 cmFuZ2UgJnYpCiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgLy8gSWYgdHdvIE5BTnMg YXJlIG5vdCBleGFjdGx5IHRoZSBzYW1lLCBkcm9wIHRvIGFuIHVua25vd24gTkFOLAotICAvLyBv dGhlcndpc2UgdGhlcmUncyBub3RoaW5nIHRvIGRvLgotICBpZiAoa25vd25fbmFuICgpICYmIHIu a25vd25fbmFuICgpKQotICAgIHsKLSAgICAgIGlmIChtX3Byb3BzID09IHIubV9wcm9wcykKLQly ZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHNldF9uYW4gKG1fdHlwZSk7Ci0gICAgICByZXR1cm4gdHJ1 ZTsKLSAgICB9Ci0gIC8vID8/IFBlcmhhcHMgdGhlIGludGVyc2VjdGlvbiBvZiBhIE5BTiBhbmQg YW55dGhpbmcgaXMgYSBOQU4gPz8uCi0gIGlmIChrbm93bl9uYW4gKCkgfHwgci5rbm93bl9uYW4g KCkpCisgIC8vIENvbWJpbmUgTkFOIGluZm8uCisgIGlmIChrbm93bl9pc25hbiAoKSB8fCByLmtu b3duX2lzbmFuICgpKQorICAgIHJldHVybiBpbnRlcnNlY3RfbmFucyAocik7CisgIGJvb2wgY2hh bmdlZCA9IGZhbHNlOworICBpZiAobV9wb3NfbmFuICE9IHIubV9wb3NfbmFuIHx8IG1fbmVnX25h biAhPSByLm1fbmVnX25hbikKICAgICB7Ci0gICAgICBzZXRfdmFyeWluZyAobV90eXBlKTsKLSAg ICAgIHJldHVybiB0cnVlOworICAgICAgbV9wb3NfbmFuICY9IHIubV9wb3NfbmFuOworICAgICAg bV9uZWdfbmFuICY9IHIubV9uZWdfbmFuOworICAgICAgY2hhbmdlZCA9IHRydWU7CiAgICAgfQog Ci0gIGJvb2wgY2hhbmdlZCA9IG1fcHJvcHMuaW50ZXJzZWN0IChyLm1fcHJvcHMpOwotCisgIC8v IENvbWJpbmUgZW5kcG9pbnRzLgogICBpZiAocmVhbF9sZXNzICgmbV9taW4sICZyLm1fbWluKSkK ICAgICB7CiAgICAgICBtX21pbiA9IHIubV9taW47CkBAIC01NTQsMTQgKzUyOSwyMiBAQCBmcmFu Z2U6OmludGVyc2VjdCAoY29uc3QgdnJhbmdlICZ2KQogICAgICAgbV9tYXggPSByLm1fbWF4Owog ICAgICAgY2hhbmdlZCA9IHRydWU7CiAgICAgfQotICAvLyBJZiB0aGUgZW5kcG9pbnRzIGFyZSBz d2FwcGVkLCB0aGUgcmFuZ2VzIGFyZSBkaXNqb2ludC4KKyAgLy8gSWYgdGhlIGVuZHBvaW50cyBh cmUgc3dhcHBlZCwgdGhlIHJlc3VsdGluZyByYW5nZSBpcyBlbXB0eS4KICAgaWYgKHJlYWxfbGVz cyAoJm1fbWF4LCAmbV9taW4pKQogICAgIHsKLSAgICAgIHNldF91bmRlZmluZWQgKCk7CisgICAg ICBpZiAobWF5YmVfaXNuYW4gKCkpCisJbV9raW5kID0gVlJfTkFOOworICAgICAgZWxzZQorCW1f a2luZCA9IFZSX1VOREVGSU5FRDsKKyAgICAgIGlmIChmbGFnX2NoZWNraW5nKQorCXZlcmlmeV9y YW5nZSAoKTsKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgY2hhbmdlZCB8PSBub3JtYWxp emVfa2luZCAoKTsKIAorICBpZiAoSE9OT1JfU0lHTkVEX1pFUk9TIChtX3R5cGUpKQorICAgIGNo YW5nZWQgfD0gY29tYmluZV96ZXJvcyAociwgZmFsc2UpOworCisgIGNoYW5nZWQgfD0gbm9ybWFs aXplX2tpbmQgKCk7CiAgIGlmIChmbGFnX2NoZWNraW5nKQogICAgIHZlcmlmeV9yYW5nZSAoKTsK ICAgcmV0dXJuIGNoYW5nZWQ7CkBAIC01NzQsNyArNTU3LDggQEAgZnJhbmdlOjpvcGVyYXRvcj0g KGNvbnN0IGZyYW5nZSAmc3JjKQogICBtX3R5cGUgPSBzcmMubV90eXBlOwogICBtX21pbiA9IHNy Yy5tX21pbjsKICAgbV9tYXggPSBzcmMubV9tYXg7Ci0gIG1fcHJvcHMgPSBzcmMubV9wcm9wczsK KyAgbV9wb3NfbmFuID0gc3JjLm1fcG9zX25hbjsKKyAgbV9uZWdfbmFuID0gc3JjLm1fbmVnX25h bjsKIAogICBpZiAoZmxhZ19jaGVja2luZykKICAgICB2ZXJpZnlfcmFuZ2UgKCk7CkBAIC01OTIs MTIgKzU3NiwxMyBAQCBmcmFuZ2U6Om9wZXJhdG9yPT0gKGNvbnN0IGZyYW5nZSAmc3JjKSBjb25z dAogICAgICAgaWYgKHZhcnlpbmdfcCAoKSkKIAlyZXR1cm4gdHlwZXNfY29tcGF0aWJsZV9wICht X3R5cGUsIHNyYy5tX3R5cGUpOwogCi0gICAgICBpZiAoa25vd25fbmFuICgpIHx8IHNyYy5rbm93 bl9uYW4gKCkpCisgICAgICBpZiAoa25vd25faXNuYW4gKCkgfHwgc3JjLmtub3duX2lzbmFuICgp KQogCXJldHVybiBmYWxzZTsKIAogICAgICAgcmV0dXJuIChyZWFsX2lkZW50aWNhbCAoJm1fbWlu LCAmc3JjLm1fbWluKQogCSAgICAgICYmIHJlYWxfaWRlbnRpY2FsICgmbV9tYXgsICZzcmMubV9t YXgpCi0JICAgICAgJiYgbV9wcm9wcyA9PSBzcmMubV9wcm9wcworCSAgICAgICYmIG1fcG9zX25h biA9PSBzcmMubV9wb3NfbmFuCisJICAgICAgJiYgbV9uZWdfbmFuID09IHNyYy5tX25lZ19uYW4K IAkgICAgICAmJiB0eXBlc19jb21wYXRpYmxlX3AgKG1fdHlwZSwgc3JjLm1fdHlwZSkpOwogICAg IH0KICAgcmV0dXJuIGZhbHNlOwpAQCAtNjE3LDIxICs2MDIsMjQgQEAgZnJhbmdlOjpjb250YWlu c19wICh0cmVlIGNzdCkgY29uc3QKICAgaWYgKHZhcnlpbmdfcCAoKSkKICAgICByZXR1cm4gdHJ1 ZTsKIAorICBpZiAocmVhbF9pc25hbiAocnYpKQorICAgIHsKKyAgICAgIC8vIE5vIE5BTiBpbiBy YW5nZS4KKyAgICAgIGlmICghbV9wb3NfbmFuICYmICFtX25lZ19uYW4pCisJcmV0dXJuIGZhbHNl OworICAgICAgLy8gQm90aCArTkFOIGFuZCAtTkFOIGFyZSBwcmVzZW50LgorICAgICAgaWYgKG1f cG9zX25hbiAmJiBtX25lZ19uYW4pCisJcmV0dXJuIHRydWU7CisgICAgICByZXR1cm4gbV9uZWdf bmFuID09IHJ2LT5zaWduOworICAgIH0KKyAgaWYgKGtub3duX2lzbmFuICgpKQorICAgIHJldHVy biBmYWxzZTsKIAogICBpZiAocmVhbF9jb21wYXJlIChHRV9FWFBSLCBydiwgJm1fbWluKSAmJiBy ZWFsX2NvbXBhcmUgKExFX0VYUFIsIHJ2LCAmbV9tYXgpKQogICAgIHsKKyAgICAgIC8vIE1ha2Ug c3VyZSB0aGUgc2lnbnMgYXJlIGVxdWFsIGZvciBzaWduZWQgemVyb3MuCiAgICAgICBpZiAoSE9O T1JfU0lHTkVEX1pFUk9TIChtX3R5cGUpICYmIHJlYWxfaXN6ZXJvIChydikpCi0JewotCSAgLy8g RklYTUU6IFRoaXMgaXMgc3RpbGwgdXNpbmcgZ2V0X3NpZ25iaXQoKSBpbnN0ZWFkIG9mCi0JICAv LyBrbm93bl9zaWduYml0KCkgYmVjYXVzZSB0aGUgbGF0dGVyIGJhaWxzIG9uIHBvc3NpYmxlIE5B TnMKLQkgIC8vIChmb3Igbm93KS4KLQkgIGlmIChnZXRfc2lnbmJpdCAoKS55ZXNfcCAoKSkKLQkg ICAgcmV0dXJuIHJlYWxfaXNuZWcgKHJ2KTsKLQkgIGVsc2UgaWYgKGdldF9zaWduYml0ICgpLm5v X3AgKCkpCi0JICAgIHJldHVybiAhcmVhbF9pc25lZyAocnYpOwotCSAgZWxzZQotCSAgICByZXR1 cm4gdHJ1ZTsKLQl9CisJcmV0dXJuIG1fbWluLnNpZ24gPT0gbV9tYXguc2lnbiAmJiBtX21pbi5z aWduID09IHJ2LT5zaWduOwogICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICByZXR1cm4gZmFs c2U7CkBAIC02NDgsMjkgKzYzNiw5IEBAIGZyYW5nZTo6c2luZ2xldG9uX3AgKHRyZWUgKnJlc3Vs dCkgY29uc3QKICAgaWYgKG1fa2luZCA9PSBWUl9SQU5HRSAmJiByZWFsX2lkZW50aWNhbCAoJm1f bWluLCAmbV9tYXgpKQogICAgIHsKICAgICAgIC8vIFJldHVybiBmYWxzZSBmb3IgYW55IHNpbmds ZXRvbiB0aGF0IG1heSBiZSBhIE5BTi4KLSAgICAgIGlmIChIT05PUl9OQU5TIChtX3R5cGUpICYm IG1heWJlX25hbiAoKSkKKyAgICAgIGlmIChIT05PUl9OQU5TIChtX3R5cGUpICYmIG1heWJlX2lz bmFuICgpKQogCXJldHVybiBmYWxzZTsKIAotICAgICAgLy8gUmV0dXJuIHRoZSBhcHByb3ByaWF0 ZSB6ZXJvIGlmIGtub3duLgotICAgICAgaWYgKEhPTk9SX1NJR05FRF9aRVJPUyAobV90eXBlKSAm JiB6ZXJvX3AgKCkpCi0JewotCSAgYm9vbCBzaWduYml0OwotCSAgaWYgKGtub3duX3NpZ25iaXQg KHNpZ25iaXQpKQotCSAgICB7Ci0JICAgICAgaWYgKHNpZ25iaXQpCi0JCXsKLQkJICBpZiAocmVz dWx0KQotCQkgICAgKnJlc3VsdCA9IGJ1aWxkX3JlYWwgKG1fdHlwZSwgcmVhbF92YWx1ZV9uZWdh dGUgKCZkY29uc3QwKSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAocmVzdWx0KQot CQkgICAgKnJlc3VsdCA9IGJ1aWxkX3JlYWwgKG1fdHlwZSwgZGNvbnN0MCk7Ci0JCX0KLQkgICAg ICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotCSAgcmV0dXJuIGZhbHNlOwotCX0KICAgICAgIGlmIChy ZXN1bHQpCiAJKnJlc3VsdCA9IGJ1aWxkX3JlYWwgKG1fdHlwZSwgbV9taW4pOwogICAgICAgcmV0 dXJuIHRydWU7CkBAIC02ODcsNTcgKzY1NSw0MCBAQCBmcmFuZ2U6OnN1cHBvcnRzX3R5cGVfcCAo Y29uc3RfdHJlZSB0eXBlKSBjb25zdAogdm9pZAogZnJhbmdlOjp2ZXJpZnlfcmFuZ2UgKCkKIHsK LSAgaWYgKHVuZGVmaW5lZF9wICgpKQorICBzd2l0Y2ggKG1fa2luZCkKICAgICB7Ci0gICAgICBn Y2NfY2hlY2tpbmdfYXNzZXJ0IChtX3Byb3BzLnVuZGVmaW5lZF9wICgpKTsKKyAgICBjYXNlIFZS X1VOREVGSU5FRDoKKyAgICAgIC8vIG1fdHlwZSBpcyBpZ25vcmVkLgogICAgICAgcmV0dXJuOwot ICAgIH0KLSAgZ2NjX2NoZWNraW5nX2Fzc2VydCAoIW1fcHJvcHMudW5kZWZpbmVkX3AgKCkpOwot Ci0gIGlmICh2YXJ5aW5nX3AgKCkpCi0gICAgewotICAgICAgZ2NjX2NoZWNraW5nX2Fzc2VydCAo bV9wcm9wcy52YXJ5aW5nX3AgKCkpOworICAgIGNhc2UgVlJfVkFSWUlORzoKKyAgICAgIGdjY19j aGVja2luZ19hc3NlcnQgKG1fdHlwZSk7CisgICAgICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChtX3Bv c19uYW4gJiYgbV9uZWdfbmFuKTsKKyAgICAgIGdjY19jaGVja2luZ19hc3NlcnQgKHJlYWxfaXNp bmYgKCZtX21pbiwgMSkpOworICAgICAgZ2NjX2NoZWNraW5nX2Fzc2VydCAocmVhbF9pc2luZiAo Jm1fbWF4LCAwKSk7CiAgICAgICByZXR1cm47CisgICAgY2FzZSBWUl9SQU5HRToKKyAgICAgIGdj Y19jaGVja2luZ19hc3NlcnQgKG1fdHlwZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFZSX05B TjoKKyAgICAgIGdjY19jaGVja2luZ19hc3NlcnQgKG1fdHlwZSk7CisgICAgICBnY2NfY2hlY2tp bmdfYXNzZXJ0IChtX3Bvc19uYW4gfHwgbV9uZWdfbmFuKTsKKyAgICAgIHJldHVybjsKKyAgICBk ZWZhdWx0OgorICAgICAgZ2NjX3VucmVhY2hhYmxlICgpOwogICAgIH0KIAotICAvLyBXZSBkb24n dCBzdXBwb3J0IHRoZSBpbnZlcnNlIG9mIGFuIGZyYW5nZSAoeWV0KS4KLSAgZ2NjX2NoZWNraW5n X2Fzc2VydCAobV9raW5kID09IFZSX1JBTkdFKTsKKyAgLy8gTkFOcyBjYW5ub3QgYXBwZWFyIGlu IHRoZSBlbmRwb2ludHMgb2YgYSByYW5nZS4KKyAgZ2NjX2NoZWNraW5nX2Fzc2VydCAoIXJlYWxf aXNuYW4gKCZtX21pbikgJiYgIXJlYWxfaXNuYW4gKCZtX21heCkpOwogCi0gIGJvb2wgaXNfbmFu ID0gcmVhbF9pc25hbiAoJm1fbWluKSB8fCByZWFsX2lzbmFuICgmbV9tYXgpOwotICBpZiAoaXNf bmFuKQotICAgIHsKLSAgICAgIC8vIElmIGVpdGhlciBpcyBhIE5BTiwgYm90aCBtdXN0IGJlIGEg TkFOLgotICAgICAgZ2NjX2NoZWNraW5nX2Fzc2VydCAocmVhbF9pZGVudGljYWwgKCZtX21pbiwg Jm1fbWF4KSk7Ci0gICAgICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChrbm93bl9uYW4gKCkpOwotICAg IH0KLSAgZWxzZQotICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIHN3YXBwZWQgcmFuZ2Vz LgotICAgIGdjY19jaGVja2luZ19hc3NlcnQgKCFyZWFsX2xlc3MgKCZtX21heCwgJm1fbWluKSk7 CisgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIHN3YXBwZWQgcmFuZ2VzLgorICBnY2NfY2hl Y2tpbmdfYXNzZXJ0ICghcmVhbF9sZXNzICgmbV9tYXgsICZtX21pbikpOwogCi0gIC8vIElmIHdl J3JlIGFic29sdXRlbHkgc3VyZSB3ZSBoYXZlIGEgTkFOLCB0aGUgZW5kcG9pbnRzIHNob3VsZAot ICAvLyByZWZsZWN0IHRoaXMsIG90aGVyd2lzZSB3ZSdkIGhhdmUgbW9yZSB0aGFuIG9uZSB3YXkg dG8gcmVwcmVzZW50Ci0gIC8vIGEgTkFOLgotICBpZiAoa25vd25fbmFuICgpKQotICAgIHsKLSAg ICAgIGdjY19jaGVja2luZ19hc3NlcnQgKHJlYWxfaXNuYW4gKCZtX21pbikpOwotICAgICAgZ2Nj X2NoZWNraW5nX2Fzc2VydCAocmVhbF9pc25hbiAoJm1fbWF4KSk7Ci0gICAgfQotICBlbHNlCi0g ICAgewotICAgICAgLy8gTWFrZSBzdXJlIHRoZSBzaWduYml0IGFuZCByYW5nZSBhZ3JlZS4KLSAg ICAgIGJvb2wgc2lnbmJpdDsKLSAgICAgIGlmIChrbm93bl9zaWduYml0IChzaWduYml0KSkKLQl7 Ci0JICBpZiAoc2lnbmJpdCkKLQkgICAgZ2NjX2NoZWNraW5nX2Fzc2VydCAocmVhbF9jb21wYXJl IChMRV9FWFBSLCAmbV9tYXgsICZkY29uc3QwKSk7Ci0JICBlbHNlCi0JICAgIGdjY19jaGVja2lu Z19hc3NlcnQgKHJlYWxfY29tcGFyZSAoR0VfRVhQUiwgJm1fbWluLCAmZGNvbnN0MCkpOwotCX0K LSAgICB9CisgIC8vIFsgKzAuMCwgLTAuMCBdIGlzIG5vbnNlbnNpY2FsLgorICBnY2NfY2hlY2tp bmdfYXNzZXJ0ICghKHJlYWxfaXN6ZXJvICgmbV9taW4sIDApICYmIHJlYWxfaXN6ZXJvICgmbV9t YXgsIDEpKSk7CiAKICAgLy8gSWYgYWxsIHRoZSBwcm9wZXJ0aWVzIGFyZSBjbGVhciwgd2UgYmV0 dGVyIG5vdCBzcGFuIHRoZSBlbnRpcmUKICAgLy8gZG9tYWluLCBiZWNhdXNlIHRoYXQgd291bGQg bWFrZSB1cyB2YXJ5aW5nLgotICBpZiAobV9wcm9wcy52YXJ5aW5nX3AgKCkpCisgIGlmIChtX3Bv c19uYW4gJiYgbV9uZWdfbmFuKQogICAgIGdjY19jaGVja2luZ19hc3NlcnQgKCFyZWFsX2lzaW5m ICgmbV9taW4sIDEpIHx8ICFyZWFsX2lzaW5mICgmbV9tYXgsIDApKTsKIH0KIApAQCAtNzU1LDE2 ICs3MDYsMjQgQEAgZnJhbmdlOjpub256ZXJvX3AgKCkgY29uc3QKICAgcmV0dXJuIGZhbHNlOwog fQogCi0vLyBTZXQgcmFuZ2UgdG8gWyswLjAsICswLjBdLgorLy8gU2V0IHJhbmdlIHRvIFsrMC4w LCArMC4wXSBpZiBob25vcmluZyBzaWduZWQgemVyb3MsIG9yIFswLjAsIDAuMF0KKy8vIG90aGVy d2lzZS4KIAogdm9pZAogZnJhbmdlOjpzZXRfemVybyAodHJlZSB0eXBlKQogewotICB0cmVlIHpl cm8gPSBidWlsZF96ZXJvX2NzdCAodHlwZSk7Ci0gIHNldCAoemVybywgemVybyk7CisgIGlmIChI T05PUl9TSUdORURfWkVST1MgKHR5cGUpKQorICAgIHsKKyAgICAgIFJFQUxfVkFMVUVfVFlQRSBk Y29uc3RtMCA9IGRjb25zdDA7CisgICAgICBkY29uc3RtMC5zaWduID0gMTsKKyAgICAgIHNldCAo dHlwZSwgZGNvbnN0bTAsIGRjb25zdDApOworICAgICAgY2xlYXJfbmFuICgpOworICAgIH0KKyAg ZWxzZQorICAgIHNldCAodHlwZSwgZGNvbnN0MCwgZGNvbnN0MCk7CiB9CiAKLS8vIFJldHVybiBU UlVFIGZvciBhbnkgWzAuMCwgMC4wXSByZWdhcmRsZXNzIG9mIHNpZ24uCisvLyBSZXR1cm4gVFJV RSBmb3IgYW55IHplcm8gcmVnYXJkbGVzcyBvZiBzaWduLgogCiBib29sCiBmcmFuZ2U6Onplcm9f cCAoKSBjb25zdApAQCAtNzc3LDkgKzczNiw3IEBAIGZyYW5nZTo6emVyb19wICgpIGNvbnN0CiB2 b2lkCiBmcmFuZ2U6OnNldF9ub25uZWdhdGl2ZSAodHJlZSB0eXBlKQogewotICB0cmVlIHplcm8g PSBidWlsZF96ZXJvX2NzdCAodHlwZSk7Ci0gIHRyZWUgaW5mID0gdnJwX3ZhbF9tYXggKHR5cGUp OwotICBzZXQgKHplcm8sIGluZik7CisgIHNldCAodHlwZSwgZGNvbnN0MCwgZGNvbnN0aW5mKTsK IH0KIAogLy8gSGVyZSB3ZSBjb3B5IGJldHdlZW4gYW55IHR3byBpcmFuZ2Uncy4gIFRoZSByYW5n ZXMgY2FuIGJlIGxlZ2FjeSBvcgpAQCAtMzYzNyw4ICszNTk0LDIxIEBAIHJhbmdlX3Rlc3RzX25h biAoKQogICAgICAgQVNTRVJUX0VRIChyMCwgcjEpOwogICAgICAgcjAuY2xlYXJfbmFuICgpOwog ICAgICAgQVNTRVJUX05FIChyMCwgcjEpOworICAgICAgcjAudXBkYXRlX25hbiAoKTsKKyAgICAg IEFTU0VSVF9FUSAocjAsIHIxKTsKKworICAgICAgLy8gWzEwLCAyMF0gTkFOIF4gWzMwLCA0MF0g TkFOID0gTkFOLgorICAgICAgcjAgPSBmcmFuZ2VfZmxvYXQgKCIxMCIsICIyMCIpOworICAgICAg cjEgPSBmcmFuZ2VfZmxvYXQgKCIzMCIsICI0MCIpOworICAgICAgcjAuaW50ZXJzZWN0IChyMSk7 CisgICAgICBBU1NFUlRfVFJVRSAocjAua25vd25faXNuYW4gKCkpOworCisgICAgICAvLyBbMyw1 XSBVIFs1LDEwXSBOQU4gPSAuLi4gTkFOCisgICAgICByMCA9IGZyYW5nZV9mbG9hdCAoIjMiLCAi NSIpOwogICAgICAgcjAuY2xlYXJfbmFuICgpOwotICAgICAgQVNTRVJUX05FIChyMCwgcjEpOwor ICAgICAgcjEgPSBmcmFuZ2VfZmxvYXQgKCI1IiwgIjEwIik7CisgICAgICByMC51bmlvbl8gKHIx KTsKKyAgICAgIEFTU0VSVF9UUlVFIChyMC5tYXliZV9pc25hbiAoKSk7CiAgICAgfQogCiAgIC8v IE5BTiByYW5nZXMgYXJlIG5vdCBlcXVhbCB0byBlYWNoIG90aGVyLgpAQCAtMzY1Nyw0MCArMzYy Nyw3NSBAQCByYW5nZV90ZXN0c19uYW4gKCkKICAgcmVhbF9mcm9tX3N0cmluZyAoJnIsICI2Iik7 CiAgIEFTU0VSVF9UUlVFIChyZWFsX2lkZW50aWNhbCAoJnEsICZyMC5sb3dlcl9ib3VuZCAoKSkp OwogICBBU1NFUlRfVFJVRSAocmVhbF9pZGVudGljYWwgKCZyLCAmcjAudXBwZXJfYm91bmQgKCkp KTsKLSAgQVNTRVJUX1RSVUUgKHIwLm1heWJlX25hbiAoKSk7CisgIEFTU0VSVF9UUlVFIChyMC5t YXliZV9pc25hbiAoKSk7CiAKICAgLy8gTkFOIFUgTkFOID0gTkFOCiAgIHIwLnNldF9uYW4gKGZs b2F0X3R5cGVfbm9kZSk7CiAgIHIxLnNldF9uYW4gKGZsb2F0X3R5cGVfbm9kZSk7CiAgIHIwLnVu aW9uXyAocjEpOwotICBBU1NFUlRfVFJVRSAocmVhbF9pc25hbiAoJnIwLmxvd2VyX2JvdW5kICgp KSk7Ci0gIEFTU0VSVF9UUlVFIChyZWFsX2lzbmFuICgmcjEudXBwZXJfYm91bmQgKCkpKTsKLSAg QVNTRVJUX1RSVUUgKHIwLmtub3duX25hbiAoKSk7CisgIEFTU0VSVF9UUlVFIChyMC5rbm93bl9p c25hbiAoKSk7CiAKLSAgLy8gW0lORiwgSU5GXSBeIE5BTiA9IFZBUllJTkcKKyAgLy8gW0lORiwg SU5GXSBOQU4gXiBOQU4gPSBOQU4KICAgcjAuc2V0X25hbiAoZmxvYXRfdHlwZV9ub2RlKTsKICAg cjEgPSBmcmFuZ2VfZmxvYXQgKCIrSW5mIiwgIitJbmYiKTsKKyAgaWYgKCFIT05PUl9OQU5TIChm bG9hdF90eXBlX25vZGUpKQorICAgIHIxLnVwZGF0ZV9uYW4gKCk7CiAgIHIwLmludGVyc2VjdCAo cjEpOwotICBBU1NFUlRfVFJVRSAocjAudmFyeWluZ19wICgpKTsKKyAgQVNTRVJUX1RSVUUgKHIw Lmtub3duX2lzbmFuICgpKTsKIAogICAvLyBOQU4gXiBOQU4gPSBOQU4KICAgcjAuc2V0X25hbiAo ZmxvYXRfdHlwZV9ub2RlKTsKICAgcjEuc2V0X25hbiAoZmxvYXRfdHlwZV9ub2RlKTsKICAgcjAu aW50ZXJzZWN0IChyMSk7Ci0gIEFTU0VSVF9UUlVFIChyMC5rbm93bl9uYW4gKCkpOworICBBU1NF UlRfVFJVRSAocjAua25vd25faXNuYW4gKCkpOworCisgIC8vICtOQU4gXiAtTkFOID0gVU5ERUZJ TkVECisgIHIwLnNldF9uYW4gKGZsb2F0X3R5cGVfbm9kZSwgZmFsc2UpOworICByMS5zZXRfbmFu IChmbG9hdF90eXBlX25vZGUsIHRydWUpOworICByMC5pbnRlcnNlY3QgKHIxKTsKKyAgQVNTRVJU X1RSVUUgKHIwLnVuZGVmaW5lZF9wICgpKTsKIAogICAvLyBWQVJZSU5HIF4gTkFOID0gTkFOLgog ICByMC5zZXRfbmFuIChmbG9hdF90eXBlX25vZGUpOwogICByMS5zZXRfdmFyeWluZyAoZmxvYXRf dHlwZV9ub2RlKTsKICAgcjAuaW50ZXJzZWN0IChyMSk7Ci0gIEFTU0VSVF9UUlVFIChyMC5rbm93 bl9uYW4gKCkpOworICBBU1NFUlRfVFJVRSAocjAua25vd25faXNuYW4gKCkpOworCisgIC8vIFsz LDRdIF4gTkFOID0gVU5ERUZJTkVELgorICByMCA9IGZyYW5nZV9mbG9hdCAoIjMiLCAiNCIpOwor ICByMC5jbGVhcl9uYW4gKCk7CisgIHIxLnNldF9uYW4gKGZsb2F0X3R5cGVfbm9kZSk7CisgIHIw LmludGVyc2VjdCAocjEpOworICBBU1NFUlRfVFJVRSAocjAudW5kZWZpbmVkX3AgKCkpOworCisg IC8vIFstMywgNV0gXiBOQU4gPSBVTkRFRklORUQKKyAgcjAgPSBmcmFuZ2VfZmxvYXQgKCItMyIs ICI1Iik7CisgIHIwLmNsZWFyX25hbiAoKTsKKyAgcjEuc2V0X25hbiAoZmxvYXRfdHlwZV9ub2Rl KTsKKyAgcjAuaW50ZXJzZWN0IChyMSk7CisgIEFTU0VSVF9UUlVFIChyMC51bmRlZmluZWRfcCAo KSk7CisKKyAgLy8gU2V0dGluZyB0aGUgTkFOIGJpdCB0byB5ZXMgZG9lcyBub3QgbWFrZSB1cyBh IGtub3duIE5BTi4KKyAgcjAuc2V0X3ZhcnlpbmcgKGZsb2F0X3R5cGVfbm9kZSk7CisgIHIwLnVw ZGF0ZV9uYW4gKCk7CisgIEFTU0VSVF9GQUxTRSAocjAua25vd25faXNuYW4gKCkpOwogCi0gIC8v IFNldHRpbmcgdGhlIE5BTiBiaXQgdG8geWVzLCBmb3JjZXMgdG8gcmFuZ2UgdG8gW05BTiwgTkFO XS4KKyAgLy8gTkFOIGlzIGluIGEgVkFSWUlORy4KICAgcjAuc2V0X3ZhcnlpbmcgKGZsb2F0X3R5 cGVfbm9kZSk7Ci0gIHIwLnVwZGF0ZV9uYW4gKGZwX3Byb3A6OllFUyk7Ci0gIEFTU0VSVF9UUlVF IChyMC5rbm93bl9uYW4gKCkpOwotICBBU1NFUlRfVFJVRSAocmVhbF9pc25hbiAoJnIwLmxvd2Vy X2JvdW5kICgpKSk7Ci0gIEFTU0VSVF9UUlVFIChyZWFsX2lzbmFuICgmcjAudXBwZXJfYm91bmQg KCkpKTsKKyAgcmVhbF9uYW4gKCZyLCAiIiwgMSwgVFlQRV9NT0RFIChmbG9hdF90eXBlX25vZGUp KTsKKyAgdHJlZSBuYW4gPSBidWlsZF9yZWFsIChmbG9hdF90eXBlX25vZGUsIHIpOworICBBU1NF UlRfVFJVRSAocjAuY29udGFpbnNfcCAobmFuKSk7CisKKyAgLy8gLU5BTiBpcyBpbiBhIFZBUllJ TkcuCisgIHIwLnNldF92YXJ5aW5nIChmbG9hdF90eXBlX25vZGUpOworICBxID0gcmVhbF92YWx1 ZV9uZWdhdGUgKCZyKTsKKyAgdHJlZSBuZWdfbmFuID0gYnVpbGRfcmVhbCAoZmxvYXRfdHlwZV9u b2RlLCBxKTsKKyAgQVNTRVJUX1RSVUUgKHIwLmNvbnRhaW5zX3AgKG5lZ19uYW4pKTsKKworICAv LyBDbGVhcmluZyB0aGUgTkFOIG9uIGEgW10gTkFOIGlzIHRoZSBlbXB0eSBzZXQuCisgIHIwLnNl dF9uYW4gKGZsb2F0X3R5cGVfbm9kZSk7CisgIHIwLmNsZWFyX25hbiAoKTsKKyAgQVNTRVJUX1RS VUUgKHIwLnVuZGVmaW5lZF9wICgpKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTM3MDIsNDkgKzM3 MDcsODQgQEAgcmFuZ2VfdGVzdHNfc2lnbmVkX3plcm9zICgpCiAgIGZyYW5nZSByMCwgcjE7CiAg IGJvb2wgc2lnbmJpdDsKIAotICAvLyBTaW5jZSAtMC4wID09ICswLjAsIGEgcmFuZ2Ugb2YgWy0w LjAsIC0wLjBdIHNob3VsZCBjb250YWluICswLjAKLSAgLy8gYW5kIHZpY2UgdmVyc2EuCisgIC8v IFswLDBdIGNvbnRhaW5zIFswLDBdIGJ1dCBub3QgWy0wLC0wXSBhbmQgdmljZSB2ZXJzYS4KICAg cjAgPSBmcmFuZ2UgKHplcm8sIHplcm8pOwogICByMSA9IGZyYW5nZSAobmVnX3plcm8sIG5lZ196 ZXJvKTsKICAgQVNTRVJUX1RSVUUgKHIwLmNvbnRhaW5zX3AgKHplcm8pKTsKLSAgQVNTRVJUX1RS VUUgKHIwLmNvbnRhaW5zX3AgKG5lZ196ZXJvKSk7Ci0gIEFTU0VSVF9UUlVFIChyMS5jb250YWlu c19wICh6ZXJvKSk7CisgIEFTU0VSVF9UUlVFICghcjAuY29udGFpbnNfcCAobmVnX3plcm8pKTsK ICAgQVNTRVJUX1RSVUUgKHIxLmNvbnRhaW5zX3AgKG5lZ196ZXJvKSk7CisgIEFTU0VSVF9UUlVF ICghcjEuY29udGFpbnNfcCAoemVybykpOwogCiAgIC8vIFRlc3QgY29udGFpbnNfcCgpIHdoZW4g d2Uga25vdyB0aGUgc2lnbiBvZiB0aGUgemVyby4KLSAgcjAgPSBmcmFuZ2UoemVybywgemVybyk7 Ci0gIHIwLnNldF9zaWduYml0IChmcF9wcm9wOjpOTyk7CisgIHIwID0gZnJhbmdlICh6ZXJvLCB6 ZXJvKTsKICAgQVNTRVJUX1RSVUUgKHIwLmNvbnRhaW5zX3AgKHplcm8pKTsKICAgQVNTRVJUX0ZB TFNFIChyMC5jb250YWluc19wIChuZWdfemVybykpOwotICByMC5zZXRfc2lnbmJpdCAoZnBfcHJv cDo6WUVTKTsKKyAgcjAgPSBmcmFuZ2UgKG5lZ196ZXJvLCBuZWdfemVybyk7CiAgIEFTU0VSVF9U UlVFIChyMC5jb250YWluc19wIChuZWdfemVybykpOwogICBBU1NFUlRfRkFMU0UgKHIwLmNvbnRh aW5zX3AgKHplcm8pKTsKIAotICAvLyBUaGUgaW50ZXJzZWN0aW9uIG9mIHplcm9zIHRoYXQgZGlm ZmVyIGluIHNpZ24gaXMgdGhlIGVtcHR5IHNldC4KLSAgcjAgPSBmcmFuZ2UgKHplcm8sIHplcm8p OwotICByMC5zZXRfc2lnbmJpdCAoZnBfcHJvcDo6WUVTKTsKKyAgLy8gVGhlIGludGVyc2VjdGlv biBvZiB6ZXJvcyB0aGF0IGRpZmZlciBpbiBzaWduIGlzIGEgTkFOIChvcgorICAvLyB1bmRlZmlu ZWQgaWYgbm90IGhvbm9yaW5nIE5BTnMpLgorICByMCA9IGZyYW5nZSAobmVnX3plcm8sIG5lZ196 ZXJvKTsKICAgcjEgPSBmcmFuZ2UgKHplcm8sIHplcm8pOwotICByMS5zZXRfc2lnbmJpdCAoZnBf cHJvcDo6Tk8pOwogICByMC5pbnRlcnNlY3QgKHIxKTsKLSAgQVNTRVJUX1RSVUUgKHIwLnVuZGVm aW5lZF9wICgpKTsKKyAgaWYgKEhPTk9SX05BTlMgKGZsb2F0X3R5cGVfbm9kZSkpCisgICAgQVNT RVJUX1RSVUUgKHIwLmtub3duX2lzbmFuICgpKTsKKyAgZWxzZQorICAgIEFTU0VSVF9UUlVFIChy MC51bmRlZmluZWRfcCAoKSk7CiAKICAgLy8gVGhlIHVuaW9uIG9mIHplcm9zIHRoYXQgZGlmZmVy IGluIHNpZ24gaXMgYSB6ZXJvIHdpdGggdW5rbm93biBzaWduLgogICByMCA9IGZyYW5nZSAoemVy bywgemVybyk7Ci0gIHIwLnNldF9zaWduYml0IChmcF9wcm9wOjpOTyk7Ci0gIHIxID0gZnJhbmdl ICh6ZXJvLCB6ZXJvKTsKLSAgcjEuc2V0X3NpZ25iaXQgKGZwX3Byb3A6OllFUyk7CisgIHIxID0g ZnJhbmdlIChuZWdfemVybywgbmVnX3plcm8pOwogICByMC51bmlvbl8gKHIxKTsKLSAgQVNTRVJU X1RSVUUgKHIwLnplcm9fcCAoKSAmJiAhcjAua25vd25fc2lnbmJpdCAoc2lnbmJpdCkpOworICBB U1NFUlRfVFJVRSAocjAuemVyb19wICgpICYmICFyMC5zaWduYml0X3AgKHNpZ25iaXQpKTsKIAot ICAvLyBOQU4gVSBbNSw2XSBzaG91bGQgYmUgWzUsNl0gd2l0aCBubyBzaWduIGluZm8uCisgIC8v IFstMCwgKzBdIGhhcyBhbiB1bmtub3duIHNpZ24uCisgIHIwID0gZnJhbmdlIChuZWdfemVybywg emVybyk7CisgIEFTU0VSVF9UUlVFIChyMC56ZXJvX3AgKCkgJiYgIXIwLnNpZ25iaXRfcCAoc2ln bmJpdCkpOworCisgIC8vIFstMCwgKzBdIF4gWzAsIDBdIGlzIFswLCAwXQorICByMCA9IGZyYW5n ZSAobmVnX3plcm8sIHplcm8pOworICByMSA9IGZyYW5nZSAoemVybywgemVybyk7CisgIHIwLmlu dGVyc2VjdCAocjEpOworICBBU1NFUlRfVFJVRSAocjAuemVyb19wICgpKTsKKworICAvLyBOQU4g VSBbNSw2XSBzaG91bGQgYmUgWzUsNl0gTkFOLgogICByMC5zZXRfbmFuIChmbG9hdF90eXBlX25v ZGUpOwogICByMSA9IGZyYW5nZV9mbG9hdCAoIjUiLCAiNiIpOworICByMS5jbGVhcl9uYW4gKCk7 CiAgIHIwLnVuaW9uXyAocjEpOwogICByZWFsX2Zyb21fc3RyaW5nICgmcSwgIjUiKTsKICAgcmVh bF9mcm9tX3N0cmluZyAoJnIsICI2Iik7CiAgIEFTU0VSVF9UUlVFIChyZWFsX2lkZW50aWNhbCAo JnEsICZyMC5sb3dlcl9ib3VuZCAoKSkpOwogICBBU1NFUlRfVFJVRSAocmVhbF9pZGVudGljYWwg KCZyLCAmcjAudXBwZXJfYm91bmQgKCkpKTsKLSAgQVNTRVJUX1RSVUUgKCFyMC5rbm93bl9zaWdu Yml0IChzaWduYml0KSk7CisgIEFTU0VSVF9UUlVFICghcjAuc2lnbmJpdF9wIChzaWduYml0KSk7 CisgIEFTU0VSVF9UUlVFIChyMC5tYXliZV9pc25hbiAoKSk7CisKKyAgcjAgPSBmcmFuZ2VfZmxv YXQgKCIrMCIsICI1Iik7CisgIHIwLmNsZWFyX25hbiAoKTsKKyAgQVNTRVJUX1RSVUUgKHIwLnNp Z25iaXRfcCAoc2lnbmJpdCkgJiYgIXNpZ25iaXQpOworCisgIHIwID0gZnJhbmdlX2Zsb2F0ICgi LTAiLCAiNSIpOworICByMC5jbGVhcl9uYW4gKCk7CisgIEFTU0VSVF9UUlVFICghcjAuc2lnbmJp dF9wIChzaWduYml0KSk7CisKKyAgcjAgPSBmcmFuZ2VfZmxvYXQgKCItMCIsICIxMCIpOworICBy MSA9IGZyYW5nZV9mbG9hdCAoIjAiLCAiNSIpOworICByMC5pbnRlcnNlY3QgKHIxKTsKKyAgQVNT RVJUX1RSVUUgKHJlYWxfaXN6ZXJvICgmcjAubG93ZXJfYm91bmQgKCksIGZhbHNlKSk7CisKKyAg cjAgPSBmcmFuZ2VfZmxvYXQgKCItMCIsICI1Iik7CisgIHIxID0gZnJhbmdlX2Zsb2F0ICgiMCIs ICI1Iik7CisgIHIwLnVuaW9uXyAocjEpOworICBBU1NFUlRfVFJVRSAocmVhbF9pc3plcm8gKCZy MC5sb3dlcl9ib3VuZCAoKSwgdHJ1ZSkpOworCisgIHIwID0gZnJhbmdlX2Zsb2F0ICgiLTUiLCAi LTAiKTsKKyAgcjAudXBkYXRlX25hbiAoKTsKKyAgcjEgPSBmcmFuZ2VfZmxvYXQgKCIwIiwgIjAi KTsKKyAgcjEudXBkYXRlX25hbiAoKTsKKyAgcjAuaW50ZXJzZWN0IChyMSk7CisgIEFTU0VSVF9U UlVFIChyMC5rbm93bl9pc25hbiAoKSk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0zNzUzLDUyICsz NzkzLDI1IEBAIHJhbmdlX3Rlc3RzX3NpZ25iaXQgKCkKICAgZnJhbmdlIHIwLCByMTsKICAgYm9v bCBzaWduYml0OwogCi0gIC8vIFNldHRpbmcgdGhlIHNpZ25iaXQgZHJvcHMgdGhlIHJhbmdlIHRv IFstSU5GLCAwXS4KLSAgcjAuc2V0X3ZhcnlpbmcgKGZsb2F0X3R5cGVfbm9kZSk7Ci0gIHIwLnNl dF9zaWduYml0IChmcF9wcm9wOjpZRVMpOwotICBBU1NFUlRfVFJVRSAocmVhbF9pc2luZiAoJnIw Lmxvd2VyX2JvdW5kICgpLCAxKSk7Ci0gIEFTU0VSVF9UUlVFIChyZWFsX2lzemVybyAoJnIwLnVw cGVyX2JvdW5kICgpKSk7Ci0KLSAgLy8gU2V0dGluZyB0aGUgc2lnbmJpdCBmb3IgWy01LCAxMF0g Y3JvcHMgdGhlIHJhbmdlIHRvIFstNSwgMF0gd2l0aAotICAvLyB0aGUgc2lnbmJpdCBwcm9wZXJ0 eSBzZXQuCi0gIHIwID0gZnJhbmdlX2Zsb2F0ICgiLTUiLCAiMTAiKTsKLSAgcjAuc2V0X3NpZ25i aXQgKGZwX3Byb3A6OllFUyk7Ci0gIHIwLmNsZWFyX25hbiAoKTsKLSAgQVNTRVJUX1RSVUUgKHIw Lmtub3duX3NpZ25iaXQgKHNpZ25iaXQpICYmIHNpZ25iaXQpOwotICByMSA9IGZyYW5nZV9mbG9h dCAoIi01IiwgIjAiKTsKLSAgQVNTRVJUX1RSVUUgKHJlYWxfaWRlbnRpY2FsICgmcjAubG93ZXJf Ym91bmQgKCksICZyMS5sb3dlcl9ib3VuZCAoKSkpOwotICBBU1NFUlRfVFJVRSAocmVhbF9pZGVu dGljYWwgKCZyMC51cHBlcl9ib3VuZCAoKSwgJnIxLnVwcGVyX2JvdW5kICgpKSk7Ci0KICAgLy8g TmVnYXRpdmUgbnVtYmVycyBzaG91bGQgaGF2ZSB0aGUgU0lHTkJJVCBzZXQuCiAgIHIwID0gZnJh bmdlX2Zsb2F0ICgiLTUiLCAiLTEiKTsKICAgcjAuY2xlYXJfbmFuICgpOwotICBBU1NFUlRfVFJV RSAocjAua25vd25fc2lnbmJpdCAoc2lnbmJpdCkgJiYgc2lnbmJpdCk7CisgIEFTU0VSVF9UUlVF IChyMC5zaWduYml0X3AgKHNpZ25iaXQpICYmIHNpZ25iaXQpOwogICAvLyBQb3NpdGl2ZSBudW1i ZXJzIHNob3VsZCBoYXZlIHRoZSBTSUdOQklUIGNsZWFyLgogICByMCA9IGZyYW5nZV9mbG9hdCAo IjEiLCAiMTAiKTsKICAgcjAuY2xlYXJfbmFuICgpOwotICBBU1NFUlRfVFJVRSAocjAua25vd25f c2lnbmJpdCAoc2lnbmJpdCkgJiYgIXNpZ25iaXQpOworICBBU1NFUlRfVFJVRSAocjAuc2lnbmJp dF9wIChzaWduYml0KSAmJiAhc2lnbmJpdCk7CiAgIC8vIE51bWJlcnMgY29udGFpbmluZyB6ZXJv IHNob3VsZCBoYXZlIGFuIHVua25vd24gU0lHTkJJVC4KICAgcjAgPSBmcmFuZ2VfZmxvYXQgKCIw IiwgIjEwIik7CiAgIHIwLmNsZWFyX25hbiAoKTsKLSAgQVNTRVJUX1RSVUUgKCFyMC5rbm93bl9z aWduYml0IChzaWduYml0KSk7CisgIEFTU0VSVF9UUlVFIChyMC5zaWduYml0X3AgKHNpZ25iaXQp ICYmICFzaWduYml0KTsKICAgLy8gTnVtYmVycyBzcGFubmluZyBib3RoIHBvc2l0aXZlIGFuZCBu ZWdhdGl2ZSBzaG91bGQgaGF2ZSBhbgogICAvLyB1bmtub3duIFNJR05CSVQuCiAgIHIwID0gZnJh bmdlX2Zsb2F0ICgiLTEwIiwgIjEwIik7CiAgIHIwLmNsZWFyX25hbiAoKTsKLSAgQVNTRVJUX1RS VUUgKCFyMC5rbm93bl9zaWduYml0IChzaWduYml0KSk7CisgIEFTU0VSVF9UUlVFICghcjAuc2ln bmJpdF9wIChzaWduYml0KSk7CiAgIHIwLnNldF92YXJ5aW5nIChmbG9hdF90eXBlX25vZGUpOwot ICBBU1NFUlRfVFJVRSAoIXIwLmtub3duX3NpZ25iaXQgKHNpZ25iaXQpKTsKLQotICAvLyBJZ25v cmUgc2lnbmJpdCBjaGFuZ2VzIHdoZW4gdGhlIHNpZ24gYml0IGlzIG9idmlvdXNseSBrbm93biBm cm9tCi0gIC8vIHRoZSByYW5nZS4KLSAgcjAgPSBmcmFuZ2VfZmxvYXQgKCI1IiwgIjEwIik7Ci0g IHIwLmNsZWFyX25hbiAoKTsKLSAgcjAuc2V0X3NpZ25iaXQgKGZwX3Byb3A6OlZBUllJTkcpOwot ICBBU1NFUlRfVFJVRSAocjAua25vd25fc2lnbmJpdCAoc2lnbmJpdCkgJiYgIXNpZ25iaXQpOwot ICByMCA9IGZyYW5nZV9mbG9hdCAoIi01IiwgIi0xIik7Ci0gIHIwLnNldF9zaWduYml0IChmcF9w cm9wOjpOTyk7Ci0gIHIwLmNsZWFyX25hbiAoKTsKLSAgQVNTRVJUX1RSVUUgKHIwLnVuZGVmaW5l ZF9wICgpKTsKKyAgQVNTRVJUX1RSVUUgKCFyMC5zaWduYml0X3AgKHNpZ25iaXQpKTsKIH0KIAog c3RhdGljIHZvaWQKQEAgLTM4MTUsNyArMzgyOCw3IEBAIHJhbmdlX3Rlc3RzX2Zsb2F0cyAoKQog ICAvLyBBIHJhbmdlIG9mIFstSU5GLCtJTkZdIGlzIGFjdHVhbGx5IFZBUllJTkcgaWYgbm8gb3Ro ZXIgcHJvcGVydGllcwogICAvLyBhcmUgc2V0LgogICByMCA9IGZyYW5nZV9mbG9hdCAoIi1JbmYi LCAiK0luZiIpOwotICBpZiAocjAubWF5YmVfbmFuICgpKQorICBpZiAocjAubWF5YmVfaXNuYW4g KCkpCiAgICAgQVNTRVJUX1RSVUUgKHIwLnZhcnlpbmdfcCAoKSk7CiAgIC8vIC4uLnVubGVzcyBp dCBoYXMgc29tZSBzcGVjaWFsIHByb3BlcnR5Li4uCiAgIHIwLmNsZWFyX25hbiAoKTsKQEAgLTM4 OTYsOSArMzkwOSwxOSBAQCByYW5nZV90ZXN0c19mbG9hdHMgKCkKICAgcjAuaW50ZXJzZWN0IChy MSk7CiAgIEFTU0VSVF9FUSAocjAsIGZyYW5nZV9mbG9hdCAoIjE1IiwgIjIwIikpOwogCisgIC8v IFsxMCwyMF0gTkFOIF4gWzIxLDI1XSBOQU4gPSBbTkFOXQorICByMCA9IGZyYW5nZV9mbG9hdCAo IjEwIiwgIjIwIik7CisgIHIwLnVwZGF0ZV9uYW4gKCk7CisgIHIxID0gZnJhbmdlX2Zsb2F0ICgi MjEiLCAiMjUiKTsKKyAgcjEudXBkYXRlX25hbiAoKTsKKyAgcjAuaW50ZXJzZWN0IChyMSk7Cisg IEFTU0VSVF9UUlVFIChyMC5rbm93bl9pc25hbiAoKSk7CisKICAgLy8gWzEwLDIwXSBeIFsyMSwy NV0gPSBbXQogICByMCA9IGZyYW5nZV9mbG9hdCAoIjEwIiwgIjIwIik7CisgIHIwLmNsZWFyX25h biAoKTsKICAgcjEgPSBmcmFuZ2VfZmxvYXQgKCIyMSIsICIyNSIpOworICByMS5jbGVhcl9uYW4g KCk7CiAgIHIwLmludGVyc2VjdCAocjEpOwogICBBU1NFUlRfVFJVRSAocjAudW5kZWZpbmVkX3Ag KCkpOwogfQpkaWZmIC0tZ2l0IGEvZ2NjL3ZhbHVlLXJhbmdlLmggYi9nY2MvdmFsdWUtcmFuZ2Uu aAppbmRleCA0MzkyZGU4NGM4Yi4uNWNhZmM0YjE2ZDUgMTAwNjQ0Ci0tLSBhL2djYy92YWx1ZS1y YW5nZS5oCisrKyBiL2djYy92YWx1ZS1yYW5nZS5oCkBAIC0zNSw2ICszNSw4IEBAIGVudW0gdmFs dWVfcmFuZ2Vfa2luZAogICBWUl9SQU5HRSwKICAgLyogUmFuZ2UgaXMgfltNSU4sIE1BWF0uICAq LwogICBWUl9BTlRJX1JBTkdFLAorICAvKiBSYW5nZSBpcyBhIE5BTi4gICovCisgIFZSX05BTiwK ICAgLyogUmFuZ2UgaXMgYSBuaWNlIGd1eS4gICovCiAgIFZSX0xBU1QKIH07CkBAIC0yNjMsNjkg KzI2NSwxMCBAQCBwdWJsaWM6CiAgIHZpcnR1YWwgdm9pZCBhY2NlcHQgKGNvbnN0IHZyYW5nZV92 aXNpdG9yICZ2KSBjb25zdCBvdmVycmlkZTsKIH07CiAKLS8vIEZsb2F0aW5nIHBvaW50IHByb3Bl cnR5IHRvIHJlcHJlc2VudCBwb3NzaWJsZSB2YWx1ZXMgb2YgYSBOQU4sIElORiwgZXRjLgotCi1j bGFzcyBmcF9wcm9wCi17Ci1wdWJsaWM6Ci0gIGVudW0ga2luZCB7Ci0gICAgVU5ERUZJTkVECT0g MHgwLAkJLy8gUHJvcCBpcyBpbXBvc3NpYmxlLgotICAgIFlFUwkJPSAweDEsCQkvLyBQcm9wIGlz IGRlZmluaXRlbHkgc2V0LgotICAgIE5PCQk9IDB4MiwJCS8vIFByb3AgaXMgZGVmaW5pdGVseSBu b3Qgc2V0LgotICAgIFZBUllJTkcJPSAoWUVTIHwgTk8pCS8vIFByb3AgbWF5IGhvbGQuCi0gIH07 Ci0gIGZwX3Byb3AgKGtpbmQgZikgOiBtX2tpbmQgKGYpIHsgfQotICBib29sIHZhcnlpbmdfcCAo KSBjb25zdCB7IHJldHVybiBtX2tpbmQgPT0gVkFSWUlORzsgfQotICBib29sIHVuZGVmaW5lZF9w ICgpIGNvbnN0IHsgcmV0dXJuIG1fa2luZCA9PSBVTkRFRklORUQ7IH0KLSAgYm9vbCB5ZXNfcCAo KSBjb25zdCB7IHJldHVybiBtX2tpbmQgPT0gWUVTOyB9Ci0gIGJvb2wgbm9fcCAoKSBjb25zdCB7 IHJldHVybiBtX2tpbmQgPT0gTk87IH0KLXByaXZhdGU6Ci0gIHVuc2lnbmVkIGNoYXIgbV9raW5k IDogMjsKLX07Ci0KLS8vIEFjY2Vzc29ycyBmb3IgaW5kaXZpZHVhbCBGUCBwcm9wZXJ0aWVzLgot Ci0jZGVmaW5lIEZQX1BST1BfQUNDRVNTT1IoTkFNRSkgXAotICB2b2lkIE5BTUUjI19zZXRfdmFy eWluZyAoKSB7IHUuYml0cy5OQU1FID0gZnBfcHJvcDo6VkFSWUlORzsgfQlcCi0gIHZvaWQgTkFN RSMjX3NldF95ZXMgKCkgeyB1LmJpdHMuTkFNRSA9IGZwX3Byb3A6OllFUzsgfQlcCi0gIHZvaWQg TkFNRSMjX3NldF9ubyAoKSB7IHUuYml0cy5OQU1FID0gZnBfcHJvcDo6Tk87IH0JXAotICBib29s IE5BTUUjI192YXJ5aW5nX3AgKCkgY29uc3QgeyByZXR1cm4gdS5iaXRzLk5BTUUgPT0gZnBfcHJv cDo6VkFSWUlORzsgfSBcCi0gIGJvb2wgTkFNRSMjX3VuZGVmaW5lZF9wICgpIGNvbnN0IHsgcmV0 dXJuIHUuYml0cy5OQU1FID09IGZwX3Byb3A6OlVOREVGSU5FRDsgfSBcCi0gIGJvb2wgTkFNRSMj X3llc19wICgpIGNvbnN0IHsgcmV0dXJuIHUuYml0cy5OQU1FID09IGZwX3Byb3A6OllFUzsgfQlc Ci0gIGJvb2wgTkFNRSMjX25vX3AgKCkgY29uc3QgeyByZXR1cm4gdS5iaXRzLk5BTUUgPT0gZnBf cHJvcDo6Tk87IH0gXAotICBmcF9wcm9wIGdldF8jI05BTUUgKCkgY29uc3QJCQkJICAgXAotICB7 IHJldHVybiBmcF9wcm9wICgoZnBfcHJvcDo6a2luZCkgdS5iaXRzLk5BTUUpOyB9IFwKLSAgdm9p ZCBzZXRfIyNOQU1FIChmcF9wcm9wOjpraW5kIGYpIHsgdS5iaXRzLk5BTUUgPSBmOyB9Ci0KLS8v IEFnZ3JlZ2F0ZSBvZiBhbGwgdGhlIEZQIHByb3BlcnRpZXMgaW4gYW4gZnJhbmdlIHBhY2tlZCBp bnRvIG9uZQotLy8gc3RydWN0dXJlIHRvIHNhdmUgc3BhY2UuICBVc2luZyBleHBsaWNpdCBmcF9w cm9wJ3MgaW4gdGhlIGZyYW5nZSwKLS8vIHdvdWxkIHRha2Ugb25lIGJ5dGUgcGVyIHByb3BlcnR5 IGJlY2F1c2Ugb2YgcGFkZGluZy4gIEluc3RlYWQsIHdlCi0vLyBjYW4gc2F2ZSBhbGwgcHJvcGVy dGllcyBpbnRvIG9uZSBieXRlLgotCi1jbGFzcyBmcmFuZ2VfcHJvcHMKLXsKLXB1YmxpYzoKLSAg ZnJhbmdlX3Byb3BzICgpIHsgc2V0X3ZhcnlpbmcgKCk7IH0KLSAgdm9pZCBzZXRfdmFyeWluZyAo KSB7IHUuYnl0ZXMgPSAweGZmOyB9Ci0gIHZvaWQgc2V0X3VuZGVmaW5lZCAoKSB7IHUuYnl0ZXMg PSAwOyB9Ci0gIGJvb2wgdmFyeWluZ19wICgpIHsgcmV0dXJuIHUuYnl0ZXMgPT0gMHhmZjsgfQot ICBib29sIHVuZGVmaW5lZF9wICgpIHsgcmV0dXJuIHUuYnl0ZXMgPT0gMDsgfQotICBib29sIHVu aW9uXyAoY29uc3QgZnJhbmdlX3Byb3BzICZvdGhlcik7Ci0gIGJvb2wgaW50ZXJzZWN0IChjb25z dCBmcmFuZ2VfcHJvcHMgJm90aGVyKTsKLSAgYm9vbCBvcGVyYXRvcj09IChjb25zdCBmcmFuZ2Vf cHJvcHMgJm90aGVyKSBjb25zdDsKLSAgRlBfUFJPUF9BQ0NFU1NPUihuYW4pCi0gIEZQX1BST1Bf QUNDRVNTT1Ioc2lnbmJpdCkKLXByaXZhdGU6Ci0gIHVuaW9uIHsKLSAgICBzdHJ1Y3QgewotICAg ICAgdW5zaWduZWQgY2hhciBuYW4gOiAyOwotICAgICAgdW5zaWduZWQgY2hhciBzaWduYml0IDog MjsKLSAgICB9IGJpdHM7Ci0gICAgdW5zaWduZWQgY2hhciBieXRlczsKLSAgfSB1OwotfTsKLQog Ly8gQSBmbG9hdGluZyBwb2ludCByYW5nZS4KKy8vCisvLyBUaGUgcmVwcmVzZW50YXRpb24gaXMg YSB0eXBlIHdpdGggYSBjb3VwbGUgb2YgZW5kcG9pbnRzLCB1bmlvbmVkCisvLyB3aXRoIHRoZSBz ZXQgb2YgeyAtTkFOLCArTmFuIH0uCiAKIGNsYXNzIGZyYW5nZSA6IHB1YmxpYyB2cmFuZ2UKIHsK QEAgLTM0OSw2ICsyOTIsNyBAQCBwdWJsaWM6CiAgIHZvaWQgc2V0ICh0cmVlIHR5cGUsIGNvbnN0 IFJFQUxfVkFMVUVfVFlQRSAmLCBjb25zdCBSRUFMX1ZBTFVFX1RZUEUgJiwKIAkgICAgdmFsdWVf cmFuZ2Vfa2luZCA9IFZSX1JBTkdFKTsKICAgdm9pZCBzZXRfbmFuICh0cmVlIHR5cGUpOworICB2 b2lkIHNldF9uYW4gKHRyZWUgdHlwZSwgYm9vbCBzaWduKTsKICAgdmlydHVhbCB2b2lkIHNldF92 YXJ5aW5nICh0cmVlIHR5cGUpIG92ZXJyaWRlOwogICB2aXJ0dWFsIHZvaWQgc2V0X3VuZGVmaW5l ZCAoKSBvdmVycmlkZTsKICAgdmlydHVhbCBib29sIHVuaW9uXyAoY29uc3QgdnJhbmdlICYpIG92 ZXJyaWRlOwpAQCAtMzY3LDQyICszMTEsNDEgQEAgcHVibGljOgogICBib29sIG9wZXJhdG9yIT0g KGNvbnN0IGZyYW5nZSAmcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSByKTsgfQogICBjb25z dCBSRUFMX1ZBTFVFX1RZUEUgJmxvd2VyX2JvdW5kICgpIGNvbnN0OwogICBjb25zdCBSRUFMX1ZB TFVFX1RZUEUgJnVwcGVyX2JvdW5kICgpIGNvbnN0OworICB2b2lkIHVwZGF0ZV9uYW4gKCk7Cisg IHZvaWQgY2xlYXJfbmFuICgpOwogCiAgIC8vIGZwY2xhc3NpZnkgbGlrZSBBUEkKLSAgYm9vbCBr bm93bl9maW5pdGUgKCkgY29uc3Q7Ci0gIGJvb2wgbWF5YmVfaW5mICgpIGNvbnN0OwotICBib29s IGtub3duX2luZiAoKSBjb25zdDsKLSAgYm9vbCBtYXliZV9uYW4gKCkgY29uc3Q7Ci0gIGJvb2wg a25vd25fbmFuICgpIGNvbnN0OwotICBib29sIGtub3duX3NpZ25iaXQgKGJvb2wgJnNpZ25iaXQp IGNvbnN0OwotCi0gIC8vIEFjY2Vzc29ycyBmb3IgRlAgcHJvcGVydGllcy4KLSAgdm9pZCB1cGRh dGVfbmFuIChmcF9wcm9wOjpraW5kIGYpOwotICB2b2lkIGNsZWFyX25hbiAoKSB7IHVwZGF0ZV9u YW4gKGZwX3Byb3A6Ok5PKTsgfQotICB2b2lkIHNldF9zaWduYml0IChmcF9wcm9wOjpraW5kKTsK KyAgYm9vbCBrbm93bl9pc2Zpbml0ZSAoKSBjb25zdDsKKyAgYm9vbCBrbm93bl9pc25hbiAoKSBj b25zdDsKKyAgYm9vbCBrbm93bl9pc2luZiAoKSBjb25zdDsKKyAgYm9vbCBtYXliZV9pc25hbiAo KSBjb25zdDsKKyAgYm9vbCBtYXliZV9pc2luZiAoKSBjb25zdDsKKyAgYm9vbCBzaWduYml0X3Ag KGJvb2wgJnNpZ25iaXQpIGNvbnN0OwogcHJpdmF0ZToKLSAgZnBfcHJvcCBnZXRfbmFuICgpIGNv bnN0IHsgcmV0dXJuIG1fcHJvcHMuZ2V0X25hbiAoKTsgfQotICBmcF9wcm9wIGdldF9zaWduYml0 ICgpIGNvbnN0IHsgcmV0dXJuIG1fcHJvcHMuZ2V0X3NpZ25iaXQgKCk7IH0KICAgdm9pZCB2ZXJp ZnlfcmFuZ2UgKCk7CiAgIGJvb2wgbm9ybWFsaXplX2tpbmQgKCk7CisgIGJvb2wgdW5pb25fbmFu cyAoY29uc3QgZnJhbmdlICYpOworICBib29sIGludGVyc2VjdF9uYW5zIChjb25zdCBmcmFuZ2Ug Jik7CisgIGJvb2wgY29tYmluZV96ZXJvcyAoY29uc3QgZnJhbmdlICYsIGJvb2wgdW5pb25fcCk7 CiAKLSAgZnJhbmdlX3Byb3BzIG1fcHJvcHM7CiAgIHRyZWUgbV90eXBlOwogICBSRUFMX1ZBTFVF X1RZUEUgbV9taW47CiAgIFJFQUxfVkFMVUVfVFlQRSBtX21heDsKKyAgYm9vbCBtX3Bvc19uYW47 CisgIGJvb2wgbV9uZWdfbmFuOwogfTsKIAogaW5saW5lIGNvbnN0IFJFQUxfVkFMVUVfVFlQRSAm CiBmcmFuZ2U6Omxvd2VyX2JvdW5kICgpIGNvbnN0CiB7Ci0gIGdjY19jaGVja2luZ19hc3NlcnQg KCF1bmRlZmluZWRfcCAoKSk7CisgIGdjY19jaGVja2luZ19hc3NlcnQgKCF1bmRlZmluZWRfcCAo KSAmJiAha25vd25faXNuYW4gKCkpOwogICByZXR1cm4gbV9taW47CiB9CiAKIGlubGluZSBjb25z dCBSRUFMX1ZBTFVFX1RZUEUgJgogZnJhbmdlOjp1cHBlcl9ib3VuZCAoKSBjb25zdAogewotICBn Y2NfY2hlY2tpbmdfYXNzZXJ0ICghdW5kZWZpbmVkX3AgKCkpOworICBnY2NfY2hlY2tpbmdfYXNz ZXJ0ICghdW5kZWZpbmVkX3AgKCkgJiYgIWtub3duX2lzbmFuICgpKTsKICAgcmV0dXJuIG1fbWF4 OwogfQogCkBAIC0xMDgyLDMwICsxMDI1LDYgQEAgdnJwX3ZhbF9taW4gKGNvbnN0X3RyZWUgdHlw ZSkKICAgcmV0dXJuIE5VTExfVFJFRTsKIH0KIAotLy8gU3VwcG9ydGluZyBtZXRob2RzIGZvciBm cmFuZ2UuCi0KLWlubGluZSBib29sCi1mcmFuZ2VfcHJvcHM6Om9wZXJhdG9yPT0gKGNvbnN0IGZy YW5nZV9wcm9wcyAmb3RoZXIpIGNvbnN0Ci17Ci0gIHJldHVybiB1LmJ5dGVzID09IG90aGVyLnUu Ynl0ZXM7Ci19Ci0KLWlubGluZSBib29sCi1mcmFuZ2VfcHJvcHM6OnVuaW9uXyAoY29uc3QgZnJh bmdlX3Byb3BzICZvdGhlcikKLXsKLSAgdW5zaWduZWQgY2hhciBzYXZlZCA9IHUuYnl0ZXM7Ci0g IHUuYnl0ZXMgfD0gb3RoZXIudS5ieXRlczsKLSAgcmV0dXJuIHUuYnl0ZXMgIT0gc2F2ZWQ7Ci19 Ci0KLWlubGluZSBib29sCi1mcmFuZ2VfcHJvcHM6OmludGVyc2VjdCAoY29uc3QgZnJhbmdlX3By b3BzICZvdGhlcikKLXsKLSAgdW5zaWduZWQgY2hhciBzYXZlZCA9IHUuYnl0ZXM7Ci0gIHUuYnl0 ZXMgJj0gb3RoZXIudS5ieXRlczsKLSAgcmV0dXJuIHUuYnl0ZXMgIT0gc2F2ZWQ7Ci19Ci0KIGlu bGluZQogZnJhbmdlOjpmcmFuZ2UgKCkKIHsKQEAgLTExNTQsMTUgKzEwNzMsNDQgQEAgZnJhbmdl OjpzZXRfdmFyeWluZyAodHJlZSB0eXBlKQogICBtX3R5cGUgPSB0eXBlOwogICBtX21pbiA9IGRj b25zdG5pbmY7CiAgIG1fbWF4ID0gZGNvbnN0aW5mOwotICBtX3Byb3BzLnNldF92YXJ5aW5nICgp OworICBtX3Bvc19uYW4gPSB0cnVlOworICBtX25lZ19uYW4gPSB0cnVlOwogfQogCiBpbmxpbmUg dm9pZAogZnJhbmdlOjpzZXRfdW5kZWZpbmVkICgpCiB7CiAgIG1fa2luZCA9IFZSX1VOREVGSU5F RDsKLSAgbV90eXBlID0gTlVMTDsKLSAgbV9wcm9wcy5zZXRfdW5kZWZpbmVkICgpOworICBtX3Bv c19uYW4gPSBmYWxzZTsKKyAgbV9uZWdfbmFuID0gZmFsc2U7CisgIGlmIChmbGFnX2NoZWNraW5n KQorICAgIHZlcmlmeV9yYW5nZSAoKTsKK30KKworLy8gU2V0IHRoZSBOQU4gYml0IGFuZCBhZGp1 c3QgdGhlIHJhbmdlLgorCitpbmxpbmUgdm9pZAorZnJhbmdlOjp1cGRhdGVfbmFuICgpCit7Cisg IGdjY19jaGVja2luZ19hc3NlcnQgKCF1bmRlZmluZWRfcCAoKSk7CisgIG1fcG9zX25hbiA9IHRy dWU7CisgIG1fbmVnX25hbiA9IHRydWU7CisgIG5vcm1hbGl6ZV9raW5kICgpOworICBpZiAoZmxh Z19jaGVja2luZykKKyAgICB2ZXJpZnlfcmFuZ2UgKCk7Cit9CisKKy8vIENsZWFyIHRoZSBOQU4g Yml0IGFuZCBhZGp1c3QgdGhlIHJhbmdlLgorCitpbmxpbmUgdm9pZAorZnJhbmdlOjpjbGVhcl9u YW4gKCkKK3sKKyAgZ2NjX2NoZWNraW5nX2Fzc2VydCAoIXVuZGVmaW5lZF9wICgpKTsKKyAgbV9w b3NfbmFuID0gZmFsc2U7CisgIG1fbmVnX25hbiA9IGZhbHNlOworICBub3JtYWxpemVfa2luZCAo KTsKKyAgaWYgKGZsYWdfY2hlY2tpbmcpCisgICAgdmVyaWZ5X3JhbmdlICgpOwogfQogCiAvLyBT ZXQgUiB0byBtYXhpbXVtIHJlcHJlc2VudGFibGUgdmFsdWUgZm9yIFRZUEUuCkBAIC0xMTg2LDE5 ICsxMTM0LDI4IEBAIHJlYWxfbWluX3JlcHJlc2VudGFibGUgKFJFQUxfVkFMVUVfVFlQRSAqciwg dHJlZSB0eXBlKQogICAqciA9IHJlYWxfdmFsdWVfbmVnYXRlIChyKTsKIH0KIAotLy8gQnVpbGQg YSBOQU4gb2YgdHlwZSBUWVBFLgorLy8gQnVpbGQgYSBzaWdubGVzcyBOQU4gb2YgdHlwZSBUWVBF LgogCiBpbmxpbmUgdm9pZAogZnJhbmdlOjpzZXRfbmFuICh0cmVlIHR5cGUpCiB7Ci0gIFJFQUxf VkFMVUVfVFlQRSByOwotICBnY2NfYXNzZXJ0IChyZWFsX25hbiAoJnIsICIiLCAxLCBUWVBFX01P REUgKHR5cGUpKSk7Ci0gIG1fa2luZCA9IFZSX1JBTkdFOworICBtX2tpbmQgPSBWUl9OQU47CiAg IG1fdHlwZSA9IHR5cGU7Ci0gIG1fbWluID0gcjsKLSAgbV9tYXggPSByOwotICBtX3Byb3BzLnNl dF92YXJ5aW5nICgpOwotICBtX3Byb3BzLm5hbl9zZXRfeWVzICgpOworICBtX3Bvc19uYW4gPSB0 cnVlOworICBtX25lZ19uYW4gPSB0cnVlOworICBpZiAoZmxhZ19jaGVja2luZykKKyAgICB2ZXJp ZnlfcmFuZ2UgKCk7Cit9CisKKy8vIEJ1aWxkIGEgTkFOIG9mIHR5cGUgVFlQRSB3aXRoIFNJR04u CisKK2lubGluZSB2b2lkCitmcmFuZ2U6OnNldF9uYW4gKHRyZWUgdHlwZSwgYm9vbCBzaWduKQor eworICBtX2tpbmQgPSBWUl9OQU47CisgIG1fdHlwZSA9IHR5cGU7CisgIG1fbmVnX25hbiA9IHNp Z247CisgIG1fcG9zX25hbiA9ICFzaWduOwogICBpZiAoZmxhZ19jaGVja2luZykKICAgICB2ZXJp ZnlfcmFuZ2UgKCk7CiB9CkBAIC0xMjA2LDIxICsxMTYzLDE5IEBAIGZyYW5nZTo6c2V0X25hbiAo dHJlZSB0eXBlKQogLy8gUmV0dXJuIFRSVUUgaWYgcmFuZ2UgaXMga25vd24gdG8gYmUgZmluaXRl LgogCiBpbmxpbmUgYm9vbAotZnJhbmdlOjprbm93bl9maW5pdGUgKCkgY29uc3QKK2ZyYW5nZTo6 a25vd25faXNmaW5pdGUgKCkgY29uc3QKIHsKICAgaWYgKHVuZGVmaW5lZF9wICgpIHx8IHZhcnlp bmdfcCAoKSB8fCBtX2tpbmQgPT0gVlJfQU5USV9SQU5HRSkKICAgICByZXR1cm4gZmFsc2U7Ci0g IHJldHVybiAoIXJlYWxfaXNuYW4gKCZtX21pbikKLQkgICYmICFyZWFsX2lzaW5mICgmbV9taW4p Ci0JICAmJiAhcmVhbF9pc2luZiAoJm1fbWF4KSk7CisgIHJldHVybiAoIW1heWJlX2lzbmFuICgp ICYmICFyZWFsX2lzaW5mICgmbV9taW4pICYmICFyZWFsX2lzaW5mICgmbV9tYXgpKTsKIH0KIAog Ly8gUmV0dXJuIFRSVUUgaWYgcmFuZ2UgbWF5IGJlIGluZmluaXRlLgogCiBpbmxpbmUgYm9vbAot ZnJhbmdlOjptYXliZV9pbmYgKCkgY29uc3QKK2ZyYW5nZTo6bWF5YmVfaXNpbmYgKCkgY29uc3QK IHsKLSAgaWYgKHVuZGVmaW5lZF9wICgpIHx8IG1fa2luZCA9PSBWUl9BTlRJX1JBTkdFKQorICBp ZiAodW5kZWZpbmVkX3AgKCkgfHwgbV9raW5kID09IFZSX0FOVElfUkFOR0UgfHwgbV9raW5kID09 IFZSX05BTikKICAgICByZXR1cm4gZmFsc2U7CiAgIGlmICh2YXJ5aW5nX3AgKCkpCiAgICAgcmV0 dXJuIHRydWU7CkBAIC0xMjMwLDcgKzExODUsNyBAQCBmcmFuZ2U6Om1heWJlX2luZiAoKSBjb25z dAogLy8gUmV0dXJuIFRSVUUgaWYgcmFuZ2UgaXMga25vd24gdG8gYmUgdGhlIFstSU5GLC1JTkZd IG9yIFsrSU5GLCtJTkZdLgogCiBpbmxpbmUgYm9vbAotZnJhbmdlOjprbm93bl9pbmYgKCkgY29u c3QKK2ZyYW5nZTo6a25vd25faXNpbmYgKCkgY29uc3QKIHsKICAgcmV0dXJuIChtX2tpbmQgPT0g VlJfUkFOR0UKIAkgICYmIHJlYWxfaWRlbnRpY2FsICgmbV9taW4sICZtX21heCkKQEAgLTEyNDAs MzIgKzExOTUsNTAgQEAgZnJhbmdlOjprbm93bl9pbmYgKCkgY29uc3QKIC8vIFJldHVybiBUUlVF IGlmIHJhbmdlIGlzIHBvc3NpYmx5IGEgTkFOLgogCiBpbmxpbmUgYm9vbAotZnJhbmdlOjptYXli ZV9uYW4gKCkgY29uc3QKK2ZyYW5nZTo6bWF5YmVfaXNuYW4gKCkgY29uc3QKIHsKLSAgcmV0dXJu ICFnZXRfbmFuICgpLm5vX3AgKCk7CisgIHJldHVybiBtX3Bvc19uYW4gfHwgbV9uZWdfbmFuOwog fQogCiAvLyBSZXR1cm4gVFJVRSBpZiByYW5nZSBpcyBhICtOQU4gb3IgLU5BTi4KIAogaW5saW5l IGJvb2wKLWZyYW5nZTo6a25vd25fbmFuICgpIGNvbnN0CitmcmFuZ2U6Omtub3duX2lzbmFuICgp IGNvbnN0CiB7Ci0gIHJldHVybiBnZXRfbmFuICgpLnllc19wICgpOworICByZXR1cm4gbV9raW5k ID09IFZSX05BTjsKIH0KIAogLy8gSWYgdGhlIHNpZ25iaXQgZm9yIHRoZSByYW5nZSBpcyBrbm93 biwgc2V0IGl0IGluIFNJR05CSVQgYW5kIHJldHVybgogLy8gVFJVRS4KIAogaW5saW5lIGJvb2wK LWZyYW5nZTo6a25vd25fc2lnbmJpdCAoYm9vbCAmc2lnbmJpdCkgY29uc3QKK2ZyYW5nZTo6c2ln bmJpdF9wIChib29sICZzaWduYml0KSBjb25zdAogewotICAvLyBGSVhNRTogU2lnbmVkIE5BTnMg YXJlIG5vdCBzdXBwb3J0ZWQgeWV0LgotICBpZiAobWF5YmVfbmFuICgpKQorICBpZiAodW5kZWZp bmVkX3AgKCkpCiAgICAgcmV0dXJuIGZhbHNlOwotICBpZiAoZ2V0X3NpZ25iaXQgKCkudmFyeWlu Z19wICgpKQorCisgIC8vIE5BTiB3aXRoIHVua25vd24gc2lnbi4KKyAgaWYgKG1fcG9zX25hbiAm JiBtX25lZ19uYW4pCiAgICAgcmV0dXJuIGZhbHNlOwotICBzaWduYml0ID0gZ2V0X3NpZ25iaXQg KCkueWVzX3AgKCk7Ci0gIHJldHVybiB0cnVlOworICAvLyBObyBOQU4uCisgIGlmICghbV9wb3Nf bmFuICYmICFtX25lZ19uYW4pCisgICAgeworICAgICAgaWYgKG1fbWluLnNpZ24gPT0gbV9tYXgu c2lnbikKKwl7CisJICBzaWduYml0ID0gbV9taW4uc2lnbjsKKwkgIHJldHVybiB0cnVlOworCX0K KyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIC8vIE5BTiB3aXRoIGtub3duIHNpZ24uCisg IGJvb2wgbmFuX3NpZ24gPSBtX25lZ19uYW47CisgIGlmIChrbm93bl9pc25hbiAoKQorICAgICAg fHwgKG5hbl9zaWduID09IG1fbWluLnNpZ24gJiYgbmFuX3NpZ24gPT0gbV9tYXguc2lnbikpCisg ICAgeworICAgICAgc2lnbmJpdCA9IG5hbl9zaWduOworICAgICAgcmV0dXJuIHRydWU7CisgICAg fQorICByZXR1cm4gZmFsc2U7CiB9CiAKICNlbmRpZiAvLyBHQ0NfVkFMVUVfUkFOR0VfSAotLSAK Mi4zNy4xCgo= --000000000000f648d405e8cb4ed8--