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 794D53858432 for ; Mon, 17 Jan 2022 00:12:22 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 794D53858432 Received: from mail-yb1-f198.google.com (mail-yb1-f198.google.com [209.85.219.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-493-riWH-IrGMza42FmhQkbm1w-1; Sun, 16 Jan 2022 19:12:20 -0500 X-MC-Unique: riWH-IrGMza42FmhQkbm1w-1 Received: by mail-yb1-f198.google.com with SMTP id h65-20020a25d044000000b0061209ab8c0eso7835598ybg.4 for ; Sun, 16 Jan 2022 16:12:20 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=h7vEvyW/luxcy0c3BOIQPt5nkgljgpPkdo97X/JyJqI=; b=pltdkDMY3EXJzWdh0VEcoxJBe/N1qFBxBcfdmza2Vh3Cn7YODWu9gWwLxOQVLU+MGy xHnsRQ/HS8oPnvDXU6LnXWSJr0Ow/zDJ99Co2pNLjb7Qstj0eqFrwKa1zuUpKd1p0/u3 rZLFkSQFNzxvsdVh99s1UIbkz9n3hHciox18ZVX61+O/RuUd7UKZIKB/aCytiQ1bEEWo U5y41JtLkGKtdIzLlOAJzmbgK88Y+M9bfldev9JKBYG8zOxuXa6pOeMgQLpocCcMot9Z HQbxsFmqbKWjtPZTBsfv/OvwtP4gpuW9+KJ2fQljSaIL+MnpNNV2BZ1SpIJWyWiVUjAy h1+Q== X-Gm-Message-State: AOAM533vHPYeSNeF6ejzhXbjg086JnJHvFC96CXYAj9Hh8R8GKvInIYN f6oRvfimRnyq/e+lbi2rwBn6ZRtxqhgFH/m+Gp/9HbD2Log8UvC4KPAcaCeYSm9p242uT4V6rl3 FOHFE9SiYLlN19UE6vAALcydMSn0a56A= X-Received: by 2002:a25:4185:: with SMTP id o127mr8450401yba.316.1642378339782; Sun, 16 Jan 2022 16:12:19 -0800 (PST) X-Google-Smtp-Source: ABdhPJw4c9DKaqHqmtpqQ68PCQQRiPXApo8P3L6JbWXXnlITHiQZKp5tIefvPPWaB1PtksG+2jvB69EfgCdlmdPY5FA= X-Received: by 2002:a25:4185:: with SMTP id o127mr8450387yba.316.1642378339586; Sun, 16 Jan 2022 16:12:19 -0800 (PST) MIME-Version: 1.0 References: <20210917175152.606596-1-rodgert@appliantology.com> <20210918040157.608691-1-rodgert@appliantology.com> In-Reply-To: From: Jonathan Wakely Date: Mon, 17 Jan 2022 00:12:07 +0000 Message-ID: Subject: Re: [PATCH] libstdc++: Implement C++20 atomic and atomic To: Thomas Rodgers Cc: gcc Patches , "libstdc++" , Thomas Rodgers , Thomas Rodgers X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="00000000000084dae605d5bc0135" X-Spam-Status: No, score=-12.9 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, HTML_MESSAGE, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-Content-Filtered-By: Mailman/MimeDel 2.1.29 X-BeenThere: libstdc++@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libstdc++ mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 17 Jan 2022 00:12:26 -0000 --00000000000084dae605d5bc0135 Content-Type: text/plain; charset="UTF-8" On Fri, 14 Jan 2022 at 22:40, Jonathan Wakely wrote: > > > On Sat, 18 Sept 2021 at 05:12, Thomas Rodgers > wrote: > >> From: Thomas Rodgers >> >> Let's try this one instead. >> >> Signed-off-by: Thomas Rodgers >> > > If you're doing DCO "Signed-off-by" commits you don't need FSF copyright > notices in the new tests. > > I no longer put any copyright notices in the tests, because it's largely > pointless. They're usually not interesting and don't do anything that > anybody is going to want to steal to incorporate into non-GPL code. Your > new 20_util/shared_ptr/atomic/atomic_shared_ptr.cc is non-trivial, and > maybe interesting, but the two that just check feature test macros are not > worth putting licence headers and copyright notices on. > > > >> libstdc++-v3/ChangeLog: >> * acinclude.m4: Update ABI version. >> * config/abi/pre/gnu.ver (GLIBCXX_3.4.21): Do not match new >> _Sp_locker >> constructor. >> (GLIBCXX_3.4.30): Export _Sp_locker::_M_wait/_M_notify and new >> constructor. >> * include/bits/shared_ptr_atomic.h: define >> __cpp_lib_atomic_shared_ptr >> feature test macro. >> (_Sp_locker::_Sp_locker(const void*, bool): New constructor. >> (_Sp_locker::_M_wait()), _Sp_locker::_M_notify()): New methods. >> (_Sp_impl): New type. >> (atomic>): New partial template specialization. >> (atomic>): New partial template specialization. >> * include/std/version: define __cpp_lib_atomic_shared_ptr feature >> test macro. >> * doc/xml/manual/abi.xml: New ABI version. >> * src/c++11/Makefile.am: Compile src/c++11/shared_ptr.cc >> -std=gnu++20. >> * src/c++11/Makefile.in: Regenerate. >> * src/c++11/shared_ptr.cc (_Sp_locker::_Sp_locker(const void*, >> bool), >> _Sp_locker::_M_wait(), _Sp_locker::_M_notify(): Implement. >> * testsuite/20_util/shared_ptr/atomic/4.cc: New test. >> * testsuite/20_util/shared_ptr/atomic/5.cc: Likewise. >> * testsuite/20_util/shared_ptr/atomic/atomic_shared_ptr.cc: >> Likewise. >> * testuite/util/testsuite_abi.cc: New ABI version. >> --- >> libstdc++-v3/acinclude.m4 | 2 +- >> libstdc++-v3/config/abi/pre/gnu.ver | 12 +- >> libstdc++-v3/configure | 2 +- >> libstdc++-v3/doc/xml/manual/abi.xml | 1 + >> libstdc++-v3/include/bits/shared_ptr_atomic.h | 309 ++++++++++++++++++ >> libstdc++-v3/include/std/version | 1 + >> libstdc++-v3/src/c++11/Makefile.am | 6 + >> libstdc++-v3/src/c++11/Makefile.in | 6 + >> libstdc++-v3/src/c++11/shared_ptr.cc | 86 ++++- >> .../testsuite/20_util/shared_ptr/atomic/4.cc | 28 ++ >> .../testsuite/20_util/shared_ptr/atomic/5.cc | 28 ++ >> .../shared_ptr/atomic/atomic_shared_ptr.cc | 159 +++++++++ >> libstdc++-v3/testsuite/util/testsuite_abi.cc | 3 +- >> 13 files changed, 637 insertions(+), 6 deletions(-) >> create mode 100644 libstdc++-v3/testsuite/20_util/shared_ptr/atomic/4.cc >> create mode 100644 libstdc++-v3/testsuite/20_util/shared_ptr/atomic/5.cc >> create mode 100644 >> libstdc++-v3/testsuite/20_util/shared_ptr/atomic/atomic_shared_ptr.cc >> >> > [...] > > >> + void >> + store(value_type __r, memory_order __o = memory_order_seq_cst) >> noexcept >> + { _M_impl._M_store(move(__r), __o); } >> > > Every move(x) needs to be qualified as std::move(x) to avoid ADL. > > > >> >> + >> +// { dg-options "-std=gnu++2a" } >> +// { dg-do run { target c++2a } } >> > > gnu++20 and c++20 has been OK for a while, there's no need to use the 2a > forms. > > Other than that, the patch looks OK, but I have a modified version based > on your patch just using atomic ops, no mutexes, which I'll post shortly. > Here's the finished version of that patch, which is all inline in the header, and performs faster too. Tested powerpc64le-linux and x86_64-linux. Pushed to trunk. --00000000000084dae605d5bc0135 Content-Type: text/plain; charset="US-ASCII"; name="patch.txt" Content-Disposition: attachment; filename="patch.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_kyhxnd280 Y29tbWl0IDJhYzA2NDlkN2JmM2VhY2JmOTJhZGQxZWMyYjU0MDQ1YzQwMWE0YzIKQXV0aG9yOiBK b25hdGhhbiBXYWtlbHkgPGp3YWtlbHlAcmVkaGF0LmNvbT4KRGF0ZTogICBTdW4gSmFuIDE2IDIw OjQ3OjA5IDIwMjIKCiAgICBsaWJzdGRjKys6IEltcGxlbWVudCBDKysyMCBhdG9taWM8c2hhcmVk X3B0cj4gYW5kIGF0b21pYzx3ZWFrX3B0cj4KICAgIAogICAgVGhpcyBhZGRzIGFub3RoZXIgcGll Y2Ugb2YgQysrMjAsIHRoZSBzdGQ6OmF0b21pYyBzcGVjaWFsaXphdGlvbnMgZm9yCiAgICBzdGQ6 OnNoYXJlZF9wdHIgYW5kIHN0ZDo6d2Vha19wdHIuCiAgICAKICAgIFRoZSBuZXcgX1NwX2F0b21p YyB0eXBlIG1pbWljcyB0aGUgc3RydWN0dXJlIG9mIHNoYXJlZF9wdHI8VD4gYW5kCiAgICB3ZWFr X3B0cjxUPiwgaG9sZGluZyBhIFQqIHBvaW50ZXIgKHRoZSBvbmUgcmV0dXJuZWQgYnkgZ2V0KCkg b24gYQogICAgc2hhcmVkX3B0ci93ZWFrIHB0cikgYW5kIGEgX1NwX2NvdW50ZWRfYmFzZTw+KiBw b2ludGVyIHRvIHRoZQogICAgcmVmLWNvdW50ZWQgY29udHJvbCBibG9jay4gRm9yIF9TcF9hdG9t aWMgdGhlIGxvdyBiaXQgb2YgdGhlIGNvbnRyb2wKICAgIGJsb2NrIHBvaW50ZXIgaXMgdXNlZCBh cyBhIGxvY2sgYml0LCB0byBlbnN1cmUgb25seSBvbmUgdGhyZWFkIHdpbGwKICAgIGFjY2VzcyB0 aGUgb2JqZWN0IGF0IGEgdGltZS4gIFRoZSBwb2ludGVyIGlzIGFjdHVhbGx5IHN0b3JlZCBhcyBh CiAgICB1aW50cHRyX3QgdG8gYXZvaWQgYWNjaWRlbnRhbCBkZXJlZmVyZW5jZXMgb2YgdGhlIHBv aW50ZXIgd2hlbiB1bmxvY2tlZAogICAgKHdoaWNoIHdvdWxkIGJlIGEgcmFjZSkgb3Igd2hlbiBs b2NrZWQgKHdoaWNoIHdvdWxkIGRlcmVmZXJlbmNlIHRoZQogICAgd3JvbmcgcG9pbnRlciB2YWx1 ZSBkdWUgdG8gdGhlIGxvdyBiaXQgYmVpbmcgc2V0KS4gVG8gZ2V0IGEgcmF3IHBvaW50ZXIKICAg IHRvIHRoZSBjb250cm9sIGJsb2NrLCB0aGUgbG9jayBtdXN0IGJlIGFjcXVpcmVkLiBDb252ZXJ0 aW5nIGJldHdlZW4gYQogICAgX1NwX2F0b21pYyBhbmQgYSBzaGFyZWRfcHRyIG9yIHdlYWtfcHRy IHJlcXVpcmVzIG1hbnVhbGx5IGFkanVzdGluZyB0aGUKICAgIFQqIGFuZCBfU3BfY291bnRlZF9i YXNlPD4qIG1lbWJlcnMgb2YgdGhlIHNoYXJlZC93ZWFrIHB0ciwgaW5zdGVhZCBvZgogICAgZ29p bmcgdGhyb3VnaCB0aGUgcHVibGljIEFQSS4gVGhpcyBtdXN0IGJlIGRvbmUgY2FyZWZ1bGx5IHRv IGVuc3VyZSB0aGF0CiAgICBhbnkgY2hhbmdlIGluIHRoZSBudW1iZXIgb2Ygb3duZXJzIGlzIHJl ZmxlY3RlZCBpbiBhIHJlZi1jb3VudCB1cGRhdGUuCiAgICAKICAgIENvLWF1dGhvcmVkLWJ5OiBU aG9tYXMgUm9kZ2VycyA8dHJvZGdlcnNAcmVkaGF0LmNvbT4KICAgIFNpZ25lZC1vZmYtYnk6IFRo b21hcyBSb2RnZXJzIDx0cm9kZ2Vyc0ByZWRoYXQuY29tPgogICAgCiAgICBsaWJzdGRjKystdjMv Q2hhbmdlTG9nOgogICAgCiAgICAgICAgICAgICogaW5jbHVkZS9iaXRzL3NoYXJlZF9wdHJfYXRv bWljLmggKF9fY3BwX2xpYl9hdG9taWNfc2hhcmVkX3B0cik6CiAgICAgICAgICAgIE5ldyBtYWNy by4KICAgICAgICAgICAgKF9TcF9hdG9taWMpOiBOZXcgY2xhc3MgdGVtcGxhdGUuCiAgICAgICAg ICAgIChhdG9taWM8c2hhcmVkX3B0cjxUPj4sIGF0b21pYzx3ZWFrX3B0cjxUPj4pOiBOZXcgcGFy dGlhbAogICAgICAgICAgICBzcGVjaWFsaXphdGlvbnMuCiAgICAgICAgICAgICogaW5jbHVkZS9i aXRzL3NoYXJlZF9wdHJfYmFzZS5oIChfX3NoYXJlZF9jb3VudCwgX193ZWFrX2NvdW50KQogICAg ICAgICAgICAoX19zaGFyZWRfcHRyLCBfX3dlYWtfcHRyKTogRGVjbGFyZSBfU3BfYXRvbWljIGFz IGEgZnJpZW5kLgogICAgICAgICAgICAqIGluY2x1ZGUvc3RkL3ZlcnNpb24gKF9fY3BwX2xpYl9h dG9taWNfc2hhcmVkX3B0cik6IE5ldyBtYWNyby4KICAgICAgICAgICAgKiB0ZXN0c3VpdGUvMjBf dXRpbC9zaGFyZWRfcHRyL2F0b21pYy9hdG9taWNfc2hhcmVkX3B0ci5jYzogTmV3CiAgICAgICAg ICAgIHRlc3QuCiAgICAgICAgICAgICogdGVzdHN1aXRlLzIwX3V0aWwvd2Vha19wdHIvYXRvbWlj X3dlYWtfcHRyLmNjOiBOZXcgdGVzdC4KCmRpZmYgLS1naXQgYS9saWJzdGRjKystdjMvaW5jbHVk ZS9iaXRzL3NoYXJlZF9wdHJfYXRvbWljLmggYi9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL3No YXJlZF9wdHJfYXRvbWljLmgKaW5kZXggMGUxYzI4OWMwYTkuLjkwMDQ5OWJhZTMyIDEwMDY0NAot LS0gYS9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL3NoYXJlZF9wdHJfYXRvbWljLmgKKysrIGIv bGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy9zaGFyZWRfcHRyX2F0b21pYy5oCkBAIC0zMjcsNiAr MzI3LDQ2MSBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogICAgIH0KICAgLy8v IEB9CiAKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDIwMDJMCisjIGRlZmluZSBfX2NwcF9saWJfYXRv bWljX3NoYXJlZF9wdHIgMjAxNzExTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xh c3MgYXRvbWljOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICBzdGF0aWMgY29uc3Rl eHByIGJvb2wgX19pc19zaGFyZWRfcHRyID0gZmFsc2U7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9V cD4KKyAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgX19pc19zaGFyZWRfcHRyPHNoYXJlZF9wdHI8 X1VwPj4gPSB0cnVlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBfU3Bf YXRvbWljCisgICAgeworICAgICAgdXNpbmcgdmFsdWVfdHlwZSA9IF9UcDsKKworICAgICAgZnJp ZW5kIGNsYXNzIGF0b21pYzxfVHA+OworCisgICAgICAvLyBBbiBhdG9taWMgdmVyc2lvbiBvZiBf X3NoYXJlZF9jb3VudDw+IGFuZCBfX3dlYWtfY291bnQ8Pi4KKyAgICAgIC8vIFN0b3JlcyBhIF9T cF9jb3VudGVkX2Jhc2U8PiogYnV0IHVzZXMgdGhlIExTQiBhcyBhIGxvY2suCisgICAgICBzdHJ1 Y3QgX0F0b21pY19jb3VudAorICAgICAgeworCS8vIEVpdGhlciBfX3NoYXJlZF9jb3VudDw+IG9y IF9fd2Vha19jb3VudDw+CisJdXNpbmcgX19jb3VudF90eXBlID0gZGVjbHR5cGUoX1RwOjpfTV9y ZWZjb3VudCk7CisKKwkvLyBfU3BfY291bnRlZF9iYXNlPD4qCisJdXNpbmcgcG9pbnRlciA9IGRl Y2x0eXBlKF9fY291bnRfdHlwZTo6X01fcGkpOworCisJLy8gRW5zdXJlIHdlIGNhbiB1c2UgdGhl IExTQiBhcyB0aGUgbG9jayBiaXQuCisJc3RhdGljX2Fzc2VydChhbGlnbm9mKHJlbW92ZV9wb2lu dGVyX3Q8cG9pbnRlcj4pID4gMSk7CisKKwlfQXRvbWljX2NvdW50KCkgOiBfTV92YWwoMCkgeyB9 CisKKwlleHBsaWNpdAorCV9BdG9taWNfY291bnQoX19jb3VudF90eXBlJiYgX19jKSBub2V4Y2Vw dAorCTogX01fdmFsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihfX2MuX01fcGkpKQorCXsK KwkgIF9fYy5fTV9waSA9IG51bGxwdHI7CisJfQorCisJfl9BdG9taWNfY291bnQoKQorCXsKKwkg IGF1dG8gX192YWwgPSBfTV92YWwubG9hZChtZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisJICBfX2ds aWJjeHhfYXNzZXJ0KCEoX192YWwgJiBfU19sb2NrX2JpdCkpOworCSAgaWYgKGF1dG8gX19waSA9 IHJlaW50ZXJwcmV0X2Nhc3Q8cG9pbnRlcj4oX192YWwpKQorCSAgICB7CisJICAgICAgaWYgY29u c3RleHByIChfX2lzX3NoYXJlZF9wdHI8X1RwPikKKwkJX19waS0+X01fcmVsZWFzZSgpOworCSAg ICAgIGVsc2UKKwkJX19waS0+X01fd2Vha19yZWxlYXNlKCk7CisJICAgIH0KKwl9CisKKwlfQXRv bWljX2NvdW50KGNvbnN0IF9BdG9taWNfY291bnQmKSA9IGRlbGV0ZTsKKwlfQXRvbWljX2NvdW50 JiBvcGVyYXRvcj0oY29uc3QgX0F0b21pY19jb3VudCYpID0gZGVsZXRlOworCisJLy8gUHJlY29u ZGl0aW9uOiBDYWxsZXIgZG9lcyBub3QgaG9sZCBsb2NrIQorCS8vIFJldHVybnMgdGhlIHJhdyBw b2ludGVyIHZhbHVlIHdpdGhvdXQgdGhlIGxvY2sgYml0IHNldC4KKwlwb2ludGVyCisJbG9jayht ZW1vcnlfb3JkZXIgX19vKSBjb25zdCBub2V4Y2VwdAorCXsKKwkgIC8vIFRvIGFjcXVpcmUgdGhl IGxvY2sgd2UgZmxpcCB0aGUgTFNCIGZyb20gMCB0byAxLgorCisJICBhdXRvIF9fY3VycmVudCA9 IF9NX3ZhbC5sb2FkKG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKwkgIHdoaWxlIChfX2N1cnJlbnQg JiBfU19sb2NrX2JpdCkKKwkgICAgeworCSAgICAgIF9fZGV0YWlsOjpfX3RocmVhZF9yZWxheCgp OworCSAgICAgIF9fY3VycmVudCA9IF9NX3ZhbC5sb2FkKG1lbW9yeV9vcmRlcl9yZWxheGVkKTsK KwkgICAgfQorCisJICB3aGlsZSAoIV9NX3ZhbC5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX2N1 cnJlbnQsCisJCQkJCQkgX19jdXJyZW50IHwgX1NfbG9ja19iaXQsCisJCQkJCQkgX19vLAorCQkJ CQkJIG1lbW9yeV9vcmRlcl9yZWxheGVkKSkKKwkgICAgeworCSAgICAgIF9fZGV0YWlsOjpfX3Ro cmVhZF9yZWxheCgpOworCSAgICAgIF9fY3VycmVudCA9IF9fY3VycmVudCAmIH5fU19sb2NrX2Jp dDsKKwkgICAgfQorCSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8cG9pbnRlcj4oX19jdXJyZW50 KTsKKwl9CisKKwkvLyBQcmVjb25kaXRpb246IGNhbGxlciBob2xkcyBsb2NrIQorCXZvaWQKKwl1 bmxvY2sobWVtb3J5X29yZGVyIF9fbykgY29uc3Qgbm9leGNlcHQKKwl7CisJICBfTV92YWwuZmV0 Y2hfc3ViKDEsIF9fbyk7CisJfQorCisJLy8gU3dhcHMgdGhlIHZhbHVlcyBvZiAqdGhpcyBhbmQg X19jLCBhbmQgdW5sb2NrcyAqdGhpcy4KKwkvLyBQcmVjb25kaXRpb246IGNhbGxlciBob2xkcyBs b2NrIQorCXZvaWQKKwlfTV9zd2FwX3VubG9jayhfX2NvdW50X3R5cGUmIF9fYywgbWVtb3J5X29y ZGVyIF9fbykgbm9leGNlcHQKKwl7CisJICBpZiAoX19vICE9IG1lbW9yeV9vcmRlcl9zZXFfY3N0 KQorCSAgICBfX28gPSBtZW1vcnlfb3JkZXJfcmVsZWFzZTsKKwkgIGF1dG8gX194ID0gcmVpbnRl cnByZXRfY2FzdDx1aW50cHRyX3Q+KF9fYy5fTV9waSk7CisJICBfX3ggPSBfTV92YWwuZXhjaGFu Z2UoX194LCBfX28pOworCSAgX19jLl9NX3BpID0gcmVpbnRlcnByZXRfY2FzdDxwb2ludGVyPihf X3ggJiB+X1NfbG9ja19iaXQpOworCX0KKworI2lmIF9fY3BwX2xpYl9hdG9taWNfd2FpdAorCS8v IFByZWNvbmRpdGlvbjogY2FsbGVyIGhvbGRzIGxvY2shCisJdm9pZAorCV9NX3dhaXRfdW5sb2Nr KG1lbW9yeV9vcmRlciBfX28pIGNvbnN0IG5vZXhjZXB0CisJeworCSAgYXV0byBfX3YgPSBfTV92 YWwuZmV0Y2hfc3ViKDEsIG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKwkgIF9NX3ZhbC53YWl0KF9f diAmIH5fU19sb2NrX2JpdCwgX19vKTsKKwl9CisKKwl2b2lkCisJbm90aWZ5X29uZSgpIG5vZXhj ZXB0CisJeworCSAgX01fdmFsLm5vdGlmeV9vbmUoKTsKKwl9CisKKwl2b2lkCisJbm90aWZ5X2Fs bCgpIG5vZXhjZXB0CisJeworCSAgX01fdmFsLm5vdGlmeV9hbGwoKTsKKwl9CisjZW5kaWYKKwor ICAgICAgcHJpdmF0ZToKKwltdXRhYmxlIF9fYXRvbWljX2Jhc2U8dWludHB0cl90PiBfTV92YWx7 MH07CisJc3RhdGljIGNvbnN0ZXhwciB1aW50cHRyX3QgX1NfbG9ja19iaXR7MX07CisgICAgICB9 OworCisgICAgICB0eXBlbmFtZSBfVHA6OmVsZW1lbnRfdHlwZSogX01fcHRyOworICAgICAgX0F0 b21pY19jb3VudCBfTV9yZWZjb3VudDsKKworICAgICAgc3RhdGljIF9BdG9taWNfY291bnQ6OnBv aW50ZXIKKyAgICAgIF9TX2FkZF9yZWYoX0F0b21pY19jb3VudDo6cG9pbnRlciBfX3ApCisgICAg ICB7CisJaWYgKF9fcCkKKwkgIHsKKwkgICAgaWYgY29uc3RleHByIChfX2lzX3NoYXJlZF9wdHI8 X1RwPikKKwkgICAgICBfX3AtPl9NX2FkZF9yZWZfY29weSgpOworCSAgICBlbHNlCisJICAgICAg X19wLT5fTV93ZWFrX2FkZF9yZWYoKTsKKwkgIH0KKwlyZXR1cm4gX19wOworICAgICAgfQorCisg ICAgICBjb25zdGV4cHIgX1NwX2F0b21pYygpIG5vZXhjZXB0ID0gZGVmYXVsdDsKKworICAgICAg ZXhwbGljaXQKKyAgICAgIF9TcF9hdG9taWModmFsdWVfdHlwZSBfX3IpIG5vZXhjZXB0CisgICAg ICA6IF9NX3B0cihfX3IuX01fcHRyKSwgX01fcmVmY291bnQoc3RkOjptb3ZlKF9fci5fTV9yZWZj b3VudCkpCisgICAgICB7IH0KKworICAgICAgfl9TcF9hdG9taWMoKSA9IGRlZmF1bHQ7CisKKyAg ICAgIF9TcF9hdG9taWMoY29uc3QgX1NwX2F0b21pYyYpID0gZGVsZXRlOworICAgICAgdm9pZCBv cGVyYXRvcj0oY29uc3QgX1NwX2F0b21pYyYpID0gZGVsZXRlOworCisgICAgICB2YWx1ZV90eXBl CisgICAgICBsb2FkKG1lbW9yeV9vcmRlciBfX28pIGNvbnN0IG5vZXhjZXB0CisgICAgICB7CisJ X19nbGliY3h4X2Fzc2VydChfX28gIT0gbWVtb3J5X29yZGVyX3JlbGVhc2UKKwkJCSAgICYmIF9f byAhPSBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisJLy8gRW5zdXJlIHRoYXQgdGhlIGNvcnJlY3Qg dmFsdWUgb2YgX01fcHRyIGlzIHZpc2libGUgYWZ0ZXIgbG9ja2luZy4sCisJLy8gYnkgdXBncmFk aW5nIHJlbGF4ZWQgb3IgY29uc3VtZSB0byBhY3F1aXJlLgorCWlmIChfX28gIT0gbWVtb3J5X29y ZGVyX3NlcV9jc3QpCisJICBfX28gPSBtZW1vcnlfb3JkZXJfYWNxdWlyZTsKKworCXZhbHVlX3R5 cGUgX19yZXQ7CisJYXV0byBfX3BpID0gX01fcmVmY291bnQubG9jayhfX28pOworCV9fcmV0Ll9N X3B0ciA9IF9NX3B0cjsKKwlfX3JldC5fTV9yZWZjb3VudC5fTV9waSA9IF9TX2FkZF9yZWYoX19w aSk7CisJX01fcmVmY291bnQudW5sb2NrKG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKwlyZXR1cm4g X19yZXQ7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAodmFsdWVfdHlwZSYgX19y LCBtZW1vcnlfb3JkZXIgX19vKSBub2V4Y2VwdAorICAgICAgeworCV9NX3JlZmNvdW50LmxvY2so bWVtb3J5X29yZGVyX2FjcXVpcmUpOworCXN0ZDo6c3dhcChfTV9wdHIsIF9fci5fTV9wdHIpOwor CV9NX3JlZmNvdW50Ll9NX3N3YXBfdW5sb2NrKF9fci5fTV9yZWZjb3VudCwgX19vKTsKKyAgICAg IH0KKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV9zdHJvbmcodmFsdWVfdHlw ZSYgX19leHBlY3RlZCwgdmFsdWVfdHlwZSBfX2Rlc2lyZWQsCisJCQkgICAgICBtZW1vcnlfb3Jk ZXIgX19vLCBtZW1vcnlfb3JkZXIgX19vMikgbm9leGNlcHQKKyAgICAgIHsKKwlib29sIF9fcmVz dWx0ID0gdHJ1ZTsKKwlhdXRvIF9fcGkgPSBfTV9yZWZjb3VudC5sb2NrKG1lbW9yeV9vcmRlcl9h Y3F1aXJlKTsKKwlpZiAoX01fcHRyID09IF9fZXhwZWN0ZWQuX01fcHRyCisJICAgICAgJiYgX19w aSA9PSBfX2V4cGVjdGVkLl9NX3JlZmNvdW50Ll9NX3BpKQorCSAgeworCSAgICBfTV9wdHIgPSBf X2Rlc2lyZWQuX01fcHRyOworCSAgICBfTV9yZWZjb3VudC5fTV9zd2FwX3VubG9jayhfX2Rlc2ly ZWQuX01fcmVmY291bnQsIF9fbyk7CisJICB9CisJZWxzZQorCSAgeworCSAgICBfVHAgX19zaW5r ID0gc3RkOjptb3ZlKF9fZXhwZWN0ZWQpOworCSAgICBfX2V4cGVjdGVkLl9NX3B0ciA9IF9NX3B0 cjsKKwkgICAgX19leHBlY3RlZC5fTV9yZWZjb3VudC5fTV9waSA9IF9TX2FkZF9yZWYoX19waSk7 CisJICAgIF9NX3JlZmNvdW50LnVubG9jayhfX28yKTsKKwkgICAgX19yZXN1bHQgPSBmYWxzZTsK KwkgIH0KKwlyZXR1cm4gX19yZXN1bHQ7CisgICAgICB9CisKKyNpZiBfX2NwcF9saWJfYXRvbWlj X3dhaXQKKyAgICAgIHZvaWQKKyAgICAgIHdhaXQodmFsdWVfdHlwZSBfX29sZCwgbWVtb3J5X29y ZGVyIF9fbykgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsKKwlhdXRvIF9fcGkgPSBfTV9yZWZjb3Vu dC5sb2NrKG1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKwlpZiAoX01fcHRyID09IF9fb2xkLl9NX3B0 ciAmJiBfX3BpID09IF9fb2xkLl9NX3JlZmNvdW50Ll9NX3BpKQorCSAgX01fcmVmY291bnQuX01f d2FpdF91bmxvY2soX19vKTsKKwllbHNlCisJICBfTV9yZWZjb3VudC51bmxvY2sobWVtb3J5X29y ZGVyX3JlbGF4ZWQpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBub3RpZnlfb25lKCkg bm9leGNlcHQKKyAgICAgIHsKKwlfTV9yZWZjb3VudC5ub3RpZnlfb25lKCk7CisgICAgICB9CisK KyAgICAgIHZvaWQKKyAgICAgIG5vdGlmeV9hbGwoKSBub2V4Y2VwdAorICAgICAgeworCV9NX3Jl ZmNvdW50Lm5vdGlmeV9hbGwoKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH07CisKKyAgdGVtcGxh dGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIGF0b21pYzxzaGFyZWRfcHRyPF9UcD4+CisgICAg eworICAgIHB1YmxpYzoKKyAgICAgIHVzaW5nIHZhbHVlX3R5cGUgPSBzaGFyZWRfcHRyPF9UcD47 CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBpc19hbHdheXNfbG9ja19mcmVlID0gZmFs c2U7CisKKyAgICAgIGJvb2wKKyAgICAgIGlzX2xvY2tfZnJlZSgpIGNvbnN0IG5vZXhjZXB0Cisg ICAgICB7IHJldHVybiBmYWxzZTsgfQorCisgICAgICBjb25zdGV4cHIgYXRvbWljKCkgbm9leGNl cHQgPSBkZWZhdWx0OworCisgICAgICBhdG9taWMoc2hhcmVkX3B0cjxfVHA+IF9fcikgbm9leGNl cHQKKyAgICAgIDogX01faW1wbChzdGQ6Om1vdmUoX19yKSkKKyAgICAgIHsgfQorCisgICAgICBh dG9taWMoY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICB2b2lkIG9wZXJhdG9yPShjb25z dCBhdG9taWMmKSA9IGRlbGV0ZTsKKworICAgICAgc2hhcmVkX3B0cjxfVHA+CisgICAgICBsb2Fk KG1lbW9yeV9vcmRlciBfX28gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgY29uc3Qgbm9leGNlcHQK KyAgICAgIHsgcmV0dXJuIF9NX2ltcGwubG9hZChfX28pOyB9CisKKyAgICAgIG9wZXJhdG9yIHNo YXJlZF9wdHI8X1RwPigpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfTV9pbXBsLmxv YWQobWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN0b3JlKHNo YXJlZF9wdHI8X1RwPiBfX2Rlc2lyZWQsCisJICAgIG1lbW9yeV9vcmRlciBfX28gPSBtZW1vcnlf b3JkZXJfc2VxX2NzdCkgbm9leGNlcHQKKyAgICAgIHsgX01faW1wbC5zd2FwKF9fZGVzaXJlZCwg X19vKTsgfQorCisgICAgICB2b2lkCisgICAgICBvcGVyYXRvcj0oc2hhcmVkX3B0cjxfVHA+IF9f ZGVzaXJlZCkgbm9leGNlcHQKKyAgICAgIHsgX01faW1wbC5zd2FwKF9fZGVzaXJlZCwgbWVtb3J5 X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgICAgIHNoYXJlZF9wdHI8X1RwPgorICAgICAgZXhjaGFu Z2Uoc2hhcmVkX3B0cjxfVHA+IF9fZGVzaXJlZCwKKwkgICAgICAgbWVtb3J5X29yZGVyIF9fbyA9 IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBub2V4Y2VwdAorICAgICAgeworCV9NX2ltcGwuc3dhcChf X2Rlc2lyZWQsIF9fbyk7CisJcmV0dXJuIF9fZGVzaXJlZDsKKyAgICAgIH0KKworICAgICAgYm9v bAorICAgICAgY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoc2hhcmVkX3B0cjxfVHA+JiBfX2V4cGVj dGVkLAorCQkJICAgICAgc2hhcmVkX3B0cjxfVHA+IF9fZGVzaXJlZCwKKwkJCSAgICAgIG1lbW9y eV9vcmRlciBfX28sIG1lbW9yeV9vcmRlciBfX28yKSBub2V4Y2VwdAorICAgICAgeworCXJldHVy biBfTV9pbXBsLmNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9fZXhwZWN0ZWQsIF9fZGVzaXJlZCwg X19vLCBfX28yKTsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5n ZV9zdHJvbmcodmFsdWVfdHlwZSYgX19leHBlY3RlZCwgdmFsdWVfdHlwZSBfX2Rlc2lyZWQsCisJ CQkgICAgICBtZW1vcnlfb3JkZXIgX19vID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIG5vZXhjZXB0 CisgICAgICB7CisJbWVtb3J5X29yZGVyIF9fbzI7CisJc3dpdGNoIChfX28pCisJeworCWNhc2Ug bWVtb3J5X29yZGVyX2FjcV9yZWw6CisJICBfX28yID0gbWVtb3J5X29yZGVyX2FjcXVpcmU7CisJ ICBicmVhazsKKwljYXNlIG1lbW9yeV9vcmRlcl9yZWxlYXNlOgorCSAgX19vMiA9IG1lbW9yeV9v cmRlcl9yZWxheGVkOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIF9fbzIgPSBfX287CisJfQor CXJldHVybiBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX2V4cGVjdGVkLCBzdGQ6Om1vdmUoX19k ZXNpcmVkKSwKKwkJCQkgICAgICAgX19vLCBfX28yKTsKKyAgICAgIH0KKworICAgICAgYm9vbAor ICAgICAgY29tcGFyZV9leGNoYW5nZV93ZWFrKHZhbHVlX3R5cGUmIF9fZXhwZWN0ZWQsIHZhbHVl X3R5cGUgX19kZXNpcmVkLAorCQkJICAgIG1lbW9yeV9vcmRlciBfX28sIG1lbW9yeV9vcmRlciBf X28yKSBub2V4Y2VwdAorICAgICAgeworCXJldHVybiBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhf X2V4cGVjdGVkLCBzdGQ6Om1vdmUoX19kZXNpcmVkKSwKKwkJCQkgICAgICAgX19vLCBfX28yKTsK KyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV93ZWFrKHZhbHVl X3R5cGUmIF9fZXhwZWN0ZWQsIHZhbHVlX3R5cGUgX19kZXNpcmVkLAorCQkJICAgIG1lbW9yeV9v cmRlciBfX28gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQKKyAgICAgIHsKKwlyZXR1 cm4gY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19leHBlY3RlZCwgc3RkOjptb3ZlKF9fZGVzaXJl ZCksIF9fbyk7CisgICAgICB9CisKKyNpZiBfX2NwcF9saWJfYXRvbWljX3dhaXQKKyAgICAgIHZv aWQKKyAgICAgIHdhaXQodmFsdWVfdHlwZSBfX29sZCwKKwkgICBtZW1vcnlfb3JkZXIgX19vID0g bWVtb3J5X29yZGVyX3NlcV9jc3QpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7CisJX01faW1wbC53 YWl0KHN0ZDo6bW92ZShfX29sZCksIF9fbyk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAg IG5vdGlmeV9vbmUoKSBub2V4Y2VwdAorICAgICAgeworCV9NX2ltcGwubm90aWZ5X29uZSgpOwor ICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBub3RpZnlfYWxsKCkgbm9leGNlcHQKKyAgICAg IHsKKwlfTV9pbXBsLm5vdGlmeV9hbGwoKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgcHJpdmF0 ZToKKyAgICAgIF9TcF9hdG9taWM8c2hhcmVkX3B0cjxfVHA+PiBfTV9pbXBsOworICAgIH07CisK KyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIGF0b21pYzx3ZWFrX3B0cjxfVHA+ PgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB1c2luZyB2YWx1ZV90eXBlID0gd2Vha19wdHI8 X1RwPjsKKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGlzX2Fsd2F5c19sb2NrX2ZyZWUg PSBmYWxzZTsKKworICAgICAgYm9vbAorICAgICAgaXNfbG9ja19mcmVlKCkgY29uc3Qgbm9leGNl cHQKKyAgICAgIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAgIGNvbnN0ZXhwciBhdG9taWMoKSBu b2V4Y2VwdCA9IGRlZmF1bHQ7CisKKyAgICAgIGF0b21pYyh3ZWFrX3B0cjxfVHA+IF9fcikgbm9l eGNlcHQKKyAgICAgOiBfTV9pbXBsKG1vdmUoX19yKSkKKyAgICAgIHsgfQorCisgICAgICBhdG9t aWMoY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBh dG9taWMmKSA9IGRlbGV0ZTsKKworICAgICAgd2Vha19wdHI8X1RwPgorICAgICAgbG9hZChtZW1v cnlfb3JkZXIgX19vID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIGNvbnN0IG5vZXhjZXB0CisgICAg ICB7IHJldHVybiBfTV9pbXBsLmxvYWQoX19vKTsgfQorCisgICAgICBvcGVyYXRvciB3ZWFrX3B0 cjxfVHA+KCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIF9NX2ltcGwubG9hZChtZW1v cnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICAgICAgdm9pZAorICAgICAgc3RvcmUod2Vha19wdHI8 X1RwPiBfX2Rlc2lyZWQsCisJICAgIG1lbW9yeV9vcmRlciBfX28gPSBtZW1vcnlfb3JkZXJfc2Vx X2NzdCkgbm9leGNlcHQKKyAgICAgIHsgX01faW1wbC5zd2FwKF9fZGVzaXJlZCwgX19vKTsgfQor CisgICAgICB2b2lkCisgICAgICBvcGVyYXRvcj0od2Vha19wdHI8X1RwPiBfX2Rlc2lyZWQpIG5v ZXhjZXB0CisgICAgICB7IF9NX2ltcGwuc3dhcChfX2Rlc2lyZWQsIG1lbW9yeV9vcmRlcl9zZXFf Y3N0KTsgfQorCisgICAgICB3ZWFrX3B0cjxfVHA+CisgICAgICBleGNoYW5nZSh3ZWFrX3B0cjxf VHA+IF9fZGVzaXJlZCwKKwkgICAgICAgbWVtb3J5X29yZGVyIF9fbyA9IG1lbW9yeV9vcmRlcl9z ZXFfY3N0KSBub2V4Y2VwdAorICAgICAgeworCV9NX2ltcGwuc3dhcChfX2Rlc2lyZWQsIF9fbyk7 CisJcmV0dXJuIF9fZGVzaXJlZDsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgY29tcGFy ZV9leGNoYW5nZV9zdHJvbmcod2Vha19wdHI8X1RwPiYgX19leHBlY3RlZCwKKwkJCSAgICAgIHdl YWtfcHRyPF9UcD4gX19kZXNpcmVkLAorCQkJICAgICAgbWVtb3J5X29yZGVyIF9fbywgbWVtb3J5 X29yZGVyIF9fbzIpIG5vZXhjZXB0CisgICAgICB7CisJcmV0dXJuIF9NX2ltcGwuY29tcGFyZV9l eGNoYW5nZV9zdHJvbmcoX19leHBlY3RlZCwgX19kZXNpcmVkLCBfX28sIF9fbzIpOworICAgICAg fQorCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyh2YWx1ZV90eXBl JiBfX2V4cGVjdGVkLCB2YWx1ZV90eXBlIF9fZGVzaXJlZCwKKwkJCSAgICAgIG1lbW9yeV9vcmRl ciBfX28gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgbm9leGNlcHQKKyAgICAgIHsKKwltZW1vcnlf b3JkZXIgX19vMjsKKwlzd2l0Y2ggKF9fbykKKwl7CisJY2FzZSBtZW1vcnlfb3JkZXJfYWNxX3Jl bDoKKwkgIF9fbzIgPSBtZW1vcnlfb3JkZXJfYWNxdWlyZTsKKwkgIGJyZWFrOworCWNhc2UgbWVt b3J5X29yZGVyX3JlbGVhc2U6CisJICBfX28yID0gbWVtb3J5X29yZGVyX3JlbGF4ZWQ7CisJICBi cmVhazsKKwlkZWZhdWx0OgorCSAgX19vMiA9IF9fbzsKKwl9CisJcmV0dXJuIGNvbXBhcmVfZXhj aGFuZ2Vfc3Ryb25nKF9fZXhwZWN0ZWQsIHN0ZDo6bW92ZShfX2Rlc2lyZWQpLAorCQkJCSAgICAg ICBfX28sIF9fbzIpOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hh bmdlX3dlYWsodmFsdWVfdHlwZSYgX19leHBlY3RlZCwgdmFsdWVfdHlwZSBfX2Rlc2lyZWQsCisJ CQkgICAgbWVtb3J5X29yZGVyIF9fbywgbWVtb3J5X29yZGVyIF9fbzIpIG5vZXhjZXB0CisgICAg ICB7CisJcmV0dXJuIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9fZXhwZWN0ZWQsIHN0ZDo6bW92 ZShfX2Rlc2lyZWQpLAorCQkJCSAgICAgICBfX28sIF9fbzIpOworICAgICAgfQorCisgICAgICBi b29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3dlYWsodmFsdWVfdHlwZSYgX19leHBlY3RlZCwg dmFsdWVfdHlwZSBfX2Rlc2lyZWQsCisJCQkgICAgbWVtb3J5X29yZGVyIF9fbyA9IG1lbW9yeV9v cmRlcl9zZXFfY3N0KSBub2V4Y2VwdAorICAgICAgeworCXJldHVybiBjb21wYXJlX2V4Y2hhbmdl X3N0cm9uZyhfX2V4cGVjdGVkLCBzdGQ6Om1vdmUoX19kZXNpcmVkKSwgX19vKTsKKyAgICAgIH0K KworI2lmIF9fY3BwX2xpYl9hdG9taWNfd2FpdAorICAgICAgdm9pZAorICAgICAgd2FpdCh2YWx1 ZV90eXBlIF9fb2xkLAorCSAgIG1lbW9yeV9vcmRlciBfX28gPSBtZW1vcnlfb3JkZXJfc2VxX2Nz dCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsKKwlfTV9pbXBsLndhaXQoc3RkOjptb3ZlKF9fb2xk KSwgX19vKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgbm90aWZ5X29uZSgpIG5vZXhj ZXB0CisgICAgICB7CisJX01faW1wbC5ub3RpZnlfb25lKCk7CisgICAgICB9CisKKyAgICAgIHZv aWQKKyAgICAgIG5vdGlmeV9hbGwoKSBub2V4Y2VwdAorICAgICAgeworCV9NX2ltcGwubm90aWZ5 X2FsbCgpOworICAgICAgfQorI2VuZGlmCisKKyAgICBwcml2YXRlOgorICAgICAgX1NwX2F0b21p Yzx3ZWFrX3B0cjxfVHA+PiBfTV9pbXBsOworICAgIH07CisjZW5kaWYgLy8gQysrMjAKKwogICAv Ly8gQH0gcmVsYXRlcyBzaGFyZWRfcHRyCiAgIC8vLyBAfSBncm91cCBwb2ludGVyX2Fic3RyYWN0 aW9ucwogCmRpZmYgLS1naXQgYS9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL3NoYXJlZF9wdHJf YmFzZS5oIGIvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy9zaGFyZWRfcHRyX2Jhc2UuaAppbmRl eCA5ZTgwYWFiY2RhOC4uNWI4Zjg0YjY1YmUgMTAwNjQ0Ci0tLSBhL2xpYnN0ZGMrKy12My9pbmNs dWRlL2JpdHMvc2hhcmVkX3B0cl9iYXNlLmgKKysrIGIvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0 cy9zaGFyZWRfcHRyX2Jhc2UuaApAQCAtNDA5LDYgKzQwOSwxMCBAQCBfR0xJQkNYWF9CRUdJTl9O QU1FU1BBQ0VfVkVSU0lPTgogICB0ZW1wbGF0ZTxfTG9ja19wb2xpY3kgX0xwID0gX19kZWZhdWx0 X2xvY2tfcG9saWN5PgogICAgIGNsYXNzIF9fc2hhcmVkX2NvdW50OwogCisjaWYgX19jcGx1c3Bs dXMgPj0gMjAyMDAyTAorICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBjbGFzcyBfU3BfYXRvbWlj OworI2VuZGlmCiAKICAgLy8gQ291bnRlZCBwdHIgd2l0aCBubyBkZWxldGVyIG9yIGFsbG9jYXRv ciBzdXBwb3J0CiAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QdHIsIF9Mb2NrX3BvbGljeSBfTHA+CkBA IC0xMTIxLDYgKzExMjUsOSBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCiAg ICAgcHJpdmF0ZToKICAgICAgIGZyaWVuZCBjbGFzcyBfX3dlYWtfY291bnQ8X0xwPjsKKyNpZiBf X2NwbHVzcGx1cyA+PSAyMDIwMDJMCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4gZnJpZW5kIGNs YXNzIF9TcF9hdG9taWM7CisjZW5kaWYKIAogICAgICAgX1NwX2NvdW50ZWRfYmFzZTxfTHA+KiAg X01fcGk7CiAgICAgfTsKQEAgLTEyMTgsNiArMTIyNSw5IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVT UEFDRV9WRVJTSU9OCiAKICAgICBwcml2YXRlOgogICAgICAgZnJpZW5kIGNsYXNzIF9fc2hhcmVk X2NvdW50PF9McD47CisjaWYgX19jcGx1c3BsdXMgPj0gMjAyMDAyTAorICAgICAgdGVtcGxhdGU8 dHlwZW5hbWU+IGZyaWVuZCBjbGFzcyBfU3BfYXRvbWljOworI2VuZGlmCiAKICAgICAgIF9TcF9j b3VudGVkX2Jhc2U8X0xwPiogIF9NX3BpOwogICAgIH07CkBAIC0xNzY1LDYgKzE3NzUsMTAgQEAg X0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KICAgICAgIHRlbXBsYXRlPHR5cGVuYW1l IF9EZWwsIHR5cGVuYW1lIF9UcDE+CiAJZnJpZW5kIF9EZWwqIGdldF9kZWxldGVyKGNvbnN0IHNo YXJlZF9wdHI8X1RwMT4mKSBub2V4Y2VwdDsKIAorI2lmIF9fY3BsdXNwbHVzID49IDIwMjAwMkwK KyAgICAgIGZyaWVuZCBfU3BfYXRvbWljPHNoYXJlZF9wdHI8X1RwPj47CisjZW5kaWYKKwogICAg ICAgZWxlbWVudF90eXBlKgkgICBfTV9wdHI7ICAgICAgICAgLy8gQ29udGFpbmVkIHBvaW50ZXIu CiAgICAgICBfX3NoYXJlZF9jb3VudDxfTHA+ICBfTV9yZWZjb3VudDsgICAgLy8gUmVmZXJlbmNl IGNvdW50ZXIuCiAgICAgfTsKQEAgLTIwOTcsNiArMjExMSw5IEBAIF9HTElCQ1hYX0JFR0lOX05B TUVTUEFDRV9WRVJTSU9OCiAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCBfTG9ja19wb2xp Y3kgX0xwMT4gZnJpZW5kIGNsYXNzIF9fd2Vha19wdHI7CiAgICAgICBmcmllbmQgY2xhc3MgX19l bmFibGVfc2hhcmVkX2Zyb21fdGhpczxfVHAsIF9McD47CiAgICAgICBmcmllbmQgY2xhc3MgZW5h YmxlX3NoYXJlZF9mcm9tX3RoaXM8X1RwPjsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDIwMDJMCisg ICAgICBmcmllbmQgX1NwX2F0b21pYzx3ZWFrX3B0cjxfVHA+PjsKKyNlbmRpZgogCiAgICAgICBl bGVtZW50X3R5cGUqCSBfTV9wdHI7ICAgICAgICAgLy8gQ29udGFpbmVkIHBvaW50ZXIuCiAgICAg ICBfX3dlYWtfY291bnQ8X0xwPiAgX01fcmVmY291bnQ7ICAgIC8vIFJlZmVyZW5jZSBjb3VudGVy LgpkaWZmIC0tZ2l0IGEvbGlic3RkYysrLXYzL2luY2x1ZGUvc3RkL3ZlcnNpb24gYi9saWJzdGRj KystdjMvaW5jbHVkZS9zdGQvdmVyc2lvbgppbmRleCBhOGI3OTJlOWIwZi4uN2JkMzJmNjdmMTkg MTAwNjQ0Ci0tLSBhL2xpYnN0ZGMrKy12My9pbmNsdWRlL3N0ZC92ZXJzaW9uCisrKyBiL2xpYnN0 ZGMrKy12My9pbmNsdWRlL3N0ZC92ZXJzaW9uCkBAIC0yMTUsNiArMjE1LDcgQEAKICNpZiBfR0xJ QkNYWF9IT1NURUQKICNkZWZpbmUgX19jcHBfbGliX2FycmF5X2NvbnN0ZXhwciAyMDE4MTFMCiAj ZGVmaW5lIF9fY3BwX2xpYl9hc3N1bWVfYWxpZ25lZCAyMDE4MTFMCisjZGVmaW5lIF9fY3BwX2xp Yl9hdG9taWNfc2hhcmVkX3B0ciAyMDE3MTFMCiAjaWYgZGVmaW5lZCBfR0xJQkNYWF9IQVNfR1RI UkVBRFMgfHwgZGVmaW5lZCBfR0xJQkNYWF9IQVZFX0xJTlVYX0ZVVEVYCiAjIGRlZmluZSBfX2Nw cF9saWJfYXRvbWljX3dhaXQgMjAxOTA3TAogIyBpZiBfX2NwcF9hbGlnbmVkX25ldwpkaWZmIC0t Z2l0IGEvbGlic3RkYysrLXYzL3Rlc3RzdWl0ZS8yMF91dGlsL3NoYXJlZF9wdHIvYXRvbWljL2F0 b21pY19zaGFyZWRfcHRyLmNjIGIvbGlic3RkYysrLXYzL3Rlc3RzdWl0ZS8yMF91dGlsL3NoYXJl ZF9wdHIvYXRvbWljL2F0b21pY19zaGFyZWRfcHRyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAwMDAwLi43MjVlN2JhNTAzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnN0ZGMr Ky12My90ZXN0c3VpdGUvMjBfdXRpbC9zaGFyZWRfcHRyL2F0b21pYy9hdG9taWNfc2hhcmVkX3B0 ci5jYwpAQCAtMCwwICsxLDE1MCBAQAorLy8geyBkZy1vcHRpb25zICItc3RkPWdudSsrMjAiIH0K Ky8vIHsgZGctZG8gcnVuIHsgdGFyZ2V0IGMrKzIwIH0gfQorLy8geyBkZy1yZXF1aXJlLWVmZmVj dGl2ZS10YXJnZXQgZ3RocmVhZHMgfQorLy8geyBkZy1hZGRpdGlvbmFsLW9wdGlvbnMgIi1wdGhy ZWFkIiB7IHRhcmdldCBwdGhyZWFkIH0gfQorLy8geyBkZy1hZGQtb3B0aW9ucyBsaWJhdG9taWMg fQorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaWZuZGVmIF9fY3BwX2xpYl9hdG9taWNfc2hhcmVk X3B0cgorIyBlcnJvciAiRmVhdHVyZS10ZXN0IG1hY3JvIGZvciBhdG9taWM8c2hhcmVkX3B0cjxU Pj4gbWlzc2luZyBpbiA8bWVtb3J5PiIKKyNlbGlmIF9fY3BwX2xpYl9hdG9taWNfc2hhcmVkX3B0 ciAhPSAyMDE3MTFMCisjIGVycm9yICJGZWF0dXJlLXRlc3QgbWFjcm8gZm9yIGF0b21pYzxzaGFy ZWRfcHRyPFQ+PiBoYXMgd3JvbmcgdmFsdWUgaW4gPG1lbW9yeT4iCisjZW5kaWYKKworI2luY2x1 ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgPHRlc3RzdWl0ZV9ob29rcy5oPgorCit2b2lkCit0ZXN0 X2lzX2xvY2tfZnJlZSgpCit7CisgIHVzaW5nIHRlc3RfdHlwZSA9IHN0ZDo6YXRvbWljPHN0ZDo6 c2hhcmVkX3B0cjxpbnQ+PjsKKyAgc3RhdGljX2Fzc2VydCggdGVzdF90eXBlOjppc19hbHdheXNf bG9ja19mcmVlID09IGZhbHNlICk7CisKKyAgdGVzdF90eXBlIHA7CisgIFZFUklGWSggcC5pc19s b2NrX2ZyZWUoKSA9PSBmYWxzZSApOworfQorCit2b2lkCit0ZXN0X2F0b21pY19zaGFyZWRfcHRy KCkKK3sKKyAgc3RydWN0IEEgeyBpbnQgYTsgaW50IGI7IH07CisKKyAgYXV0byBhID0gc3RkOjpt YWtlX3NoYXJlZDxBPiggMCwgNDIgKTsKKyAgdXNpbmcgcHRyX3QgPSBzdGQ6OnNoYXJlZF9wdHI8 QT47CisgIHsKKyAgICBzdGQ6OmF0b21pYzxwdHJfdD4gcHsgfTsKKyAgICBWRVJJRlkoIHAubG9h ZCgpLmdldCgpID09IG51bGxwdHIgKTsKKyAgfQorCisgIHN0ZDo6YXRvbWljPHB0cl90PiBweyBh IH07CisgIFZFUklGWSggcC5sb2FkKCkuZ2V0KCkgPT0gYS5nZXQoKSApOworICBhdXRvIGIgPSBz dGQ6Om1ha2Vfc2hhcmVkPEE+KCA0MiwgMCApOworICBwLnN0b3JlKGIpOworICBWRVJJRlkoIHAu bG9hZCgpLmdldCgpICE9IGEuZ2V0KCkgKTsKKyAgVkVSSUZZKCBwLmxvYWQoKS5nZXQoKSA9PSBi LmdldCgpICk7CisgIHAuZXhjaGFuZ2UoYSk7CisgIFZFUklGWSggcC5sb2FkKCkuZ2V0KCkgIT0g Yi5nZXQoKSApOworICBWRVJJRlkoIHAubG9hZCgpLmdldCgpID09IGEuZ2V0KCkgKTsKKworICB7 CisgICAgcHRyX3QgYWF7IGEgfTsKKyAgICBWRVJJRlkoIHAuY29tcGFyZV9leGNoYW5nZV9zdHJv bmcoYWEsIGIsCisJCQkJICAgICAgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCwKKwkJCQkgICAg ICBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KSA9PSB0cnVlICk7CisgICAgcHRyX3QgYmJ7IGEg fTsKKyAgICBWRVJJRlkoIHAuY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoYmIsIGIsCisJCQkJICAg ICAgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCwKKwkJCQkgICAgICBzdGQ6Om1lbW9yeV9vcmRl cl9zZXFfY3N0KSA9PSBmYWxzZSApOworICAgIFZFUklGWSggYmIuZ2V0KCkgPT0gYi5nZXQoKSAp OworICB9CisKKyAgeworICAgIHB0cl90IGJieyBiIH07CisgICAgVkVSSUZZKCBwLmNvbXBhcmVf ZXhjaGFuZ2Vfd2VhayhiYiwgYSwKKwkJCQkgICAgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCwK KwkJCQkgICAgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCkgPT0gdHJ1ZSApOworICAgIHB0cl90 IGFheyBiIH07CisgICAgVkVSSUZZKCBwLmNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhhYSwgYSwKKwkJ CQkgICAgICBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0LAorCQkJCSAgICAgIHN0ZDo6bWVtb3J5 X29yZGVyX3NlcV9jc3QpID09IGZhbHNlICk7CisgICAgVkVSSUZZKCBhYS5nZXQoKSA9PSBhLmdl dCgpICk7CisgIH0KK30KKwordm9pZAordGVzdF93YWl0X25vdGlmeSgpCit7CisgIHN0ZDo6YXRv bWljPHN0ZDo6c2hhcmVkX3B0cjxpbnQ+PiBwOworICBzdGQ6OnNoYXJlZF9wdHI8aW50PiBhID0g c3RkOjptYWtlX3NoYXJlZDxpbnQ+KCk7CisgIHN0ZDo6c2hhcmVkX3B0cjxpbnQ+IGIgPSBzdGQ6 Om1ha2Vfc2hhcmVkPGludD4oKTsKKworICBwLnN0b3JlKGEpOworICBwLndhaXQoYik7CisgIHN0 ZDo6dGhyZWFkIHQoWyZdCisgICAgICB7CisJcC5zdG9yZShiKTsKKwlwLm5vdGlmeV9vbmUoKTsK KyAgICAgIH0pOworICBwLndhaXQoYSk7CisgIHQuam9pbigpOworfQorCitpbnQgY291bnRlciA9 IDA7CisKK3ZvaWQKK3Rlc3RfY291bnRpbmcoKQoreworICBzdHJ1Y3QgWAorICB7CisgICAgflgo KSB7ICsrY291bnRlcjsgfQorICB9OworCisgIHsKKyAgICBzdGQ6OmF0b21pYzxzdGQ6OnNoYXJl ZF9wdHI8WD4+IHB7IHN0ZDo6bWFrZV9zaGFyZWQ8WD4oKSB9OworICAgIHN0ZDo6c2hhcmVkX3B0 cjxYPiBhID0gcC5sb2FkKCk7CisgICAgVkVSSUZZKCBhLnVzZV9jb3VudCgpID09IDIgKTsgLy8g cCwgYQorICAgIHAuc3RvcmUoe30pOworICAgIFZFUklGWSggYS51c2VfY291bnQoKSA9PSAxICk7 IC8vIGEKKyAgICBwLnN0b3JlKGEpOworICAgIFZFUklGWSggYS51c2VfY291bnQoKSA9PSAyICk7 IC8vIHAsIGEKKyAgICBzdGQ6OnNoYXJlZF9wdHI8WD4gYiA9IHN0ZDo6bWFrZV9zaGFyZWQ8WD4o KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8WD4gYyA9IHAuZXhjaGFuZ2UoYik7CisgICAgVkVSSUZZ KCBhLnVzZV9jb3VudCgpID09IDIgKTsgLy8gYSwgYworICAgIFZFUklGWSggYyA9PSBhICk7Cisg ICAgVkVSSUZZKCBiLnVzZV9jb3VudCgpID09IDIgKTsgLy8gcCwgYgorICAgIHN0ZDo6YXRvbWlj PHN0ZDo6c2hhcmVkX3B0cjxYPj4gcDJ7YX07CisgICAgVkVSSUZZKCBhLnVzZV9jb3VudCgpID09 IDMgKTsgLy8gcDIsIGEsIGMKKyAgICBWRVJJRlkoIHAyLmNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25n KGEsIGIpICk7CisgICAgVkVSSUZZKCBhLnVzZV9jb3VudCgpID09IDIgKTsgLy8gYSwgYworICAg IFZFUklGWSggYi51c2VfY291bnQoKSA9PSAzICk7IC8vIHAsIHAyLCBiCisgICAgVkVSSUZZICgg ISBwMi5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhhLCBiKSApOworICAgIFZFUklGWSggYSA9PSBi ICk7CisgICAgVkVSSUZZKCBhLnVzZV9jb3VudCgpID09IDQgKTsgLy8gcCwgcDIsIGEsIGIKKyAg ICBWRVJJRlkoIGIudXNlX2NvdW50KCkgPT0gNCApOworICAgIFZFUklGWSggYy51c2VfY291bnQo KSA9PSAxICk7IC8vIGMKKyAgICBWRVJJRlkoIHAuY29tcGFyZV9leGNoYW5nZV93ZWFrKGIsIGMp ICk7CisgICAgVkVSSUZZKCBiLnVzZV9jb3VudCgpID09IDMgKTsgLy8gcDIsIGEsIGIKKyAgICBW RVJJRlkoIGMudXNlX2NvdW50KCkgPT0gMiApOyAvLyBwLCBjCisgICAgVkVSSUZZKCAhIHAuY29t cGFyZV9leGNoYW5nZV93ZWFrKGEsIGIpICk7CisgICAgVkVSSUZZKCBhID09IGMgKTsKKyAgICBW RVJJRlkoIGEudXNlX2NvdW50KCkgPT0gMyApOyAvLyBwLCBhLCBjCisgICAgVkVSSUZZKCBiLnVz ZV9jb3VudCgpID09IDIgKTsgLy8gcDIsIGIKKyAgICBWRVJJRlkoIGMudXNlX2NvdW50KCkgPT0g MyApOyAvLyBwLCBhLCBjCisgICAgYS5yZXNldCgpOworICAgIGIucmVzZXQoKTsKKyAgICBjLnJl c2V0KCk7CisgICAgVkVSSUZZKCBjb3VudGVyID09IDAgKTsKKyAgfQorICBWRVJJRlkoIGNvdW50 ZXIgPT0gMiApOworfQorCitpbnQKK21haW4oKQoreworICB0ZXN0X2lzX2xvY2tfZnJlZSgpOwor ICB0ZXN0X2F0b21pY19zaGFyZWRfcHRyKCk7CisgIHRlc3Rfd2FpdF9ub3RpZnkoKTsKKyAgdGVz dF9jb3VudGluZygpOworfQpkaWZmIC0tZ2l0IGEvbGlic3RkYysrLXYzL3Rlc3RzdWl0ZS8yMF91 dGlsL3dlYWtfcHRyL2F0b21pY193ZWFrX3B0ci5jYyBiL2xpYnN0ZGMrKy12My90ZXN0c3VpdGUv MjBfdXRpbC93ZWFrX3B0ci9hdG9taWNfd2Vha19wdHIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMDAwMDAuLmUzOTRlNTU2MmI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlic3Rk YysrLXYzL3Rlc3RzdWl0ZS8yMF91dGlsL3dlYWtfcHRyL2F0b21pY193ZWFrX3B0ci5jYwpAQCAt MCwwICsxLDk1IEBACisvLyB7IGRnLW9wdGlvbnMgIi1zdGQ9Z251KysyMCIgfQorLy8geyBkZy1k byBydW4geyB0YXJnZXQgYysrMjAgfSB9CisvLyB7IGRnLXJlcXVpcmUtZWZmZWN0aXZlLXRhcmdl dCBndGhyZWFkcyB9CisvLyB7IGRnLWFkZGl0aW9uYWwtb3B0aW9ucyAiLXB0aHJlYWQiIHsgdGFy Z2V0IHB0aHJlYWQgfSB9CisvLyB7IGRnLWFkZC1vcHRpb25zIGxpYmF0b21pYyB9CisKKyNpbmNs dWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHRlc3RzdWl0ZV9ob29r cy5oPgorCit2b2lkCit0ZXN0X2lzX2xvY2tfZnJlZSgpCit7CisgIHVzaW5nIHRlc3RfdHlwZSA9 IHN0ZDo6YXRvbWljPHN0ZDo6d2Vha19wdHI8aW50Pj47CisgIHN0YXRpY19hc3NlcnQoIHRlc3Rf dHlwZTo6aXNfYWx3YXlzX2xvY2tfZnJlZSA9PSBmYWxzZSApOworCisgIHRlc3RfdHlwZSBwOwor ICBWRVJJRlkoIHAuaXNfbG9ja19mcmVlKCkgPT0gZmFsc2UgKTsKK30KKwordm9pZAordGVzdF9h dG9taWNfd2Vha19wdHIoKQoreworICBzdHJ1Y3QgQSB7IGludCBhOyBpbnQgYjsgfTsKKworICBh dXRvIGEgPSBzdGQ6Om1ha2Vfc2hhcmVkPEE+KCAwLCA0MiApOworICB1c2luZyBwdHJfdCA9IHN0 ZDo6d2Vha19wdHI8QT47CisgIHB0cl90IHdheyBhIH07CisgIHsKKyAgICBzdGQ6OmF0b21pYzxw dHJfdD4gcHsgfTsKKyAgICBWRVJJRlkoIHAubG9hZCgpLmxvY2soKS5nZXQoKSA9PSBudWxscHRy ICk7CisgIH0KKworICBzdGQ6OmF0b21pYzxwdHJfdD4gcHsgd2EgfTsKKyAgVkVSSUZZKCBwLmxv YWQoKS5sb2NrKCkuZ2V0KCkgPT0gYS5nZXQoKSApOworCisgIGF1dG8gYiA9IHN0ZDo6bWFrZV9z aGFyZWQ8QT4oIDQyLCAwICk7CisgIHB0cl90IHdieyBiIH07CisgIHAuc3RvcmUod2IpOworICBW RVJJRlkoIHAubG9hZCgpLmxvY2soKS5nZXQoKSAhPSBhLmdldCgpICk7CisgIFZFUklGWSggcC5s b2FkKCkubG9jaygpLmdldCgpID09IGIuZ2V0KCkgKTsKKyAgcC5leGNoYW5nZSh3YSk7CisgIFZF UklGWSggcC5sb2FkKCkubG9jaygpLmdldCgpICE9IGIuZ2V0KCkgKTsKKyAgVkVSSUZZKCBwLmxv YWQoKS5sb2NrKCkuZ2V0KCkgPT0gYS5nZXQoKSApOworCisgIHsKKyAgICBwdHJfdCBhYXsgYSB9 OworICAgIFZFUklGWSggcC5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhhYSwgYiwKKwkJCQkgICAg ICBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0LAorCQkJCSAgICAgIHN0ZDo6bWVtb3J5X29yZGVy X3NlcV9jc3QpID09IHRydWUgKTsKKyAgICBwdHJfdCBiYnsgYSB9OworICAgIFZFUklGWSggcC5j b21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhiYiwgYiwKKwkJCQkJc3RkOjptZW1vcnlfb3JkZXJfc2Vx X2NzdCwKKwkJCQkJc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCkgPT0gZmFsc2UgKTsKKyAgICBW RVJJRlkoIGJiLmxvY2soKS5nZXQoKSA9PSBiLmdldCgpICk7CisgIH0KKworICB7CisgICAgcHRy X3QgYmJ7IGIgfTsKKyAgICBWRVJJRlkoIHAuY29tcGFyZV9leGNoYW5nZV93ZWFrKGJiLCBhLAor CQkJCSAgICBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0LAorCQkJCSAgICBzdGQ6Om1lbW9yeV9v cmRlcl9zZXFfY3N0KSA9PSB0cnVlICk7CisgICAgcHRyX3QgYWF7IGIgfTsKKyAgICBWRVJJRlko IHAuY29tcGFyZV9leGNoYW5nZV93ZWFrKGFhLCBhLAorCQkJCSAgICBzdGQ6Om1lbW9yeV9vcmRl cl9zZXFfY3N0LAorCQkJCSAgICBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KSA9PSBmYWxzZSAp OworICAgIFZFUklGWSggYWEubG9jaygpLmdldCgpID09IGEuZ2V0KCkgKTsKKyAgfQorfQorCit2 b2lkCit0ZXN0X3dhaXRfbm90aWZ5KCkKK3sKKyAgc3RkOjphdG9taWM8c3RkOjp3ZWFrX3B0cjxp bnQ+PiBwOworICBzdGQ6OndlYWtfcHRyPGludD4gYSA9IHN0ZDo6bWFrZV9zaGFyZWQ8aW50Pigp OworICBzdGQ6OndlYWtfcHRyPGludD4gYiA9IHN0ZDo6bWFrZV9zaGFyZWQ8aW50PigpOworCisg IHAuc3RvcmUoYSk7CisgIHAud2FpdChiKTsKKyAgc3RkOjp0aHJlYWQgdChbJl0KKyAgICAgIHsK KwlwLnN0b3JlKGIpOworCXAubm90aWZ5X29uZSgpOworICAgICAgfSk7CisgIHAud2FpdChhKTsK KyAgdC5qb2luKCk7Cit9CisKK2ludAorbWFpbigpCit7CisgIHRlc3RfaXNfbG9ja19mcmVlKCk7 CisgIHRlc3RfYXRvbWljX3dlYWtfcHRyKCk7CisgIHRlc3Rfd2FpdF9ub3RpZnkoKTsKK30K --00000000000084dae605d5bc0135--