From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lj1-x22d.google.com (mail-lj1-x22d.google.com [IPv6:2a00:1450:4864:20::22d]) by sourceware.org (Postfix) with ESMTPS id BD61A3858D1E; Thu, 19 Oct 2023 04:55:53 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org BD61A3858D1E Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org BD61A3858D1E Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::22d ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1697691356; cv=none; b=h3AKW6Ws+XEDdeOBZ4zTvZnm8GvG/ygLlJstSffXIFEeknVs6kvTNUD+rJH+fGLEXssFknlwFcKN1sF/EJcBE7IospWgnp3R4fsdDzM2xblWorZLSoW47UY6V+FZ6Xvy8jwxcD3oJC8bHMYMh+2VNkH2f9wvHmsSbRI4y9X9OtA= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1697691356; c=relaxed/simple; bh=VFUTzzAruPG2DFcFVO9n/TJR3EsdLd43F2TK71Z0e4E=; h=DKIM-Signature:Message-ID:Date:MIME-Version:To:From:Subject; b=QQTxfCg604wD6xngSeSZg28oU54IpnuuPX8bf74zkjcA4Jb83sPuJGcEWWoejfHm1tt5gNdnTgsGbPqHe1sZQXQbEOBM2C1PXVrxQ/8fM11ikwxneuvFfuhh8/uLU2S80q5VeDaXjETX3XtNutEr5Mf9Xy51ggmJkzSGgQpjcdk= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-lj1-x22d.google.com with SMTP id 38308e7fff4ca-2c50d1b9f22so70604351fa.0; Wed, 18 Oct 2023 21:55:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1697691352; x=1698296152; darn=gcc.gnu.org; h=subject:from:cc:to:content-language:user-agent:mime-version:date :message-id:from:to:cc:subject:date:message-id:reply-to; bh=RNwpac+NSgHMty9F7/7Ytdbo8L2nlR7obJl8h5LrkVg=; b=XGsJPKx9C1S4C63CKHDMZBYRKmapkLchyJ+E1DRoovnTCy+ixau+CDX5LqW10tTEvn 2SHcxsHiXtcepbE7SLTUjQNabGEB4H2KErALER318qCC/2wkTw+uirZXHgz+5EhjfQg1 9bnmvee+cSiPYseOEzaLHCMgxr1M7j/0PaRSzRIBwSG9Kb5C03e+8Tca6q23f2una+nb 0vxob8m0LnmlBUKi8QuTB8lzLfaFbesKv1UbNMe6fb5Mufb0QrOVZRyC7um3P5S+n0ZX w+e1MCJn40X63IRoIxTfINahRlGHtRAYUASml53FafcUNG6nxpY8dmU+Bo2Nem7UsaHE 8wjQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1697691352; x=1698296152; h=subject:from:cc:to:content-language:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=RNwpac+NSgHMty9F7/7Ytdbo8L2nlR7obJl8h5LrkVg=; b=WdrxrEvpp8QZYFNx00fNi38nQQ8lHtJfsv6pnofXejoQzNhpm/gvbduA4/k1iscTHv bkiZ/3Yg71kJKQKO4CwCXQfuAT7dvYwDvQrC8xMARv7lYJ62Zbyupzzua3euAqXhlw4j Ffuyad6GtBr8FBnijoUkYy52MwSO0AnmCyzm7u0e8NlDRP8rnhfx6drm3Rs6AQizyEUf cOZlfJfvzy3RlrQuqzTrwTNtfbE223Ml90Efakr40RB+2rz7wGlr0D4k/qjcjkiTkUgS U/ppkWr93RYTqhSgn4xgyFikXbDmlSquQDRdrAbjdfRVCVv51z7bBEiRe/rfdvqhAq4/ 4u3w== X-Gm-Message-State: AOJu0YzLevKWmgFZZlpP8noL03PMFrTAF5oBPoBY2Cstj78rp2AkPNQo MmEvjyj65Z+Wtpl3EFyJJBp+rUSkDTo= X-Google-Smtp-Source: AGHT+IEz5bVCqVVfmODpuzSKa8okn0mue7K7ZfKmV9uU1PQvaiK1XDnsiBX+boADVpnnT8R4GKe/ng== X-Received: by 2002:a2e:a589:0:b0:2c5:1abb:7077 with SMTP id m9-20020a2ea589000000b002c51abb7077mr505406ljp.1.1697691351216; Wed, 18 Oct 2023 21:55:51 -0700 (PDT) Received: from [10.78.0.77] ([89.207.171.155]) by smtp.gmail.com with ESMTPSA id f13-20020a1c6a0d000000b003fe23b10fdfsm3307057wmc.36.2023.10.18.21.55.49 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 18 Oct 2023 21:55:50 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------wh3f0ReLOjQtScbAoTbQDuJ3" Message-ID: Date: Thu, 19 Oct 2023 06:55:48 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US To: libstdc++ Cc: gcc-patches From: =?UTF-8?Q?Fran=C3=A7ois_Dumont?= Subject: [PATCH][_Hashtable] Fix merge X-Spam-Status: No, score=-10.4 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,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. --------------wh3f0ReLOjQtScbAoTbQDuJ3 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit libstdc++: [_Hashtable] Do not reuse untrusted cached hash code On merge reuse merged node cached hash code only if we are on the same type of hash and this hash is stateless. Usage of function pointers or std::function as hash functor will prevent this optimization. libstdc++-v3/ChangeLog     * include/bits/hashtable_policy.h     (_Hash_code_base::_M_hash_code(const _Hash&, const _Hash_node_value<>&)): Remove.     (_Hash_code_base::_M_hash_code<_H2>(const _H2&, const _Hash_node_value<>&)): Remove.     * include/bits/hashtable.h     (_M_src_hash_code<_H2>(const _H2&, const key_type&, const __node_value_type&)): New.     (_M_merge_unique<>, _M_merge_multi<>): Use latter.     * testsuite/23_containers/unordered_map/modifiers/merge.cc     (test04, test05, test06): New test cases. Tested under Linux x86_64, ok to commit ? François --------------wh3f0ReLOjQtScbAoTbQDuJ3 Content-Type: text/x-patch; charset=UTF-8; name="hashtable_merge.patch" Content-Disposition: attachment; filename="hashtable_merge.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2xpYnN0ZGMrKy12My9pbmNsdWRlL2JpdHMvaGFzaHRhYmxlLmggYi9s aWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL2hhc2h0YWJsZS5oCmluZGV4IDRjMTJkYzg5NWIy Li5mNjlhY2ZlNTIxMyAxMDA2NDQKLS0tIGEvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy9o YXNodGFibGUuaAorKysgYi9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL2hhc2h0YWJsZS5o CkBAIC0xMTA5LDYgKzExMDksMjAgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJ T04KIAlyZXR1cm4geyBfX24sIHRoaXMtPl9NX25vZGVfYWxsb2NhdG9yKCkgfTsKICAgICAg IH0KIAorICAgICAgLy8gQ2hlY2sgYW5kIGlmIG5lZWRlZCBjb21wdXRlIGhhc2ggY29kZSB1 c2luZyBfSGFzaCBhcyBfX24gX01faGFzaF9jb2RlLAorICAgICAgLy8gaWYgcHJlc2VudCwg d2FzIGNvbXB1dGVkIHVzaW5nIF9IMi4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9IMj4K KwlfX2hhc2hfY29kZQorCV9NX3NyY19oYXNoX2NvZGUoY29uc3QgX0gyJiwgY29uc3Qga2V5 X3R5cGUmIF9faywKKwkJCSBjb25zdCBfX25vZGVfdmFsdWVfdHlwZSYgX19zcmNfbikgY29u c3QKKwl7CisJICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfc2FtZV92PF9IMiwgX0hhc2g+KQor CSAgICBpZiBjb25zdGV4cHIgKHN0ZDo6aXNfZW1wdHlfdjxfSGFzaD4pCisJICAgICAgcmV0 dXJuIHRoaXMtPl9NX2hhc2hfY29kZShfX3NyY19uKTsKKworCSAgcmV0dXJuIHRoaXMtPl9N X2hhc2hfY29kZShfX2spOworCX0KKwogICAgIHB1YmxpYzoKICAgICAgIC8vIEV4dHJhY3Qg YSBub2RlLgogICAgICAgbm9kZV90eXBlCkBAIC0xMTQ2LDcgKzExNjAsNyBAQCBfR0xJQkNY WF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCSAgICAgIGF1dG8gX19wb3MgPSBfX2krKzsK IAkgICAgICBjb25zdCBrZXlfdHlwZSYgX19rID0gX0V4dHJhY3RLZXl7fSgqX19wb3MpOwog CSAgICAgIF9faGFzaF9jb2RlIF9fY29kZQotCQk9IHRoaXMtPl9NX2hhc2hfY29kZShfX3Ny Yy5oYXNoX2Z1bmN0aW9uKCksICpfX3Bvcy5fTV9jdXIpOworCQk9IF9NX3NyY19oYXNoX2Nv ZGUoX19zcmMuaGFzaF9mdW5jdGlvbigpLCBfX2ssICpfX3Bvcy5fTV9jdXIpOwogCSAgICAg IHNpemVfdHlwZSBfX2JrdCA9IF9NX2J1Y2tldF9pbmRleChfX2NvZGUpOwogCSAgICAgIGlm IChfTV9maW5kX25vZGUoX19ia3QsIF9faywgX19jb2RlKSA9PSBudWxscHRyKQogCQl7CkBA IC0xMTc0LDggKzExODgsOSBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgog CSAgZm9yIChhdXRvIF9faSA9IF9fc3JjLmNiZWdpbigpLCBfX2VuZCA9IF9fc3JjLmNlbmQo KTsgX19pICE9IF9fZW5kOykKIAkgICAgewogCSAgICAgIGF1dG8gX19wb3MgPSBfX2krKzsK KwkgICAgICBjb25zdCBrZXlfdHlwZSYgX19rID0gX0V4dHJhY3RLZXl7fSgqX19wb3MpOwog CSAgICAgIF9faGFzaF9jb2RlIF9fY29kZQotCQk9IHRoaXMtPl9NX2hhc2hfY29kZShfX3Ny Yy5oYXNoX2Z1bmN0aW9uKCksICpfX3Bvcy5fTV9jdXIpOworCQk9IF9NX3NyY19oYXNoX2Nv ZGUoX19zcmMuaGFzaF9mdW5jdGlvbigpLCBfX2ssICpfX3Bvcy5fTV9jdXIpOwogCSAgICAg IGF1dG8gX19uaCA9IF9fc3JjLmV4dHJhY3QoX19wb3MpOwogCSAgICAgIF9faGludCA9IF9N X2luc2VydF9tdWx0aV9ub2RlKF9faGludCwgX19jb2RlLCBfX25oLl9NX3B0cikuX01fY3Vy OwogCSAgICAgIF9fbmguX01fcHRyID0gbnVsbHB0cjsKZGlmZiAtLWdpdCBhL2xpYnN0ZGMr Ky12My9pbmNsdWRlL2JpdHMvaGFzaHRhYmxlX3BvbGljeS5oIGIvbGlic3RkYysrLXYzL2lu Y2x1ZGUvYml0cy9oYXNodGFibGVfcG9saWN5LmgKaW5kZXggODZiMzJmYjE1ZjIuLjVkMTYy NDYzZGMzIDEwMDY0NAotLS0gYS9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL2hhc2h0YWJs ZV9wb2xpY3kuaAorKysgYi9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL2hhc2h0YWJsZV9w b2xpY3kuaApAQCAtMTMxOSwxOSArMTMxOSw2IEBAIG5hbWVzcGFjZSBfX2RldGFpbAogCSAg cmV0dXJuIF9NX2hhc2goKShfX2spOwogCX0KIAotICAgICAgX19oYXNoX2NvZGUKLSAgICAg IF9NX2hhc2hfY29kZShjb25zdCBfSGFzaCYsCi0JCSAgIGNvbnN0IF9IYXNoX25vZGVfdmFs dWU8X1ZhbHVlLCB0cnVlPiYgX19uKSBjb25zdAotICAgICAgeyByZXR1cm4gX19uLl9NX2hh c2hfY29kZTsgfQotCi0gICAgICAvLyBDb21wdXRlIGhhc2ggY29kZSB1c2luZyBfSGFzaCBh cyBfX24gX01faGFzaF9jb2RlLCBpZiBwcmVzZW50LCB3YXMKLSAgICAgIC8vIGNvbXB1dGVk IHVzaW5nIF9IMi4KLSAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9IMj4KLQlfX2hhc2hfY29k ZQotCV9NX2hhc2hfY29kZShjb25zdCBfSDImLAotCQljb25zdCBfSGFzaF9ub2RlX3ZhbHVl PF9WYWx1ZSwgX19jYWNoZV9oYXNoX2NvZGU+JiBfX24pIGNvbnN0Ci0JeyByZXR1cm4gX01f aGFzaF9jb2RlKF9FeHRyYWN0S2V5e30oX19uLl9NX3YoKSkpOyB9Ci0KICAgICAgIF9faGFz aF9jb2RlCiAgICAgICBfTV9oYXNoX2NvZGUoY29uc3QgX0hhc2hfbm9kZV92YWx1ZTxfVmFs dWUsIGZhbHNlPiYgX19uKSBjb25zdAogICAgICAgeyByZXR1cm4gX01faGFzaF9jb2RlKF9F eHRyYWN0S2V5e30oX19uLl9NX3YoKSkpOyB9CmRpZmYgLS1naXQgYS9saWJzdGRjKystdjMv dGVzdHN1aXRlLzIzX2NvbnRhaW5lcnMvdW5vcmRlcmVkX21hcC9tb2RpZmllcnMvbWVyZ2Uu Y2MgYi9saWJzdGRjKystdjMvdGVzdHN1aXRlLzIzX2NvbnRhaW5lcnMvdW5vcmRlcmVkX21h cC9tb2RpZmllcnMvbWVyZ2UuY2MKaW5kZXggYjE0MGNlNDUyYWEuLmMwNTFiNTgxMzdhIDEw MDY0NAotLS0gYS9saWJzdGRjKystdjMvdGVzdHN1aXRlLzIzX2NvbnRhaW5lcnMvdW5vcmRl cmVkX21hcC9tb2RpZmllcnMvbWVyZ2UuY2MKKysrIGIvbGlic3RkYysrLXYzL3Rlc3RzdWl0 ZS8yM19jb250YWluZXJzL3Vub3JkZXJlZF9tYXAvbW9kaWZpZXJzL21lcmdlLmNjCkBAIC0x NywxNSArMTcsMjkgQEAKIAogLy8geyBkZy1kbyBydW4geyB0YXJnZXQgYysrMTcgfSB9CiAK KyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KICNpbmNsdWRlIDx1 bm9yZGVyZWRfbWFwPgogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDx0ZXN0c3Vp dGVfaG9va3MuaD4KIAogdXNpbmcgdGVzdF90eXBlID0gc3RkOjp1bm9yZGVyZWRfbWFwPGlu dCwgaW50PjsKIAotc3RydWN0IGhhc2ggewotICBhdXRvIG9wZXJhdG9yKCkoaW50IGkpIGNv bnN0IG5vZXhjZXB0IHsgcmV0dXJuIH5zdGQ6Omhhc2g8aW50PigpKGkpOyB9Ci19OwordGVt cGxhdGU8dHlwZW5hbWUgVD4KKyAgc3RydWN0IHhoYXNoCisgIHsKKyAgICBhdXRvIG9wZXJh dG9yKCkoY29uc3QgVCYgaSkgY29uc3Qgbm9leGNlcHQKKyAgICB7IHJldHVybiB+c3RkOjpo YXNoPFQ+KCkoaSk7IH0KKyAgfTsKKworCituYW1lc3BhY2Ugc3RkCit7CisgIHRlbXBsYXRl PHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IF9faXNfZmFzdF9oYXNoPHhoYXNoPFQ+PiA6IF9f aXNfZmFzdF9oYXNoPHN0ZDo6aGFzaDxUPj4KKyAgICB7IH07Cit9CisKIHN0cnVjdCBlcXVh bCA6IHN0ZDo6ZXF1YWxfdG88PiB7IH07CiAKIHRlbXBsYXRlPHR5cGVuYW1lIEMxLCB0eXBl bmFtZSBDMj4KQEAgLTY0LDcgKzc4LDcgQEAgdGVzdDAyKCkKIHsKICAgY29uc3QgdGVzdF90 eXBlIGMweyB7MSwgMTB9LCB7MiwgMjB9LCB7MywgMzB9IH07CiAgIHRlc3RfdHlwZSBjMSA9 IGMwOwotICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBpbnQsIGhhc2gsIGVxdWFsPiBjMigg YzAuYmVnaW4oKSwgYzAuZW5kKCkgKTsKKyAgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgaW50 LCB4aGFzaDxpbnQ+LCBlcXVhbD4gYzIoIGMwLmJlZ2luKCksIGMwLmVuZCgpICk7CiAKICAg YzEubWVyZ2UoYzIpOwogICBWRVJJRlkoIGMxID09IGMwICk7CkBAIC04OSw3ICsxMDMsNyBA QCB0ZXN0MDMoKQogewogICBjb25zdCB0ZXN0X3R5cGUgYzB7IHsxLCAxMH0sIHsyLCAyMH0s IHszLCAzMH0gfTsKICAgdGVzdF90eXBlIGMxID0gYzA7Ci0gIHN0ZDo6dW5vcmRlcmVkX211 bHRpbWFwPGludCwgaW50LCBoYXNoLCBlcXVhbD4gYzIoIGMwLmJlZ2luKCksIGMwLmVuZCgp ICk7CisgIHN0ZDo6dW5vcmRlcmVkX211bHRpbWFwPGludCwgaW50LCB4aGFzaDxpbnQ+LCBl cXVhbD4gYzIoIGMwLmJlZ2luKCksIGMwLmVuZCgpICk7CiAgIGMxLm1lcmdlKGMyKTsKICAg VkVSSUZZKCBjMSA9PSBjMCApOwogICBWRVJJRlkoIGVxdWFsX2VsZW1lbnRzKGMyLCBjMCkg KTsKQEAgLTEyNSwxMCArMTM5LDE2NCBAQCB0ZXN0MDMoKQogICBWRVJJRlkoIGMyLmVtcHR5 KCkgKTsKIH0KIAordm9pZAordGVzdDA0KCkKK3sKKyAgY29uc3Qgc3RkOjp1bm9yZGVyZWRf bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IGMwCisgICAgeyB7Im9uZSIsIDEwfSwgeyJ0d28iLCAy MH0sIHsidGhyZWUiLCAzMH0gfTsKKworICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJp bmcsIGludD4gYzEgPSBjMDsKKyAgc3RkOjp1bm9yZGVyZWRfbXVsdGltYXA8c3RkOjpzdHJp bmcsIGludD4gYzIoIGMwLmJlZ2luKCksIGMwLmVuZCgpICk7CisgIGMxLm1lcmdlKGMyKTsK KyAgVkVSSUZZKCBjMSA9PSBjMCApOworICBWRVJJRlkoIGVxdWFsX2VsZW1lbnRzKGMyLCBj MCkgKTsKKworICBjMS5jbGVhcigpOworICBjMS5tZXJnZShjMik7CisgIFZFUklGWSggYzEg PT0gYzAgKTsKKyAgVkVSSUZZKCBjMi5lbXB0eSgpICk7CisKKyAgYzIubWVyZ2UoYzEpOwor ICBWRVJJRlkoIGMxLmVtcHR5KCkgKTsKKyAgVkVSSUZZKCBlcXVhbF9lbGVtZW50cyhjMiwg YzApICk7CisKKyAgYzEgPSBjMDsKKyAgYzIubWVyZ2UoYzEpOworICBWRVJJRlkoIGMxLmVt cHR5KCkgKTsKKyAgVkVSSUZZKCBjMi5zaXplKCkgPT0gKDIgKiBjMC5zaXplKCkpICk7Cisg IFZFUklGWSggYzIuY291bnQoIm9uZSIpID09IDIgKTsKKyAgVkVSSUZZKCBjMi5jb3VudCgi dHdvIikgPT0gMiApOworICBWRVJJRlkoIGMyLmNvdW50KCJ0aHJlZSIpID09IDIgKTsKKwor ICBjMS5tZXJnZShjMik7CisgIFZFUklGWSggYzEgPT0gYzAgKTsKKyAgVkVSSUZZKCBlcXVh bF9lbGVtZW50cyhjMiwgYzApICk7CisKKyAgYzEubWVyZ2Uoc3RkOjptb3ZlKGMyKSk7Cisg IFZFUklGWSggYzEgPT0gYzAgKTsKKyAgVkVSSUZZKCBlcXVhbF9lbGVtZW50cyhjMiwgYzAp ICk7CisKKyAgYzEuY2xlYXIoKTsKKyAgYzEubWVyZ2Uoc3RkOjptb3ZlKGMyKSk7CisgIFZF UklGWSggYzEgPT0gYzAgKTsKKyAgVkVSSUZZKCBjMi5lbXB0eSgpICk7Cit9CisKK3ZvaWQK K3Rlc3QwNSgpCit7CisgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywg aW50PiBjMAorICAgIHsgeyJvbmUiLCAxMH0sIHsidHdvIiwgMjB9LCB7InRocmVlIiwgMzB9 IH07CisKKyAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IGMxID0gYzA7 CisgIHN0ZDo6dW5vcmRlcmVkX211bHRpbWFwPHN0ZDo6c3RyaW5nLCBpbnQsIHhoYXNoPHN0 ZDo6c3RyaW5nPiwgZXF1YWw+IGMyKCBjMC5iZWdpbigpLCBjMC5lbmQoKSApOworICBjMS5t ZXJnZShjMik7CisgIFZFUklGWSggYzEgPT0gYzAgKTsKKyAgVkVSSUZZKCBlcXVhbF9lbGVt ZW50cyhjMiwgYzApICk7CisKKyAgYzEuY2xlYXIoKTsKKyAgYzEubWVyZ2UoYzIpOworICBW RVJJRlkoIGMxID09IGMwICk7CisgIFZFUklGWSggYzIuZW1wdHkoKSApOworCisgIGMyLm1l cmdlKGMxKTsKKyAgVkVSSUZZKCBjMS5lbXB0eSgpICk7CisgIFZFUklGWSggZXF1YWxfZWxl bWVudHMoYzIsIGMwKSApOworCisgIGMxID0gYzA7CisgIGMyLm1lcmdlKGMxKTsKKyAgVkVS SUZZKCBjMS5lbXB0eSgpICk7CisgIFZFUklGWSggYzIuc2l6ZSgpID09ICgyICogYzAuc2l6 ZSgpKSApOworICBWRVJJRlkoIGMyLmNvdW50KCJvbmUiKSA9PSAyICk7CisgIFZFUklGWSgg YzIuY291bnQoInR3byIpID09IDIgKTsKKyAgVkVSSUZZKCBjMi5jb3VudCgidGhyZWUiKSA9 PSAyICk7CisKKyAgYzEubWVyZ2UoYzIpOworICBWRVJJRlkoIGMxID09IGMwICk7CisgIFZF UklGWSggZXF1YWxfZWxlbWVudHMoYzIsIGMwKSApOworCisgIGMxLm1lcmdlKHN0ZDo6bW92 ZShjMikpOworICBWRVJJRlkoIGMxID09IGMwICk7CisgIFZFUklGWSggZXF1YWxfZWxlbWVu dHMoYzIsIGMwKSApOworCisgIGMxLmNsZWFyKCk7CisgIGMxLm1lcmdlKHN0ZDo6bW92ZShj MikpOworICBWRVJJRlkoIGMxID09IGMwICk7CisgIFZFUklGWSggYzIuZW1wdHkoKSApOwor fQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICB1c2luZyBoYXNoX2YgPQorICAgIHN0ZDo6 ZnVuY3Rpb248c3RkOjpzaXplX3QoY29uc3QgVCYpPjsKKworc3RkOjpzaXplX3QKK2hhc2hf ZnVuYyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKQoreyByZXR1cm4gc3RkOjpoYXNoPHN0ZDo6 c3RyaW5nPnt9KHN0cik7ICB9CisKK3N0ZDo6c2l6ZV90Cit4aGFzaF9mdW5jKGNvbnN0IHN0 ZDo6c3RyaW5nJiBzdHIpCit7IHJldHVybiB4aGFzaDxzdGQ6OnN0cmluZz57fShzdHIpOyB9 CisKK25hbWVzcGFjZSBzdGQKK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1 Y3QgX19pc19mYXN0X2hhc2g8aGFzaF9mPFQ+PiA6IF9faXNfZmFzdF9oYXNoPHN0ZDo6aGFz aDxUPj4KKyAgICB7IH07Cit9CisKK3ZvaWQKK3Rlc3QwNigpCit7CisgIGNvbnN0IHN0ZDo6 dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgaW50LCBoYXNoX2Y8c3RkOjpzdHJpbmc+LCBl cXVhbD4KKyAgICBjMCh7IHsib25lIiwgMTB9LCB7InR3byIsIDIwfSwgeyJ0aHJlZSIsIDMw fSB9LCAzLCAmaGFzaF9mdW5jKTsKKworICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJp bmcsIGludCwgaGFzaF9mPHN0ZDo6c3RyaW5nPiwgZXF1YWw+CisgICAgYzEoMywgJmhhc2hf ZnVuYyk7CisgIGMxID0gYzA7CisgIHN0ZDo6dW5vcmRlcmVkX211bHRpbWFwPHN0ZDo6c3Ry aW5nLCBpbnQsIGhhc2hfZjxzdGQ6OnN0cmluZz4sIGVxdWFsPgorICAgIGMyKGMwLmJlZ2lu KCksIGMwLmVuZCgpLCAzLCAmeGhhc2hfZnVuYyk7CisgIGMxLm1lcmdlKGMyKTsKKyAgVkVS SUZZKCBjMSA9PSBjMCApOworICBWRVJJRlkoIGVxdWFsX2VsZW1lbnRzKGMyLCBjMCkgKTsK KworICBjMS5jbGVhcigpOworICBjMS5tZXJnZShjMik7CisgIFZFUklGWSggYzEgPT0gYzAg KTsKKyAgVkVSSUZZKCBjMi5lbXB0eSgpICk7CisKKyAgYzIubWVyZ2UoYzEpOworICBWRVJJ RlkoIGMxLmVtcHR5KCkgKTsKKyAgVkVSSUZZKCBlcXVhbF9lbGVtZW50cyhjMiwgYzApICk7 CisKKyAgYzEgPSBjMDsKKyAgYzIubWVyZ2UoYzEpOworICBWRVJJRlkoIGMxLmVtcHR5KCkg KTsKKyAgVkVSSUZZKCBjMi5zaXplKCkgPT0gKDIgKiBjMC5zaXplKCkpICk7CisgIFZFUklG WSggYzIuY291bnQoIm9uZSIpID09IDIgKTsKKyAgVkVSSUZZKCBjMi5jb3VudCgidHdvIikg PT0gMiApOworICBWRVJJRlkoIGMyLmNvdW50KCJ0aHJlZSIpID09IDIgKTsKKworICBjMS5t ZXJnZShjMik7CisgIFZFUklGWSggYzEgPT0gYzAgKTsKKyAgVkVSSUZZKCBlcXVhbF9lbGVt ZW50cyhjMiwgYzApICk7CisKKyAgYzEubWVyZ2Uoc3RkOjptb3ZlKGMyKSk7CisgIFZFUklG WSggYzEgPT0gYzAgKTsKKyAgVkVSSUZZKCBlcXVhbF9lbGVtZW50cyhjMiwgYzApICk7CisK KyAgYzEuY2xlYXIoKTsKKyAgYzEubWVyZ2Uoc3RkOjptb3ZlKGMyKSk7CisgIFZFUklGWSgg YzEgPT0gYzAgKTsKKyAgVkVSSUZZKCBjMi5lbXB0eSgpICk7Cit9CisKIGludAogbWFpbigp CiB7CiAgIHRlc3QwMSgpOwogICB0ZXN0MDIoKTsKICAgdGVzdDAzKCk7CisgIHRlc3QwNCgp OworICB0ZXN0MDUoKTsKKyAgdGVzdDA2KCk7CiB9Cg== --------------wh3f0ReLOjQtScbAoTbQDuJ3--