Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 2 Sep 2009 01:34:18 +0800
From:      Fang Wang <wangfangcs@gmail.com>
To:        freebsd-net@freebsd.org
Subject:   TCP UTO (RFC 5482) patch calls for review
Message-ID:  <abd04180909011034p1e2fc211v126fff410fa032e5@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
--0050450176f461d4580472878f74
Content-Type: text/plain; charset=ISO-8859-1

Hi,

The attached patch implements TCP User Timeout Option(RFC 5482 [0]) in
freebsd tcp stack.  And this patch comes from my GSoC 2009 project --
Implement TCP UTO(mentor, Rui Paulo).  I will be very grateful to any
tips, suggestions and questions.

Brief introduction about TCP UTO:
    The TCP user timeout controls how long transmitted data may remain
unacknowledged before a connection is forcefully closed. It is a
local, per-connection parameter. TCP User Timeout Option allows one
end of a TCP connection to advertise it's current user timeout value.
This information provides advice to the other end of the TCP
connection to adapt it's user timeout accordingly. Increasing the user
timeouts on both ends of a TCP connection allows it to survive
extended periods without end-to-end connectivity. Decreasing the user
timeouts allows busy servers to explicitly notify their clients that
they will maintain the connection state only for a short time without
connectivity.

[0] - http://tools.ietf.org/html/rfc5482

Best Regards,
Fang Wang

--0050450176f461d4580472878f74
Content-Type: text/x-patch; charset=US-ASCII; name="tcputo.diff"
Content-Disposition: attachment; filename="tcputo.diff"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_fz2w5egd0

