Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qTL0o-009Ejw-GS for pgsql-hackers@arkaria.postgresql.org; Tue, 08 Aug 2023 11:36:30 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1qTL0m-00G4Qg-VX for pgsql-hackers@arkaria.postgresql.org; Tue, 08 Aug 2023 11:36:29 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qTL0m-00G4QY-JR for pgsql-hackers@lists.postgresql.org; Tue, 08 Aug 2023 11:36:29 +0000 Received: from oss.nttdata.com ([49.212.34.109]) by magus.postgresql.org with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qTL0j-001HJ7-At for pgsql-hackers@lists.postgresql.org; Tue, 08 Aug 2023 11:36:28 +0000 Received: from oss.nttdata.com (localhost [127.0.0.1]) by oss.nttdata.com (Postfix) with ESMTPA id E265F607B9; Tue, 8 Aug 2023 20:36:20 +0900 (JST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.8 at oss.nttdata.com MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_760c614fd3b824098e59ad81f20cd676" Content-Transfer-Encoding: 7bit Date: Tue, 08 Aug 2023 20:36:20 +0900 From: Masahiro Ikeda To: Michael Paquier Cc: Andres Freund , Bharath Rupireddy , Tristan Partin , pgsql-hackers@lists.postgresql.org Subject: Re: Support to define custom wait events for extensions In-Reply-To: References: <446d286f3272437df705ee69ad0d8793@oss.nttdata.com> <171b38978ae8a21e5635998d9bfedbf6@oss.nttdata.com> <20230801032349.aaiuvhtrcvvcwzcx@awork3.anarazel.de> <9cc4136f9e3629a2ffc8ac66b4de3f31@oss.nttdata.com> <2373bd1fe4d0156649dc5794a86fe94e@oss.nttdata.com> User-Agent: Roundcube Webmail/1.4.11 Message-ID: X-Sender: ikedamsh@oss.nttdata.com List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --=_760c614fd3b824098e59ad81f20cd676 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed On 2023-08-08 10:05, Michael Paquier wrote: > On Tue, Aug 08, 2023 at 09:39:02AM +0900, Masahiro Ikeda wrote: >> I am thinking a bit that we also need another hash where the key >> is a custom string. For extensions that have no dependencies >> with shared_preload_libraries, I think we need to avoid that >> WaitEventExtensionNew() is called repeatedly and a new eventId >> is issued each time. >> >> So, is it better to have another hash where the key is >> a custom string and uniqueness is identified by it to determine >> if a new eventId should be issued? > > Yeah, I was also considering if something like that is really > necessary, but I cannot stop worrying about adding more contention to > the hash table lookup each time an extention needs to retrieve an > event ID to use for WaitLatch() or such. The results of the hash > table lookups could be cached in each backend, still it creates an > extra cost when combined with queries running in parallel on > pg_stat_activity that do the opposite lookup event_id -> event_name. > > My suggestion adds more load to AddinShmemInitLock instead. > Hence, I was just thinking about relying on AddinShmemInitLock to > insert new entries in the hash table, only if its shmem state is not > found when calling ShmemInitStruct(). Or perhaps it is just OK to not > care about the impact event_name -> event_id lookup for fresh > connections, and just bite the bullet with two lookup keys instead of > relying on AddinShmemInitLock for the addition of new entries in the > hash table? Hmm, perhaps you're right with your approach here, at the > end. For the first idea, I agree that if a lot of new connections come in, it is easy to leads many conflicts. The only solution I can think of is to use connection pooling now. IIUC, the second idea is based on the premise of allocating their shared memory for each extension. In that case, the cons of the first idea can be solved because the wait event infos are saved in their shared memory and they don't need call WaitEventExtensionNew() anymore. Is that right? Regards, -- Masahiro Ikeda NTT DATA CORPORATION --=_760c614fd3b824098e59ad81f20cd676 Content-Transfer-Encoding: base64 Content-Type: text/x-diff; charset=us-ascii; name=v1-0001-Change-to-manage-custom-wait-events-in-shared-hash.patch Content-Disposition: attachment; filename=v1-0001-Change-to-manage-custom-wait-events-in-shared-hash.patch; size=21366 RnJvbSAwZTNjY2M2NDc0YmZjYzUxMTE0ZDkzNjNiNzgxOWI2OGYzN2ZjYWQzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXNhaGlybyBJa2VkYSA8bXNoci5pa2VkYUBudHQuY29tPgpE YXRlOiBUdWUsIDggQXVnIDIwMjMgMTk6MjQ6MzIgKzA5MDAKU3ViamVjdDogW1BBVENIXSBDaGFu Z2UgdG8gbWFuYWdlIGN1c3RvbSB3YWl0IGV2ZW50cyBpbiBzaGFyZWQgaGFzaAoKQ3VycmVudGx5 LCBuYW1lcyBvZiB0aGUgY3VzdG9tIHdhaXQgZXZlbnQgbXVzdCBiZQpyZWdpc3RlcmVkIHBlciBi YWNrZW5kcy4gVGhpcyBwYXRjaCByZWxheGVzIHRoZQpjb25zdHJhaW50cyB0byBzdG9yZSB0aGUg d2FpdCBldmVudHMgYW5kIHRoZWlyIG5hbWVzCmluIHRoZSBkeW5hbWljIHNoYXJlZCBoYXNodGFi bGUuIFNvLCBhbGwgYmFja2VuZHMgY2FuCmxvb2sgdXAgdGhlIHdhaXQgZXZlbnQgbmFtZXMgb24g cGdfc3RhdF9hY3Rpdml0eSB2aWV3CndpdGhvdXQgYWRkaXRpb25hbCBwcm9jZXNzaW5nIGJ5IGV4 dGVuc2lvbnMuCi0tLQogZG9jL3NyYy9zZ21sL21vbml0b3Jpbmcuc2dtbCAgICAgICAgICAgICAg ICAgIHwgICA3ICstCiBkb2Mvc3JjL3NnbWwveGZ1bmMuc2dtbCAgICAgICAgICAgICAgICAgICAg ICAgfCAgMTAgKy0KIHNyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL2lwY2kuYyAgICAgICAgICAgICAg ICB8ICAgNiArCiBzcmMvYmFja2VuZC9zdG9yYWdlL2xtZ3IvbHdsb2NrLmMgICAgICAgICAgICAg fCAgIDIgKwogc3JjL2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkvd2FpdF9ldmVudC5jICAgICAgIHwg Mjc1ICsrKysrKysrKysrKy0tLS0tLQogc3JjL2JhY2tlbmQvdXRpbHMvaW5pdC9wb3N0aW5pdC5j ICAgICAgICAgICAgIHwgICAzICsKIHNyYy9pbmNsdWRlL3N0b3JhZ2UvbHdsb2NrLmggICAgICAg ICAgICAgICAgICB8ICAgMiArCiBzcmMvaW5jbHVkZS91dGlscy93YWl0X2V2ZW50LmggICAgICAg ICAgICAgICAgfCAgMTcgKy0KIC4uLi9tb2R1bGVzL3dvcmtlcl9zcGkvdC8wMDFfd29ya2VyX3Nw aS5wbCAgICB8ICAxOCArLQogc3JjL3Rlc3QvbW9kdWxlcy93b3JrZXJfc3BpL3dvcmtlcl9zcGku YyAgICAgIHwgICA2ICstCiBzcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdCAgICAgICAg ICAgICAgfCAgIDIgKy0KIDExIGZpbGVzIGNoYW5nZWQsIDIxNiBpbnNlcnRpb25zKCspLCAxMzIg ZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL21vbml0b3Jpbmcuc2dtbCBi L2RvYy9zcmMvc2dtbC9tb25pdG9yaW5nLnNnbWwKaW5kZXggZjRmYzVkODE0Zi4uMTkxODE4MzJk NyAxMDA2NDQKLS0tIGEvZG9jL3NyYy9zZ21sL21vbml0b3Jpbmcuc2dtbAorKysgYi9kb2Mvc3Jj L3NnbWwvbW9uaXRvcmluZy5zZ21sCkBAIC0xMTIxLDEwICsxMTIxLDkgQEAgU0VMRUNUIHBpZCwg d2FpdF9ldmVudF90eXBlLCB3YWl0X2V2ZW50IEZST00gcGdfc3RhdF9hY3Rpdml0eSBXSEVSRSB3 YWl0X2V2ZW50IGkKICAgICAgPGxpdGVyYWw+TFdMb2NrPC9saXRlcmFsPiB0eXBlcwogICAgICB0 byB0aGUgbGlzdCBzaG93biBpbiA8eHJlZiBsaW5rZW5kPSJ3YWl0LWV2ZW50LWV4dGVuc2lvbi10 YWJsZSIvPiBhbmQKICAgICAgPHhyZWYgbGlua2VuZD0id2FpdC1ldmVudC1sd2xvY2stdGFibGUi Lz4uIEluIHNvbWUgY2FzZXMsIHRoZSBuYW1lCi0gICAgIGFzc2lnbmVkIGJ5IGFuIGV4dGVuc2lv biB3aWxsIG5vdCBiZSBhdmFpbGFibGUgaW4gYWxsIHNlcnZlciBwcm9jZXNzZXM7Ci0gICAgIHNv IGFuIDxsaXRlcmFsPkV4dGVuc2lvbjwvbGl0ZXJhbD4gb3IgPGxpdGVyYWw+TFdMb2NrPC9saXRl cmFsPiB3YWl0Ci0gICAgIGV2ZW50IG1pZ2h0IGJlIHJlcG9ydGVkIGFzIGp1c3QKLSAgICAgPHF1 b3RlPjxsaXRlcmFsPmV4dGVuc2lvbjwvbGl0ZXJhbD48L3F1b3RlPiByYXRoZXIgdGhhbiB0aGUK KyAgICAgb2YgPGxpdGVyYWw+TFdMb2NrPC9saXRlcmFsPiBhc3NpZ25lZCBieSBhbiBleHRlbnNp b24gd2lsbCBub3QgYmUKKyAgICAgYXZhaWxhYmxlIGluIGFsbCBzZXJ2ZXIgcHJvY2Vzc2VzOyBz byBhbiB3YWl0IGV2ZW50IG1pZ2h0IGJlIHJlcG9ydGVkCisgICAgIGFzIGp1c3QgPHF1b3RlPjxs aXRlcmFsPmV4dGVuc2lvbjwvbGl0ZXJhbD48L3F1b3RlPiByYXRoZXIgdGhhbiB0aGUKICAgICAg ZXh0ZW5zaW9uLWFzc2lnbmVkIG5hbWUuCiAgICAgPC9wYXJhPgogICAgPC9ub3RlPgpkaWZmIC0t Z2l0IGEvZG9jL3NyYy9zZ21sL3hmdW5jLnNnbWwgYi9kb2Mvc3JjL3NnbWwveGZ1bmMuc2dtbApp bmRleCBkNjM0NWE3NzViLi43ZmVjMDM0ZGI0IDEwMDY0NAotLS0gYS9kb2Mvc3JjL3NnbWwveGZ1 bmMuc2dtbAorKysgYi9kb2Mvc3JjL3NnbWwveGZ1bmMuc2dtbApAQCAtMzQ3MCwxNyArMzQ3MCwx MyBAQCB2b2lkIFJlcXVlc3RBZGRpblNobWVtU3BhY2UoaW50IHNpemUpCiA8L3Byb2dyYW1saXN0 aW5nPgogICAgIDwvcGFyYT4KICAgICA8cGFyYT4KLSAgICAgPGxpdGVyYWw+c2htZW1fc3RhcnR1 cF9ob29rPC9saXRlcmFsPiBjYW4gYWxsb2NhdGUgaW4gc2hhcmVkIG1lbW9yeQorICAgICA8bGl0 ZXJhbD5zaG1lbV9zdGFydHVwX2hvb2s8L2xpdGVyYWw+IGNhbiBhbGxvY2F0ZSBpbiBkeW5hbWlj IHNoYXJlZCBtZW1vcnkKICAgICAgY3VzdG9tIHdhaXQgZXZlbnRzIGJ5IGNhbGxpbmcgd2hpbGUg aG9sZGluZyB0aGUgTFdMb2NrCiAgICAgIDxmdW5jdGlvbj5BZGRpblNobWVtSW5pdExvY2s8L2Z1 bmN0aW9uPiB0byBhdm9pZCBhbnkgcmFjZSBjb25kaXRpb25zOgogPHByb2dyYW1saXN0aW5nPgot dWludDMyIFdhaXRFdmVudEV4dGVuc2lvbk5ldyh2b2lkKQotPC9wcm9ncmFtbGlzdGluZz4KLSAg ICAgTmV4dCwgZWFjaCBwcm9jZXNzIG5lZWRzIHRvIGFzc29jaWF0ZSB0aGUgd2FpdCBldmVudCBh bGxvY2F0ZWQgcHJldmlvdXNseQotICAgICB0byBhIHVzZXItZmFjaW5nIGN1c3RvbSBzdHJpbmcs IHdoaWNoIGlzIHNvbWV0aGluZyBkb25lIGJ5IGNhbGxpbmc6Ci08cHJvZ3JhbWxpc3Rpbmc+Ci12 b2lkIFdhaXRFdmVudEV4dGVuc2lvblJlZ2lzdGVyTmFtZSh1aW50MzIgd2FpdF9ldmVudF9pbmZv LCBjb25zdCBjaGFyICp3YWl0X2V2ZW50X25hbWUpCit1aW50MzIgV2FpdEV2ZW50RXh0ZW5zaW9u TmV3KGNvbnN0IGNoYXIgKndhaXRfZXZlbnRfbmFtZSkKIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAg IFRoZSB3YWl0IGV2ZW50IGlzIGFzc29jaWF0ZWQgdG8gYSB1c2VyLWZhY2luZyBjdXN0b20gc3Ry aW5nLgogICAgICBBbiBleGFtcGxlIGNhbiBiZSBmb3VuZCBpbiA8ZmlsZW5hbWU+c3JjL3Rlc3Qv bW9kdWxlcy93b3JrZXJfc3BpPC9maWxlbmFtZT4KICAgICAgaW4gdGhlIFBvc3RncmVTUUwgc291 cmNlIHRyZWUuCiAgICAgPC9wYXJhPgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9p cGMvaXBjaS5jIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvaXBjaS5jCmluZGV4IDU1NTFhZmZm YzAuLmIzZDJhMGIyNTIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL2lwY2ku YworKysgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9pcGNpLmMKQEAgLTMyMyw2ICszMjMsMTIg QEAgQ3JlYXRlU2hhcmVkTWVtb3J5QW5kU2VtYXBob3Jlcyh2b2lkKQogCSAqLwogCWlmIChzaG1l bV9zdGFydHVwX2hvb2spCiAJCXNobWVtX3N0YXJ0dXBfaG9vaygpOworCisJLyoKKwkgKiBEZXRh Y2ggZnJvbSB0aGUgZHluYW1pYyBzaGFyZWQgaGFzaCBiZWNhdXNlIHBvc3RtYXN0ZXIgd2lsbCBu ZXZlcgorCSAqIGFjY2VzcyB0aGVzZSBhZ2FpbgorCSAqLworCVdhaXRFdmVudEV4dGVuc2lvbkRl dGFjaFNobWVtKCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9zdG9yYWdlL2xt Z3IvbHdsb2NrLmMgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2xtZ3IvbHdsb2NrLmMKaW5kZXggMzE1 YTc4Y2RhOS4uY2YxYmRiZWQ4NSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9sbWdy L2x3bG9jay5jCisrKyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvbG1nci9sd2xvY2suYwpAQCAtMTkw LDYgKzE5MCw4IEBAIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBCdWlsdGluVHJhbmNoZU5hbWVz W10gPSB7CiAJIkxvZ2ljYWxSZXBMYXVuY2hlckRTQSIsCiAJLyogTFdUUkFOQ0hFX0xBVU5DSEVS X0hBU0g6ICovCiAJIkxvZ2ljYWxSZXBMYXVuY2hlckhhc2giLAorCSJMV1RSQU5DSEVfV0FJVEVW RU5URVhURU5TSU9OX0RTQSIsCisJIkxXVFJBTkNIRV9XQUlURVZFTlRFWFRFTlNJT05fSEFTSCIs CiB9OwogCiBTdGF0aWNBc3NlcnREZWNsKGxlbmd0aG9mKEJ1aWx0aW5UcmFuY2hlTmFtZXMpID09 CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hY3Rpdml0eS93YWl0X2V2ZW50LmMgYi9z cmMvYmFja2VuZC91dGlscy9hY3Rpdml0eS93YWl0X2V2ZW50LmMKaW5kZXggYjM1OTZlY2U4MC4u ZGJkZjY4MTExMCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkvd2FpdF9l dmVudC5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FjdGl2aXR5L3dhaXRfZXZlbnQuYwpAQCAt MjIsNiArMjIsNyBAQAogICovCiAjaW5jbHVkZSAicG9zdGdyZXMuaCIKIAorI2luY2x1ZGUgImxp Yi9kc2hhc2guaCIKICNpbmNsdWRlICJtaXNjYWRtaW4uaCIKICNpbmNsdWRlICJwb3J0L3BnX2Jp dHV0aWxzLmgiCiAjaW5jbHVkZSAic3RvcmFnZS9sbWdyLmgiCQkvKiBmb3IgR2V0TG9ja05hbWVG cm9tVGFnVHlwZSAqLwpAQCAtNDUsMTQxICs0NiwyMzUgQEAgdWludDMyCSAgICpteV93YWl0X2V2 ZW50X2luZm8gPSAmbG9jYWxfbXlfd2FpdF9ldmVudF9pbmZvOwogI2RlZmluZSBXQUlUX0VWRU5U X0NMQVNTX01BU0sJMHhGRjAwMDAwMAogI2RlZmluZSBXQUlUX0VWRU5UX0lEX01BU0sJCTB4MDAw MEZGRkYKIAotLyogZHluYW1pYyBhbGxvY2F0aW9uIGNvdW50ZXIgZm9yIGN1c3RvbSB3YWl0IGV2 ZW50cyBpbiBleHRlbnNpb25zICovCi10eXBlZGVmIHN0cnVjdCBXYWl0RXZlbnRFeHRlbnNpb25D b3VudGVyRGF0YQorLyogaGFzaCB0YWJsZSBlbnRyeSBmb3IgZmluZGluZyB0aGUgY3VzdG9tIHdh aXQgZXZlbnQgbmFtZSBmb3IgYSBrZXkgKi8KKyNkZWZpbmUgTUFYX1dBSVRfRVZFTlRfRVhURU5T SU9OX05BTUUJCTI1NgordHlwZWRlZiBzdHJ1Y3QgV2FpdEV2ZW50RXh0ZW5zaW9uTmFtZUVudHJ5 CiB7Ci0JaW50CQkJbmV4dElkOwkJCS8qIG5leHQgSUQgdG8gYXNzaWduICovCi0Jc2xvY2tfdAkJ bXV0ZXg7CQkJLyogcHJvdGVjdHMgdGhlIGNvdW50ZXIgKi8KLX0gV2FpdEV2ZW50RXh0ZW5zaW9u Q291bnRlckRhdGE7CisJdWludDE2CWV2ZW50X2lkOwkvKiBoYXNoIGtleSAqLworCXVpbnQzMglz dGF0dXM7CQkvKiBoYXNoIHN0YXR1cyAqLworCWNoYXIJd2FpdF9ldmVudF9uYW1lW01BWF9XQUlU X0VWRU5UX0VYVEVOU0lPTl9OQU1FXTsgLyogY3VzdG9tIHdhaXQgZXZlbnQgbmFtZSAqLworfSBX YWl0RXZlbnRFeHRlbnNpb25OYW1lRW50cnk7CisKKy8qIGZvciByZWZlcmVuY2VzIHRvIHNoYXJl ZCBjdXN0b20gd2FpdCBldmVudCBlbnRyaWVzICovCisjZGVmaW5lIFNIX1BSRUZJWAkJd2FpdF9l dmVudF9leHRlbnNpb25fbmFtZV9oYXNoCisjZGVmaW5lIFNIX0VMRU1FTlRfVFlQRQlXYWl0RXZl bnRFeHRlbnNpb25OYW1lRW50cnkKKyNkZWZpbmUgU0hfS0VZX1RZUEUJCXVpbnQxNgorI2RlZmlu ZQlTSF9LRVkJCQlldmVudF9pZAorI2RlZmluZSBTSF9IQVNIX0tFWSh0Yiwga2V5KQlkc2hhc2hf bWVtaGFzaCgma2V5LCBzaXplb2YodWludDE2KSwgTlVMTCkKKyNkZWZpbmUgU0hfRVFVQUwodGIs IGEsIGIpCQlkc2hhc2hfbWVtY21wKCZhLCAmYiwgc2l6ZW9mKHVpbnQxNiksIE5VTEwpID09IDAK KyNkZWZpbmUJU0hfU0NPUEUJCXN0YXRpYyBpbmxpbmUKKyNkZWZpbmUgU0hfREVDTEFSRQorI2Rl ZmluZSBTSF9ERUZJTkUKKyNpbmNsdWRlICJsaWIvc2ltcGxlaGFzaC5oIgorCisvKiBwYXJhbWV0 ZXIgZm9yIHRoZSBzaGFyZWQgaGFzaCAqLworc3RhdGljIGNvbnN0IGRzaGFzaF9wYXJhbWV0ZXJz IGRzaF9wYXJhbXMgPSB7CisJc2l6ZW9mKHVpbnQxNiksCisJc2l6ZW9mKFdhaXRFdmVudEV4dGVu c2lvbk5hbWVFbnRyeSksCisJZHNoYXNoX21lbWNtcCwKKwlkc2hhc2hfbWVtaGFzaCwKKwlMV1RS QU5DSEVfV0FJVEVWRU5URVhURU5TSU9OX0hBU0gKK307CisKKy8qCisgKiBTaGFyZWQgc3RhdGUg aW5mb3JtYXRpb24gZm9yIGN1c3RvbSB3YWl0IGV2ZW50cyBpbiBleHRlbnNpb25zLgorICogVGhp cyBtYW5hZ2VzIGEgZHluYW1pYyBzaGFyZWQgaGFzaCBhbmQgYSBkeW5hbWljIGFsbG9jYXRpb24g Y291bnRlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgV2FpdEV2ZW50RXh0ZW5zaW9uU2hhcmVkU3Rh dGUKK3sKKwkvKgorCSAqIEN1c3RvbSB3YWl0IGV2ZW50IG5hbWVzIGFyZSByZWdpc3RlcmVkIGlu IHNoYXJlZCBjdXN0b20gd2FpdCBldmVudCBoYXNoLgorCSAqIE90aGVyIGJhY2tlbmRzIGNhbiBs b29rIHVwIHRoZW0gd2l0aG91dCBhZGRpdGlvbmFsIHByb2Nlc3NpbmcgcGVyIGJhY2tlbmQKKwkg KiBsaWtlIExXTG9ja1JlZ2lzdGVyVHJhbmNoZSgpLgorCSAqLworCXZvaWQJCSpyYXdfZHNhX2Fy ZWE7CisJZHNoYXNoX3RhYmxlX2hhbmRsZSBoYXNoX2hhbmRsZTsKKworCWludAkJCW5leHRJZDsJ CQkJCS8qIG5leHQgZXZlbnQgSUQgdG8gYXNzaWduICovCisJc2xvY2tfdAkJbXV0ZXg7CQkJCQkv KiBwcm90ZWN0cyB0aGUgY291bnRlciAqLworfSBXYWl0RXZlbnRFeHRlbnNpb25TaGFyZWRTdGF0 ZTsKIAogLyogcG9pbnRlciB0byB0aGUgc2hhcmVkIG1lbW9yeSAqLwotc3RhdGljIFdhaXRFdmVu dEV4dGVuc2lvbkNvdW50ZXJEYXRhICpXYWl0RXZlbnRFeHRlbnNpb25Db3VudGVyOworc3RhdGlj IFdhaXRFdmVudEV4dGVuc2lvblNoYXJlZFN0YXRlICp3ZWVfc3RhdGU7CisKKy8qIGJhY2tlbmQt bG9jYWwgc3RhdGUgdG8gbWFuYWdlIGR5bmFtaWMgc2hhcmVkIGhhc2ggKi8KK3R5cGVkZWYgc3Ry dWN0IFdhaXRFdmVudEV4dGVuc2lvbl9Mb2NhbFN0YXRlCit7CisJZHNhX2FyZWEgICAqZHNhOwor CWRzaGFzaF90YWJsZSAqZHNoOworfSBXYWl0RXZlbnRFeHRlbnNpb25fTG9jYWxTdGF0ZTsKKwor c3RhdGljIFdhaXRFdmVudEV4dGVuc2lvbl9Mb2NhbFN0YXRlIHdlZV9sb2NhbHN0YXRlOwogCiAv KiBmaXJzdCBldmVudCBJRCBvZiBjdXN0b20gd2FpdCBldmVudHMgZm9yIGV4dGVuc2lvbnMgKi8K ICNkZWZpbmUgTlVNX0JVSUxUSU5fV0FJVF9FVkVOVF9FWFRFTlNJT04JXAogCShXQUlUX0VWRU5U X0VYVEVOU0lPTl9GSVJTVF9VU0VSX0RFRklORUQgLSBXQUlUX0VWRU5UX0VYVEVOU0lPTikKIAor c3RhdGljIGNvbnN0IGNoYXIgKkdldFdhaXRFdmVudEV4dGVuc2lvbklkZW50aWZpZXIodWludDE2 IGV2ZW50SWQpOworCiAvKgotICogVGhpcyBpcyBpbmRleGVkIGJ5IGV2ZW50IElEIG1pbnVzIE5V TV9CVUlMVElOX1dBSVRfRVZFTlRfRVhURU5TSU9OLCBhbmQKLSAqIHN0b3JlcyB0aGUgbmFtZXMg b2YgYWxsIGR5bmFtaWNhbGx5LWNyZWF0ZWQgZXZlbnQgSURzIGtub3duIHRvIHRoZSBjdXJyZW50 Ci0gKiBwcm9jZXNzLiAgQW55IHVudXNlZCBlbnRyaWVzIGluIHRoZSBhcnJheSB3aWxsIGNvbnRh aW4gTlVMTC4KKyAqIFRoZSBzaXplIG9mIHRoZSBzaGFyZWQgbWVtb3J5IGFsbG9jYXRpb24gZm9y IGN1c3RvbSB3YWl0IGV2ZW50cyBzdG9yZWQgaW4KKyAqIHRoZSBzaGFyZWQgaGFzaCB0YWJsZS4g VGhpcyBhbGxvY2F0aW9uIHdpbGwgYmUgZG9uZSBhcyBwYXJ0IG9mIHRoZSBtYWluIHNoYXJlZAor ICogbWVtb3J5LCByYXRoZXIgdGhhbiBkeW5hbWljIHNoYXJlZCBtZW1vcnksIGFsbG93aW5nIGl0 IHRvIGJlIGluaXRpYWxpemVkIGluCisgKiBwb3N0bWFzdGVyLgogICovCi1zdGF0aWMgY29uc3Qg Y2hhciAqKldhaXRFdmVudEV4dGVuc2lvbk5hbWVzID0gTlVMTDsKLXN0YXRpYyBpbnQJV2FpdEV2 ZW50RXh0ZW5zaW9uTmFtZXNBbGxvY2F0ZWQgPSAwOworc3RhdGljIFNpemUKK3dhaXRfZXZlbnRf ZXh0ZW5zaW9uX2RzYV9pbml0X3NpemUodm9pZCkKK3sKKwlTaXplCQlzejsKIAotc3RhdGljIGNv bnN0IGNoYXIgKkdldFdhaXRFdmVudEV4dGVuc2lvbklkZW50aWZpZXIodWludDE2IGV2ZW50SWQp OworCS8qIFNhbWUgc2l6ZSBhcyBwZ3N0YXRfZHNhX2luaXRfc2l6ZSgpIGZvciBkc2hhc2ggKi8K KwlzeiA9IDI1NiAqIDEwMjQ7CisJQXNzZXJ0KGRzYV9taW5pbXVtX3NpemUoKSA8PSBzeik7CisJ cmV0dXJuIE1BWEFMSUdOKHN6KTsKK30KIAogLyoKLSAqICBSZXR1cm4gdGhlIHNwYWNlIGZvciBk eW5hbWljIGFsbG9jYXRpb24gY291bnRlci4KKyAqICBSZXR1cm4gdGhlIHNwYWNlIGZvciBkeW5h bWljIHNoYXJlZCBoYXNoIGFuZCBkeW5hbWljIGFsbG9jYXRpb24gY291bnRlci4KICAqLwogU2l6 ZQogV2FpdEV2ZW50RXh0ZW5zaW9uU2htZW1TaXplKHZvaWQpCiB7Ci0JcmV0dXJuIHNpemVvZihX YWl0RXZlbnRFeHRlbnNpb25Db3VudGVyRGF0YSk7CisJU2l6ZQlzejsKKwlzeiA9IE1BWEFMSUdO KHNpemVvZihXYWl0RXZlbnRFeHRlbnNpb25TaGFyZWRTdGF0ZSkpOworCXN6ID0gYWRkX3NpemUo c3osIHdhaXRfZXZlbnRfZXh0ZW5zaW9uX2RzYV9pbml0X3NpemUoKSk7CisJcmV0dXJuIHN6Owog fQogCiAvKgotICogQWxsb2NhdGUgc2htZW0gc3BhY2UgZm9yIGR5bmFtaWMgYWxsb2NhdGlvbiBj b3VudGVyLgorICogQWxsb2NhdGUgc2htZW0gc3BhY2UgZm9yIGR5bmFtaWMgc2hhcmVkIGhhc2gg YW5kIGR5bmFtaWMgYWxsb2NhdGlvbiBjb3VudGVyLgogICovCiB2b2lkCiBXYWl0RXZlbnRFeHRl bnNpb25TaG1lbUluaXQodm9pZCkKIHsKIAlib29sCQlmb3VuZDsKIAotCVdhaXRFdmVudEV4dGVu c2lvbkNvdW50ZXIgPSAoV2FpdEV2ZW50RXh0ZW5zaW9uQ291bnRlckRhdGEgKikKLQkJU2htZW1J bml0U3RydWN0KCJXYWl0RXZlbnRFeHRlbnNpb25Db3VudGVyRGF0YSIsCisJd2VlX3N0YXRlID0g KFdhaXRFdmVudEV4dGVuc2lvblNoYXJlZFN0YXRlICopCisJCVNobWVtSW5pdFN0cnVjdCgiV2Fp dEV2ZW50RXh0ZW5zaW9uU2hhcmVkU3RhdGUiLAogCQkJCQkJV2FpdEV2ZW50RXh0ZW5zaW9uU2ht ZW1TaXplKCksICZmb3VuZCk7CiAKIAlpZiAoIWZvdW5kKQogCXsKKwkJY2hhcgkqcCA9IChjaGFy ICopIHdlZV9zdGF0ZTsKKwogCQkvKiBpbml0aWFsaXplIHRoZSBhbGxvY2F0aW9uIGNvdW50ZXIg YW5kIGl0cyBzcGlubG9jay4gKi8KLQkJV2FpdEV2ZW50RXh0ZW5zaW9uQ291bnRlci0+bmV4dElk ID0gTlVNX0JVSUxUSU5fV0FJVF9FVkVOVF9FWFRFTlNJT047Ci0JCVNwaW5Mb2NrSW5pdCgmV2Fp dEV2ZW50RXh0ZW5zaW9uQ291bnRlci0+bXV0ZXgpOworCQl3ZWVfc3RhdGUtPm5leHRJZCA9IE5V TV9CVUlMVElOX1dBSVRfRVZFTlRfRVhURU5TSU9OOworCQlTcGluTG9ja0luaXQoJndlZV9zdGF0 ZS0+bXV0ZXgpOworCisJCS8qIGluaXRpYWxpemUgZHNhIGFuZCBkc2hhc2ggKi8KKwkJcCArPSAo TUFYQUxJR04oc2l6ZW9mKFdhaXRFdmVudEV4dGVuc2lvblNoYXJlZFN0YXRlKSkpOworCQl3ZWVf c3RhdGUtPnJhd19kc2FfYXJlYSA9ICh2b2lkICopIHA7CisJCXAgKz0gTUFYQUxJR04od2FpdF9l dmVudF9leHRlbnNpb25fZHNhX2luaXRfc2l6ZSgpKTsKKwkJd2VlX2xvY2Fsc3RhdGUuZHNhID0g ZHNhX2NyZWF0ZV9pbl9wbGFjZSh3ZWVfc3RhdGUtPnJhd19kc2FfYXJlYSwKKwkJCQkJCQkJICB3 YWl0X2V2ZW50X2V4dGVuc2lvbl9kc2FfaW5pdF9zaXplKCksCisJCQkJCQkJCSAgTFdUUkFOQ0hF X1dBSVRFVkVOVEVYVEVOU0lPTl9EU0EsCisJCQkJCQkJCSAgMCk7CisJCWRzYV9waW4od2VlX2xv Y2Fsc3RhdGUuZHNhKTsKKworCQkvKgorCQkgKiBUbyBlbnN1cmUgZHNoYXNoIGlzIGNyZWF0ZWQg aW4gInBsYWluIiBzaGFyZWQgbWVtb3J5LCB0ZW1wb3JhcmlseQorCQkgKiBsaW1pdCBzaXplIG9m IGRzYSB0byB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZSBkc2EuCisJCSAqLworCQlkc2Ffc2V0X3Np emVfbGltaXQod2VlX2xvY2Fsc3RhdGUuZHNhLCB3YWl0X2V2ZW50X2V4dGVuc2lvbl9kc2FfaW5p dF9zaXplKCkpOworCisJCS8qCisJCSAqIFdpdGggdGhlIGxpbWl0IGluIHBsYWNlLCBjcmVhdGUg dGhlIGRzaGFzaCB0YWJsZS4gWFhYOiBJdCdkIGJlIG5pY2UKKwkJICogaWYgdGhlcmUgd2VyZSBk c2hhc2hfY3JlYXRlX2luX3BsYWNlKCkuCisJCSAqLworCQl3ZWVfbG9jYWxzdGF0ZS5kc2ggPSBk c2hhc2hfY3JlYXRlKHdlZV9sb2NhbHN0YXRlLmRzYSwgJmRzaF9wYXJhbXMsIDApOworCQl3ZWVf c3RhdGUtPmhhc2hfaGFuZGxlID0gZHNoYXNoX2dldF9oYXNoX3RhYmxlX2hhbmRsZSh3ZWVfbG9j YWxzdGF0ZS5kc2gpOworCisJCWRzYV9zZXRfc2l6ZV9saW1pdCh3ZWVfbG9jYWxzdGF0ZS5kc2Es IC0xKTsKKworCQkvKgorCQkgKiBEb24ndCBkZXRhY2ggZnJvbSBhIHNoYXJlZCBoYXNoIHRhYmxl IGJlY2F1c2UgcG9zdG1hc3RlciBjYW4gYWNjZXNzCisJCSAqIHRoZXNlIGFnYWluIHZpYSBzaG1l bV9zdGFydHVwX2hvb2tzIGJ5IGV4dGVuc2lvbnMuCisJCSAqLworCQlBc3NlcnQod2VlX2xvY2Fs c3RhdGUuZHNoICE9IE5VTEwpOwogCX0KIH0KIAogLyoKLSAqIEFsbG9jYXRlIGEgbmV3IGV2ZW50 IElEIGFuZCByZXR1cm4gdGhlIHdhaXQgZXZlbnQuCisgKiBEZXRhY2ggZnJvbSB0aGUgZHluYW1p YyBzaGFyZWQgaGFzaC4KICAqLwotdWludDMyCi1XYWl0RXZlbnRFeHRlbnNpb25OZXcodm9pZCkK K3ZvaWQKK1dhaXRFdmVudEV4dGVuc2lvbkRldGFjaFNobWVtKHZvaWQpCiB7Ci0JdWludDE2CQll dmVudElkOworCUFzc2VydCh3ZWVfbG9jYWxzdGF0ZS5kc2EpOwogCi0JQXNzZXJ0KExXTG9ja0hl bGRCeU1lSW5Nb2RlKEFkZGluU2htZW1Jbml0TG9jaywgTFdfRVhDTFVTSVZFKSk7CisJZHNoYXNo X2RldGFjaCh3ZWVfbG9jYWxzdGF0ZS5kc2gpOworCXdlZV9sb2NhbHN0YXRlLmRzaCA9IE5VTEw7 CiAKLQlTcGluTG9ja0FjcXVpcmUoJldhaXRFdmVudEV4dGVuc2lvbkNvdW50ZXItPm11dGV4KTsK Kwlkc2FfZGV0YWNoKHdlZV9sb2NhbHN0YXRlLmRzYSk7CisJd2VlX2xvY2Fsc3RhdGUuZHNhID0g TlVMTDsKK30KIAotCWlmIChXYWl0RXZlbnRFeHRlbnNpb25Db3VudGVyLT5uZXh0SWQgPiBQR19V SU5UMTZfTUFYKQotCXsKLQkJU3BpbkxvY2tSZWxlYXNlKCZXYWl0RXZlbnRFeHRlbnNpb25Db3Vu dGVyLT5tdXRleCk7Ci0JCWVyZXBvcnQoRVJST1IsCi0JCQkJZXJyY29kZShFUlJDT0RFX1BST0dS QU1fTElNSVRfRVhDRUVERUQpLAotCQkJCWVycm1zZygidG9vIG1hbnkgd2FpdCBldmVudHMgZm9y IGV4dGVuc2lvbnMiKSk7Ci0JfQorLyoKKyAqIEF0dGFjaCB0aGUgZHluYW1pYyBzaGFyZWQgaGFz aCBmb3IgYmFja2VuZHMuIENhbGxlZCBGcm9tIEJhc2VJbml0KCkuCisgKi8KK3ZvaWQKK1dhaXRF dmVudEV4dGVuc2lvbkF0dGFjaFNobWVtKHZvaWQpCit7CisJTWVtb3J5Q29udGV4dCBvbGRjb250 ZXh0OwogCi0JZXZlbnRJZCA9IFdhaXRFdmVudEV4dGVuc2lvbkNvdW50ZXItPm5leHRJZCsrOwor CUFzc2VydCh3ZWVfbG9jYWxzdGF0ZS5kc2EgPT0gTlVMTCk7CiAKLQlTcGluTG9ja1JlbGVhc2Uo JldhaXRFdmVudEV4dGVuc2lvbkNvdW50ZXItPm11dGV4KTsKKwlvbGRjb250ZXh0ID0gTWVtb3J5 Q29udGV4dFN3aXRjaFRvKFRvcE1lbW9yeUNvbnRleHQpOwogCi0JcmV0dXJuIFBHX1dBSVRfRVhU RU5TSU9OIHwgZXZlbnRJZDsKKwl3ZWVfbG9jYWxzdGF0ZS5kc2EgPQorCQkJZHNhX2F0dGFjaF9p bl9wbGFjZSh3ZWVfc3RhdGUtPnJhd19kc2FfYXJlYSwKKwkJCQkJCQkJICBOVUxMKTsKKwlkc2Ff cGluX21hcHBpbmcod2VlX2xvY2Fsc3RhdGUuZHNhKTsKKworCXdlZV9sb2NhbHN0YXRlLmRzaCA9 CisJCQlkc2hhc2hfYXR0YWNoKHdlZV9sb2NhbHN0YXRlLmRzYSwgJmRzaF9wYXJhbXMsCisJCQkJ CQkJd2VlX3N0YXRlLT5oYXNoX2hhbmRsZSwgTlVMTCk7CisKKwlNZW1vcnlDb250ZXh0U3dpdGNo VG8ob2xkY29udGV4dCk7CiB9CiAKIC8qCi0gKiBSZWdpc3RlciBhIGR5bmFtaWMgd2FpdCBldmVu dCBuYW1lIGZvciBleHRlbnNpb24gaW4gdGhlIGxvb2t1cCB0YWJsZQotICogb2YgdGhlIGN1cnJl bnQgcHJvY2Vzcy4KLSAqCi0gKiBUaGlzIHJvdXRpbmUgd2lsbCBzYXZlIGEgcG9pbnRlciB0byB0 aGUgd2FpdCBldmVudCBuYW1lIHBhc3NlZCBhcyBhbiBhcmd1bWVudCwKLSAqIHNvIHRoZSBuYW1l IHNob3VsZCBiZSBhbGxvY2F0ZWQgaW4gYSBiYWNrZW5kLWxpZmV0aW1lIGNvbnRleHQKLSAqIChz aGFyZWQgbWVtb3J5LCBUb3BNZW1vcnlDb250ZXh0LCBzdGF0aWMgY29uc3RhbnQsIG9yIHNpbWls YXIpLgotICoKLSAqIFRoZSAid2FpdF9ldmVudF9uYW1lIiB3aWxsIGJlIHVzZXItdmlzaWJsZSBh cyBhIHdhaXQgZXZlbnQgbmFtZSwgc28gdHJ5IHRvCi0gKiB1c2UgYSBuYW1lIHRoYXQgZml0cyB0 aGUgc3R5bGUgZm9yIHRob3NlLgorICogQWxsb2NhdGUgYSBuZXcgZXZlbnQgSUQgYW5kIHJldHVy biB0aGUgd2FpdCBldmVudCBpbmZvLgogICovCi12b2lkCi1XYWl0RXZlbnRFeHRlbnNpb25SZWdp c3Rlck5hbWUodWludDMyIHdhaXRfZXZlbnRfaW5mbywKLQkJCQkJCQkgICBjb25zdCBjaGFyICp3 YWl0X2V2ZW50X25hbWUpCit1aW50MzIKK1dhaXRFdmVudEV4dGVuc2lvbk5ldyhjb25zdCBjaGFy ICp3YWl0X2V2ZW50X25hbWUpCiB7Ci0JdWludDMyCQljbGFzc0lkOwogCXVpbnQxNgkJZXZlbnRJ ZDsKKwlib29sCQlmb3VuZDsKKwlXYWl0RXZlbnRFeHRlbnNpb25OYW1lRW50cnkJKmVudHJ5Owog Ci0JY2xhc3NJZCA9IHdhaXRfZXZlbnRfaW5mbyAmIFdBSVRfRVZFTlRfQ0xBU1NfTUFTSzsKLQll dmVudElkID0gd2FpdF9ldmVudF9pbmZvICYgV0FJVF9FVkVOVF9JRF9NQVNLOworCUFzc2VydChM V0xvY2tIZWxkQnlNZUluTW9kZShBZGRpblNobWVtSW5pdExvY2ssIExXX0VYQ0xVU0lWRSkpOwor CUFzc2VydCh3ZWVfbG9jYWxzdGF0ZS5kc2ggIT0gTlVMTCk7CiAKLQkvKiBDaGVjayB0aGUgd2Fp dCBldmVudCBjbGFzcy4gKi8KLQlpZiAoY2xhc3NJZCAhPSBQR19XQUlUX0VYVEVOU0lPTikKKwkv KiBDaGVjayB0aGUgbGltaXQgb2YgdGhlIGxlbmd0aCBvZiB0aGUgZXZlbnQgbmFtZSAqLworCWlm IChzdHJsZW4od2FpdF9ldmVudF9uYW1lKSA+PSBNQVhfV0FJVF9FVkVOVF9FWFRFTlNJT05fTkFN RSkKIAkJZXJlcG9ydChFUlJPUiwKLQkJCQllcnJjb2RlKEVSUkNPREVfSU5WQUxJRF9QQVJBTUVU RVJfVkFMVUUpLAotCQkJCWVycm1zZygiaW52YWxpZCB3YWl0IGV2ZW50IGNsYXNzICV1IiwgY2xh c3NJZCkpOwotCi0JLyogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgZm9yIHVzZXItZGVmaW5l ZCB3YWl0IGV2ZW50LiAqLwotCWlmIChldmVudElkIDwgTlVNX0JVSUxUSU5fV0FJVF9FVkVOVF9F WFRFTlNJT04pCi0JCWVyZXBvcnQoRVJST1IsCi0JCQkJZXJyY29kZShFUlJDT0RFX0lOVkFMSURf UEFSQU1FVEVSX1ZBTFVFKSwKLQkJCQllcnJtc2coImludmFsaWQgd2FpdCBldmVudCBJRCAldSIs IGV2ZW50SWQpKTsKKwkJCQllcnJjb2RlKEVSUkNPREVfUFJPR1JBTV9MSU1JVF9FWENFRURFRCks CisJCQkJZXJybXNnKCJ3YWl0IGV2ZW50IG5hbWUgaXMgdG9vIGxvbmciKSk7CiAKLQkvKiBDb252 ZXJ0IHRvIGFycmF5IGluZGV4LiAqLwotCWV2ZW50SWQgLT0gTlVNX0JVSUxUSU5fV0FJVF9FVkVO VF9FWFRFTlNJT047CisJLyogQWxsb2NhdGUgYSBuZXcgZXZlbnQgSWQgKi8KKwlTcGluTG9ja0Fj cXVpcmUoJndlZV9zdGF0ZS0+bXV0ZXgpOwogCi0JLyogSWYgbmVjZXNzYXJ5LCBjcmVhdGUgb3Ig ZW5sYXJnZSBhcnJheS4gKi8KLQlpZiAoZXZlbnRJZCA+PSBXYWl0RXZlbnRFeHRlbnNpb25OYW1l c0FsbG9jYXRlZCkKKwlpZiAod2VlX3N0YXRlLT5uZXh0SWQgPiBQR19VSU5UMTZfTUFYKQogCXsK LQkJdWludDMyCQluZXdhbGxvYzsKLQotCQluZXdhbGxvYyA9IHBnX25leHRwb3dlcjJfMzIoTWF4 KDgsIGV2ZW50SWQgKyAxKSk7Ci0KLQkJaWYgKFdhaXRFdmVudEV4dGVuc2lvbk5hbWVzID09IE5V TEwpCi0JCQlXYWl0RXZlbnRFeHRlbnNpb25OYW1lcyA9IChjb25zdCBjaGFyICoqKQotCQkJCU1l bW9yeUNvbnRleHRBbGxvY1plcm8oVG9wTWVtb3J5Q29udGV4dCwKLQkJCQkJCQkJCSAgIG5ld2Fs bG9jICogc2l6ZW9mKGNoYXIgKikpOwotCQllbHNlCi0JCQlXYWl0RXZlbnRFeHRlbnNpb25OYW1l cyA9Ci0JCQkJcmVwYWxsb2MwX2FycmF5KFdhaXRFdmVudEV4dGVuc2lvbk5hbWVzLCBjb25zdCBj aGFyICosCi0JCQkJCQkJCVdhaXRFdmVudEV4dGVuc2lvbk5hbWVzQWxsb2NhdGVkLCBuZXdhbGxv Yyk7Ci0JCVdhaXRFdmVudEV4dGVuc2lvbk5hbWVzQWxsb2NhdGVkID0gbmV3YWxsb2M7CisJCVNw aW5Mb2NrUmVsZWFzZSgmd2VlX3N0YXRlLT5tdXRleCk7CisJCWVyZXBvcnQoRVJST1IsCisJCQkJ ZXJyY29kZShFUlJDT0RFX1BST0dSQU1fTElNSVRfRVhDRUVERUQpLAorCQkJCWVycm1zZygidG9v IG1hbnkgd2FpdCBldmVudHMgZm9yIGV4dGVuc2lvbnMiKSk7CiAJfQogCi0JV2FpdEV2ZW50RXh0 ZW5zaW9uTmFtZXNbZXZlbnRJZF0gPSB3YWl0X2V2ZW50X25hbWU7CisJZXZlbnRJZCA9IHdlZV9z dGF0ZS0+bmV4dElkKys7CisKKwlTcGluTG9ja1JlbGVhc2UoJndlZV9zdGF0ZS0+bXV0ZXgpOwor CisJLyogUmVnaXN0ZXIgYSBuZXcgY3VzdG9tIHdhaXQgZXZlbnQgaW4gdGhlIHNoYXJlZCBoYXNo ICovCisJZW50cnkgPSBkc2hhc2hfZmluZF9vcl9pbnNlcnQod2VlX2xvY2Fsc3RhdGUuZHNoLAor CQkJCQkJCQkJJmV2ZW50SWQsICZmb3VuZCk7CisJQXNzZXJ0KCFmb3VuZCk7CisJc3RybGNweShl bnRyeS0+d2FpdF9ldmVudF9uYW1lLCB3YWl0X2V2ZW50X25hbWUsIHNpemVvZihlbnRyeS0+d2Fp dF9ldmVudF9uYW1lKSk7CisJZHNoYXNoX3JlbGVhc2VfbG9jayh3ZWVfbG9jYWxzdGF0ZS5kc2gs IGVudHJ5KTsKKworCXJldHVybiBQR19XQUlUX0VYVEVOU0lPTiB8IGV2ZW50SWQ7CiB9CiAKIC8q CkBAIC0xODgsMjMgKzI4MywyMyBAQCBXYWl0RXZlbnRFeHRlbnNpb25SZWdpc3Rlck5hbWUodWlu dDMyIHdhaXRfZXZlbnRfaW5mbywKIHN0YXRpYyBjb25zdCBjaGFyICoKIEdldFdhaXRFdmVudEV4 dGVuc2lvbklkZW50aWZpZXIodWludDE2IGV2ZW50SWQpCiB7CisJV2FpdEV2ZW50RXh0ZW5zaW9u TmFtZUVudHJ5CSplbnRyeTsKKwogCS8qIEJ1aWx0LWluIGV2ZW50PyAqLwogCWlmIChldmVudElk IDwgTlVNX0JVSUxUSU5fV0FJVF9FVkVOVF9FWFRFTlNJT04pCiAJCXJldHVybiAiRXh0ZW5zaW9u IjsKIAotCS8qCi0JICogSXQgaXMgYSB1c2VyLWRlZmluZWQgd2FpdCBldmVudCwgc28gbG9vayBh dCBXYWl0RXZlbnRFeHRlbnNpb25OYW1lc1tdLgotCSAqIEhvd2V2ZXIsIGl0IGlzIHBvc3NpYmxl IHRoYXQgdGhlIG5hbWUgaGFzIG5ldmVyIGJlZW4gcmVnaXN0ZXJlZCBieQotCSAqIGNhbGxpbmcg V2FpdEV2ZW50RXh0ZW5zaW9uUmVnaXN0ZXJOYW1lKCkgaW4gdGhlIGN1cnJlbnQgcHJvY2Vzcywg aW4KLQkgKiB3aGljaCBjYXNlIGdpdmUgdXAgYW5kIHJldHVybiAiZXh0ZW5zaW9uIi4KLQkgKi8K LQlldmVudElkIC09IE5VTV9CVUlMVElOX1dBSVRfRVZFTlRfRVhURU5TSU9OOwotCi0JaWYgKGV2 ZW50SWQgPj0gV2FpdEV2ZW50RXh0ZW5zaW9uTmFtZXNBbGxvY2F0ZWQgfHwKLQkJV2FpdEV2ZW50 RXh0ZW5zaW9uTmFtZXNbZXZlbnRJZF0gPT0gTlVMTCkKLQkJcmV0dXJuICJleHRlbnNpb24iOwor CS8qIEl0IGlzIGEgdXNlci1kZWZpbmVkIHdhaXQgZXZlbnQsIHNvIGxvb2sgYXQgdGhlIGR5bmFt aWMgc2hhcmVkIGhhc2ggKi8KKwllbnRyeSA9IGRzaGFzaF9maW5kKHdlZV9sb2NhbHN0YXRlLmRz aCwKKwkJCQkJCSZldmVudElkLAorCQkJCQkJZmFsc2UpOworCWlmIChlbnRyeSkKKwkJZHNoYXNo X3JlbGVhc2VfbG9jayh3ZWVfbG9jYWxzdGF0ZS5kc2gsIGVudHJ5KTsKKwllbHNlCisJCWVyZXBv cnQoRVJST1IsCisJCQkJZXJybXNnKCJjb3VsZCBub3QgZmluZCB0aGUgbmFtZSBmb3IgY3VzdG9t IHdhaXQgZXZlbnQgSUQgJXUiLCBldmVudElkKSk7CiAKLQlyZXR1cm4gV2FpdEV2ZW50RXh0ZW5z aW9uTmFtZXNbZXZlbnRJZF07CisJcmV0dXJuIGVudHJ5LT53YWl0X2V2ZW50X25hbWU7CiB9CiAK IApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvaW5pdC9wb3N0aW5pdC5jIGIvc3JjL2Jh Y2tlbmQvdXRpbHMvaW5pdC9wb3N0aW5pdC5jCmluZGV4IGYzMWI4NWMwMTMuLjNkZWE1YWZkOGYg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2luaXQvcG9zdGluaXQuYworKysgYi9zcmMv YmFja2VuZC91dGlscy9pbml0L3Bvc3Rpbml0LmMKQEAgLTY3MSw2ICs2NzEsOSBAQCBCYXNlSW5p dCh2b2lkKQogCSAqIGRyb3AgZXBoZW1lcmFsIHNsb3RzLCB3aGljaCBpbiB0dXJuIHRyaWdnZXJz IHN0YXRzIHJlcG9ydGluZy4KIAkgKi8KIAlSZXBsaWNhdGlvblNsb3RJbml0aWFsaXplKCk7CisK KyAgICAvKiBBdHRhY2ggdGhlIGR5bmFtaWMgc2hhcmVkIGhhc2ggZm9yIGN1c3RvbSB3YWl0IGV2 ZW50cyAqLworCVdhaXRFdmVudEV4dGVuc2lvbkF0dGFjaFNobWVtKCk7CiB9CiAKIApkaWZmIC0t Z2l0IGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9sd2xvY2suaCBiL3NyYy9pbmNsdWRlL3N0b3JhZ2Uv bHdsb2NrLmgKaW5kZXggZDc3NDEwYmRlYS4uNDUxYzQwNmU0NyAxMDA2NDQKLS0tIGEvc3JjL2lu Y2x1ZGUvc3RvcmFnZS9sd2xvY2suaAorKysgYi9zcmMvaW5jbHVkZS9zdG9yYWdlL2x3bG9jay5o CkBAIC0yMDcsNiArMjA3LDggQEAgdHlwZWRlZiBlbnVtIEJ1aWx0aW5UcmFuY2hlSWRzCiAJTFdU UkFOQ0hFX1BHU1RBVFNfREFUQSwKIAlMV1RSQU5DSEVfTEFVTkNIRVJfRFNBLAogCUxXVFJBTkNI RV9MQVVOQ0hFUl9IQVNILAorCUxXVFJBTkNIRV9XQUlURVZFTlRFWFRFTlNJT05fRFNBLAorCUxX VFJBTkNIRV9XQUlURVZFTlRFWFRFTlNJT05fSEFTSCwKIAlMV1RSQU5DSEVfRklSU1RfVVNFUl9E RUZJTkVECiB9CQkJQnVpbHRpblRyYW5jaGVJZHM7CiAKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRl L3V0aWxzL3dhaXRfZXZlbnQuaCBiL3NyYy9pbmNsdWRlL3V0aWxzL3dhaXRfZXZlbnQuaAppbmRl eCBhYWQ4YmMwOGZhLi40YzJhYTI1Yjc4IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS91dGlscy93 YWl0X2V2ZW50LmgKKysrIGIvc3JjL2luY2x1ZGUvdXRpbHMvd2FpdF9ldmVudC5oCkBAIC00NCwx MiArNDQsMTEgQEAgZXh0ZXJuIFBHRExMSU1QT1JUIHVpbnQzMiAqbXlfd2FpdF9ldmVudF9pbmZv OwogICogVXNlIHRoaXMgY2F0ZWdvcnkgd2hlbiB0aGUgc2VydmVyIHByb2Nlc3MgaXMgd2FpdGlu ZyBmb3Igc29tZSBjb25kaXRpb24KICAqIGRlZmluZWQgYnkgYW4gZXh0ZW5zaW9uIG1vZHVsZS4K ICAqCi0gKiBFeHRlbnNpb25zIGNhbiBkZWZpbmUgdGhlaXIgb3duIHdhaXQgZXZlbnRzIGluIHRo aXMgY2F0ZWdvcnkuICBGaXJzdCwKLSAqIHRoZXkgc2hvdWxkIGNhbGwgV2FpdEV2ZW50RXh0ZW5z aW9uTmV3KCkgdG8gZ2V0IG9uZSBvciBtb3JlIHdhaXQgZXZlbnQKLSAqIElEcyB0aGF0IGFyZSBh bGxvY2F0ZWQgZnJvbSBhIHNoYXJlZCBjb3VudGVyLiAgVGhlc2UgY2FuIGJlIHVzZWQgZGlyZWN0 bHkKLSAqIHdpdGggcGdzdGF0X3JlcG9ydF93YWl0X3N0YXJ0KCkgb3IgZXF1aXZhbGVudC4gIE5l eHQsIGVhY2ggaW5kaXZpZHVhbAotICogcHJvY2VzcyBzaG91bGQgY2FsbCBXYWl0RXZlbnRFeHRl bnNpb25SZWdpc3Rlck5hbWUoKSB0byBhc3NvY2lhdGUgYSB3YWl0Ci0gKiBldmVudCBzdHJpbmcg dG8gdGhlIG51bWJlciBhbGxvY2F0ZWQgcHJldmlvdXNseS4KKyAqIEV4dGVuc2lvbnMgY2FuIGRl ZmluZSB0aGVpciBvd24gd2FpdCBldmVudHMgaW4gdGhpcyBjYXRlZ29yeS4gVGhleSBzaG91bGQK KyAqIGNhbGwgV2FpdEV2ZW50RXh0ZW5zaW9uTmV3KCkgd2l0aCBhIHdhaXQgZXZlbnQgc3RyaW5n LiBJdCB3aWxsIGdldCBvbmUgd2FpdAorICogZXZlbnQgSUQgdGhhdCBpcyBhbGxvY2F0ZWQgZnJv bSBhIHNoYXJlZCBjb3VudGVyLCBhc3NvY2lhdGUgdGhlIHN0cmluZyB0bworICogdGhlIG51bWJl ciBpbiB0aGUgc2hhcmVkIGR5bmFtaWMgaGFzaCBhbmQgcmV0dXJuIHRoZSB3YWl0IGV2ZW50IGlu Zm8uIEl0CisgKiBjYW4gYmUgdXNlZCBkaXJlY3RseSB3aXRoIHBnc3RhdF9yZXBvcnRfd2FpdF9z dGFydCgpIG9yIGVxdWl2YWxlbnQuCiAgKi8KIHR5cGVkZWYgZW51bQogewpAQCAtNTksMTAgKzU4 LDEwIEBAIHR5cGVkZWYgZW51bQogCiBleHRlcm4gdm9pZCBXYWl0RXZlbnRFeHRlbnNpb25TaG1l bUluaXQodm9pZCk7CiBleHRlcm4gU2l6ZSBXYWl0RXZlbnRFeHRlbnNpb25TaG1lbVNpemUodm9p ZCk7CitleHRlcm4gdm9pZCBXYWl0RXZlbnRFeHRlbnNpb25EZXRhY2hTaG1lbSh2b2lkKTsKK2V4 dGVybiB2b2lkIFdhaXRFdmVudEV4dGVuc2lvbkF0dGFjaFNobWVtKHZvaWQpOwogCi1leHRlcm4g dWludDMyIFdhaXRFdmVudEV4dGVuc2lvbk5ldyh2b2lkKTsKLWV4dGVybiB2b2lkIFdhaXRFdmVu dEV4dGVuc2lvblJlZ2lzdGVyTmFtZSh1aW50MzIgd2FpdF9ldmVudF9pbmZvLAotCQkJCQkJCQkJ CSAgIGNvbnN0IGNoYXIgKndhaXRfZXZlbnRfbmFtZSk7CitleHRlcm4gdWludDMyIFdhaXRFdmVu dEV4dGVuc2lvbk5ldyhjb25zdCBjaGFyICp3YWl0X2V2ZW50X25hbWUpOwogCiAvKiAtLS0tLS0t LS0tCiAgKiBwZ3N0YXRfcmVwb3J0X3dhaXRfc3RhcnQoKSAtCmRpZmYgLS1naXQgYS9zcmMvdGVz dC9tb2R1bGVzL3dvcmtlcl9zcGkvdC8wMDFfd29ya2VyX3NwaS5wbCBiL3NyYy90ZXN0L21vZHVs ZXMvd29ya2VyX3NwaS90LzAwMV93b3JrZXJfc3BpLnBsCmluZGV4IGMzZTdmNWZiZTYuLjI2Yjhh NDliZWMgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L21vZHVsZXMvd29ya2VyX3NwaS90LzAwMV93b3Jr ZXJfc3BpLnBsCisrKyBiL3NyYy90ZXN0L21vZHVsZXMvd29ya2VyX3NwaS90LzAwMV93b3JrZXJf c3BpLnBsCkBAIC0zOSwyNSArMzksMTEgQEAgJG5vZGUtPnBvbGxfcXVlcnlfdW50aWwoJ3Bvc3Rn cmVzJywKICRyZXN1bHQgPSAkbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICdTRUxFQ1QgKiBG Uk9NIHNjaGVtYTQuY291bnRlZDsnKTsKIGlzKCRyZXN1bHQsIHFxKHRvdGFsfDEpLCAnZHluYW1p YyBiZ3dvcmtlciBjb3JyZWN0bHkgY29uc3VtZWQgdHVwbGUgZGF0YScpOwogCi0jIENoZWNrIHRo ZSB3YWl0IGV2ZW50IHVzZWQgYnkgdGhlIGR5bmFtaWMgYmd3b3JrZXIuICBGb3IgYSBzZXNzaW9u IHdpdGhvdXQKLSMgdGhlIHN0YXRlIGluIHNoYXJlZCBtZW1vcnkga25vd24sIHRoZSBkZWZhdWx0 IG9mICJleHRlbnNpb24iIGlzIHRoZSB2YWx1ZQotIyB3YWl0ZWQgb24uCisjIENoZWNrIHRoZSB3 YWl0IGV2ZW50IHVzZWQgYnkgdGhlIGR5bmFtaWMgYmd3b3JrZXIuCiAkcmVzdWx0ID0gJG5vZGUt PnBvbGxfcXVlcnlfdW50aWwoCiAJJ3Bvc3RncmVzJywKIAlxcVtTRUxFQ1Qgd2FpdF9ldmVudCBG Uk9NIHBnX3N0YXRfYWN0aXZpdHkgV0hFUkUgYmFja2VuZF90eXBlIH4gJ3dvcmtlcl9zcGknO10s Ci0JJ2V4dGVuc2lvbicpOwotaXMoJHJlc3VsdCwgMSwgJ2R5bmFtaWMgYmd3b3JrZXIgaGFzIHJl cG9ydGVkICJleHRlbnNpb24iIGFzIHdhaXQgZXZlbnQnKTsKLQotIyBJZiB0aGUgc2hhcmVkIG1l bW9yeSBzdGF0ZSBpcyBsb2FkZWQgKGhlcmUgd2l0aCB3b3JrZXJfc3BpX2luaXQgd2l0aGluCi0j IHRoZSBzYW1lIGNvbm5lY3Rpb24gYXMgdGhlIG9uZSBxdWVyeWluZyBwZ19zdGF0X2FjdGl2aXR5 KSwgdGhlIHdhaXQKLSMgZXZlbnQgaXMgdGhlIGN1c3RvbSBvbmUuCi0jIFRoZSBleHBlY3RlZCBy ZXN1bHQgaXMgYSBzcGVjaWFsIHBhdHRlcm4gaGVyZSB3aXRoIGEgbmV3bGluZSBjb21pbmcgZnJv bSB0aGUKLSMgZmlyc3QgcXVlcnkgd2hlcmUgdGhlIHNoYXJlZCBtZW1vcnkgc3RhdGUgaXMgc2V0 LgotJHJlc3VsdCA9ICRub2RlLT5wb2xsX3F1ZXJ5X3VudGlsKAotCSdwb3N0Z3JlcycsCi0JcXFb U0VMRUNUIHdvcmtlcl9zcGlfaW5pdCgpOyBTRUxFQ1Qgd2FpdF9ldmVudCBGUk9NIHBnX3N0YXRf YWN0aXZpdHkgV0hFUkUgYmFja2VuZF90eXBlIH4gJ3dvcmtlcl9zcGknO10sCi0JcXFbCi13b3Jr ZXJfc3BpX21haW5dKTsKKwlxcVt3b3JrZXJfc3BpX21haW5dKTsKIGlzKCRyZXN1bHQsIDEsCiAJ J2R5bmFtaWMgYmd3b3JrZXIgaGFzIHJlcG9ydGVkICJ3b3JrZXJfc3BpX21haW4iIGFzIHdhaXQg ZXZlbnQnKTsKIApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy93b3JrZXJfc3BpL3dvcmtl cl9zcGkuYyBiL3NyYy90ZXN0L21vZHVsZXMvd29ya2VyX3NwaS93b3JrZXJfc3BpLmMKaW5kZXgg YzQzMTczNTFjZS4uOTBhNzYyYjVlNCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvbW9kdWxlcy93b3Jr ZXJfc3BpL3dvcmtlcl9zcGkuYworKysgYi9zcmMvdGVzdC9tb2R1bGVzL3dvcmtlcl9zcGkvd29y a2VyX3NwaS5jCkBAIC0xMjQsMTQgKzEyNCwxMCBAQCB3b3JrZXJfc3BpX3NobWVtX2luaXQodm9p ZCkKIAogCS8qIERlZmluZSBhIG5ldyB3YWl0IGV2ZW50ICovCiAJaWYgKCFmb3VuZCkKLQkJd3Nz dGF0ZS0+d2FpdF9ldmVudCA9IFdhaXRFdmVudEV4dGVuc2lvbk5ldygpOworCQl3c3N0YXRlLT53 YWl0X2V2ZW50ID0gV2FpdEV2ZW50RXh0ZW5zaW9uTmV3KCJ3b3JrZXJfc3BpX21haW4iKTsKIAog CUxXTG9ja1JlbGVhc2UoQWRkaW5TaG1lbUluaXRMb2NrKTsKIAotCS8qCi0JICogUmVnaXN0ZXIg dGhlIHdhaXQgZXZlbnQgaW4gdGhlIGxvb2t1cCB0YWJsZSBvZiB0aGUgY3VycmVudCBwcm9jZXNz LgotCSAqLwotCVdhaXRFdmVudEV4dGVuc2lvblJlZ2lzdGVyTmFtZSh3c3N0YXRlLT53YWl0X2V2 ZW50LCAid29ya2VyX3NwaV9tYWluIik7CiAJcmV0dXJuOwogfQogCmRpZmYgLS1naXQgYS9zcmMv dG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdCBiL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVm cy5saXN0CmluZGV4IDY2ODIzYmMyYTcuLjA4MDlhMjhiOGYgMTAwNjQ0Ci0tLSBhL3NyYy90b29s cy9wZ2luZGVudC90eXBlZGVmcy5saXN0CisrKyBiL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVm cy5saXN0CkBAIC0yOTkxLDcgKzI5OTEsNyBAQCBXYWl0RXZlbnRBY3Rpdml0eQogV2FpdEV2ZW50 QnVmZmVyUGluCiBXYWl0RXZlbnRDbGllbnQKIFdhaXRFdmVudEV4dGVuc2lvbgotV2FpdEV2ZW50 RXh0ZW5zaW9uQ291bnRlckRhdGEKK1dhaXRFdmVudEV4dGVuc2lvblNoYXJlZFN0YXRlCiBXYWl0 RXZlbnRJTwogV2FpdEV2ZW50SVBDCiBXYWl0RXZlbnRTZXQKLS0gCjIuMjUuMQoK --=_760c614fd3b824098e59ad81f20cd676--