From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ej1-x629.google.com (mail-ej1-x629.google.com [IPv6:2a00:1450:4864:20::629]) by sourceware.org (Postfix) with ESMTPS id 88F083851AA5; Mon, 20 Jun 2022 16:57:42 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 88F083851AA5 Received: by mail-ej1-x629.google.com with SMTP id u12so22307741eja.8; Mon, 20 Jun 2022 09:57:42 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:from :subject:to:cc:content-language; bh=RWNEwUj8TGB6hZ5NK6zr+9QOjyl7lO5aOpXzhdw1lGY=; b=cX3s4Re8YkhY4O/PjC+2xi43toa9Oz/9OtGbfR+8EvZMuzRQNxIbo7tvldFnNbWxt3 BZub9oLH0qP9JB8plSUz0Rph/B111L9T4SNn3U9II1s9HGXkixSjfjHU2bBFmTUTxgtn cVXIsg01jEXWIJ1rmfDm2wM7JRYyIyXI5HpcoGYrPVzNolyL7AzsqYiZskYzJfYgSYJn hMYSHUz0ajqu66tJjSrSzYzSMvns5fkgJr/SvXQ3/pIsmGMZ6eqZg+xK3uWQaqqE+MXI lrx6uvw7o+QCoeA1TB18adGcD/Iu27DvOCTGYDQWNvxN+4Uk6rXAa20f20FWCQ/cLZ6j mS7w== X-Gm-Message-State: AJIora/LTJT0ewya96WxyF+JtH86ELZ5fvYMVxfm8C4ZiNn9CoUY5MTe SqsMkAqd8AoQ3RJHqco6kVmrkLDg3zk= X-Google-Smtp-Source: AGRyM1ugzE4tB0lRzcI/uO4DLlFZoJF/LKMDqP9xWB76UcTv2Wj7DyFKOpyEyELBUzPt3EuguCZsng== X-Received: by 2002:a17:906:748b:b0:712:2a23:7395 with SMTP id e11-20020a170906748b00b007122a237395mr22348641ejl.666.1655744261036; Mon, 20 Jun 2022 09:57:41 -0700 (PDT) Received: from [10.126.3.254] ([109.190.253.11]) by smtp.googlemail.com with ESMTPSA id b23-20020aa7df97000000b004357ab9cfb1sm4313706edy.26.2022.06.20.09.57.38 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 20 Jun 2022 09:57:40 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------0ym0zy6qnq2f9s0XwlLnibgD" Message-ID: <712cf294-e646-b470-f862-30aadd543894@gmail.com> Date: Mon, 20 Jun 2022 18:57:37 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.9.1 From: =?UTF-8?Q?Fran=c3=a7ois_Dumont?= Subject: [PATCH 1/5][_Hashtable] Make more use of user provided hint To: "libstdc++@gcc.gnu.org" Cc: gcc-patches Content-Language: fr X-Spam-Status: No, score=-9.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: 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, 20 Jun 2022 16:57:46 -0000 This is a multi-part message in MIME format. --------------0ym0zy6qnq2f9s0XwlLnibgD Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit libstdc++: [_Hashtable] Make more use of insertion hint Make use of the user provided hint iterator in unordered containers operations. Hint is used: - As a hint for allocation to potentially reduce memory fragmentation. - For unordered_set/unordered_map we check if it does not match the key of the element to insert, before computing the hash code. - For unordered_multiset/unordered_multimap, if equals to the key of the element to insert, the hash code is taken from the hint so that we can take advantage of the potential hash code cache. libstdc++-v3/ChangeLog:     * include/bits/hashtable_policy.h (_NodeBuilder<>::_S_build): Add _NodePtr template     parameter.     (_ReuseOrAllocNode::operator()): Add __node_ptr parameter.     (_AllocNode::operator()): Likewise.     (_Insert_base::try_emplace): Adapt to use hint.     (_Hashtable_alloc<>::_M_allocate_node(__node_ptr, _Args&&...)): Add __node_ptr parameter.     * include/bits/hashtable.h     (_Hashtable<>::_Scope_node<>(__hashtable_alloc*, __node_ptr, _Args&&...)):     Add __node_ptr parameter.     (_Hashtable<>::_M_get_hint(size_type, __node_ptr)): New.     (_Hashtable<>::_M_emplace_unique(const_iterator, _Args&&...)): New.     (_Hashtable<>::_M_emplace_multi(const_iterator, _Args&&...)): New.     (_Hashtable<>::_M_emplace()): Adapt to use latter.     (_Hashtable<>::_M_insert_unique): Add const_iterator parameter.     (_Hashtable<>::_M_insert(const_iterator, _Arg&&, const _NodeGenerator&, true_type)):     Use latter.     (_Hashtable<>::_M_reinsert_node(const_iterator, node_type&&)):     Add const_iterator parameter, adapt to use it.     (_Hashtable<>::_M_reinsert_node_multi): Make more use of hint parameter.     * include/bits/unordered_map.h (unordered_map<>::insert(node_type&&)): Pass cend as     hint.     (unordered_map<>::insert(const_iterator, node_type&&)): Adapt to use hint.     * include/bits/unordered_set.h (unordered_set<>::insert(node_type&&)): Pass cend as     hint.     (unordered_set<>::insert(const_iterator, node_type&&)): Adapt to use hint. Tested under Linux x86_64. François --------------0ym0zy6qnq2f9s0XwlLnibgD Content-Type: text/x-patch; charset=UTF-8; name="1_hashtable_hint.patch" Content-Disposition: attachment; filename="1_hashtable_hint.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2xpYnN0ZGMrKy12My9pbmNsdWRlL2JpdHMvaGFzaHRhYmxlLmggYi9s aWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL2hhc2h0YWJsZS5oCmluZGV4IDFiMjFiNzk1Zjg5 Li44MzE4ZGExNjhlMyAxMDA2NDQKLS0tIGEvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy9o YXNodGFibGUuaAorKysgYi9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL2hhc2h0YWJsZS5o CkBAIC0zMDIsOSArMzAyLDExIEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9O CiAKIAkvLyBBbGxvY2F0ZSBhIG5vZGUgYW5kIGNvbnN0cnVjdCBhbiBlbGVtZW50IHdpdGhp biBpdC4KIAl0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KLQkgIF9TY29wZWRfbm9kZShf X2hhc2h0YWJsZV9hbGxvYyogX19oLCBfQXJncyYmLi4uIF9fYXJncykKKwkgIF9TY29wZWRf bm9kZShfX2hhc2h0YWJsZV9hbGxvYyogX19oLAorCQkgICAgICAgX19ub2RlX3B0ciBfX2hp bnQsIF9BcmdzJiYuLi4gX19hcmdzKQogCSAgOiBfTV9oKF9faCksCi0JICAgIF9NX25vZGUo X19oLT5fTV9hbGxvY2F0ZV9ub2RlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLikp CisJICAgIF9NX25vZGUoX19oLT5fTV9hbGxvY2F0ZV9ub2RlKF9faGludCwKKwkJCQkJICBz dGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pKQogCSAgeyB9CiAKIAkvLyBEZXN0cm95 IGVsZW1lbnQgYW5kIGRlYWxsb2NhdGUgbm9kZS4KQEAgLTgyOSw2ICs4MzEsMTggQEAgX0dM SUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KIAkgIHJldHVybiBudWxscHRyOwogCX0K IAorICAgICAgLy8gR2V0cyBhIGhpbnQgYWZ0ZXIgd2hpY2ggYSBub2RlIHNob3VsZCBiZSBh bGxvY2F0ZWQgZ2l2ZW4gYSBidWNrZXQuCisgICAgICBfX25vZGVfcHRyCisgICAgICBfTV9n ZXRfaGludChzaXplX3R5cGUgX19ia3QsIF9fbm9kZV9wdHIgX19oaW50ID0gbnVsbHB0cikg Y29uc3QKKyAgICAgIHsKKwlfX25vZGVfYmFzZV9wdHIgX19ub2RlOworCWlmIChfX25vZGUg PSBfTV9idWNrZXRzW19fYmt0XSkKKwkgIHJldHVybiBfX25vZGUgIT0gJl9NX2JlZm9yZV9i ZWdpbgorCSAgICA/IHN0YXRpY19jYXN0PF9fbm9kZV9wdHI+KF9fbm9kZSkgOiBfX2hpbnQ7 CisKKwlyZXR1cm4gX19oaW50OworICAgICAgfQorCiAgICAgICAvLyBJbnNlcnQgYSBub2Rl IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBidWNrZXQuCiAgICAgICB2b2lkCiAgICAgICBfTV9p bnNlcnRfYnVja2V0X2JlZ2luKHNpemVfdHlwZSwgX19ub2RlX3B0cik7CkBAIC04NjAsMjYg Kzg3NCw0MCBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCiAgICAgICB0 ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KIAlzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+ Ci0JX01fZW1wbGFjZSh0cnVlX3R5cGUgX191a3MsIF9BcmdzJiYuLi4gX19hcmdzKTsKKwlf TV9lbXBsYWNlX3VuaXF1ZShjb25zdF9pdGVyYXRvciwgX0FyZ3MmJi4uLiBfX2FyZ3MpOwor CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCV9NX2Vt cGxhY2VfbXVsdGkoY29uc3RfaXRlcmF0b3IsIF9BcmdzJiYuLi4gX19hcmdzKTsKKworICAg ICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJc3RkOjpwYWlyPGl0ZXJhdG9yLCBi b29sPgorCV9NX2VtcGxhY2UodHJ1ZV90eXBlIC8qX191a3MqLywgX0FyZ3MmJi4uLiBfX2Fy Z3MpCisJeyByZXR1cm4gX01fZW1wbGFjZV91bmlxdWUoY2VuZCgpLCBzdGQ6OmZvcndhcmQ8 X0FyZ3M+KF9fYXJncykuLi4pOyB9CiAKICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9B cmdzPgogCWl0ZXJhdG9yCi0JX01fZW1wbGFjZShmYWxzZV90eXBlIF9fdWtzLCBfQXJncyYm Li4uIF9fYXJncykKLQl7IHJldHVybiBfTV9lbXBsYWNlKGNlbmQoKSwgX191a3MsIHN0ZDo6 Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKwlfTV9lbXBsYWNlKGZhbHNlX3R5cGUg LypfX3VrcyovLCBfQXJncyYmLi4uIF9fYXJncykKKwl7IHJldHVybiBfTV9lbXBsYWNlX211 bHRpKGNlbmQoKSwgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQogCi0gICAg ICAvLyBFbXBsYWNlIHdpdGggaGludCwgdXNlbGVzcyB3aGVuIGtleXMgYXJlIHVuaXF1ZS4K ICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgogCWl0ZXJhdG9yCi0JX01fZW1w bGFjZShjb25zdF9pdGVyYXRvciwgdHJ1ZV90eXBlIF9fdWtzLCBfQXJncyYmLi4uIF9fYXJn cykKLQl7IHJldHVybiBfTV9lbXBsYWNlKF9fdWtzLCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9f YXJncykuLi4pLmZpcnN0OyB9CisJX01fZW1wbGFjZShjb25zdF9pdGVyYXRvciBfX2hpbnQs IHRydWVfdHlwZSAvKl9fdWtzKi8sCisJCSAgIF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkg IHJldHVybiBfTV9lbXBsYWNlX3VuaXF1ZShfX2hpbnQsCisJCQkJICAgc3RkOjpmb3J3YXJk PF9BcmdzPihfX2FyZ3MpLi4uKS5maXJzdDsKKwl9CiAKICAgICAgIHRlbXBsYXRlPHR5cGVu YW1lLi4uIF9BcmdzPgogCWl0ZXJhdG9yCi0JX01fZW1wbGFjZShjb25zdF9pdGVyYXRvciwg ZmFsc2VfdHlwZSBfX3VrcywgX0FyZ3MmJi4uLiBfX2FyZ3MpOworCV9NX2VtcGxhY2UoY29u c3RfaXRlcmF0b3IgX19oaW50LCBmYWxzZV90eXBlIC8qX191a3MqLywKKwkJICAgX0FyZ3Mm Ji4uLiBfX2FyZ3MpCisJeyByZXR1cm4gX01fZW1wbGFjZV9tdWx0aShfX2hpbnQsIHN0ZDo6 Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KIAogICAgICAgdGVtcGxhdGU8dHlwZW5h bWUgX0t0LCB0eXBlbmFtZSBfQXJnLCB0eXBlbmFtZSBfTm9kZUdlbmVyYXRvcj4KIAlzdGQ6 OnBhaXI8aXRlcmF0b3IsIGJvb2w+Ci0JX01faW5zZXJ0X3VuaXF1ZShfS3QmJiwgX0FyZyYm LCBjb25zdCBfTm9kZUdlbmVyYXRvciYpOworCV9NX2luc2VydF91bmlxdWUoY29uc3RfaXRl cmF0b3IsIF9LdCYmLCBfQXJnJiYsIGNvbnN0IF9Ob2RlR2VuZXJhdG9yJik7CiAKICAgICAg IHRlbXBsYXRlPHR5cGVuYW1lIF9LdD4KIAlzdGF0aWMgX19jb25kaXRpb25hbF90PApAQCAt ODk5LDkgKzkyNywxMCBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCiAg ICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnLCB0eXBlbmFtZSBfTm9kZUdlbmVyYXRvcj4K IAlzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+Ci0JX01faW5zZXJ0X3VuaXF1ZV9hdXgoX0Fy ZyYmIF9fYXJnLCBjb25zdCBfTm9kZUdlbmVyYXRvciYgX19ub2RlX2dlbikKKwlfTV9pbnNl cnRfdW5pcXVlX2F1eChjb25zdF9pdGVyYXRvciBfX2hpbnQsCisJCQkgICAgIF9BcmcmJiBf X2FyZywgY29uc3QgX05vZGVHZW5lcmF0b3ImIF9fbm9kZV9nZW4pCiAJewotCSAgcmV0dXJu IF9NX2luc2VydF91bmlxdWUoCisJICByZXR1cm4gX01faW5zZXJ0X3VuaXF1ZShfX2hpbnQs CiAJICAgIF9TX2ZvcndhcmRfa2V5KF9FeHRyYWN0S2V5e30oc3RkOjpmb3J3YXJkPF9Bcmc+ KF9fYXJnKSkpLAogCSAgICBzdGQ6OmZvcndhcmQ8X0FyZz4oX19hcmcpLCBfX25vZGVfZ2Vu KTsKIAl9CkBAIC05MTMsNyArOTQyLDcgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZF UlNJT04KIAl7CiAJICB1c2luZyBfX3RvX3ZhbHVlCiAJICAgID0gX19kZXRhaWw6Ol9Db252 ZXJ0VG9WYWx1ZVR5cGU8X0V4dHJhY3RLZXksIHZhbHVlX3R5cGU+OwotCSAgcmV0dXJuIF9N X2luc2VydF91bmlxdWVfYXV4KAorCSAgcmV0dXJuIF9NX2luc2VydF91bmlxdWVfYXV4KGNl bmQoKSwKIAkgICAgX190b192YWx1ZXt9KHN0ZDo6Zm9yd2FyZDxfQXJnPihfX2FyZykpLCBf X25vZGVfZ2VuKTsKIAl9CiAKQEAgLTkyOCwxNCArOTU3LDE2IEBAIF9HTElCQ1hYX0JFR0lO X05BTUVTUEFDRV9WRVJTSU9OCiAJICAgIF9fdG9fdmFsdWV7fShzdGQ6OmZvcndhcmQ8X0Fy Zz4oX19hcmcpKSwgX19ub2RlX2dlbiwgX191a3MpOwogCX0KIAotICAgICAgLy8gSW5zZXJ0 IHdpdGggaGludCwgbm90IHVzZWQgd2hlbiBrZXlzIGFyZSB1bmlxdWUuCisgICAgICAvLyBJ bnNlcnQgd2l0aCBoaW50IHdoZW4ga2V5cyBhcmUgdW5pcXVlLgogICAgICAgdGVtcGxhdGU8 dHlwZW5hbWUgX0FyZywgdHlwZW5hbWUgX05vZGVHZW5lcmF0b3I+CiAJaXRlcmF0b3IKLQlf TV9pbnNlcnQoY29uc3RfaXRlcmF0b3IsIF9BcmcmJiBfX2FyZywKLQkJICBjb25zdCBfTm9k ZUdlbmVyYXRvciYgX19ub2RlX2dlbiwgdHJ1ZV90eXBlIF9fdWtzKQorCV9NX2luc2VydChj b25zdF9pdGVyYXRvciBfX2hpbnQsIF9BcmcmJiBfX2FyZywKKwkJICBjb25zdCBfTm9kZUdl bmVyYXRvciYgX19ub2RlX2dlbiwgdHJ1ZV90eXBlIC8qIF9fdWtzICovKQogCXsKLQkgIHJl dHVybgotCSAgICBfTV9pbnNlcnQoc3RkOjpmb3J3YXJkPF9Bcmc+KF9fYXJnKSwgX19ub2Rl X2dlbiwgX191a3MpLmZpcnN0OworCSAgdXNpbmcgX190b192YWx1ZQorCSAgICA9IF9fZGV0 YWlsOjpfQ29udmVydFRvVmFsdWVUeXBlPF9FeHRyYWN0S2V5LCB2YWx1ZV90eXBlPjsKKwkg IHJldHVybiBfTV9pbnNlcnRfdW5pcXVlX2F1eChfX2hpbnQsCisJICAgIF9fdG9fdmFsdWV7 fShzdGQ6OmZvcndhcmQ8X0FyZz4oX19hcmcpKSwgX19ub2RlX2dlbikuZmlyc3Q7CiAJfQog CiAgICAgICAvLyBJbnNlcnQgd2l0aCBoaW50IHdoZW4ga2V5cyBhcmUgbm90IHVuaXF1ZS4K QEAgLTk5OSw3ICsxMDMwLDcgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04K ICNpZiBfX2NwbHVzcGx1cyA+IDIwMTQwMkwKICAgICAgIC8vLyBSZS1pbnNlcnQgYW4gZXh0 cmFjdGVkIG5vZGUgaW50byBhIGNvbnRhaW5lciB3aXRoIHVuaXF1ZSBrZXlzLgogICAgICAg aW5zZXJ0X3JldHVybl90eXBlCi0gICAgICBfTV9yZWluc2VydF9ub2RlKG5vZGVfdHlwZSYm IF9fbmgpCisgICAgICBfTV9yZWluc2VydF9ub2RlKGNvbnN0X2l0ZXJhdG9yIF9faGludCwg bm9kZV90eXBlJiYgX19uaCkKICAgICAgIHsKIAlpbnNlcnRfcmV0dXJuX3R5cGUgX19yZXQ7 CiAJaWYgKF9fbmguZW1wdHkoKSkKQEAgLTEwMDksMjAgKzEwNDAsMzAgQEAgX0dMSUJDWFhf QkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KIAkgICAgX19nbGliY3h4X2Fzc2VydChnZXRfYWxs b2NhdG9yKCkgPT0gX19uaC5nZXRfYWxsb2NhdG9yKCkpOwogCiAJICAgIGNvbnN0IGtleV90 eXBlJiBfX2sgPSBfX25oLl9NX2tleSgpOwotCSAgICBfX2hhc2hfY29kZSBfX2NvZGUgPSB0 aGlzLT5fTV9oYXNoX2NvZGUoX19rKTsKLQkgICAgc2l6ZV90eXBlIF9fYmt0ID0gX01fYnVj a2V0X2luZGV4KF9fY29kZSk7Ci0JICAgIGlmIChfX25vZGVfcHRyIF9fbiA9IF9NX2ZpbmRf bm9kZShfX2JrdCwgX19rLCBfX2NvZGUpKQorCSAgICBpZiAoX19oaW50Ll9NX2N1cgorCQkm JiB0aGlzLT5fTV9rZXlfZXF1YWxzKF9faywgKl9faGludC5fTV9jdXIpKSBbW19fdW5saWtl bHlfX11dCiAJICAgICAgewogCQlfX3JldC5ub2RlID0gc3RkOjptb3ZlKF9fbmgpOwotCQlf X3JldC5wb3NpdGlvbiA9IGl0ZXJhdG9yKF9fbik7CisJCV9fcmV0LnBvc2l0aW9uID0gaXRl cmF0b3IoX19oaW50Ll9NX2N1cik7CiAJCV9fcmV0Lmluc2VydGVkID0gZmFsc2U7CiAJICAg ICAgfQogCSAgICBlbHNlCiAJICAgICAgewotCQlfX3JldC5wb3NpdGlvbgotCQkgID0gX01f aW5zZXJ0X3VuaXF1ZV9ub2RlKF9fYmt0LCBfX2NvZGUsIF9fbmguX01fcHRyKTsKLQkJX19u aC5fTV9wdHIgPSBudWxscHRyOwotCQlfX3JldC5pbnNlcnRlZCA9IHRydWU7CisJCV9faGFz aF9jb2RlIF9fY29kZSA9IHRoaXMtPl9NX2hhc2hfY29kZShfX2spOworCQlzaXplX3R5cGUg X19ia3QgPSBfTV9idWNrZXRfaW5kZXgoX19jb2RlKTsKKwkJaWYgKF9fbm9kZV9wdHIgX19u ID0gX01fZmluZF9ub2RlKF9fYmt0LCBfX2ssIF9fY29kZSkpCisJCSAgeworCQkgICAgX19y ZXQubm9kZSA9IHN0ZDo6bW92ZShfX25oKTsKKwkJICAgIF9fcmV0LnBvc2l0aW9uID0gaXRl cmF0b3IoX19uKTsKKwkJICAgIF9fcmV0Lmluc2VydGVkID0gZmFsc2U7CisJCSAgfQorCQll bHNlCisJCSAgeworCQkgICAgX19yZXQucG9zaXRpb24KKwkJICAgICAgPSBfTV9pbnNlcnRf dW5pcXVlX25vZGUoX19ia3QsIF9fY29kZSwgX19uaC5fTV9wdHIpOworCQkgICAgX19uaC5f TV9wdHIgPSBudWxscHRyOworCQkgICAgX19yZXQuaW5zZXJ0ZWQgPSB0cnVlOworCQkgIH0K IAkgICAgICB9CiAJICB9CiAJcmV0dXJuIF9fcmV0OwpAQCAtMTAzOCw3ICsxMDc5LDE2IEBA IF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAJX19nbGliY3h4X2Fzc2VydChn ZXRfYWxsb2NhdG9yKCkgPT0gX19uaC5nZXRfYWxsb2NhdG9yKCkpOwogCiAJY29uc3Qga2V5 X3R5cGUmIF9fayA9IF9fbmguX01fa2V5KCk7Ci0JYXV0byBfX2NvZGUgPSB0aGlzLT5fTV9o YXNoX2NvZGUoX19rKTsKKwlfX2hhc2hfY29kZSBfX2NvZGU7CisJaWYgKF9faGludC5fTV9j dXIKKwkgICAgJiYgdGhpcy0+X01fa2V5X2VxdWFscyhfX2ssICpfX2hpbnQuX01fY3VyKSkg W1tfX3VubGlrZWx5X19dXQorCSAgX19jb2RlID0gdGhpcy0+X01faGFzaF9jb2RlKCpfX2hp bnQuX01fY3VyKTsKKwllbHNlCisJICB7CisJICAgIF9fY29kZSA9IHRoaXMtPl9NX2hhc2hf Y29kZShfX2spOworCSAgICBfX2hpbnQgPSBjZW5kKCk7CisJICB9CisKIAlhdXRvIF9fcmV0 CiAJICA9IF9NX2luc2VydF9tdWx0aV9ub2RlKF9faGludC5fTV9jdXIsIF9fY29kZSwgX19u aC5fTV9wdHIpOwogCV9fbmguX01fcHRyID0gbnVsbHB0cjsKQEAgLTExMzEsOCArMTE4MSwx NiBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCSAgZm9yIChhdXRvIF9f aSA9IF9fc3JjLmNiZWdpbigpLCBfX2VuZCA9IF9fc3JjLmNlbmQoKTsgX19pICE9IF9fZW5k OykKIAkgICAgewogCSAgICAgIGF1dG8gX19wb3MgPSBfX2krKzsKLQkgICAgICBfX2hhc2hf Y29kZSBfX2NvZGUKLQkJPSB0aGlzLT5fTV9oYXNoX2NvZGUoX19zcmMuaGFzaF9mdW5jdGlv bigpLCAqX19wb3MuX01fY3VyKTsKKwkgICAgICBjb25zdCBrZXlfdHlwZSYgX19rID0gX0V4 dHJhY3RLZXl7fSgqX19wb3MpOworCSAgICAgIF9faGFzaF9jb2RlIF9fY29kZTsKKwkgICAg ICBpZiAoX19oaW50ICYmIHRoaXMtPl9NX2tleV9lcXVhbHMoX19rLCAqX19oaW50KSkgW1tf X3VubGlrZWx5X19dXQorCQlfX2NvZGUgPSB0aGlzLT5fTV9oYXNoX2NvZGUoKl9faGludCk7 CisJICAgICAgZWxzZQorCQl7CisJCSAgX19jb2RlID0gdGhpcy0+X01faGFzaF9jb2RlKF9f c3JjLmhhc2hfZnVuY3Rpb24oKSwgKl9fcG9zLl9NX2N1cik7CisJCSAgX19oaW50ID0gbnVs bHB0cjsKKwkJfQorCiAJICAgICAgYXV0byBfX25oID0gX19zcmMuZXh0cmFjdChfX3Bvcyk7 CiAJICAgICAgX19oaW50ID0gX01faW5zZXJ0X211bHRpX25vZGUoX19oaW50LCBfX2NvZGUs IF9fbmguX01fcHRyKS5fTV9jdXI7CiAJICAgICAgX19uaC5fTV9wdHIgPSBudWxscHRyOwpA QCAtMTM1NSw3ICsxNDEzLDcgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04K IAkgICAgLy8gX01fYmVmb3JlX2JlZ2luLgogCSAgICBfX25vZGVfcHRyIF9faHRfbiA9IF9f aHQuX01fYmVnaW4oKTsKIAkgICAgX19ub2RlX3B0ciBfX3RoaXNfbgotCSAgICAgID0gX19u b2RlX2dlbihfX2Z3ZF92YWx1ZV9mb3I8X0h0PihfX2h0X24tPl9NX3YoKSkpOworCSAgICAg ID0gX19ub2RlX2dlbihudWxscHRyLCBfX2Z3ZF92YWx1ZV9mb3I8X0h0PihfX2h0X24tPl9N X3YoKSkpOwogCSAgICB0aGlzLT5fTV9jb3B5X2NvZGUoKl9fdGhpc19uLCAqX19odF9uKTsK IAkgICAgX01fdXBkYXRlX2JiZWdpbihfX3RoaXNfbik7CiAKQEAgLTEzNjMsNyArMTQyMSw4 IEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAJICAgIF9fbm9kZV9wdHIg X19wcmV2X24gPSBfX3RoaXNfbjsKIAkgICAgZm9yIChfX2h0X24gPSBfX2h0X24tPl9NX25l eHQoKTsgX19odF9uOyBfX2h0X24gPSBfX2h0X24tPl9NX25leHQoKSkKIAkgICAgICB7Ci0J CV9fdGhpc19uID0gX19ub2RlX2dlbihfX2Z3ZF92YWx1ZV9mb3I8X0h0PihfX2h0X24tPl9N X3YoKSkpOworCQlfX3RoaXNfbgorCQkgID0gX19ub2RlX2dlbihfX3ByZXZfbiwgX19md2Rf dmFsdWVfZm9yPF9IdD4oX19odF9uLT5fTV92KCkpKTsKIAkJX19wcmV2X24tPl9NX254dCA9 IF9fdGhpc19uOwogCQl0aGlzLT5fTV9jb3B5X2NvZGUoKl9fdGhpc19uLCAqX19odF9uKTsK IAkJc2l6ZV90eXBlIF9fYmt0ID0gX01fYnVja2V0X2luZGV4KCpfX3RoaXNfbik7CkBAIC0y MDY1LDExICsyMTI0LDExIEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAg ICAgICBhdXRvCiAgICAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jLCBfRXh0 cmFjdEtleSwgX0VxdWFsLAogCQkgX0hhc2gsIF9SYW5nZUhhc2gsIF9VbnVzZWQsIF9SZWhh c2hQb2xpY3ksIF9UcmFpdHM+OjoKLSAgICAgIF9NX2VtcGxhY2UodHJ1ZV90eXBlIC8qIF9f dWtzICovLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICAgIF9NX2VtcGxhY2VfdW5pcXVlKGNv bnN0X2l0ZXJhdG9yIF9faGludCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCiAgICAgICAtPiBwYWly PGl0ZXJhdG9yLCBib29sPgogICAgICAgewogCS8vIEZpcnN0IGJ1aWxkIHRoZSBub2RlIHRv IGdldCBhY2Nlc3MgdG8gdGhlIGhhc2ggY29kZQotCV9TY29wZWRfbm9kZSBfX25vZGUgeyB0 aGlzLCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4gIH07CisJX1Njb3BlZF9ub2Rl IF9fbm9kZSB7IHRoaXMsIF9faGludC5fTV9jdXIsIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19h cmdzKS4uLiAgfTsKIAljb25zdCBrZXlfdHlwZSYgX19rID0gX0V4dHJhY3RLZXl7fShfX25v ZGUuX01fbm9kZS0+X01fdigpKTsKIAlpZiAoc2l6ZSgpIDw9IF9fc21hbGxfc2l6ZV90aHJl c2hvbGQoKSkKIAkgIHsKQEAgLTIwNzksMTIgKzIxMzgsMjUgQEAgX0dMSUJDWFhfQkVHSU5f TkFNRVNQQUNFX1ZFUlNJT04KIAkJcmV0dXJuIHsgX19pdCwgZmFsc2UgfTsKIAkgIH0KIAot CV9faGFzaF9jb2RlIF9fY29kZSA9IHRoaXMtPl9NX2hhc2hfY29kZShfX2spOwotCXNpemVf dHlwZSBfX2JrdCA9IF9NX2J1Y2tldF9pbmRleChfX2NvZGUpOworCV9faGFzaF9jb2RlIF9f Y29kZTsKKwlzaXplX3R5cGUgX19ia3Q7CiAJaWYgKHNpemUoKSA+IF9fc21hbGxfc2l6ZV90 aHJlc2hvbGQoKSkKLQkgIGlmIChfX25vZGVfcHRyIF9fcCA9IF9NX2ZpbmRfbm9kZShfX2Jr dCwgX19rLCBfX2NvZGUpKQotCSAgICAvLyBUaGVyZSBpcyBhbHJlYWR5IGFuIGVxdWl2YWxl bnQgbm9kZSwgbm8gaW5zZXJ0aW9uCi0JICAgIHJldHVybiB7IGl0ZXJhdG9yKF9fcCksIGZh bHNlIH07CisJICB7CisJICAgIGlmIChfX2hpbnQuX01fY3VyCisJCSYmIHRoaXMtPl9NX2tl eV9lcXVhbHMoX19rLCAqX19oaW50Ll9NX2N1cikpIFtbX191bmxpa2VseV9fXV0KKwkgICAg ICByZXR1cm4geyBpdGVyYXRvcihfX2hpbnQuX01fY3VyKSwgZmFsc2UgfTsKKworCSAgICBf X2NvZGUgPSB0aGlzLT5fTV9oYXNoX2NvZGUoX19rKTsKKwkgICAgX19ia3QgPSBfTV9idWNr ZXRfaW5kZXgoX19jb2RlKTsKKwkgICAgaWYgKF9fbm9kZV9wdHIgX19wID0gX01fZmluZF9u b2RlKF9fYmt0LCBfX2ssIF9fY29kZSkpCisJICAgICAgLy8gVGhlcmUgaXMgYWxyZWFkeSBh biBlcXVpdmFsZW50IG5vZGUsIG5vIGluc2VydGlvbgorCSAgICAgIHJldHVybiB7IGl0ZXJh dG9yKF9fcCksIGZhbHNlIH07CisJICB9CisJZWxzZQorCSAgeworCSAgICBfX2NvZGUgPSB0 aGlzLT5fTV9oYXNoX2NvZGUoX19rKTsKKwkgICAgX19ia3QgPSBfTV9idWNrZXRfaW5kZXgo X19jb2RlKTsKKwkgIH0KIAogCS8vIEluc2VydCB0aGUgbm9kZQogCWF1dG8gX19wb3MgPSBf TV9pbnNlcnRfdW5pcXVlX25vZGUoX19ia3QsIF9fY29kZSwgX19ub2RlLl9NX25vZGUpOwpA QCAtMjEwMCwxNCArMjE3MiwxNCBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lP TgogICAgICAgYXV0bwogICAgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywg X0V4dHJhY3RLZXksIF9FcXVhbCwKIAkJIF9IYXNoLCBfUmFuZ2VIYXNoLCBfVW51c2VkLCBf UmVoYXNoUG9saWN5LCBfVHJhaXRzPjo6Ci0gICAgICBfTV9lbXBsYWNlKGNvbnN0X2l0ZXJh dG9yIF9faGludCwgZmFsc2VfdHlwZSAvKiBfX3VrcyAqLywKLQkJIF9BcmdzJiYuLi4gX19h cmdzKQorICAgICAgX01fZW1wbGFjZV9tdWx0aShjb25zdF9pdGVyYXRvciBfX2hpbnQsIF9B cmdzJiYuLi4gX19hcmdzKQogICAgICAgLT4gaXRlcmF0b3IKICAgICAgIHsKIAkvLyBGaXJz dCBidWlsZCB0aGUgbm9kZSB0byBnZXQgaXRzIGhhc2ggY29kZS4KLQlfU2NvcGVkX25vZGUg X19ub2RlIHsgdGhpcywgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uICB9OwotCWNv bnN0IGtleV90eXBlJiBfX2sgPSBfRXh0cmFjdEtleXt9KF9fbm9kZS5fTV9ub2RlLT5fTV92 KCkpOworCV9TY29wZWRfbm9kZSBfX25vZGUKKwl7IHRoaXMsIF9faGludC5fTV9jdXIsIHN0 ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLiAgfTsKIAorCWNvbnN0IGtleV90eXBlJiBf X2sgPSBfRXh0cmFjdEtleXt9KF9fbm9kZS5fTV9ub2RlLT5fTV92KCkpOwogCWF1dG8gX19y ZXMgPSB0aGlzLT5fTV9jb21wdXRlX2hhc2hfY29kZShfX2hpbnQsIF9fayk7CiAJYXV0byBf X3BvcwogCSAgPSBfTV9pbnNlcnRfbXVsdGlfbm9kZShfX3Jlcy5maXJzdC5fTV9jdXIsIF9f cmVzLnNlY29uZCwKQEAgLTIxMjYsOSArMjE5OCwxMyBAQCBfR0xJQkNYWF9CRUdJTl9OQU1F U1BBQ0VfVkVSU0lPTgogICAgIF9NX2NvbXB1dGVfaGFzaF9jb2RlKGNvbnN0X2l0ZXJhdG9y IF9faGludCwgY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3QKICAgICAtPiBwYWlyPGNvbnN0 X2l0ZXJhdG9yLCBfX2hhc2hfY29kZT4KICAgICB7CisgICAgICBpZiAoX19oaW50Ll9NX2N1 cgorCSAgJiYgdGhpcy0+X01fa2V5X2VxdWFscyhfX2ssICpfX2hpbnQuX01fY3VyKSkgW1tf X3VubGlrZWx5X19dXQorCXJldHVybiB7IF9faGludCwgdGhpcy0+X01faGFzaF9jb2RlKCpf X2hpbnQuX01fY3VyKSB9OworCiAgICAgICBpZiAoc2l6ZSgpIDw9IF9fc21hbGxfc2l6ZV90 aHJlc2hvbGQoKSkKIAl7Ci0JICBpZiAoX19oaW50ICE9IGNlbmQoKSkKKwkgIGlmIChfX2hp bnQuX01fY3VyKSBbW19fdW5saWtlbHlfX11dCiAJICAgIHsKIAkgICAgICBmb3IgKGF1dG8g X19pdCA9IF9faGludDsgX19pdCAhPSBjZW5kKCk7ICsrX19pdCkKIAkJaWYgKHRoaXMtPl9N X2tleV9lcXVhbHMoX19rLCAqX19pdC5fTV9jdXIpKQpAQCAtMjE5OCwxNyArMjI3NCwxNyBA QCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogICAgICAgLy8gRmluZCB0aGUg bm9kZSBiZWZvcmUgYW4gZXF1aXZhbGVudCBvbmUgb3IgdXNlIGhpbnQgaWYgaXQgZXhpc3Rz IGFuZAogICAgICAgLy8gaWYgaXQgaXMgZXF1aXZhbGVudC4KICAgICAgIF9fbm9kZV9iYXNl X3B0ciBfX3ByZXYKLQk9IF9fYnVpbHRpbl9leHBlY3QoX19oaW50ICE9IG51bGxwdHIsIGZh bHNlKQotCSAgJiYgdGhpcy0+X01fZXF1YWxzKF9faywgX19jb2RlLCAqX19oaW50KQotCSAg ICA/IF9faGludAotCSAgICA6IF9NX2ZpbmRfYmVmb3JlX25vZGUoX19ia3QsIF9faywgX19j b2RlKTsKKwk9IF9fYnVpbHRpbl9leHBlY3QoX19oaW50ICE9IG51bGxwdHIgJiYKKwkJCSAg IHRoaXMtPl9NX2VxdWFscyhfX2ssIF9fY29kZSwgKl9faGludCksIGZhbHNlKQorCT8gX19o aW50CisJOiBfTV9maW5kX2JlZm9yZV9ub2RlKF9fYmt0LCBfX2ssIF9fY29kZSk7CiAKICAg ICAgIGlmIChfX3ByZXYpCiAJewogCSAgLy8gSW5zZXJ0IGFmdGVyIHRoZSBub2RlIGJlZm9y ZSB0aGUgZXF1aXZhbGVudCBvbmUuCiAJICBfX25vZGUtPl9NX254dCA9IF9fcHJldi0+X01f bnh0OwogCSAgX19wcmV2LT5fTV9ueHQgPSBfX25vZGU7Ci0JICBpZiAoX19idWlsdGluX2V4 cGVjdChfX3ByZXYgPT0gX19oaW50LCBmYWxzZSkpCisJICBpZiAoX19wcmV2ID09IF9faGlu dCkgW1tfX3VubGlrZWx5X19dXQogCSAgICAvLyBoaW50IG1pZ2h0IGJlIHRoZSBsYXN0IGJ1 Y2tldCBub2RlLCBpbiB0aGlzIGNhc2Ugd2UgbmVlZCB0bwogCSAgICAvLyB1cGRhdGUgbmV4 dCBidWNrZXQuCiAJICAgIGlmIChfX25vZGUtPl9NX254dApAQCAtMjIzNywxMCArMjMxMywx NSBAQCBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogICAgICAgYXV0bwogICAg ICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvYywgX0V4dHJhY3RLZXksIF9FcXVh bCwKIAkJIF9IYXNoLCBfUmFuZ2VIYXNoLCBfVW51c2VkLCBfUmVoYXNoUG9saWN5LCBfVHJh aXRzPjo6Ci0gICAgICBfTV9pbnNlcnRfdW5pcXVlKF9LdCYmIF9faywgX0FyZyYmIF9fdiwK KyAgICAgIF9NX2luc2VydF91bmlxdWUoY29uc3RfaXRlcmF0b3IgX19oaW50LAorCQkgICAg ICAgX0t0JiYgX19rLCBfQXJnJiYgX192LAogCQkgICAgICAgY29uc3QgX05vZGVHZW5lcmF0 b3ImIF9fbm9kZV9nZW4pCiAgICAgICAtPiBwYWlyPGl0ZXJhdG9yLCBib29sPgogICAgICAg eworCWlmIChfX2hpbnQuX01fY3VyCisJICAgICYmIHRoaXMtPl9NX2tleV9lcXVhbHNfdHIo X19rLCAqX19oaW50Ll9NX2N1cikpIFtbX191bmxpa2VseV9fXV0KKwkgIHJldHVybiB7IGl0 ZXJhdG9yKF9faGludC5fTV9jdXIpLCBmYWxzZSB9OworCiAJaWYgKHNpemUoKSA8PSBfX3Nt YWxsX3NpemVfdGhyZXNob2xkKCkpCiAJICBmb3IgKGF1dG8gX19pdCA9IGJlZ2luKCk7IF9f aXQgIT0gZW5kKCk7ICsrX19pdCkKIAkgICAgaWYgKHRoaXMtPl9NX2tleV9lcXVhbHNfdHIo X19rLCAqX19pdC5fTV9jdXIpKQpAQCAtMjI1NCwxMSArMjMzNSwxMyBAQCBfR0xJQkNYWF9C RUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgogCSAgICByZXR1cm4geyBpdGVyYXRvcihfX25vZGUp LCBmYWxzZSB9OwogCiAJX1Njb3BlZF9ub2RlIF9fbm9kZSB7Ci0JICBfX25vZGVfYnVpbGRl cl90OjpfU19idWlsZChzdGQ6OmZvcndhcmQ8X0t0PihfX2spLAorCSAgX19ub2RlX2J1aWxk ZXJfdDo6X1NfYnVpbGQoX01fZ2V0X2hpbnQoX19ia3QsIF9faGludC5fTV9jdXIpLAorCQkJ CSAgICAgc3RkOjpmb3J3YXJkPF9LdD4oX19rKSwKIAkJCQkgICAgIHN0ZDo6Zm9yd2FyZDxf QXJnPihfX3YpLAogCQkJCSAgICAgX19ub2RlX2dlbiksCiAJICB0aGlzCiAJfTsKKwogCWF1 dG8gX19wb3MKIAkgID0gX01faW5zZXJ0X3VuaXF1ZV9ub2RlKF9fYmt0LCBfX2NvZGUsIF9f bm9kZS5fTV9ub2RlKTsKIAlfX25vZGUuX01fbm9kZSA9IG51bGxwdHI7CkBAIC0yMjgwLDEy ICsyMzYzLDEyIEBAIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCiAgICAgICAt PiBpdGVyYXRvcgogICAgICAgewogCS8vIEZpcnN0IGFsbG9jYXRlIG5ldyBub2RlIHNvIHRo YXQgd2UgZG9uJ3QgZG8gYW55dGhpbmcgaWYgaXQgdGhyb3dzLgotCV9TY29wZWRfbm9kZSBf X25vZGV7IF9fbm9kZV9nZW4oc3RkOjpmb3J3YXJkPF9Bcmc+KF9fdikpLCB0aGlzIH07CisJ X1Njb3BlZF9ub2RlIF9fbm9kZQorCXsgX19ub2RlX2dlbihfX2hpbnQuX01fY3VyLCBzdGQ6 OmZvcndhcmQ8X0FyZz4oX192KSksIHRoaXMgfTsKIAogCS8vIFNlY29uZCBjb21wdXRlIHRo ZSBoYXNoIGNvZGUgc28gdGhhdCB3ZSBkb24ndCByZWhhc2ggaWYgaXQgdGhyb3dzLgogCWF1 dG8gX19yZXMgPSB0aGlzLT5fTV9jb21wdXRlX2hhc2hfY29kZSgKIAkgIF9faGludCwgX0V4 dHJhY3RLZXl7fShfX25vZGUuX01fbm9kZS0+X01fdigpKSk7Ci0KIAlhdXRvIF9fcG9zCiAJ ICA9IF9NX2luc2VydF9tdWx0aV9ub2RlKF9fcmVzLmZpcnN0Ll9NX2N1ciwgX19yZXMuc2Vj b25kLAogCQkJCSBfX25vZGUuX01fbm9kZSk7CmRpZmYgLS1naXQgYS9saWJzdGRjKystdjMv aW5jbHVkZS9iaXRzL2hhc2h0YWJsZV9wb2xpY3kuaCBiL2xpYnN0ZGMrKy12My9pbmNsdWRl L2JpdHMvaGFzaHRhYmxlX3BvbGljeS5oCmluZGV4IGYyNjk2YWU5YjA3Li44M2E5ZmYyYmIz ZCAxMDA2NDQKLS0tIGEvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy9oYXNodGFibGVfcG9s aWN5LmgKKysrIGIvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy9oYXNodGFibGVfcG9saWN5 LmgKQEAgLTE1MywxMiArMTUzLDE0IEBAIG5hbWVzcGFjZSBfX2RldGFpbAogICB0ZW1wbGF0 ZTw+CiAgICAgc3RydWN0IF9Ob2RlQnVpbGRlcjxfU2VsZWN0MXN0PgogICAgIHsKLSAgICAg IHRlbXBsYXRlPHR5cGVuYW1lIF9LdCwgdHlwZW5hbWUgX0FyZywgdHlwZW5hbWUgX05vZGVH ZW5lcmF0b3I+Ci0Jc3RhdGljIGF1dG8KLQlfU19idWlsZChfS3QmJiBfX2ssIF9BcmcmJiBf X2FyZywgY29uc3QgX05vZGVHZW5lcmF0b3ImIF9fbm9kZV9nZW4pCi0JLT4gdHlwZW5hbWUg X05vZGVHZW5lcmF0b3I6Ol9fbm9kZV90eXBlKgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUg X05vZGVQdHIsCisJICAgICAgIHR5cGVuYW1lIF9LdCwgdHlwZW5hbWUgX0FyZywgdHlwZW5h bWUgX05vZGVHZW5lcmF0b3I+CisJc3RhdGljIF9Ob2RlUHRyCisJX1NfYnVpbGQoX05vZGVQ dHIgX19oaW50LAorCQkgX0t0JiYgX19rLCBfQXJnJiYgX19hcmcsIGNvbnN0IF9Ob2RlR2Vu ZXJhdG9yJiBfX25vZGVfZ2VuKQogCXsKLQkgIHJldHVybiBfX25vZGVfZ2VuKHN0ZDo6Zm9y d2FyZDxfS3Q+KF9fayksCisJICByZXR1cm4gX19ub2RlX2dlbihfX2hpbnQsCisJCQkgICAg c3RkOjpmb3J3YXJkPF9LdD4oX19rKSwKIAkJCSAgICBzdGQ6OmZvcndhcmQ8X0FyZz4oX19h cmcpLnNlY29uZCk7CiAJfQogICAgIH07CkBAIC0xNjYsMTEgKzE2OCwxMiBAQCBuYW1lc3Bh Y2UgX19kZXRhaWwKICAgdGVtcGxhdGU8PgogICAgIHN0cnVjdCBfTm9kZUJ1aWxkZXI8X0lk ZW50aXR5PgogICAgIHsKLSAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9LdCwgdHlwZW5hbWUg X0FyZywgdHlwZW5hbWUgX05vZGVHZW5lcmF0b3I+Ci0Jc3RhdGljIGF1dG8KLQlfU19idWls ZChfS3QmJiBfX2ssIF9BcmcmJiwgY29uc3QgX05vZGVHZW5lcmF0b3ImIF9fbm9kZV9nZW4p Ci0JLT4gdHlwZW5hbWUgX05vZGVHZW5lcmF0b3I6Ol9fbm9kZV90eXBlKgotCXsgcmV0dXJu IF9fbm9kZV9nZW4oc3RkOjpmb3J3YXJkPF9LdD4oX19rKSk7IH0KKyAgICAgIHRlbXBsYXRl PHR5cGVuYW1lIF9Ob2RlUHRyLAorCSAgICAgICB0eXBlbmFtZSBfS3QsIHR5cGVuYW1lIF9B cmcsIHR5cGVuYW1lIF9Ob2RlR2VuZXJhdG9yPgorCXN0YXRpYyBfTm9kZVB0cgorCV9TX2J1 aWxkKF9Ob2RlUHRyIF9faGludCwKKwkJIF9LdCYmIF9faywgX0FyZyYmLCBjb25zdCBfTm9k ZUdlbmVyYXRvciYgX19ub2RlX2dlbikKKwl7IHJldHVybiBfX25vZGVfZ2VuKF9faGludCwg c3RkOjpmb3J3YXJkPF9LdD4oX19rKSk7IH0KICAgICB9OwogCiAgIHRlbXBsYXRlPHR5cGVu YW1lIF9Ob2RlQWxsb2M+CkBAIC0xODgsMjIgKzE5MSwyMyBAQCBuYW1lc3BhY2UgX19kZXRh aWwKIAl0eXBlbmFtZSBfX2hhc2h0YWJsZV9hbGxvYzo6X19ub2RlX2FsbG9jX3RyYWl0czsK IAogICAgIHB1YmxpYzoKLSAgICAgIHVzaW5nIF9fbm9kZV90eXBlID0gdHlwZW5hbWUgX19o YXNodGFibGVfYWxsb2M6Ol9fbm9kZV90eXBlOworICAgICAgdXNpbmcgX19ub2RlX3B0ciA9 IHR5cGVuYW1lIF9faGFzaHRhYmxlX2FsbG9jOjpfX25vZGVfcHRyOwogCi0gICAgICBfUmV1 c2VPckFsbG9jTm9kZShfX25vZGVfdHlwZSogX19ub2RlcywgX19oYXNodGFibGVfYWxsb2Mm IF9faCkKKyAgICAgIF9SZXVzZU9yQWxsb2NOb2RlKF9fbm9kZV9wdHIgX19ub2RlcywgX19o YXNodGFibGVfYWxsb2MmIF9faCkKICAgICAgIDogX01fbm9kZXMoX19ub2RlcyksIF9NX2go X19oKSB7IH0KKwogICAgICAgX1JldXNlT3JBbGxvY05vZGUoY29uc3QgX1JldXNlT3JBbGxv Y05vZGUmKSA9IGRlbGV0ZTsKIAogICAgICAgfl9SZXVzZU9yQWxsb2NOb2RlKCkKICAgICAg IHsgX01faC5fTV9kZWFsbG9jYXRlX25vZGVzKF9NX25vZGVzKTsgfQogCiAgICAgICB0ZW1w bGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KLQlfX25vZGVfdHlwZSoKLQlvcGVyYXRvcigpKF9B cmdzJiYuLi4gX19hcmdzKSBjb25zdAorCV9fbm9kZV9wdHIKKwlvcGVyYXRvcigpKF9fbm9k ZV9wdHIgX19oaW50LCBfQXJncyYmLi4uIF9fYXJncykgY29uc3QKIAl7CiAJICBpZiAoX01f bm9kZXMpCiAJICAgIHsKLQkgICAgICBfX25vZGVfdHlwZSogX19ub2RlID0gX01fbm9kZXM7 CisJICAgICAgX19ub2RlX3B0ciBfX25vZGUgPSBfTV9ub2RlczsKIAkgICAgICBfTV9ub2Rl cyA9IF9NX25vZGVzLT5fTV9uZXh0KCk7CiAJICAgICAgX19ub2RlLT5fTV9ueHQgPSBudWxs cHRyOwogCSAgICAgIGF1dG8mIF9fYSA9IF9NX2guX01fbm9kZV9hbGxvY2F0b3IoKTsKQEAg LTIxOCwxMyArMjIyLDE1IEBAIG5hbWVzcGFjZSBfX2RldGFpbAogCQkgIF9NX2guX01fZGVh bGxvY2F0ZV9ub2RlX3B0cihfX25vZGUpOwogCQkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWlu OwogCQl9CisKIAkgICAgICByZXR1cm4gX19ub2RlOwogCSAgICB9Ci0JICByZXR1cm4gX01f aC5fTV9hbGxvY2F0ZV9ub2RlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisK KwkgIHJldHVybiBfTV9oLl9NX2FsbG9jYXRlX25vZGUoX19oaW50LCBzdGQ6OmZvcndhcmQ8 X0FyZ3M+KF9fYXJncykuLi4pOwogCX0KIAogICAgIHByaXZhdGU6Ci0gICAgICBtdXRhYmxl IF9fbm9kZV90eXBlKiBfTV9ub2RlczsKKyAgICAgIG11dGFibGUgX19ub2RlX3B0ciBfTV9u b2RlczsKICAgICAgIF9faGFzaHRhYmxlX2FsbG9jJiBfTV9oOwogICAgIH07CiAKQEAgLTIz NywxNSArMjQzLDE1IEBAIG5hbWVzcGFjZSBfX2RldGFpbAogICAgICAgdXNpbmcgX19oYXNo dGFibGVfYWxsb2MgPSBfSGFzaHRhYmxlX2FsbG9jPF9Ob2RlQWxsb2M+OwogCiAgICAgcHVi bGljOgotICAgICAgdXNpbmcgX19ub2RlX3R5cGUgPSB0eXBlbmFtZSBfX2hhc2h0YWJsZV9h bGxvYzo6X19ub2RlX3R5cGU7CisgICAgICB1c2luZyBfX25vZGVfcHRyID0gdHlwZW5hbWUg X19oYXNodGFibGVfYWxsb2M6Ol9fbm9kZV9wdHI7CiAKICAgICAgIF9BbGxvY05vZGUoX19o YXNodGFibGVfYWxsb2MmIF9faCkKICAgICAgIDogX01faChfX2gpIHsgfQogCiAgICAgICB0 ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KLQlfX25vZGVfdHlwZSoKLQlvcGVyYXRvcigp KF9BcmdzJiYuLi4gX19hcmdzKSBjb25zdAotCXsgcmV0dXJuIF9NX2guX01fYWxsb2NhdGVf bm9kZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisJX19ub2RlX3B0cgor CW9wZXJhdG9yKCkoX19ub2RlX3B0ciBfX2hpbnQsIF9BcmdzJiYuLi4gX19hcmdzKSBjb25z dAorCXsgcmV0dXJuIF9NX2guX01fYWxsb2NhdGVfbm9kZShfX2hpbnQsIHN0ZDo6Zm9yd2Fy ZDxfQXJncz4oX19hcmdzKS4uLik7IH0KIAogICAgIHByaXZhdGU6CiAgICAgICBfX2hhc2h0 YWJsZV9hbGxvYyYgX01faDsKQEAgLTgxMyw2ICs4MTksNyBAQCBuYW1lc3BhY2UgX19kZXRh aWwKIAogICAgICAgdHlwZW5hbWUgX19oYXNodGFibGU6Ol9TY29wZWRfbm9kZSBfX25vZGUg ewogCV9faCwKKwlfX2gtPl9NX2dldF9oaW50KF9fYmt0KSwKIAlzdGQ6OnBpZWNld2lzZV9j b25zdHJ1Y3QsCiAJc3RkOjp0dXBsZTxjb25zdCBrZXlfdHlwZSY+KF9fayksCiAJc3RkOjp0 dXBsZTw+KCkKQEAgLTg0MCw2ICs4NDcsNyBAQCBuYW1lc3BhY2UgX19kZXRhaWwKIAogICAg ICAgdHlwZW5hbWUgX19oYXNodGFibGU6Ol9TY29wZWRfbm9kZSBfX25vZGUgewogCV9faCwK KwlfX2gtPl9NX2dldF9oaW50KF9fYmt0KSwKIAlzdGQ6OnBpZWNld2lzZV9jb25zdHJ1Y3Qs CiAJc3RkOjpmb3J3YXJkX2FzX3R1cGxlKHN0ZDo6bW92ZShfX2spKSwKIAlzdGQ6OnR1cGxl PD4oKQpAQCAtOTM5LDcgKzk0Nyw3IEBAIG5hbWVzcGFjZSBfX2RldGFpbAogCiAgICAgICB0 ZW1wbGF0ZTx0eXBlbmFtZSBfS1R5cGUsIHR5cGVuYW1lLi4uIF9BcmdzPgogCXN0ZDo6cGFp cjxpdGVyYXRvciwgYm9vbD4KLQl0cnlfZW1wbGFjZShjb25zdF9pdGVyYXRvciwgX0tUeXBl JiYgX19rLCBfQXJncyYmLi4uIF9fYXJncykKKwl0cnlfZW1wbGFjZShjb25zdF9pdGVyYXRv ciBfX2hpbnQsIF9LVHlwZSYmIF9faywgX0FyZ3MmJi4uLiBfX2FyZ3MpCiAJewogCSAgX19o YXNodGFibGUmIF9faCA9IF9NX2Nvbmp1cmVfaGFzaHRhYmxlKCk7CiAJICBhdXRvIF9fY29k ZSA9IF9faC5fTV9oYXNoX2NvZGUoX19rKTsKQEAgLTk0OCw3ICs5NTYsNyBAQCBuYW1lc3Bh Y2UgX19kZXRhaWwKIAkgICAgcmV0dXJuIHsgaXRlcmF0b3IoX19ub2RlKSwgZmFsc2UgfTsK IAogCSAgdHlwZW5hbWUgX19oYXNodGFibGU6Ol9TY29wZWRfbm9kZSBfX25vZGUgewotCSAg ICAmX19oLAorCSAgICAmX19oLCBfX2hpbnQuX01fY3VyLAogCSAgICBzdGQ6OnBpZWNld2lz ZV9jb25zdHJ1Y3QsCiAJICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShzdGQ6OmZvcndhcmQ8 X0tUeXBlPihfX2spKSwKIAkgICAgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKHN0ZDo6Zm9yd2Fy ZDxfQXJncz4oX19hcmdzKS4uLikKQEAgLTE5NjYsNyArMTk3NCw3IEBAIG5hbWVzcGFjZSBf X2RldGFpbAogICAgICAgLy8gQWxsb2NhdGUgYSBub2RlIGFuZCBjb25zdHJ1Y3QgYW4gZWxl bWVudCB3aXRoaW4gaXQuCiAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KIAlf X25vZGVfcHRyCi0JX01fYWxsb2NhdGVfbm9kZShfQXJncyYmLi4uIF9fYXJncyk7CisJX01f YWxsb2NhdGVfbm9kZShfX25vZGVfcHRyIF9faGludCwgX0FyZ3MmJi4uLiBfX2FyZ3MpOwog CiAgICAgICAvLyBEZXN0cm95IHRoZSBlbGVtZW50IHdpdGhpbiBhIG5vZGUgYW5kIGRlYWxs b2NhdGUgdGhlIG5vZGUuCiAgICAgICB2b2lkCkBAIC0xOTkzLDIyICsyMDAxLDMyIEBAIG5h bWVzcGFjZSBfX2RldGFpbAogICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTm9kZUFsbG9jPgogICAg IHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgogICAgICAgYXV0bwotICAgICAgX0hhc2h0 YWJsZV9hbGxvYzxfTm9kZUFsbG9jPjo6X01fYWxsb2NhdGVfbm9kZShfQXJncyYmLi4uIF9f YXJncykKKyAgICAgIF9IYXNodGFibGVfYWxsb2M8X05vZGVBbGxvYz46Ol9NX2FsbG9jYXRl X25vZGUoX19ub2RlX3B0ciBfX2hpbnQsCisJCQkJCQkgICAgIF9BcmdzJiYuLi4gX19hcmdz KQogICAgICAgLT4gX19ub2RlX3B0cgogICAgICAgewotCWF1dG8gX19ucHRyID0gX19ub2Rl X2FsbG9jX3RyYWl0czo6YWxsb2NhdGUoX01fbm9kZV9hbGxvY2F0b3IoKSwgMSk7CisJYXV0 byYgX19hbGxvYyA9IF9NX25vZGVfYWxsb2NhdG9yKCk7CisJdHlwZW5hbWUgX19ub2RlX2Fs bG9jX3RyYWl0czo6cG9pbnRlciBfX25wdHI7CisJaWYgKF9faGludCkgW1tfX3VubGlrZWx5 X19dXQorCSAgeworCSAgICB0eXBlZGVmIHR5cGVuYW1lIF9fbm9kZV9hbGxvY190cmFpdHM6 OmNvbnN0X3BvaW50ZXIgX0NQdHI7CisJICAgIGF1dG8gX19ocHRyID0gc3RkOjpwb2ludGVy X3RyYWl0czxfQ1B0cj46OnBvaW50ZXJfdG8oKl9faGludCk7CisJICAgIF9fbnB0ciA9IF9f bm9kZV9hbGxvY190cmFpdHM6OmFsbG9jYXRlKF9fYWxsb2MsIDEsIF9faHB0cik7CisJICB9 CisJZWxzZQorCSAgX19ucHRyID0gX19ub2RlX2FsbG9jX3RyYWl0czo6YWxsb2NhdGUoX19h bGxvYywgMSk7CisKIAlfX25vZGVfcHRyIF9fbiA9IHN0ZDo6X190b19hZGRyZXNzKF9fbnB0 cik7CiAJX190cnkKIAkgIHsKIAkgICAgOjpuZXcgKCh2b2lkKilfX24pIF9fbm9kZV90eXBl OwotCSAgICBfX25vZGVfYWxsb2NfdHJhaXRzOjpjb25zdHJ1Y3QoX01fbm9kZV9hbGxvY2F0 b3IoKSwKLQkJCQkJICAgX19uLT5fTV92YWxwdHIoKSwKKwkgICAgX19ub2RlX2FsbG9jX3Ry YWl0czo6Y29uc3RydWN0KF9fYWxsb2MsIF9fbi0+X01fdmFscHRyKCksCiAJCQkJCSAgIHN0 ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CiAJICAgIHJldHVybiBfX247CiAJICB9 CiAJX19jYXRjaCguLi4pCiAJICB7Ci0JICAgIF9fbm9kZV9hbGxvY190cmFpdHM6OmRlYWxs b2NhdGUoX01fbm9kZV9hbGxvY2F0b3IoKSwgX19ucHRyLCAxKTsKKwkgICAgX19ub2RlX2Fs bG9jX3RyYWl0czo6ZGVhbGxvY2F0ZShfX2FsbG9jLCBfX25wdHIsIDEpOwogCSAgICBfX3Ro cm93X2V4Y2VwdGlvbl9hZ2FpbjsKIAkgIH0KICAgICAgIH0KZGlmZiAtLWdpdCBhL2xpYnN0 ZGMrKy12My9pbmNsdWRlL2JpdHMvdW5vcmRlcmVkX21hcC5oIGIvbGlic3RkYysrLXYzL2lu Y2x1ZGUvYml0cy91bm9yZGVyZWRfbWFwLmgKaW5kZXggNWEzZTZmNjFhZjIuLmY5ZTQ1MDRl Y2M3IDEwMDY0NAotLS0gYS9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL3Vub3JkZXJlZF9t YXAuaAorKysgYi9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL3Vub3JkZXJlZF9tYXAuaApA QCAtNDQxLDEyICs0NDEsMTIgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0NPTlRBSU5F UgogICAgICAgLy8vIFJlLWluc2VydCBhbiBleHRyYWN0ZWQgbm9kZS4KICAgICAgIGluc2Vy dF9yZXR1cm5fdHlwZQogICAgICAgaW5zZXJ0KG5vZGVfdHlwZSYmIF9fbmgpCi0gICAgICB7 IHJldHVybiBfTV9oLl9NX3JlaW5zZXJ0X25vZGUoc3RkOjptb3ZlKF9fbmgpKTsgfQorICAg ICAgeyByZXR1cm4gX01faC5fTV9yZWluc2VydF9ub2RlKGNlbmQoKSwgc3RkOjptb3ZlKF9f bmgpKTsgfQogCiAgICAgICAvLy8gUmUtaW5zZXJ0IGFuIGV4dHJhY3RlZCBub2RlLgogICAg ICAgaXRlcmF0b3IKLSAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciwgbm9kZV90eXBlJiYg X19uaCkKLSAgICAgIHsgcmV0dXJuIF9NX2guX01fcmVpbnNlcnRfbm9kZShzdGQ6Om1vdmUo X19uaCkpLnBvc2l0aW9uOyB9CisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19oaW50 LCBub2RlX3R5cGUmJiBfX25oKQorICAgICAgeyByZXR1cm4gX01faC5fTV9yZWluc2VydF9u b2RlKF9faGludCwgc3RkOjptb3ZlKF9fbmgpKS5wb3NpdGlvbjsgfQogCiAjZGVmaW5lIF9f Y3BwX2xpYl91bm9yZGVyZWRfbWFwX3RyeV9lbXBsYWNlIDIwMTQxMUwKICAgICAgIC8qKgpk aWZmIC0tZ2l0IGEvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy91bm9yZGVyZWRfc2V0Lmgg Yi9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL3Vub3JkZXJlZF9zZXQuaAppbmRleCA3NDBi YmFmZDRjOS4uOTczMWM5YWE4NGMgMTAwNjQ0Ci0tLSBhL2xpYnN0ZGMrKy12My9pbmNsdWRl L2JpdHMvdW5vcmRlcmVkX3NldC5oCisrKyBiL2xpYnN0ZGMrKy12My9pbmNsdWRlL2JpdHMv dW5vcmRlcmVkX3NldC5oCkBAIC01MDIsMTIgKzUwMiwxMiBAQCBfR0xJQkNYWF9CRUdJTl9O QU1FU1BBQ0VfQ09OVEFJTkVSCiAgICAgICAvLy8gUmUtaW5zZXJ0IGFuIGV4dHJhY3RlZCBu b2RlLgogICAgICAgaW5zZXJ0X3JldHVybl90eXBlCiAgICAgICBpbnNlcnQobm9kZV90eXBl JiYgX19uaCkKLSAgICAgIHsgcmV0dXJuIF9NX2guX01fcmVpbnNlcnRfbm9kZShzdGQ6Om1v dmUoX19uaCkpOyB9CisgICAgICB7IHJldHVybiBfTV9oLl9NX3JlaW5zZXJ0X25vZGUoY2Vu ZCgpLCBzdGQ6Om1vdmUoX19uaCkpOyB9CiAKICAgICAgIC8vLyBSZS1pbnNlcnQgYW4gZXh0 cmFjdGVkIG5vZGUuCiAgICAgICBpdGVyYXRvcgotICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJh dG9yLCBub2RlX3R5cGUmJiBfX25oKQotICAgICAgeyByZXR1cm4gX01faC5fTV9yZWluc2Vy dF9ub2RlKHN0ZDo6bW92ZShfX25oKSkucG9zaXRpb247IH0KKyAgICAgIGluc2VydChjb25z dF9pdGVyYXRvciBfX2hpbnQsIG5vZGVfdHlwZSYmIF9fbmgpCisgICAgICB7IHJldHVybiBf TV9oLl9NX3JlaW5zZXJ0X25vZGUoX19oaW50LCBzdGQ6Om1vdmUoX19uaCkpLnBvc2l0aW9u OyB9CiAjZW5kaWYgLy8gQysrMTcKIAogICAgICAgLy8vQHsK --------------0ym0zy6qnq2f9s0XwlLnibgD--