Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 22 Jun 2017 22:24:03 +0000
From:      Rick Macklem <rmacklem@uoguelph.ca>
To:        "freebsd-fs@freebsd.org" <freebsd-fs@freebsd.org>
Subject:   patch that adds two additional NFSv4.1 compound RPCs to the client
Message-ID:  <YTXPR01MB018901BE4BA7E9780F4B430BDDDB0@YTXPR01MB0189.CANPRD01.PROD.OUTLOOK.COM>

next in thread | raw e-mail | index | archive | help
--_002_YTXPR01MB018901BE4BA7E9780F4B430BDDDB0YTXPR01MB0189CANP_
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

The attached patch (you can also find it in PR#219550), adds two new compou=
nd
RPCs to the NFSv4.1/pNFS client. These compounds combine the Open with the
LayoutGet, avoiding the need to do additional RPCs for pNFS.

The patch is fairly large, but only affects the NFSv4.1 client with the "pn=
fs" option.

It factors most of the LayoutGet RPC code into separate functions and then =
uses
those to do RPCs that follow an Open with a LayoutGet.
This code has been tested a fair amount by me using my pNFS server
(in projects/pnfs-planb-server).

Would anyone like to review this? rick=

--_002_YTXPR01MB018901BE4BA7E9780F4B430BDDDB0YTXPR01MB0189CANP_
Content-Type: application/octet-stream; name="openlayout.patch"
Content-Description: openlayout.patch
Content-Disposition: attachment; filename="openlayout.patch"; size=38817;
	creation-date="Thu, 22 Jun 2017 22:23:56 GMT";
	modification-date="Thu, 22 Jun 2017 22:23:56 GMT"
Content-Transfer-Encoding: base64

LS0tIHN5cy9mcy9uZnMvbmZzcG9ydC5oLm9yaWcJMjAxNy0wNC0yNyAxMTo1MTo1MS4wMDAwMDAw
MDAgLTA0MDAKKysrIHN5cy9mcy9uZnMvbmZzcG9ydC5oCTIwMTctMDUtMTkgMTM6MjI6NDUuNjA0
MjE5MDAwIC0wNDAwCkBAIC0zNTcsMTEgKzM1NywxMyBAQAogI2RlZmluZQlORlNQUk9DX1dSSVRF
RFMJCTUxCiAjZGVmaW5lCU5GU1BST0NfUkVBRERTCQk1MgogI2RlZmluZQlORlNQUk9DX0NPTU1J
VERTCTUzCisjZGVmaW5lCU5GU1BST0NfT1BFTkxBWUdFVAk1NAorI2RlZmluZQlORlNQUk9DX0NS
RUFURUxBWUdFVAk1NQogCiAvKgogICogTXVzdCBiZSBkZWZpbmVkIGFzIG9uZSBoaWdoZXIgdGhh
biB0aGUgbGFzdCBORlN2NC4xIFByb2MjIGFib3ZlLgogICovCi0jZGVmaW5lCU5GU1Y0MV9OUFJP
Q1MJCTU0CisjZGVmaW5lCU5GU1Y0MV9OUFJPQ1MJCTU2CiAKICNlbmRpZgkvKiBORlNfVjNOUFJP
Q1MgKi8KIApAQCAtMzkwLDcgKzM5Miw3IEBAIHN0cnVjdCBuZnNzdGF0c3YxIHsKIAl1aW50NjRf
dAlyZWFkbGlua19iaW9zOwogCXVpbnQ2NF90CWJpb2NhY2hlX3JlYWRkaXJzOwogCXVpbnQ2NF90
CXJlYWRkaXJfYmlvczsKLQl1aW50NjRfdAlycGNjbnRbTkZTVjQxX05QUk9DUyArIDE1XTsKKwl1
aW50NjRfdAlycGNjbnRbTkZTVjQxX05QUk9DUyArIDEzXTsKIAl1aW50NjRfdAlycGNyZXRyaWVz
OwogCXVpbnQ2NF90CXNydnJwY2NudFtORlNWNDJfTk9QUyArIE5GU1Y0T1BfRkFLRU5PUFNdOwog
CXVpbnQ2NF90CXNydnJwY19lcnJzOwotLS0gc3lzL2ZzL25mcy9uZnNwcm90by5oLm9yaWcJMjAx
Ny0wNS0xMSAxMTowODowMS42ODEyNTEwMDAgLTA0MDAKKysrIHN5cy9mcy9uZnMvbmZzcHJvdG8u
aAkyMDE3LTA1LTE5IDEzOjIzOjIxLjk5MTI5MDAwMCAtMDQwMApAQCAtMzQ2LDExICszNDYsMTMg
QEAKICNkZWZpbmUJTkZTUFJPQ19XUklURURTCQk1MQogI2RlZmluZQlORlNQUk9DX1JFQUREUwkJ
NTIKICNkZWZpbmUJTkZTUFJPQ19DT01NSVREUwk1MworI2RlZmluZQlORlNQUk9DX09QRU5MQVlH
RVQJNTQKKyNkZWZpbmUJTkZTUFJPQ19DUkVBVEVMQVlHRVQJNTUKIAogLyoKICAqIE11c3QgYmUg
ZGVmaW5lZCBhcyBvbmUgaGlnaGVyIHRoYW4gdGhlIGxhc3QgTkZTdjQuMSBQcm9jIyBhYm92ZS4K
ICAqLwotI2RlZmluZQlORlNWNDFfTlBST0NTCQk1NAorI2RlZmluZQlORlNWNDFfTlBST0NTCQk1
NgogCiAjZW5kaWYJLyogTkZTX1YzTlBST0NTICovCiAKLS0tIHN5cy9mcy9uZnMvbmZzX2NvbW1v
bnN1YnMuYy5vcmlnCTIwMTctMDUtMTYgMDk6Mzg6MjEuNzIzMTYzMDAwIC0wNDAwCisrKyBzeXMv
ZnMvbmZzL25mc19jb21tb25zdWJzLmMJMjAxNy0wNS0xOSAxMzoyMToyNy44Njc3NzgwMDAgLTA0
MDAKQEAgLTE3Nyw3ICsxNzcsNyBAQCBzdGF0aWMgc3RydWN0IG5mc3J2X2x1Z2hhc2gJKm5mc2dy
b3VwbmFtCiAgKi8KIGludCBuZnNfYmlncmVwbHlbTkZTVjQxX05QUk9DU10gPSB7IDAsIDAsIDAs
IDEsIDAsIDEsIDEsIDAsIDAsIDAsIDAsCiAgICAgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMCwgMCwg
MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAw
LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwIH07CisgICAg
MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwg
MCB9OwogCiAvKiBsb2NhbCBmdW5jdGlvbnMgKi8KIHN0YXRpYyBpbnQgbmZzcnZfc2tpcGFjZShz
dHJ1Y3QgbmZzcnZfZGVzY3JpcHQgKm5kLCBpbnQgKmFjZXNpemVwKTsKLS0tIHN5cy9mcy9uZnNj
bGllbnQvbmZzX2NsY29tc3Vicy5jLm9yaWcJMjAxNy0wNS0xNiAxMjozNjoxNi4wOTg4NzgwMDAg
LTA0MDAKKysrIHN5cy9mcy9uZnNjbGllbnQvbmZzX2NsY29tc3Vicy5jCTIwMTctMDUtMTkgMTM6
MjU6NTkuODIzMDkyMDAwIC0wNDAwCkBAIC0xMTIsNiArMTEyLDggQEAgc3RhdGljIHN0cnVjdCB7
CiAJeyBORlNWNE9QX1dSSVRFLCAxLCAiV3JpdGVEUyIsIDcsIH0sCiAJeyBORlNWNE9QX1JFQUQs
IDEsICJSZWFkRFMiLCA2LCB9LAogCXsgTkZTVjRPUF9DT01NSVQsIDEsICJDb21taXREUyIsIDgs
IH0sCisJeyBORlNWNE9QX09QRU4sIDMsICJPcGVuTGF5b3V0R2V0IiwgMTMsIH0sCisJeyBORlNW
NE9QX09QRU4sIDgsICJDcmVhdGVMYXlHZXQiLCAxMiwgfSwKIH07CiAKIC8qCkBAIC0xMjAsNyAr
MTIyLDcgQEAgc3RhdGljIHN0cnVjdCB7CiBzdGF0aWMgaW50IG5mc19iaWdyZXF1ZXN0W05GU1Y0
MV9OUFJPQ1NdID0gewogCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDEsIDAsIDAsIDAs
IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCiAJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwg
MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLQkwLCAwLCAwLCAwLCAwLCAw
LCAxLCAwLCAwCisJMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMAogfTsKIAogLyoKLS0t
IHN5cy9mcy9uZnNjbGllbnQvbmZzX2NscnBjb3BzLmMub3JpZwkyMDE3LTA1LTExIDEwOjUyOjQy
LjE2ODcxMTAwMCAtMDQwMAorKysgc3lzL2ZzL25mc2NsaWVudC9uZnNfY2xycGNvcHMuYwkyMDE3
LTA1LTE5IDEzOjI5OjA4LjQwOTA5ODAwMCAtMDQwMApAQCAtMTI3LDYgKzEyNywyOSBAQCBzdGF0
aWMgZW51bSBuZnNjbGRzX3N0YXRlIG5mc2NsX2dldHNhbWVzCiBzdGF0aWMgaW50IG5mc3JwY19j
b21taXRkcyh2bm9kZV90LCB1aW50NjRfdCwgaW50LCBzdHJ1Y3QgbmZzY2xkcyAqLAogICAgIHN0
cnVjdCBuZnNmaCAqLCBzdHJ1Y3QgdWNyZWQgKiwgTkZTUFJPQ19UICosIHZvaWQgKik7CiAjZW5k
aWYKK3N0YXRpYyB2b2lkIG5mc3J2X3NldHVwbGF5b3V0Z2V0KHN0cnVjdCBuZnNydl9kZXNjcmlw
dCAqLCBpbnQsIHVpbnQ2NF90LAorICAgIHVpbnQ2NF90LCB1aW50NjRfdCwgbmZzdjRzdGF0ZWlk
X3QgKiwgaW50LCBpbnQpOworc3RhdGljIGludCBuZnNydl9wYXJzZWxheW91dGdldChzdHJ1Y3Qg
bmZzcnZfZGVzY3JpcHQgKiwgbmZzdjRzdGF0ZWlkX3QgKiwKKyAgICBpbnQgKiwgc3RydWN0IG5m
c2NsZmxheW91dGhlYWQgKik7CitzdGF0aWMgaW50IG5mc3JwY19nZXRvcGVubGF5b3V0KHN0cnVj
dCBuZnNtb3VudCAqLCB2bm9kZV90LCB1X2ludDhfdCAqLAorICAgIGludCwgdWludDhfdCAqLCBp
bnQsIHVpbnQzMl90LCBzdHJ1Y3QgbmZzY2xvcGVuICosIHVpbnQ4X3QgKiwgaW50LAorICAgIHN0
cnVjdCBuZnNjbGRlbGVnICoqLCBzdHJ1Y3QgdWNyZWQgKiwgTkZTUFJPQ19UICopOworc3RhdGlj
IGludCBuZnNycGNfZ2V0Y3JlYXRlbGF5b3V0KHZub2RlX3QsIGNoYXIgKiwgaW50LCBzdHJ1Y3Qg
dmF0dHIgKiwKKyAgICBuZnNxdWFkX3QsIGludCwgc3RydWN0IG5mc2Nsb3duZXIgKiwgc3RydWN0
IG5mc2NsZGVsZWcgKiosCisgICAgc3RydWN0IHVjcmVkICosIE5GU1BST0NfVCAqLCBzdHJ1Y3Qg
bmZzdmF0dHIgKiwgc3RydWN0IG5mc3ZhdHRyICosCisgICAgc3RydWN0IG5mc2ZoICoqLCBpbnQg
KiwgaW50ICosIHZvaWQgKiwgaW50ICopOworc3RhdGljIGludCBuZnNycGNfb3BlbmxheW91dHJw
YyhzdHJ1Y3QgbmZzbW91bnQgKiwgdm5vZGVfdCwgdV9pbnQ4X3QgKiwKKyAgICBpbnQsIHVpbnQ4
X3QgKiwgaW50LCB1aW50MzJfdCwgc3RydWN0IG5mc2Nsb3BlbiAqLCB1aW50OF90ICosIGludCwK
KyAgICBzdHJ1Y3QgbmZzY2xkZWxlZyAqKiwgbmZzdjRzdGF0ZWlkX3QgKiwgaW50LCBpbnQsIGlu
dCAqLAorICAgIHN0cnVjdCBuZnNjbGZsYXlvdXRoZWFkICosIGludCAqLCBzdHJ1Y3QgdWNyZWQg
KiwgTkZTUFJPQ19UICopOworc3RhdGljIGludCBuZnNycGNfY3JlYXRlbGF5b3V0KHZub2RlX3Qs
IGNoYXIgKiwgaW50LCBzdHJ1Y3QgdmF0dHIgKiwKKyAgICBuZnNxdWFkX3QsIGludCwgc3RydWN0
IG5mc2Nsb3duZXIgKiwgc3RydWN0IG5mc2NsZGVsZWcgKiosCisgICAgc3RydWN0IHVjcmVkICos
IE5GU1BST0NfVCAqLCBzdHJ1Y3QgbmZzdmF0dHIgKiwgc3RydWN0IG5mc3ZhdHRyICosCisgICAg
c3RydWN0IG5mc2ZoICoqLCBpbnQgKiwgaW50ICosIHZvaWQgKiwgaW50ICosIG5mc3Y0c3RhdGVp
ZF90ICosCisgICAgaW50LCBpbnQsIGludCAqLCBzdHJ1Y3QgbmZzY2xmbGF5b3V0aGVhZCAqLCBp
bnQgKik7CitzdGF0aWMgaW50IG5mc3JwY19sYXlvdXRnZXRyZXMoc3RydWN0IG5mc21vdW50ICos
IHZub2RlX3QsIHVpbnQ4X3QgKiwKKyAgICBpbnQsIG5mc3Y0c3RhdGVpZF90ICosIGludCwgdWlu
dDMyX3QgKiwgc3RydWN0IG5mc2NsbGF5b3V0ICoqLAorICAgIHN0cnVjdCBuZnNjbGZsYXlvdXRo
ZWFkICosIGludCwgaW50ICosIHN0cnVjdCB1Y3JlZCAqLCBORlNQUk9DX1QgKik7CiAKIC8qCiAg
KiBuZnMgbnVsbCBjYWxsIGZyb20gdmZzLgpAQCAtMzAxLDExICszMjQsMjcgQEAgZWxzZSBwcmlu
dGYoIiBmaGw9MFxuIik7CiAJCWNsaWRyZXYgPSAwOwogCSAgICBpZiAocmV0ID09IE5GU0NMT1BF
Tl9ET09QRU4pIHsKIAkJaWYgKG5wLT5uX3Y0ICE9IE5VTEwpIHsKLQkJCWVycm9yID0gbmZzcnBj
X29wZW5ycGMobm1wLCB2cCwgbnAtPm5fdjQtPm40X2RhdGEsCi0JCQkgICBucC0+bl92NC0+bjRf
ZmhsZW4sIG5wLT5uX2ZocC0+bmZoX2ZoLAotCQkJICAgbnAtPm5fZmhwLT5uZmhfbGVuLCBtb2Rl
LCBvcCwKLQkJCSAgIE5GUzROT0RFTkFNRShucC0+bl92NCksIG5wLT5uX3Y0LT5uNF9uYW1lbGVu
LCAmZHAsCi0JCQkgICAwLCAweDAsIGNyZWQsIHAsIDAsIDApOworCQkJLyoKKwkJCSAqIEZvciB0
aGUgZmlyc3QgYXR0ZW1wdCwgdHJ5IGFuZCBnZXQgYSBsYXlvdXQsIGlmCisJCQkgKiBwTkZTIGlz
IGVuYWJsZWQgZm9yIHRoZSBtb3VudC4KKwkJCSAqLworCQkJaWYgKCFORlNIQVNQTkZTKG5tcCkg
fHwgbmZzY2xfZW5hYmxlY2FsbGIgPT0gMCB8fAorCQkJICAgIG5mc19udW1uZnNjYmQgPT0gMCB8
fAorCQkJICAgIChucC0+bl9mbGFnICYgTk5PTEFZT1VUKSAhPSAwIHx8IHJldHJ5Y250ID4gMCkK
KwkJCQllcnJvciA9IG5mc3JwY19vcGVucnBjKG5tcCwgdnAsCisJCQkJICAgIG5wLT5uX3Y0LT5u
NF9kYXRhLAorCQkJCSAgICBucC0+bl92NC0+bjRfZmhsZW4sIG5wLT5uX2ZocC0+bmZoX2ZoLAor
CQkJCSAgICBucC0+bl9maHAtPm5maF9sZW4sIG1vZGUsIG9wLAorCQkJCSAgICBORlM0Tk9ERU5B
TUUobnAtPm5fdjQpLAorCQkJCSAgICBucC0+bl92NC0+bjRfbmFtZWxlbiwKKwkJCQkgICAgJmRw
LCAwLCAweDAsIGNyZWQsIHAsIDAsIDApOworCQkJZWxzZQorCQkJCWVycm9yID0gbmZzcnBjX2dl
dG9wZW5sYXlvdXQobm1wLCB2cCwKKwkJCQkgICAgbnAtPm5fdjQtPm40X2RhdGEsCisJCQkJICAg
IG5wLT5uX3Y0LT5uNF9maGxlbiwgbnAtPm5fZmhwLT5uZmhfZmgsCisJCQkJICAgIG5wLT5uX2Zo
cC0+bmZoX2xlbiwgbW9kZSwgb3AsCisJCQkJICAgIE5GUzROT0RFTkFNRShucC0+bl92NCksCisJ
CQkJICAgIG5wLT5uX3Y0LT5uNF9uYW1lbGVuLCAmZHAsIGNyZWQsIHApOwogCQkJaWYgKGRwICE9
IE5VTEwpIHsKICNpZmRlZiBBUFBMRQogCQkJCU9TQml0QW5kQXRvbWljKChpbnQzMl90KX5OREVM
RUdNT0QsIChVSW50MzIgKikmbnAtPm5fZmxhZyk7CkBAIC0xODk0LDkgKzE5MzMsMTUgQEAgbmZz
cnBjX2NyZWF0ZSh2bm9kZV90IGR2cCwgY2hhciAqbmFtZSwgaQogCQkJY2xpZHJldiA9IG5tcC0+
bm1fY2xwLT5uZnNjX2NsaWVudGlkcmV2OwogCQllbHNlCiAJCQljbGlkcmV2ID0gMDsKLQkJZXJy
b3IgPSBuZnNycGNfY3JlYXRldjQoZHZwLCBuYW1lLCBuYW1lbGVuLCB2YXAsIGN2ZXJmLCBmbW9k
ZSwKLQkJICBvd3AsICZkcCwgY3JlZCwgcCwgZG5hcCwgbm5hcCwgbmZocHAsIGF0dHJmbGFncCwg
ZGF0dHJmbGFncCwKLQkJICBkc3R1ZmYsICZ1bmxvY2tlZCk7CisJCWlmICghTkZTSEFTUE5GUyhu
bXApIHx8IG5mc2NsX2VuYWJsZWNhbGxiID09IDAgfHwKKwkJICAgIG5mc19udW1uZnNjYmQgPT0g
MCB8fCByZXRyeWNudCA+IDApCisJCQllcnJvciA9IG5mc3JwY19jcmVhdGV2NChkdnAsIG5hbWUs
IG5hbWVsZW4sIHZhcCwgY3ZlcmYsCisJCQkgIGZtb2RlLCBvd3AsICZkcCwgY3JlZCwgcCwgZG5h
cCwgbm5hcCwgbmZocHAsCisJCQkgIGF0dHJmbGFncCwgZGF0dHJmbGFncCwgZHN0dWZmLCAmdW5s
b2NrZWQpOworCQllbHNlCisJCQllcnJvciA9IG5mc3JwY19nZXRjcmVhdGVsYXlvdXQoZHZwLCBu
YW1lLCBuYW1lbGVuLCB2YXAsCisJCQkgIGN2ZXJmLCBmbW9kZSwgb3dwLCAmZHAsIGNyZWQsIHAs
IGRuYXAsIG5uYXAsIG5maHBwLAorCQkJICBhdHRyZmxhZ3AsIGRhdHRyZmxhZ3AsIGRzdHVmZiwg
JnVubG9ja2VkKTsKIAkJLyoKIAkJICogVGhlcmUgaXMgbm8gbmVlZCB0byBpbnZhbGlkYXRlIGNh
Y2hlZCBhdHRyaWJ1dGVzIGhlcmUsCiAJCSAqIHNpbmNlIG5ldyBwb3N0LWRlbGVnYXRpb24gaXNz
dWUgYXR0cmlidXRlcyBhcmUgYWx3YXlzCkBAIC00NzY2LDE0OSArNDgxMSwyMiBAQCBuZnNycGNf
bGF5b3V0Z2V0KHN0cnVjdCBuZnNtb3VudCAqbm1wLCB1CiAgICAgbmZzdjRzdGF0ZWlkX3QgKnN0
YXRlaWRwLCBpbnQgKnJldG9uY2xvc2VwLCBzdHJ1Y3QgbmZzY2xmbGF5b3V0aGVhZCAqZmxocCwK
ICAgICBzdHJ1Y3QgdWNyZWQgKmNyZWQsIE5GU1BST0NfVCAqcCwgdm9pZCAqc3R1ZmYpCiB7Ci0J
dWludDMyX3QgKnRsOwogCXN0cnVjdCBuZnNydl9kZXNjcmlwdCBuZnNkLCAqbmQgPSAmbmZzZDsK
LQlzdHJ1Y3QgbmZzZmggKm5maHA7Ci0Jc3RydWN0IG5mc2NsZmxheW91dCAqZmxwLCAqcHJldmZs
cCwgKnRmbHA7Ci0JaW50IGNudCwgZXJyb3IsIGdvdGlvbW9kZSwgZmhjbnQsIG5maGxlbiwgaSwg
ajsKLQl1aW50OF90ICpjcDsKLQl1aW50NjRfdCByZXRsZW47CisJaW50IGVycm9yOwogCi0JZmxw
ID0gTlVMTDsKLQlnb3Rpb21vZGUgPSAtMTsKIAluZnNjbF9yZXFzdGFydChuZCwgTkZTUFJPQ19M
QVlPVVRHRVQsIG5tcCwgZmhwLCBmaGxlbiwgTlVMTCwgTlVMTCk7Ci0JTkZTTV9CVUlMRCh0bCwg
dWludDMyX3QgKiwgNCAqIE5GU1hfVU5TSUdORUQgKyAzICogTkZTWF9IWVBFUiArCi0JICAgIE5G
U1hfU1RBVEVJRCk7Ci0JKnRsKysgPSBuZXduZnNfZmFsc2U7CQkvKiBEb24ndCBzaWduYWwgYXZh
aWxhYmlsaXR5LiAqLwotCSp0bCsrID0gdHhkcl91bnNpZ25lZChORlNMQVlPVVRfTkZTVjRfMV9G
SUxFUyk7Ci0JKnRsKysgPSB0eGRyX3Vuc2lnbmVkKGlvbW9kZSk7Ci0JdHhkcl9oeXBlcihvZmZz
ZXQsIHRsKTsKLQl0bCArPSAyOwotCXR4ZHJfaHlwZXIobGVuLCB0bCk7Ci0JdGwgKz0gMjsKLQl0
eGRyX2h5cGVyKG1pbmxlbiwgdGwpOwotCXRsICs9IDI7Ci0JKnRsKysgPSB0eGRyX3Vuc2lnbmVk
KHN0YXRlaWRwLT5zZXFpZCk7Ci0JTkZTQ0xfREVCVUcoNCwgImxheWdldCBzZXE9JWRcbiIsIChp
bnQpc3RhdGVpZHAtPnNlcWlkKTsKLQkqdGwrKyA9IHN0YXRlaWRwLT5vdGhlclswXTsKLQkqdGwr
KyA9IHN0YXRlaWRwLT5vdGhlclsxXTsKLQkqdGwrKyA9IHN0YXRlaWRwLT5vdGhlclsyXTsKLQkq
dGwgPSB0eGRyX3Vuc2lnbmVkKGxheW91dGxlbik7CisJbmZzcnZfc2V0dXBsYXlvdXRnZXQobmQs
IGlvbW9kZSwgb2Zmc2V0LCBsZW4sIG1pbmxlbiwgc3RhdGVpZHAsCisJICAgIGxheW91dGxlbiwg
MCk7CiAJbmQtPm5kX2ZsYWcgfD0gTkRfVVNFR1NTTkFNRTsKIAllcnJvciA9IG5ld25mc19yZXF1
ZXN0KG5kLCBubXAsIE5VTEwsICZubXAtPm5tX3NvY2tyZXEsIE5VTEwsIHAsIGNyZWQsCiAJICAg
IE5GU19QUk9HLCBORlNfVkVSNCwgTlVMTCwgMSwgTlVMTCwgTlVMTCk7CisJTkZTQ0xfREVCVUco
NCwgImxheWdldCBlcnI9JWQgc3Q9JWRcbiIsIGVycm9yLCBuZC0+bmRfcmVwc3RhdCk7CiAJaWYg
KGVycm9yICE9IDApCiAJCXJldHVybiAoZXJyb3IpOwotCWlmIChuZC0+bmRfcmVwc3RhdCA9PSAw
KSB7Ci0JCU5GU01fRElTU0VDVCh0bCwgdWludDMyX3QgKiwgMiAqIE5GU1hfVU5TSUdORUQgKyBO
RlNYX1NUQVRFSUQpOwotCQlpZiAoKnRsKysgIT0gMCkKLQkJCSpyZXRvbmNsb3NlcCA9IDE7Ci0J
CWVsc2UKLQkJCSpyZXRvbmNsb3NlcCA9IDA7Ci0JCXN0YXRlaWRwLT5zZXFpZCA9IGZ4ZHJfdW5z
aWduZWQodWludDMyX3QsICp0bCsrKTsKLQkJTkZTQ0xfREVCVUcoNCwgInJldG9uY2xzPSVkIHN0
c2VxPSVkXG4iLCAqcmV0b25jbG9zZXAsCi0JCSAgICAoaW50KXN0YXRlaWRwLT5zZXFpZCk7Ci0J
CXN0YXRlaWRwLT5vdGhlclswXSA9ICp0bCsrOwotCQlzdGF0ZWlkcC0+b3RoZXJbMV0gPSAqdGwr
KzsKLQkJc3RhdGVpZHAtPm90aGVyWzJdID0gKnRsKys7Ci0JCWNudCA9IGZ4ZHJfdW5zaWduZWQo
aW50LCAqdGwpOwotCQlORlNDTF9ERUJVRyg0LCAibGF5ZyBjbnQ9JWRcbiIsIGNudCk7Ci0JCWlm
IChjbnQgPD0gMCB8fCBjbnQgPiAxMDAwMCkgewotCQkJLyogRG9uJ3QgYWNjZXB0IG1vcmUgdGhh
biAxMDAwMCBsYXlvdXRzIGluIHJlcGx5LiAqLwotCQkJZXJyb3IgPSBORlNFUlJfQkFEWERSOwot
CQkJZ290byBuZnNtb3V0OwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgewotCQkJ
LyogRGlzc2VjdCBhbGwgdGhlIHdheSB0byB0aGUgZmlsZSBoYW5kbGUgY250LiAqLwotCQkJTkZT
TV9ESVNTRUNUKHRsLCB1aW50MzJfdCAqLCAzICogTkZTWF9IWVBFUiArCi0JCQkgICAgNiAqIE5G
U1hfVU5TSUdORUQgKyBORlNYX1Y0REVWSUNFSUQpOwotCQkJZmhjbnQgPSBmeGRyX3Vuc2lnbmVk
KGludCwgKih0bCArIDExICsKLQkJCSAgICBORlNYX1Y0REVWSUNFSUQgLyBORlNYX1VOU0lHTkVE
KSk7Ci0JCQlORlNDTF9ERUJVRyg0LCAiZmhjbnQ9JWRcbiIsIGZoY250KTsKLQkJCWlmIChmaGNu
dCA8IDAgfHwgZmhjbnQgPiAxMDApIHsKLQkJCQkvKiBEb24ndCBhY2NlcHQgbW9yZSB0aGFuIDEw
MCBmaWxlIGhhbmRsZXMuICovCi0JCQkJZXJyb3IgPSBORlNFUlJfQkFEWERSOwotCQkJCWdvdG8g
bmZzbW91dDsKLQkJCX0KLQkJCWlmIChmaGNudCA+IDEpCi0JCQkJZmxwID0gbWFsbG9jKHNpemVv
ZigqZmxwKSArIChmaGNudCAtIDEpICoKLQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBuZnNmaCAqKSwK
LQkJCQkgICAgTV9ORlNGTEFZT1VULCBNX1dBSVRPSyk7Ci0JCQllbHNlCi0JCQkJZmxwID0gbWFs
bG9jKHNpemVvZigqZmxwKSwKLQkJCQkgICAgTV9ORlNGTEFZT1VULCBNX1dBSVRPSyk7Ci0JCQlm
bHAtPm5mc2ZsX2ZsYWdzID0gMDsKLQkJCWZscC0+bmZzZmxfZmhjbnQgPSAwOwotCQkJZmxwLT5u
ZnNmbF9kZXZwID0gTlVMTDsKLQkJCWZscC0+bmZzZmxfb2ZmID0gZnhkcl9oeXBlcih0bCk7IHRs
ICs9IDI7Ci0JCQlyZXRsZW4gPSBmeGRyX2h5cGVyKHRsKTsgdGwgKz0gMjsKLQkJCWlmIChmbHAt
Pm5mc2ZsX29mZiArIHJldGxlbiA8IGZscC0+bmZzZmxfb2ZmKQotCQkJCWZscC0+bmZzZmxfZW5k
ID0gVUlOVDY0X01BWCAtIGZscC0+bmZzZmxfb2ZmOwotCQkJZWxzZQotCQkJCWZscC0+bmZzZmxf
ZW5kID0gZmxwLT5uZnNmbF9vZmYgKyByZXRsZW47Ci0JCQlmbHAtPm5mc2ZsX2lvbW9kZSA9IGZ4
ZHJfdW5zaWduZWQoaW50LCAqdGwrKyk7Ci0JCQlpZiAoZ290aW9tb2RlID09IC0xKQotCQkJCWdv
dGlvbW9kZSA9IGZscC0+bmZzZmxfaW9tb2RlOwotCQkJTkZTQ0xfREVCVUcoNCwgImxheWcgcmVx
aW9tPSVkIHJldGlvbT0lZFxuIiwgaW9tb2RlLAotCQkJICAgIChpbnQpZmxwLT5uZnNmbF9pb21v
ZGUpOwotCQkJaWYgKGZ4ZHJfdW5zaWduZWQoaW50LCAqdGwrKykgIT0KLQkJCSAgICBORlNMQVlP
VVRfTkZTVjRfMV9GSUxFUykgewotCQkJCXByaW50ZigiTkZTdjQuMTogZ290IG5vbi1maWxlcyBs
YXlvdXRcbiIpOwotCQkJCWVycm9yID0gTkZTRVJSX0JBRFhEUjsKLQkJCQlnb3RvIG5mc21vdXQ7
Ci0JCQl9Ci0JCQlORlNCQ09QWSgrK3RsLCBmbHAtPm5mc2ZsX2RldiwgTkZTWF9WNERFVklDRUlE
KTsKLQkJCXRsICs9IChORlNYX1Y0REVWSUNFSUQgLyBORlNYX1VOU0lHTkVEKTsKLQkJCWZscC0+
bmZzZmxfdXRpbCA9IGZ4ZHJfdW5zaWduZWQodWludDMyX3QsICp0bCsrKTsKLQkJCU5GU0NMX0RF
QlVHKDQsICJmbHV0aWw9MHgleFxuIiwgZmxwLT5uZnNmbF91dGlsKTsKLQkJCWZscC0+bmZzZmxf
c3RyaXBlMSA9IGZ4ZHJfdW5zaWduZWQodWludDMyX3QsICp0bCsrKTsKLQkJCWZscC0+bmZzZmxf
cGF0b2ZmID0gZnhkcl9oeXBlcih0bCk7IHRsICs9IDI7Ci0JCQlpZiAoZnhkcl91bnNpZ25lZChp
bnQsICp0bCkgIT0gZmhjbnQpIHsKLQkJCQlwcmludGYoIkVFSyEgYmFkIGZoY250XG4iKTsKLQkJ
CQllcnJvciA9IE5GU0VSUl9CQURYRFI7Ci0JCQkJZ290byBuZnNtb3V0OwotCQkJfQotCQkJZm9y
IChqID0gMDsgaiA8IGZoY250OyBqKyspIHsKLQkJCQlORlNNX0RJU1NFQ1QodGwsIHVpbnQzMl90
ICosIE5GU1hfVU5TSUdORUQpOwotCQkJCW5maGxlbiA9IGZ4ZHJfdW5zaWduZWQoaW50LCAqdGwp
OwotCQkJCWlmIChuZmhsZW4gPD0gMCB8fCBuZmhsZW4gPiBORlNYX1Y0RkhNQVgpIHsKLQkJCQkJ
ZXJyb3IgPSBORlNFUlJfQkFEWERSOwotCQkJCQlnb3RvIG5mc21vdXQ7Ci0JCQkJfQotCQkJCW5m
aHAgPSBtYWxsb2Moc2l6ZW9mKCpuZmhwKSArIG5maGxlbiAtIDEsCi0JCQkJICAgIE1fTkZTRkgs
IE1fV0FJVE9LKTsKLQkJCQlmbHAtPm5mc2ZsX2ZoW2pdID0gbmZocDsKLQkJCQlmbHAtPm5mc2Zs
X2ZoY250Kys7Ci0JCQkJbmZocC0+bmZoX2xlbiA9IG5maGxlbjsKLQkJCQlORlNNX0RJU1NFQ1Qo
Y3AsIHVpbnQ4X3QgKiwgTkZTTV9STkRVUChuZmhsZW4pKTsKLQkJCQlORlNCQ09QWShjcCwgbmZo
cC0+bmZoX2ZoLCBuZmhsZW4pOwotCQkJfQotCQkJaWYgKGZscC0+bmZzZmxfaW9tb2RlID09IGdv
dGlvbW9kZSkgewotCQkJCS8qIEtlZXAgdGhlIGxpc3QgaW4gaW5jcmVhc2luZyBvZmZzZXQgb3Jk
ZXIuICovCi0JCQkJdGZscCA9IExJU1RfRklSU1QoZmxocCk7Ci0JCQkJcHJldmZscCA9IE5VTEw7
Ci0JCQkJd2hpbGUgKHRmbHAgIT0gTlVMTCAmJgotCQkJCSAgICB0ZmxwLT5uZnNmbF9vZmYgPCBm
bHAtPm5mc2ZsX29mZikgewotCQkJCQlwcmV2ZmxwID0gdGZscDsKLQkJCQkJdGZscCA9IExJU1Rf
TkVYVCh0ZmxwLCBuZnNmbF9saXN0KTsKLQkJCQl9Ci0JCQkJaWYgKHByZXZmbHAgPT0gTlVMTCkK
LQkJCQkJTElTVF9JTlNFUlRfSEVBRChmbGhwLCBmbHAsIG5mc2ZsX2xpc3QpOwotCQkJCWVsc2UK
LQkJCQkJTElTVF9JTlNFUlRfQUZURVIocHJldmZscCwgZmxwLAotCQkJCQkgICAgbmZzZmxfbGlz
dCk7Ci0JCQl9IGVsc2UgewotCQkJCXByaW50ZigibmZzY2xfbGF5b3V0Z2V0KCk6IGdvdCB3cm9u
ZyBpb21vZGVcbiIpOwotCQkJCW5mc2NsX2ZyZWVmbGF5b3V0KGZscCk7Ci0JCQl9Ci0JCQlmbHAg
PSBOVUxMOwotCQl9Ci0JfQotCWlmIChuZC0+bmRfcmVwc3RhdCAhPSAwICYmIGVycm9yID09IDAp
CisJaWYgKG5kLT5uZF9yZXBzdGF0ID09IDApCisJCWVycm9yID0gbmZzcnZfcGFyc2VsYXlvdXRn
ZXQobmQsIHN0YXRlaWRwLCByZXRvbmNsb3NlcCwgZmxocCk7CisJaWYgKGVycm9yID09IDAgJiYg
bmQtPm5kX3JlcHN0YXQgIT0gMCkKIAkJZXJyb3IgPSBuZC0+bmRfcmVwc3RhdDsKLW5mc21vdXQ6
Ci0JaWYgKGVycm9yICE9IDAgJiYgZmxwICE9IE5VTEwpCi0JCW5mc2NsX2ZyZWVmbGF5b3V0KGZs
cCk7CiAJbWJ1Zl9mcmVlbShuZC0+bmRfbXJlcCk7CiAJcmV0dXJuIChlcnJvcik7CiB9CkBAIC01
MjA5LDggKzUxMjcsNyBAQCBuZnNycGNfZ2V0bGF5b3V0KHN0cnVjdCBuZnNtb3VudCAqbm1wLCB2
CiAgICAgc3RydWN0IG5mc2NsbGF5b3V0ICoqbHlwcCwgc3RydWN0IHVjcmVkICpjcmVkLCBORlNQ
Uk9DX1QgKnApCiB7CiAJc3RydWN0IG5mc2NsbGF5b3V0ICpseXA7Ci0Jc3RydWN0IG5mc2NsZmxh
eW91dCAqZmxwLCAqdGZscDsKLQlzdHJ1Y3QgbmZzY2xkZXZpbmZvICpkaXA7CisJc3RydWN0IG5m
c2NsZmxheW91dCAqZmxwOwogCXN0cnVjdCBuZnNjbGZsYXlvdXRoZWFkIGZsaDsKIAlpbnQgZXJy
b3IgPSAwLCBpc2xvY2tlZCwgbGF5b3V0bGVuLCByZWNhbGxlZCwgcmV0b25jbG9zZTsKIAluZnN2
NHN0YXRlaWRfdCBzdGF0ZWlkOwpAQCAtNTI1MiwzNSArNTE2OSwxMyBAQCBuZnNycGNfZ2V0bGF5
b3V0KHN0cnVjdCBuZnNtb3VudCAqbm1wLCB2CiAJCQkgICAgKHVpbnQ2NF90KTAsIGxheW91dGxl
biwgJnN0YXRlaWQsICZyZXRvbmNsb3NlLAogCQkJICAgICZmbGgsIGNyZWQsIHAsIE5VTEwpOwog
CQl9CisJCWVycm9yID0gbmZzcnBjX2xheW91dGdldHJlcyhubXAsIHZwLCBuZmhwLT5uZmhfZmgs
CisJCSAgICBuZmhwLT5uZmhfbGVuLCAmc3RhdGVpZCwgcmV0b25jbG9zZSwgbm90aWZ5Yml0c3As
ICZseXAsCisJCSAgICAmZmxoLCBlcnJvciwgTlVMTCwgY3JlZCwgcCk7CiAJCWlmIChlcnJvciA9
PSAwKQotCQkJTElTVF9GT1JFQUNIKHRmbHAsICZmbGgsIG5mc2ZsX2xpc3QpIHsKLQkJCQllcnJv
ciA9IG5mc2NsX2FkZGRldmluZm8obm1wLCBOVUxMLCB0ZmxwKTsKLQkJCQlpZiAoZXJyb3IgIT0g
MCkgewotCQkJCQllcnJvciA9IG5mc3JwY19nZXRkZXZpY2VpbmZvKG5tcCwKLQkJCQkJICAgIHRm
bHAtPm5mc2ZsX2RldiwKLQkJCQkJICAgIE5GU0xBWU9VVF9ORlNWNF8xX0ZJTEVTLAotCQkJCQkg
ICAgbm90aWZ5Yml0c3AsICZkaXAsIGNyZWQsIHApOwotCQkJCQlpZiAoZXJyb3IgIT0gMCkKLQkJ
CQkJCWJyZWFrOwotCQkJCQllcnJvciA9IG5mc2NsX2FkZGRldmluZm8obm1wLCBkaXAsCi0JCQkJ
CSAgICB0ZmxwKTsKLQkJCQkJaWYgKGVycm9yICE9IDApCi0JCQkJCQlwcmludGYoCi0JCQkJCQkg
ICAgImdldGxheW91dDogY2Fubm90IGFkZFxuIik7Ci0JCQkJfQotCQkJfQotCQlpZiAoZXJyb3Ig
PT0gMCkgewotCQkJLyoKLQkJCSAqIG5mc2NsX2xheW91dCgpIGFsd2F5cyByZXR1cm5zIHdpdGgg
dGhlIG5mc2x5X2xvY2sKLQkJCSAqIHNldCB0byBhIHJlZmNudCAoc2hhcmVkIGxvY2spLgotCQkJ
ICovCi0JCQllcnJvciA9IG5mc2NsX2xheW91dChubXAsIHZwLCBuZmhwLT5uZmhfZmgsCi0JCQkg
ICAgbmZocC0+bmZoX2xlbiwgJnN0YXRlaWQsIHJldG9uY2xvc2UsICZmbGgsICZseXAsCi0JCQkg
ICAgY3JlZCwgcCk7Ci0JCQlpZiAoZXJyb3IgPT0gMCkKLQkJCQkqbHlwcCA9IGx5cDsKLQkJfSBl
bHNlIGlmIChpc2xvY2tlZCAhPSAwKQotCQkJbmZzdjRfdW5sb2NrKCZseXAtPm5mc2x5X2xvY2ss
IDApOworCQkJKmx5cHAgPSBseXA7CisJCWVsc2UgaWYgKGlzbG9ja2VkICE9IDApCisJCQluZnNj
bF9yZWxsYXlvdXQobHlwLCAxKTsKIAl9IGVsc2UKIAkJKmx5cHAgPSBseXA7CiAJcmV0dXJuIChl
cnJvcik7CkBAIC02MDAzLDMgKzU4OTgsNzU1IEBAIG5mc21vdXQ6CiB9CiAjZW5kaWYKIAorLyoK
KyAqIFNldCB1cCB0aGUgWERSIGFyZ3VtZW50cyBmb3IgdGhlIExheW91dEdldCBvcGVyYXRpb24u
CisgKi8KK3N0YXRpYyB2b2lkCituZnNydl9zZXR1cGxheW91dGdldChzdHJ1Y3QgbmZzcnZfZGVz
Y3JpcHQgKm5kLCBpbnQgaW9tb2RlLCB1aW50NjRfdCBvZmZzZXQsCisgICAgdWludDY0X3QgbGVu
LCB1aW50NjRfdCBtaW5sZW4sIG5mc3Y0c3RhdGVpZF90ICpzdGF0ZWlkcCwgaW50IGxheW91dGxl
biwKKyAgICBpbnQgdXNlY3Vyc3RhdGVpZCkKK3sKKwl1aW50MzJfdCAqdGw7CisKKwlORlNNX0JV
SUxEKHRsLCB1aW50MzJfdCAqLCA0ICogTkZTWF9VTlNJR05FRCArIDMgKiBORlNYX0hZUEVSICsK
KwkgICAgTkZTWF9TVEFURUlEKTsKKwkqdGwrKyA9IG5ld25mc19mYWxzZTsJCS8qIERvbid0IHNp
Z25hbCBhdmFpbGFiaWxpdHkuICovCisJKnRsKysgPSB0eGRyX3Vuc2lnbmVkKE5GU0xBWU9VVF9O
RlNWNF8xX0ZJTEVTKTsKKwkqdGwrKyA9IHR4ZHJfdW5zaWduZWQoaW9tb2RlKTsKKwl0eGRyX2h5
cGVyKG9mZnNldCwgdGwpOworCXRsICs9IDI7CisJdHhkcl9oeXBlcihsZW4sIHRsKTsKKwl0bCAr
PSAyOworCXR4ZHJfaHlwZXIobWlubGVuLCB0bCk7CisJdGwgKz0gMjsKKwlpZiAodXNlY3Vyc3Rh
dGVpZCAhPSAwKSB7CisJCS8qIFNwZWNpYWwgc3RhdGVpZCBmb3IgQ3VycmVudCBzdGF0ZWlkLiAq
LworCQkqdGwrKyA9IHR4ZHJfdW5zaWduZWQoMSk7CisJCSp0bCsrID0gMDsKKwkJKnRsKysgPSAw
OworCQkqdGwrKyA9IDA7CisJfSBlbHNlIHsKKwkJKnRsKysgPSB0eGRyX3Vuc2lnbmVkKHN0YXRl
aWRwLT5zZXFpZCk7CisJCU5GU0NMX0RFQlVHKDQsICJsYXlnZXQgc2VxPSVkXG4iLCAoaW50KXN0
YXRlaWRwLT5zZXFpZCk7CisJCSp0bCsrID0gc3RhdGVpZHAtPm90aGVyWzBdOworCQkqdGwrKyA9
IHN0YXRlaWRwLT5vdGhlclsxXTsKKwkJKnRsKysgPSBzdGF0ZWlkcC0+b3RoZXJbMl07CisJfQor
CSp0bCA9IHR4ZHJfdW5zaWduZWQobGF5b3V0bGVuKTsKK30KKworLyoKKyAqIFBhcnNlIHRoZSBy
ZXBseSBmb3IgYSBzdWNjZXNzZnVsIExheW91dEdldCBvcGVyYXRpb24uCisgKi8KK3N0YXRpYyBp
bnQKK25mc3J2X3BhcnNlbGF5b3V0Z2V0KHN0cnVjdCBuZnNydl9kZXNjcmlwdCAqbmQsIG5mc3Y0
c3RhdGVpZF90ICpzdGF0ZWlkcCwKKyAgICBpbnQgKnJldG9uY2xvc2VwLCBzdHJ1Y3QgbmZzY2xm
bGF5b3V0aGVhZCAqZmxocCkKK3sKKwl1aW50MzJfdCAqdGw7CisJc3RydWN0IG5mc2NsZmxheW91
dCAqZmxwLCAqcHJldmZscCwgKnRmbHA7CisJaW50IGNudCwgZXJyb3IsIGdvdGlvbW9kZSwgZmhj
bnQsIG5maGxlbiwgaSwgajsKKwl1aW50NjRfdCByZXRsZW47CisJc3RydWN0IG5mc2ZoICpuZmhw
OworCXVpbnQ4X3QgKmNwOworCisJZXJyb3IgPSAwOworCWZscCA9IE5VTEw7CisJZ290aW9tb2Rl
ID0gLTE7CisJTkZTTV9ESVNTRUNUKHRsLCB1aW50MzJfdCAqLCAyICogTkZTWF9VTlNJR05FRCAr
IE5GU1hfU1RBVEVJRCk7CisJaWYgKCp0bCsrICE9IDApCisJCSpyZXRvbmNsb3NlcCA9IDE7CisJ
ZWxzZQorCQkqcmV0b25jbG9zZXAgPSAwOworCXN0YXRlaWRwLT5zZXFpZCA9IGZ4ZHJfdW5zaWdu
ZWQodWludDMyX3QsICp0bCsrKTsKKwlORlNDTF9ERUJVRyg0LCAicmV0b25jbHM9JWQgc3RzZXE9
JWRcbiIsICpyZXRvbmNsb3NlcCwKKwkgICAgKGludClzdGF0ZWlkcC0+c2VxaWQpOworCXN0YXRl
aWRwLT5vdGhlclswXSA9ICp0bCsrOworCXN0YXRlaWRwLT5vdGhlclsxXSA9ICp0bCsrOworCXN0
YXRlaWRwLT5vdGhlclsyXSA9ICp0bCsrOworCWNudCA9IGZ4ZHJfdW5zaWduZWQoaW50LCAqdGwp
OworCU5GU0NMX0RFQlVHKDQsICJsYXlnIGNudD0lZFxuIiwgY250KTsKKwlpZiAoY250IDw9IDAg
fHwgY250ID4gMTAwMDApIHsKKwkJLyogRG9uJ3QgYWNjZXB0IG1vcmUgdGhhbiAxMDAwMCBsYXlv
dXRzIGluIHJlcGx5LiAqLworCQllcnJvciA9IE5GU0VSUl9CQURYRFI7CisJCWdvdG8gbmZzbW91
dDsKKwl9CisJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisJCS8qIERpc3NlY3QgYWxsIHRo
ZSB3YXkgdG8gdGhlIGZpbGUgaGFuZGxlIGNudC4gKi8KKwkJTkZTTV9ESVNTRUNUKHRsLCB1aW50
MzJfdCAqLCAzICogTkZTWF9IWVBFUiArCisJCSAgICA2ICogTkZTWF9VTlNJR05FRCArIE5GU1hf
VjRERVZJQ0VJRCk7CisJCWZoY250ID0gZnhkcl91bnNpZ25lZChpbnQsICoodGwgKyAxMSArCisJ
CSAgICBORlNYX1Y0REVWSUNFSUQgLyBORlNYX1VOU0lHTkVEKSk7CisJCU5GU0NMX0RFQlVHKDQs
ICJmaGNudD0lZFxuIiwgZmhjbnQpOworCQlpZiAoZmhjbnQgPCAwIHx8IGZoY250ID4gMTAwKSB7
CisJCQkvKiBEb24ndCBhY2NlcHQgbW9yZSB0aGFuIDEwMCBmaWxlIGhhbmRsZXMuICovCisJCQll
cnJvciA9IE5GU0VSUl9CQURYRFI7CisJCQlnb3RvIG5mc21vdXQ7CisJCX0KKwkJaWYgKGZoY250
ID4gMSkKKwkJCWZscCA9IG1hbGxvYyhzaXplb2YoKmZscCkgKyAoZmhjbnQgLSAxKSAqCisJCQkg
ICAgc2l6ZW9mKHN0cnVjdCBuZnNmaCAqKSwgTV9ORlNGTEFZT1VULCBNX1dBSVRPSyk7CisJCWVs
c2UKKwkJCWZscCA9IG1hbGxvYyhzaXplb2YoKmZscCksIE1fTkZTRkxBWU9VVCwgTV9XQUlUT0sp
OworCQlmbHAtPm5mc2ZsX2ZsYWdzID0gMDsKKwkJZmxwLT5uZnNmbF9maGNudCA9IDA7CisJCWZs
cC0+bmZzZmxfZGV2cCA9IE5VTEw7CisJCWZscC0+bmZzZmxfb2ZmID0gZnhkcl9oeXBlcih0bCk7
IHRsICs9IDI7CisJCXJldGxlbiA9IGZ4ZHJfaHlwZXIodGwpOyB0bCArPSAyOworCQlpZiAoZmxw
LT5uZnNmbF9vZmYgKyByZXRsZW4gPCBmbHAtPm5mc2ZsX29mZikKKwkJCWZscC0+bmZzZmxfZW5k
ID0gVUlOVDY0X01BWCAtIGZscC0+bmZzZmxfb2ZmOworCQllbHNlCisJCQlmbHAtPm5mc2ZsX2Vu
ZCA9IGZscC0+bmZzZmxfb2ZmICsgcmV0bGVuOworCQlmbHAtPm5mc2ZsX2lvbW9kZSA9IGZ4ZHJf
dW5zaWduZWQoaW50LCAqdGwrKyk7CisJCWlmIChnb3Rpb21vZGUgPT0gLTEpCisJCQlnb3Rpb21v
ZGUgPSBmbHAtPm5mc2ZsX2lvbW9kZTsKKwkJaWYgKGZ4ZHJfdW5zaWduZWQoaW50LCAqdGwrKykg
IT0gTkZTTEFZT1VUX05GU1Y0XzFfRklMRVMpIHsKKwkJCXByaW50ZigiTkZTdjQuMTogZ290IG5v
bi1maWxlcyBsYXlvdXRcbiIpOworCQkJZXJyb3IgPSBORlNFUlJfQkFEWERSOworCQkJZ290byBu
ZnNtb3V0OworCQl9CisJCU5GU0JDT1BZKCsrdGwsIGZscC0+bmZzZmxfZGV2LCBORlNYX1Y0REVW
SUNFSUQpOworCQl0bCArPSAoTkZTWF9WNERFVklDRUlEIC8gTkZTWF9VTlNJR05FRCk7CisJCWZs
cC0+bmZzZmxfdXRpbCA9IGZ4ZHJfdW5zaWduZWQodWludDMyX3QsICp0bCsrKTsKKwkJTkZTQ0xf
REVCVUcoNCwgImZsdXRpbD0weCV4XG4iLCBmbHAtPm5mc2ZsX3V0aWwpOworCQlmbHAtPm5mc2Zs
X3N0cmlwZTEgPSBmeGRyX3Vuc2lnbmVkKHVpbnQzMl90LCAqdGwrKyk7CisJCWZscC0+bmZzZmxf
cGF0b2ZmID0gZnhkcl9oeXBlcih0bCk7IHRsICs9IDI7CisJCWlmIChmeGRyX3Vuc2lnbmVkKGlu
dCwgKnRsKSAhPSBmaGNudCkgeworCQkJcHJpbnRmKCJFRUshIGJhZCBmaGNudFxuIik7CisJCQll
cnJvciA9IE5GU0VSUl9CQURYRFI7CisJCQlnb3RvIG5mc21vdXQ7CisJCX0KKwkJZm9yIChqID0g
MDsgaiA8IGZoY250OyBqKyspIHsKKwkJCU5GU01fRElTU0VDVCh0bCwgdWludDMyX3QgKiwgTkZT
WF9VTlNJR05FRCk7CisJCQluZmhsZW4gPSBmeGRyX3Vuc2lnbmVkKGludCwgKnRsKTsKKwkJCWlm
IChuZmhsZW4gPD0gMCB8fCBuZmhsZW4gPiBORlNYX1Y0RkhNQVgpIHsKKwkJCQllcnJvciA9IE5G
U0VSUl9CQURYRFI7CisJCQkJZ290byBuZnNtb3V0OworCQkJfQorCQkJbmZocCA9IG1hbGxvYyhz
aXplb2YoKm5maHApICsgbmZobGVuIC0gMSwgTV9ORlNGSCwKKwkJCSAgICBNX1dBSVRPSyk7CisJ
CQlmbHAtPm5mc2ZsX2ZoW2pdID0gbmZocDsKKwkJCWZscC0+bmZzZmxfZmhjbnQrKzsKKwkJCW5m
aHAtPm5maF9sZW4gPSBuZmhsZW47CisJCQlORlNNX0RJU1NFQ1QoY3AsIHVpbnQ4X3QgKiwgTkZT
TV9STkRVUChuZmhsZW4pKTsKKwkJCU5GU0JDT1BZKGNwLCBuZmhwLT5uZmhfZmgsIG5maGxlbik7
CisJCX0KKwkJaWYgKGZscC0+bmZzZmxfaW9tb2RlID09IGdvdGlvbW9kZSkgeworCQkJLyogS2Vl
cCB0aGUgbGlzdCBpbiBpbmNyZWFzaW5nIG9mZnNldCBvcmRlci4gKi8KKwkJCXRmbHAgPSBMSVNU
X0ZJUlNUKGZsaHApOworCQkJcHJldmZscCA9IE5VTEw7CisJCQl3aGlsZSAodGZscCAhPSBOVUxM
ICYmCisJCQkgICAgdGZscC0+bmZzZmxfb2ZmIDwgZmxwLT5uZnNmbF9vZmYpIHsKKwkJCQlwcmV2
ZmxwID0gdGZscDsKKwkJCQl0ZmxwID0gTElTVF9ORVhUKHRmbHAsIG5mc2ZsX2xpc3QpOworCQkJ
fQorCQkJaWYgKHByZXZmbHAgPT0gTlVMTCkKKwkJCQlMSVNUX0lOU0VSVF9IRUFEKGZsaHAsIGZs
cCwgbmZzZmxfbGlzdCk7CisJCQllbHNlCisJCQkJTElTVF9JTlNFUlRfQUZURVIocHJldmZscCwg
ZmxwLAorCQkJCSAgICBuZnNmbF9saXN0KTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigibmZzY2xf
bGF5b3V0Z2V0KCk6IGdvdCB3cm9uZyBpb21vZGVcbiIpOworCQkJbmZzY2xfZnJlZWZsYXlvdXQo
ZmxwKTsKKwkJfQorCQlmbHAgPSBOVUxMOworCX0KK25mc21vdXQ6CisJaWYgKGVycm9yICE9IDAg
JiYgZmxwICE9IE5VTEwpCisJCW5mc2NsX2ZyZWVmbGF5b3V0KGZscCk7CisJcmV0dXJuIChlcnJv
cik7Cit9CisKKy8qCisgKiBTaW1pbGFyIHRvIG5mc3JwY19nZXRsYXlvdXQoKSwgZXhjZXB0IHRo
YXQgaXQgdXNlcyBuZnNycGNfb3BlbmxheWdldCgpLAorICogc28gdGhhdCBpdCBkb2VzIGJvdGgg
YW4gT3BlbiBhbmQgYSBMYXlvdXRnZXQuCisgKi8KK3N0YXRpYyBpbnQKK25mc3JwY19nZXRvcGVu
bGF5b3V0KHN0cnVjdCBuZnNtb3VudCAqbm1wLCB2bm9kZV90IHZwLCB1X2ludDhfdCAqbmZocCwK
KyAgICBpbnQgZmhsZW4sIHVpbnQ4X3QgKm5ld2ZocCwgaW50IG5ld2ZobGVuLCB1aW50MzJfdCBt
b2RlLAorICAgIHN0cnVjdCBuZnNjbG9wZW4gKm9wLCB1aW50OF90ICpuYW1lLCBpbnQgbmFtZWxl
biwgc3RydWN0IG5mc2NsZGVsZWcgKipkcHAsCisgICAgc3RydWN0IHVjcmVkICpjcmVkLCBORlNQ
Uk9DX1QgKnApCit7CisJc3RydWN0IG5mc2NsbGF5b3V0ICpseXA7CisJc3RydWN0IG5mc2NsZmxh
eW91dCAqZmxwOworCXN0cnVjdCBuZnNjbGZsYXlvdXRoZWFkIGZsaDsKKwlpbnQgZXJyb3IsIGlz
bG9ja2VkLCBsYXlvdXRsZW4sIHJlY2FsbGVkLCByZXRvbmNsb3NlLCB1c2VjdXJzdGF0ZWlkOwor
CWludCBsYXlzdGF0OworCW5mc3Y0c3RhdGVpZF90IHN0YXRlaWQ7CisJc3RydWN0IG5mc2Nsc2Vz
c2lvbiAqdHNlcDsKKworCWVycm9yID0gMDsKKwkvKgorCSAqIElmIGx5cCBpcyByZXR1cm5lZCBu
b24tTlVMTCwgdGhlcmUgd2lsbCBiZSBhIHJlZmNudCAoc2hhcmVkIGxvY2spCisJICogb24gaXQs
IGlmZiBmbHAgIT0gTlVMTCBvciBhIGxvY2sgKGV4Y2x1c2l2ZSBsb2NrKSBvbiBpdCBpZmYKKwkg
KiBmbHAgPT0gTlVMTC4KKwkgKi8KKwlseXAgPSBuZnNjbF9nZXRsYXlvdXQobm1wLT5ubV9jbHAs
IG5ld2ZocCwgbmV3ZmhsZW4sIDAsICZmbHAsCisJICAgICZyZWNhbGxlZCk7CisJTkZTQ0xfREVC
VUcoNCwgIm5mc3JwY19nZXRvcGVubGF5b3V0IG5mc2NsX2dldGxheW91dCBseXA9JXBcbiIsIGx5
cCk7CisJaWYgKGx5cCA9PSBOVUxMKQorCQlpc2xvY2tlZCA9IDA7CisJZWxzZSBpZiAoZmxwICE9
IE5VTEwpCisJCWlzbG9ja2VkID0gMTsKKwllbHNlCisJCWlzbG9ja2VkID0gMjsKKwlpZiAoKGx5
cCA9PSBOVUxMIHx8IGZscCA9PSBOVUxMKSAmJiByZWNhbGxlZCA9PSAwKSB7CisJCUxJU1RfSU5J
VCgmZmxoKTsKKwkJdHNlcCA9IG5mc21udF9tZHNzZXNzaW9uKG5tcCk7CisJCWxheW91dGxlbiA9
IHRzZXAtPm5mc2Vzc19tYXhjYWNoZSAtIChORlNYX1NUQVRFSUQgKworCQkgICAgMyAqIE5GU1hf
VU5TSUdORUQpOworCQlpZiAobHlwID09IE5VTEwpCisJCQl1c2VjdXJzdGF0ZWlkID0gMTsKKwkJ
ZWxzZSB7CisJCQl1c2VjdXJzdGF0ZWlkID0gMDsKKwkJCXN0YXRlaWQuc2VxaWQgPSBseXAtPm5m
c2x5X3N0YXRlaWQuc2VxaWQ7CisJCQlzdGF0ZWlkLm90aGVyWzBdID0gbHlwLT5uZnNseV9zdGF0
ZWlkLm90aGVyWzBdOworCQkJc3RhdGVpZC5vdGhlclsxXSA9IGx5cC0+bmZzbHlfc3RhdGVpZC5v
dGhlclsxXTsKKwkJCXN0YXRlaWQub3RoZXJbMl0gPSBseXAtPm5mc2x5X3N0YXRlaWQub3RoZXJb
Ml07CisJCX0KKwkJZXJyb3IgPSBuZnNycGNfb3BlbmxheW91dHJwYyhubXAsIHZwLCBuZmhwLCBm
aGxlbiwKKwkJICAgIG5ld2ZocCwgbmV3ZmhsZW4sIG1vZGUsIG9wLCBuYW1lLCBuYW1lbGVuLAor
CQkgICAgZHBwLCAmc3RhdGVpZCwgdXNlY3Vyc3RhdGVpZCwgbGF5b3V0bGVuLAorCQkgICAgJnJl
dG9uY2xvc2UsICZmbGgsICZsYXlzdGF0LCBjcmVkLCBwKTsKKwkJTkZTQ0xfREVCVUcoNCwgImFm
dCBuZnNycGNfb3BlbmxheW91dHJwYyBsYXlzdGF0PSVkIGVycj0lZFxuIiwKKwkJICAgIGxheXN0
YXQsIGVycm9yKTsKKwkJbGF5c3RhdCA9IG5mc3JwY19sYXlvdXRnZXRyZXMobm1wLCB2cCwgbmV3
ZmhwLCBuZXdmaGxlbiwKKwkJICAgICZzdGF0ZWlkLCByZXRvbmNsb3NlLCBOVUxMLCAmbHlwLCAm
ZmxoLCBsYXlzdGF0LCAmaXNsb2NrZWQsCisJCSAgICBjcmVkLCBwKTsKKwl9IGVsc2UKKwkJZXJy
b3IgPSBuZnNycGNfb3BlbnJwYyhubXAsIHZwLCBuZmhwLCBmaGxlbiwgbmV3ZmhwLCBuZXdmaGxl
biwKKwkJICAgIG1vZGUsIG9wLCBuYW1lLCBuYW1lbGVuLCBkcHAsIDAsIDAsIGNyZWQsIHAsIDAs
IDApOworCWlmIChpc2xvY2tlZCA9PSAyKQorCQluZnNjbF9yZWxsYXlvdXQobHlwLCAxKTsKKwll
bHNlIGlmIChpc2xvY2tlZCA9PSAxKQorCQluZnNjbF9yZWxsYXlvdXQobHlwLCAwKTsKKwlyZXR1
cm4gKGVycm9yKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBhbiBPcGVuK0xheW91
dEdldCBmb3IgYW4gTkZTdjQuMSBtb3VudCB3aXRoIHBORlMKKyAqIGVuYWJsZWQsIG9ubHkgZm9y
IHRoZSBDTEFJTV9OVUxMIGNhc2UuICBBbGwgb3RoZXIgTkZTdjQgT3BlbnMgYXJlCisgKiBoYW5k
bGVkIGJ5IG5mc3JwY19vcGVucnBjKCkuCisgKiBGb3IgdGhlIGNhc2Ugd2hlcmUgb3AgPT0gTlVM
TCwgZHZwIGlzIHRoZSBkaXJlY3RvcnkuICBXaGVuIG9wICE9IE5VTEwsIGl0CisgKiBjYW4gYmUg
TlVMTC4KKyAqLworc3RhdGljIGludAorbmZzcnBjX29wZW5sYXlvdXRycGMoc3RydWN0IG5mc21v
dW50ICpubXAsIHZub2RlX3QgdnAsIHVfaW50OF90ICpuZmhwLAorICAgIGludCBmaGxlbiwgdWlu
dDhfdCAqbmV3ZmhwLCBpbnQgbmV3ZmhsZW4sIHVpbnQzMl90IG1vZGUsCisgICAgc3RydWN0IG5m
c2Nsb3BlbiAqb3AsIHVpbnQ4X3QgKm5hbWUsIGludCBuYW1lbGVuLCBzdHJ1Y3QgbmZzY2xkZWxl
ZyAqKmRwcCwKKyAgICBuZnN2NHN0YXRlaWRfdCAqc3RhdGVpZHAsIGludCB1c2VjdXJzdGF0ZWlk
LAorICAgIGludCBsYXlvdXRsZW4sIGludCAqcmV0b25jbG9zZXAsIHN0cnVjdCBuZnNjbGZsYXlv
dXRoZWFkICpmbGhwLAorICAgIGludCAqbGF5c3RhdHAsIHN0cnVjdCB1Y3JlZCAqY3JlZCwgTkZT
UFJPQ19UICpwKQoreworCXVpbnQzMl90ICp0bDsKKwlzdHJ1Y3QgbmZzcnZfZGVzY3JpcHQgbmZz
ZCwgKm5kID0gJm5mc2Q7CisJc3RydWN0IG5mc2NsZGVsZWcgKm5kcCA9IE5VTEw7CisJc3RydWN0
IG5mc3ZhdHRyIG5mc3ZhOworCXN0cnVjdCBuZnNjbHNlc3Npb24gKnRzZXA7CisJdWludDMyX3Qg
cmZsYWdzLCBkZWxlZzsKKwluZnNhdHRyYml0X3QgYXR0cmJpdHM7CisJaW50IGVycm9yLCByZXQs
IGFjZXNpemUsIGxpbWl0YnksIGlvbW9kZTsKKworCSpkcHAgPSBOVUxMOworCSpsYXlzdGF0cCA9
IEVOWElPOworCW5mc2NsX3JlcXN0YXJ0KG5kLCBORlNQUk9DX09QRU5MQVlHRVQsIG5tcCwgbmZo
cCwgZmhsZW4sIE5VTEwsIE5VTEwpOworCU5GU01fQlVJTEQodGwsIHVpbnQzMl90ICosIDUgKiBO
RlNYX1VOU0lHTkVEKTsKKwkqdGwrKyA9IHR4ZHJfdW5zaWduZWQob3AtPm5mc29fb3duLT5uZnNv
d19zZXFpZCk7CisJKnRsKysgPSB0eGRyX3Vuc2lnbmVkKG1vZGUgJiBORlNWNE9QRU5fQUNDRVNT
Qk9USCk7CisJKnRsKysgPSB0eGRyX3Vuc2lnbmVkKChtb2RlID4+IE5GU0xDS19TSElGVCkgJiBO
RlNWNE9QRU5fREVOWUJPVEgpOworCXRzZXAgPSBuZnNtbnRfbWRzc2Vzc2lvbihubXApOworCSp0
bCsrID0gdHNlcC0+bmZzZXNzX2NsaWVudGlkLmx2YWxbMF07CisJKnRsID0gdHNlcC0+bmZzZXNz
X2NsaWVudGlkLmx2YWxbMV07CisJbmZzbV9zdHJ0b20obmQsIG9wLT5uZnNvX293bi0+bmZzb3df
b3duZXIsIE5GU1Y0Q0xfTE9DS05BTUVMRU4pOworCU5GU01fQlVJTEQodGwsIHVpbnQzMl90ICos
IDIgKiBORlNYX1VOU0lHTkVEKTsKKwkqdGwrKyA9IHR4ZHJfdW5zaWduZWQoTkZTVjRPUEVOX05P
Q1JFQVRFKTsKKwkqdGwgPSB0eGRyX3Vuc2lnbmVkKE5GU1Y0T1BFTl9DTEFJTU5VTEwpOworCW5m
c21fc3RydG9tKG5kLCBuYW1lLCBuYW1lbGVuKTsKKwlORlNNX0JVSUxEKHRsLCB1aW50MzJfdCAq
LCBORlNYX1VOU0lHTkVEKTsKKwkqdGwgPSB0eGRyX3Vuc2lnbmVkKE5GU1Y0T1BfR0VUQVRUUik7
CisJTkZTWkVST19BVFRSQklUKCZhdHRyYml0cyk7CisJTkZTU0VUQklUX0FUVFJCSVQoJmF0dHJi
aXRzLCBORlNBVFRSQklUX0NIQU5HRSk7CisJTkZTU0VUQklUX0FUVFJCSVQoJmF0dHJiaXRzLCBO
RlNBVFRSQklUX1RJTUVNT0RJRlkpOworCW5mc3J2X3B1dGF0dHJiaXQobmQsICZhdHRyYml0cyk7
CisJTkZTTV9CVUlMRCh0bCwgdWludDMyX3QgKiwgTkZTWF9VTlNJR05FRCk7CisJKnRsID0gdHhk
cl91bnNpZ25lZChORlNWNE9QX0xBWU9VVEdFVCk7CisJaWYgKChtb2RlICYgTkZTVjRPUEVOX0FD
Q0VTU1dSSVRFKSAhPSAwKQorCQlpb21vZGUgPSBORlNMQVlPVVRJT01PREVfUlc7CisJZWxzZQor
CQlpb21vZGUgPSBORlNMQVlPVVRJT01PREVfUkVBRDsKKwluZnNydl9zZXR1cGxheW91dGdldChu
ZCwgaW9tb2RlLCAwLCBVSU5UNjRfTUFYLCAwLCBzdGF0ZWlkcCwKKwkgICAgbGF5b3V0bGVuLCB1
c2VjdXJzdGF0ZWlkKTsKKwllcnJvciA9IG5ld25mc19yZXF1ZXN0KG5kLCBubXAsIE5VTEwsICZu
bXAtPm5tX3NvY2tyZXEsIHZwLCBwLCBjcmVkLAorCSAgICBORlNfUFJPRywgTkZTX1ZFUjQsIE5V
TEwsIDEsIE5VTEwsIE5VTEwpOworCWlmIChlcnJvciAhPSAwKQorCQlyZXR1cm4gKGVycm9yKTsK
KwlORlNDTF9JTkNSU0VRSUQob3AtPm5mc29fb3duLT5uZnNvd19zZXFpZCwgbmQpOworCWlmIChu
ZC0+bmRfcmVwc3RhdCAhPSAwKQorCQkqbGF5c3RhdHAgPSBuZC0+bmRfcmVwc3RhdDsKKwlpZiAo
KG5kLT5uZF9mbGFnICYgTkRfTk9NT1JFREFUQSkgPT0gMCkgeworCQkvKiBORF9OT01PUkVEQVRB
IHdpbGwgYmUgc2V0IGlmIHRoZSBPcGVuIG9wZXJhdGlvbiBmYWlsZWQuICovCisJCU5GU01fRElT
U0VDVCh0bCwgdV9pbnQzMl90ICosIE5GU1hfU1RBVEVJRCArCisJCSAgICA2ICogTkZTWF9VTlNJ
R05FRCk7CisJCW9wLT5uZnNvX3N0YXRlaWQuc2VxaWQgPSAqdGwrKzsKKwkJb3AtPm5mc29fc3Rh
dGVpZC5vdGhlclswXSA9ICp0bCsrOworCQlvcC0+bmZzb19zdGF0ZWlkLm90aGVyWzFdID0gKnRs
Kys7CisJCW9wLT5uZnNvX3N0YXRlaWQub3RoZXJbMl0gPSAqdGw7CisJCXJmbGFncyA9IGZ4ZHJf
dW5zaWduZWQodV9pbnQzMl90LCAqKHRsICsgNikpOworCQllcnJvciA9IG5mc3J2X2dldGF0dHJi
aXRzKG5kLCAmYXR0cmJpdHMsIE5VTEwsIE5VTEwpOworCQlpZiAoZXJyb3IgIT0gMCkKKwkJCWdv
dG8gbmZzbW91dDsKKwkJTkZTTV9ESVNTRUNUKHRsLCB1X2ludDMyX3QgKiwgTkZTWF9VTlNJR05F
RCk7CisJCWRlbGVnID0gZnhkcl91bnNpZ25lZCh1X2ludDMyX3QsICp0bCk7CisJCWlmIChkZWxl
ZyA9PSBORlNWNE9QRU5fREVMRUdBVEVSRUFEIHx8CisJCSAgICBkZWxlZyA9PSBORlNWNE9QRU5f
REVMRUdBVEVXUklURSkgeworCQkJaWYgKCEob3AtPm5mc29fb3duLT5uZnNvd19jbHAtPm5mc2Nf
ZmxhZ3MgJgorCQkJICAgICAgTkZTQ0xGTEFHU19GSVJTVERFTEVHKSkKKwkJCQlvcC0+bmZzb19v
d24tPm5mc293X2NscC0+bmZzY19mbGFncyB8PQorCQkJCSAgKE5GU0NMRkxBR1NfRklSU1RERUxF
RyB8IE5GU0NMRkxBR1NfR09UREVMRUcpOworCQkJbmRwID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qg
bmZzY2xkZWxlZykgKyBuZXdmaGxlbiwKKwkJCSAgICBNX05GU0NMREVMRUcsIE1fV0FJVE9LKTsK
KwkJCUxJU1RfSU5JVCgmbmRwLT5uZnNkbF9vd25lcik7CisJCQlMSVNUX0lOSVQoJm5kcC0+bmZz
ZGxfbG9jayk7CisJCQluZHAtPm5mc2RsX2NscCA9IG9wLT5uZnNvX293bi0+bmZzb3dfY2xwOwor
CQkJbmRwLT5uZnNkbF9maGxlbiA9IG5ld2ZobGVuOworCQkJTkZTQkNPUFkobmV3ZmhwLCBuZHAt
Pm5mc2RsX2ZoLCBuZXdmaGxlbik7CisJCQluZXduZnNfY29weWluY3JlZChjcmVkLCAmbmRwLT5u
ZnNkbF9jcmVkKTsKKwkJCW5mc2NsX2xvY2tpbml0KCZuZHAtPm5mc2RsX3J3bG9jayk7CisJCQlO
RlNNX0RJU1NFQ1QodGwsIHVfaW50MzJfdCAqLCBORlNYX1NUQVRFSUQgKworCQkJICAgIE5GU1hf
VU5TSUdORUQpOworCQkJbmRwLT5uZnNkbF9zdGF0ZWlkLnNlcWlkID0gKnRsKys7CisJCQluZHAt
Pm5mc2RsX3N0YXRlaWQub3RoZXJbMF0gPSAqdGwrKzsKKwkJCW5kcC0+bmZzZGxfc3RhdGVpZC5v
dGhlclsxXSA9ICp0bCsrOworCQkJbmRwLT5uZnNkbF9zdGF0ZWlkLm90aGVyWzJdID0gKnRsKys7
CisJCQlyZXQgPSBmeGRyX3Vuc2lnbmVkKGludCwgKnRsKTsKKwkJCWlmIChkZWxlZyA9PSBORlNW
NE9QRU5fREVMRUdBVEVXUklURSkgeworCQkJCW5kcC0+bmZzZGxfZmxhZ3MgPSBORlNDTERMX1dS
SVRFOworCQkJCS8qCisJCQkJICogSW5kaWNhdGVzIGhvdyBtdWNoIHRoZSBmaWxlIGNhbiBncm93
LgorCQkJCSAqLworCQkJCU5GU01fRElTU0VDVCh0bCwgdV9pbnQzMl90ICosCisJCQkJICAgIDMg
KiBORlNYX1VOU0lHTkVEKTsKKwkJCQlsaW1pdGJ5ID0gZnhkcl91bnNpZ25lZChpbnQsICp0bCsr
KTsKKwkJCQlzd2l0Y2ggKGxpbWl0YnkpIHsKKwkJCQljYXNlIE5GU1Y0T1BFTl9MSU1JVFNJWkU6
CisJCQkJCW5kcC0+bmZzZGxfc2l6ZWxpbWl0ID0gZnhkcl9oeXBlcih0bCk7CisJCQkJCWJyZWFr
OworCQkJCWNhc2UgTkZTVjRPUEVOX0xJTUlUQkxPQ0tTOgorCQkJCQluZHAtPm5mc2RsX3NpemVs
aW1pdCA9CisJCQkJCSAgICBmeGRyX3Vuc2lnbmVkKHVfaW50NjRfdCwgKnRsKyspOworCQkJCQlu
ZHAtPm5mc2RsX3NpemVsaW1pdCAqPQorCQkJCQkgICAgZnhkcl91bnNpZ25lZCh1X2ludDY0X3Qs
ICp0bCk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWVycm9yID0gTkZTRVJSX0JB
RFhEUjsKKwkJCQkJZ290byBuZnNtb3V0OworCQkJCX07CisJCQl9IGVsc2UKKwkJCQluZHAtPm5m
c2RsX2ZsYWdzID0gTkZTQ0xETF9SRUFEOworCQkJaWYgKHJldCAhPSAwKQorCQkJCW5kcC0+bmZz
ZGxfZmxhZ3MgfD0gTkZTQ0xETF9SRUNBTEw7CisJCQllcnJvciA9IG5mc3J2X2Rpc3NlY3RhY2Uo
bmQsICZuZHAtPm5mc2RsX2FjZSwgJnJldCwKKwkJCSAgICAmYWNlc2l6ZSwgcCk7CisJCQlpZiAo
ZXJyb3IgIT0gMCkKKwkJCQlnb3RvIG5mc21vdXQ7CisJCX0gZWxzZSBpZiAoZGVsZWcgIT0gTkZT
VjRPUEVOX0RFTEVHQVRFTk9ORSkgeworCQkJZXJyb3IgPSBORlNFUlJfQkFEWERSOworCQkJZ290
byBuZnNtb3V0OworCQl9CisJCWlmICgocmZsYWdzICYgTkZTVjRPUEVOX0xPQ0tUWVBFUE9TSVgp
ICE9IDAgfHwKKwkJICAgIG5mc2NsX2Fzc3VtZXBvc2l4bG9ja3MpCisJCQlvcC0+bmZzb19wb3Np
eGxvY2sgPSAxOworCQllbHNlCisJCQlvcC0+bmZzb19wb3NpeGxvY2sgPSAwOworCQlORlNNX0RJ
U1NFQ1QodGwsIHVfaW50MzJfdCAqLCAyICogTkZTWF9VTlNJR05FRCk7CisJCS8qIElmIHRoZSAy
bmQgZWxlbWVudCA9PSBORlNfT0ssIHRoZSBHZXRhdHRyIHN1Y2NlZWRlZC4gKi8KKwkJaWYgKCor
K3RsID09IDApIHsKKwkJCWVycm9yID0gbmZzdjRfbG9hZGF0dHIobmQsIE5VTEwsICZuZnN2YSwg
TlVMTCwKKwkJCSAgICBOVUxMLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLAor
CQkJICAgIE5VTEwsIE5VTEwsIE5VTEwsIHAsIGNyZWQpOworCQkJaWYgKGVycm9yICE9IDApCisJ
CQkJZ290byBuZnNtb3V0OworCQkJaWYgKG5kcCAhPSBOVUxMKSB7CisJCQkJbmRwLT5uZnNkbF9j
aGFuZ2UgPSBuZnN2YS5uYV9maWxlcmV2OworCQkJCW5kcC0+bmZzZGxfbW9kdGltZSA9IG5mc3Zh
Lm5hX210aW1lOworCQkJCW5kcC0+bmZzZGxfZmxhZ3MgfD0gTkZTQ0xETF9NT0RUSU1FU0VUOwor
CQkJCSpkcHAgPSBuZHA7CisJCQkJbmRwID0gTlVMTDsKKwkJCX0KKwkJCS8qCisJCQkgKiBBdCB0
aGlzIHBvaW50LCB0aGUgT3BlbiBoYXMgc3VjY2VlZGVkLCBzbyBzZXQKKwkJCSAqIG5kX3JlcHN0
YXQgPSBORlNfT0suICBJZiB0aGUgTGF5b3V0Z2V0IGZhaWxlZCwKKwkJCSAqIHRoaXMgZnVuY3Rp
b24ganVzdCB3b24ndCByZXR1cm4gYSBsYXlvdXQuCisJCQkgKi8KKwkJCWlmIChuZC0+bmRfcmVw
c3RhdCA9PSAwKSB7CisJCQkJTkZTTV9ESVNTRUNUKHRsLCB1aW50MzJfdCAqLCAyICogTkZTWF9V
TlNJR05FRCk7CisJCQkJKmxheXN0YXRwID0gZnhkcl91bnNpZ25lZChpbnQsICorK3RsKTsKKwkJ
CQlpZiAoKmxheXN0YXRwID09IDApIHsKKwkJCQkJZXJyb3IgPSBuZnNydl9wYXJzZWxheW91dGdl
dChuZCwKKwkJCQkJICAgIHN0YXRlaWRwLCByZXRvbmNsb3NlcCwgZmxocCk7CisJCQkJCWlmIChl
cnJvciAhPSAwKQorCQkJCQkJKmxheXN0YXRwID0gZXJyb3I7CisJCQkJfQorCQkJfSBlbHNlCisJ
CQkJbmQtPm5kX3JlcHN0YXQgPSAwOwkvKiBSZXR1cm4gMCBmb3IgT3Blbi4gKi8KKwkJfQorCX0K
KwlpZiAobmQtPm5kX3JlcHN0YXQgIT0gMCAmJiBlcnJvciA9PSAwKQorCQllcnJvciA9IG5kLT5u
ZF9yZXBzdGF0OworbmZzbW91dDoKKwlmcmVlKG5kcCwgTV9ORlNDTERFTEVHKTsKKwltYnVmX2Zy
ZWVtKG5kLT5uZF9tcmVwKTsKKwlyZXR1cm4gKGVycm9yKTsKK30KKworLyoKKyAqIFNpbWlsYXIg
bmZzcnBjX2NyZWF0ZXY0KCksIGJ1dCBhbHNvIGRvZXMgdGhlIExheW91dEdldCBvcGVyYXRpb24u
CisgKiBVc2VkIG9ubHkgZm9yIG1vdW50cyB3aXRoIHBORlMgZW5hYmxlZC4KKyAqLworc3RhdGlj
IGludAorbmZzcnBjX2NyZWF0ZWxheW91dCh2bm9kZV90IGR2cCwgY2hhciAqbmFtZSwgaW50IG5h
bWVsZW4sIHN0cnVjdCB2YXR0ciAqdmFwLAorICAgIG5mc3F1YWRfdCBjdmVyZiwgaW50IGZtb2Rl
LCBzdHJ1Y3QgbmZzY2xvd25lciAqb3dwLCBzdHJ1Y3QgbmZzY2xkZWxlZyAqKmRwcCwKKyAgICBz
dHJ1Y3QgdWNyZWQgKmNyZWQsIE5GU1BST0NfVCAqcCwgc3RydWN0IG5mc3ZhdHRyICpkbmFwLAor
ICAgIHN0cnVjdCBuZnN2YXR0ciAqbm5hcCwgc3RydWN0IG5mc2ZoICoqbmZocHAsIGludCAqYXR0
cmZsYWdwLAorICAgIGludCAqZGF0dHJmbGFncCwgdm9pZCAqZHN0dWZmLCBpbnQgKnVubG9ja2Vk
cCwgbmZzdjRzdGF0ZWlkX3QgKnN0YXRlaWRwLAorICAgIGludCB1c2VjdXJzdGF0ZWlkLCBpbnQg
bGF5b3V0bGVuLCBpbnQgKnJldG9uY2xvc2VwLAorICAgIHN0cnVjdCBuZnNjbGZsYXlvdXRoZWFk
ICpmbGhwLCBpbnQgKmxheXN0YXRwKQoreworCXVpbnQzMl90ICp0bDsKKwlpbnQgZXJyb3IgPSAw
LCBkZWxlZywgbmV3b25lLCByZXQsIGFjZXNpemUsIGxpbWl0Ynk7CisJc3RydWN0IG5mc3J2X2Rl
c2NyaXB0IG5mc2QsICpuZCA9ICZuZnNkOworCXN0cnVjdCBuZnNjbG9wZW4gKm9wOworCXN0cnVj
dCBuZnNjbGRlbGVnICpkcCA9IE5VTEw7CisJc3RydWN0IG5mc25vZGUgKm5wOworCXN0cnVjdCBu
ZnNmaCAqbmZocDsKKwlzdHJ1Y3QgbmZzY2xzZXNzaW9uICp0c2VwOworCW5mc2F0dHJiaXRfdCBh
dHRyYml0czsKKwluZnN2NHN0YXRlaWRfdCBzdGF0ZWlkOworCXVpbnQzMl90IHJmbGFnczsKKwlz
dHJ1Y3QgbmZzbW91bnQgKm5tcDsKKworCW5tcCA9IFZGU1RPTkZTKGR2cC0+dl9tb3VudCk7CisJ
bnAgPSBWVE9ORlMoZHZwKTsKKwkqbGF5c3RhdHAgPSBFTlhJTzsKKwkqdW5sb2NrZWRwID0gMDsK
KwkqbmZocHAgPSBOVUxMOworCSpkcHAgPSBOVUxMOworCSphdHRyZmxhZ3AgPSAwOworCSpkYXR0
cmZsYWdwID0gMDsKKwlpZiAobmFtZWxlbiA+IE5GU19NQVhOQU1MRU4pCisJCXJldHVybiAoRU5B
TUVUT09MT05HKTsKKwlORlNDTF9SRVFTVEFSVChuZCwgTkZTUFJPQ19DUkVBVEVMQVlHRVQsIGR2
cCk7CisJLyoKKwkgKiBGb3IgVjQsIHRoaXMgaXMgYWN0dWFsbHkgYW4gT3BlbiBvcC4KKwkgKi8K
KwlORlNNX0JVSUxEKHRsLCB1X2ludDMyX3QgKiwgNSAqIE5GU1hfVU5TSUdORUQpOworCSp0bCsr
ID0gdHhkcl91bnNpZ25lZChvd3AtPm5mc293X3NlcWlkKTsKKwkqdGwrKyA9IHR4ZHJfdW5zaWdu
ZWQoTkZTVjRPUEVOX0FDQ0VTU1dSSVRFIHwKKwkgICAgTkZTVjRPUEVOX0FDQ0VTU1JFQUQpOwor
CSp0bCsrID0gdHhkcl91bnNpZ25lZChORlNWNE9QRU5fREVOWU5PTkUpOworCXRzZXAgPSBuZnNt
bnRfbWRzc2Vzc2lvbihubXApOworCSp0bCsrID0gdHNlcC0+bmZzZXNzX2NsaWVudGlkLmx2YWxb
MF07CisJKnRsID0gdHNlcC0+bmZzZXNzX2NsaWVudGlkLmx2YWxbMV07CisJbmZzbV9zdHJ0b20o
bmQsIG93cC0+bmZzb3dfb3duZXIsIE5GU1Y0Q0xfTE9DS05BTUVMRU4pOworCU5GU01fQlVJTEQo
dGwsIHVfaW50MzJfdCAqLCAyICogTkZTWF9VTlNJR05FRCk7CisJKnRsKysgPSB0eGRyX3Vuc2ln
bmVkKE5GU1Y0T1BFTl9DUkVBVEUpOworCWlmICgoZm1vZGUgJiBPX0VYQ0wpICE9IDApIHsKKwkJ
aWYgKE5GU0hBU1NFU1NQRVJTSVNUKG5tcCkpIHsKKwkJCS8qIFVzZSBHVUFSREVEIGZvciBwZXJz
aXN0ZW50IHNlc3Npb25zLiAqLworCQkJKnRsID0gdHhkcl91bnNpZ25lZChORlNDUkVBVEVfR1VB
UkRFRCk7CisJCQluZnNjbF9maWxsc2F0dHIobmQsIHZhcCwgZHZwLCAwLCAwKTsKKwkJfSBlbHNl
IHsKKwkJCS8qIE90aGVyd2lzZSwgdXNlIEVYQ0xVU0lWRTRfMS4gKi8KKwkJCSp0bCA9IHR4ZHJf
dW5zaWduZWQoTkZTQ1JFQVRFX0VYQ0xVU0lWRTQxKTsKKwkJCU5GU01fQlVJTEQodGwsIHVfaW50
MzJfdCAqLCBORlNYX1ZFUkYpOworCQkJKnRsKysgPSBjdmVyZi5sdmFsWzBdOworCQkJKnRsID0g
Y3ZlcmYubHZhbFsxXTsKKwkJCW5mc2NsX2ZpbGxzYXR0cihuZCwgdmFwLCBkdnAsIDAsIDApOwor
CQl9CisJfSBlbHNlIHsKKwkJKnRsID0gdHhkcl91bnNpZ25lZChORlNDUkVBVEVfVU5DSEVDS0VE
KTsKKwkJbmZzY2xfZmlsbHNhdHRyKG5kLCB2YXAsIGR2cCwgMCwgMCk7CisJfQorCU5GU01fQlVJ
TEQodGwsIHVfaW50MzJfdCAqLCBORlNYX1VOU0lHTkVEKTsKKwkqdGwgPSB0eGRyX3Vuc2lnbmVk
KE5GU1Y0T1BFTl9DTEFJTU5VTEwpOworCW5mc21fc3RydG9tKG5kLCBuYW1lLCBuYW1lbGVuKTsK
KwkvKiBHZXQgdGhlIG5ldyBmaWxlJ3MgaGFuZGxlIGFuZCBhdHRyaWJ1dGVzLCBwbHVzIHNhdmUg
dGhlIEZILiAqLworCU5GU01fQlVJTEQodGwsIHVfaW50MzJfdCAqLCAzICogTkZTWF9VTlNJR05F
RCk7CisJKnRsKysgPSB0eGRyX3Vuc2lnbmVkKE5GU1Y0T1BfU0FWRUZIKTsKKwkqdGwrKyA9IHR4
ZHJfdW5zaWduZWQoTkZTVjRPUF9HRVRGSCk7CisJKnRsID0gdHhkcl91bnNpZ25lZChORlNWNE9Q
X0dFVEFUVFIpOworCU5GU0dFVEFUVFJfQVRUUkJJVCgmYXR0cmJpdHMpOworCW5mc3J2X3B1dGF0
dHJiaXQobmQsICZhdHRyYml0cyk7CisJLyogR2V0IHRoZSBkaXJlY3RvcnkncyBwb3N0LW9wIGF0
dHJpYnV0ZXMuICovCisJTkZTTV9CVUlMRCh0bCwgdV9pbnQzMl90ICosIE5GU1hfVU5TSUdORUQp
OworCSp0bCA9IHR4ZHJfdW5zaWduZWQoTkZTVjRPUF9QVVRGSCk7CisJbmZzbV9maHRvbShuZCwg
bnAtPm5fZmhwLT5uZmhfZmgsIG5wLT5uX2ZocC0+bmZoX2xlbiwgMCk7CisJTkZTTV9CVUlMRCh0
bCwgdV9pbnQzMl90ICosIE5GU1hfVU5TSUdORUQpOworCSp0bCA9IHR4ZHJfdW5zaWduZWQoTkZT
VjRPUF9HRVRBVFRSKTsKKwluZnNydl9wdXRhdHRyYml0KG5kLCAmYXR0cmJpdHMpOworCU5GU01f
QlVJTEQodGwsIHVfaW50MzJfdCAqLCAyICogTkZTWF9VTlNJR05FRCk7CisJKnRsKysgPSB0eGRy
X3Vuc2lnbmVkKE5GU1Y0T1BfUkVTVE9SRUZIKTsKKwkqdGwgPSB0eGRyX3Vuc2lnbmVkKE5GU1Y0
T1BfTEFZT1VUR0VUKTsKKwluZnNydl9zZXR1cGxheW91dGdldChuZCwgTkZTTEFZT1VUSU9NT0RF
X1JXLCAwLCBVSU5UNjRfTUFYLCAwLCBzdGF0ZWlkcCwKKwkgICAgbGF5b3V0bGVuLCB1c2VjdXJz
dGF0ZWlkKTsKKwllcnJvciA9IG5mc2NsX3JlcXVlc3QobmQsIGR2cCwgcCwgY3JlZCwgZHN0dWZm
KTsKKwlpZiAoZXJyb3IgIT0gMCkKKwkJcmV0dXJuIChlcnJvcik7CisJTkZTQ0xfREVCVUcoNCwg
Im5mc3JwY19jcmVhdGVsYXlvdXQgc3RhdD0lZCBlcnI9JWRcbiIsIG5kLT5uZF9yZXBzdGF0LAor
CSAgICBlcnJvcik7CisJaWYgKG5kLT5uZF9yZXBzdGF0ICE9IDApCisJCSpsYXlzdGF0cCA9IG5k
LT5uZF9yZXBzdGF0OworCU5GU0NMX0lOQ1JTRVFJRChvd3AtPm5mc293X3NlcWlkLCBuZCk7CisJ
aWYgKChuZC0+bmRfZmxhZyAmIE5EX05PTU9SRURBVEEpID09IDApIHsKKwkJTkZTQ0xfREVCVUco
NCwgIm5mc3JwY19jcmVhdGVsYXlvdXQgb3BlbiBzdWNjZWVkZWRcbiIpOworCQlORlNNX0RJU1NF
Q1QodGwsIHVfaW50MzJfdCAqLCBORlNYX1NUQVRFSUQgKworCQkgICAgNiAqIE5GU1hfVU5TSUdO
RUQpOworCQlzdGF0ZWlkLnNlcWlkID0gKnRsKys7CisJCXN0YXRlaWQub3RoZXJbMF0gPSAqdGwr
KzsKKwkJc3RhdGVpZC5vdGhlclsxXSA9ICp0bCsrOworCQlzdGF0ZWlkLm90aGVyWzJdID0gKnRs
OworCQlyZmxhZ3MgPSBmeGRyX3Vuc2lnbmVkKHVfaW50MzJfdCwgKih0bCArIDYpKTsKKwkJbmZz
cnZfZ2V0YXR0cmJpdHMobmQsICZhdHRyYml0cywgTlVMTCwgTlVMTCk7CisJCU5GU01fRElTU0VD
VCh0bCwgdV9pbnQzMl90ICosIE5GU1hfVU5TSUdORUQpOworCQlkZWxlZyA9IGZ4ZHJfdW5zaWdu
ZWQoaW50LCAqdGwpOworCQlpZiAoZGVsZWcgPT0gTkZTVjRPUEVOX0RFTEVHQVRFUkVBRCB8fAor
CQkgICAgZGVsZWcgPT0gTkZTVjRPUEVOX0RFTEVHQVRFV1JJVEUpIHsKKwkJCWlmICghKG93cC0+
bmZzb3dfY2xwLT5uZnNjX2ZsYWdzICYKKwkJCSAgICAgIE5GU0NMRkxBR1NfRklSU1RERUxFRykp
CisJCQkJb3dwLT5uZnNvd19jbHAtPm5mc2NfZmxhZ3MgfD0KKwkJCQkgIChORlNDTEZMQUdTX0ZJ
UlNUREVMRUcgfCBORlNDTEZMQUdTX0dPVERFTEVHKTsKKwkJCWRwID0gbWFsbG9jKHNpemVvZihz
dHJ1Y3QgbmZzY2xkZWxlZykgKyBORlNYX1Y0RkhNQVgsCisJCQkgICAgTV9ORlNDTERFTEVHLCBN
X1dBSVRPSyk7CisJCQlMSVNUX0lOSVQoJmRwLT5uZnNkbF9vd25lcik7CisJCQlMSVNUX0lOSVQo
JmRwLT5uZnNkbF9sb2NrKTsKKwkJCWRwLT5uZnNkbF9jbHAgPSBvd3AtPm5mc293X2NscDsKKwkJ
CW5ld25mc19jb3B5aW5jcmVkKGNyZWQsICZkcC0+bmZzZGxfY3JlZCk7CisJCQluZnNjbF9sb2Nr
aW5pdCgmZHAtPm5mc2RsX3J3bG9jayk7CisJCQlORlNNX0RJU1NFQ1QodGwsIHVfaW50MzJfdCAq
LCBORlNYX1NUQVRFSUQgKworCQkJICAgIE5GU1hfVU5TSUdORUQpOworCQkJZHAtPm5mc2RsX3N0
YXRlaWQuc2VxaWQgPSAqdGwrKzsKKwkJCWRwLT5uZnNkbF9zdGF0ZWlkLm90aGVyWzBdID0gKnRs
Kys7CisJCQlkcC0+bmZzZGxfc3RhdGVpZC5vdGhlclsxXSA9ICp0bCsrOworCQkJZHAtPm5mc2Rs
X3N0YXRlaWQub3RoZXJbMl0gPSAqdGwrKzsKKwkJCXJldCA9IGZ4ZHJfdW5zaWduZWQoaW50LCAq
dGwpOworCQkJaWYgKGRlbGVnID09IE5GU1Y0T1BFTl9ERUxFR0FURVdSSVRFKSB7CisJCQkJZHAt
Pm5mc2RsX2ZsYWdzID0gTkZTQ0xETF9XUklURTsKKwkJCQkvKgorCQkJCSAqIEluZGljYXRlcyBo
b3cgbXVjaCB0aGUgZmlsZSBjYW4gZ3Jvdy4KKwkJCQkgKi8KKwkJCQlORlNNX0RJU1NFQ1QodGws
IHVfaW50MzJfdCAqLAorCQkJCSAgICAzICogTkZTWF9VTlNJR05FRCk7CisJCQkJbGltaXRieSA9
IGZ4ZHJfdW5zaWduZWQoaW50LCAqdGwrKyk7CisJCQkJc3dpdGNoIChsaW1pdGJ5KSB7CisJCQkJ
Y2FzZSBORlNWNE9QRU5fTElNSVRTSVpFOgorCQkJCQlkcC0+bmZzZGxfc2l6ZWxpbWl0ID0gZnhk
cl9oeXBlcih0bCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgTkZTVjRPUEVOX0xJTUlUQkxPQ0tT
OgorCQkJCQlkcC0+bmZzZGxfc2l6ZWxpbWl0ID0KKwkJCQkJICAgIGZ4ZHJfdW5zaWduZWQodV9p
bnQ2NF90LCAqdGwrKyk7CisJCQkJCWRwLT5uZnNkbF9zaXplbGltaXQgKj0KKwkJCQkJICAgIGZ4
ZHJfdW5zaWduZWQodV9pbnQ2NF90LCAqdGwpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0Ogor
CQkJCQllcnJvciA9IE5GU0VSUl9CQURYRFI7CisJCQkJCWdvdG8gbmZzbW91dDsKKwkJCQl9Owor
CQkJfSBlbHNlIHsKKwkJCQlkcC0+bmZzZGxfZmxhZ3MgPSBORlNDTERMX1JFQUQ7CisJCQl9CisJ
CQlpZiAocmV0ICE9IDApCisJCQkJZHAtPm5mc2RsX2ZsYWdzIHw9IE5GU0NMRExfUkVDQUxMOwor
CQkJZXJyb3IgPSBuZnNydl9kaXNzZWN0YWNlKG5kLCAmZHAtPm5mc2RsX2FjZSwgJnJldCwKKwkJ
CSAgICAmYWNlc2l6ZSwgcCk7CisJCQlpZiAoZXJyb3IgIT0gMCkKKwkJCQlnb3RvIG5mc21vdXQ7
CisJCX0gZWxzZSBpZiAoZGVsZWcgIT0gTkZTVjRPUEVOX0RFTEVHQVRFTk9ORSkgeworCQkJZXJy
b3IgPSBORlNFUlJfQkFEWERSOworCQkJZ290byBuZnNtb3V0OworCQl9CisKKwkJLyogTm93LCB3
ZSBzaG91bGQgaGF2ZSB0aGUgc3RhdHVzIGZvciB0aGUgU2F2ZUZILiAqLworCQlORlNNX0RJU1NF
Q1QodGwsIHVpbnQzMl90ICosIDIgKiBORlNYX1VOU0lHTkVEKTsKKwkJaWYgKCorK3RsID09IDAp
IHsKKwkJCU5GU0NMX0RFQlVHKDQsICJuZnNycGNfY3JlYXRlbGF5b3V0IFNhdmVGSCBva1xuIik7
CisJCQkvKgorCQkJICogTm93LCBwcm9jZXNzIHRoZSBHZXRGSCBhbmQgR2V0YXR0ciBmb3IgdGhl
IG5ld2x5CisJCQkgKiBjcmVhdGVkIGZpbGUuIG5mc2NsX210b2ZoKCkgd2lsbCBzZXQKKwkJCSAq
IE5EX05PTU9SRURBVEEgaWYgdGhlc2Ugd2VyZW4ndCBzdWNjZXNzZnVsLgorCQkJICovCisJCQll
cnJvciA9IG5mc2NsX210b2ZoKG5kLCBuZmhwcCwgbm5hcCwgYXR0cmZsYWdwKTsKKwkJCU5GU0NM
X0RFQlVHKDQsICJhZnQgbmZzY2xfbXRvZmggZXJyPSVkXG4iLCBlcnJvcik7CisJCQlpZiAoZXJy
b3IgIT0gMCkKKwkJCQlnb3RvIG5mc21vdXQ7CisJCX0gZWxzZQorCQkJbmQtPm5kX2ZsYWcgfD0g
TkRfTk9NT1JFREFUQTsKKwkJLyogTm93IHdlIGhhdmUgdGhlIFB1dEZIIGFuZCBHZXRhdHRyIGZv
ciB0aGUgZGlyZWN0b3J5LiAqLworCQlpZiAoKG5kLT5uZF9mbGFnICYgTkRfTk9NT1JFREFUQSkg
PT0gMCkgeworCQkJTkZTTV9ESVNTRUNUKHRsLCB1aW50MzJfdCAqLCAyICogTkZTWF9VTlNJR05F
RCk7CisJCQlpZiAoKisrdGwgIT0gMCkKKwkJCQluZC0+bmRfZmxhZyB8PSBORF9OT01PUkVEQVRB
OworCQkJZWxzZSB7CisJCQkJTkZTTV9ESVNTRUNUKHRsLCB1aW50MzJfdCAqLCAyICoKKwkJCQkg
ICAgTkZTWF9VTlNJR05FRCk7CisJCQkJaWYgKCorK3RsICE9IDApCisJCQkJCW5kLT5uZF9mbGFn
IHw9IE5EX05PTU9SRURBVEE7CisJCQl9CisJCX0KKwkJaWYgKChuZC0+bmRfZmxhZyAmIE5EX05P
TU9SRURBVEEpID09IDApIHsKKwkJCS8qIExvYWQgdGhlIGRpcmVjdG9yeSBhdHRyaWJ1dGVzLiAq
LworCQkJZXJyb3IgPSBuZnNtX2xvYWRhdHRyKG5kLCBkbmFwKTsKKwkJCU5GU0NMX0RFQlVHKDQs
ICJhZnQgbmZzbV9sb2FkYXR0ciBlcnI9JWRcbiIsIGVycm9yKTsKKwkJCWlmIChlcnJvciAhPSAw
KQorCQkJCWdvdG8gbmZzbW91dDsKKwkJCSpkYXR0cmZsYWdwID0gMTsKKwkJCWlmIChkcCAhPSBO
VUxMICYmICphdHRyZmxhZ3AgIT0gMCkgeworCQkJCWRwLT5uZnNkbF9jaGFuZ2UgPSBubmFwLT5u
YV9maWxlcmV2OworCQkJCWRwLT5uZnNkbF9tb2R0aW1lID0gbm5hcC0+bmFfbXRpbWU7CisJCQkJ
ZHAtPm5mc2RsX2ZsYWdzIHw9IE5GU0NMRExfTU9EVElNRVNFVDsKKwkJCX0KKwkJCS8qCisJCQkg
KiBXZSBjYW4gbm93IGNvbXBsZXRlIHRoZSBPcGVuIHN0YXRlLgorCQkJICovCisJCQluZmhwID0g
Km5maHBwOworCQkJaWYgKGRwICE9IE5VTEwpIHsKKwkJCQlkcC0+bmZzZGxfZmhsZW4gPSBuZmhw
LT5uZmhfbGVuOworCQkJCU5GU0JDT1BZKG5maHAtPm5maF9maCwgZHAtPm5mc2RsX2ZoLAorCQkJ
CSAgICBuZmhwLT5uZmhfbGVuKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBHZXQgYW4gT3BlbiBzdHJ1
Y3R1cmUgdGhhdCB3aWxsIGJlCisJCQkgKiBhdHRhY2hlZCB0byB0aGUgT3Blbk93bmVyLCBhY3F1
aXJlZCBhbHJlYWR5LgorCQkJICovCisJCQllcnJvciA9IG5mc2NsX29wZW4oZHZwLCBuZmhwLT5u
ZmhfZmgsIG5maHAtPm5maF9sZW4sIAorCQkJICAgIChORlNWNE9QRU5fQUNDRVNTV1JJVEUgfCBO
RlNWNE9QRU5fQUNDRVNTUkVBRCksIDAsCisJCQkgICAgY3JlZCwgcCwgTlVMTCwgJm9wLCAmbmV3
b25lLCBOVUxMLCAwKTsKKwkJCWlmIChlcnJvciAhPSAwKQorCQkJCWdvdG8gbmZzbW91dDsKKwkJ
CW9wLT5uZnNvX3N0YXRlaWQgPSBzdGF0ZWlkOworCQkJbmV3bmZzX2NvcHlpbmNyZWQoY3JlZCwg
Jm9wLT5uZnNvX2NyZWQpOworCQorCQkJbmZzY2xfb3BlbnJlbGVhc2Uobm1wLCBvcCwgZXJyb3Is
IG5ld29uZSk7CisJCQkqdW5sb2NrZWRwID0gMTsKKworCQkJLyogTm93LCBoYW5kbGUgdGhlIFJl
c3RvcmVGSCBhbmQgTGF5b3V0R2V0LiAqLworCQkJaWYgKG5kLT5uZF9yZXBzdGF0ID09IDApIHsK
KwkJCQlORlNNX0RJU1NFQ1QodGwsIHVpbnQzMl90ICosIDQgKiBORlNYX1VOU0lHTkVEKTsKKwkJ
CQkqbGF5c3RhdHAgPSBmeGRyX3Vuc2lnbmVkKGludCwgKih0bCArIDMpKTsKKwkJCQlpZiAoKmxh
eXN0YXRwID09IDApIHsKKwkJCQkJZXJyb3IgPSBuZnNydl9wYXJzZWxheW91dGdldChuZCwKKwkJ
CQkJICAgIHN0YXRlaWRwLCByZXRvbmNsb3NlcCwgZmxocCk7CisJCQkJCWlmIChlcnJvciAhPSAw
KQorCQkJCQkJKmxheXN0YXRwID0gZXJyb3I7CisJCQkJfQorCQkJCU5GU0NMX0RFQlVHKDQsICJh
ZnQgbmZzcnZfcGFyc2VsYXlvdXQgZXJyPSVkXG4iLAorCQkJCSAgICBlcnJvcik7CisJCQl9IGVs
c2UKKwkJCQluZC0+bmRfcmVwc3RhdCA9IDA7CisJCX0KKwl9CisJaWYgKG5kLT5uZF9yZXBzdGF0
ICE9IDAgJiYgZXJyb3IgPT0gMCkKKwkJZXJyb3IgPSBuZC0+bmRfcmVwc3RhdDsKKwlpZiAoZXJy
b3IgPT0gTkZTRVJSX1NUQUxFQ0xJRU5USUQgfHwgZXJyb3IgPT0gTkZTRVJSX0JBRFNFU1NJT04p
CisJCW5mc2NsX2luaXRpYXRlX3JlY292ZXJ5KG93cC0+bmZzb3dfY2xwKTsKK25mc21vdXQ6CisJ
TkZTQ0xfREVCVUcoNCwgImVvIG5mc3JwY19jcmVhdGVsYXlvdXQgZXJyPSVkXG4iLCBlcnJvcik7
CisJaWYgKGVycm9yID09IDApCisJCSpkcHAgPSBkcDsKKwllbHNlCisJCWZyZWUoZHAsIE1fTkZT
Q0xERUxFRyk7CisJbWJ1Zl9mcmVlbShuZC0+bmRfbXJlcCk7CisJcmV0dXJuIChlcnJvcik7Cit9
CisKKy8qCisgKiBTaW1pbGFyIHRvIG5mc3JwY19nZXRvcGVubGF5b3V0KCksIGV4Y2VwdCB0aGF0
IGl0IHVzZWQgZm9yIHRoZSBDcmVhdGUgY2FzZS4KKyAqLworc3RhdGljIGludAorbmZzcnBjX2dl
dGNyZWF0ZWxheW91dCh2bm9kZV90IGR2cCwgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIHN0cnVj
dCB2YXR0ciAqdmFwLAorICAgIG5mc3F1YWRfdCBjdmVyZiwgaW50IGZtb2RlLCBzdHJ1Y3QgbmZz
Y2xvd25lciAqb3dwLCBzdHJ1Y3QgbmZzY2xkZWxlZyAqKmRwcCwKKyAgICBzdHJ1Y3QgdWNyZWQg
KmNyZWQsIE5GU1BST0NfVCAqcCwgc3RydWN0IG5mc3ZhdHRyICpkbmFwLAorICAgIHN0cnVjdCBu
ZnN2YXR0ciAqbm5hcCwgc3RydWN0IG5mc2ZoICoqbmZocHAsIGludCAqYXR0cmZsYWdwLAorICAg
IGludCAqZGF0dHJmbGFncCwgdm9pZCAqZHN0dWZmLCBpbnQgKnVubG9ja2VkcCkKK3sKKwlzdHJ1
Y3QgbmZzY2xsYXlvdXQgKmx5cDsKKwlzdHJ1Y3QgbmZzY2xmbGF5b3V0aGVhZCBmbGg7CisJc3Ry
dWN0IG5mc2ZoICpuZmhwOworCXN0cnVjdCBuZnNjbHNlc3Npb24gKnRzZXA7CisJc3RydWN0IG5m
c21vdW50ICpubXA7CisJbmZzdjRzdGF0ZWlkX3Qgc3RhdGVpZDsKKwlpbnQgZXJyb3IsIGxheW91
dGxlbiwgcmV0b25jbG9zZSwgbGF5c3RhdDsKKworCWVycm9yID0gMDsKKwlubXAgPSBWRlNUT05G
UyhkdnAtPnZfbW91bnQpOworCUxJU1RfSU5JVCgmZmxoKTsKKwl0c2VwID0gbmZzbW50X21kc3Nl
c3Npb24obm1wKTsKKwlsYXlvdXRsZW4gPSB0c2VwLT5uZnNlc3NfbWF4Y2FjaGUgLSAoTkZTWF9T
VEFURUlEICsgMyAqIE5GU1hfVU5TSUdORUQpOworCWVycm9yID0gbmZzcnBjX2NyZWF0ZWxheW91
dChkdnAsIG5hbWUsIG5hbWVsZW4sIHZhcCwgY3ZlcmYsIGZtb2RlLAorCSAgICBvd3AsIGRwcCwg
Y3JlZCwgcCwgZG5hcCwgbm5hcCwgbmZocHAsIGF0dHJmbGFncCwgZGF0dHJmbGFncCwKKwkgICAg
ZHN0dWZmLCB1bmxvY2tlZHAsICZzdGF0ZWlkLCAxLCBsYXlvdXRsZW4sICZyZXRvbmNsb3NlLCAm
ZmxoLAorCSAgICAmbGF5c3RhdCk7CisJTkZTQ0xfREVCVUcoNCwgImFmdCBuZnNycGNfY3JlYXRl
bGF5b3V0cnBjIGxheXN0YXQ9JWQgZXJyPSVkXG4iLAorCSAgICBsYXlzdGF0LCBlcnJvcik7CisJ
bHlwID0gTlVMTDsKKwluZmhwID0gKm5maHBwOworCWxheXN0YXQgPSBuZnNycGNfbGF5b3V0Z2V0
cmVzKG5tcCwgZHZwLCBuZmhwLT5uZmhfZmgsIG5maHAtPm5maF9sZW4sCisJICAgICZzdGF0ZWlk
LCByZXRvbmNsb3NlLCBOVUxMLCAmbHlwLCAmZmxoLCBsYXlzdGF0LCBOVUxMLCBjcmVkLCBwKTsK
KwlpZiAobGF5c3RhdCA9PSAwKQorCQluZnNjbF9yZWxsYXlvdXQobHlwLCAwKTsKKwlyZXR1cm4g
KGVycm9yKTsKK30KKworLyoKKyAqIFByb2Nlc3MgdGhlIHJlc3VsdHMgb2YgYSBsYXlvdXRnZXQo
KSBvcGVyYXRpb24uCisgKi8KK3N0YXRpYyBpbnQKK25mc3JwY19sYXlvdXRnZXRyZXMoc3RydWN0
IG5mc21vdW50ICpubXAsIHZub2RlX3QgdnAsIHVpbnQ4X3QgKm5ld2ZocCwKKyAgICBpbnQgbmV3
ZmhsZW4sIG5mc3Y0c3RhdGVpZF90ICpzdGF0ZWlkcCwgaW50IHJldG9uY2xvc2UsIHVpbnQzMl90
ICpub3RpZnliaXQsCisgICAgc3RydWN0IG5mc2NsbGF5b3V0ICoqbHlwcCwgc3RydWN0IG5mc2Ns
ZmxheW91dGhlYWQgKmZsaHAsCisgICAgaW50IGxheXN0YXQsIGludCAqaXNsb2NrZWRwLCBzdHJ1
Y3QgdWNyZWQgKmNyZWQsIE5GU1BST0NfVCAqcCkKK3sKKwlzdHJ1Y3QgbmZzY2xmbGF5b3V0ICp0
ZmxwOworCXN0cnVjdCBuZnNjbGRldmluZm8gKmRpcDsKKworCWlmIChsYXlzdGF0ID09IE5GU0VS
Ul9VTktOTEFZT1VUVFlQRSkgeworCQkvKiBEaXNhYmxlIFBORlMuICovCisJCU5GU0NMX0RFQlVH
KDEsICJkaXNhYmxlIFBORlNcbiIpOworCQlORlNMT0NLTU5UKG5tcCk7CisJCW5tcC0+bm1fc3Rh
dGUgJj0gfk5GU1NUQV9QTkZTOworCQlORlNVTkxPQ0tNTlQobm1wKTsKKwl9CisJaWYgKGxheXN0
YXQgPT0gMCkgeworCQlORlNDTF9ERUJVRyg0LCAibmZzcnBjX2xheW91dGdldHJlcyBhdCBGT1JF
QUNIXG4iKTsKKwkJTElTVF9GT1JFQUNIKHRmbHAsIGZsaHAsIG5mc2ZsX2xpc3QpIHsKKwkJCWxh
eXN0YXQgPSBuZnNjbF9hZGRkZXZpbmZvKG5tcCwgTlVMTCwgdGZscCk7CisJCQlORlNDTF9ERUJV
Ryg0LCAiYWZ0IGFkZGRldj0lZFxuIiwgbGF5c3RhdCk7CisJCQlpZiAobGF5c3RhdCAhPSAwKSB7
CisJCQkJbGF5c3RhdCA9IG5mc3JwY19nZXRkZXZpY2VpbmZvKG5tcCwKKwkJCQkgICAgdGZscC0+
bmZzZmxfZGV2LCBORlNMQVlPVVRfTkZTVjRfMV9GSUxFUywKKwkJCQkgICAgbm90aWZ5Yml0LCAm
ZGlwLCBjcmVkLCBwKTsKKwkJCQlORlNDTF9ERUJVRyg0LCAiYWZ0IG5mc3JwY19nZGk9JWRcbiIs
CisJCQkJICAgIGxheXN0YXQpOworCQkJCWlmIChsYXlzdGF0ICE9IDApCisJCQkJCWJyZWFrOwor
CQkJCWxheXN0YXQgPSBuZnNjbF9hZGRkZXZpbmZvKG5tcCwgZGlwLCB0ZmxwKTsKKwkJCQlpZiAo
bGF5c3RhdCAhPSAwKQorCQkJCQlwcmludGYoImdldGxheW91dDogY2Fubm90IGFkZFxuIik7CisJ
CQl9CisJCX0KKwl9CisJaWYgKGxheXN0YXQgPT0gMCkgeworCQkvKgorCQkgKiBuZnNjbF9sYXlv
dXQoKSBhbHdheXMgcmV0dXJucyB3aXRoIHRoZSBuZnNseV9sb2NrCisJCSAqIHNldCB0byBhIHJl
ZmNudCAoc2hhcmVkIGxvY2spLgorCQkgKiBQYXNzaW5nIGluIGR2cCBpcyBzdWZmaWNpZW50LCBz
aW5jZSBpdCBpcyBvbmx5IHVzZWQgdG8KKwkJICogZ2V0IHRoZSBmc2lkIGZvciB0aGUgZmlsZSBz
eXN0ZW0uCisJCSAqLworCQlsYXlzdGF0ID0gbmZzY2xfbGF5b3V0KG5tcCwgdnAsIG5ld2ZocCwg
bmV3ZmhsZW4sIHN0YXRlaWRwLAorCQkgICAgcmV0b25jbG9zZSwgZmxocCwgbHlwcCwgY3JlZCwg
cCk7CisJCU5GU0NMX0RFQlVHKDQsICJuZnNycGNfbGF5b3V0Z2V0cmVzOiBhZnQgbmZzY2xfbGF5
b3V0PSVkXG4iLAorCQkgICAgbGF5c3RhdCk7CisJCWlmIChsYXlzdGF0ID09IDAgJiYgaXNsb2Nr
ZWRwICE9IE5VTEwpCisJCQkqaXNsb2NrZWRwID0gMTsKKwl9CisJcmV0dXJuIChsYXlzdGF0KTsK
K30KKwotLS0gdXNyLmJpbi9uZnNzdGF0L25mc3N0YXQuYy5vcmlnCTIwMTctMDUtMTkgMTQ6MDI6
MjIuMzM2MzU4MDAwIC0wNDAwCisrKyB1c3IuYmluL25mc3N0YXQvbmZzc3RhdC5jCTIwMTctMDUt
MTkgMTQ6MDI6MjIuMzM3MDQ1MDAwIC0wNDAwCkBAIC05MjYsNiArOTI2LDEzIEBAIGV4cDQxX2lu
dHByKGludCBjbGllbnRPbmx5LCBpbnQgc2VydmVyT24KIAkJICAgICh1aW50bWF4X3QpZXh0X25m
c3N0YXRzLnJwY2NudFtORlNQUk9DX0NPTU1JVERTXSk7CiAJCWlmIChwcmludHRpdGxlKQogCQkJ
cHJpbnRmKAorCQkJICAgICIlMTIuMTJzICUxMi4xMnNcbiIsCisJCQkgICAgIk9wZW5MYXlvdXQi
LCAiQ3JlYXRlTGF5b3V0Iik7CisJCXByaW50ZigiJTEyanUgJTEyanVcbiIsCisJCSAgICAodWlu
dG1heF90KWV4dF9uZnNzdGF0cy5ycGNjbnRbTkZTUFJPQ19PUEVOTEFZR0VUXSwKKwkJICAgICh1
aW50bWF4X3QpZXh0X25mc3N0YXRzLnJwY2NudFtORlNQUk9DX0NSRUFURUxBWUdFVF0pOworCQlp
ZiAocHJpbnR0aXRsZSkKKwkJCXByaW50ZigKIAkJCSAgICAiJTEyLjEycyAlMTIuMTJzICUxMi4x
MnMgJTEyLjEycyAlMTIuMTJzICUxMi4xMnNcbiIsCiAJCQkgICAgIk9wZW5Pd25lciIsICJPcGVu
cyIsICJMb2NrT3duZXIiLCAiTG9ja3MiLAogCQkJICAgICJEZWxlZ3MiLCAiTG9jYWxPd24iKTsK

--_002_YTXPR01MB018901BE4BA7E9780F4B430BDDDB0YTXPR01MB0189CANP_--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?YTXPR01MB018901BE4BA7E9780F4B430BDDDB0>