SW5kZXg6IHN5cy9uZXRpbmV0L3RjcF9pbnB1dC5jCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9uZXRpbmV0
L3RjcF9pbnB1dC5jCShyZXZpc2lvbiAxOTY0NTUpCisrKyBzeXMvbmV0aW5ldC90Y3BfaW5wdXQu
Ywkod29ya2luZyBjb3B5KQpAQCAtMTE5Niw2ICsxMTk2LDE5IEBACiAJICAgICh0aGZsYWdzICYg
VEhfU1lOKSA/IFRPX1NZTiA6IDApOwogCiAJLyoKKwkgKiBJZiB0aGUgVENQIHVzZXIgdGltZW91
dCBvcHRpb24gaXMgcHJlc2VudCwgcmVjb3JkIGl0IGJ1dAorCSAqIGRvIG5vdGhpbmcgYmVjYXVz
ZSBpdCdzIGFuIG9wdGlvbmFsIG9wdGlvbi4KKwkgKiBXZSB3aWxsIHByb2Nlc3Mgb24gdGhlIGZv
bGxvd2luZyBjYXNlczoKKwkgKiAgICAxLiBXZSBuZWVkIGRvIHJldHJhbnNtaXNzaW9uLgorCSAq
ICAgIDIuIFVzZXJzIHJlcXVlc3QgYSBVVE8gdmFsdWUuCisJICovCisJaWYgKHRvLnRvX2ZsYWdz
ICYgVE9GX1VUTykgeworCQl0cC0+dXRvX2ZsYWdzIHw9IFRDUFVUT19SQ1ZEOworCQl0cC0+cmN2
X3V0byA9IHRvLnRvX3V0bzsKKwkJVENQU1RBVF9JTkModGNwc19yY3Z1dG8pOworCX0KKwkKKwkv
KgogCSAqIElmIGVjaG9lZCB0aW1lc3RhbXAgaXMgbGF0ZXIgdGhhbiB0aGUgY3VycmVudCB0aW1l
LAogCSAqIGZhbGwgYmFjayB0byBub24gUkZDMTMyMyBSVFQgY2FsY3VsYXRpb24uICBOb3JtYWxp
emUKIAkgKiB0aW1lc3RhbXAgaWYgc3luY29va2llcyB3ZXJlIHVzZWQgd2hlbiB0aGlzIGNvbm5l
Y3Rpb24KQEAgLTIyNDcsNiArMjI2MCwxNCBAQAogCQl9CiAKIHByb2Nlc3NfQUNLOgorCQkvKgor
CQkgKiBJZiByZWNlaXZlZCBhbiBBQ0sgZm9yIGEgcHJldmlvdXNseSBzZW50IFRDUCBVVE8gb3B0
aW9uLAorCQkgKiBzdG9wIGluY2x1ZGluZyB0aGUgVENQIFVUTyBvcHRpb24gb24gb3V0cHV0IHBh
Y2tldHMuCisJCSAqLworCQlpZiAodHAtPnV0b19mbGFncyAmIFRDUFVUT19TRU5ESU5HKQorCQkJ
aWYgKFNFUV9HRVEodGgtPnRoX2FjaywgdHAtPnV0b19jYXJyaWVyKSkKKwkJCQl0cC0+dXRvX2Zs
YWdzICY9IH5UQ1BVVE9fU0VORElORzsKKwogCQlJTlBfSU5GT19MT0NLX0FTU0VSVCgmVl90Y2Jp
bmZvKTsKIAkJS0FTU0VSVCh0aV9sb2NrZWQgPT0gVElfUkxPQ0tFRCB8fCB0aV9sb2NrZWQgPT0g
VElfV0xPQ0tFRCwKIAkJICAgICgidGNwX2lucHV0OiBwcm9jZXNzX0FDSyB0aV9sb2NrZWQgJWQi
LCB0aV9sb2NrZWQpKTsKQEAgLTI5NTMsNiArMjk3NCwxNCBAQAogCQkJdG8tPnRvX3NhY2tzID0g
Y3AgKyAyOwogCQkJVENQU1RBVF9JTkModGNwc19zYWNrX3Jjdl9ibG9ja3MpOwogCQkJYnJlYWs7
CisJCWNhc2UgVENQT1BUX1VUTzoKKwkJCWlmIChvcHRsZW4gIT0gVENQT0xFTl9VVE8pCisJCQkJ
Y29udGludWU7CisJCQl0by0+dG9fZmxhZ3MgfD0gVE9GX1VUTzsKKwkJCWJjb3B5KChjaGFyICop
Y3AgKyAyLAorCQkJICAgIChjaGFyICopJnRvLT50b191dG8sIHNpemVvZih0by0+dG9fdXRvKSk7
CisJCQl0by0+dG9fdXRvID0gbnRvaHModG8tPnRvX3V0byk7CisJCQlicmVhazsKIAkJZGVmYXVs
dDoKIAkJCWNvbnRpbnVlOwogCQl9CkluZGV4OiBzeXMvbmV0aW5ldC90Y3Bfc3Vici5jCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIHN5cy9uZXRpbmV0L3RjcF9zdWJyLmMJKHJldmlzaW9uIDE5NjQ1NSkKKysrIHN5
cy9uZXRpbmV0L3RjcF9zdWJyLmMJKHdvcmtpbmcgY29weSkKQEAgLTMzNiw2ICszMzYsNyBAQAog
CVZfdGNwX2F1dG9yY3ZidWZfbWF4ID0gMjU2KjEwMjQ7CiAJVl90Y3BfZG9fcmZjMzQ2NSA9IDE7
CiAJVl90Y3BfYWJjX2xfdmFyID0gMjsKKwlWX3RjcF91dG9fZW5hYmxlID0gMDsKIAogCVZfdGNw
X21zc2RmbHQgPSBUQ1BfTVNTOwogI2lmZGVmIElORVQ2CkBAIC00MTksNiArNDIwLDggQEAKIAl0
Y3BfcmV4bWl0X3Nsb3AgPSBUQ1BUVl9DUFVfVkFSOwogCXRjcF9maW53YWl0Ml90aW1lb3V0ID0g
VENQVFZfRklOV0FJVDJfVElNRU9VVDsKIAl0Y3BfdGNiaGFzaHNpemUgPSBoYXNoc2l6ZTsKKwlW
X3RjcF91dG9fbWluID0gVENQVFZfVVRPX01JTjsKKwlWX3RjcF91dG9fbWF4ID0gVENQVFZfVVRP
X01BWDsKIAogI2lmZGVmIElORVQ2CiAjZGVmaW5lIFRDUF9NSU5QUk9UT0hEUiAoc2l6ZW9mKHN0
cnVjdCBpcDZfaGRyKSArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSkKQEAgLTc3Myw3ICs3NzYsMTgg
QEAKIAl0cC0+c25kX3NzdGhyZXNoID0gVENQX01BWFdJTiA8PCBUQ1BfTUFYX1dJTlNISUZUOwog
CXRwLT50X3JjdnRpbWUgPSB0aWNrczsKIAl0cC0+dF9id19ydHR0aW1lID0gdGlja3M7CisKKwl0
cC0+dXRvX2ZsYWdzID0gVENQVVRPX0NIQU5HRUFCTEU7CisJaWYgKFZfdGNwX3V0b19lbmFibGUp
CisJCXRwLT51dG9fZmxhZ3MgfD0gVENQVVRPX0VOQUJMRTsKIAkvKgorCSAqIEFjY29yZGluZyB0
byBSRkMgNTQ4MiwgdF91dG9fYWR2IGlzIFVUTyBvcHRpb24gYWR2ZXJ0aXNlZCB0byB0aGUKKwkg
KiByZW1vdGUgVENQIHBlZXIuICBJdCBkZWZhdWx0cyB0byB0aGUgZGVmYXVsdCBzeXN0ZW0td2lk
ZSBVU0VSCisJICogVElNRU9VVC4KKwkgKi8KKwl0cC0+dF91dG9fYWR2ID0gVENQVFZfVVRPX0RF
RkFVTFQ7CisKKwkvKgogCSAqIElQdjQgVFRMIGluaXRpYWxpemF0aW9uIGlzIG5lY2Vzc2FyeSBm
b3IgYW4gSVB2NiBzb2NrZXQgYXMgd2VsbCwKIAkgKiBiZWNhdXNlIHRoZSBzb2NrZXQgbWF5IGJl
IGJvdW5kIHRvIGFuIElQdjYgd2lsZGNhcmQgYWRkcmVzcywKIAkgKiB3aGljaCBtYXkgbWF0Y2gg
YW4gSVB2NC1tYXBwZWQgSVB2NiBhZGRyZXNzLgpJbmRleDogc3lzL25ldGluZXQvdGNwX3RpbWVy
LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gc3lzL25ldGluZXQvdGNwX3RpbWVyLmMJKHJldmlzaW9uIDE5NjQ1
NSkKKysrIHN5cy9uZXRpbmV0L3RjcF90aW1lci5jCSh3b3JraW5nIGNvcHkpCkBAIC0xMTAsNyAr
MTEwLDIxIEBACiBTWVNDVExfUFJPQyhfbmV0X2luZXRfdGNwLCBPSURfQVVUTywgZmlud2FpdDJf
dGltZW91dCwgQ1RMVFlQRV9JTlR8Q1RMRkxBR19SVywKICAgICAmdGNwX2ZpbndhaXQyX3RpbWVv
dXQsIDAsIHN5c2N0bF9tc2VjX3RvX3RpY2tzLCAiSSIsICJGSU4tV0FJVDIgdGltZW91dCIpOwog
CitWTkVUX0RFRklORShpbnQsIHRjcF91dG9fbWluKTsKK1NZU0NUTF9WTkVUX1BST0MoX25ldF9p
bmV0X3RjcCwgT0lEX0FVVE8sIHV0b19taW4sIENUTFRZUEVfSU5UfENUTEZMQUdfUlcsCisgICAg
JlZORVRfTkFNRSh0Y3BfdXRvX21pbiksIDAsIHN5c2N0bF9tc2VjX3RvX3RpY2tzLCAiSSIsCisg
ICAgIk1pbmltdW4gVXNlciBUaW1lb3V0Iik7CiAKK1ZORVRfREVGSU5FKGludCwgdGNwX3V0b19t
YXgpOworU1lTQ1RMX1ZORVRfUFJPQyhfbmV0X2luZXRfdGNwLCBPSURfQVVUTywgdXRvX21heCwg
Q1RMVFlQRV9JTlR8Q1RMRkxBR19SVywKKyAgICAmVk5FVF9OQU1FKHRjcF91dG9fbWF4KSwgMCwg
c3lzY3RsX21zZWNfdG9fdGlja3MsICJJIiwKKyAgICAiTWF4aW11bSBVc2VyIFRpbWVvdXQiKTsK
KworVk5FVF9ERUZJTkUoaW50LCB0Y3BfdXRvX2VuYWJsZSk7CitTWVNDVExfVk5FVF9JTlQoX25l
dF9pbmV0X3RjcCwgT0lEX0FVVE8sIHV0b19hbHdheXMsIENUTFRZUEVfSU5UfENUTEZMQUdfUlcs
CisgICAgJlZORVRfTkFNRSh0Y3BfdXRvX2VuYWJsZSksIDAsCisgICAgIkVuYWJsZSBUQ1AgVVRP
IChSRkM1NDgyKSBvbiBldmVyeSBzb2NrZXQiKTsKKwogc3RhdGljIGludAl0Y3Bfa2VlcGNudCA9
IFRDUFRWX0tFRVBDTlQ7CiAJLyogbWF4IGlkbGUgcHJvYmVzICovCiBpbnQJdGNwX21heHBlcnNp
c3RpZGxlOwpAQCAtNDczLDEyICs0ODcsMjAgQEAKIAl9CiAJY2FsbG91dF9kZWFjdGl2YXRlKCZ0
cC0+dF90aW1lcnMtPnR0X3JleG10KTsKIAl0Y3BfZnJlZV9zYWNraG9sZXModHApOworCisJaWYg
KHRwLT50X3J4dHNoaWZ0ID09IDApIHsKKwkJVENQVF9SRVNPTFZFX1VUTyh0cCk7CisJCXRwLT50
X3V0b19sZWZ0ID0gdHAtPnRfdXRvX2ltcGwgLyBoejsKKwkJdHAtPnRfdXRvX2xlZnQgLT0gdGNw
X2JhY2tvZmZbMF07CisJfQogCS8qCiAJICogUmV0cmFuc21pc3Npb24gdGltZXIgd2VudCBvZmYu
ICBNZXNzYWdlIGhhcyBub3QKIAkgKiBiZWVuIGFja2VkIHdpdGhpbiByZXRyYW5zbWl0IGludGVy
dmFsLiAgQmFjayBvZmYKIAkgKiB0byBhIGxvbmdlciByZXRyYW5zbWl0IGludGVydmFsIGFuZCBy
ZXRyYW5zbWl0IG9uZSBzZWdtZW50LgogCSAqLwotCWlmICgrK3RwLT50X3J4dHNoaWZ0ID4gVENQ
X01BWFJYVFNISUZUKSB7CisJaWYgKCgrK3RwLT50X3J4dHNoaWZ0ID4gVENQX01BWFJYVFNISUZU
ICYmCisJICAgICh0cC0+dXRvX2ZsYWdzICYgVENQVVRPX0lNUEwpID09IDApIHx8CisJICAgICh0
cC0+dF91dG9fbGVmdCA9PSAwICYmIHRwLT51dG9fZmxhZ3MgJiBUQ1BVVE9fSU1QTCkpIHsKIAkJ
dHAtPnRfcnh0c2hpZnQgPSBUQ1BfTUFYUlhUU0hJRlQ7CiAJCVRDUFNUQVRfSU5DKHRjcHNfdGlt
ZW91dGRyb3ApOwogCQl0cCA9IHRjcF9kcm9wKHRwLCB0cC0+dF9zb2Z0ZXJyb3IgPwpAQCAtNTEw
LDkgKzUzMiwyNyBAQAogCWlmICh0cC0+dF9zdGF0ZSA9PSBUQ1BTX1NZTl9TRU5UKQogCQlyZXht
dCA9IFRDUF9SRVhNVFZBTCh0cCkgKiB0Y3Bfc3luX2JhY2tvZmZbdHAtPnRfcnh0c2hpZnRdOwog
CWVsc2UKLQkJcmV4bXQgPSBUQ1BfUkVYTVRWQUwodHApICogdGNwX2JhY2tvZmZbdHAtPnRfcnh0
c2hpZnRdOwotCVRDUFRfUkFOR0VTRVQodHAtPnRfcnh0Y3VyLCByZXhtdCwKLQkJICAgICAgdHAt
PnRfcnR0bWluLCBUQ1BUVl9SRVhNVE1BWCk7CisJCWlmICgodHAtPnV0b19mbGFncyAmIFRDUFVU
T19JTVBMKSA9PSAwKSB7CisJCQlyZXhtdCA9IFRDUF9SRVhNVFZBTCh0cCkgKiB0Y3BfYmFja29m
Zlt0cC0+dF9yeHRzaGlmdF07CisJCQlUQ1BUX1JBTkdFU0VUKHRwLT50X3J4dGN1ciwgcmV4bXQs
IHRwLT50X3J0dG1pbiwKKwkJCSAgICBUQ1BUVl9SRVhNVE1BWCk7CisJCX0gZWxzZSB7CisJCQlp
bnQgcnh0c2hpZnQsIGludGVydmFsOworCQkJcnh0c2hpZnQgPSBtaW4oVENQX01BWFJYVFNISUZU
LCB0cC0+dF9yeHRzaGlmdCk7CisJCQlpbnRlcnZhbCA9IG1pbihUQ1BfUkVYTVRNQVgsIHRjcF9i
YWNrb2ZmW3J4dHNoaWZ0XSk7CisJCQlyZXhtdCA9IFRDUF9SRVhNVFZBTCh0cCkgKiB0Y3BfYmFj
a29mZltyeHRzaGlmdF07CisJCQlUQ1BUX1JBTkdFU0VUKHRwLT50X3J4dGN1ciwgcmV4bXQsCisJ
CQkgICAgdHAtPnRfcnR0bWluLCBUQ1BUVl9SRVhNVE1BWCk7CisJCQlpZiAodHAtPnRfdXRvX2xl
ZnQgPCBpbnRlcnZhbCkgeworCQkJCXRwLT50X3J4dGN1ciA9ICh0cC0+dF9yeHRjdXIgKiB0cC0+
dF91dG9fbGVmdCkKKwkJCQkgICAgLyBpbnRlcnZhbDsKKwkJCQkvKiBQcmV2ZW50IHRfcnh0Y3Vy
IGZyb20gcmVhY2hpbmcgemVybyAqLworCQkJCVRDUFRfUkFOR0VTRVQodHAtPnRfcnh0Y3VyLCB0
cC0+dF9yeHRjdXIsCisJCQkJICAgIHRwLT50X3J0dG1pbiwgVENQVFZfUkVYTVRNQVgpOworCQkJ
fQorCQkJdHAtPnRfdXRvX2xlZnQgLT0gbWluKHRwLT50X3V0b19sZWZ0LCBpbnRlcnZhbCk7CisJ
CX0KKwogCS8qCiAJICogRGlzYWJsZSByZmMxMzIzIGlmIHdlIGhhdm4ndCBnb3QgYW55IHJlc3Bv
bnNlIHRvCiAJICogb3VyIHRoaXJkIFNZTiB0byB3b3JrLWFyb3VuZCBzb21lIGJyb2tlbiB0ZXJt
aW5hbCBzZXJ2ZXJzCkluZGV4OiBzeXMvbmV0aW5ldC90Y3BfdGltZXIuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBzeXMvbmV0aW5ldC90Y3BfdGltZXIuaAkocmV2aXNpb24gMTk2NDU1KQorKysgc3lzL25ldGlu
ZXQvdGNwX3RpbWVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTkxLDYgKzkxLDEwIEBACiAKICNkZWZp
bmUgVENQVFZfRklOV0FJVDJfVElNRU9VVCAoNjAqaHopICAgICAgICAgLyogRklOX1dBSVRfMiB0
aW1lb3V0IGlmIG5vIHJlY2VpdmVyICovCiAKKyNkZWZpbmUJVENQVFZfVVRPX01JTgkJKCAxMjAq
aHopCS8qIG1pbiB1c2VyIHRpbWVvdXQgKi8KKyNkZWZpbmUJVENQVFZfVVRPX01BWAkJKDEwMjAq
aHopCS8qIG1heCB1c2VyIHRpbWVvdXQgKi8KKyNkZWZpbmUJVENQVFZfVVRPX0RFRkFVTFQJKCA1
MTEqaHopCS8qIGRlZmF1bHQgdXNlciB0aW1lb3V0ICovCisKIC8qCiAgKiBNaW5pbXVtIHJldHJh
bnNtaXQgdGltZXIgaXMgMyB0aWNrcywgZm9yIGFsZ29yaXRobWljIHN0YWJpbGl0eS4KICAqIFRD
UFRfUkFOR0VTRVQoKSB3aWxsIGFkZCBhbm90aGVyIFRDUFRWX0NQVV9WQVIgdG8gZGVhbCB3aXRo
CkBAIC0xMTMsOCArMTE3LDkgQEAKICAqLwogI2RlZmluZQlUQ1BUVl9NSU4JKCBoei8zMyApCQkv
KiBtaW5pbXVtIGFsbG93YWJsZSB2YWx1ZSAqLwogI2RlZmluZSBUQ1BUVl9DUFVfVkFSCSggaHov
NSApCQkvKiBjcHUgdmFyaWFuY2UgYWxsb3dlZCAoMjAwbXMpICovCi0jZGVmaW5lCVRDUFRWX1JF
WE1UTUFYCSggNjQqaHopCQkvKiBtYXggYWxsb3dhYmxlIFJFWE1UIHZhbHVlICovCi0KKyNkZWZp
bmUJVENQX1JFWE1UTUFYCTY0CQkJLyogbWF4IGFsbG93YWJsZSBSRVhNVCB2YWx1ZQorCQkJCQkJ
ICAgaW4gc2Vjb25kcyAqLworI2RlZmluZQlUQ1BUVl9SRVhNVE1BWAkoIFRDUF9SRVhNVE1BWCpo
eiApCS8qIG1heCBhbGxvd2FibGUgUkVYTVQgdmFsdWUgKi8KICNkZWZpbmUgVENQVFZfVFdUUlVO
Qwk4CQkJLyogUlRPIGZhY3RvciB0byB0cnVuY2F0ZSBUVyAqLwogCiAjZGVmaW5lCVRDUF9MSU5H
RVJUSU1FCTEyMAkJCS8qIGxpbmdlciBhdCBtb3N0IDIgbWludXRlcyAqLwpAQCAtMTY4LDcgKzE3
Myw2IEBACiAKIGV4dGVybiBpbnQgdGNwX2ZpbndhaXQyX3RpbWVvdXQ7CiBleHRlcm4gaW50IHRj
cF9mYXN0X2ZpbndhaXQyX3JlY3ljbGU7Ci0KIHZvaWQJdGNwX3RpbWVyX2luaXQodm9pZCk7CiB2
b2lkCXRjcF90aW1lcl8ybXNsKHZvaWQgKnh0cCk7CiBzdHJ1Y3QgdGNwdHcgKgpJbmRleDogc3lz
L25ldGluZXQvdGNwX3Zhci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9uZXRpbmV0L3RjcF92YXIuaAko
cmV2aXNpb24gMTk2NDU1KQorKysgc3lzL25ldGluZXQvdGNwX3Zhci5oCSh3b3JraW5nIGNvcHkp
CkBAIC0yMDAsOSArMjAwLDIxIEBACiAJdm9pZAkqdF90b2U7CQkJLyogVE9FIHBjYiBwb2ludGVy
ICovCiAJaW50CXRfYnl0ZXNfYWNrZWQ7CQkvKiAjIGJ5dGVzIGFja2VkIGR1cmluZyBjdXJyZW50
IFJUVCAqLwogCi0JaW50CXRfaXNwYXJlOwkJLyogZXhwbGljaXQgcGFkIGZvciA2NGJpdCBhbGln
bm1lbnQgKi8KKwkvKiBUQ1AgVXNlciBUaW1lb3V0IHZhcmlhYmxlcyAoUkZDIDU0ODIpICovCisg
CXVpbnQxNl90IHJjdl91dG87CQkvKiByZWNlaXZlZCB1c2VyIHRpbWVvdXQgKi8KKyAJdWludDE2
X3Qgc25kX3V0bzsJCS8qIHNlbmQgdXNlciB0aW1lb3V0ICovCisgCXVpbnQ4X3QJdXRvX2ZsYWdz
OworCS8qIEFsbCB2YWx1ZXMgaW4gdGlja3MgKi8KKyAJdV9pbnQJdF91dG9fYWR2OwkJLyogdXNl
ciB0aW1lb3V0IHNlbnQgdG8gcmVtb3RlIHBlZXIKKwkJCQkJICAgKHRpY2tzKSAqLworIAl1X2lu
dAl0X3V0b19pbXBsOwkJLyogaW1wbGVtZW50ZWQgdXNlciB0aW1lb3V0ICh0aWNrcykgKi8KKyAJ
dV9pbnQJdF91dG9fbGVmdDsJCS8qIHJlbWFpbmVkIHVzZXIgdGltZW91dCB2YWx1ZQorCQkJCQkg
ICAoc2Vjb25kcykgKi8KKyAJdGNwX3NlcQl1dG9fY2FycmllcjsJCS8qIG1heCBzZXF1ZW5jZSBu
dW1iZXIgdGhhdCBjYXJyeSB1c2VyCisJCQkJCSAgIHRpbWVvdXQgKi8KKwogCXZvaWQJKnRfcHNw
YXJlMls2XTsJCS8qIDIgQ0MgLyA0IFRCRCAqLwotCXVpbnQ2NF90IF9wYWRbMTJdOwkJLyogNyBV
VE8sIDUgVEJEICgxLTIgQ0MvUlRUPykgKi8KKwl1aW50NjRfdCBfcGFkWzhdOwkJLyogNyBUQkQg
KDEtMiBDQy9SVFQ/KSAqLwogfTsKIAogLyoKQEAgLTI0NSw2ICsyNTcsMzUgQEAKICNkZWZpbmUJ
VENQT09CX0hBVkVEQVRBCTB4MDEKICNkZWZpbmUJVENQT09CX0hBRERBVEEJMHgwMgogCisvKgor
ICogRmxhZ3MgZm9yIHRoZSB1dG9fZmxhZ3MgZmllbGQuCisgKi8KKyNkZWZpbmUJVENQVVRPX0VO
QUJMRQkweDAxCS8qIGVuYWJsZSB0Y3AgdXNlciB0aW1lb3V0ICovCisjZGVmaW5lCVRDUFVUT19D
SEFOR0VBQkxFIDB4MDIJLyogdXNlciB0aW1lb3V0IGNhbiBiZSBjaGFuZ2VkIGJ5IG90aGVyIHNp
ZGUgKi8KKyNkZWZpbmUJVENQVVRPX0lNUEwJMHgwNAkvKiBpbXBsZW1lbnQgdXNlciB0aW1lb3V0
ICovCisjZGVmaW5lCVRDUFVUT19SQ1ZECTB4MDgJLyogb3RoZXIgc2lkZSBoYXMgcmVxdWVzdGVk
IHVzZXIgdGltZW91dCAqLworI2RlZmluZQlUQ1BVVE9fTkVFRAkweDEwCS8qIHVzZXIgdGltZW91
dCBuZWVkcyB0byBiZSBzZW50ICovCisjZGVmaW5lCVRDUFVUT19TRU5ESU5HCTB4MjAJLyogdXNl
ciB0aW1lb3V0IGlzIGluIHRoZSBwcm9jZXNzIG9mIHNlbmRpbmcgKi8KKworLyoKKyAqIFJlc29s
dmUgdXNlciB0aW1lb3V0IHZhbHVlKHRpY2tzKS4KKyovCisjZGVmaW5lCVRDUFRfUkVTT0xWRV9V
VE8odHApIGRvIHsJCQkJXAorCWlmICgodHApLT51dG9fZmxhZ3MgJiBUQ1BVVE9fRU5BQkxFICYm
CQkJXAorCSAgICAodHApLT51dG9fZmxhZ3MgJiBUQ1BVVE9fUkNWRCAmJgkJCVwKKwkgICAgKHRw
KS0+dXRvX2ZsYWdzICYgVENQVVRPX0NIQU5HRUFCTEUpIHsJCVwKKwkJKHRwKS0+dF91dG9faW1w
bCA9ICh0cCktPnJjdl91dG8gPj4gMTsJCVwKKwkJaWYgKCh0cCktPnJjdl91dG8gJiAxKQkJCQlc
CisJCQkodHApLT50X3V0b19pbXBsICo9IDYwOwkJCVwKKwkJKHRwKS0+dF91dG9faW1wbCAqPSBo
ejsJCQkJXAorCQkodHApLT50X3V0b19pbXBsID0gbWluKHRjcF91dG9fbWF4LAkJXAorCQkgICAg
bWF4KCh0cCktPnRfdXRvX2FkdiwJCQlcCisJCSAgICBtYXgoKHRwKS0+dF91dG9faW1wbCwgdGNw
X3V0b19taW4pKSk7CVwKKwkJKHRwKS0+dXRvX2ZsYWdzICY9IH5UQ1BVVE9fUkNWRDsJCVwKKwkJ
KHRwKS0+dXRvX2ZsYWdzIHw9IFRDUFVUT19JTVBMOwkJCVwKKwl9CQkJCQkJCVwKK30gd2hpbGUo
MCkKKwogI2lmZGVmIFRDUF9TSUdOQVRVUkUKIC8qCiAgKiBEZWZpbmVzIHdoaWNoIGFyZSBuZWVk
ZWQgYnkgdGhlIHhmb3JtX3RjcCBtb2R1bGUgYW5kIHRjcF9baW58b3V0XXB1dApAQCAtMjc2LDcg
KzMxNyw4IEBACiAjZGVmaW5lCVRPRl9UUwkJMHgwMDEwCQkvKiB0aW1lc3RhbXAgKi8KICNkZWZp
bmUJVE9GX1NJR05BVFVSRQkweDAwNDAJCS8qIFRDUC1NRDUgc2lnbmF0dXJlIG9wdGlvbiAoUkZD
MjM4NSkgKi8KICNkZWZpbmUJVE9GX1NBQ0sJMHgwMDgwCQkvKiBQZWVyIHNlbnQgU0FDSyBvcHRp
b24gKi8KLSNkZWZpbmUJVE9GX01BWE9QVAkweDAxMDAKKyNkZWZpbmUJVE9GX1VUTwkJMHgwMTAw
CQkvKiB1c2VyIHRpbWVvdXQgKFJGQzU0ODIpICovCisjZGVmaW5lCVRPRl9NQVhPUFQJMHgwMjAw
CiAJdV9pbnQzMl90CXRvX3RzdmFsOwkvKiBuZXcgdGltZXN0YW1wICovCiAJdV9pbnQzMl90CXRv
X3RzZWNyOwkvKiByZWZsZWN0ZWQgdGltZXN0YW1wICovCiAJdV9jaGFyCQkqdG9fc2Fja3M7CS8q
IHBvaW50ZXIgdG8gdGhlIGZpcnN0IFNBQ0sgYmxvY2tzICovCkBAIC0yODQsNiArMzI2LDcgQEAK
IAl1X2ludDE2X3QJdG9fbXNzOwkJLyogbWF4aW11bSBzZWdtZW50IHNpemUgKi8KIAl1X2ludDhf
dAl0b193c2NhbGU7CS8qIHdpbmRvdyBzY2FsaW5nICovCiAJdV9pbnQ4X3QJdG9fbnNhY2tzOwkv
KiBudW1iZXIgb2YgU0FDSyBibG9ja3MgKi8KKwl1X2ludDE2X3QJdG9fdXRvOwkJLyogVVRPIG9w
dGlvbiAoUkZDNTQ4MikgKi8KIH07CiAKIC8qCkBAIC0zOTUsNiArNDM4LDcgQEAKIAl1X2xvbmcJ
dGNwc19zbmR1cmc7CQkvKiBwYWNrZXRzIHNlbnQgd2l0aCBVUkcgb25seSAqLwogCXVfbG9uZwl0
Y3BzX3NuZHdpbnVwOwkJLyogd2luZG93IHVwZGF0ZS1vbmx5IHBhY2tldHMgc2VudCAqLwogCXVf
bG9uZwl0Y3BzX3NuZGN0cmw7CQkvKiBjb250cm9sIChTWU58RklOfFJTVCkgcGFja2V0cyBzZW50
ICovCisJdV9sb25nCXRjcHNfc25kdXRvOwkJLyogcGFja2V0cyBzZW50IHdpdGggdGNwIFVUTyBv
cHRpb24gKi8KIAogCXVfbG9uZwl0Y3BzX3JjdnRvdGFsOwkJLyogdG90YWwgcGFja2V0cyByZWNl
aXZlZCAqLwogCXVfbG9uZwl0Y3BzX3JjdnBhY2s7CQkvKiBwYWNrZXRzIHJlY2VpdmVkIGluIHNl
cXVlbmNlICovCkBAIC00MTgsNiArNDYyLDcgQEAKIAl1X2xvbmcJdGNwc19yY3ZhY2twYWNrOwkv
KiByY3ZkIGFjayBwYWNrZXRzICovCiAJdV9sb25nCXRjcHNfcmN2YWNrYnl0ZTsJLyogYnl0ZXMg
YWNrZWQgYnkgcmN2ZCBhY2tzICovCiAJdV9sb25nCXRjcHNfcmN2d2ludXBkOwkJLyogcmN2ZCB3
aW5kb3cgdXBkYXRlIHBhY2tldHMgKi8KKwl1X2xvbmcJdGNwc19yY3Z1dG87CQkvKiBwYWNrZXRz
IHJlY2VpdmVkIHdpdGggdGNwIFVUTyBvcHRpb24gKi8KIAl1X2xvbmcJdGNwc19wYXdzZHJvcDsJ
CS8qIHNlZ21lbnRzIGRyb3BwZWQgZHVlIHRvIFBBV1MgKi8KIAl1X2xvbmcJdGNwc19wcmVkYWNr
OwkJLyogdGltZXMgaGRyIHByZWRpY3Qgb2sgZm9yIGFja3MgKi8KIAl1X2xvbmcJdGNwc19wcmVk
ZGF0OwkJLyogdGltZXMgaGRyIHByZWRpY3Qgb2sgZm9yIGRhdGEgcGt0cyAqLwpAQCAtNjE2LDYg
KzY2MSw5IEBACiBWTkVUX0RFQ0xBUkUoaW50LCB0Y3Bfc2NfcnN0X3NvY2tfZmFpbCk7CS8qIFJT
VCBvbiBzb2NrIGFsbG9jIGZhaWx1cmUgKi8KIFZORVRfREVDTEFSRShpbnQsIHRjcF9kb19lY24p
OwkJCS8qIFRDUCBFQ04gZW5hYmxlZC9kaXNhYmxlZCAqLwogVk5FVF9ERUNMQVJFKGludCwgdGNw
X2Vjbl9tYXhyZXRyaWVzKTsKK1ZORVRfREVDTEFSRShpbnQsIHRjcF91dG9fbWluKTsKK1ZORVRf
REVDTEFSRShpbnQsIHRjcF91dG9fbWF4KTsKK1ZORVRfREVDTEFSRShpbnQsIHRjcF91dG9fZW5h
YmxlKTsKIAogI2RlZmluZQlWX3RjcF9kb19zYWNrCQlWTkVUKHRjcF9kb19zYWNrKQogI2RlZmlu
ZQlWX3RjcF9zYWNrX21heGhvbGVzCVZORVQodGNwX3NhY2tfbWF4aG9sZXMpCkBAIC02MjQsNiAr
NjcyLDkgQEAKICNkZWZpbmUJVl90Y3Bfc2NfcnN0X3NvY2tfZmFpbAlWTkVUKHRjcF9zY19yc3Rf
c29ja19mYWlsKQogI2RlZmluZQlWX3RjcF9kb19lY24JCVZORVQodGNwX2RvX2VjbikKICNkZWZp
bmUJVl90Y3BfZWNuX21heHJldHJpZXMJVk5FVCh0Y3BfZWNuX21heHJldHJpZXMpCisjZGVmaW5l
CVZfdGNwX3V0b19taW4JCVZORVQodGNwX3V0b19taW4pCisjZGVmaW5lCVZfdGNwX3V0b19tYXgJ
CVZORVQodGNwX3V0b19tYXgpCisjZGVmaW5lCVZfdGNwX3V0b19lbmFibGUJVk5FVCh0Y3BfdXRv
X2VuYWJsZSkKIAogaW50CSB0Y3BfYWRkb3B0aW9ucyhzdHJ1Y3QgdGNwb3B0ICosIHVfY2hhciAq
KTsKIHN0cnVjdCB0Y3BjYiAqCkluZGV4OiBzeXMvbmV0aW5ldC90Y3Bfb3V0cHV0LmMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gc3lzL25ldGluZXQvdGNwX291dHB1dC5jCShyZXZpc2lvbiAxOTY0NTUpCisrKyBz
eXMvbmV0aW5ldC90Y3Bfb3V0cHV0LmMJKHdvcmtpbmcgY29weSkKQEAgLTY5NCw5ICs2OTQsNDAg
QEAKIAkJaWYgKHRwLT50X2ZsYWdzICYgVEZfU0lHTkFUVVJFKQogCQkJdG8udG9fZmxhZ3MgfD0g
VE9GX1NJR05BVFVSRTsKICNlbmRpZiAvKiBUQ1BfU0lHTkFUVVJFICovCisJCS8qCisJCSAqIFdl
IHNldCB0aGUgVVRPIG9wdGlvbiBpbiBUQ1AgaGVhZGVyIGluIHR3byBjYXNlczogdGhlCisJCSAq
IHNlZ21lbnQgaGFzIGEgU1lOLCBhIFNZTiB8IEFDSywgb3IgYSBub3JtYWwgZGF0YSBzZWdtZW50
LgorCQkgKi8KKwkJaWYgKGZsYWdzICYgVEhfU1lOIHx8CisJCSAgICAobGVuICYmICh0cC0+dF9m
bGFncyAmIFRGX0ZPUkNFREFUQSkgPT0gMCkpCisJCQlpZiAodHAtPnV0b19mbGFncyAmIChUQ1BV
VE9fTkVFRCB8IFRDUFVUT19TRU5ESU5HKSkgeworCQkJCXRvLnRvX3V0byA9IHRwLT5zbmRfdXRv
OworCQkJCXRvLnRvX2ZsYWdzIHw9IFRPRl9VVE87CisJCQl9CiAKIAkJLyogUHJvY2Vzc2luZyB0
aGUgb3B0aW9ucy4gKi8KIAkJaGRybGVuICs9IG9wdGxlbiA9IHRjcF9hZGRvcHRpb25zKCZ0bywg
b3B0KTsKKworCQkvKiAKKwkJICogQWNjb3JkaW5nIHRvIFJGQyA1NDgyOgorCQkgKiAiSW4gYWRk
aXRpb24gdG8gZXhjaGFuZ2luZyBVVE8gb3B0aW9ucyBpbiB0aGUgU1lOIHNlZ21lbnRzLAorCQkg
KiAgYSBjb25uZWN0aW9uIHRoYXQgaGFzIGVuYWJsZWQgVVRPIG9wdGlvbnMgU0hPVUxEIGluY2x1
ZGUgYQorCQkgKiAgVVRPIG9wdGlvbiBpbiB0aGUgZmlyc3QgcGFja2V0IHRoYXQgZG9lcyBub3Qg
aGF2ZSB0aGUgU1lOCisJCSAqICBmbGFnIHNldC4gVGhpcyBoZWxwcyAgdG8gbWluaW1pemUgdGhl
IGFtb3VudCBvZiBzdGF0ZQorCQkgKiAgaW5mb3JtYXRpb24gVENQIG11c3Qga2VlcCBmb3IgIGNv
bm5lY3Rpb25zIGluCisJCSAqICBub24tc3luY2hyb25pemVkIHN0YXRlcy4iIAorCQkgKiBTbyBl
dmVuIHRob3VnaCB0aGUgVVRPIG9wdGlvbiBpcyBzZXQgaW4gdGhlIFNZTiBzZWdtZW50LAorCQkg
KiB3ZSB3ZSBzaGFsbCByZXRyYW5zbWl0IGl0LgorCQkgKi8KKwkJaWYgKHRwLT51dG9fZmxhZ3Mg
JiAoVENQVVRPX05FRUQgfCBUQ1BVVE9fU0VORElORykgJiYKKwkJICAgICh0by50b19mbGFncyAm
IFRPRl9VVE8pID09IDApIHsKKwkJCWlmICgoZmxhZ3MgJiBUSF9TWU4pID09IDApIHsKKwkJCQl0
cC0+dXRvX2ZsYWdzICY9IH4oVENQVVRPX05FRUQgfCBUQ1BVVE9fU0VORElORyk7CisJCQkJdHAt
PnV0b19mbGFncyB8PSBUQ1BVVE9fU0VORElORzsKKwkJCQl0cC0+dXRvX2NhcnJpZXIgPSB0cC0+
c25kX254dCArIGxlbjsKKwkJCX0KKwkJCVRDUFNUQVRfSU5DKHRjcHNfc25kdXRvKTsKKwkJfQog
CX0KIAogI2lmZGVmIElORVQ2CkBAIC0xMzIzLDYgKzEzNTQsMTEgQEAKICAqIEF0IG1pbmltdW0g
d2UgbmVlZCAxMCBieXRlcyAodG8gZ2VuZXJhdGUgMSBTQUNLIGJsb2NrKS4gIElmIGJvdGgKICAq
IFRDUCBUaW1lc3RhbXBzICgxMiBieXRlcykgYW5kIFRDUCBTaWduYXR1cmVzICgxOCBieXRlcykg
YXJlIHByZXNlbnQsCiAgKiB3ZSBvbmx5IGhhdmUgMTAgYnl0ZXMgZm9yIFNBQ0sgb3B0aW9ucyAo
NDAgLSAoMTIgKyAxOCkpLgorICogCisgKiBUQ1Agb3B0aW9uIFVUTyAodXNlciB0aW1lb3V0LCBk
ZWZpbmVkIGluIFJGQyA1NDgyKSwgaXMgYW4gb3B0aW9uYWwgb3B0aW9uCisgKiB0aGF0IGNvbnN1
bWVzIDQgYnl0ZXMuIFdlIGF0dGFjaCB0aGUgVVRPIG9wdGlvbiBvbmx5IHdoZW4gdGhlcmUgaXMg
ZW5vdWdoCisgKiBmcmVlIHNwYWNlIGluIHRoZSBUQ1AgaGVhZGVyLgorICogQWx0aG91Z2ggVVRP
IGlzIG9wdGlvbmFsLCB3ZSBzaG91bGQgdHJ5IG91ciBiZXN0IHRvIHRyYW5zbWl0IGl0LgogICov
CiBpbnQKIHRjcF9hZGRvcHRpb25zKHN0cnVjdCB0Y3BvcHQgKnRvLCB1X2NoYXIgKm9wdHApCkBA
IC0xNDM3LDYgKzE0NzMsMTkgQEAKIAkJCVRDUFNUQVRfSU5DKHRjcHNfc2Fja19zZW5kX2Jsb2Nr
cyk7CiAJCQlicmVhazsKIAkJCX0KKwkJY2FzZSBUT0ZfVVRPOgorCQkJeworCQkJaWYgKFRDUF9N
QVhPTEVOIC0gb3B0bGVuIDwgVENQT0xFTl9VVE8pCisJCQkJY29udGludWU7CisJCQkqb3B0cCsr
ID0gVENQT1BUX1VUTzsKKwkJCSpvcHRwKysgPSBUQ1BPTEVOX1VUTzsKKwkJCW9wdGxlbiArPSBU
Q1BPTEVOX1VUTzsKKwkJCXRvLT50b191dG8gPSBodG9ucyh0by0+dG9fdXRvKTsKKwkJCWJjb3B5
KCh1X2NoYXIgKikmdG8tPnRvX3V0bywgb3B0cCwgc2l6ZW9mKHRvLT50b191dG8pKTsKKwkJCW9w
dHAgKz0gc2l6ZW9mKHRvLT50b191dG8pOworCQkJdG8tPnRvX2ZsYWdzICY9IH5UT0ZfVVRPOwor
CQkJYnJlYWs7CisJCQl9CiAJCWRlZmF1bHQ6CiAJCQlwYW5pYygiJXM6IHVua25vd24gVENQIG9w
dGlvbiB0eXBlIiwgX19mdW5jX18pOwogCQkJYnJlYWs7CkluZGV4OiBzeXMvbmV0aW5ldC90Y3Au
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBzeXMvbmV0aW5ldC90Y3AuaAkocmV2aXNpb24gMTk2NDU1KQorKysg
c3lzL25ldGluZXQvdGNwLmgJKHdvcmtpbmcgY29weSkKQEAgLTk2LDYgKzk2LDggQEAKICNkZWZp
bmUgICAgVENQT0xFTl9UU1RBTVBfQVBQQQkJKFRDUE9MRU5fVElNRVNUQU1QKzIpIC8qIGFwcGVu
ZGl4IEEgKi8KICNkZWZpbmUJVENQT1BUX1NJR05BVFVSRQkxOQkJLyogS2V5ZWQgTUQ1OiBSRkMg
MjM4NSAqLwogI2RlZmluZQkgICBUQ1BPTEVOX1NJR05BVFVSRQkJMTgKKyNkZWZpbmUJVENQT1BU
X1VUTwkJMjgKKyNkZWZpbmUJICAgVENQT0xFTl9VVE8JCQk0CiAKIC8qIE1pc2NlbGxhbmVvdXMg
Y29uc3RhbnRzICovCiAjZGVmaW5lCU1BWF9TQUNLX0JMS1MJNgkvKiBNYXggIyBTQUNLIGJsb2Nr
cyBzdG9yZWQgYXQgcmVjZWl2ZXIgc2lkZSAqLwpAQCAtMTUwLDYgKzE1MiwxNCBAQAogI2RlZmlu
ZSBUQ1BfTUQ1U0lHCTB4MTAJLyogdXNlIE1ENSBkaWdlc3RzIChSRkMyMzg1KSAqLwogI2RlZmlu
ZQlUQ1BfSU5GTwkweDIwCS8qIHJldHJpZXZlIHRjcF9pbmZvIHN0cnVjdHVyZSAqLwogI2RlZmlu
ZQlUQ1BfQ09OR0VTVElPTgkweDQwCS8qIGdldC9zZXQgY29uZ2VzdGlvbiBjb250cm9sIGFsZ29y
aXRobSAqLworI2RlZmluZQlUQ1BfVVRPCQkweDgwCS8qIHNldCB0Y3AgdXNlciB0aW1lb3V0ICov
CitzdHJ1Y3QgdGNwdXRvIHsKKwlpbnQJdXRvOworCWludAlmbGFnczsKK307CisjZGVmaW5lCVRD
UF9VVE9fU1RPUkUJCTB4MDEKKyNkZWZpbmUJVENQX1VUT19FTkFCTEUJCTB4MDIKKyNkZWZpbmUJ
VENQX1VUT19DSEFOR0UJCTB4MDQKIAogI2RlZmluZQlUQ1BfQ0FfTkFNRV9NQVgJMTYJLyogbWF4
IGNvbmdlc3Rpb24gY29udHJvbCBuYW1lIGxlbmd0aCAqLwogCkBAIC0xNTgsNiArMTY4LDcgQEAK
ICNkZWZpbmUJVENQSV9PUFRfV1NDQUxFCQkweDA0CiAjZGVmaW5lCVRDUElfT1BUX0VDTgkJMHgw
OAogI2RlZmluZQlUQ1BJX09QVF9UT0UJCTB4MTAKKyNkZWZpbmUJVENQSV9PUFRfVVRPCQkweDIw
CiAKIC8qCiAgKiBUaGUgVENQX0lORk8gc29ja2V0IG9wdGlvbiBjb21lcyBmcm9tIHRoZSBMaW51
eCAyLjYgVENQIEFQSSwgYW5kIHBlcm1pdHMKQEAgLTIxNyw5ICsyMjgsMTAgQEAKIAl1X2ludDMy
X3QJdGNwaV9zbmRfbnh0OwkJLyogTmV4dCBlZ3Jlc3Mgc2Vxbm8gKi8KIAl1X2ludDMyX3QJdGNw
aV9yY3Zfbnh0OwkJLyogTmV4dCBpbmdyZXNzIHNlcW5vICovCiAJdV9pbnQzMl90CXRjcGlfdG9l
X3RpZDsJCS8qIEhXVElEIGZvciBUT0UgZW5kcG9pbnRzICovCi0JCisJdV9pbnQzMl90CXRjcGlf
dXRvOwkJLyogdGNwIHVzZXIgdGltZW91dCB2YWx1ZSAqLworCiAJLyogUGFkZGluZyB0byBncm93
IHdpdGhvdXQgYnJlYWtpbmcgQUJJLiAqLwotCXVfaW50MzJfdAlfX3RjcGlfcGFkWzI5XTsJCS8q
IFBhZGRpbmcuICovCisJdV9pbnQzMl90CV9fdGNwaV9wYWRbMjhdOwkJLyogUGFkZGluZy4gKi8K
IH07CiAjZW5kaWYKIApJbmRleDogc3lzL25ldGluZXQvdGNwX3N5bmNhY2hlLmMKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gc3lzL25ldGluZXQvdGNwX3N5bmNhY2hlLmMJKHJldmlzaW9uIDE5NjQ1NSkKKysrIHN5
cy9uZXRpbmV0L3RjcF9zeW5jYWNoZS5jCSh3b3JraW5nIGNvcHkpCkBAIC03NzQsNiArNzc0LDEw
IEBACiAjZW5kaWYKIAkJaWYgKHNjLT5zY19mbGFncyAmIFNDRl9TQUNLKQogCQkJdHAtPnRfZmxh
Z3MgfD0gVEZfU0FDS19QRVJNSVQ7CisJCWlmIChzYy0+c2NfZmxhZ3MgJiBTQ0ZfVVRPKSB7CisJ
CQl0cC0+dXRvX2ZsYWdzIHw9IFRDUFVUT19SQ1ZEOworCQkJdHAtPnJjdl91dG8gPSBzYy0+c2Nf
cGVlcl91dG87CisJCX0KIAl9CiAKIAlpZiAoc2MtPnNjX2ZsYWdzICYgU0NGX0VDTikKQEAgLTEy
MTIsNiArMTIxNiwxMSBAQAogCQlzYy0+c2NfZmxhZ3MgfD0gU0NGX05PT1BUOwogCWlmICgodGgt
PnRoX2ZsYWdzICYgKFRIX0VDRXxUSF9DV1IpKSAmJiBWX3RjcF9kb19lY24pCiAJCXNjLT5zY19m
bGFncyB8PSBTQ0ZfRUNOOworCWlmICh0by0+dG9fZmxhZ3MgJiBUT0ZfVVRPKSB7CisJCXNjLT5z
Y19wZWVyX3V0byA9IHRvLT50b191dG87CisJCXNjLT5zY19mbGFncyB8PSBTQ0ZfVVRPOworCQlU
Q1BTVEFUX0lOQyh0Y3BzX3JjdnV0byk7CisJfQogCiAJaWYgKFZfdGNwX3N5bmNvb2tpZXMpIHsK
IAkJc3luY29va2llX2dlbmVyYXRlKHNjaCwgc2MsICZmbG93dG1wKTsKSW5kZXg6IHN5cy9uZXRp
bmV0L3RjcF9zeW5jYWNoZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9uZXRpbmV0L3RjcF9zeW5jYWNo
ZS5oCShyZXZpc2lvbiAxOTY0NTUpCisrKyBzeXMvbmV0aW5ldC90Y3Bfc3luY2FjaGUuaAkod29y
a2luZyBjb3B5KQpAQCAtNzQsNiArNzQsNyBAQAogCXVfaW50OF90CXNjX2lwX3RvczsJCS8qIElQ
djQgVE9TICovCiAJdV9pbnQ4X3QJc2NfcmVxdWVzdGVkX3Nfc2NhbGU6NCwKIAkJCXNjX3JlcXVl
c3RlZF9yX3NjYWxlOjQ7CisJdV9pbnQxNl90CXNjX3BlZXJfdXRvOwkJLyogcGVlcidzIHVzZXIg
dGltZW91dCAqLwogCXVfaW50MTZfdAlzY19mbGFnczsKICNpZm5kZWYgVENQX09GRkxPQURfRElT
QUJMRQogCXN0cnVjdCB0b2VfdXNycmVxcyAqc2NfdHU7CQkvKiBUT0Ugb3BlcmF0aW9ucyAqLwpA
QCAtOTQsNiArOTUsNyBAQAogI2RlZmluZSBTQ0ZfU0lHTkFUVVJFCTB4MjAJCQkvKiBzZW5kIE1E
NSBkaWdlc3RzICovCiAjZGVmaW5lIFNDRl9TQUNLCTB4ODAJCQkvKiBzZW5kIFNBQ0sgb3B0aW9u
ICovCiAjZGVmaW5lIFNDRl9FQ04JCTB4MTAwCQkJLyogc2VuZCBFQ04gc2V0dXAgcGFja2V0ICov
CisjZGVmaW5lIFNDRl9VVE8JCTB4MjAwCQkJLyogVVRPIG9wdGlvbiByZWNlaXZlZCAqLwogCiAj
ZGVmaW5lCVNZTkNPT0tJRV9TRUNSRVRfU0laRQk4CS8qIGR3b3JkcyAqLwogI2RlZmluZQlTWU5D
T09LSUVfTElGRVRJTUUJMTYJLyogc2Vjb25kcyAqLwpJbmRleDogc3lzL25ldGluZXQvdGNwX3Vz
cnJlcS5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9uZXRpbmV0L3RjcF91c3JyZXEuYwkocmV2aXNpb24g
MTk2NDU1KQorKysgc3lzL25ldGluZXQvdGNwX3VzcnJlcS5jCSh3b3JraW5nIGNvcHkpCkBAIC0x
MTk4LDYgKzExOTgsMTEgQEAKIAkJdGktPnRjcGlfb3B0aW9ucyB8PSBUQ1BJX09QVF9XU0NBTEU7
CiAJCXRpLT50Y3BpX3NuZF93c2NhbGUgPSB0cC0+c25kX3NjYWxlOwogCQl0aS0+dGNwaV9yY3Zf
d3NjYWxlID0gdHAtPnJjdl9zY2FsZTsKKwl9CQorCVRDUFRfUkVTT0xWRV9VVE8odHApOworCWlm
ICh0cC0+dXRvX2ZsYWdzICYgVENQVVRPX0lNUEwpIHsKKwkJdGktPnRjcGlfb3B0aW9ucyB8PSBU
Q1BJX09QVF9VVE87CisJCXRpLT50Y3BpX3V0byA9IHRwLT50X3V0b19pbXBsIC8gaHo7CiAJfQog
CiAJdGktPnRjcGlfcnR0ID0gKCh1X2ludDY0X3QpdHAtPnRfc3J0dCAqIHRpY2spID4+IFRDUF9S
VFRfU0hJRlQ7CkBAIC0xMjQyLDYgKzEyNDcsNyBAQAogCXN0cnVjdAlpbnBjYiAqaW5wOwogCXN0
cnVjdAl0Y3BjYiAqdHA7CiAJc3RydWN0CXRjcF9pbmZvIHRpOworCXN0cnVjdAl0Y3B1dG8gdHU7
CiAKIAllcnJvciA9IDA7CiAJaW5wID0gc290b2lucGNiKHNvKTsKQEAgLTEzNTEsNiArMTM1Nyw1
MyBAQAogCQkJZXJyb3IgPSBFSU5WQUw7CiAJCQlicmVhazsKIAorCQljYXNlIFRDUF9VVE86CisJ
CQlJTlBfV1VOTE9DSyhpbnApOworCQkJZXJyb3IgPSBzb29wdGNvcHlpbihzb3B0LCAmdHUsIHNp
emVvZiB0dSwKKwkJCSAgICBzaXplb2YgdHUpOworCQkJaWYgKGVycm9yKQorCQkJCXJldHVybiAo
ZXJyb3IpOworCisJCQlJTlBfV0xPQ0tfUkVDSEVDSyhpbnApOworCQkJaWYgKHR1LmZsYWdzICYg
fihUQ1BfVVRPX0VOQUJMRSB8IFRDUF9VVE9fU1RPUkUgfAorCQkJICAgIFRDUF9VVE9fQ0hBTkdF
KSkgeworCQkJCWVycm9yID0gRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHR1LmZs
YWdzICYgVENQX1VUT19FTkFCTEUpCisJCQkJdHAtPnV0b19mbGFncyB8PSBUQ1BVVE9fRU5BQkxF
OworCQkJaWYgKHR1LmZsYWdzICYgVENQX1VUT19TVE9SRSkgeworCQkJCXRwLT51dG9fZmxhZ3Mg
fD0gVENQVVRPX05FRUQ7CisJCQkJaWYgKHR1LnV0byA+IDAgJiYgdHUudXRvIDw9IDB4N0ZGRiAq
IDYwKSB7CisJCQkJCWlmICh0dS51dG8gPiAweDdGRkYpIHsKKwkJCQkJCXRwLT5zbmRfdXRvID0g
dHUudXRvIC8gNjA7CisJCQkJCQl0cC0+c25kX3V0byA8PD0gMTsKKwkJCQkJCXRwLT5zbmRfdXRv
IHw9IDE7CisJCQkJCX0gZWxzZSB7CisJCQkJCQl0cC0+c25kX3V0byA9IHR1LnV0bzsKKwkJCQkJ
CXRwLT5zbmRfdXRvIDw8PSAxOworCQkJCQl9CisJCQkJCWlmICh0cC0+dXRvX2ZsYWdzICYgVENQ
VVRPX0VOQUJMRSAmJgorCQkJCQkgICAgdHAtPnV0b19mbGFncyAmIFRDUFVUT19ORUVEKSB7CisJ
CQkJCQl1aW50MzJfdCBtYXh0aW1lOworCisJCQkJCQltYXh0aW1lID0gbWF4KHR1LnV0bypoeiwK
KwkJCQkJCSAgICB0Y3BfdXRvX21pbik7CisJCQkJCQl0cC0+dF91dG9faW1wbCA9CisJCQkJCQkg
ICAgbWluKHRjcF91dG9fbWF4LCBtYXh0aW1lKTsKKwkJCQkJCXRwLT50X3V0b19hZHYgPSB0cC0+
dF91dG9faW1wbDsKKwkJCQkJCXRwLT51dG9fZmxhZ3MgJj0KKwkJCQkJCSAgICB+VENQVVRPX0NI
QU5HRUFCTEU7CisJCQkJCQl0cC0+dXRvX2ZsYWdzIHw9IFRDUFVUT19JTVBMOworCQkJCQl9CisJ
CQkJfSBlbHNlCisJCQkJCWVycm9yID0gRUlOVkFMOworCQkJfQorCQkJaWYgKHR1LmZsYWdzICYg
VENQX1VUT19DSEFOR0UpCisJCQkJdHAtPnV0b19mbGFncyB8PSBUQ1BVVE9fQ0hBTkdFQUJMRTsK
KwkJCUlOUF9XVU5MT0NLKGlucCk7CisJCQlicmVhazsKKwogCQlkZWZhdWx0OgogCQkJSU5QX1dV
TkxPQ0soaW5wKTsKIAkJCWVycm9yID0gRU5PUFJPVE9PUFQ7CkBAIC0xMzk0LDYgKzE0NDcsMjAg
QEAKIAkJCUlOUF9XVU5MT0NLKGlucCk7CiAJCQllcnJvciA9IHNvb3B0Y29weW91dChzb3B0LCAm
dGksIHNpemVvZiB0aSk7CiAJCQlicmVhazsKKwkJY2FzZSBUQ1BfVVRPOgorCQkJdHUuZmxhZ3Mg
PSAwOworCQkJaWYgKHRwLT51dG9fZmxhZ3MgJiBUQ1BVVE9fRU5BQkxFKQorCQkJCXR1LmZsYWdz
IHw9IFRDUF9VVE9fRU5BQkxFOworCQkJaWYgKHRwLT51dG9fZmxhZ3MgJiBUQ1BVVE9fQ0hBTkdF
QUJMRSkKKwkJCQl0dS5mbGFncyB8PSBUQ1BfVVRPX0NIQU5HRTsKKwkJCVRDUFRfUkVTT0xWRV9V
VE8odHApOworCQkJaWYgKHRwLT51dG9fZmxhZ3MgJiBUQ1BVVE9fSU1QTCkgeworCQkJCXR1LmZs
YWdzIHw9IFRDUF9VVE9fU1RPUkU7CisJCQkJdHUudXRvID0gdHAtPnRfdXRvX2ltcGwgLyBoejsK
KwkJCX0KKwkJCUlOUF9XVU5MT0NLKGlucCk7CisJCQllcnJvciA9IHNvb3B0Y29weW91dChzb3B0
LCAmdHUsIHNpemVvZiB0dSk7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCUlOUF9XVU5MT0NL
KGlucCk7CiAJCQllcnJvciA9IEVOT1BST1RPT1BUOwpJbmRleDogdXNyLmJpbi9uZXRzdGF0L2lu
ZXQuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSB1c3IuYmluL25ldHN0YXQvaW5ldC5jCShyZXZpc2lvbiAxOTY0
NTUpCisrKyB1c3IuYmluL25ldHN0YXQvaW5ldC5jCSh3b3JraW5nIGNvcHkpCkBAIC02MDcsNiAr
NjA3LDcgQEAKIAlwKHRjcHNfc25kcHJvYmUsICJcdFx0JWx1IHdpbmRvdyBwcm9iZSBwYWNrZXQl
c1xuIik7CiAJcCh0Y3BzX3NuZHdpbnVwLCAiXHRcdCVsdSB3aW5kb3cgdXBkYXRlIHBhY2tldCVz
XG4iKTsKIAlwKHRjcHNfc25kY3RybCwgIlx0XHQlbHUgY29udHJvbCBwYWNrZXQlc1xuIik7CisJ
cCh0Y3BzX3NuZHV0bywgIlx0XHQlbHUgdGNwIHV0byBlbmFibGVkIHBhY2tldCVzXG4iKTsKIAlw
KHRjcHNfcmN2dG90YWwsICJcdCVsdSBwYWNrZXQlcyByZWNlaXZlZFxuIik7CiAJcDIodGNwc19y
Y3ZhY2twYWNrLCB0Y3BzX3JjdmFja2J5dGUsCiAJICAgICJcdFx0JWx1IGFjayVzIChmb3IgJWx1
IGJ5dGUlcylcbiIpOwpAQCAtNjIzLDYgKzYyNCw3IEBACiAJICAgICJcdFx0JWx1IG91dC1vZi1v
cmRlciBwYWNrZXQlcyAoJWx1IGJ5dGUlcylcbiIpOwogCXAyKHRjcHNfcmN2cGFja2FmdGVyd2lu
LCB0Y3BzX3JjdmJ5dGVhZnRlcndpbiwKIAkgICAgIlx0XHQlbHUgcGFja2V0JXMgKCVsdSBieXRl
JXMpIG9mIGRhdGEgYWZ0ZXIgd2luZG93XG4iKTsKKwlwKHRjcHNfcmN2dXRvLCAiXHRcdCVsdSB0
Y3AgdXRvIGVuYWJsZWQgcGFja2V0JXNcbiIpOwogCXAodGNwc19yY3Z3aW5wcm9iZSwgIlx0XHQl
bHUgd2luZG93IHByb2JlJXNcbiIpOwogCXAodGNwc19yY3Z3aW51cGQsICJcdFx0JWx1IHdpbmRv
dyB1cGRhdGUgcGFja2V0JXNcbiIpOwogCXAodGNwc19yY3ZhZnRlcmNsb3NlLCAiXHRcdCVsdSBw
YWNrZXQlcyByZWNlaXZlZCBhZnRlciBjbG9zZVxuIik7CkluZGV4OiBjb250cmliL3RjcGR1bXAv
cHJpbnQtdGNwLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gY29udHJpYi90Y3BkdW1wL3ByaW50LXRjcC5jCShy
ZXZpc2lvbiAxOTY0NTUpCisrKyBjb250cmliL3RjcGR1bXAvcHJpbnQtdGNwLmMJKHdvcmtpbmcg
Y29weSkKQEAgLTEyNCw2ICsxMjQsNyBAQAogICAgICAgICB7IFRDUE9QVF9DQ0VDSE8sICIiIH0s
CiAgICAgICAgIHsgVENQT1BUX1NJR05BVFVSRSwgIm1kNSIgfSwKICAgICAgICAgeyBUQ1BPUFRf
QVVUSCwgImVuaGFuY2VkIGF1dGgiIH0sCisgICAgICAgIHsgVENQT1BUX1VUTywgInV0byIgfSwK
ICAgICAgICAgeyAwLCBOVUxMIH0KIH07CiAKQEAgLTYxMyw2ICs2MTQsMTcgQEAKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOwogCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRDUE9QVF9VVE86Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFsZW4gPSAyOworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBMRU5DSEVDSyhkYXRhbGVuKTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdWludCB1dG92YWwgPSBFWFRSQUNUXzE2QklUUyhjcCk7CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1dG92YWwgJiAweDAwMDEpCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRvdmFsID0gKHV0b3ZhbCA+PiAxKSAqIDYw
OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgdXRvdmFsID4+PSAxOworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAodm9pZClwcmludGYoIiAldSIsIHV0b3ZhbCk7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICAgICAgICAgICAgICBkZWZh
dWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhbGVuID0gbGVuIC0gMjsK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRhdGFsZW47
ICsraSkgewpJbmRleDogY29udHJpYi90Y3BkdW1wL3RjcC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGNvbnRy
aWIvdGNwZHVtcC90Y3AuaAkocmV2aXNpb24gMTk2NDU1KQorKysgY29udHJpYi90Y3BkdW1wL3Rj
cC5oCSh3b3JraW5nIGNvcHkpCkBAIC04Myw2ICs4Myw4IEBACiAjZGVmaW5lICAgIFRDUE9MRU5f
U0lHTkFUVVJFCQkxOAogI2RlZmluZSBUQ1BfU0lHTEVOIDE2CQkJLyogbGVuZ3RoIG9mIGFuIG9w
dGlvbiAxOSBkaWdlc3QgKi8KICNkZWZpbmUgVENQT1BUX0FVVEggICAgICAgICAgICAgMjAgICAg
ICAvKiBFbmhhbmNlZCBBVVRIIG9wdGlvbiAqLworI2RlZmluZQlUQ1BPUFRfVVRPCQkyOAkvKiB0
Y3AgdXNlciB0aW1lb3V0IChyZmM1NDgyKSAqLworI2RlZmluZQkgICBUQ1BPTEVOX1VUTwkJCTQK
IAogI2RlZmluZSBUQ1BPUFRfVFNUQU1QX0hEUglcCiAgICAgKFRDUE9QVF9OT1A8PDI0fFRDUE9Q
VF9OT1A8PDE2fFRDUE9QVF9USU1FU1RBTVA8PDh8VENQT0xFTl9USU1FU1RBTVApCkluZGV4OiB0
b29scy9yZWdyZXNzaW9uL25ldGluZXQvdGNwdXRvL3RjcHV0by5jCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHRv
b2xzL3JlZ3Jlc3Npb24vbmV0aW5ldC90Y3B1dG8vdGNwdXRvLmMJKHJldmlzaW9uIDApCisrKyB0
b29scy9yZWdyZXNzaW9uL25ldGluZXQvdGNwdXRvL3RjcHV0by5jCShyZXZpc2lvbiAwKQpAQCAt
MCwwICsxLDU2NSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgRmFuZyBXYW5nIDxmYW5n
d2FuZ0BGcmVlQlNELm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRP
UlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQor
ICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBP
UiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0Qk
CisgKi8KKworLyoKKyAqIFRDUCByZWdyZXNzaW9uIHRlc3QgZm9yIHRjcCB1c2VyIHRpbWVvdXQ7
IGJ1aWxkIGEgVENQIGNvbm5lY3Rpb24sIGludGVycnVwdAorICogaXQgd2l0aG91dCBkZXRlY3Rl
ZCBieSBvcGVyYXRpbmcgc3lzdGVtLCBhbmQgbWFrZSBzdXJlIHRoZSB0aW1lb3V0IHRpbWUgYW5k
CisgKiByZXRyYW5zbWlzc2lvbiB0aW1lcyBoYXMgYmVlbiBjaGFuZ2VkIGFwcHJvcHJpYXRlbHku
CisgKi8KKworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5o
PgorCisjaW5jbHVkZSA8bmV0L2V0aGVybmV0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgor
I2luY2x1ZGUgPG5ldGluZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgorCisjaW5j
bHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxlcnIuaD4KKyNpbmNsdWRlIDxlcnJuby5o
PgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRs
aWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRl
IDx0aW1lLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpbmNsdWRlIDxwY2FwLmg+CisjaW5j
bHVkZSA8cHRocmVhZC5oPgorCisjZGVmaW5lCVNJWkVfRVRIRVJORVQJc2l6ZW9mKHN0cnVjdCBl
dGhlcl9oZWFkZXIpCisjZGVmaW5lCU1BWF9SWFQJMjAwCisKK3N0cnVjdCB0Y3ByeHQgeworCXN0
cnVjdCB0aW1ldmFsIHRzOworCXVfaW50CXRoX29mZjsKKwl0Y3Bfc2VxCXRoX3NlcTsKKwl0Y3Bf
c2VxCXRoX2FjazsKKwl1X3Nob3J0CXRoX3dpbjsKKwl1X2NoYXIJdGhfZmxhZ3M7Cit9OworCitz
dGF0aWMgc3RydWN0IHRjcHJ4dAlyeHRzW01BWF9SWFRdOworCitzdGF0aWMgdm9pZAorcGFyc2Vf
cGFja2V0KHVfY2hhciAqYXJncywgY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpwa3RfaGVhZGVy
LAorICAgIGNvbnN0IHVfY2hhciAqcGFja2V0KQoreworCWNvbnN0IHN0cnVjdCBpcCAqaXA7CisJ
Y29uc3Qgc3RydWN0IHRjcGhkciAqdGNwOworCWNvbnN0IHVfY2hhciAqdGNwb3B0OworCXN0cnVj
dCB0Y3ByeHQgcnh0OworCXVfaW50IG9wdCwgb3B0bGVuOworCXVfaW50IGhsZW47CisJdV9pbnQg
bGVuZ3RoOworCisJbGVuZ3RoID0gcGt0X2hlYWRlci0+bGVuIC0gU0laRV9FVEhFUk5FVDsKKwlp
cCA9IChzdHJ1Y3QgaXAgKikocGFja2V0ICsgU0laRV9FVEhFUk5FVCk7CisJaGxlbiA9IGlwLT5p
cF9obCAqIDQ7CisJbGVuZ3RoIC09IGhsZW47CisJaWYgKGhsZW4gPCAyMCkgeworCQlwcmludGYo
IiAgICogSW52YWxpZCBJUCBoZWFkZXIgbGVuZ3RoOiAldSBieXRlc1xuIiwgaGxlbik7CisJCXJl
dHVybjsKKwl9CisJdGNwID0gKHN0cnVjdCB0Y3BoZHIgKikoKHVfY2hhciAqKWlwICsgaGxlbik7
CisJaGxlbiA9IHRjcC0+dGhfb2ZmICogNDsKKwlsZW5ndGggLT0gaGxlbjsKKwlpZiAoaGxlbiA8
IDIwKSB7CisJCXByaW50ZigiICAgKiBJbnZhbGlkIFRDUCBoZWFkZXIgbGVuZ3RoOiAldSBieXRl
c1xuIiwgaGxlbik7CisJCXJldHVybjsKKwl9CisJdGNwb3B0ID0gKHVfY2hhciAqKXRjcCArIHNp
emVvZigqdGNwKTsKKwlobGVuIC09IHNpemVvZigqdGNwKTsKKwl3aGlsZSAoaGxlbiA+IDApIHsK
KwkJb3B0ID0gKnRjcG9wdCsrOworCQlobGVuLS07CisJCWlmIChvcHQgPT0gVENQT1BUX0VPTCkK
KwkJCWJyZWFrOworCQlpZiAob3B0ID09IFRDUE9QVF9OT1ApCisJCQljb250aW51ZTsKKwkJb3B0
bGVuID0gKnRjcG9wdCsrOworCQlpZiAob3B0ID09IFRDUE9QVF9VVE8pIHsKKwkJCXVfaW50IHV0
byA9IGh0b25zKCoodV9zaG9ydCAqKXRjcG9wdCk7CisJCQlzdHJ1Y3QgdG0gKnA7CisJCQlpZiAo
dXRvICYgMSkKKwkJCQl1dG8gPSAodXRvID4+IDEpICogNjA7CisJCQllbHNlCisJCQkJdXRvID4+
PSAxOworCQkJcCA9IGxvY2FsdGltZSgmcGt0X2hlYWRlci0+dHMudHZfc2VjKTsKKwkJCXByaW50
ZigidXRvIHBhY2tldDogIik7CisJCQlwcmludGYoIiUwMmQ6JTAyZDolMDJkLiUtNnUgIiwgcC0+
dG1faG91ciwgcC0+dG1fbWluLAorCQkJICAgIHAtPnRtX3NlYywgcGt0X2hlYWRlci0+dHMudHZf
dXNlYyk7CisJCQlwcmludGYoIiVzLiVkID4gIiwgaW5ldF9udG9hKGlwLT5pcF9zcmMpLAorCQkJ
ICAgIGh0b25zKHRjcC0+dGhfc3BvcnQpKTsKKwkJCXByaW50ZigiJXMuJWQsICIsIGluZXRfbnRv
YShpcC0+aXBfZHN0KSwKKwkJCSAgICBodG9ucyh0Y3AtPnRoX2Rwb3J0KSk7CisJCQlwcmludGYo
ImZsYWdzIFsiKTsKKwkJCWlmICh0Y3AtPnRoX2ZsYWdzICYgVEhfU1lOKQorCQkJCXByaW50Zigi
UyIpOworCQkJaWYgKHRjcC0+dGhfZmxhZ3MgJiBUSF9SU1QpCisJCQkJcHJpbnRmKCJSIik7CisJ
CQlpZiAodGNwLT50aF9mbGFncyAmIFRIX1BVU0gpCisJCQkJcHJpbnRmKCJQIik7CisJCQlpZiAo
dGNwLT50aF9mbGFncyAmIFRIX0FDSykKKwkJCQlwcmludGYoIi4iKTsKKwkJCWlmICh0Y3AtPnRo
X2ZsYWdzICYgVEhfVVJHKQorCQkJCXByaW50ZigiVSIpOworCQkJcHJpbnRmKCJdLCAiKTsKKwkJ
CXByaW50ZigidXRvICV1LCB3aW4gJXUsIGxlbmd0aCAldVxuIiwgdXRvLAorCQkJICAgIGh0b25z
KHRjcC0+dGhfd2luKSwgbGVuZ3RoKTsKKwkJfQorCQlobGVuIC09IG9wdGxlbiAtIDE7CisJCXRj
cG9wdCArPSBvcHRsZW4gLSAyOworCX0KKwlpZiAobGVuZ3RoID4gMCB8fCB0Y3AtPnRoX2ZsYWdz
ICYgVEhfUlNUKSB7CisJCW1lbXNldCgmcnh0LCAwLCBzaXplb2Yocnh0KSk7CisJCW1lbWNweSgm
cnh0LnRzLCAmcGt0X2hlYWRlci0+dHMsIHNpemVvZihyeHQudHMpKTsKKwkJcnh0LnRoX3dpbiA9
IGh0b25zKHRjcC0+dGhfd2luKTsKKwkJcnh0LnRoX29mZiA9IHRjcC0+dGhfb2ZmOworCQlyeHQu
dGhfYWNrID0gaHRvbmwodGNwLT50aF9hY2spOworCQlyeHQudGhfc2VxID0gaHRvbmwodGNwLT50
aF9zZXEpOworCQlyeHQudGhfZmxhZ3MgPSB0Y3AtPnRoX2ZsYWdzOworCQltZW1jcHkoJnJ4dHNb
MF0sICZyeHRzWzFdLAorCQkgICAgc2l6ZW9mKHN0cnVjdCB0Y3ByeHQpICogKE1BWF9SWFQgLSAx
KSk7CisJCW1lbWNweSgmcnh0c1tNQVhfUlhUIC0gMV0sICZyeHQsIHNpemVvZihyeHQpKTsKKwl9
Cit9CisKK3N0YXRpYyB2b2lkICoKK2R1bXBfcGFja2V0KHZvaWQgKmFyZykKK3sKKwlwY2FwX3Qg
KmhhbmRsZTsKKwljaGFyIGVycmJ1ZltQQ0FQX0VSUkJVRl9TSVpFXTsKKwlzdHJ1Y3QgYnBmX3By
b2dyYW0gZnA7CisJY2hhciBmaWx0ZXJfZXhwWzEyOF07CisJYnBmX3VfaW50MzIgbWFzazsKKwli
cGZfdV9pbnQzMiBuZXQ7CisJc3RydWN0IHBjYXBfcGt0aGRyIGhlYWRlcjsKKwljb25zdCB1X2No
YXIgKnBhY2tldDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc3JjYWRkciwgZHN0YWRkciwgKmRldmFk
ZHJwOworCWludCBvcHRsZW47CisJcGNhcF9pZl90ICphbGxkZXZzcCwgKmRldnA7CisJcGNhcF9h
ZGRyX3QgKmFkZHJwOworCWludCBmbGFnOworCisJb3B0bGVuID0gc2l6ZW9mKHNyY2FkZHIpOwor
CWlmIChnZXRzb2NrbmFtZSgqKChpbnQgKilhcmcpLCAoc3RydWN0IHNvY2thZGRyICopJnNyY2Fk
ZHIsCisJICAgICZvcHRsZW4pID09IC0xKQorCQllcnIoLTEsICJnZXRzb2NrbmFtZSIpOworCW9w
dGxlbiA9IHNpemVvZihkc3RhZGRyKTsKKwlpZiAoZ2V0cGVlcm5hbWUoKigoaW50ICopYXJnKSwg
KHN0cnVjdCBzb2NrYWRkciAqKSZkc3RhZGRyLAorCSAgICAmb3B0bGVuKSA9PSAtMSkKKwkJZXJy
KC0xLCAiZ2V0c29ja25hbWUiKTsKKworCWlmIChwY2FwX2ZpbmRhbGxkZXZzKCZhbGxkZXZzcCwg
ZXJyYnVmKSA9PSAtMSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGdldCBhbGwgZGV2
aWNlOiAlc1xuIiwgZXJyYnVmKTsKKwkJZXhpdCgtMSk7CisJfQorCisJZGV2cCA9IGFsbGRldnNw
OworCWZsYWcgPSAxOworCXdoaWxlIChkZXZwICE9IE5VTEwpIHsKKwkJYWRkcnAgPSBkZXZwLT5h
ZGRyZXNzZXM7CisJCXdoaWxlIChhZGRycCAhPSBOVUxMICYmIGZsYWcpIHsKKwkJCWRldmFkZHJw
ID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFkZHJwLT5hZGRyOworCQkJaWYgKCFtZW1jbXAoJmRl
dmFkZHJwLT5zaW5fYWRkciwgJnNyY2FkZHIuc2luX2FkZHIsCisJCQkgICAgc2l6ZW9mKHNyY2Fk
ZHIuc2luX2FkZHIpKSkgeworCQkJCWZsYWcgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJYWRk
cnAgPSBhZGRycC0+bmV4dDsKKwkJfQorCQlpZiAoIWZsYWcpCisJCQlicmVhazsKKwkJZGV2cCA9
IGRldnAtPm5leHQ7CisJfQorCisJaWYgKGRldnAgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVy
ciwgIkNvdWxkbid0IGZpbmQgdXNpbmcgZGV2aWNlXG4iKTsKKwkJZXhpdCgtMSk7CisJfQorCisJ
aWYgKHBjYXBfbG9va3VwbmV0KGRldnAtPm5hbWUsICZuZXQsICZtYXNrLCBlcnJidWYpID09IC0x
KSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgZ2V0IG5ldG1hc2sgZm9yIGRldmljZSAl
czogJXNcbiIsCisJCSAgICBkZXZwLT5uYW1lLCBlcnJidWYpOworCQluZXQgPSAwOworCQltYXNr
ID0gMDsKKwl9CisKKwloYW5kbGUgPSBwY2FwX29wZW5fbGl2ZShkZXZwLT5uYW1lLCBCVUZTSVos
IDEsIDEwMDAsIGVycmJ1Zik7CisJaWYgKGhhbmRsZSA9PSBOVUxMKSB7CisJCWZwcmludGYoc3Rk
ZXJyLCAiQ291bGRuJ3Qgb3BlbiBkZXZpY2UgJXM6ICVzXG4iLAorCQkgICAgZGV2cC0+bmFtZSwg
ZXJyYnVmKTsKKwkJZXhpdCgtMSk7CisJfQorCisJcGNhcF9mcmVlYWxsZGV2cyhhbGxkZXZzcCk7
CisKKwlzbnByaW50ZihmaWx0ZXJfZXhwLCBzaXplb2YoZmlsdGVyX2V4cCksCisJICAgICIodGNw
IHNyYyBwb3J0ICVkIGFuZCBkc3QgcG9ydCAlZCkgb3IiCisJICAgICIodGNwIHNyYyBwb3J0ICVk
IGFuZCBkc3QgcG9ydCAlZCkiLAorCSAgICBudG9ocyhzcmNhZGRyLnNpbl9wb3J0KSwgbnRvaHMo
ZHN0YWRkci5zaW5fcG9ydCksCisJICAgIG50b2hzKGRzdGFkZHIuc2luX3BvcnQpLCBudG9ocyhz
cmNhZGRyLnNpbl9wb3J0KSk7CisKKwlpZiAocGNhcF9jb21waWxlKGhhbmRsZSwgJmZwLCBmaWx0
ZXJfZXhwLCAwLCBuZXQpID09IC0xKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGRuJ3QgcGFy
c2UgZmlsdGVyICVzOiAlc1xuIiwKKwkJICAgIGZpbHRlcl9leHAsIHBjYXBfZ2V0ZXJyKGhhbmRs
ZSkpOworCQlleGl0KC0xKTsKKwl9CisJaWYgKHBjYXBfc2V0ZmlsdGVyKGhhbmRsZSwgJmZwKSA9
PSAtMSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGluc3RhbGwgZmlsdGVyICVzOiAl
c1xuIiwKKwkJICAgIGZpbHRlcl9leHAsIHBjYXBfZ2V0ZXJyKGhhbmRsZSkpOworCQlleGl0KC0x
KTsKKwl9CisKKwlwY2FwX2xvb3AoaGFuZGxlLCAtMSwgcGFyc2VfcGFja2V0LCBOVUxMKTsKKwlw
Y2FwX2Nsb3NlKGhhbmRsZSk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK3By
aW50X3Jlc3VsdCgpCit7CisJdGNwX3NlcSByeHRfc2VxOworCWludCBpLCBsYXN0LCByeHRfbnI7
CisJc3RydWN0IHRtICpwOworCQorCS8qIEdldCB0aGUgcmV0cmFuc21pdCBzZXF1ZW5jZSBudW1i
ZXIgKi8KKwlyeHRfc2VxID0gcnh0c1tNQVhfUlhUIC0gMl0udGhfc2VxOworCWZvciAobGFzdCA9
IC0xLCByeHRfbnIgPSAwLCBpID0gMDsgaSA8IE1BWF9SWFQ7IGkrKykgeworCQlpZiAocnh0c1tp
XS50aF9zZXEgJiYKKwkJICAgIChyeHRzW2ldLnRoX3NlcSA9PSByeHRfc2VxIHx8IHJ4dHNbaV0u
dGhfZmxhZ3MgJiBUSF9SU1QpKSB7CisJCQlpZiAocnh0c1tpXS50aF9mbGFncyAmIFRIX1JTVCkK
KwkJCQlwcmludGYoInJlc2V0IHBhY2tldCwgIik7CisJCQllbHNlIGlmIChyeHRfbnIpCisJCQkJ
cHJpbnRmKCJyZXRyYW5zbWl0ICUwMmQsICIsIHJ4dF9ucik7CisJCQllbHNlIGlmICghcnh0X25y
KQorCQkJCXByaW50Zigic2VuZCBwYWNrZXQsICIpOworCQkJcCA9IGxvY2FsdGltZSgmcnh0c1tp
XS50cy50dl9zZWMpOworCQkJcHJpbnRmKCIlMDJkOiUwMmQ6JTAyZC4lLTZ1ICIsIHAtPnRtX2hv
dXIsIHAtPnRtX21pbiwKKwkJCSAgICBwLT50bV9zZWMsIHJ4dHNbaV0udHMudHZfdXNlYyk7CisJ
CQlpZiAobGFzdCAhPSAtMSkgeworCQkJCS8qIHByaW50IGludGVydmFsIGJldHdlZW4gdHdvIHBh
Y2tldHMgKi8KKwkJCQlpZiAocnh0c1tpXS50cy50dl91c2VjIDwgcnh0c1tsYXN0XS50cy50dl91
c2VjKQorCQkJCQlwcmludGYoIiglMnUuJS02dSkgIiwKKwkJCQkJICAgIHJ4dHNbaV0udHMudHZf
c2VjIC0KKwkJCQkJICAgIHJ4dHNbbGFzdF0udHMudHZfc2VjIC0gMSwKKwkJCQkJICAgIDEwMDAw
MDAgKyByeHRzW2ldLnRzLnR2X3VzZWMgLQorCQkJCQkgICAgcnh0c1tsYXN0XS50cy50dl91c2Vj
KTsKKwkJCQllbHNlCisJCQkJCXByaW50ZigiKCUydS4lLTZ1KSAiLAorCQkJCQkgICAgcnh0c1tp
XS50cy50dl9zZWMgLQorCQkJCQkgICAgcnh0c1tsYXN0XS50cy50dl9zZWMsCisJCQkJCSAgICBy
eHRzW2ldLnRzLnR2X3VzZWMgLQorCQkJCQkgICAgcnh0c1tsYXN0XS50cy50dl91c2VjKTsKKwkJ
CX0KKwkJCXByaW50Zigic2VxICV1LCBhY2sgJXUsICIsCisJCQkgICAgcnh0c1tpXS50aF9zZXEs
IHJ4dHNbaV0udGhfYWNrKTsKKwkJCXByaW50Zigid2luICV1XG4iLCByeHRzW2ldLnRoX3dpbik7
CisJCQlsYXN0ID0gaTsKKwkJCXJ4dF9ucisrOworCQl9CisJfQorfQorCitzdGF0aWMgaW50Citw
cmludF91dG9fc3RhdHVzKGludCBzb2NrLCBpbnQgcHJpbnQpCit7CisJc3RhdGljIHN0cnVjdCB0
Y3B1dG8gdHUgPSB7MCwgMH07CisJaW50IGRlZmF1bHRfdXRvID0gMSArIDIgKyA0ICsgOCArIDE2
ICsgMzIgKyA2NCArCisJICAgIDY0ICsgNjQgKyA2NCArIDY0ICsgNjQgKyA2NDsKKwlpbnQgb3B0
bGVuOworCWludCB1dG92YWw7CisKKwlvcHRsZW4gPSBzaXplb2YodHUpOworCSh2b2lkKWdldHNv
Y2tvcHQoc29jaywgSVBQUk9UT19UQ1AsIFRDUF9VVE8sICZ0dSwgJm9wdGxlbik7CisJaWYgKHBy
aW50KSB7CisJCWlmICh0dS5mbGFncyAmIFRDUF9VVE9fRU5BQkxFKSB7CisJCQlwcmludGYoInRj
cHV0bzogZW5hYmxlZCwgIik7CisJCQlpZiAodHUuZmxhZ3MgJiBUQ1BfVVRPX1NUT1JFKSB7CisJ
CQkJcHJpbnRmKCJ1c2VyIHRpbWVvdXQoY2hhbmdlZCk6ICVkIHNlY29uZHNcbiIsCisJCQkJICAg
IHR1LnV0byk7CisJCQkJdXRvdmFsID0gdHUudXRvOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGYo
InVzZXIgdGltZW91dChkZWZhdWx0KTogJWQgc2Vjb25kc1xuIiwKKwkJCQkgICAgZGVmYXVsdF91
dG8pOworCQkJCXV0b3ZhbCA9IGRlZmF1bHRfdXRvOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJp
bnRmKCJ0Y3B1dG86IGRpc2FibGVkLCBkZWZhdWx0IHRpbWVvdXQ6ICVkICIKKwkJCSAgICAic2Vj
b25kc1xuIiwgZGVmYXVsdF91dG8pOworCQkJdXRvdmFsID0gZGVmYXVsdF91dG87CisJCX0KKwl9
CisKKwlyZXR1cm4gKHV0b3ZhbCk7Cit9CisKK3N0YXRpYyB2b2lkCit1c2FnZSh2b2lkKQorewor
CWZwcmludGYoc3RkZXJyLCAidGNwdXRvIHNlcnZlciBwb3J0IFt1dG8gW3RpbWVvdXRdXVxuIik7
CisJZnByaW50ZihzdGRlcnIsICJ0Y3B1dG8gY2xpZW50IGlwIHBvcnQgW3V0byBbdGltZW91dF1d
XG4iKTsKKwlleGl0KC0xKTsKK30KKworc3RhdGljIGludAordGNwdXRvX3RpbWVyKHZvaWQpCit7
CisJc3RhdGljIHRpbWVfdCBzdGFydF90aW1lID0gMDsKKwl0aW1lX3QgZW5kX3RpbWU7CisJdGlt
ZV90IGludGVydmFsOworCisJaWYgKHN0YXJ0X3RpbWUgPT0gMCkgeworCQl0aW1lKCZzdGFydF90
aW1lKTsKKwkJaW50ZXJ2YWwgPSAwOworCX0gZWxzZSB7CisJCXRpbWUoJmVuZF90aW1lKTsKKwkJ
aW50ZXJ2YWwgPSBlbmRfdGltZSAtIHN0YXJ0X3RpbWU7CisJCXN0YXJ0X3RpbWUgPSAwOworCX0K
KworCXJldHVybiAoaW50KShpbnRlcnZhbCk7Cit9CisKK3N0YXRpYyB2b2lkCit0Y3B1dG9fc2Vy
dmVyKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGxpc3Rlbl9zb2NrLCBhY2NlcHRf
c29jazsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworCWNoYXIgKmR1bW15OworCWNoYXIgYnVm
WzgqMTAyNF07CisJbG9uZyBwb3J0OworCWludCB1c2VyX3RpbWVvdXQ7CisJaW50IG9wdHZhbDsK
KwlzdHJ1Y3QgdGNwdXRvIHV0bzsKKwlwdGhyZWFkX3QgdGlkOworCisJaWYgKGFyZ2MgPCAxICYm
IGFyZ2MgPiAzKQorCQl1c2FnZSgpOworCisJYnplcm8oJnNpbiwgc2l6ZW9mKHNpbikpOworCXNp
bi5zaW5fbGVuID0gc2l6ZW9mKHNpbik7CisJc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXNp
bi5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfQU5ZKTsKKworCXBvcnQgPSBzdHJ0b3Vs
KGFyZ3ZbMF0sICZkdW1teSwgMTApOworCWlmIChwb3J0IDwgMSB8fCBwb3J0ID4gNjU1MzUgfHwg
KmR1bW15ICE9ICdcMCcpCisJCXVzYWdlKCk7CisJc2luLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7
CisKKwlsaXN0ZW5fc29jayA9IHNvY2tldChQRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisJaWYg
KGxpc3Rlbl9zb2NrID09IC0xKQorCQllcnIoLTEsICJzb2NrZXQiKTsKKwlvcHR2YWwgPSAxOwor
CWlmIChzZXRzb2Nrb3B0KGxpc3Rlbl9zb2NrLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZv
cHR2YWwsCisJICAgIHNpemVvZihvcHR2YWwpKSA9PSAtMSkKKwkJZXJyKC0xLCAic2V0c29ja29w
dCIpOworCisJaWYgKGJpbmQobGlzdGVuX3NvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2luLCBz
aXplb2Yoc2luKSkgPT0gLTEpCisJCWVycigtMSwgImJpbmQiKTsKKworCWlmIChsaXN0ZW4obGlz
dGVuX3NvY2ssIC0xKSA9PSAtMSkKKwkJZXJyKC0xLCAibGlzdGVuIik7CisKKwlhY2NlcHRfc29j
ayA9IGFjY2VwdChsaXN0ZW5fc29jaywgTlVMTCwgTlVMTCk7CisJaWYgKGFjY2VwdF9zb2NrID09
IC0xKQorCQllcnIoLTEsICJhY2NlcHQiKTsKKwljbG9zZShsaXN0ZW5fc29jayk7CisKKwlpZiAo
cHRocmVhZF9jcmVhdGUoJnRpZCwgTlVMTCwgZHVtcF9wYWNrZXQsICh2b2lkICopJmFjY2VwdF9z
b2NrKSkKKwkJZXJyKC0xLCAiY3JlYXRlIHRocmVhZCIpOworCisJaWYgKGFyZ2MgPj0gMikgewor
CQltZW1zZXQoJnV0bywgMCwgc2l6ZW9mKHV0bykpOworCQkvKgorCQkgKiBJZiBUQ1AgVVRPIGlz
IGVuYWJsZWQgYnV0IG5vdCBzZXQsIG1ha2UgaXQgY2hhbmdlYWJsZSwKKwkJICogb3RoZXJ3aXNl
LCBtYWtlIGl0IHVuY2hhbmdlYWJsZS4KKwkJICovCisJCWlmICghc3RyY21wKGFyZ3ZbMV0sICJ1
dG8iKSkgeworCQkJdXRvLmZsYWdzIHw9IFRDUF9VVE9fRU5BQkxFOworCQkJdXRvLmZsYWdzIHw9
IFRDUF9VVE9fQ0hBTkdFOworCQl9IGVsc2UKKwkJCXVzYWdlKCk7CisJCWlmIChhcmdjID09IDMp
IHsKKwkJCXV0by51dG8gPSBzdHJ0b3VsKGFyZ3ZbMl0sICZkdW1teSwgMTApOworCQkJaWYgKHV0
by51dG8gPD0gMCB8fCAqZHVtbXkgIT0gJ1wwJykKKwkJCQl1c2FnZSgpOworCQkJdXRvLmZsYWdz
IHw9IFRDUF9VVE9fU1RPUkU7CisJCQl1dG8uZmxhZ3MgJj0gflRDUF9VVE9fQ0hBTkdFOworCQl9
CisJCWlmIChzZXRzb2Nrb3B0KGFjY2VwdF9zb2NrLCBJUFBST1RPX1RDUCwgVENQX1VUTywgJnV0
bywKKwkJICAgIHNpemVvZih1dG8pKSA9PSAtMSkKKwkJCWVycigtMSwgInNldHNvY2tvcHQiKTsK
Kwl9CisKKwlvcHR2YWwgPSA0KjEwMjQ7CisJaWYgKHNldHNvY2tvcHQoYWNjZXB0X3NvY2ssIFNP
TF9TT0NLRVQsIFNPX1NOREJVRiwgJm9wdHZhbCwKKwkgICAgc2l6ZW9mKG9wdHZhbCkpID09IC0x
KQorCQllcnIoLTEsICJzZXRzb2Nrb3B0Iik7CisKKwlmb3IgKDs7KSB7CisJCXNsZWVwKDEpOwor
CQl3aGlsZSAocmVjdihhY2NlcHRfc29jaywgYnVmLCA4KjEwMjQsIE1TR19ET05UV0FJVCkgPiAw
KQorCQkJOworCQkodm9pZCl0Y3B1dG9fdGltZXIoKTsKKwkJLyoKKwkJICogU2VuZCBtb3JlIGRh
dGEgdGhhbiBzb2NrZXQgc2VuZCBidWZmZXIsCisJCSAqIHNvIHRoYXQgZGF0YSBhcmUgbm90IGJ1
ZmZlcmVkLgorCQkgKi8KKwkJaWYgKHNlbmQoYWNjZXB0X3NvY2ssIGJ1ZiwgOCoxMDI0LCBNU0df
Tk9TSUdOQUwpID49IDApIHsKKwkJCSh2b2lkKXRjcHV0b190aW1lcigpOworCQkJKHZvaWQpcHJp
bnRfdXRvX3N0YXR1cyhhY2NlcHRfc29jaywgMCk7CisJCQljb250aW51ZTsKKwkJfQorCQl1c2Vy
X3RpbWVvdXQgPSB0Y3B1dG9fdGltZXIoKTsKKwkJcHJpbnRmKCJDb25uZWN0aW9uIHRpbWVvdXQs
ICVkIHNlY29uZHMuXG4iLCB1c2VyX3RpbWVvdXQpOworCQlicmVhazsKKwl9CisJLyogd2FpdCBm
b3IgdGhlIHJlc2V0IHBhY2tldCB0byBiZSBjYXB0dXJlZCAqLworCXNsZWVwKDEpOworCSh2b2lk
KXB0aHJlYWRfa2lsbCh0aWQsIFNJR1RFUk0pOworCisJY2xvc2UoYWNjZXB0X3NvY2spOworfQor
CitzdGF0aWMgdm9pZAordGNwdXRvX2NsaWVudChpbnQgYXJnYywgY2hhciAqYXJndltdKQorewor
CXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisJbG9uZyBwb3J0OworCWNoYXIgKmR1bW15OworCWNo
YXIgYnVmWzgqMTAyNF07CisJaW50IHNvY2s7CisJaW50IHVzZXJfdGltZW91dDsKKwlpbnQgb3B0
dmFsOworCXN0cnVjdCB0Y3B1dG8gdXRvOworCXB0aHJlYWRfdCB0aWQ7CisKKwlpZiAoYXJnYyA8
IDIgJiYgYXJnYyA+IDQpCisJCXVzYWdlKCk7CisKKwliemVybygmc2luLCBzaXplb2Yoc2luKSk7
CisJc2luLnNpbl9sZW4gPSBzaXplb2Yoc2luKTsKKwlzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7
CisJaWYgKGluZXRfYXRvbihhcmd2WzBdLCAmc2luLnNpbl9hZGRyKSA9PSAwKQorCQllcnIoLTEs
ICJjb252ZXJ0IGFkZHJlc3MiKTsKKworCXBvcnQgPSBzdHJ0b3VsKGFyZ3ZbMV0sICZkdW1teSwg
MTApOworCWlmIChwb3J0IDwgMSB8fCBwb3J0ID4gNjU1MzUgfHwgKmR1bW15ICE9ICdcMCcpCisJ
CXVzYWdlKCk7CisJc2luLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisJc29jayA9IHNvY2tldChQ
Rl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisJaWYgKHNvY2sgPT0gLTEpCisJCWVycigtMSwgInNv
Y2tldCIpOworCisJb3B0dmFsID0gNCoxMDI0OworCWlmIChzZXRzb2Nrb3B0KHNvY2ssIFNPTF9T
T0NLRVQsIFNPX1NOREJVRiwgJm9wdHZhbCwKKwkgICAgc2l6ZW9mKG9wdHZhbCkpID09IC0xKQor
CQllcnIoLTEsICJzZXRzb2Nrb3B0Iik7CisKKwlpZiAoYXJnYyA+PSAzKSB7CisJCW1lbXNldCgm
dXRvLCAwLCBzaXplb2YodXRvKSk7CisJCS8qCisJCSAqIElmIFRDUCBVVE8gaXMgZW5hYmxlZCBi
dXQgbm90IHNldCwgbWFrZSBpdCBjaGFuZ2VhYmxlLAorCQkgKiBvdGhlcndpc2UsIG1ha2UgaXQg
dW5jaGFuZ2VhYmxlLgorCQkgKi8KKwkJaWYgKCFzdHJjbXAoYXJndlsyXSwgInV0byIpKSB7CisJ
CQl1dG8uZmxhZ3MgfD0gVENQX1VUT19FTkFCTEU7CisJCQl1dG8uZmxhZ3MgfD0gVENQX1VUT19D
SEFOR0U7CisJCX0gZWxzZQorCQkJdXNhZ2UoKTsKKwkJaWYgKGFyZ2MgPT0gNCkgeworCQkJdXRv
LnV0byA9IHN0cnRvdWwoYXJndlszXSwgJmR1bW15LCAxMCk7CisJCQlpZiAodXRvLnV0byA8PSAw
IHx8ICpkdW1teSAhPSAnXDAnKQorCQkJCXVzYWdlKCk7CisJCQl1dG8uZmxhZ3MgfD0gVENQX1VU
T19TVE9SRTsKKwkJCXV0by5mbGFncyAmPSB+VENQX1VUT19DSEFOR0U7CisJCX0KKwkJaWYgKHNl
dHNvY2tvcHQoc29jaywgSVBQUk9UT19UQ1AsIFRDUF9VVE8sICZ1dG8sCisJCSAgICBzaXplb2Yo
dXRvKSkgPT0gLTEpCisJCQllcnIoLTEsICJzZXRzb2Nrb3B0Iik7CisJfQorCisJaWYgKGNvbm5l
Y3Qoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzaW4sIHNpemVvZihzaW4pKSA9PSAtMSkKKwkJ
ZXJyKC0xLCAiY29ubmVjdCIpOworCisJaWYgKHB0aHJlYWRfY3JlYXRlKCZ0aWQsIE5VTEwsIGR1
bXBfcGFja2V0LCAodm9pZCAqKSZzb2NrKSkKKwkJZXJyKC0xLCAiY3JlYXRlIHRocmVhZCIpOwor
CisJZm9yICg7OykgeworCQlzbGVlcCgxKTsKKwkJd2hpbGUocmVjdihzb2NrLCBidWYsIDgqMTAy
NCwgTVNHX0RPTlRXQUlUKSA+IDApCisJCQk7CisJCSh2b2lkKXRjcHV0b190aW1lcigpOworCQkv
KgorCQkgKiBTZW5kIG1vcmUgZGF0YSB0aGFuIHNvY2tldCBzZW5kIGJ1ZmZlciwKKwkJICogc28g
dGhhdCBkYXRhIGFyZSBub3QgYnVmZmVyZWQuCisJCSAqLworCQlpZiAoc2VuZChzb2NrLCBidWYs
IDgqMTAyNCwgTVNHX05PU0lHTkFMKSA+IDApIHsKKwkJCSh2b2lkKXRjcHV0b190aW1lcigpOwor
CQkJKHZvaWQpcHJpbnRfdXRvX3N0YXR1cyhzb2NrLCAwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJ
CXVzZXJfdGltZW91dCA9IHRjcHV0b190aW1lcigpOworCQlwcmludGYoIkNvbm5lY3Rpb24gdGlt
ZW91dCwgJWQgc2Vjb25kcy5cbiIsIHVzZXJfdGltZW91dCk7CisJCWJyZWFrOworCX0KKwkvKiB3
YWl0IGZvciB0aGUgcmVzZXQgcGFja2V0IHRvIGJlIGNhcHR1cmVkICovCisJc2xlZXAoMSk7CisJ
KHZvaWQpcHRocmVhZF9raWxsKHRpZCwgU0lHVEVSTSk7CisKKwljbG9zZShzb2NrKTsKK30KKwor
aW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IHV0b3ZhbDsKKworCWlm
IChhcmdjIDwgMikKKwkJdXNhZ2UoKTsKKworCWlmIChzdHJjbXAoYXJndlsxXSwgInNlcnZlciIp
ID09IDApCisJCXRjcHV0b19zZXJ2ZXIoYXJnYyAtIDIsIGFyZ3YgKyAyKTsKKwllbHNlIGlmIChz
dHJjbXAoYXJndlsxXSwgImNsaWVudCIpID09IDApCisJCXRjcHV0b19jbGllbnQoYXJnYyAtIDIs
IGFyZ3YgKyAyKTsKKwllbHNlCisJCXVzYWdlKCk7CisJCisJKHZvaWQpcHJpbnRfdXRvX3N0YXR1
cygtMSwgMSk7CisJcHJpbnRfcmVzdWx0KCk7CisKKwlleGl0KDApOworfQorCgpQcm9wZXJ0eSBj
aGFuZ2VzIG9uOiB0b29scy9yZWdyZXNzaW9uL25ldGluZXQvdGNwdXRvL3RjcHV0by5jCl9fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX18KQWRkZWQ6IHN2bjptaW1lLXR5cGUKICAgKyB0ZXh0L3BsYWluCkFkZGVkOiBzdm46a2V5
d29yZHMKICAgKyBGcmVlQlNEPSVICkFkZGVkOiBzdm46ZW9sLXN0eWxlCiAgICsgbmF0aXZlCgpJ
bmRleDogdG9vbHMvcmVncmVzc2lvbi9uZXRpbmV0L3RjcHV0by9NYWtlZmlsZQo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSB0b29scy9yZWdyZXNzaW9uL25ldGluZXQvdGNwdXRvL01ha2VmaWxlCShyZXZpc2lvbiAw
KQorKysgdG9vbHMvcmVncmVzc2lvbi9uZXRpbmV0L3RjcHV0by9NYWtlZmlsZQkocmV2aXNpb24g
MCkKQEAgLTAsMCArMSw4IEBACisjICRGcmVlQlNEJAorCitQUk9HPQl0Y3B1dG8KK0RQQUREPQkk
e0xJQlBDQVB9ICR7TElCUFRIUkVBRH0KK0xEQUREPQktbHBjYXAgLWxwdGhyZWFkCitOT19NQU49
CisKKy5pbmNsdWRlIDxic2QucHJvZy5taz4KClByb3BlcnR5IGNoYW5nZXMgb246IHRvb2xzL3Jl
Z3Jlc3Npb24vbmV0aW5ldC90Y3B1dG8vTWFrZWZpbGUKX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpBZGRlZDogc3ZuOm1p
bWUtdHlwZQogICArIHRleHQvcGxhaW4KQWRkZWQ6IHN2bjprZXl3b3JkcwogICArIEZyZWVCU0Q9
JUgKQWRkZWQ6IHN2bjplb2wtc3R5bGUKICAgKyBuYXRpdmUKCkluZGV4OiB0b29scy9yZWdyZXNz
aW9uL25ldGluZXQvdGNwdXRvL1JFQURNRQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSB0b29scy9yZWdyZXNzaW9u
L25ldGluZXQvdGNwdXRvL1JFQURNRQkocmV2aXNpb24gMCkKKysrIHRvb2xzL3JlZ3Jlc3Npb24v
bmV0aW5ldC90Y3B1dG8vUkVBRE1FCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDIzIEBACit0Y3B1
dG8gLSBhIHNpbXBsZSBUQ1AgdXNlciB0aW1lb3V0IHRlc3QgdG9vbAorLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordGNwdXRvIGdlbmVyYXRlcyBUQ1AgY29u
bmVjdGlvbnMgYmV0d2VlbiBhICdjbGllbnQnIGFuZCBhICdzZXJ2ZXInLiAgVGhlCitjbGllbnQg
YW5kIHNlcnZlciB3cml0ZXMgYSBmaXggYnl0ZSBzdHJlYW0gdXNpbmcgd3JpdGUgc2l6ZXMgdGhh
dCBncmVhdGVyCit0aGFuIHNvY2tldCBvdXRwdXQgYnVmZmVyIGFuZCByZWFkcyBhbGwgYXZhaWxh
YmxlIGJ5dGVzIGluIG5vbmJsb2NrIG1vZGUuCitUbyBydW4gVENQIHVzZXIgdGltZW91dCB0ZXN0
LCB0aGUgVENQIGNvbm5lY3Rpb24gbXVzdCBiZSBicm9rZW4gd2l0aG91dAorZGV0ZWN0ZWQgYnkg
b3BlcmF0aW5nIHN5c3RlbSwgZm9yIGV4YW1wbGUsIGJyaW5nIGRvd24gYW4gaW50ZXJtZWRpYXRl
IAorcm91dGVyIHRoYXQgZG9lcyBub3QgY29ubmVjdCB0byB0aGUgY2xpZW50IG9yIHNlcnZlciBk
aXJlY3RseS4gIFRoZW4sIHNlbGVjdAorYSBwb3J0IG51bWJlciAoZm9yIHRoZSBjbGllbnQgYW5k
IHNlcnZlcikgYW5kIGRlY2lkZSB3aGV0aGVyIGVuYWJsZSBUQ1AgdXNlcgordGltZW91dCBhbmQg
dGhlIHZhbHVlIG9mIHVzZXIgdGltZW91dCB0byBzZW5kLiAgVHlwaWNhbCB1c2UgbWlnaHQgYmU6
CisKK1J1biB0aGUgc2VydmVyIG9uIHBvcnQgODA4MCBhbmQgZW5hYmxlIFRDUCB1c2VyIHRpbWVv
dXQ6CisKKyAgICB0Y3B1dG8gc2VydmVyIDgwODAgdXRvCisKK05vdyBydW4gdGhlIGNsaWVudCBv
biBhIHNlY29uZCBtYWNoaW5lIHdpdGggdGhlIHNlcnZlcidzIElQLCBwb3J0IDgwODAsIGVuYWJs
ZQorVENQIHVzZXIgdGltZW91dCwgYW5kIHNlbmQgYSA3MDAgc2Vjb25kcyB1c2VyIHRpbWVvdXQg
dmFsdWU6CisKKyAgICB0Y3B1dG8gY2xpZW50IDE5Mi4xNjguMTAuMTAgODA4MCB1dG8gNzAwCisK
K0FmdGVyIHRoYXQsIGludGVycnVwdCB0aGUgY29ubmVjdGlvbiB3aXRob3V0IGRldGVjdGVkIGJ5
IG9wZXJhdGluZyBzeXN0ZW0sIGFuZAord2FpdCB1bnRpbCBwcm9jZXNzIGV4aXRzLgo=
--0050450176f461d4580472878f74--



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