From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ed1-x52c.google.com (mail-ed1-x52c.google.com [IPv6:2a00:1450:4864:20::52c]) by sourceware.org (Postfix) with ESMTPS id 009DA3858D3C; Wed, 22 Feb 2023 06:06:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 009DA3858D3C Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-ed1-x52c.google.com with SMTP id s26so26001665edw.11; Tue, 21 Feb 2023 22:06:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=in-reply-to:content-language:references:cc:to:subject:from :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=fmGKT5SCFZK5kd+/vNkgH3lG/OOI7eK7qtvZ9/fwb9U=; b=C7kZk1iiI+mF3htO++Qxhz217GfPc0lrkOJ7d5b74qVUTA1uS+b19/M8/e0g47JUll u2JwRlMvkeZrlVy/Ex+XGOTbgWdhpNWy5KM3fEwKaYWHe9DWpgiRz3otlOTcbUGlrq7j OFo/xzPQBY44u/Ujh6I6i9jo8fTr43QdXJSVYp4gjQkIpm4x68DuSiM47V8P+jM68F6l xQMLOZKA6YJfZwXS1V9tcms9k9nMVtcpQqzlZ662BF+xX7mvStdboaSDcCk+ql2DZXZ9 vNQ159UfqOLQikPmWkZMnOV6hRjLlED6GJfMaMBrTRVrv25ow21wHJj+JXNqjz4WI0+G 9ryg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=in-reply-to:content-language:references:cc:to:subject:from :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=fmGKT5SCFZK5kd+/vNkgH3lG/OOI7eK7qtvZ9/fwb9U=; b=uc4C9RaB4SHwB5bEyN/KE06fXL/HgxEySwxsy6cbeCVpXUzZYhAsDGhfxGUFuRWG/x 8jcxc7/E6XpW12bO44iNhTWMMhNL9SzU9rmMbK9hsHFuQQIAq4PpWM4CJhXhIHvJDMep IUVQpr1m9RqbyKe3atqG5JTdFb9NNhW4RUnUADX309t75aAIWNy0wsUOq5pDwZXMSJI7 iJ2pAcLRsDL+E4gX4lPI7jv7ZyFCV6yVCDhbwzVEOadoxJ2AAMqczHXJd0gvUNJDu7SB gLEscmVMYqc6RfmeoYLQeXXRiXSxEIeRsj2afjhyx/2fqDWj0ToKxOUkGMe+K8AjwxlN ze/A== X-Gm-Message-State: AO0yUKUXW6eFrlVCYmUIUtYOWrDiRVF3bX79KOT3MObnp1Ua7k+BHtcm rHnyCXiE/3wlRwJxrpXeK3WRj2gQ1BY= X-Google-Smtp-Source: AK7set8nik9IwTOUiNILyfUU6CzBzowZtn14L6LMTeQDLkTS4OiMJyYfN0QkgyVZLOc1lanWGHBvwg== X-Received: by 2002:a17:906:c309:b0:8aa:bea6:ce8b with SMTP id s9-20020a170906c30900b008aabea6ce8bmr12687174ejz.53.1677045985898; Tue, 21 Feb 2023 22:06:25 -0800 (PST) Received: from [10.22.3.31] ([109.190.253.11]) by smtp.googlemail.com with ESMTPSA id k7-20020a1709065fc700b008dceec0fd4csm2113915ejv.73.2023.02.21.22.06.24 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 21 Feb 2023 22:06:24 -0800 (PST) Content-Type: multipart/mixed; boundary="------------qMiMO5txnZyduhjiyhRxAAHn" Message-ID: <7313d189-ae56-4582-6f23-9263dbf57dd3@gmail.com> Date: Wed, 22 Feb 2023 07:06:23 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.7.1 From: =?UTF-8?Q?Fran=c3=a7ois_Dumont?= Subject: [PATCH] libstdc++: Limit allocations in _Rb_tree 1/2 To: "libstdc++@gcc.gnu.org" Cc: gcc-patches References: <43172ea5-6729-02c5-d374-9537fff7eb4c@gmail.com> Content-Language: fr In-Reply-To: <43172ea5-6729-02c5-d374-9537fff7eb4c@gmail.com> X-Spam-Status: No, score=-6.2 required=5.0 tests=BAYES_00,BODY_8BITS,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,KAM_NUMSUBJECT,KAM_SHORT,RCVD_IN_ABUSEAT,RCVD_IN_BARRACUDACENTRAL,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,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: This is a multi-part message in MIME format. --------------qMiMO5txnZyduhjiyhRxAAHn Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Here is eventually a working proposal. Compared to the unordered container approach we need to find out what type is going to be used to call the comparer. Otherwise we might reinstantiate a temporary each time we call the comparer. For example in case of const char* insertion with a less comparer we would create a string_view instance on each comparer call and so each time do a strlen. This code is tricky and do not cover all use cases. For those uncovered cases the default behavior is to create a key_type instance which will be moved to storage if needed. Is there any plan to create a builtin function to get help from the compiler to find out this type ? Something like std::invoke_result but giving also the actual argument types.     libstdc++: [_Rb_tree] Limit allocations on unique insertions [PR 96088]     Detect when invoking the comparer requires an allocation using the noexcept     qualification of the functor. In this case guess the type needed to invoke     the comparer and create a temporary instance used for all comparer invocations.     This temporary instance will be eventually moved to storage location if it is to     insert. Avoid to allocate a node and construct the stored value otherwise.     libstdc++-v3/ChangeLog:             PR libstdc++/96088             * include/bits/stl_function.h             (std::less<>::operator()): Add noexcept qualification.             (std::greater::operator()): Likewise. (std::_Identity<>::operator<_Tp2>(_Tp2&&)): New perfect forwarding operator. (std::_Select1st<>::operator<_Pair2>(_Pair2&&)): New move operator.             * include/bits/stl_tree.h (_Rb_tree<>::_ConvertToValueType<>): New helper type.             (_Rb_tree<>::__has_firstargument): Likewise.             (_Rb_tree<>::_S_get_key_type_aux): New helper method, use latter.             (_Rb_tree<>::_S_get_key_type): New helper method, use latter.             (_Rb_tree<>::__key_type_t): New.             (_Rb_tree<>::__is_comparable_lhs): New.             (_Rb_tree<>::__is_comparable_rhs): New.             (_Rb_tree<>::__is_comparable): New, use latters.             (_Rb_tree<>::__is_nothrow_comparable_lhs): New.             (_Rb_tree<>::__is_nothrow_comparable_rhs): New.             (_Rb_tree<>::__is_nothrow_comparable): New, use latters.             (_Rb_tree<>::_S_forward_key): New.             (_Rb_tree<>::_M_get_insert_unique_pos_tr): New.             (_Rb_tree<>::_M_emplace_unique_kv): New.             (_Rb_tree<>::_M_emplace_unique_aux): New, use latter.             (_Rb_tree<>::_M_emplace_unique): New, use latter.             (_Rb_tree<>::_Auto_node::_S_build): New.             * testsuite/23_containers/map/96088.cc: New test case.             * testsuite/23_containers/multimap/96088.cc: New test case.             * testsuite/23_containers/multiset/96088.cc: New test case.             * testsuite/23_containers/set/96088.cc: New test case. François --------------qMiMO5txnZyduhjiyhRxAAHn Content-Type: text/x-patch; charset=UTF-8; name="pr96088_map.patch" Content-Disposition: attachment; filename="pr96088_map.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2xpYnN0ZGMrKy12My9pbmNsdWRlL2JpdHMvc3RsX2Z1bmN0aW9uLmgg Yi9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL3N0bF9mdW5jdGlvbi5oCmluZGV4IGZhMDNm MzJiMWI4Li5mODgxN2UyZjZhZSAxMDA2NDQKLS0tIGEvbGlic3RkYysrLXYzL2luY2x1ZGUv Yml0cy9zdGxfZnVuY3Rpb24uaAorKysgYi9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL3N0 bF9mdW5jdGlvbi5oCkBAIC0zOTUsNiArMzk1LDcgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQ QUNFX1ZFUlNJT04KICAgICAgIF9HTElCQ1hYMTRfQ09OU1RFWFBSCiAgICAgICBib29sCiAg ICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QK KwlfR0xJQkNYWF9OT0VYQ0VQVF9JRiggbm9leGNlcHQoX194ID4gX195KSApCiAgICAgICB7 IHJldHVybiBfX3ggPiBfX3k7IH0KICAgICB9OwogCkBAIC00MDUsNiArNDA2LDcgQEAgX0dM SUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KICAgICAgIF9HTElCQ1hYMTRfQ09OU1RF WFBSCiAgICAgICBib29sCiAgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25z dCBfVHAmIF9feSkgY29uc3QKKwlfR0xJQkNYWF9OT0VYQ0VQVF9JRiggbm9leGNlcHQoX194 IDwgX195KSApCiAgICAgICB7IHJldHVybiBfX3ggPCBfX3k7IH0KICAgICB9OwogCkBAIC0x MTY1LDYgKzExNjcsMTMgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KICAg ICAgIGNvbnN0IF9UcCYKICAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gpIGNvbnN0 CiAgICAgICB7IHJldHVybiBfX3g7IH0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wK KyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAyPgorICAgICAgX1RwMiYmCisgICAgICBvcGVy YXRvcigpKF9UcDImJiBfX3gpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6 OmZvcndhcmQ8X1RwMj4oX194KTsgfQorI2VuZGlmCiAgICAgfTsKIAogICAvLyBQYXJ0aWFs IHNwZWNpYWxpemF0aW9uLCBhdm9pZHMgY29uZnVzaW5nIGVycm9ycyBpbiBlLmcuIHN0ZDo6 c2V0PGNvbnN0IFQ+LgpAQCAtMTE4MywxNSArMTE5MiwyOCBAQCBfR0xJQkNYWF9CRUdJTl9O QU1FU1BBQ0VfVkVSU0lPTgogICAgICAgeyByZXR1cm4gX194LmZpcnN0OyB9CiAKICNpZiBf X2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgcHJpdmF0ZToKICAgICAgIHRlbXBsYXRlPHR5 cGVuYW1lIF9QYWlyMj4KLSAgICAgICAgdHlwZW5hbWUgX1BhaXIyOjpmaXJzdF90eXBlJgot ICAgICAgICBvcGVyYXRvcigpKF9QYWlyMiYgX194KSBjb25zdAotICAgICAgICB7IHJldHVy biBfX3guZmlyc3Q7IH0KKwlzdHJ1Y3QgX18xc3RfdHlwZQorCXsgdXNpbmcgdHlwZSA9IHR5 cGVuYW1lIF9QYWlyMjo6Zmlyc3RfdHlwZTsgfTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5h bWUgX1RwLCB0eXBlbmFtZSBfVXA+CisJc3RydWN0IF9fMXN0X3R5cGU8cGFpcjxfVHAsIF9V cD4+CisJeyB1c2luZyB0eXBlID0gX1RwOyB9OwogCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFt ZSBfVHAsIHR5cGVuYW1lIF9VcD4KKwlzdHJ1Y3QgX18xc3RfdHlwZTxjb25zdCBwYWlyPF9U cCwgX1VwPj4KKwl7IHVzaW5nIHR5cGUgPSBjb25zdCBfVHA7IH07CisKKyAgICAgIHRlbXBs YXRlPHR5cGVuYW1lIF9QYWlyMj4KKwlzdHJ1Y3QgX18xc3RfdHlwZTxfUGFpcjImPgorCXsg dXNpbmcgdHlwZSA9IHR5cGVuYW1lIF9fMXN0X3R5cGU8X1BhaXIyPjo6dHlwZSY7IH07CisK KyAgICBwdWJsaWM6CiAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpcjI+Ci0gICAgICAg IGNvbnN0IHR5cGVuYW1lIF9QYWlyMjo6Zmlyc3RfdHlwZSYKLSAgICAgICAgb3BlcmF0b3Io KShjb25zdCBfUGFpcjImIF9feCkgY29uc3QKLSAgICAgICAgeyByZXR1cm4gX194LmZpcnN0 OyB9CisJdHlwZW5hbWUgX18xc3RfdHlwZTxfUGFpcjI+Ojp0eXBlJiYKKwlvcGVyYXRvcigp KF9QYWlyMiYmIF9feCkgY29uc3Qgbm9leGNlcHQKKwl7IHJldHVybiBzdGQ6OmZvcndhcmQ8 X1BhaXIyPihfX3gpLmZpcnN0OyB9CiAjZW5kaWYKICAgICB9OwogCmRpZmYgLS1naXQgYS9s aWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL3N0bF90cmVlLmggYi9saWJzdGRjKystdjMvaW5j bHVkZS9iaXRzL3N0bF90cmVlLmgKaW5kZXggM2MzMzFmYmM5NTIuLjVkYWU0MmE1MDRjIDEw MDY0NAotLS0gYS9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL3N0bF90cmVlLmgKKysrIGIv bGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy9zdGxfdHJlZS5oCkBAIC01MzQsNiArNTM0LDEz NyBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCV9SYl90cmVlJiBfTV90 OwogICAgICAgfTsKIAorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAgIHRlbXBs YXRlPHR5cGVuYW1lIF9FeEtleSwgdHlwZW5hbWUgX1ZhbHVlPgorCXN0cnVjdCBfQ29udmVy dFRvVmFsdWVUeXBlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWU+CisJc3Ry dWN0IF9Db252ZXJ0VG9WYWx1ZVR5cGU8c3RkOjpfSWRlbnRpdHk8X1ZhbHVlPiwgX1ZhbHVl PgorCXsKKwkgIHRlbXBsYXRlPHR5cGVuYW1lIF9LdD4KKwkgICAgY29uc3RleHByIF9LdCYm CisJICAgIG9wZXJhdG9yKCkoX0t0JiYgX19rKSBjb25zdCBub2V4Y2VwdAorCSAgICB7IHJl dHVybiBzdGQ6OmZvcndhcmQ8X0t0PihfX2spOyB9CisJfTsKKworICAgICAgdGVtcGxhdGU8 dHlwZW5hbWUgX1ZhbHVlPgorCXN0cnVjdCBfQ29udmVydFRvVmFsdWVUeXBlPHN0ZDo6X1Nl bGVjdDFzdDxfVmFsdWU+LCBfVmFsdWU+CisJeworCSAgY29uc3RleHByIF9WYWx1ZSYmCisJ ICBvcGVyYXRvcigpKF9WYWx1ZSYmIF9feCkgY29uc3Qgbm9leGNlcHQKKwkgIHsgcmV0dXJu IHN0ZDo6bW92ZShfX3gpOyB9CisKKwkgIGNvbnN0ZXhwciBjb25zdCBfVmFsdWUmCisJICBv cGVyYXRvcigpKGNvbnN0IF9WYWx1ZSYgX194KSBjb25zdCBub2V4Y2VwdAorCSAgeyByZXR1 cm4gX194OyB9CisKKwkgIHRlbXBsYXRlPHR5cGVuYW1lIF9LdCwgdHlwZW5hbWUgX1Z0Pgor CSAgICBjb25zdGV4cHIgc3RkOjpwYWlyPF9LdCwgX1Z0PiYmCisJICAgIG9wZXJhdG9yKCko c3RkOjpwYWlyPF9LdCwgX1Z0PiYmIF9feCkgY29uc3Qgbm9leGNlcHQKKwkgICAgeyByZXR1 cm4gc3RkOjptb3ZlKF9feCk7IH0KKworCSAgdGVtcGxhdGU8dHlwZW5hbWUgX0t0LCB0eXBl bmFtZSBfVnQ+CisJICAgIGNvbnN0ZXhwciBjb25zdCBzdGQ6OnBhaXI8X0t0LCBfVnQ+Jgor CSAgICBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6cGFpcjxfS3QsIF9WdD4mIF9feCkgY29uc3Qg bm9leGNlcHQKKwkgICAgeyByZXR1cm4gX194OyB9CisgICAgICB9OworCisgICAgICB0ZW1w bGF0ZTx0eXBlbmFtZSBfRnVuYywgdHlwZW5hbWUgX0t0LCB0eXBlbmFtZSA9IF9fdm9pZF90 PD4+CisJc3RydWN0IF9faGFzX2ZpcnN0X2FyZ3VtZW50CisJeyB9OworCisgICAgICB0ZW1w bGF0ZTx0eXBlbmFtZSBfRnVuYywgdHlwZW5hbWUgX0t0PgorCXN0cnVjdCBfX2hhc19maXJz dF9hcmd1bWVudDxfRnVuYywgX0t0LAorCQkJCV9fdm9pZF90PHR5cGVuYW1lIF9GdW5jOjpm aXJzdF9hcmd1bWVudF90eXBlPj4KKwl7IHVzaW5nIHR5cGUgPSB0eXBlbmFtZSBfRnVuYzo6 Zmlyc3RfYXJndW1lbnRfdHlwZTsgfTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1 bmMsIHR5cGVuYW1lIF9LdD4KKwl1c2luZyBfX2hhc19maXJzdF9hcmd1bWVudF90CisJICA9 IHR5cGVuYW1lIF9faGFzX2ZpcnN0X2FyZ3VtZW50PF9GdW5jLCBfS3Q+Ojp0eXBlOworCisg ICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuYywgdHlwZW5hbWUgX0t0LAorCSAgICAgICB0 eXBlbmFtZSA9IF9faGFzX2ZpcnN0X2FyZ3VtZW50X3Q8X0Z1bmMsIF9LdD4+CisJc3RhdGlj IHR5cGVuYW1lIF9GdW5jOjpmaXJzdF9hcmd1bWVudF90eXBlCisJX1NfZ2V0X2tleV90eXBl X2F1eChjb25zdCBfRnVuYyYsIF9LdCYmIF9fa3QpOworCisgICAgICB0ZW1wbGF0ZTx0eXBl bmFtZSBfRnVuYywgdHlwZW5hbWUgX0t0PgorCXN0YXRpYyBfS2V5CisJX1NfZ2V0X2tleV90 eXBlX2F1eCguLi4pOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxNDAyTAorICAgICAgdGVt cGxhdGU8dHlwZW5hbWUgX0Z1bmMsIHR5cGVuYW1lIF9LdCwKKwkgICAgICAgdHlwZW5hbWUg PSBfX2hhc19pc190cmFuc3BhcmVudF90PF9GdW5jLCBfS3Q+PgorCXN0YXRpYyBhdXRvCisJ X1NfZ2V0X2tleV90eXBlKGNvbnN0IF9GdW5jJiwgX0t0JiYgX19rdCkKKwktPiBkZWNsdHlw ZShzdGQ6OmZvcndhcmQ8X0t0PihfX2t0KSk7CisjZW5kaWYKKworICAgICAgdGVtcGxhdGU8 dHlwZW5hbWUgX0FyZywgdHlwZW5hbWUgX0t0PgorCXN0YXRpYyBfQXJnCisJX1NfZ2V0X2tl eV90eXBlKGJvb2wgKCopKGNvbnN0IF9BcmcmLCBjb25zdCBfQXJnJiksIF9LdCYmKTsKKwor ICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmMsIHR5cGVuYW1lIF9LdD4KKwlzdGF0aWMg YXV0bworCV9TX2dldF9rZXlfdHlwZShjb25zdCBfRnVuYyYgX19mdW5jLCBfS3QmJiBfX2t0 KQorCS0+IGRlY2x0eXBlKF9TX2dldF9rZXlfdHlwZV9hdXgoX19mdW5jLCBzdGQ6OmZvcndh cmQ8X0t0PihfX2t0KSkpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS3Q+CisJdXNp bmcgX19rZXlfdHlwZV90ID0gZGVjbHR5cGUoX1NfZ2V0X2tleV90eXBlKAorCQlzdGQ6OmRl Y2x2YWw8X0NvbXBhcmU+KCksIHN0ZDo6ZGVjbHZhbDxfS3Q+KCkpKTsKKworICAgICAgdGVt cGxhdGU8dHlwZW5hbWUgX0t0PgorCXVzaW5nIF9faXNfY29tcGFyYWJsZV9saHMgPQorCSAg X19pc19pbnZvY2FibGU8X0NvbXBhcmUmLCBfS3QsIGNvbnN0IF9LZXkmPjsKKworICAgICAg dGVtcGxhdGU8dHlwZW5hbWUgX0t0PgorCXVzaW5nIF9faXNfY29tcGFyYWJsZV9yaHMgPQor CSAgX19pc19pbnZvY2FibGU8X0NvbXBhcmUmLCBjb25zdCBfS2V5JiwgX0t0PjsKKworICAg ICAgdGVtcGxhdGU8dHlwZW5hbWUgX0t0PgorCXVzaW5nIF9faXNfY29tcGFyYWJsZSA9CisJ ICBfX2FuZF88X19pc19jb21wYXJhYmxlX2xoczxfS3Q+LCBfX2lzX2NvbXBhcmFibGVfcmhz PF9LdD4+OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS3Q+CisJdXNpbmcgX19pc19u b3Rocm93X2NvbXBhcmFibGVfbGhzID0KKwkgIF9faXNfbm90aHJvd19pbnZvY2FibGU8X0Nv bXBhcmUmLCBfS3QsIGNvbnN0IF9LZXkmPjsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUg X0t0PgorCXVzaW5nIF9faXNfbm90aHJvd19jb21wYXJhYmxlX3JocyA9CisJICBfX2lzX25v dGhyb3dfaW52b2NhYmxlPF9Db21wYXJlJiwgY29uc3QgX0tleSYsIF9LdD47CisKKyAgICAg IHRlbXBsYXRlPHR5cGVuYW1lIF9LdD4KKwl1c2luZyBfX2lzX25vdGhyb3dfY29tcGFyYWJs ZSA9CisJICBfX2FuZF88X19pc19ub3Rocm93X2NvbXBhcmFibGVfbGhzPF9LdD4sCisJCSBf X2lzX25vdGhyb3dfY29tcGFyYWJsZV9yaHM8X0t0Pj47CisKKyAgICAgIHRlbXBsYXRlPHR5 cGVuYW1lIF9LdD4KKwlzdGF0aWMgX19lbmFibGVfaWZfdDwKKwkgIF9fYW5kXzxfX25vdF88 aXNfc2FtZTxfX2tleV90eXBlX3Q8X0t0PiwgX0tleT4+LAorCQkgX19pc19jb21wYXJhYmxl PF9fa2V5X3R5cGVfdDxfS3Q+Pj46OnZhbHVlLAorCSAgX19jb25kaXRpb25hbF90PAorCSAg ICBfX2FuZF88X19pc19ub3Rocm93X2NvbXBhcmFibGVfbGhzPGNvbnN0IF9LZXkmPiwKKwkJ ICAgX19ub3RfPF9faXNfbm90aHJvd19jb21wYXJhYmxlPF9fa2V5X3R5cGVfdDxfS3Q+Pj4+ Ojp2YWx1ZSwKKwkgICAgX0tleSwgX19rZXlfdHlwZV90PF9LdD4+PgorCV9TX2ZvcndhcmRf a2V5KF9LdCYmIF9faykKKwl7IHJldHVybiBzdGQ6OmZvcndhcmQ8X0t0PihfX2spOyB9CisK KyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9LdD4KKwlzdGF0aWMgX19lbmFibGVfaWZfdDwK KwkgIF9fb3JfPGlzX3NhbWU8X19rZXlfdHlwZV90PF9LdD4sIF9LZXk+LAorCQlfX25vdF88 X19pc19jb21wYXJhYmxlPF9fa2V5X3R5cGVfdDxfS3Q+Pj4+Ojp2YWx1ZSwKKwkgIF9LZXk+ CisJX1NfZm9yd2FyZF9rZXkoX0t0JiYgX19rKQorCXsgcmV0dXJuIHsgc3RkOjpmb3J3YXJk PF9LdD4oX19rKSB9OyB9CisKKyAgICAgIHN0YXRpYyBjb25zdCBfS2V5JgorICAgICAgX1Nf Zm9yd2FyZF9rZXkoY29uc3QgX0tleSYgX19rKQorICAgICAgeyByZXR1cm4gX19rOyB9CisK KyAgICAgIHN0YXRpYyBfS2V5JiYKKyAgICAgIF9TX2ZvcndhcmRfa2V5KF9LZXkmJiBfX2sp CisgICAgICB7IHJldHVybiBzdGQ6Om1vdmUoX19rKTsgfQorI2VuZGlmIC8vIEMrKzExCisK ICAgICBwdWJsaWM6CiAgICAgICB0eXBlZGVmIF9LZXkgCQkJCWtleV90eXBlOwogICAgICAg dHlwZWRlZiBfVmFsIAkJCQl2YWx1ZV90eXBlOwpAQCAtODMzLDYgKzk2NCwxMiBAQCBfR0xJ QkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogICAgICAgcGFpcjxfQmFzZV9wdHIsIF9C YXNlX3B0cj4KICAgICAgIF9NX2dldF9pbnNlcnRfZXF1YWxfcG9zKGNvbnN0IGtleV90eXBl JiBfX2spOwogCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAgdGVtcGxhdGU8 dHlwZW5hbWUgX0t0PgorCXBhaXI8X0Jhc2VfcHRyLCBfQmFzZV9wdHI+CisJX01fZ2V0X2lu c2VydF91bmlxdWVfcG9zX3RyKGNvbnN0IF9LdCYgX19rKTsKKyNlbmRpZgorCiAgICAgICBw YWlyPF9CYXNlX3B0ciwgX0Jhc2VfcHRyPgogICAgICAgX01fZ2V0X2luc2VydF9oaW50X3Vu aXF1ZV9wb3MoY29uc3RfaXRlcmF0b3IgX19wb3MsCiAJCQkJICAgIGNvbnN0IGtleV90eXBl JiBfX2spOwpAQCAtMTA3NSw2ICsxMjEyLDI3IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFD RV9WRVJTSU9OCiAJICByZXR1cm4gX01faW5zZXJ0X2VxdWFsXyhfX3Bvcywgc3RkOjpmb3J3 YXJkPF9Bcmc+KF9feCksIF9fYW4pOwogCX0KIAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUg X0t0LCB0eXBlbmFtZSBfQXJnPgorCXN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKwlfTV9l bXBsYWNlX3VuaXF1ZV9rdihfS3QmJiwgX0FyZyYmKTsKKworICAgICAgdGVtcGxhdGU8dHlw ZW5hbWUgX0FyZz4KKwlwYWlyPGl0ZXJhdG9yLCBib29sPgorCV9NX2VtcGxhY2VfdW5pcXVl X2F1eChfQXJnJiYgX19hcmcpCisJeworCSAgcmV0dXJuIF9NX2VtcGxhY2VfdW5pcXVlX2t2 KAorCSAgICBfU19mb3J3YXJkX2tleShfS2V5T2ZWYWx1ZXt9KHN0ZDo6Zm9yd2FyZDxfQXJn PihfX2FyZykpKSwKKwkgICAgc3RkOjpmb3J3YXJkPF9Bcmc+KF9fYXJnKSk7CisJfQorCisg ICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnPgorCXBhaXI8aXRlcmF0b3IsIGJvb2w+CisJ X01fZW1wbGFjZV91bmlxdWUoX0FyZyYmIF9fYXJnKQorCXsKKwkgIHVzaW5nIF9fdG9fdmFs dWUgPSBfQ29udmVydFRvVmFsdWVUeXBlPF9LZXlPZlZhbHVlLCB2YWx1ZV90eXBlPjsKKwkg IHJldHVybiBfTV9lbXBsYWNlX3VuaXF1ZV9hdXgoX190b192YWx1ZXt9KHN0ZDo6Zm9yd2Fy ZDxfQXJnPihfX2FyZykpKTsKKwl9CisKICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9B cmdzPgogCXBhaXI8aXRlcmF0b3IsIGJvb2w+CiAJX01fZW1wbGFjZV91bmlxdWUoX0FyZ3Mm Ji4uLiBfX2FyZ3MpOwpAQCAtMTY2Nyw2ICsxODI1LDIwIEBAIF9HTElCQ1hYX0JFR0lOX05B TUVTUEFDRV9WRVJTSU9OCiAJICByZXR1cm4gX19pdDsKIAl9CiAKKwl0ZW1wbGF0ZTx0eXBl bmFtZSBfS3QsIHR5cGVuYW1lIF9BcmcsIHR5cGVuYW1lIF9WYWx1ZT4KKwkgIHN0YXRpYyBf QXV0b19ub2RlCisJICBfU19idWlsZChfUmJfdHJlZSYgX190LAorCQkgICBfS3QmJiBfX2ss IF9BcmcmJiBfX2FyZywgc3RkOjpfU2VsZWN0MXN0PF9WYWx1ZT4pCisJICB7CisJICAgIHJl dHVybgorCSAgICAgIHsgX190LCBzdGQ6OmZvcndhcmQ8X0t0PihfX2spLCBzdGQ6OmZvcndh cmQ8X0FyZz4oX19hcmcpLnNlY29uZCB9OworCSAgfQorCisJdGVtcGxhdGU8dHlwZW5hbWUg X0t0LCB0eXBlbmFtZSBfQXJnLCB0eXBlbmFtZSBfVmFsdWU+CisJICBzdGF0aWMgX0F1dG9f bm9kZQorCSAgX1NfYnVpbGQoX1JiX3RyZWUmIF9fdCwgX0t0JiYgX19rLCBfQXJnJiYsIHN0 ZDo6X0lkZW50aXR5PF9WYWx1ZT4pCisJICB7IHJldHVybiB7IF9fdCwgc3RkOjpmb3J3YXJk PF9LdD4oX19rKSB9OyB9CisKIAlfUmJfdHJlZSYgX01fdDsKIAlfTGlua190eXBlIF9NX25v ZGU7CiAgICAgICB9OwpAQCAtMjE1Miw2ICsyMzI0LDM5IEBAIF9HTElCQ1hYX0JFR0lOX05B TUVTUEFDRV9WRVJTSU9OCiAgICAgICByZXR1cm4gX1JlcyhfX3gsIF9feSk7CiAgICAgfQog CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5 LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKwkgICB0eXBlbmFtZSBf Q29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9LdD4K KyAgICAgIGF1dG8KKyAgICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBf Q29tcGFyZSwgX0FsbG9jPjo6CisgICAgICBfTV9nZXRfaW5zZXJ0X3VuaXF1ZV9wb3NfdHIo Y29uc3QgX0t0JiBfX2spCisgICAgICAtPiBwYWlyPF9CYXNlX3B0ciwgX0Jhc2VfcHRyPgor ICAgICAgeworCXR5cGVkZWYgcGFpcjxfQmFzZV9wdHIsIF9CYXNlX3B0cj4gX1JlczsKKwlf TGlua190eXBlIF9feCA9IF9NX2JlZ2luKCk7CisJX0Jhc2VfcHRyIF9feSA9IF9NX2VuZCgp OworCWJvb2wgX19jb21wID0gdHJ1ZTsKKwl3aGlsZSAoX194ICE9IDApCisJICB7CisJICAg IF9feSA9IF9feDsKKwkgICAgX19jb21wID0gX01faW1wbC5fTV9rZXlfY29tcGFyZShfX2ss IF9TX2tleShfX3gpKTsKKwkgICAgX194ID0gX19jb21wID8gX1NfbGVmdChfX3gpIDogX1Nf cmlnaHQoX194KTsKKwkgIH0KKwlpdGVyYXRvciBfX2ogPSBpdGVyYXRvcihfX3kpOworCWlm IChfX2NvbXApCisJICB7CisJICAgIGlmIChfX2ogPT0gYmVnaW4oKSkKKwkgICAgICByZXR1 cm4gX1JlcyhfX3gsIF9feSk7CisJICAgIGVsc2UKKwkgICAgICAtLV9fajsKKwkgIH0KKwlp ZiAoX01faW1wbC5fTV9rZXlfY29tcGFyZShfU19rZXkoX19qLl9NX25vZGUpLCBfX2spKQor CSAgcmV0dXJuIF9SZXMoX194LCBfX3kpOworCXJldHVybiBfUmVzKF9fai5fTV9ub2RlLCAw KTsKKyAgICAgIH0KKyNlbmRpZgorCiAgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVu YW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAogCSAgIHR5cGVuYW1lIF9Db21wYXJl LCB0eXBlbmFtZSBfQWxsb2M+CiAjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTApAQCAtMjQz OCw2ICsyNjQzLDI0IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAJcmV0 dXJuIHtpdGVyYXRvcihfX3Jlcy5maXJzdCksIGZhbHNlfTsKICAgICAgIH0KIAorICB0ZW1w bGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1 ZSwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBs YXRlPHR5cGVuYW1lIF9LdCwgdHlwZW5hbWUgX0FyZz4KKyAgICAgIGF1dG8KKyAgICAgIF9S Yl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6Cisg ICAgICBfTV9lbXBsYWNlX3VuaXF1ZV9rdihfS3QmJiBfX2ssIF9BcmcmJiBfX2FyZykKKyAg ICAgIC0+IHBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICB7CisJYXV0byBfX3JlcyA9IF9N X2dldF9pbnNlcnRfdW5pcXVlX3Bvc190cihfX2spOworCWlmIChfX3Jlcy5zZWNvbmQpCisJ ICB7CisJICAgIF9BdXRvX25vZGUgX196ID0gX0F1dG9fbm9kZTo6X1NfYnVpbGQoKnRoaXMs CisJICAgICAgc3RkOjpmb3J3YXJkPF9LdD4oX19rKSwgc3RkOjpmb3J3YXJkPF9Bcmc+KF9f YXJnKSwgX0tleU9mVmFsdWV7fSk7CisJICAgIHJldHVybiB7IF9fei5fTV9pbnNlcnQoX19y ZXMpLCB0cnVlIH07CisJICB9CisJcmV0dXJuIHsgaXRlcmF0b3IoX19yZXMuZmlyc3QpLCBm YWxzZSB9OworICAgICAgfQorCiAgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1l IF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAogCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0 eXBlbmFtZSBfQWxsb2M+CiAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CmRpZmYg LS1naXQgYS9saWJzdGRjKystdjMvdGVzdHN1aXRlLzIzX2NvbnRhaW5lcnMvbWFwLzk2MDg4 LmNjIGIvbGlic3RkYysrLXYzL3Rlc3RzdWl0ZS8yM19jb250YWluZXJzL21hcC85NjA4OC5j YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uMTdjODA5MjQwZjQK LS0tIC9kZXYvbnVsbAorKysgYi9saWJzdGRjKystdjMvdGVzdHN1aXRlLzIzX2NvbnRhaW5l cnMvbWFwLzk2MDg4LmNjCkBAIC0wLDAgKzEsMzI1IEBACisvLyB7IGRnLWRvIHJ1biB7IHRh cmdldCBjKysxNyB9IH0KKy8vIHsgZGctcmVxdWlyZS1lZmZlY3RpdmUtdGFyZ2V0IHN0ZF9h bGxvY2F0b3JfbmV3IH0KKworLy8gQ29weXJpZ2h0IChDKSAyMDIzIEZyZWUgU29mdHdhcmUg Rm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUg SVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5 b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8g dGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi eSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywg b3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMg bGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl ZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt cGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZl ZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisvLyB3 aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQor Ly8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBsaWJzdGRjKysvOTYw ODgKKworI2luY2x1ZGUgPHN0cmluZ192aWV3PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNs dWRlIDxtYXA+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8dGVzdHN1aXRlX2hv b2tzLmg+CisjaW5jbHVkZSA8cmVwbGFjZW1lbnRfbWVtb3J5X29wZXJhdG9ycy5oPgorCitz dGF0aWMgY29uc3RleHByIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxzdGQ6OnBhaXI8Y29uc3Qg Y2hhciosIGludD4+IGxzdCA9CisgIHsgeyJsb25nX3N0cl9mb3JfZHluYW1pY19hbGxvY2F0 aW5nIiwgMX0gfTsKKwordm9pZAordGVzdDAxKCkKK3sKKyAgX19nbnVfdGVzdDo6Y291bnRl cjo6cmVzZXQoKTsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gbTsKKyAgbS5pbnNl cnQobHN0LmJlZ2luKCksIGxzdC5lbmQoKSk7CisgIFZFUklGWSggbS5zaXplKCkgPT0gMSAp OworCisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Y291bnQoKSA9PSAyICk7Cisg IFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Z2V0KCkuX01faW5jcmVtZW50cyA9PSAy ICk7CisKKyAgbS5pbnNlcnQobHN0LmJlZ2luKCksIGxzdC5lbmQoKSk7CisgIFZFUklGWSgg bS5zaXplKCkgPT0gMSApOworCisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Y291 bnQoKSA9PSAyICk7CisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Z2V0KCkuX01f aW5jcmVtZW50cyA9PSAzICk7CisKKyAgVkVSSUZZKCAhbS5lbXBsYWNlKCpsc3QuYmVnaW4o KSkuc2Vjb25kICk7CisgIFZFUklGWSggbS5zaXplKCkgPT0gMSApOworCisgIFZFUklGWSgg X19nbnVfdGVzdDo6Y291bnRlcjo6Y291bnQoKSA9PSAyICk7CisgIFZFUklGWSggX19nbnVf dGVzdDo6Y291bnRlcjo6Z2V0KCkuX01faW5jcmVtZW50cyA9PSA0ICk7Cit9CisKK3ZvaWQK K3Rlc3QwMigpCit7CisgIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OnJlc2V0KCk7CisgIHN0ZDo6 bWFwPHN0ZDo6c3RyaW5nLCBpbnQsIHN0ZDo6bGVzczxzdGQ6OnN0cmluZ192aWV3Pj4gbTsK KyAgbS5pbnNlcnQobHN0LmJlZ2luKCksIGxzdC5lbmQoKSk7CisgIFZFUklGWSggbS5zaXpl KCkgPT0gMSApOworCisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Y291bnQoKSA9 PSAyICk7CisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Z2V0KCkuX01faW5jcmVt ZW50cyA9PSAyICk7CisKKyAgbS5pbnNlcnQobHN0LmJlZ2luKCksIGxzdC5lbmQoKSk7Cisg IFZFUklGWSggbS5zaXplKCkgPT0gMSApOworCisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291 bnRlcjo6Y291bnQoKSA9PSAyICk7CisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6 Z2V0KCkuX01faW5jcmVtZW50cyA9PSAyICk7CisKKyAgVkVSSUZZKCAhbS5lbXBsYWNlKCps c3QuYmVnaW4oKSkuc2Vjb25kICk7CisgIFZFUklGWSggbS5zaXplKCkgPT0gMSApOworCisg IFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Y291bnQoKSA9PSAyICk7CisgIFZFUklG WSggX19nbnVfdGVzdDo6Y291bnRlcjo6Z2V0KCkuX01faW5jcmVtZW50cyA9PSAyICk7Cit9 CisKK2Jvb2wKK2xlc3Nfc3RyaW5nX2YoY29uc3Qgc3RkOjpzdHJpbmcmIGxocywgY29uc3Qg c3RkOjpzdHJpbmcmIHJocykgbm9leGNlcHQKK3sgcmV0dXJuIGxocyA8IHJoczsgfQorCit2 b2lkCit0ZXN0MTEoKQoreworICB0eXBlZGVmIGJvb2wgKCpsZXNzX3N0cmluZ190KShjb25z dCBzdGQ6OnN0cmluZyYsCisJCQkJY29uc3Qgc3RkOjpzdHJpbmcmKSBub2V4Y2VwdDsKKyAg X19nbnVfdGVzdDo6Y291bnRlcjo6cmVzZXQoKTsKKyAgbGVzc19zdHJpbmdfdCBjb21wYXJl ciA9ICZsZXNzX3N0cmluZ19mOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50LCBsZXNz X3N0cmluZ190PiBtKGNvbXBhcmVyKTsKKyAgbS5pbnNlcnQobHN0LmJlZ2luKCksIGxzdC5l bmQoKSk7CisgIFZFUklGWSggbS5zaXplKCkgPT0gMSApOworCisgIFZFUklGWSggX19nbnVf dGVzdDo6Y291bnRlcjo6Y291bnQoKSA9PSAyICk7CisgIFZFUklGWSggX19nbnVfdGVzdDo6 Y291bnRlcjo6Z2V0KCkuX01faW5jcmVtZW50cyA9PSAyICk7CisKKyAgbS5pbnNlcnQobHN0 LmJlZ2luKCksIGxzdC5lbmQoKSk7CisgIFZFUklGWSggbS5zaXplKCkgPT0gMSApOworCisg IFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Y291bnQoKSA9PSAyICk7CisgIFZFUklG WSggX19nbnVfdGVzdDo6Y291bnRlcjo6Z2V0KCkuX01faW5jcmVtZW50cyA9PSAzICk7Cit9 CisKK2Jvb2wKK2xlc3Nfc3RyaW5nX3ZpZXdfZihjb25zdCBzdGQ6OnN0cmluZ192aWV3JiBs aHMsCisJCSAgIGNvbnN0IHN0ZDo6c3RyaW5nX3ZpZXcmIHJocykgbm9leGNlcHQKK3sgcmV0 dXJuIGxocyA8IHJoczsgfQorCit2b2lkCit0ZXN0MTIoKQoreworICB0eXBlZGVmIGJvb2wg KCpsZXNzX3N0cmluZ3ZpZXdfdCkgKGNvbnN0IHN0ZDo6c3RyaW5nX3ZpZXcmLAorCQkJCSAg ICAgY29uc3Qgc3RkOjpzdHJpbmdfdmlldyYpIG5vZXhjZXB0OworICBfX2dudV90ZXN0Ojpj b3VudGVyOjpyZXNldCgpOworICBsZXNzX3N0cmluZ3ZpZXdfdCBjb21wYXJlciA9ICZsZXNz X3N0cmluZ192aWV3X2Y7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQsIGxlc3Nfc3Ry aW5ndmlld190PiBtKGNvbXBhcmVyKTsKKyAgbS5pbnNlcnQobHN0LmJlZ2luKCksIGxzdC5l bmQoKSk7CisgIFZFUklGWSggbS5zaXplKCkgPT0gMSApOworCisgIFZFUklGWSggX19nbnVf dGVzdDo6Y291bnRlcjo6Y291bnQoKSA9PSAyICk7CisgIFZFUklGWSggX19nbnVfdGVzdDo6 Y291bnRlcjo6Z2V0KCkuX01faW5jcmVtZW50cyA9PSAyICk7CisKKyAgbS5pbnNlcnQobHN0 LmJlZ2luKCksIGxzdC5lbmQoKSk7CisgIFZFUklGWSggbS5zaXplKCkgPT0gMSApOworCisg IFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Y291bnQoKSA9PSAyICk7CisgIFZFUklG WSggX19nbnVfdGVzdDo6Y291bnRlcjo6Z2V0KCkuX01faW5jcmVtZW50cyA9PSAyICk7Cit9 CisKK3N0cnVjdCBsZXNzX3N0cmluZ19mdW5jdG9yCit7CisgIGJvb2wKKyAgb3BlcmF0b3Io KShjb25zdCBzdGQ6OnN0cmluZyYgbGhzLAorCSAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHJo cykgY29uc3Qgbm9leGNlcHQKKyAgeyByZXR1cm4gbGhzIDwgcmhzOyB9Cit9OworCit2b2lk Cit0ZXN0MjEoKQoreworICBfX2dudV90ZXN0Ojpjb3VudGVyOjpyZXNldCgpOworICBzdGQ6 Om1hcDxzdGQ6OnN0cmluZywgaW50LCBsZXNzX3N0cmluZ19mdW5jdG9yPiBtOworICBtLmlu c2VydChsc3QuYmVnaW4oKSwgbHN0LmVuZCgpKTsKKyAgVkVSSUZZKCBtLnNpemUoKSA9PSAx ICk7CisKKyAgVkVSSUZZKCBfX2dudV90ZXN0Ojpjb3VudGVyOjpjb3VudCgpID09IDIgKTsK KyAgVkVSSUZZKCBfX2dudV90ZXN0Ojpjb3VudGVyOjpnZXQoKS5fTV9pbmNyZW1lbnRzID09 IDIgKTsKKworICBtLmluc2VydChsc3QuYmVnaW4oKSwgbHN0LmVuZCgpKTsKKyAgVkVSSUZZ KCBtLnNpemUoKSA9PSAxICk7CisKKyAgVkVSSUZZKCBfX2dudV90ZXN0Ojpjb3VudGVyOjpj b3VudCgpID09IDIgKTsKKyAgVkVSSUZZKCBfX2dudV90ZXN0Ojpjb3VudGVyOjpnZXQoKS5f TV9pbmNyZW1lbnRzID09IDMgKTsKK30KKworc3RydWN0IGxlc3Nfc3RyaW5nX3ZpZXdfbm9l eGNlcHRfZnVuY3RvcgoreworICBib29sCisgIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpzdHJp bmdfdmlldyYgbGhzLAorCSAgICAgY29uc3Qgc3RkOjpzdHJpbmdfdmlldyYgcmhzKSBjb25z dCBub2V4Y2VwdAorICB7IHJldHVybiBsaHMgPCByaHM7IH0KK307CisKK3ZvaWQKK3Rlc3Qy MigpCit7CisgIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OnJlc2V0KCk7CisgIHN0ZDo6bWFwPHN0 ZDo6c3RyaW5nLCBpbnQsIGxlc3Nfc3RyaW5nX3ZpZXdfbm9leGNlcHRfZnVuY3Rvcj4gbTsK KyAgbS5pbnNlcnQobHN0LmJlZ2luKCksIGxzdC5lbmQoKSk7CisgIFZFUklGWSggbS5zaXpl KCkgPT0gMSApOworCisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Y291bnQoKSA9 PSAyICk7CisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Z2V0KCkuX01faW5jcmVt ZW50cyA9PSAyICk7CisKKyAgbS5pbnNlcnQobHN0LmJlZ2luKCksIGxzdC5lbmQoKSk7Cisg IFZFUklGWSggbS5zaXplKCkgPT0gMSApOworCisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291 bnRlcjo6Y291bnQoKSA9PSAyICk7CisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6 Z2V0KCkuX01faW5jcmVtZW50cyA9PSAzICk7Cit9CisKK3N0cnVjdCBsZXNzX3N0cmluZ192 aWV3X2Z1bmN0b3IKK3sKKyAgYm9vbAorICBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6c3RyaW5n X3ZpZXcmIGxocywKKwkgICAgIGNvbnN0IHN0ZDo6c3RyaW5nX3ZpZXcmIHJocykgY29uc3QK KyAgeyByZXR1cm4gbGhzIDwgcmhzOyB9Cit9OworCit2b2lkCit0ZXN0MjMoKQoreworICBf X2dudV90ZXN0Ojpjb3VudGVyOjpyZXNldCgpOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywg aW50LCBsZXNzX3N0cmluZ192aWV3X2Z1bmN0b3I+IG07CisgIG0uaW5zZXJ0KGxzdC5iZWdp bigpLCBsc3QuZW5kKCkpOworICBWRVJJRlkoIG0uc2l6ZSgpID09IDEgKTsKKworICBWRVJJ RlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmNvdW50KCkgPT0gMiApOworICBWRVJJRlkoIF9f Z251X3Rlc3Q6OmNvdW50ZXI6OmdldCgpLl9NX2luY3JlbWVudHMgPT0gMiApOworCisgIG0u aW5zZXJ0KGxzdC5iZWdpbigpLCBsc3QuZW5kKCkpOworICBWRVJJRlkoIG0uc2l6ZSgpID09 IDEgKTsKKworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmNvdW50KCkgPT0gMiAp OworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmdldCgpLl9NX2luY3JlbWVudHMg PT0gMyApOworfQorCitzdHJ1Y3QgbGVzc19zdHJpbmdfdmlld19ub2V4Y2VwdF90cmFuc3Bh cmVudF9mdW5jdG9yCit7CisgIGJvb2wKKyAgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnN0cmlu Z192aWV3JiBsaHMsCisJICAgICBjb25zdCBzdGQ6OnN0cmluZ192aWV3JiByaHMpIGNvbnN0 IG5vZXhjZXB0CisgIHsgcmV0dXJuIGxocyA8IHJoczsgfQorCisgIHR5cGVkZWYgc3RkOjpf X2lzX3RyYW5zcGFyZW50IGlzX3RyYW5zcGFyZW50OworfTsKKwordm9pZAordGVzdDI0KCkK K3sKKyAgX19nbnVfdGVzdDo6Y291bnRlcjo6cmVzZXQoKTsKKyAgc3RkOjptYXA8c3RkOjpz dHJpbmcsIGludCwKKwkgICBsZXNzX3N0cmluZ192aWV3X25vZXhjZXB0X3RyYW5zcGFyZW50 X2Z1bmN0b3I+IG07CisgIG0uaW5zZXJ0KGxzdC5iZWdpbigpLCBsc3QuZW5kKCkpOworICBW RVJJRlkoIG0uc2l6ZSgpID09IDEgKTsKKworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50 ZXI6OmNvdW50KCkgPT0gMiApOworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6Omdl dCgpLl9NX2luY3JlbWVudHMgPT0gMiApOworCisgIG0uaW5zZXJ0KGxzdC5iZWdpbigpLCBs c3QuZW5kKCkpOworICBWRVJJRlkoIG0uc2l6ZSgpID09IDEgKTsKKworICBWRVJJRlkoIF9f Z251X3Rlc3Q6OmNvdW50ZXI6OmNvdW50KCkgPT0gMiApOworICBWRVJJRlkoIF9fZ251X3Rl c3Q6OmNvdW50ZXI6OmdldCgpLl9NX2luY3JlbWVudHMgPT0gMiApOworfQorCitzdHJ1Y3Qg bGVzc19zdHJpbmdfdmlld190cmFuc3BhcmVudF9mdW5jdG9yCit7CisgIGJvb2wKKyAgb3Bl cmF0b3IoKShjb25zdCBzdGQ6OnN0cmluZ192aWV3JiBsaHMsCisJICAgICBjb25zdCBzdGQ6 OnN0cmluZ192aWV3JiByaHMpIGNvbnN0CisgIHsgcmV0dXJuIGxocyA8IHJoczsgfQorCisg IHR5cGVkZWYgc3RkOjpfX2lzX3RyYW5zcGFyZW50IGlzX3RyYW5zcGFyZW50OworfTsKKwor dm9pZAordGVzdDI1KCkKK3sKKyAgX19nbnVfdGVzdDo6Y291bnRlcjo6cmVzZXQoKTsKKyAg c3RkOjptYXA8c3RkOjpzdHJpbmcsIGludCwgbGVzc19zdHJpbmdfdmlld190cmFuc3BhcmVu dF9mdW5jdG9yPiBtOworICBtLmluc2VydChsc3QuYmVnaW4oKSwgbHN0LmVuZCgpKTsKKyAg VkVSSUZZKCBtLnNpemUoKSA9PSAxICk7CisKKyAgVkVSSUZZKCBfX2dudV90ZXN0Ojpjb3Vu dGVyOjpjb3VudCgpID09IDIgKTsKKyAgVkVSSUZZKCBfX2dudV90ZXN0Ojpjb3VudGVyOjpn ZXQoKS5fTV9pbmNyZW1lbnRzID09IDIgKTsKKworICBtLmluc2VydChsc3QuYmVnaW4oKSwg bHN0LmVuZCgpKTsKKyAgVkVSSUZZKCBtLnNpemUoKSA9PSAxICk7CisKKyAgVkVSSUZZKCBf X2dudV90ZXN0Ojpjb3VudGVyOjpjb3VudCgpID09IDIgKTsKKyAgVkVSSUZZKCBfX2dudV90 ZXN0Ojpjb3VudGVyOjpnZXQoKS5fTV9pbmNyZW1lbnRzID09IDIgKTsKK30KKwordm9pZAor dGVzdDAzKCkKK3sKKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBpbnQ+ PiB2OworICB2Lmluc2VydCh2LmVuZCgpLCBsc3QuYmVnaW4oKSwgbHN0LmVuZCgpKTsKKwor ICBjb25zdCBhdXRvIG9yaWdpbiA9IF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmNvdW50KCk7CisK KyAgeworICAgIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OnJlc2V0KCk7CisgICAgc3RkOjptYXA8 c3RkOjpzdHJpbmcsIGludCwgc3RkOjpsZXNzPHN0ZDo6c3RyaW5nX3ZpZXc+PiBtOworICAg IG0uaW5zZXJ0KHYuYmVnaW4oKSwgdi5lbmQoKSk7CisgICAgVkVSSUZZKCBtLnNpemUoKSA9 PSAxICk7CisKKyAgICAvLyBBbGxvY2F0ZSBhIG5vZGUgYW5kIHRoZSBzdGQ6OnN0cmluZyAo dW5sZXNzIENPVykuCisgICAgY29uc3RleHByIHN0ZDo6c2l6ZV90IGluY3JlbWVudHMgPSBf R0xJQkNYWF9VU0VfQ1hYMTFfQUJJID8gMiA6IDE7CisKKyAgICBWRVJJRlkoIF9fZ251X3Rl c3Q6OmNvdW50ZXI6OmNvdW50KCkgPT0gb3JpZ2luICsgaW5jcmVtZW50cyApOworICAgIFZF UklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Z2V0KCkuX01faW5jcmVtZW50cyA9PSBpbmNy ZW1lbnRzICk7CisKKyAgICBtLmluc2VydCh2LmJlZ2luKCksIHYuZW5kKCkpOworICAgIFZF UklGWSggbS5zaXplKCkgPT0gMSApOworCisgICAgVkVSSUZZKCBfX2dudV90ZXN0Ojpjb3Vu dGVyOjpjb3VudCgpID09IG9yaWdpbiArIGluY3JlbWVudHMgKTsKKyAgICBWRVJJRlkoIF9f Z251X3Rlc3Q6OmNvdW50ZXI6OmdldCgpLl9NX2luY3JlbWVudHMgPT0gaW5jcmVtZW50cyAp OworICB9CisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Y291bnQoKSA9PSBvcmln aW4gKTsKKworICB7CisgICAgX19nbnVfdGVzdDo6Y291bnRlcjo6cmVzZXQoKTsKKyAgICBz dGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50LCBzdGQ6Omxlc3M8c3RkOjpzdHJpbmdfdmlldz4+ IG07CisgICAgbS5pbnNlcnQoc3RkOjptYWtlX21vdmVfaXRlcmF0b3Iodi5iZWdpbigpKSwK KwkgICAgIHN0ZDo6bWFrZV9tb3ZlX2l0ZXJhdG9yKHYuZW5kKCkpKTsKKyAgICBWRVJJRlko IG0uc2l6ZSgpID09IDEgKTsKKworICAgIC8vIEFsbG9jYXRlIGEgbm9kZS4gU3RyaW5nIGlz IG1vdmVkLgorICAgIGNvbnN0ZXhwciBzdGQ6OnNpemVfdCBpbmNyZW1lbnRzID0gMTsKKwor ICAgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Y291bnQoKSA9PSBvcmlnaW4gKyBp bmNyZW1lbnRzICk7CisgICAgVkVSSUZZKCBfX2dudV90ZXN0Ojpjb3VudGVyOjpnZXQoKS5f TV9pbmNyZW1lbnRzID09IGluY3JlbWVudHMgKTsKKyAgfQorfQorCitpbnQKK21haW4oKQor eworICB0ZXN0MDEoKTsKKyAgdGVzdDAyKCk7CisgIHRlc3QxMSgpOworICB0ZXN0MTIoKTsK KyAgdGVzdDIxKCk7CisgIHRlc3QyMigpOworICB0ZXN0MjMoKTsKKyAgdGVzdDI0KCk7Cisg IHRlc3QyNSgpOworICB0ZXN0MDMoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9s aWJzdGRjKystdjMvdGVzdHN1aXRlLzIzX2NvbnRhaW5lcnMvbXVsdGltYXAvOTYwODguY2Mg Yi9saWJzdGRjKystdjMvdGVzdHN1aXRlLzIzX2NvbnRhaW5lcnMvbXVsdGltYXAvOTYwODgu Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjkxOWM1ZTU5Yzcx Ci0tLSAvZGV2L251bGwKKysrIGIvbGlic3RkYysrLXYzL3Rlc3RzdWl0ZS8yM19jb250YWlu ZXJzL211bHRpbWFwLzk2MDg4LmNjCkBAIC0wLDAgKzEsNjUgQEAKKy8vIHsgZGctZG8gcnVu IHsgdGFyZ2V0IGMrKzE3IH0gfQorLy8geyBkZy1yZXF1aXJlLWVmZmVjdGl2ZS10YXJnZXQg c3RkX2FsbG9jYXRvcl9uZXcgfQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgRnJlZSBTb2Z0 d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhl IEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdh cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhl CisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlz aGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lv biAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8g VGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi ZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0 aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gWW91IHNob3VsZCBoYXZlIHJl Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcK Ky8vIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qg c2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIGxpYnN0ZGMr Ky85NjA4OAorCisjaW5jbHVkZSA8c3RyaW5nX3ZpZXc+CisjaW5jbHVkZSA8c3RyaW5nPgor I2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgPHRlc3RzdWl0ZV9ob29rcy5oPgorI2luY2x1 ZGUgPHJlcGxhY2VtZW50X21lbW9yeV9vcGVyYXRvcnMuaD4KKworc3RhdGljIGNvbnN0ZXhw ciBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8c3RkOjpwYWlyPGNvbnN0IGNoYXIqLCBpbnQ+PiBs c3QgPSB7CisgICAgeyJsb25nX3N0cl9mb3JfZHluYW1pY19hbGxvY2F0aW5nIiwgMX0KK307 CisKK3ZvaWQKK3Rlc3QwMSgpCit7CisgIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OnJlc2V0KCk7 CisgIHN0ZDo6bXVsdGltYXA8c3RkOjpzdHJpbmcsIGludCwKKwkJc3RkOjpsZXNzPHN0ZDo6 c3RyaW5nX3ZpZXc+PiBmb287CisgIGZvby5pbnNlcnQobHN0LmJlZ2luKCksIGxzdC5lbmQo KSk7CisgIFZFUklGWSggZm9vLnNpemUoKSA9PSAxICk7CisKKyAgVkVSSUZZKCBfX2dudV90 ZXN0Ojpjb3VudGVyOjpjb3VudCgpID09IDIgKTsKKyAgVkVSSUZZKCBfX2dudV90ZXN0Ojpj b3VudGVyOjpnZXQoKS5fTV9pbmNyZW1lbnRzID09IDIgKTsKK30KKwordm9pZAordGVzdDAy KCkKK3sKKyAgX19nbnVfdGVzdDo6Y291bnRlcjo6cmVzZXQoKTsKKyAgc3RkOjptdWx0aW1h cDxzdGQ6OnN0cmluZywgaW50PiBmb287CisgIGZvby5pbnNlcnQobHN0LmJlZ2luKCksIGxz dC5lbmQoKSk7CisgIFZFUklGWSggZm9vLnNpemUoKSA9PSAxICk7CisKKyAgVkVSSUZZKCBf X2dudV90ZXN0Ojpjb3VudGVyOjpjb3VudCgpID09IDIgKTsKKyAgVkVSSUZZKCBfX2dudV90 ZXN0Ojpjb3VudGVyOjpnZXQoKS5fTV9pbmNyZW1lbnRzID09IDIgKTsKK30KKworaW50Citt YWluKCkKK3sKKyAgdGVzdDAxKCk7CisgIHRlc3QwMigpOworICByZXR1cm4gMDsKK30KZGlm ZiAtLWdpdCBhL2xpYnN0ZGMrKy12My90ZXN0c3VpdGUvMjNfY29udGFpbmVycy9tdWx0aXNl dC85NjA4OC5jYyBiL2xpYnN0ZGMrKy12My90ZXN0c3VpdGUvMjNfY29udGFpbmVycy9tdWx0 aXNldC85NjA4OC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4u MmNkYzA4YWJhNTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzdGRjKystdjMvdGVzdHN1aXRl LzIzX2NvbnRhaW5lcnMvbXVsdGlzZXQvOTYwODguY2MKQEAgLTAsMCArMSw2NCBAQAorLy8g eyBkZy1kbyBydW4geyB0YXJnZXQgYysrMTcgfSB9CisvLyB7IGRnLXJlcXVpcmUtZWZmZWN0 aXZlLXRhcmdldCBzdGRfYWxsb2NhdG9yX25ldyB9CisKKy8vIENvcHlyaWdodCAoQykgMjAy MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMg cGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVl CisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBp dCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp dGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJz aW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh dCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0 aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkg b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUg R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBZb3Ugc2hv dWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZSBhbG9uZworLy8gd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5H My4gIElmIG5vdCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKwor Ly8gbGlic3RkYysrLzk2MDg4CisKKyNpbmNsdWRlIDxzdHJpbmdfdmlldz4KKyNpbmNsdWRl IDxzdHJpbmc+CisjaW5jbHVkZSA8c2V0PgorCisjaW5jbHVkZSA8dGVzdHN1aXRlX2hvb2tz Lmg+CisjaW5jbHVkZSA8cmVwbGFjZW1lbnRfbWVtb3J5X29wZXJhdG9ycy5oPgorCitzdGF0 aWMgY29uc3RleHByIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBjaGFyKj4gbHN0ID0g eworICAibG9uZ19zdHJfZm9yX2R5bmFtaWNfYWxsb2NhdGluZyIKK307CisKK3ZvaWQKK3Rl c3QwMSgpCit7CisgIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OnJlc2V0KCk7CisgIHN0ZDo6bXVs dGlzZXQ8c3RkOjpzdHJpbmcsIHN0ZDo6bGVzczxzdGQ6OnN0cmluZ192aWV3Pj4gZm9vOwor ICBmb28uaW5zZXJ0KGxzdC5iZWdpbigpLCBsc3QuZW5kKCkpOworICBWRVJJRlkoIGZvby5z aXplKCkgPT0gMSApOworCisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Y291bnQo KSA9PSAyICk7CisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Z2V0KCkuX01faW5j cmVtZW50cyA9PSAyICk7Cit9CisKK3ZvaWQKK3Rlc3QwMigpCit7CisgIF9fZ251X3Rlc3Q6 OmNvdW50ZXI6OnJlc2V0KCk7CisgIHN0ZDo6bXVsdGlzZXQ8c3RkOjpzdHJpbmc+IGZvbzsK KyAgZm9vLmluc2VydChsc3QuYmVnaW4oKSwgbHN0LmVuZCgpKTsKKyAgVkVSSUZZKCBmb28u c2l6ZSgpID09IDEgKTsKKworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmNvdW50 KCkgPT0gMiApOworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmdldCgpLl9NX2lu Y3JlbWVudHMgPT0gMiApOworfQorCitpbnQKK21haW4oKQoreworICB0ZXN0MDEoKTsKKyAg dGVzdDAyKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGlic3RkYysrLXYzL3Rl c3RzdWl0ZS8yM19jb250YWluZXJzL3NldC85NjA4OC5jYyBiL2xpYnN0ZGMrKy12My90ZXN0 c3VpdGUvMjNfY29udGFpbmVycy9zZXQvOTYwODguY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMDAwMDAuLmE2ZGE4ZWNkYTI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGli c3RkYysrLXYzL3Rlc3RzdWl0ZS8yM19jb250YWluZXJzL3NldC85NjA4OC5jYwpAQCAtMCww ICsxLDMyNSBAQAorLy8geyBkZy1kbyBydW4geyB0YXJnZXQgYysrMTcgfSB9CisvLyB7IGRn LXJlcXVpcmUtZWZmZWN0aXZlLXRhcmdldCBzdGRfYWxsb2NhdG9yX25ldyB9CisKKy8vIENv cHlyaWdodCAoQykgMjAyMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisv LyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMg bGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg YW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJl IEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8v IGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQg aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFO WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBN RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT ZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz LgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworLy8gd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0 aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcv bGljZW5zZXMvPi4KKworLy8gbGlic3RkYysrLzk2MDg4CisKKyNpbmNsdWRlIDxzdHJpbmdf dmlldz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHZl Y3Rvcj4KKworI2luY2x1ZGUgPHRlc3RzdWl0ZV9ob29rcy5oPgorI2luY2x1ZGUgPHJlcGxh Y2VtZW50X21lbW9yeV9vcGVyYXRvcnMuaD4KKworc3RhdGljIGNvbnN0ZXhwciBzdGQ6Omlu aXRpYWxpemVyX2xpc3Q8Y29uc3QgY2hhcio+IGxzdCA9IHsKKyAgImxvbmdfc3RyX2Zvcl9k eW5hbWljX2FsbG9jYXRpbmciCit9OworCit2b2lkCit0ZXN0MDEoKQoreworICBfX2dudV90 ZXN0Ojpjb3VudGVyOjpyZXNldCgpOworICBzdGQ6OnNldDxzdGQ6OnN0cmluZywgc3RkOjpn cmVhdGVyPHN0ZDo6c3RyaW5nPj4gczsKKyAgcy5pbnNlcnQobHN0LmJlZ2luKCksIGxzdC5l bmQoKSk7CisgIFZFUklGWSggcy5zaXplKCkgPT0gMSApOworCisgIFZFUklGWSggX19nbnVf dGVzdDo6Y291bnRlcjo6Y291bnQoKSA9PSAyICk7CisgIFZFUklGWSggX19nbnVfdGVzdDo6 Y291bnRlcjo6Z2V0KCkuX01faW5jcmVtZW50cyA9PSAyICk7CisKKyAgcy5pbnNlcnQobHN0 LmJlZ2luKCksIGxzdC5lbmQoKSk7CisgIFZFUklGWSggcy5zaXplKCkgPT0gMSApOworCisg IFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Y291bnQoKSA9PSAyICk7CisgIFZFUklG WSggX19nbnVfdGVzdDo6Y291bnRlcjo6Z2V0KCkuX01faW5jcmVtZW50cyA9PSAzICk7CisK KyAgcy5lbXBsYWNlKCpsc3QuYmVnaW4oKSk7CisgIFZFUklGWSggcy5zaXplKCkgPT0gMSAp OworCisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Y291bnQoKSA9PSAyICk7Cisg IFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Z2V0KCkuX01faW5jcmVtZW50cyA9PSA0 ICk7Cit9CisKK3ZvaWQKK3Rlc3QwMigpCit7CisgIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OnJl c2V0KCk7CisgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nLCBzdGQ6OmdyZWF0ZXI8c3RkOjpzdHJp bmdfdmlldz4+IHM7CisgIHMuaW5zZXJ0KGxzdC5iZWdpbigpLCBsc3QuZW5kKCkpOworICBW RVJJRlkoIHMuc2l6ZSgpID09IDEgKTsKKworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50 ZXI6OmNvdW50KCkgPT0gMiApOworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6Omdl dCgpLl9NX2luY3JlbWVudHMgPT0gMiApOworCisgIHMuaW5zZXJ0KGxzdC5iZWdpbigpLCBs c3QuZW5kKCkpOworICBWRVJJRlkoIHMuc2l6ZSgpID09IDEgKTsKKworICBWRVJJRlkoIF9f Z251X3Rlc3Q6OmNvdW50ZXI6OmNvdW50KCkgPT0gMiApOworICBWRVJJRlkoIF9fZ251X3Rl c3Q6OmNvdW50ZXI6OmdldCgpLl9NX2luY3JlbWVudHMgPT0gMiApOworCisgIHMuZW1wbGFj ZSgqbHN0LmJlZ2luKCkpOworICBWRVJJRlkoIHMuc2l6ZSgpID09IDEgKTsKKworICBWRVJJ RlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmNvdW50KCkgPT0gMiApOworICBWRVJJRlkoIF9f Z251X3Rlc3Q6OmNvdW50ZXI6OmdldCgpLl9NX2luY3JlbWVudHMgPT0gMiApOworfQorCiti b29sCitsZXNzX3N0cmluZ19mKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaHMsIGNvbnN0IHN0ZDo6 c3RyaW5nJiByaHMpIG5vZXhjZXB0Cit7IHJldHVybiBsaHMgPCByaHM7IH0KKwordm9pZAor dGVzdDExKCkKK3sKKyAgdHlwZWRlZiBib29sICgqbGVzc19zdHJpbmdfdCkoY29uc3Qgc3Rk OjpzdHJpbmcmLAorCQkJCWNvbnN0IHN0ZDo6c3RyaW5nJikgbm9leGNlcHQ7CisgIF9fZ251 X3Rlc3Q6OmNvdW50ZXI6OnJlc2V0KCk7CisgIGxlc3Nfc3RyaW5nX3QgbGVzcyA9ICZsZXNz X3N0cmluZ19mOworICBzdGQ6OnNldDxzdGQ6OnN0cmluZywgbGVzc19zdHJpbmdfdD4gcyhs ZXNzKTsKKyAgcy5pbnNlcnQobHN0LmJlZ2luKCksIGxzdC5lbmQoKSk7CisgIFZFUklGWSgg cy5zaXplKCkgPT0gMSApOworCisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Y291 bnQoKSA9PSAyICk7CisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Z2V0KCkuX01f aW5jcmVtZW50cyA9PSAyICk7CisKKyAgcy5pbnNlcnQobHN0LmJlZ2luKCksIGxzdC5lbmQo KSk7CisgIFZFUklGWSggcy5zaXplKCkgPT0gMSApOworCisgIFZFUklGWSggX19nbnVfdGVz dDo6Y291bnRlcjo6Y291bnQoKSA9PSAyICk7CisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291 bnRlcjo6Z2V0KCkuX01faW5jcmVtZW50cyA9PSAzICk7Cit9CisKK2Jvb2wKK2xlc3Nfc3Ry aW5nX3ZpZXdfZihjb25zdCBzdGQ6OnN0cmluZ192aWV3JiBsaHMsCisJCSAgIGNvbnN0IHN0 ZDo6c3RyaW5nX3ZpZXcmIHJocykgbm9leGNlcHQKK3sgcmV0dXJuIGxocyA8IHJoczsgfQor Cit2b2lkCit0ZXN0MTIoKQoreworICB0eXBlZGVmIGJvb2wgKCpsZXNzX3N0cmluZ3ZpZXdf dCkoY29uc3Qgc3RkOjpzdHJpbmdfdmlldyYsCisJCQkJICAgIGNvbnN0IHN0ZDo6c3RyaW5n X3ZpZXcmKSBub2V4Y2VwdDsKKyAgX19nbnVfdGVzdDo6Y291bnRlcjo6cmVzZXQoKTsKKyAg bGVzc19zdHJpbmd2aWV3X3QgbGVzcyA9ICZsZXNzX3N0cmluZ192aWV3X2Y7CisgIHN0ZDo6 c2V0PHN0ZDo6c3RyaW5nLCBsZXNzX3N0cmluZ3ZpZXdfdD4gcyhsZXNzKTsKKyAgcy5pbnNl cnQobHN0LmJlZ2luKCksIGxzdC5lbmQoKSk7CisgIFZFUklGWSggcy5zaXplKCkgPT0gMSAp OworCisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Y291bnQoKSA9PSAyICk7Cisg IFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Z2V0KCkuX01faW5jcmVtZW50cyA9PSAy ICk7CisKKyAgcy5pbnNlcnQobHN0LmJlZ2luKCksIGxzdC5lbmQoKSk7CisgIFZFUklGWSgg cy5zaXplKCkgPT0gMSApOworCisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Y291 bnQoKSA9PSAyICk7CisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Z2V0KCkuX01f aW5jcmVtZW50cyA9PSAyICk7Cit9CisKK3N0cnVjdCBsZXNzX3N0cmluZ19mdW5jdG9yCit7 CisgIGJvb2wKKyAgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnN0cmluZyYgbGhzLCBjb25zdCBz dGQ6OnN0cmluZyYgcmhzKSBjb25zdCBub2V4Y2VwdAorICB7IHJldHVybiBsaHMgPCByaHM7 IH0KK307CisKK3ZvaWQKK3Rlc3QyMSgpCit7CisgIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OnJl c2V0KCk7CisgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nLCBsZXNzX3N0cmluZ19mdW5jdG9yPiBz OworICBzLmluc2VydChsc3QuYmVnaW4oKSwgbHN0LmVuZCgpKTsKKyAgVkVSSUZZKCBzLnNp emUoKSA9PSAxICk7CisKKyAgVkVSSUZZKCBfX2dudV90ZXN0Ojpjb3VudGVyOjpjb3VudCgp ID09IDIgKTsKKyAgVkVSSUZZKCBfX2dudV90ZXN0Ojpjb3VudGVyOjpnZXQoKS5fTV9pbmNy ZW1lbnRzID09IDIgKTsKKworICBzLmluc2VydChsc3QuYmVnaW4oKSwgbHN0LmVuZCgpKTsK KyAgVkVSSUZZKCBzLnNpemUoKSA9PSAxICk7CisKKyAgVkVSSUZZKCBfX2dudV90ZXN0Ojpj b3VudGVyOjpjb3VudCgpID09IDIgKTsKKyAgVkVSSUZZKCBfX2dudV90ZXN0Ojpjb3VudGVy OjpnZXQoKS5fTV9pbmNyZW1lbnRzID09IDMgKTsKK30KKworc3RydWN0IGxlc3Nfc3RyaW5n X3ZpZXdfbm9leGNlcHRfZnVuY3RvcgoreworICBib29sCisgIG9wZXJhdG9yKCkoY29uc3Qg c3RkOjpzdHJpbmdfdmlldyYgbGhzLAorCSAgICAgY29uc3Qgc3RkOjpzdHJpbmdfdmlldyYg cmhzKSBjb25zdCBub2V4Y2VwdAorICB7IHJldHVybiBsaHMgPCByaHM7IH0KK307CisKK3Zv aWQKK3Rlc3QyMigpCit7CisgIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OnJlc2V0KCk7CisgIHN0 ZDo6c2V0PHN0ZDo6c3RyaW5nLCBsZXNzX3N0cmluZ192aWV3X25vZXhjZXB0X2Z1bmN0b3I+ IHM7CisgIHMuaW5zZXJ0KGxzdC5iZWdpbigpLCBsc3QuZW5kKCkpOworICBWRVJJRlkoIHMu c2l6ZSgpID09IDEgKTsKKworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmNvdW50 KCkgPT0gMiApOworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmdldCgpLl9NX2lu Y3JlbWVudHMgPT0gMiApOworCisgIHMuaW5zZXJ0KGxzdC5iZWdpbigpLCBsc3QuZW5kKCkp OworICBWRVJJRlkoIHMuc2l6ZSgpID09IDEgKTsKKworICBWRVJJRlkoIF9fZ251X3Rlc3Q6 OmNvdW50ZXI6OmNvdW50KCkgPT0gMiApOworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50 ZXI6OmdldCgpLl9NX2luY3JlbWVudHMgPT0gMyApOworfQorCitzdHJ1Y3QgbGVzc19zdHJp bmdfdmlld19mdW5jdG9yCit7CisgIGJvb2wKKyAgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnN0 cmluZ192aWV3JiBsaHMsCisJICAgICBjb25zdCBzdGQ6OnN0cmluZ192aWV3JiByaHMpIGNv bnN0CisgIHsgcmV0dXJuIGxocyA8IHJoczsgfQorfTsKKwordm9pZAordGVzdDIzKCkKK3sK KyAgX19nbnVfdGVzdDo6Y291bnRlcjo6cmVzZXQoKTsKKyAgc3RkOjpzZXQ8c3RkOjpzdHJp bmcsIGxlc3Nfc3RyaW5nX3ZpZXdfZnVuY3Rvcj4gczsKKyAgcy5pbnNlcnQobHN0LmJlZ2lu KCksIGxzdC5lbmQoKSk7CisgIFZFUklGWSggcy5zaXplKCkgPT0gMSApOworCisgIFZFUklG WSggX19nbnVfdGVzdDo6Y291bnRlcjo6Y291bnQoKSA9PSAyICk7CisgIFZFUklGWSggX19n bnVfdGVzdDo6Y291bnRlcjo6Z2V0KCkuX01faW5jcmVtZW50cyA9PSAyICk7CisKKyAgcy5p bnNlcnQobHN0LmJlZ2luKCksIGxzdC5lbmQoKSk7CisgIFZFUklGWSggcy5zaXplKCkgPT0g MSApOworCisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Y291bnQoKSA9PSAyICk7 CisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Z2V0KCkuX01faW5jcmVtZW50cyA9 PSAzICk7Cit9CisKK3N0cnVjdCBsZXNzX3N0cmluZ192aWV3X25vZXhjZXB0X3RyYW5zcGFy ZW50X2Z1bmN0b3IKK3sKKyAgYm9vbAorICBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6c3RyaW5n X3ZpZXcmIGxocywKKwkgICAgIGNvbnN0IHN0ZDo6c3RyaW5nX3ZpZXcmIHJocykgY29uc3Qg bm9leGNlcHQKKyAgeyByZXR1cm4gbGhzIDwgcmhzOyB9CisKKyAgdHlwZWRlZiBzdGQ6Ol9f aXNfdHJhbnNwYXJlbnQgaXNfdHJhbnNwYXJlbnQ7Cit9OworCit2b2lkCit0ZXN0MjQoKQor eworICBfX2dudV90ZXN0Ojpjb3VudGVyOjpyZXNldCgpOworICBzdGQ6OnNldDxzdGQ6OnN0 cmluZywKKwkgICBsZXNzX3N0cmluZ192aWV3X25vZXhjZXB0X3RyYW5zcGFyZW50X2Z1bmN0 b3I+IHM7CisgIHMuaW5zZXJ0KGxzdC5iZWdpbigpLCBsc3QuZW5kKCkpOworICBWRVJJRlko IHMuc2l6ZSgpID09IDEgKTsKKworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmNv dW50KCkgPT0gMiApOworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmdldCgpLl9N X2luY3JlbWVudHMgPT0gMiApOworCisgIHMuaW5zZXJ0KGxzdC5iZWdpbigpLCBsc3QuZW5k KCkpOworICBWRVJJRlkoIHMuc2l6ZSgpID09IDEgKTsKKworICBWRVJJRlkoIF9fZ251X3Rl c3Q6OmNvdW50ZXI6OmNvdW50KCkgPT0gMiApOworICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNv dW50ZXI6OmdldCgpLl9NX2luY3JlbWVudHMgPT0gMiApOworfQorCitzdHJ1Y3QgbGVzc19z dHJpbmdfdmlld190cmFuc3BhcmVudF9mdW5jdG9yCit7CisgIGJvb2wKKyAgb3BlcmF0b3Io KShjb25zdCBzdGQ6OnN0cmluZ192aWV3JiBsaHMsCisJICAgICBjb25zdCBzdGQ6OnN0cmlu Z192aWV3JiByaHMpIGNvbnN0CisgIHsgcmV0dXJuIGxocyA8IHJoczsgfQorCisgIHR5cGVk ZWYgc3RkOjpfX2lzX3RyYW5zcGFyZW50IGlzX3RyYW5zcGFyZW50OworfTsKKwordm9pZAor dGVzdDI1KCkKK3sKKyAgX19nbnVfdGVzdDo6Y291bnRlcjo6cmVzZXQoKTsKKyAgc3RkOjpz ZXQ8c3RkOjpzdHJpbmcsIGxlc3Nfc3RyaW5nX3ZpZXdfdHJhbnNwYXJlbnRfZnVuY3Rvcj4g czsKKyAgcy5pbnNlcnQobHN0LmJlZ2luKCksIGxzdC5lbmQoKSk7CisgIFZFUklGWSggcy5z aXplKCkgPT0gMSApOworCisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Y291bnQo KSA9PSAyICk7CisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Z2V0KCkuX01faW5j cmVtZW50cyA9PSAyICk7CisKKyAgcy5pbnNlcnQobHN0LmJlZ2luKCksIGxzdC5lbmQoKSk7 CisgIFZFUklGWSggcy5zaXplKCkgPT0gMSApOworCisgIFZFUklGWSggX19nbnVfdGVzdDo6 Y291bnRlcjo6Y291bnQoKSA9PSAyICk7CisgIFZFUklGWSggX19nbnVfdGVzdDo6Y291bnRl cjo6Z2V0KCkuX01faW5jcmVtZW50cyA9PSAyICk7Cit9CisKK3ZvaWQKK3Rlc3QwMygpCit7 CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB2OworICB2Lmluc2VydCh2LmVuZCgpLCBs c3QuYmVnaW4oKSwgbHN0LmVuZCgpKTsKKworICBjb25zdCBhdXRvIG9yaWdpbiA9IF9fZ251 X3Rlc3Q6OmNvdW50ZXI6OmNvdW50KCk7CisKKyAgeworICAgIF9fZ251X3Rlc3Q6OmNvdW50 ZXI6OnJlc2V0KCk7CisgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmcsIHN0ZDo6bGVzczxzdGQ6 OnN0cmluZ192aWV3Pj4gczsKKyAgICBzLmluc2VydCh2LmJlZ2luKCksIHYuZW5kKCkpOwor ICAgIFZFUklGWSggcy5zaXplKCkgPT0gMSApOworCisgICAgLy8gQWxsb2NhdGUgYSBub2Rl IGFuZCB0aGUgc3RkOjpzdHJpbmcgKHVubGVzcyBDT1cpLgorICAgIGNvbnN0ZXhwciBzdGQ6 OnNpemVfdCBpbmNyZW1lbnRzID0gX0dMSUJDWFhfVVNFX0NYWDExX0FCSSA/IDIgOiAxOwor CisgICAgVkVSSUZZKCBfX2dudV90ZXN0Ojpjb3VudGVyOjpjb3VudCgpID09IG9yaWdpbiAr IGluY3JlbWVudHMgKTsKKyAgICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNvdW50ZXI6OmdldCgp Ll9NX2luY3JlbWVudHMgPT0gaW5jcmVtZW50cyApOworCisgICAgcy5pbnNlcnQodi5iZWdp bigpLCB2LmVuZCgpKTsKKyAgICBWRVJJRlkoIHMuc2l6ZSgpID09IDEgKTsKKworICAgIFZF UklGWSggX19nbnVfdGVzdDo6Y291bnRlcjo6Y291bnQoKSA9PSBvcmlnaW4gKyBpbmNyZW1l bnRzICk7CisgICAgVkVSSUZZKCBfX2dudV90ZXN0Ojpjb3VudGVyOjpnZXQoKS5fTV9pbmNy ZW1lbnRzID09IGluY3JlbWVudHMgKTsKKyAgfQorICBWRVJJRlkoIF9fZ251X3Rlc3Q6OmNv dW50ZXI6OmNvdW50KCkgPT0gb3JpZ2luICk7CisKKyAgeworICAgIF9fZ251X3Rlc3Q6OmNv dW50ZXI6OnJlc2V0KCk7CisgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmcsIHN0ZDo6bGVzczxz dGQ6OnN0cmluZ192aWV3Pj4gczsKKyAgICBzLmluc2VydChzdGQ6Om1ha2VfbW92ZV9pdGVy YXRvcih2LmJlZ2luKCkpLAorCSAgICAgc3RkOjptYWtlX21vdmVfaXRlcmF0b3Iodi5lbmQo KSkpOworICAgIFZFUklGWSggcy5zaXplKCkgPT0gMSApOworCisgICAgLy8gQWxsb2NhdGUg YSBub2RlLCBzdHJpbmcgaXMgbW92ZWQuCisgICAgY29uc3RleHByIHN0ZDo6c2l6ZV90IGlu Y3JlbWVudHMgPSAxOworCisgICAgVkVSSUZZKCBfX2dudV90ZXN0Ojpjb3VudGVyOjpjb3Vu dCgpID09IG9yaWdpbiArIGluY3JlbWVudHMgKTsKKyAgICBWRVJJRlkoIF9fZ251X3Rlc3Q6 OmNvdW50ZXI6OmdldCgpLl9NX2luY3JlbWVudHMgPT0gaW5jcmVtZW50cyApOworICB9Cit9 CisKK2ludAorbWFpbigpCit7CisgIHRlc3QwMSgpOworICB0ZXN0MDIoKTsKKyAgdGVzdDEx KCk7CisgIHRlc3QxMigpOworICB0ZXN0MjEoKTsKKyAgdGVzdDIyKCk7CisgIHRlc3QyMygp OworICB0ZXN0MjQoKTsKKyAgdGVzdDI1KCk7CisgIHRlc3QwMygpOworICByZXR1cm4gMDsK K30K --------------qMiMO5txnZyduhjiyhRxAAHn--