Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:46156 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 89624 invoked from network); 22 Nov 2009 05:12:23 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 22 Nov 2009 05:12:23 -0000 Authentication-Results: pb1.pair.com smtp.mail=arraypad@googlemail.com; spf=pass; sender-id=pass Authentication-Results: pb1.pair.com header.from=arraypad@googlemail.com; sender-id=pass; domainkeys=bad Received-SPF: pass (pb1.pair.com: domain googlemail.com designates 209.85.219.226 as permitted sender) DomainKey-Status: bad X-DomainKeys: Ecelerity dk_validate implementing draft-delany-domainkeys-base-01 X-PHP-List-Original-Sender: arraypad@googlemail.com X-Host-Fingerprint: 209.85.219.226 mail-ew0-f226.google.com Received: from [209.85.219.226] ([209.85.219.226:58613] helo=mail-ew0-f226.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 28/91-11660-638C80B4 for ; Sun, 22 Nov 2009 00:12:23 -0500 Received: by ewy26 with SMTP id 26so871062ewy.23 for ; Sat, 21 Nov 2009 21:12:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=gamma; h=domainkey-signature:mime-version:received:date:message-id:subject :from:to:content-type; bh=Q6yxC9dwTvDNfYzQtmsDWmOf98hxTApLdUA7d4DsvA4=; b=IU4mIeX2TXXTnsvDsf/Ew0iyvYgwOARsCkjbEaEvEIcukwWmDYx1HuyZJkJ1LU+uZ1 9+OFrGfqJ8jTImkj3YnapUHc838LgpOnEdd0rTiTJOk/HIh6cJA5bGVxewpQ7BMZR4ZA NP3IaRq2VlznFf6SmdmdLa6V5BoJFVmZg/OSw= DomainKey-Signature: a=rsa-sha1; c=nofws; d=googlemail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=TDKAwmBayyCalTky7jdI/vlaG6viO6KAsL2vJRG44OtS1KSCi4iu10PmVvZY58PGaq f8kUj7ksmoM4QeqwlS02DEhAbi7MJSkg8prLDlw8ZNFkQ0A2IhKzCb1yFb/8NMmZeQx7 O6kTKpIwJZXTQXlUbw0EoP6QH35PPvVXYFixY= MIME-Version: 1.0 Received: by 10.213.0.152 with SMTP id 24mr2061261ebb.29.1258866739333; Sat, 21 Nov 2009 21:12:19 -0800 (PST) Date: Sun, 22 Nov 2009 05:12:19 +0000 Message-ID: To: internals@lists.php.net Content-Type: multipart/mixed; boundary=000e0cdf97b4d149b60478eec018 Subject: [PATCH] session_set_save_handler(class) From: arraypad@googlemail.com (Arpad Ray) --000e0cdf97b4d149b60478eec018 Content-Type: multipart/alternative; boundary=000e0cdf97b4d149a70478eec016 --000e0cdf97b4d149a70478eec016 Content-Type: text/plain; charset=ISO-8859-1 Attached is a patch (against HEAD, includes tests) which allows users to extend any session handler in an object oriented fashion. By extending the new internal class SessionHandler, users can wrap or override methods of whatever session handler is in use, or implement a complete custom handler. Usage notes: - Calling session_set_save_handler(class) after session_set_save_handler(a, b, c, d, e, f) wouldn't transparently extend the first call since they share the same storage. However this can be achieved by calling the former functions manually from the class. - Likewise multiple session_set_save_handler(class) calls simply replace each other; just extend the new class from the old one instead of SessionHandler to chain them. Implementation notes: - mod_user.c was faking PS(mod_data) so it would get called at the right times. Now that we need to preserve the data for whatever handler we're wrapping, session.c checks the new global PS(mod_active) instead. No more tests are failing but I think it's possible this could break existing user session modules so please look at this carefully. We could just do PS(mod_data) || PS(var_controlled_by_mod_user) to be on the safe side, at the expense of a very slight overhead for other session modules. I've experimented with a few different ways of approaching this already. Although I like this one (reusing the mod_user callbacks) because the change is pretty minimal, it might be better to just store a pointer to the class entry or the function entries. Or something entirely different.. I'd be grateful for any comments. Arpad --000e0cdf97b4d149a70478eec016 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Attached is a patch (against HEAD, includes tests) which allows users to ex= tend any session handler in an object oriented fashion.

By extending= the new internal class SessionHandler, users can wrap or override methods = of whatever session handler is in use, or implement a complete custom handl= er.

Usage notes:
- Calling session_set_save_handler(class) after session= _set_save_handler(a, b, c, d, e, f) wouldn't transparently extend the f= irst call since they share the same storage. However this can be achieved b= y calling the former functions manually from the class.
- Likewise multiple session_set_save_handler(class) calls simply replace ea= ch other; just extend the new class from the old one instead of SessionHand= ler to chain them.

Implementation notes:
- mod_user.c was faking = PS(mod_data) so it would get called at the right times. Now that we need to= preserve the data for whatever handler we're wrapping, session.c check= s the new global PS(mod_active) instead. No more tests are failing but I th= ink it's possible this could break existing user session modules so ple= ase look at this carefully. We could just do PS(mod_data) || PS(var_control= led_by_mod_user) to be on the safe side, at the expense of a very slight ov= erhead for other session modules.

I've experimented with a few different ways of approaching this alr= eady. Although I like this one (reusing the mod_user callbacks) because the= change is pretty minimal, it might be better to just store a pointer to th= e class entry or the function entries. Or something entirely different..
I'd be grateful for any comments.

Arpad
--000e0cdf97b4d149a70478eec016-- --000e0cdf97b4d149b60478eec018 Content-Type: text/x-diff; charset=UTF-8; name="php6-session-oo.patch" Content-Disposition: attachment; filename="php6-session-oo.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_g2bceh2i0 SW5kZXg6IGV4dC9zZXNzaW9uL2NvbmZpZy53MzIKPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZXh0L3Nlc3Npb24v Y29uZmlnLnczMgkocmV2aXNpb24gMjkxMTI0KQorKysgZXh0L3Nlc3Npb24vY29uZmlnLnczMgko d29ya2luZyBjb3B5KQpAQCAtNCw3ICs0LDcgQEAKIEFSR19FTkFCTEUoInNlc3Npb24iLCAic2Vz c2lvbiBzdXBwb3J0IiwgInllcyIpOwogCiBpZiAoUEhQX1NFU1NJT04gPT0gInllcyIpIHsKLQlF WFRFTlNJT04oInNlc3Npb24iLCAic2Vzc2lvbi5jIG1vZF9maWxlcy5jIG1vZF9tbS5jIG1vZF91 c2VyLmMiLCBmYWxzZSAvKiBuZXZlciBzaGFyZWQgKi8pOworCUVYVEVOU0lPTigic2Vzc2lvbiIs ICJtb2RfdXNlcl9jbGFzcy5jIHNlc3Npb24uYyBtb2RfZmlsZXMuYyBtb2RfbW0uYyBtb2RfdXNl ci5jIiwgZmFsc2UgLyogbmV2ZXIgc2hhcmVkICovKTsKIAlBQ19ERUZJTkUoIkhBVkVfUEhQX1NF U1NJT04iLCAxLCAiU2Vzc2lvbiBzdXBwb3J0Iik7CiB9CiAKSW5kZXg6IGV4dC9zZXNzaW9uL3Bo cF9zZXNzaW9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQotLS0gZXh0L3Nlc3Npb24vcGhwX3Nlc3Npb24uaAkocmV2 aXNpb24gMjkxMTI0KQorKysgZXh0L3Nlc3Npb24vcGhwX3Nlc3Npb24uaAkod29ya2luZyBjb3B5 KQpAQCAtMTI4LDYgKzEyOCw3IEBACiAJemVuZF9ib29sICBjb29raWVfc2VjdXJlOwogCXplbmRf Ym9vbCAgY29va2llX2h0dHBvbmx5OwogCXBzX21vZHVsZSAqbW9kOworCXBzX21vZHVsZSAqb2xk X21vZDsKIAl2b2lkICptb2RfZGF0YTsKIAlwaHBfc2Vzc2lvbl9zdGF0dXMgc2Vzc2lvbl9zdGF0 dXM7CiAJbG9uZyBnY19wcm9iYWJpbGl0eTsKQEAgLTE0Niw2ICsxNDcsNyBAQAogCQkJenZhbCAq cHNfZ2M7CiAJCX0gbmFtZTsKIAl9IG1vZF91c2VyX25hbWVzOworCWludCBtb2RfYWN0aXZlOwog CWNvbnN0IHN0cnVjdCBwc19zZXJpYWxpemVyX3N0cnVjdCAqc2VyaWFsaXplcjsKIAl6dmFsICpo dHRwX3Nlc3Npb25fdmFyczsKIAl6ZW5kX2Jvb2wgYXV0b19zdGFydDsKQEAgLTI4NSw0ICsyODcs MTQgQEAKIHZvaWQgcGhwX3Nlc3Npb25fYXV0b19zdGFydCh2b2lkICpkYXRhKTsKIHZvaWQgcGhw X3Nlc3Npb25fc2h1dGRvd24odm9pZCAqZGF0YSk7CiAKKyNkZWZpbmUgUFNfQ0xBU1NfTkFNRSAi U2Vzc2lvbkhhbmRsZXIiCitleHRlcm4gemVuZF9jbGFzc19lbnRyeSAqcGhwX3Nlc3Npb25fY2xh c3NfZW50cnk7CisKK2V4dGVybiBQSFBfTUVUSE9EKFNlc3Npb25IYW5kbGVyLCBvcGVuKTsKK2V4 dGVybiBQSFBfTUVUSE9EKFNlc3Npb25IYW5kbGVyLCBjbG9zZSk7CitleHRlcm4gUEhQX01FVEhP RChTZXNzaW9uSGFuZGxlciwgcmVhZCk7CitleHRlcm4gUEhQX01FVEhPRChTZXNzaW9uSGFuZGxl ciwgd3JpdGUpOworZXh0ZXJuIFBIUF9NRVRIT0QoU2Vzc2lvbkhhbmRsZXIsIGRlc3Ryb3kpOwor ZXh0ZXJuIFBIUF9NRVRIT0QoU2Vzc2lvbkhhbmRsZXIsIGdjKTsKKwogI2VuZGlmCkluZGV4OiBl eHQvc2Vzc2lvbi9tb2RfdXNlcl9jbGFzcy5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGV4dC9zZXNzaW9uL21v ZF91c2VyX2NsYXNzLmMJKHJldmlzaW9uIDApCisrKyBleHQvc2Vzc2lvbi9tb2RfdXNlcl9jbGFz cy5jCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAgICstLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t KworICAgfCBQSFAgVmVyc2lvbiA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8CisgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgIHwgQ29weXJpZ2h0 IChjKSAxOTk3LTIwMDkgVGhlIFBIUCBHcm91cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfAorICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICB8IFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVj dCB0byB2ZXJzaW9uIDMuMDEgb2YgdGhlIFBIUCBsaWNlbnNlLCAgICAgIHwKKyAgIHwgdGhhdCBp cyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UsIGFuZCBpcyAg ICAgICAgfAorICAgfCBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhl IGZvbGxvd2luZyB1cmw6ICAgICAgICAgICB8CisgICB8IGh0dHA6Ly93d3cucGhwLm5ldC9saWNl bnNlLzNfMDEudHh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgIHwgSWYg eW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIFBIUCBsaWNlbnNlIGFuZCBhcmUgdW5h YmxlIHRvICAgfAorICAgfCBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBs ZWFzZSBzZW5kIGEgbm90ZSB0byAgICAgICAgICB8CisgICB8IGxpY2Vuc2VAcGhwLm5ldCBzbyB3 ZSBjYW4gbWFpbCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LiAgICAgICAgICAgICAgIHwKKyAgICst LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tKworICAgfCBBdXRob3I6IEFycGFkIFJheSA8YXJwYWRAcGhwLm5ldD4KKyAg ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tKworICovCisKKy8qICRJZCQgKi8KKworI2luY2x1ZGUgInBocC5oIgor I2luY2x1ZGUgInBocF9zZXNzaW9uLmgiCisKKyNkZWZpbmUgUFNfU0FOSVRZX0NIRUNLCQkJCQkJ XAorCWlmIChQUyhvbGRfbW9kKSA9PSBOVUxMKSB7CQkJCVwKKwkJUkVUVVJOX0ZBTFNFOwkJCQkJ CVwKKwl9CQkJCQkJCQorCisKKy8qIHt7eyBwcm90byBib29sIFNlc3Npb25IYW5kbGVyOjpvcGVu KHN0cmluZyBzYXZlX3BhdGgsIHN0cmluZyBzZXNzaW9uX25hbWUpCisgICBXcmFwcyB0aGUgb2xk IG9wZW4gaGFuZGxlciAqLworUEhQX01FVEhPRChTZXNzaW9uSGFuZGxlciwgb3BlbikKK3sKKwlQ U19TQU5JVFlfQ0hFQ0s7CisKKwlSRVRWQUxfTE9ORyhQUyhvbGRfbW9kKS0+c19vcGVuKCZQUyht b2RfZGF0YSksIFBTKHNhdmVfcGF0aCksIFBTKHNlc3Npb25fbmFtZSkgVFNSTUxTX0NDKSk7Cit9 CisvKiB9fX0gKi8KKworLyoge3t7IHByb3RvIGJvb2wgU2Vzc2lvbkhhbmRsZXI6OmNsb3NlKCkK KyAgIFdyYXBzIHRoZSBvbGQgY2xvc2UgaGFuZGxlciAqLworUEhQX01FVEhPRChTZXNzaW9uSGFu ZGxlciwgY2xvc2UpCit7CisJUFNfU0FOSVRZX0NIRUNLOworCisJUkVUVkFMX0xPTkcoUFMob2xk X21vZCktPnNfY2xvc2UoJlBTKG1vZF9kYXRhKSBUU1JNTFNfQ0MpKTsKK30KKy8qIH19fSAqLwor CisvKiB7e3sgcHJvdG8gYm9vbCBTZXNzaW9uSGFuZGxlcjo6cmVhZChzYXZlX3BhdGgsIHNlc3Np b25fbmFtZSkKKyAgIFdyYXBzIHRoZSBvbGQgcmVhZCBoYW5kbGVyICovCitQSFBfTUVUSE9EKFNl c3Npb25IYW5kbGVyLCByZWFkKQoreworCWNoYXIgKmtleSwgKnZhbDsKKwlpbnQga2V5X2xlbiwg dmFsX2xlbjsKKworCVBTX1NBTklUWV9DSEVDSzsKKworCWlmICh6ZW5kX3BhcnNlX3BhcmFtZXRl cnMoWkVORF9OVU1fQVJHUygpIFRTUk1MU19DQywgInMiLCAma2V5LCAma2V5X2xlbiwgVUcodXRm OF9jb252KSkgPT0gRkFJTFVSRSkgeworCQlyZXR1cm47CisJfQorCisJaWYgKFBTKG9sZF9tb2Qp LT5zX3JlYWQoJlBTKG1vZF9kYXRhKSwga2V5LCAmdmFsLCAmdmFsX2xlbiBUU1JNTFNfQ0MpID09 IEZBSUxVUkUpIHsKKwkJUkVUVVJOX0ZBTFNFOworCX0KKworCVJFVFZBTF9TVFJJTkdMKHZhbCwg dmFsX2xlbiwgMSk7CisJZWZyZWUodmFsKTsKKwlyZXR1cm47Cit9CisvKiB9fX0gKi8KKworLyog e3t7IHByb3RvIGJvb2wgU2Vzc2lvbkhhbmRsZXI6OndyaXRlKHNhdmVfcGF0aCwgc2Vzc2lvbl9u YW1lKQorICAgV3JhcHMgdGhlIG9sZCB3cml0ZSBoYW5kbGVyICovCitQSFBfTUVUSE9EKFNlc3Np b25IYW5kbGVyLCB3cml0ZSkKK3sKKwljaGFyICprZXksICp2YWw7CisJaW50IGtleV9sZW4sIHZh bF9sZW47CisKKwlQU19TQU5JVFlfQ0hFQ0s7CisKKwlpZiAoemVuZF9wYXJzZV9wYXJhbWV0ZXJz KFpFTkRfTlVNX0FSR1MoKSBUU1JNTFNfQ0MsICJzcyIsICZrZXksICZrZXlfbGVuLCAmdmFsLCAm dmFsX2xlbiwgVUcodXRmOF9jb252KSkgPT0gRkFJTFVSRSkgeworCQlyZXR1cm47CisJfQorCisJ UkVUVkFMX0xPTkcoUFMob2xkX21vZCktPnNfd3JpdGUoJlBTKG1vZF9kYXRhKSwga2V5LCB2YWws IHZhbF9sZW4gVFNSTUxTX0NDKSk7Cit9CisvKiB9fX0gKi8KKworLyoge3t7IHByb3RvIGJvb2wg U2Vzc2lvbkhhbmRsZXI6OmRlc3Ryb3koKQorICAgV3JhcHMgdGhlIG9sZCBkZXN0cm95IGhhbmRs ZXIgKi8KK1BIUF9NRVRIT0QoU2Vzc2lvbkhhbmRsZXIsIGRlc3Ryb3kpCit7CisJY2hhciAqa2V5 OworCWludCBrZXlfbGVuOworCisJUFNfU0FOSVRZX0NIRUNLOworCisJaWYgKHplbmRfcGFyc2Vf cGFyYW1ldGVycyhaRU5EX05VTV9BUkdTKCkgVFNSTUxTX0NDLCAicyIsICZrZXksICZrZXlfbGVu LCBVRyh1dGY4X2NvbnYpKSA9PSBGQUlMVVJFKSB7CisJCXJldHVybjsKKwl9CisJCisJUkVUVkFM X0xPTkcoUFMob2xkX21vZCktPnNfZGVzdHJveSgmUFMobW9kX2RhdGEpLCBrZXkgVFNSTUxTX0ND KSk7Cit9CisvKiB9fX0gKi8KKworLyoge3t7IHByb3RvIGJvb2wgU2Vzc2lvbkhhbmRsZXI6Omdj KGludCBtYXhsaWZldGltZSkKKyAgIFdyYXBzIHRoZSBvbGQgZ2MgaGFuZGxlciAqLworUEhQX01F VEhPRChTZXNzaW9uSGFuZGxlciwgZ2MpCit7CisJbG9uZyBtYXhsaWZldGltZTsKKwlpbnQgbnJk ZWxzOworCisJUFNfU0FOSVRZX0NIRUNLOworCisJaWYgKHplbmRfcGFyc2VfcGFyYW1ldGVycyha RU5EX05VTV9BUkdTKCkgVFNSTUxTX0NDLCAibCIsICZtYXhsaWZldGltZSwgVUcodXRmOF9jb252 KSkgPT0gRkFJTFVSRSkgeworCQlyZXR1cm47CisJfQorCQorCVJFVFZBTF9MT05HKFBTKG9sZF9t b2QpLT5zX2djKCZQUyhtb2RfZGF0YSksIG1heGxpZmV0aW1lLCAmbnJkZWxzIFRTUk1MU19DQykp OworfQorLyogfX19ICovCisKSW5kZXg6IGV4dC9zZXNzaW9uL2NvbmZpZy5tNAo9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 Ci0tLSBleHQvc2Vzc2lvbi9jb25maWcubTQJKHJldmlzaW9uIDI5MTEyNCkKKysrIGV4dC9zZXNz aW9uL2NvbmZpZy5tNAkod29ya2luZyBjb3B5KQpAQCAtMTEsNyArMTEsNyBAQAogaWYgdGVzdCAi JFBIUF9TRVNTSU9OIiAhPSAibm8iOyB0aGVuCiAgIFBIUF9QV1JJVEVfVEVTVAogICBQSFBfUFJF QURfVEVTVAotICBQSFBfTkVXX0VYVEVOU0lPTihzZXNzaW9uLCBzZXNzaW9uLmMgbW9kX2ZpbGVz LmMgbW9kX21tLmMgbW9kX3VzZXIuYywgJGV4dF9zaGFyZWQpCisgIFBIUF9ORVdfRVhURU5TSU9O KHNlc3Npb24sIG1vZF91c2VyX2NsYXNzLmMgc2Vzc2lvbi5jIG1vZF9maWxlcy5jIG1vZF9tbS5j IG1vZF91c2VyLmMsICRleHRfc2hhcmVkKQogICBQSFBfQUREX0VYVEVOU0lPTl9ERVAoc2Vzc2lv biwgaGFzaCwgdHJ1ZSkKICAgUEhQX1NVQlNUKFNFU1NJT05fU0hBUkVEX0xJQkFERCkKICAgUEhQ X0lOU1RBTExfSEVBREVSUyhleHQvc2Vzc2lvbiwgW3BocF9zZXNzaW9uLmggbW9kX2ZpbGVzLmgg bW9kX3VzZXIuaF0pCkluZGV4OiBleHQvc2Vzc2lvbi9wYWNrYWdlLnhtbAo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t LSBleHQvc2Vzc2lvbi9wYWNrYWdlLnhtbAkocmV2aXNpb24gMjkxMTI0KQorKysgZXh0L3Nlc3Np b24vcGFja2FnZS54bWwJKHdvcmtpbmcgY29weSkKQEAgLTQwLDYgKzQwLDcgQEAKICAgIDxmaWxl IHJvbGU9InNyYyIgbmFtZT0ibW9kX21tLmMiLz4KICAgIDxmaWxlIHJvbGU9InNyYyIgbmFtZT0i bW9kX21tLmgiLz4KICAgIDxmaWxlIHJvbGU9InNyYyIgbmFtZT0ibW9kX3VzZXIuYyIvPgorICAg PGZpbGUgcm9sZT0ic3JjIiBuYW1lPSJtb2RfdXNlcl9jbGFzcy5jIi8+CiAgICA8ZmlsZSByb2xl PSJzcmMiIG5hbWU9Im1vZF91c2VyLmgiLz4KICAgIDxmaWxlIHJvbGU9InNyYyIgbmFtZT0icGhw X3Nlc3Npb24uaCIvPgogICAgPGZpbGUgcm9sZT0ic3JjIiBuYW1lPSJzZXNzaW9uLmMiLz4KSW5k ZXg6IGV4dC9zZXNzaW9uL21vZF91c2VyLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZXh0L3Nlc3Npb24vbW9k X3VzZXIuYwkocmV2aXNpb24gMjkxMTI0KQorKysgZXh0L3Nlc3Npb24vbW9kX3VzZXIuYwkod29y a2luZyBjb3B5KQpAQCAtNjIsMTUgKzYyLDEwIEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotI2Rl ZmluZSBTVERWQVJTMQkJCQkJCQlcCisjZGVmaW5lIFNURFZBUlMJCQkJCQkJCVwKIAl6dmFsICpy ZXR2YWw7CQkJCQkJCVwKIAlpbnQgcmV0ID0gRkFJTFVSRQogCi0jZGVmaW5lIFNURFZBUlMJCQkJ CQkJCVwKLQlTVERWQVJTMTsJCQkJCQkJCVwKLQljaGFyICptZGF0YSA9IFBTX0dFVF9NT0RfREFU QSgpOwkJXAotCWlmICghbWRhdGEpIHsgcmV0dXJuIEZBSUxVUkU7IH0KLQogI2RlZmluZSBQU0Yo YSkgUFMobW9kX3VzZXJfbmFtZXMpLm5hbWUucHNfIyNhCiAKICNkZWZpbmUgRklOSVNICQkJCQkJ CQlcCkBAIC04NCwzMyArNzksMjQgQEAKIFBTX09QRU5fRlVOQyh1c2VyKQogewogCXp2YWwgKmFy Z3NbMl07Ci0Jc3RhdGljIGNoYXIgZHVtbXkgPSAwOwotCVNURFZBUlMxOworCVNURFZBUlM7CiAK IAlTRVNTX1pWQUxfU1RSSU5HKChjaGFyKilzYXZlX3BhdGgsIGFyZ3NbMF0pOwogCVNFU1NfWlZB TF9TVFJJTkcoKGNoYXIqKXNlc3Npb25fbmFtZSwgYXJnc1sxXSk7CiAKIAlyZXR2YWwgPSBwc19j YWxsX2hhbmRsZXIoUFNGKG9wZW4pLCAyLCBhcmdzIFRTUk1MU19DQyk7Ci0JaWYgKHJldHZhbCkg ewotCQkvKiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBmb29sIHRoZSBzZXNzaW9uIG1vZHVsZS4gWWVz LCBpdCdzIHNhZmUgdG8KLQkJICogdXNlIGEgc3RhdGljLiBOZWl0aGVyIG1vZF91c2VyIG5vciB0 aGUgc2Vzc2lvbiBtb2R1bGUgaXRzZWxmIHdpbGwKLQkJICogZXZlciB0b3VjaCB0aGlzIHBvaW50 ZXIuIEl0IGNvdWxkIGJlIHNldCB0byAweERFQURCRUVGIGZvciBhbGwgdGhlCi0JCSAqIGRpZmZl cmVuY2UgaXQgbWFrZXMsIGJ1dCBmb3IgdGhlIHNha2Ugb2YgcGFyYW5vaWEgaXQncyBzZXQgdG8g c29tZQotCQkgKiB2YWxpZCB2YWx1ZS4gKi8KLQkJUFNfU0VUX01PRF9EQVRBKCZkdW1teSk7Ci0J fQorCVBTKG1vZF9hY3RpdmUpID0gMTsKIAogCUZJTklTSDsKIH0KIAogUFNfQ0xPU0VfRlVOQyh1 c2VyKQogewotCVNURFZBUlMxOworCVNURFZBUlM7CiAKIAlyZXR2YWwgPSBwc19jYWxsX2hhbmRs ZXIoUFNGKGNsb3NlKSwgMCwgTlVMTCBUU1JNTFNfQ0MpOworCVBTKG1vZF9hY3RpdmUpID0gMDsK IAotCVBTX1NFVF9NT0RfREFUQShOVUxMKTsKLQogCUZJTklTSDsKIH0KIApJbmRleDogZXh0L3Nl c3Npb24vdGVzdHMvc2Vzc2lvbl9zZXRfc2F2ZV9oYW5kbGVyX2NsYXNzLnBocHQKPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQotLS0gZXh0L3Nlc3Npb24vdGVzdHMvc2Vzc2lvbl9zZXRfc2F2ZV9oYW5kbGVyX2NsYXNzLnBo cHQJKHJldmlzaW9uIDApCisrKyBleHQvc2Vzc2lvbi90ZXN0cy9zZXNzaW9uX3NldF9zYXZlX2hh bmRsZXJfY2xhc3MucGhwdAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxOTcgQEAKKy0tVEVTVC0t CitUZXN0IHNlc3Npb25fc2V0X3NhdmVfaGFuZGxlcigpIGZ1bmN0aW9uIDogY2xhc3MgaGFuZGxl cgorLS1JTkktLQorc2Vzc2lvbi5zYXZlX3BhdGg9CitzZXNzaW9uLm5hbWU9UEhQU0VTU0lECist LVNLSVBJRi0tCis8P3BocCBpbmNsdWRlKCdza2lwaWYuaW5jJyk7ID8+CistLUZJTEUtLQorPD9w aHAKKworb2Jfc3RhcnQoKTsKKworLyogCisgKiBQcm90b3R5cGUgOiBib29sIHNlc3Npb25fc2V0 X3NhdmVfaGFuZGxlcihzdHJpbmcgJGNsYXNzKQorICogRGVzY3JpcHRpb24gOiBTZXRzIHVzZXIt bGV2ZWwgc2Vzc2lvbiBzdG9yYWdlIGZ1bmN0aW9ucworICogU291cmNlIGNvZGUgOiBleHQvc2Vz c2lvbi9zZXNzaW9uLmMgCisgKi8KKworZWNobyAiKioqIFRlc3Rpbmcgc2Vzc2lvbl9zZXRfc2F2 ZV9oYW5kbGVyKCkgOiBjbGFzcyBoYW5kbGVyICoqKlxuIjsKKworZWNobyAiKioqIFRlc3Rpbmcg c2Vzc2lvbl9zZXRfc2F2ZV9oYW5kbGVyKCkgOiBiYXNpYyBjbGFzcyB3cmFwcGluZyBleGlzdGlu ZyBoYW5kbGVyICoqKlxuIjsKKworY2xhc3MgTXlTZXNzaW9uIGV4dGVuZHMgU2Vzc2lvbkhhbmRs ZXIgeworCXB1YmxpYyBzdGF0aWMgJGkgPSAwOworCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gb3Bl bigkcGF0aCwgJG5hbWUpIHsKKwkJKytzZWxmOjokaTsKKwkJZWNobyAnT3BlbiAnLCBzZXNzaW9u X2lkKCksICJcbiI7CisJCXJldHVybiBwYXJlbnQ6Om9wZW4oJHBhdGgsICRuYW1lKTsKKwl9CisJ cHVibGljIHN0YXRpYyBmdW5jdGlvbiByZWFkKCRrZXkpIHsKKwkJKytzZWxmOjokaTsKKwkJZWNo byAnUmVhZCAnLCBzZXNzaW9uX2lkKCksICJcbiI7CisJCXJldHVybiBwYXJlbnQ6OnJlYWQoJGtl eSk7CisJfQorfQorCiskcGF0aCA9IGRpcm5hbWUoX19GSUxFX18pOworc2Vzc2lvbl9zYXZlX3Bh dGgoJHBhdGgpOworCiskb2xkSGFuZGxlciA9IGluaV9nZXQoJ3Nlc3Npb24uc2F2ZV9oYW5kbGVy Jyk7CitzZXNzaW9uX3NldF9zYXZlX2hhbmRsZXIoJ015U2Vzc2lvbicpOworc2Vzc2lvbl9zdGFy dCgpOworCit2YXJfZHVtcChzZXNzaW9uX2lkKCksICRvbGRIYW5kbGVyLCBpbmlfZ2V0KCdzZXNz aW9uLnNhdmVfaGFuZGxlcicpLCBNeVNlc3Npb246OiRpLCAkX1NFU1NJT04pOworCiskX1NFU1NJ T05bJ2ZvbyddID0gIlx1MjYzQSI7CisKK3Nlc3Npb25fd3JpdGVfY2xvc2UoKTsKK3Nlc3Npb25f dW5zZXQoKTsKKworc2Vzc2lvbl9zdGFydCgpOwordmFyX2R1bXAoJF9TRVNTSU9OKTsKKworc2Vz c2lvbl93cml0ZV9jbG9zZSgpOworc2Vzc2lvbl91bnNldCgpOworCitlY2hvICIqKiogVGVzdGlu ZyBzZXNzaW9uX3NldF9zYXZlX2hhbmRsZXIoKSA6IGZ1bGwgaGFuZGxlciBpbXBsZW1lbnRhdGlv biAqKipcbiI7CisKK2NsYXNzIE15U2Vzc2lvbjIgZXh0ZW5kcyBTZXNzaW9uSGFuZGxlciB7CisJ cHVibGljIHN0YXRpYyAkcGF0aDsKKworCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gb3BlbigkcGF0 aCwgJG5hbWUpIHsKKwkJaWYgKCEkcGF0aCkgeworCQkJJHBhdGggPSAnL3RtcCc7CisJCX0KKwkJ c2VsZjo6JHBhdGggPSAkcGF0aCAuICcvdV9zZXNzXycgLiAkbmFtZTsKKwkJcmV0dXJuIHRydWU7 CisJfQorCisJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjbG9zZSgpIHsKKwkJcmV0dXJuIHRydWU7 CisJfQorCisJcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZWFkKCRpZCkgeworCQlyZXR1cm4gQGZp bGVfZ2V0X2NvbnRlbnRzKHNlbGY6OiRwYXRoIC4gJGlkKTsKKwl9CisKKwlwdWJsaWMgc3RhdGlj IGZ1bmN0aW9uIHdyaXRlKCRpZCwgJGRhdGEpIHsKKwkJcmV0dXJuIGZpbGVfcHV0X2NvbnRlbnRz KHNlbGY6OiRwYXRoIC4gJGlkLCAkZGF0YSk7CisJfQorCisJcHVibGljIHN0YXRpYyBmdW5jdGlv biBkZXN0cm95KCRpZCkgeworCQlAdW5saW5rKHNlbGY6OiRwYXRoIC4gJGlkKTsKKwl9CisKKwlw dWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdjKCRtYXhsaWZldGltZSkgeworCQlmb3JlYWNoIChnbG9i KHNlbGY6OiRwYXRoIC4gJyonKSBhcyAkZmlsZW5hbWUpIHsKKwkJCWlmIChmaWxlbXRpbWUoJGZp bGVuYW1lKSArICRtYXhsaWZldGltZSA8IHRpbWUoKSkgeworCQkJCUB1bmxpbmsoJGZpbGVuYW1l KTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9CisKK3Nlc3Npb25fc2V0X3NhdmVf aGFuZGxlcignTXlTZXNzaW9uMicpOworc2Vzc2lvbl9zdGFydCgpOworCiskX1NFU1NJT05bJ2Zv byddID0gIlx1MjYzQSI7CisKK3Zhcl9kdW1wKHNlc3Npb25faWQoKSwgaW5pX2dldCgnc2Vzc2lv bi5zYXZlX2hhbmRsZXInKSwgJF9TRVNTSU9OKTsKKworc2Vzc2lvbl93cml0ZV9jbG9zZSgpOwor c2Vzc2lvbl91bnNldCgpOworCitzZXNzaW9uX3N0YXJ0KCk7Cit2YXJfZHVtcCgkX1NFU1NJT04p OworCitzZXNzaW9uX3dyaXRlX2Nsb3NlKCk7CitzZXNzaW9uX3Vuc2V0KCk7CisKK2VjaG8gIioq KiBUZXN0aW5nIHNlc3Npb25fc2V0X3NhdmVfaGFuZGxlcigpIDogaW5oZXJpdGFuY2UgKioqXG4i OworCitjbGFzcyBNeVNlc3Npb24zIGV4dGVuZHMgU2Vzc2lvbkhhbmRsZXIgeworCXB1YmxpYyBz dGF0aWMgJGkgPSAwOworCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gb3BlbigkcGF0aCwgJG5hbWUp IHsKKwkJKytNeVNlc3Npb24zOjokaTsKKwkJcmV0dXJuIHBhcmVudDo6b3BlbigkcGF0aCwgJG5h bWUpOworCX0KKwlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlYWQoJGtleSkgeworCQkrK015U2Vz c2lvbjM6OiRpOworCQlyZXR1cm4gcGFyZW50OjpyZWFkKCRrZXkpOworCX0KK30KKworY2xhc3Mg TXlTZXNzaW9uNCBleHRlbmRzIE15U2Vzc2lvbjMgeworCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24g d3JpdGUoJGlkLCAkZGF0YSkgeworCQlNeVNlc3Npb24zOjokaSA9ICJoYWkiOworCQlyZXR1cm4g cGFyZW50Ojp3cml0ZSgkaWQsICRkYXRhKTsKKwl9Cit9CisKK3Nlc3Npb25fc2V0X3NhdmVfaGFu ZGxlcignTXlTZXNzaW9uMycpOworc2Vzc2lvbl9zdGFydCgpOworCiskX1NFU1NJT05bJ2Zvbydd ID0gIlx1MjYzQSI7CisKK3Nlc3Npb25fd3JpdGVfY2xvc2UoKTsKK3Nlc3Npb25fdW5zZXQoKTsK Kworc2Vzc2lvbl9zdGFydCgpOworCit2YXJfZHVtcCgkX1NFU1NJT04pOworCitzZXNzaW9uX3dy aXRlX2Nsb3NlKCk7CitzZXNzaW9uX3Vuc2V0KCk7CisKK3Nlc3Npb25fc2V0X3NhdmVfaGFuZGxl cignTXlTZXNzaW9uNCcpOworCitzZXNzaW9uX3N0YXJ0KCk7CisKK3Nlc3Npb25fd3JpdGVfY2xv c2UoKTsKK3Nlc3Npb25fdW5zZXQoKTsKKwordmFyX2R1bXAoc2Vzc2lvbl9pZCgpLCAkX1NFU1NJ T04sIE15U2Vzc2lvbjM6OiRpKTsKKworb2JfZW5kX2ZsdXNoKCk7Cis/PgorLS1FWFBFQ1RGLS0K KyoqKiBUZXN0aW5nIHNlc3Npb25fc2V0X3NhdmVfaGFuZGxlcigpIDogY2xhc3MgaGFuZGxlciAq KioKKyoqKiBUZXN0aW5nIHNlc3Npb25fc2V0X3NhdmVfaGFuZGxlcigpIDogYmFzaWMgY2xhc3Mg d3JhcHBpbmcgZXhpc3RpbmcgaGFuZGxlciAqKioKK09wZW4gCitSZWFkICV4CitzdHJpbmcoMzIp ICIleCIKK3VuaWNvZGUoNSkgImZpbGVzIgordW5pY29kZSg0KSAidXNlciIKK2ludCgyKQorYXJy YXkoMCkgeworfQorT3BlbiAleAorUmVhZCAleAorYXJyYXkoMSkgeworICBbdSJmb28iXT0+Cisg IHVuaWNvZGUoMSkgIuKYuiIKK30KKyoqKiBUZXN0aW5nIHNlc3Npb25fc2V0X3NhdmVfaGFuZGxl cigpIDogZnVsbCBoYW5kbGVyIGltcGxlbWVudGF0aW9uICoqKgorc3RyaW5nKDMyKSAiJXgiCit1 bmljb2RlKDQpICJ1c2VyIgorYXJyYXkoMSkgeworICBbdSJmb28iXT0+CisgIHVuaWNvZGUoMSkg IuKYuiIKK30KK2FycmF5KDEpIHsKKyAgW3UiZm9vIl09PgorICB1bmljb2RlKDEpICLimLoiCit9 CisqKiogVGVzdGluZyBzZXNzaW9uX3NldF9zYXZlX2hhbmRsZXIoKSA6IGluaGVyaXRhbmNlICoq KgorYXJyYXkoMSkgeworICBbdSJmb28iXT0+CisgIHVuaWNvZGUoMSkgIuKYuiIKK30KK3N0cmlu ZygzMikgIiV4IgorYXJyYXkoMSkgeworICBbdSJmb28iXT0+CisgIHVuaWNvZGUoMSkgIuKYuiIK K30KK3VuaWNvZGUoMykgImhhaSIKSW5kZXg6IGV4dC9zZXNzaW9uL3Nlc3Npb24uYwo9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09Ci0tLSBleHQvc2Vzc2lvbi9zZXNzaW9uLmMJKHJldmlzaW9uIDI5MTEyNCkKKysrIGV4dC9z ZXNzaW9uL3Nlc3Npb24uYwkod29ya2luZyBjb3B5KQpAQCAtOTQsOSArOTQsMTAgQEAKIAkJUFMo aHR0cF9zZXNzaW9uX3ZhcnMpID0gTlVMTDsKIAl9CiAJLyogRG8gTk9UIGRlc3Ryb3kgUFMobW9k X3VzZXJfbmFtZXMpIGhlcmUhICovCi0JaWYgKFBTKG1vZF9kYXRhKSkgeworCWlmIChQUyhtb2Rf YWN0aXZlKSkgewogCQl6ZW5kX3RyeSB7CiAJCQlQUyhtb2QpLT5zX2Nsb3NlKCZQUyhtb2RfZGF0 YSkgVFNSTUxTX0NDKTsKKwkJCVBTKG1vZF9hY3RpdmUpID0gMDsKIAkJfSB6ZW5kX2VuZF90cnko KTsKIAl9CiAJaWYgKFBTKGlkKSkgewpAQCAtNDExLDYgKzQxMiw4IEBACiAJCXJldHVybjsKIAl9 CiAKKwlQUyhtb2RfYWN0aXZlKSA9IDE7CisKIAkvKiBPcGVuIHNlc3Npb24gaGFuZGxlciBmaXJz dCAqLwogCWlmIChQUyhtb2QpLT5zX29wZW4oJlBTKG1vZF9kYXRhKSwgUFMoc2F2ZV9wYXRoKSwg UFMoc2Vzc2lvbl9uYW1lKSBUU1JNTFNfQ0MpID09IEZBSUxVUkUpIHsKIAkJcGhwX2Vycm9yX2Rv Y3JlZihOVUxMIFRTUk1MU19DQywgRV9FUlJPUiwgIkZhaWxlZCB0byBpbml0aWFsaXplIHN0b3Jh Z2UgbW9kdWxlOiAlcyAocGF0aDogJXMpIiwgUFMobW9kKS0+c19uYW1lLCBQUyhzYXZlX3BhdGgp KTsKQEAgLTQ1MSw3ICs0NTQsNyBAQAogCiAJSUZfU0VTU0lPTl9WQVJTKCkgewogCi0JCWlmIChQ Uyhtb2RfZGF0YSkpIHsKKwkJaWYgKFBTKG1vZF9hY3RpdmUpKSB7CiAJCQljaGFyICp2YWw7CiAJ CQlpbnQgdmFsbGVuOwogCkBAIC00NzMsOCArNDc2LDkgQEAKIAkJfQogCX0KIAotCWlmIChQUyht b2RfZGF0YSkpIHsKKwlpZiAoUFMobW9kX2FjdGl2ZSkpIHsKIAkJUFMobW9kKS0+c19jbG9zZSgm UFMobW9kX2RhdGEpIFRTUk1MU19DQyk7CisJCVBTKG1vZF9hY3RpdmUpID0gMDsKIAl9CiB9CiAv KiB9fX0gKi8KQEAgLTUwNSw2ICs1MDksNyBAQAogCQl9CiAJCXJldHVybiBGQUlMVVJFOwogCX0K KwlQUyhvbGRfbW9kKSA9IFBTKG1vZCk7CiAJUFMobW9kKSA9IHRtcDsKIAogCXJldHVybiBTVUND RVNTOwpAQCAtMTM4MSw3ICsxMzg2LDcgQEAKIAogCXBocF9zZXNzaW9uX2NhY2hlX2xpbWl0ZXIo VFNSTUxTX0MpOwogCi0JaWYgKFBTKG1vZF9kYXRhKSAmJiBQUyhnY19wcm9iYWJpbGl0eSkgPiAw KSB7CisJaWYgKFBTKG1vZF9hY3RpdmUpICYmIFBTKGdjX3Byb2JhYmlsaXR5KSA+IDApIHsKIAkJ aW50IG5yZGVscyA9IC0xOwogCiAJCW5yYW5kID0gKGludCkgKChmbG9hdCkgUFMoZ2NfZGl2aXNv cikgKiBwaHBfY29tYmluZWRfbGNnKFRTUk1MU19DKSk7CkBAIC0xNTE2LDggKzE1MjEsOSBAQAog CQkJenZhbF9kdG9yKHJldHVybl92YWx1ZSk7CiAJCQlSRVRVUk5fRkFMU0U7CiAJCX0KLQkJaWYg KFBTKG1vZF9kYXRhKSkgeworCQlpZiAoUFMobW9kX2FjdGl2ZSkpIHsKIAkJCVBTKG1vZCktPnNf Y2xvc2UoJlBTKG1vZF9kYXRhKSBUU1JNTFNfQ0MpOworCQkJUFMobW9kX2FjdGl2ZSkgPSAwOwog CQl9CiAJCVBTKG1vZF9kYXRhKSA9IE5VTEw7CiAKQEAgLTE1MjYsNyArMTUzMiwyMCBAQAogfQog LyogfX19ICovCiAKLS8qIHt7eyBwcm90byB2b2lkIHNlc3Npb25fc2V0X3NhdmVfaGFuZGxlcihz dHJpbmcgb3Blbiwgc3RyaW5nIGNsb3NlLCBzdHJpbmcgcmVhZCwgc3RyaW5nIHdyaXRlLCBzdHJp bmcgZGVzdHJveSwgc3RyaW5nIGdjKSBVCisjZGVmaW5lIFBTX01FVEhPRF9DQUxMQkFDSyh4KQkJ CQkJCQkJCQkJXAorCWNhbGxiYWNrID0gUFMobW9kX3VzZXJfbmFtZXMpLm5hbWUucHNfIyN4OwkJ CQkJCQlcCisJaWYgKGNhbGxiYWNrICE9IE5VTEwpIHsJCQkJCQkJCQkJCQlcCisJCXp2YWxfcHRy X2R0b3IoJmNhbGxiYWNrKTsJCQkJCQkJCQkJXAorCQljYWxsYmFjayA9IE5VTEw7CQkJCQkJCQkJ CQkJXAorCX0JCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJCQkJCQkJCQkJCQkJCVwKKwlNQUtFX1NU RF9aVkFMKGNhbGxiYWNrKTsJCQkJCQkJCQkJCVwKKwlhcnJheV9pbml0KGNhbGxiYWNrKTsJCQkJ CQkJCQkJCQlcCisJYWRkX25leHRfaW5kZXhfenN0cmwoY2FsbGJhY2ssIElTX1VOSUNPREUsIGNs YXNzLCBjbGFzc19sZW4sIDEpOwlcCisJYWRkX25leHRfaW5kZXhfc3RyaW5nKGNhbGxiYWNrLCAj eCwgMSk7CQkJCQkJCQlcCisJUFMobW9kX3VzZXJfbmFtZXMpLm5hbWUucHNfIyN4ID0gY2FsbGJh Y2s7CisKKy8qIHt7eyBwcm90byB2b2lkIHNlc3Npb25fc2V0X3NhdmVfaGFuZGxlcihzdHJpbmcg b3BlbiBbLCBzdHJpbmcgY2xvc2UsIHN0cmluZyByZWFkLCBzdHJpbmcgd3JpdGUsIHN0cmluZyBk ZXN0cm95LCBzdHJpbmcgZ2NdKSBVCiAgICBTZXRzIHVzZXItbGV2ZWwgZnVuY3Rpb25zICovCiBz dGF0aWMgUEhQX0ZVTkNUSU9OKHNlc3Npb25fc2V0X3NhdmVfaGFuZGxlcikKIHsKQEAgLTE1Mzgs MTAgKzE1NTcsNTEgQEAKIAkJUkVUVVJOX0ZBTFNFOwogCX0KIAotCWlmIChhcmdjICE9IDYpIHsK KwlpZiAoYXJnYyAhPSAxICYmIGFyZ2MgIT0gNikgewogCQlXUk9OR19QQVJBTV9DT1VOVDsKIAl9 CiAKKwlpZiAoYXJnYyA9PSAxKSB7CisJCXpzdHIgY2xhc3M7CisJCXVpbnQgY2xhc3NfbGVuOwor CQl6ZW5kX2NsYXNzX2VudHJ5ICoqcGNlLCAqY2UgPSBOVUxMOworCQl6dmFsICpjYWxsYmFjazsK KworCQlpZiAoemVuZF9wYXJzZV9wYXJhbWV0ZXJzKFpFTkRfTlVNX0FSR1MoKSBUU1JNTFNfQ0Ms ICJ1IiwgJmNsYXNzLCAmY2xhc3NfbGVuKSA9PSBGQUlMVVJFKSB7CisJCQlyZXR1cm47CisJCX0K KwkKKwkJaWYgKHplbmRfdV9sb29rdXBfY2xhc3MoSVNfVU5JQ09ERSwgY2xhc3MsIGNsYXNzX2xl biwgJnBjZSBUU1JNTFNfQ0MpID09IEZBSUxVUkUpIHsKKwkJCXBocF9lcnJvcl9kb2NyZWYoTlVM TCBUU1JNTFNfQ0MsIEVfRVJST1IsICJUaGUgcHJvdmlkZWQgY2xhc3MgKCVzKSBkb2VzIG5vdCBl eGlzdCIsIGNsYXNzKTsKKwkJCVJFVFVSTl9GQUxTRTsKKwkJfQorCisJCWNlID0gKnBjZTsKKwkJ d2hpbGUgKGNlLT5wYXJlbnQpIHsKKwkJCWNlID0gY2UtPnBhcmVudDsKKwkJfQorCisJCWlmIChj ZSAhPSBwaHBfc2Vzc2lvbl9jbGFzc19lbnRyeSkgeworCQkJcGhwX2Vycm9yX2RvY3JlZihOVUxM IFRTUk1MU19DQywgRV9FUlJPUiwgIlRoZSBzZXNzaW9uIGhhbmRsZXIgY2xhc3MgbXVzdCBkZXNj ZW5kIGZyb20gJXMiLCBQU19DTEFTU19OQU1FKTsKKwkJCVJFVFVSTl9GQUxTRTsKKwkJfQorCQkK KwkJUFNfTUVUSE9EX0NBTExCQUNLKG9wZW4pOworCQlQU19NRVRIT0RfQ0FMTEJBQ0soY2xvc2Up OworCQlQU19NRVRIT0RfQ0FMTEJBQ0socmVhZCk7CisJCVBTX01FVEhPRF9DQUxMQkFDSyh3cml0 ZSk7CisJCVBTX01FVEhPRF9DQUxMQkFDSyhkZXN0cm95KTsKKwkJUFNfTUVUSE9EX0NBTExCQUNL KGdjKTsKKworCQlpZiAoUFMobW9kKSAmJiBQUyhzZXNzaW9uX3N0YXR1cykgPT0gcGhwX3Nlc3Np b25fbm9uZSAmJiBQUyhtb2QpICE9ICZwc19tb2RfdXNlcikgeworCQkJUFMob2xkX21vZCkgPSBQ Uyhtb2QpOworCQkJemVuZF9hbHRlcl9pbmlfZW50cnkoInNlc3Npb24uc2F2ZV9oYW5kbGVyIiwg c2l6ZW9mKCJzZXNzaW9uLnNhdmVfaGFuZGxlciIpLCAidXNlciIsIHNpemVvZigidXNlciIpLTEs IFBIUF9JTklfVVNFUiwgUEhQX0lOSV9TVEFHRV9SVU5USU1FKTsKKwkJfQorCisJCVBTKG1vZF9h Y3RpdmUpID0gMTsKKwkJUkVUVVJOX1RSVUU7CisJfQorCiAJaWYgKHplbmRfcGFyc2VfcGFyYW1l dGVycyhhcmdjIFRTUk1MU19DQywgIisiLCAmYXJncywgJm51bV9hcmdzKSA9PSBGQUlMVVJFKSB7 CiAJCXJldHVybjsKIAl9CkBAIC0xNTU1LDcgKzE2MTUsOCBAQAogCQl9CiAJCXp2YWxfZHRvcigm bmFtZSk7CiAJfQotCisJCisJUFMobW9kX2FjdGl2ZSkgPSAxOwogCXplbmRfYWx0ZXJfaW5pX2Vu dHJ5KCJzZXNzaW9uLnNhdmVfaGFuZGxlciIsIHNpemVvZigic2Vzc2lvbi5zYXZlX2hhbmRsZXIi KSwgInVzZXIiLCBzaXplb2YoInVzZXIiKS0xLCBQSFBfSU5JX1VTRVIsIFBIUF9JTklfU1RBR0Vf UlVOVElNRSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CkBAIC0xODg1LDYgKzE5NDYs MzEgQEAKIAlaRU5EX0FSR19JTkZPKDAsIHNlY3VyZSkKIAlaRU5EX0FSR19JTkZPKDAsIGh0dHBv bmx5KQogWkVORF9FTkRfQVJHX0lORk8oKQorCitaRU5EX0JFR0lOX0FSR19JTkZPKGFyZ2luZm9f c2Vzc2lvbl9jbGFzc19vcGVuLCAwKQorCVpFTkRfQVJHX0lORk8oMCwgc2F2ZV9wYXRoKQorCVpF TkRfQVJHX0lORk8oMCwgc2Vzc2lvbl9uYW1lKQorWkVORF9FTkRfQVJHX0lORk8oKQorCitaRU5E X0JFR0lOX0FSR19JTkZPKGFyZ2luZm9fc2Vzc2lvbl9jbGFzc19jbG9zZSwgMCkKK1pFTkRfRU5E X0FSR19JTkZPKCkKKworWkVORF9CRUdJTl9BUkdfSU5GTyhhcmdpbmZvX3Nlc3Npb25fY2xhc3Nf cmVhZCwgMCkKKwlaRU5EX0FSR19JTkZPKDAsIGtleSkKK1pFTkRfRU5EX0FSR19JTkZPKCkKKwor WkVORF9CRUdJTl9BUkdfSU5GTyhhcmdpbmZvX3Nlc3Npb25fY2xhc3Nfd3JpdGUsIDApCisJWkVO RF9BUkdfSU5GTygwLCBrZXkpCisJWkVORF9BUkdfSU5GTygwLCB2YWwpCitaRU5EX0VORF9BUkdf SU5GTygpCisKK1pFTkRfQkVHSU5fQVJHX0lORk8oYXJnaW5mb19zZXNzaW9uX2NsYXNzX2Rlc3Ry b3ksIDApCisJWkVORF9BUkdfSU5GTygwLCBrZXkpCitaRU5EX0VORF9BUkdfSU5GTygpCisKK1pF TkRfQkVHSU5fQVJHX0lORk8oYXJnaW5mb19zZXNzaW9uX2NsYXNzX2djLCAwKQorCVpFTkRfQVJH X0lORk8oMCwgbWF4bGlmZXRpbWUpCitaRU5EX0VORF9BUkdfSU5GTygpCiAvKiB9fX0gKi8KIAog Lyoge3t7IHNlc3Npb25fZnVuY3Rpb25zW10KQEAgLTE5MTEsNiArMTk5NywyMiBAQAogfTsKIC8q IH19fSAqLwogCisvKiBzZXNzaW9uIGNsYXNzICovCit6ZW5kX2NsYXNzX2VudHJ5ICpwaHBfc2Vz c2lvbl9jbGFzc19lbnRyeTsKKworLyoge3t7IHNlc3Npb24gY2xhc3MgZnVuY3Rpb25zW10KKyAq Lworc3RhdGljIGNvbnN0IHplbmRfZnVuY3Rpb25fZW50cnkgcGhwX3Nlc3Npb25fY2xhc3NfZnVu Y3Rpb25zW10gPSB7CisJUEhQX01FKFNlc3Npb25IYW5kbGVyLCBvcGVuLCBhcmdpbmZvX3Nlc3Np b25fY2xhc3Nfb3BlbiwgWkVORF9BQ0NfUFVCTElDIHwgWkVORF9BQ0NfU1RBVElDKQorCVBIUF9N RShTZXNzaW9uSGFuZGxlciwgY2xvc2UsIGFyZ2luZm9fc2Vzc2lvbl9jbGFzc19jbG9zZSwgWkVO RF9BQ0NfUFVCTElDIHwgWkVORF9BQ0NfU1RBVElDKQorCVBIUF9NRShTZXNzaW9uSGFuZGxlciwg cmVhZCwgYXJnaW5mb19zZXNzaW9uX2NsYXNzX3JlYWQsIFpFTkRfQUNDX1BVQkxJQyB8IFpFTkRf QUNDX1NUQVRJQykKKwlQSFBfTUUoU2Vzc2lvbkhhbmRsZXIsIHdyaXRlLCBhcmdpbmZvX3Nlc3Np b25fY2xhc3Nfd3JpdGUsIFpFTkRfQUNDX1BVQkxJQyB8IFpFTkRfQUNDX1NUQVRJQykKKwlQSFBf TUUoU2Vzc2lvbkhhbmRsZXIsIGRlc3Ryb3ksIGFyZ2luZm9fc2Vzc2lvbl9jbGFzc19kZXN0cm95 LCBaRU5EX0FDQ19QVUJMSUMgfCBaRU5EX0FDQ19TVEFUSUMpCisJUEhQX01FKFNlc3Npb25IYW5k bGVyLCBnYywgYXJnaW5mb19zZXNzaW9uX2NsYXNzX2djLCBaRU5EX0FDQ19QVUJMSUMgfCBaRU5E X0FDQ19TVEFUSUMpCisJeyBOVUxMLCBOVUxMLCBOVUxMIH0KK307CisvKiB9fX0gKi8KKwogLyog KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICogTW9kdWxlIFNldHVwIGFuZCBE ZXN0cnVjdGlvbiAqCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwpAQCAt MTk4NiwxNSArMjA4OCwxOSBAQAogCXBzX2dsb2JhbHMtPnNlcmlhbGl6ZXIgPSBOVUxMOwogCXBz X2dsb2JhbHMtPm1vZF9kYXRhID0gTlVMTDsKIAlwc19nbG9iYWxzLT5zZXNzaW9uX3N0YXR1cyA9 IHBocF9zZXNzaW9uX25vbmU7CisJcHNfZ2xvYmFscy0+bW9kX2FjdGl2ZSA9IDA7CiAJZm9yIChp ID0gMDsgaSA8IDY7IGkrKykgewogCQlwc19nbG9iYWxzLT5tb2RfdXNlcl9uYW1lcy5uYW1lc1tp XSA9IE5VTEw7CiAJfQorCiAJcHNfZ2xvYmFscy0+aHR0cF9zZXNzaW9uX3ZhcnMgPSBOVUxMOwog fQogLyogfX19ICovCiAKIHN0YXRpYyBQSFBfTUlOSVRfRlVOQ1RJT04oc2Vzc2lvbikgLyoge3t7 ICovCiB7CisJemVuZF9jbGFzc19lbnRyeSBjZTsKKwogCXplbmRfcmVnaXN0ZXJfYXV0b19nbG9i YWwoIl9TRVNTSU9OIiwgc2l6ZW9mKCJfU0VTU0lPTiIpLTEsIE5VTEwgVFNSTUxTX0NDKTsKIAog CVBTKG1vZHVsZV9udW1iZXIpID0gbW9kdWxlX251bWJlcjsgLyogaWYgd2UgcmVhbGx5IG5lZWQg dGhpcyB2YXIgd2UgbmVlZCB0byBpbml0IGl0IGluIHp0cyBtb2RlIGFzIHdlbGwhICovCkBAIC0y MDA3LDYgKzIxMTMsMTAgQEAKICNlbmRpZgogCXBocF9zZXNzaW9uX3JmYzE4Njdfb3JpZ19jYWxs YmFjayA9IHBocF9yZmMxODY3X2NhbGxiYWNrOwogCXBocF9yZmMxODY3X2NhbGxiYWNrID0gcGhw X3Nlc3Npb25fcmZjMTg2N19jYWxsYmFjazsKKworCUlOSVRfQ0xBU1NfRU5UUlkoY2UsIFBTX0NM QVNTX05BTUUsIHBocF9zZXNzaW9uX2NsYXNzX2Z1bmN0aW9ucyk7CisJcGhwX3Nlc3Npb25fY2xh c3NfZW50cnkgPSB6ZW5kX3JlZ2lzdGVyX2ludGVybmFsX2NsYXNzKCZjZSBUU1JNTFNfQ0MpOwor CiAJcmV0dXJuIFNVQ0NFU1M7CiB9CiAvKiB9fX0gKi8K --000e0cdf97b4d149b60478eec018--