Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 4 Jan 2015 11:56:14 -0600
From:      Bryan Venteicher <bryanv@daemoninthecloset.org>
To:        FreeBSD-current <freebsd-current@freebsd.org>
Cc:        freebsd-arch@freebsd.org
Subject:   [CFT] Paravirtualized KVM clock
Message-ID:  <CAMo0n6QUp3iZ2fEqbrsD2MhEsWWOPTLisd9iB7TNEvbevcK0Fw@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
--001a11425fb46ce52b050bd74b4a
Content-Type: text/plain; charset=UTF-8

For the last few weeks, I've been working on adding support for KVM clock
in the projects/paravirt branch. Currently, a KVM VM guest will end up
selecting either the HPET or ACPI as the timecounter source. Unfortunately,
this is very costly since every timecounter fetch causes a VM exit. KVM
clock allows the guest to use the TSC instead; it is very similar to the
existing Xen timer.

The performance difference between HPET/ACPI and KVMCLOCK can be dramatic:
a simple disk benchmark goes from 10K IOPs to 100K IOPs.

The patch is attached is attached or available at [1]. I'd appreciate any
testing.

Also as a part of this, I've tried to generalized a bit of our existing
hypervisor guest code, with the eventual goal of being able to support more
invasive PV operations. The patch series is viewable in Phabricator.

https://reviews.freebsd.org/D1429 - paravirt: Generalize parts of the XEN
timer code into pvclock
https://reviews.freebsd.org/D1430 - paravirt: Add interface to calculate
the TSC frequency from pvclock
https://reviews.freebsd.org/D1431 - paravirt: Add simple hypervisor
registration and detection interface
https://reviews.freebsd.org/D1432 - paravirt: Add detection of bhyve using
new hypervisor interface
https://reviews.freebsd.org/D1433 - paravirt: Add detection of VMware using
new hypervisor interface
https://reviews.freebsd.org/D1434 - paravirt: Add detection of KVM using
new hypervisor interface
https://reviews.freebsd.org/D1435 - paravirt: Add KVM clock timecounter
support

My current plan is to MFC this series to 10-STABLE, and commit a
self-contained KVM clock to the other stable branches.

[1] - https://people.freebsd.org/~bryanv/patches/kvm_clock-1.patch

--001a11425fb46ce52b050bd74b4a
Content-Type: text/x-patch; charset=US-ASCII; name="kvm_clock-1.patch"
Content-Disposition: attachment; filename="kvm_clock-1.patch"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_i4ipow0z0

ZGlmZiAtLWdpdCBhL3N5cy9hbWQ2NC9pbmNsdWRlL3B2Y2xvY2suaCBiL3N5cy9hbWQ2NC9pbmNs
dWRlL3B2Y2xvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDFmYWM2
Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL2FtZDY0L2luY2x1ZGUvcHZjbG9jay5oCkBAIC0wLDAg
KzEsNiBAQAorLyotCisgKiBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uCisgKi8K
Ky8qICRGcmVlQlNEJCAqLworCisjaW5jbHVkZSA8eDg2L3B2Y2xvY2suaD4KZGlmZiAtLWdpdCBh
L3N5cy9jb25mL2ZpbGVzLmFtZDY0IGIvc3lzL2NvbmYvZmlsZXMuYW1kNjQKaW5kZXggYmJiZTgy
Ny4uN2Q4NTc0MiAxMDA2NDQKLS0tIGEvc3lzL2NvbmYvZmlsZXMuYW1kNjQKKysrIGIvc3lzL2Nv
bmYvZmlsZXMuYW1kNjQKQEAgLTU1NSwxMyArNTU1LDE3IEBAIHg4Ni9pc2Evbm1pLmMJCQlzdGFu
ZGFyZAogeDg2L2lzYS9vcm0uYwkJCW9wdGlvbmFsCWlzYQogeDg2L3BjaS9wY2lfYnVzLmMJCW9w
dGlvbmFsCXBjaQogeDg2L3BjaS9xcGkuYwkJCW9wdGlvbmFsCXBjaQoreDg2L3g4Ni9iaHl2ZS5j
CQkJc3RhbmRhcmQKIHg4Ni94ODYvYnVzZG1hX2JvdW5jZS5jCQlzdGFuZGFyZAogeDg2L3g4Ni9i
dXNkbWFfbWFjaGRlcC5jCXN0YW5kYXJkCiB4ODYveDg2L2R1bXBfbWFjaGRlcC5jCQlzdGFuZGFy
ZAogeDg2L3g4Ni9mZHRfbWFjaGRlcC5jCQlvcHRpb25hbAlmZHQKK3g4Ni94ODYvaHlwZXJ2aXNv
ci5jCQlzdGFuZGFyZAogeDg2L3g4Ni9pZGVudGNwdS5jCQlzdGFuZGFyZAogeDg2L3g4Ni9pbnRy
X21hY2hkZXAuYwkJc3RhbmRhcmQKIHg4Ni94ODYvaW9fYXBpYy5jCQlzdGFuZGFyZAoreDg2L3g4
Ni9rdm0uYwkJCXN0YW5kYXJkCit4ODYveDg2L2t2bV9jbG9jay5jCQlzdGFuZGFyZAogeDg2L3g4
Ni9sZWdhY3kuYwkJc3RhbmRhcmQKIHg4Ni94ODYvbG9jYWxfYXBpYy5jCQlzdGFuZGFyZAogeDg2
L3g4Ni9tY2EuYwkJCXN0YW5kYXJkCkBAIC01NjksOCArNTczLDEwIEBAIHg4Ni94ODYvbXB0YWJs
ZS5jCQlvcHRpb25hbAltcHRhYmxlCiB4ODYveDg2L21wdGFibGVfcGNpLmMJCW9wdGlvbmFsCW1w
dGFibGUgcGNpCiB4ODYveDg2L21zaS5jCQkJb3B0aW9uYWwJcGNpCiB4ODYveDg2L25leHVzLmMJ
CQlzdGFuZGFyZAoreDg2L3g4Ni9wdmNsb2NrLmMJCXN0YW5kYXJkCiB4ODYveDg2L3RzYy5jCQkJ
c3RhbmRhcmQKIHg4Ni94ODYvZGVsYXkuYwkJCXN0YW5kYXJkCit4ODYveDg2L3Ztd2FyZS5jCQlz
dGFuZGFyZAogeDg2L3hlbi9odm0uYwkJCW9wdGlvbmFsCXhlbmh2bQogeDg2L3hlbi94ZW5faW50
ci5jCQlvcHRpb25hbAl4ZW4gfCB4ZW5odm0KIHg4Ni94ZW4vcHYuYwkJCW9wdGlvbmFsCXhlbmh2
bQpkaWZmIC0tZ2l0IGEvc3lzL2NvbmYvZmlsZXMuaTM4NiBiL3N5cy9jb25mL2ZpbGVzLmkzODYK
aW5kZXggOTY4NzliOC4uY2E4M2M0YyAxMDA2NDQKLS0tIGEvc3lzL2NvbmYvZmlsZXMuaTM4Ngor
KysgYi9zeXMvY29uZi9maWxlcy5pMzg2CkBAIC01NzMsMTMgKzU3MywxNyBAQCB4ODYvaXNhL25t
aS5jCQkJc3RhbmRhcmQKIHg4Ni9pc2Evb3JtLmMJCQlvcHRpb25hbCBpc2EKIHg4Ni9wY2kvcGNp
X2J1cy5jCQlvcHRpb25hbCBwY2kKIHg4Ni9wY2kvcXBpLmMJCQlvcHRpb25hbCBwY2kKK3g4Ni94
ODYvYmh5dmUuYwkJCXN0YW5kYXJkCiB4ODYveDg2L2J1c2RtYV9ib3VuY2UuYwkJc3RhbmRhcmQK
IHg4Ni94ODYvYnVzZG1hX21hY2hkZXAuYwlzdGFuZGFyZAogeDg2L3g4Ni9kdW1wX21hY2hkZXAu
YwkJc3RhbmRhcmQKIHg4Ni94ODYvZmR0X21hY2hkZXAuYwkJb3B0aW9uYWwgZmR0Cit4ODYveDg2
L2h5cGVydmlzb3IuYwkJc3RhbmRhcmQKIHg4Ni94ODYvaWRlbnRjcHUuYwkJc3RhbmRhcmQKIHg4
Ni94ODYvaW50cl9tYWNoZGVwLmMJCXN0YW5kYXJkCiB4ODYveDg2L2lvX2FwaWMuYwkJb3B0aW9u
YWwgYXBpYworeDg2L3g4Ni9rdm0uYwkJCXN0YW5kYXJkCit4ODYveDg2L2t2bV9jbG9jay5jCQlz
dGFuZGFyZAogeDg2L3g4Ni9sZWdhY3kuYwkJb3B0aW9uYWwgbmF0aXZlCiB4ODYveDg2L2xvY2Fs
X2FwaWMuYwkJb3B0aW9uYWwgYXBpYwogeDg2L3g4Ni9tY2EuYwkJCXN0YW5kYXJkCkBAIC01ODgs
NyArNTkyLDkgQEAgeDg2L3g4Ni9tcHRhYmxlX3BjaS5jCQlvcHRpb25hbCBhcGljIG5hdGl2ZSBw
Y2kKIHg4Ni94ODYvbXNpLmMJCQlvcHRpb25hbCBhcGljIHBjaQogeDg2L3g4Ni9uZXh1cy5jCQkJ
c3RhbmRhcmQKIHg4Ni94ODYvdHNjLmMJCQlzdGFuZGFyZAoreDg2L3g4Ni9wdmNsb2NrLmMJCXN0
YW5kYXJkCiB4ODYveDg2L2RlbGF5LmMJCQlzdGFuZGFyZAoreDg2L3g4Ni92bXdhcmUuYwkJc3Rh
bmRhcmQKIHg4Ni94ZW4vaHZtLmMJCQlvcHRpb25hbCB4ZW5odm0KIHg4Ni94ZW4veGVuX2ludHIu
YwkJb3B0aW9uYWwgeGVuIHwgeGVuaHZtCiB4ODYveGVuL3hlbl9hcGljLmMJCW9wdGlvbmFsIHhl
bmh2bQpkaWZmIC0tZ2l0IGEvc3lzL2Rldi94ZW4vdGltZXIvdGltZXIuYyBiL3N5cy9kZXYveGVu
L3RpbWVyL3RpbWVyLmMKaW5kZXggNTc0MzA3Ni4uNTNhZmYwYSAxMDA2NDQKLS0tIGEvc3lzL2Rl
di94ZW4vdGltZXIvdGltZXIuYworKysgYi9zeXMvZGV2L3hlbi90aW1lci90aW1lci5jCkBAIC01
OSw2ICs1OSw3IEBAIF9fRkJTRElEKCIkRnJlZUJTRCQiKTsKICNpbmNsdWRlIDxtYWNoaW5lL2Ns
b2NrLmg+CiAjaW5jbHVkZSA8bWFjaGluZS9faW50dHlwZXMuaD4KICNpbmNsdWRlIDxtYWNoaW5l
L3NtcC5oPgorI2luY2x1ZGUgPG1hY2hpbmUvcHZjbG9jay5oPgogCiAjaW5jbHVkZSA8ZGV2L3hl
bi90aW1lci90aW1lci5oPgogCkBAIC05NSw5ICs5Niw2IEBAIHN0cnVjdCB4ZW50aW1lcl9zb2Z0
YyB7CiAJc3RydWN0IGV2ZW50dGltZXIgZXQ7CiB9OwogCi0vKiBMYXN0IHRpbWU7IHRoaXMgZ3Vh
cmFudGVlcyBhIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBjbG9jay4gKi8KLXZvbGF0aWxlIHVp
bnQ2NF90IHhlbl90aW1lcl9sYXN0X3RpbWUgPSAwOwotCiBzdGF0aWMgdm9pZAogeGVudGltZXJf
aWRlbnRpZnkoZHJpdmVyX3QgKmRyaXZlciwgZGV2aWNlX3QgcGFyZW50KQogewpAQCAtMTQ4LDEy
OCArMTQ2LDIwIEBAIHhlbnRpbWVyX3Byb2JlKGRldmljZV90IGRldikKIAlyZXR1cm4gKEJVU19Q
Uk9CRV9OT1dJTERDQVJEKTsKIH0KIAotLyoKLSAqIFNjYWxlIGEgNjQtYml0IGRlbHRhIGJ5IHNj
YWxpbmcgYW5kIG11bHRpcGx5aW5nIGJ5IGEgMzItYml0IGZyYWN0aW9uLAotICogeWllbGRpbmcg
YSA2NC1iaXQgcmVzdWx0LgotICovCi1zdGF0aWMgaW5saW5lIHVpbnQ2NF90Ci1zY2FsZV9kZWx0
YSh1aW50NjRfdCBkZWx0YSwgdWludDMyX3QgbXVsX2ZyYWMsIGludCBzaGlmdCkKLXsKLQl1aW50
NjRfdCBwcm9kdWN0OwotCi0JaWYgKHNoaWZ0IDwgMCkKLQkJZGVsdGEgPj49IC1zaGlmdDsKLQll
bHNlCi0JCWRlbHRhIDw8PSBzaGlmdDsKLQotI2lmIGRlZmluZWQoX19pMzg2X18pCi0JewotCQl1
aW50MzJfdCB0bXAxLCB0bXAyOwotCi0JCS8qKgotCQkgKiBGb3IgaTM4NiwgdGhlIGZvcm11bGEg
bG9va3MgbGlrZToKLQkJICoKLQkJICogICBsb3dlciA9IChtdWxfZnJhYyAqIChkZWx0YSAmIFVJ
TlRfTUFYKSkgPj4gMzIKLQkJICogICB1cHBlciA9IG11bF9mcmFjICogKGRlbHRhID4+IDMyKQot
CQkgKiAgIHByb2R1Y3QgPSBsb3dlciArIHVwcGVyCi0JCSAqLwotCQlfX2FzbV9fICgKLQkJCSJt
dWwgICU1ICAgICAgIDsgIgotCQkJIm1vdiAgJTQsJSVlYXggOyAiCi0JCQkibW92ICAlJWVkeCwl
NCA7ICIKLQkJCSJtdWwgICU1ICAgICAgIDsgIgotCQkJInhvciAgJTUsJTUgICAgOyAiCi0JCQki
YWRkICAlNCwlJWVheCA7ICIKLQkJCSJhZGMgICU1LCUlZWR4IDsgIgotCQkJOiAiPUEiIChwcm9k
dWN0KSwgIj1yIiAodG1wMSksICI9ciIgKHRtcDIpCi0JCQk6ICJhIiAoKHVpbnQzMl90KWRlbHRh
KSwgIjEiICgodWludDMyX3QpKGRlbHRhID4+IDMyKSksCi0JCQkgICIyIiAobXVsX2ZyYWMpICk7
Ci0JfQotI2VsaWYgZGVmaW5lZChfX2FtZDY0X18pCi0JewotCQl1bnNpZ25lZCBsb25nIHRtcDsK
LQotCQlfX2FzbV9fICgKLQkJCSJtdWxxICVbbXVsX2ZyYWNdIDsgc2hyZCAkMzIsICVbaGldLCAl
W2xvXSIKLQkJCTogW2xvXSI9YSIgKHByb2R1Y3QpLCBbaGldIj1kIiAodG1wKQotCQkJOiAiMCIg
KGRlbHRhKSwgW211bF9mcmFjXSJybSIoKHVpbnQ2NF90KW11bF9mcmFjKSk7Ci0JfQotI2Vsc2UK
LSNlcnJvciAieGVudGltZXI6IHVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZSIKLSNlbmRpZgotCi0J
cmV0dXJuIChwcm9kdWN0KTsKLX0KLQotc3RhdGljIHVpbnQ2NF90Ci1nZXRfbnNlY19vZmZzZXQo
c3RydWN0IHZjcHVfdGltZV9pbmZvICp0aW5mbykKLXsKLQotCXJldHVybiAoc2NhbGVfZGVsdGEo
cmR0c2MoKSAtIHRpbmZvLT50c2NfdGltZXN0YW1wLAotCSAgICB0aW5mby0+dHNjX3RvX3N5c3Rl
bV9tdWwsIHRpbmZvLT50c2Nfc2hpZnQpKTsKLX0KLQotLyoKLSAqIFJlYWQgdGhlIGN1cnJlbnQg
aHlwZXJ2aXNvciBzeXN0ZW0gdXB0aW1lIHZhbHVlIGZyb20gWGVuLgotICogU2VlIDx4ZW4vaW50
ZXJmYWNlL3hlbi5oPiBmb3IgYSBkZXNjcmlwdGlvbiBvZiBob3cgdGhpcyB3b3Jrcy4KLSAqLwot
c3RhdGljIHVpbnQzMl90Ci14ZW5fZmV0Y2hfdmNwdV90aW5mbyhzdHJ1Y3QgdmNwdV90aW1lX2lu
Zm8gKmRzdCwgc3RydWN0IHZjcHVfdGltZV9pbmZvICpzcmMpCi17Ci0KLQlkbyB7Ci0JCWRzdC0+
dmVyc2lvbiA9IHNyYy0+dmVyc2lvbjsKLQkJcm1iKCk7Ci0JCWRzdC0+dHNjX3RpbWVzdGFtcCA9
IHNyYy0+dHNjX3RpbWVzdGFtcDsKLQkJZHN0LT5zeXN0ZW1fdGltZSA9IHNyYy0+c3lzdGVtX3Rp
bWU7Ci0JCWRzdC0+dHNjX3RvX3N5c3RlbV9tdWwgPSBzcmMtPnRzY190b19zeXN0ZW1fbXVsOwot
CQlkc3QtPnRzY19zaGlmdCA9IHNyYy0+dHNjX3NoaWZ0OwotCQlybWIoKTsKLQl9IHdoaWxlICgo
c3JjLT52ZXJzaW9uICYgMSkgfCAoZHN0LT52ZXJzaW9uIF4gc3JjLT52ZXJzaW9uKSk7Ci0KLQly
ZXR1cm4gKGRzdC0+dmVyc2lvbik7Ci19Ci0KIC8qKgogICogXGJyaWVmIEdldCB0aGUgY3VycmVu
dCB0aW1lLCBpbiBuYW5vc2Vjb25kcywgc2luY2UgdGhlIGh5cGVydmlzb3IgYm9vdGVkLgogICoK
ICAqIFxwYXJhbSB2Y3B1CQl2Y3B1X2luZm8gc3RydWN0dXJlIHRvIGZldGNoIHRoZSB0aW1lIGZy
b20uCiAgKgotICogXG5vdGUgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXJyZW50IENQVSdz
IGlkZWEgb2YgdGhpcyB2YWx1ZSwgdW5sZXNzCi0gKiAgICAgICBpdCBoYXBwZW5zIHRvIGJlIGxl
c3MgdGhhbiBhbm90aGVyIENQVSdzIHByZXZpb3VzbHkgZGV0ZXJtaW5lZCB2YWx1ZS4KICAqLwog
c3RhdGljIHVpbnQ2NF90CiB4ZW5fZmV0Y2hfdmNwdV90aW1lKHN0cnVjdCB2Y3B1X2luZm8gKnZj
cHUpCiB7Ci0Jc3RydWN0IHZjcHVfdGltZV9pbmZvIGRzdDsKLQlzdHJ1Y3QgdmNwdV90aW1lX2lu
Zm8gKnNyYzsKLQl1aW50MzJfdCBwcmVfdmVyc2lvbjsKLQl1aW50NjRfdCBub3c7Ci0Jdm9sYXRp
bGUgdWludDY0X3QgbGFzdDsKLQotCXNyYyA9ICZ2Y3B1LT50aW1lOwotCi0JZG8gewotCQlwcmVf
dmVyc2lvbiA9IHhlbl9mZXRjaF92Y3B1X3RpbmZvKCZkc3QsIHNyYyk7Ci0JCWJhcnJpZXIoKTsK
LQkJbm93ID0gZHN0LnN5c3RlbV90aW1lICsgZ2V0X25zZWNfb2Zmc2V0KCZkc3QpOwotCQliYXJy
aWVyKCk7Ci0JfSB3aGlsZSAocHJlX3ZlcnNpb24gIT0gc3JjLT52ZXJzaW9uKTsKKwlzdHJ1Y3Qg
cHZjbG9ja192Y3B1X3RpbWVfaW5mbyAqdGltZTsKIAotCS8qCi0JICogRW5mb3JjZSBhIG1vbm90
b25pY2FsbHkgaW5jcmVhc2luZyBjbG9jayB0aW1lIGFjcm9zcyBhbGwKLQkgKiBWQ1BVcy4gIElm
IG91ciB0aW1lIGlzIHRvbyBvbGQsIHVzZSB0aGUgbGFzdCB0aW1lIGFuZCByZXR1cm4uCi0JICog
T3RoZXJ3aXNlLCB0cnkgdG8gdXBkYXRlIHRoZSBsYXN0IHRpbWUuCi0JICovCi0JZG8gewotCQls
YXN0ID0geGVuX3RpbWVyX2xhc3RfdGltZTsKLQkJaWYgKGxhc3QgPiBub3cpIHsKLQkJCW5vdyA9
IGxhc3Q7Ci0JCQlicmVhazsKLQkJfQotCX0gd2hpbGUgKCFhdG9taWNfY21wc2V0XzY0KCZ4ZW5f
dGltZXJfbGFzdF90aW1lLCBsYXN0LCBub3cpKTsKKwl0aW1lID0gKHN0cnVjdCBwdmNsb2NrX3Zj
cHVfdGltZV9pbmZvICopICZ2Y3B1LT50aW1lOwogCi0JcmV0dXJuIChub3cpOworCXJldHVybiAo
cHZjbG9ja19nZXRfdGltZWNvdW50KHRpbWUpKTsKIH0KIAogc3RhdGljIHVpbnQzMl90CkBAIC0z
MDIsMTUgKzE5MiwxMSBAQCBzdGF0aWMgdm9pZAogeGVuX2ZldGNoX3dhbGxjbG9jayhzdHJ1Y3Qg
dGltZXNwZWMgKnRzKQogewogCXNoYXJlZF9pbmZvX3QgKnNyYyA9IEhZUEVSVklTT1Jfc2hhcmVk
X2luZm87Ci0JdWludDMyX3QgdmVyc2lvbiA9IDA7CisJc3RydWN0IHB2Y2xvY2tfd2FsbF9jbG9j
ayAqd2M7CiAKLQlkbyB7Ci0JCXZlcnNpb24gPSBzcmMtPndjX3ZlcnNpb247Ci0JCXJtYigpOwot
CQl0cy0+dHZfc2VjID0gc3JjLT53Y19zZWM7Ci0JCXRzLT50dl9uc2VjID0gc3JjLT53Y19uc2Vj
OwotCQlybWIoKTsKLQl9IHdoaWxlICgoc3JjLT53Y192ZXJzaW9uICYgMSkgfCAodmVyc2lvbiBe
IHNyYy0+d2NfdmVyc2lvbikpOworCXdjID0gKHN0cnVjdCBwdmNsb2NrX3dhbGxfY2xvY2sgKikg
JnNyYy0+d2NfdmVyc2lvbjsKKworCXB2Y2xvY2tfZ2V0X3dhbGxjbG9jayh3YywgdHMpOwogfQog
CiBzdGF0aWMgdm9pZApAQCAtNTc0LDcgKzQ2MCw3IEBAIHhlbnRpbWVyX3Jlc3VtZShkZXZpY2Vf
dCBkZXYpCiAJfQogCiAJLyogUmVzZXQgdGhlIGxhc3QgdXB0aW1lIHZhbHVlICovCi0JeGVuX3Rp
bWVyX2xhc3RfdGltZSA9IDA7CisJcHZjbG9ja19yZXN1bWUoKTsKIAogCS8qIFJlc2V0IHRoZSBS
VEMgY2xvY2sgKi8KIAlpbml0dG9kcih0aW1lX3NlY29uZCk7CmRpZmYgLS1naXQgYS9zeXMvaTM4
Ni9pbmNsdWRlL3B2Y2xvY2suaCBiL3N5cy9pMzg2L2luY2x1ZGUvcHZjbG9jay5oCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMWZhYzYKLS0tIC9kZXYvbnVsbAorKysgYi9z
eXMvaTM4Ni9pbmNsdWRlL3B2Y2xvY2suaApAQCAtMCwwICsxLDYgQEAKKy8qLQorICogVGhpcyBm
aWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLgorICovCisvKiAkRnJlZUJTRCQgKi8KKworI2lu
Y2x1ZGUgPHg4Ni9wdmNsb2NrLmg+CmRpZmYgLS1naXQgYS9zeXMva2Vybi9zdWJyX3BhcmFtLmMg
Yi9zeXMva2Vybi9zdWJyX3BhcmFtLmMKaW5kZXggOTVmMzI1MC4uNTMzMjA1NSAxMDA2NDQKLS0t
IGEvc3lzL2tlcm4vc3Vicl9wYXJhbS5jCisrKyBiL3N5cy9rZXJuL3N1YnJfcGFyYW0uYwpAQCAt
MTU5LDYgKzE1OSw4IEBAIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2bV9ndWVzdF9zeXNjdGxf
bmFtZXNbXSA9IHsKIAkieGVuIiwKIAkiaHYiLAogCSJ2bXdhcmUiLAorCSJiaHl2ZSIsCisJImt2
bSIsCiAJTlVMTAogfTsKIENUQVNTRVJUKG5pdGVtcyh2bV9ndWVzdF9zeXNjdGxfbmFtZXMpIC0g
MSA9PSBWTV9MQVNUKTsKZGlmZiAtLWdpdCBhL3N5cy9zeXMvc3lzdG0uaCBiL3N5cy9zeXMvc3lz
dG0uaAppbmRleCBkMzgzM2QwLi41MGE0OWQyIDEwMDY0NAotLS0gYS9zeXMvc3lzL3N5c3RtLmgK
KysrIGIvc3lzL3N5cy9zeXN0bS5oCkBAIC03Myw3ICs3Myw3IEBAIGV4dGVybiBpbnQgdm1fZ3Vl
c3Q7CQkvKiBSdW5uaW5nIGFzIHZpcnR1YWwgbWFjaGluZSBndWVzdD8gKi8KICAqIEtlZXAgaW4g
c3luYyB3aXRoIHZtX2d1ZXN0X3N5c2N0bF9uYW1lc1tdLgogICovCiBlbnVtIFZNX0dVRVNUIHsg
Vk1fR1VFU1RfTk8gPSAwLCBWTV9HVUVTVF9WTSwgVk1fR1VFU1RfWEVOLCBWTV9HVUVTVF9IViwK
LQkJVk1fR1VFU1RfVk1XQVJFLCBWTV9MQVNUIH07CisJCVZNX0dVRVNUX1ZNV0FSRSwgVk1fR1VF
U1RfQkhZVkUsIFZNX0dVRVNUX0tWTSwgVk1fTEFTVCB9OwogCiAjaWYgZGVmaW5lZChXSVRORVNT
KSB8fCBkZWZpbmVkKElOVkFSSUFOVFMpCiB2b2lkCWthc3NlcnRfcGFuaWMoY29uc3QgY2hhciAq
Zm10LCAuLi4pICBfX3ByaW50Zmxpa2UoMSwgMik7CmRpZmYgLS1naXQgYS9zeXMveDg2L2luY2x1
ZGUvaHlwZXJ2aXNvci5oIGIvc3lzL3g4Ni9pbmNsdWRlL2h5cGVydmlzb3IuaApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWQzMGViCi0tLSAvZGV2L251bGwKKysrIGIvc3lz
L3g4Ni9pbmNsdWRlL2h5cGVydmlzb3IuaApAQCAtMCwwICsxLDU2IEBACisvKi0KKyAqIENvcHly
aWdodCAoYykgMjAxNCBCcnlhbiBWZW50ZWljaGVyIDxicnlhbnZARnJlZUJTRC5vcmc+CisgKiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICog
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNF
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YK
KyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEJAorICovCisKKyNpZm5kZWYgX1g4Nl9I
WVBFUlZJU09SX0hfCisjZGVmaW5lIF9YODZfSFlQRVJWSVNPUl9IXworCisjaW5jbHVkZSA8c3lz
L3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL2tlcm5lbC5oPgorCit0eXBlZGVmIHZvaWQgaHlwZXJ2
aXNvcl9pbml0X2Z1bmNfdCh2b2lkKTsKKworLyoKKyAqIFRoZSBndWVzdCBoeXBlcnZpc29yIHN1
cHBvcnQgbWF5IHByb3ZpZGUgcGFyYXZpcnR1YWxpemVkIG9yIGhhdmUgc3BlY2lhbAorICogcmVx
dWlyZW1lbnRzIGZvciB2YXJpb3VzIG9wZXJhdGlvbnMuIFRoZSBjYWxsYmFjayBmdW5jdGlvbnMg
YXJlIHByb3ZpZGVkCisgKiB3aGVuIGEgaHlwZXJ2aXNvciBpcyBkZXRlY3RlZCBhbmQgcmVnaXN0
ZXJlZC4KKyAqLworc3RydWN0IGh5cGVydmlzb3Jfb3BzIHsKK307CisKK3ZvaWQJaHlwZXJ2aXNv
cl9zeXNpbml0KHZvaWQgKmZ1bmMpOwordm9pZAloeXBlcnZpc29yX3JlZ2lzdGVyKGNvbnN0IGNo
YXIgKnZlbmRvciwgZW51bSBWTV9HVUVTVCBndWVzdCwKKwkgICAgc3RydWN0IGh5cGVydmlzb3Jf
b3BzICpvcHMpOworaW50CWh5cGVydmlzb3JfY3B1aWRfYmFzZShjb25zdCBjaGFyICpzaWduYXR1
cmUsIGludCBsZWF2ZXMsCisJICAgIHVpbnQzMl90ICpiYXNlLCB1aW50MzJfdCAqaGlnaCk7Cit2
b2lkCWh5cGVydmlzb3JfcHJpbnRfaW5mbyh2b2lkKTsKKworI2RlZmluZSBIWVBFUlZJU09SX1NZ
U0lOSVQobmFtZSwgZnVuYykJCQkJXAorCVNZU0lOSVQobmFtZSAjIyBfaHlwZXJ2aXNvcl9zeXNp
bml0LCBTSV9TVUJfSFlQRVJWSVNPUiwJXAorCSAgICBTSV9PUkRFUl9GSVJTVCwgaHlwZXJ2aXNv
cl9zeXNpbml0LCBmdW5jKQorCisjZW5kaWYgLyogIV9YODZfSFlQRVJWSVNPUl9IXyAqLwpkaWZm
IC0tZ2l0IGEvc3lzL3g4Ni9pbmNsdWRlL2t2bS5oIGIvc3lzL3g4Ni9pbmNsdWRlL2t2bS5oCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MzkwMzgKLS0tIC9kZXYvbnVsbAor
KysgYi9zeXMveDg2L2luY2x1ZGUva3ZtLmgKQEAgLTAsMCArMSw0OSBAQAorLyotCisgKiBDb3B5
cmlnaHQgKGMpIDIwMTQgQnJ5YW4gVmVudGVpY2hlciA8YnJ5YW52QEZyZWVCU0Qub3JnPgorICog
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICog
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAq
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVT
RSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
CisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRCQKKyAqLworCisjaWZuZGVmIF9YODZf
S1ZNX0hfCisjZGVmaW5lIF9YODZfS1ZNX0hfCisKKyNkZWZpbmUgS1ZNX0NQVUlEX0ZFQVRVUkVT
X0xFQUYJCTB4NDAwMDAwMDEKKworI2RlZmluZSBLVk1fRkVBVFVSRV9DTE9DS1NPVVJDRQkJMHgw
MDAwMDAwMQorI2RlZmluZSBLVk1fRkVBVFVSRV9DTE9DS1NPVVJDRTIJMHgwMDAwMDAwOAorCisv
KiBEZXByZWNhdGVkOiBmb3IgdGhlIENMT0NLU09VUkNFIGZlYXR1cmUuICovCisjZGVmaW5lIEtW
TV9NU1JfV0FMTF9DTE9DSwkJMHgxMQorI2RlZmluZSBLVk1fTVNSX1NZU1RFTV9USU1FCQkweDEy
CisKKyNkZWZpbmUgS1ZNX01TUl9XQUxMX0NMT0NLX05FVwkJMHg0YjU2NGQwMAorI2RlZmluZSBL
Vk1fTVNSX1NZU1RFTV9USU1FX05FVwkJMHg0YjU2NGQwMQorCitpbnQJCWt2bV9wYXJhdmlydF9z
dXBwb3J0ZWQodm9pZCk7Cit1aW50MzJfdAlrdm1fZ2V0X2ZlYXR1cmVzKHZvaWQpOworCit1aW50
NjRfdAlrdm1fY2xvY2tfdHNjX2ZyZXEodm9pZCk7CisKKyNlbmRpZiAvKiAhX1g4Nl9LVk1fSF8g
Ki8KZGlmZiAtLWdpdCBhL3N5cy94ODYvaW5jbHVkZS9wdmNsb2NrLmggYi9zeXMveDg2L2luY2x1
ZGUvcHZjbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YWJhOTkK
LS0tIC9kZXYvbnVsbAorKysgYi9zeXMveDg2L2luY2x1ZGUvcHZjbG9jay5oCkBAIC0wLDAgKzEs
NTggQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDE0LCBCcnlhbiBWZW50ZWljaGVyIDxicnlh
bnZARnJlZUJTRC5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JT
IGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAq
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklC
VVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMK
KyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1Ig
VE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEJAor
ICovCisKKyNpZm5kZWYgWDg2X1BWQ0xPQ0sKKyNkZWZpbmUgWDg2X1BWQ0xPQ0sKKworc3RydWN0
IHB2Y2xvY2tfdmNwdV90aW1lX2luZm8geworCXVpbnQzMl90CXZlcnNpb247CisJdWludDMyX3QJ
cGFkMDsKKwl1aW50NjRfdAl0c2NfdGltZXN0YW1wOworCXVpbnQ2NF90CXN5c3RlbV90aW1lOwor
CXVpbnQzMl90CXRzY190b19zeXN0ZW1fbXVsOworCWludDhfdAkJdHNjX3NoaWZ0OworCXVpbnQ4
X3QJCWZsYWdzOworCXVpbnQ4X3QJCXBhZFsyXTsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgUFZD
TE9DS19GTEFHX1RTQ19TVEFCTEUJCTB4MDEKKyNkZWZpbmUgUFZDTE9DS19GTEFHX0dVRVNUX1BB
U1VFRAkweDAyCisKK3N0cnVjdCBwdmNsb2NrX3dhbGxfY2xvY2sgeworCXVpbnQzMl90CXZlcnNp
b247CisJdWludDMyX3QJc2VjOworCXVpbnQzMl90CW5zZWM7Cit9IF9fcGFja2VkOworCit2b2lk
CQlwdmNsb2NrX3Jlc3VtZSh2b2lkKTsKK3VpbnQ2NF90CXB2Y2xvY2tfdHNjX2ZyZXEoc3RydWN0
IHB2Y2xvY2tfdmNwdV90aW1lX2luZm8gKnRpKTsKK3VpbnQ2NF90CXB2Y2xvY2tfZ2V0X3RpbWVj
b3VudChzdHJ1Y3QgcHZjbG9ja192Y3B1X3RpbWVfaW5mbyAqdGkpOwordm9pZAkJcHZjbG9ja19n
ZXRfd2FsbGNsb2NrKHN0cnVjdCBwdmNsb2NrX3dhbGxfY2xvY2sgKndjLAorCQkgICAgc3RydWN0
IHRpbWVzcGVjICp0cyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzL3g4Ni9pbmNsdWRlL3Zt
d2FyZS5oIGIvc3lzL3g4Ni9pbmNsdWRlL3Ztd2FyZS5oCmluZGV4IGM3MmY0OGQuLjg5NjE2YzUg
MTAwNjQ0Ci0tLSBhL3N5cy94ODYvaW5jbHVkZS92bXdhcmUuaAorKysgYi9zeXMveDg2L2luY2x1
ZGUvdm13YXJlLmgKQEAgLTQ0LDQgKzQ0LDYgQEAgdm13YXJlX2h2Y2FsbCh1X2ludCBjbWQsIHVf
aW50ICpwKQogCTogIm1lbW9yeSIpOwogfQogCit1aW50NjRfdAl2bXdhcmVfdHNjX2ZyZXEodm9p
ZCk7CisKICNlbmRpZiAvKiAhX1g4Nl9WTVdBUkVfSF8gKi8KZGlmZiAtLWdpdCBhL3N5cy94ODYv
eDg2L2JoeXZlLmMgYi9zeXMveDg2L3g4Ni9iaHl2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAuLmQyMWU4MDgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMveDg2L3g4Ni9iaHl2
ZS5jCkBAIC0wLDAgKzEsNTggQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDE0IEJyeWFuIFZl
bnRlaWNoZXIgPGJyeWFudkBGcmVlQlNELm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFO
RCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVU
SE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICog
TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8K
KworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorX19GQlNESUQoIiRGcmVlQlNEJCIpOworCisjaW5j
bHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3N5c3RtLmg+CisKKyNpbmNsdWRlIDx4
ODYvaHlwZXJ2aXNvci5oPgorCitzdGF0aWMgdWludDMyX3QgYmh5dmVfY3B1aWRfYmFzZSA9IC0x
Oworc3RhdGljIHVpbnQzMl90IGJoeXZlX2NwdWlkX2hpZ2ggPSAtMTsKKworc3RhdGljIGludAor
Ymh5dmVfY3B1aWRfaWRlbnRpZnkodm9pZCkKK3sKKworCWlmIChiaHl2ZV9jcHVpZF9iYXNlID09
IC0xKSB7CisJCWh5cGVydmlzb3JfY3B1aWRfYmFzZSgiYmh5dmUgYmh5dmUiLCAwLCAmYmh5dmVf
Y3B1aWRfYmFzZSwKKwkJICAgICZiaHl2ZV9jcHVpZF9oaWdoKTsKKwl9CisKKwlyZXR1cm4gKGJo
eXZlX2NwdWlkX2Jhc2UgPiAwKTsKK30KKworc3RhdGljIHZvaWQKK2JoeXZlX2luaXQodm9pZCkK
K3sKKworCWlmIChiaHl2ZV9jcHVpZF9pZGVudGlmeSgpICE9IDApCisJCWh5cGVydmlzb3JfcmVn
aXN0ZXIoImJoeXZlIiwgVk1fR1VFU1RfQkhZVkUsIE5VTEwpOworfQorCitIWVBFUlZJU09SX1NZ
U0lOSVQoYmh5dmUsIGJoeXZlX2luaXQpOwpkaWZmIC0tZ2l0IGEvc3lzL3g4Ni94ODYvaHlwZXJ2
aXNvci5jIGIvc3lzL3g4Ni94ODYvaHlwZXJ2aXNvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAuLjMwYzcwZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMveDg2L3g4Ni9oeXBl
cnZpc29yLmMKQEAgLTAsMCArMSw5OSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgQnJ5
YW4gVmVudGVpY2hlciA8YnJ5YW52QEZyZWVCU0Qub3JnPgorICogQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRI
T1IgQU5EIENPTlRSSUJVVE9SUyBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg
QVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisg
KiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAor
ICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorX19GQlNESUQoIiRGcmVlQlNEJCIpOworCisj
aW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorI2luY2x1ZGUg
PHN5cy9zeXN0bS5oPgorCisjaW5jbHVkZSA8bWFjaGluZS9jcHVmdW5jLmg+CisjaW5jbHVkZSA8
bWFjaGluZS9jcHUuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL21kX3Zhci5oPgorI2luY2x1ZGUgPG1h
Y2hpbmUvc3BlY2lhbHJlZy5oPgorCisjaW5jbHVkZSA8eDg2L2h5cGVydmlzb3IuaD4KKworY2hh
ciBodl92ZW5kb3JbMTZdOworU1lTQ1RMX1NUUklORyhfaHcsIE9JRF9BVVRPLCBodl92ZW5kb3Is
IENUTEZMQUdfUkQsIGh2X3ZlbmRvciwgMCwKKyAgICAiSHlwZXJ2aXNvciB2ZW5kb3IiKTsKKwor
dm9pZAoraHlwZXJ2aXNvcl9zeXNpbml0KHZvaWQgKmZ1bmMpCit7CisJaHlwZXJ2aXNvcl9pbml0
X2Z1bmNfdCAqaW5pdDsKKworCWluaXQgPSBmdW5jOworCisJLyoKKwkgKiBDYWxsIHRoZSBpbml0
IGZ1bmN0aW9uIGlmIHdlIGhhdmUgbm90IGFscmVhZHkgaWRlbnRpZmllZCB0aGUKKwkgKiBoeXBl
cnZpc29yIHlldC4gV2UgYXNzdW1lIHRoZSBkZXRlY3RhYmxlIGh5cGVydmlzb3JzIHdpbGwKKwkg
KiBhbm5vdW5jZSBpdHMgcHJlc2VuY2UgdmlhIHRoZSBDUFVJRCBiaXQuCisJICovCisJaWYgKHZt
X2d1ZXN0ID09IFZNX0dVRVNUX1ZNICYmIGNwdV9mZWF0dXJlMiAmIENQVUlEMl9IVikKKwkJKCpp
bml0KSgpOworfQorCit2b2lkCitoeXBlcnZpc29yX3JlZ2lzdGVyKGNvbnN0IGNoYXIgKnZlbmRv
ciwgZW51bSBWTV9HVUVTVCBndWVzdCwKKyAgICBzdHJ1Y3QgaHlwZXJ2aXNvcl9vcHMgKm9wcykK
K3sKKworCXN0cmxjcHkoaHZfdmVuZG9yLCB2ZW5kb3IsIHNpemVvZihodl92ZW5kb3IpKTsKKwl2
bV9ndWVzdCA9IGd1ZXN0OworfQorCisvKgorICogW1JGQ10gQ1BVSUQgdXNhZ2UgZm9yIGludGVy
YWN0aW9uIGJldHdlZW4gSHlwZXJ2aXNvcnMgYW5kIExpbnV4LgorICogaHR0cDovL2xrbWwub3Jn
L2xrbWwvMjAwOC8xMC8xLzI0NgorICovCitpbnQKK2h5cGVydmlzb3JfY3B1aWRfYmFzZShjb25z
dCBjaGFyICpzaWduYXR1cmUsIGludCBsZWF2ZXMsIHVpbnQzMl90ICpiYXNlLAorICAgIHVpbnQz
Ml90ICpoaWdoKQoreworCXVpbnQzMl90IGxlYWYsIHJlZ3NbNF07CisKKwlmb3IgKGxlYWYgPSAw
eDQwMDAwMDAwOyBsZWFmIDwgMHg0MDAxMDAwMDsgbGVhZiArPSAweDEwMCkgeworCQlkb19jcHVp
ZChsZWFmLCByZWdzKTsKKwkJaWYgKCFtZW1jbXAoc2lnbmF0dXJlLCAmcmVnc1sxXSwgMTIpICYm
CisJCSAgICAobGVhdmVzID09IDAgfHwgKHJlZ3NbMF0gLSBsZWFmID49IGxlYXZlcykpKSB7CisJ
CQkqYmFzZSA9IGxlYWY7CisJCQkqaGlnaCA9IHJlZ3NbMF07CisJCQlyZXR1cm4gKDApOworCQl9
CisJfQorCisJcmV0dXJuICgxKTsKK30KKwordm9pZAoraHlwZXJ2aXNvcl9wcmludF9pbmZvKHZv
aWQpCit7CisKKwlpZiAoKmh2X3ZlbmRvcikKKwkJcHJpbnRmKCJIeXBlcnZpc29yOiBPcmlnaW4g
PSBcIiVzXCJcbiIsIGh2X3ZlbmRvcik7Cit9CmRpZmYgLS1naXQgYS9zeXMveDg2L3g4Ni9pZGVu
dGNwdS5jIGIvc3lzL3g4Ni94ODYvaWRlbnRjcHUuYwppbmRleCBiYWU0MzBhLi5jMjgzOTBjIDEw
MDY0NAotLS0gYS9zeXMveDg2L3g4Ni9pZGVudGNwdS5jCisrKyBiL3N5cy94ODYveDg2L2lkZW50
Y3B1LmMKQEAgLTY0LDYgKzY0LDcgQEAgX19GQlNESUQoIiRGcmVlQlNEJCIpOwogCiAjaW5jbHVk
ZSA8YW1kNjQvdm1tL2ludGVsL3ZteF9jb250cm9scy5oPgogI2luY2x1ZGUgPHg4Ni9pc2EvaWN1
Lmg+CisjaW5jbHVkZSA8eDg2L2h5cGVydmlzb3IuaD4KICNpbmNsdWRlIDx4ODYvdm13YXJlLmg+
CiAKICNpZmRlZiBfX2kzODZfXwpAQCAtNzgsNyArNzksNiBAQCBzdGF0aWMgdV9pbnQgZmluZF9j
cHVfdmVuZG9yX2lkKHZvaWQpOwogc3RhdGljIHZvaWQgcHJpbnRfQU1EX2luZm8odm9pZCk7CiBz
dGF0aWMgdm9pZCBwcmludF9JTlRFTF9pbmZvKHZvaWQpOwogc3RhdGljIHZvaWQgcHJpbnRfSU5U
RUxfVExCKHVfaW50IGRhdGEpOwotc3RhdGljIHZvaWQgcHJpbnRfaHlwZXJ2aXNvcl9pbmZvKHZv
aWQpOwogc3RhdGljIHZvaWQgcHJpbnRfc3ZtX2luZm8odm9pZCk7CiBzdGF0aWMgdm9pZCBwcmlu
dF92aWFfcGFkbG9ja19pbmZvKHZvaWQpOwogc3RhdGljIHZvaWQgcHJpbnRfdm14X2luZm8odm9p
ZCk7CkBAIC0xMjMsMTEgKzEyMyw2IEBAIHN0YXRpYyBpbnQgaHdfY2xvY2tyYXRlOwogU1lTQ1RM
X0lOVChfaHcsIE9JRF9BVVRPLCBjbG9ja3JhdGUsIENUTEZMQUdfUkQsCiAgICAgJmh3X2Nsb2Nr
cmF0ZSwgMCwgIkNQVSBpbnN0cnVjdGlvbiBjbG9jayByYXRlIik7CiAKLXVfaW50IGh2X2hpZ2g7
Ci1jaGFyIGh2X3ZlbmRvclsxNl07Ci1TWVNDVExfU1RSSU5HKF9odywgT0lEX0FVVE8sIGh2X3Zl
bmRvciwgQ1RMRkxBR19SRCwgaHZfdmVuZG9yLCAwLAotICAgICJIeXBlcnZpc29yIHZlbmRvciIp
OwotCiBzdGF0aWMgZXZlbnRoYW5kbGVyX3RhZyB0c2NfcG9zdF90YWc7CiAKIHN0YXRpYyBjaGFy
IGNwdV9icmFuZFs0OF07CkBAIC05ODUsNyArOTgwLDcgQEAgcHJpbnRjcHVpbmZvKHZvaWQpCiAj
ZW5kaWYKIAl9CiAKLQlwcmludF9oeXBlcnZpc29yX2luZm8oKTsKKwloeXBlcnZpc29yX3ByaW50
X2luZm8oKTsKIH0KIAogdm9pZApAQCAtMTIxOCwyNSArMTIxMywxMiBAQCBpZGVudGlmeV9oeXBl
cnZpc29yKHZvaWQpCiAJaW50IGk7CiAKIAkvKgotCSAqIFtSRkNdIENQVUlEIHVzYWdlIGZvciBp
bnRlcmFjdGlvbiBiZXR3ZWVuIEh5cGVydmlzb3JzIGFuZCBMaW51eC4KLQkgKiBodHRwOi8vbGtt
bC5vcmcvbGttbC8yMDA4LzEwLzEvMjQ2Ci0JICoKLQkgKiBLQjEwMDk0NTg6IE1lY2hhbmlzbXMg
dG8gZGV0ZXJtaW5lIGlmIHNvZnR3YXJlIGlzIHJ1bm5pbmcgaW4KLQkgKiBhIFZNd2FyZSB2aXJ0
dWFsIG1hY2hpbmUKLQkgKiBodHRwOi8va2Iudm13YXJlLmNvbS9rYi8xMDA5NDU4CisJICogTW9k
ZXJuIGh5cGVydmlzb3JzIHNldCB0aGUgSFYgcHJlc2VudCBmZWF0dXJlIGJpdCBhbmQgYXJlIHRo
ZW4KKwkgKiBpZGVudGlmaWFibGUgdGhyb3VnaCBhIHNwZWNpYWwgQ1BVSUQgbGVhZi4gSHlwZXJ2
aXNvcnMgd2Uga25vdworCSAqIGFib3V0IGFyZSBsYXRlciBkZXRlY3RlZCB2aWEgdGhlIFNJX1NV
Ql9IWVBFUlZJU09SIFNZU0lOSVQoKS4KIAkgKi8KIAlpZiAoY3B1X2ZlYXR1cmUyICYgQ1BVSUQy
X0hWKSB7CiAJCXZtX2d1ZXN0ID0gVk1fR1VFU1RfVk07Ci0JCWRvX2NwdWlkKDB4NDAwMDAwMDAs
IHJlZ3MpOwotCQlpZiAocmVnc1swXSA+PSAweDQwMDAwMDAwKSB7Ci0JCQlodl9oaWdoID0gcmVn
c1swXTsKLQkJCSgodV9pbnQgKikmaHZfdmVuZG9yKVswXSA9IHJlZ3NbMV07Ci0JCQkoKHVfaW50
ICopJmh2X3ZlbmRvcilbMV0gPSByZWdzWzJdOwotCQkJKCh1X2ludCAqKSZodl92ZW5kb3IpWzJd
ID0gcmVnc1szXTsKLQkJCWh2X3ZlbmRvclsxMl0gPSAnXDAnOwotCQkJaWYgKHN0cmNtcChodl92
ZW5kb3IsICJWTXdhcmVWTXdhcmUiKSA9PSAwKQotCQkJCXZtX2d1ZXN0ID0gVk1fR1VFU1RfVk1X
QVJFOwotCQl9CiAJCXJldHVybjsKIAl9CiAKQEAgLTIxNTAsMTEgKzIxMzIsMyBAQCBwcmludF92
bXhfaW5mbyh2b2lkKQogCQkpOwogCX0KIH0KLQotc3RhdGljIHZvaWQKLXByaW50X2h5cGVydmlz
b3JfaW5mbyh2b2lkKQotewotCi0JaWYgKCpodl92ZW5kb3IpCi0JCXByaW50ZigiSHlwZXJ2aXNv
cjogT3JpZ2luID0gXCIlc1wiXG4iLCBodl92ZW5kb3IpOwotfQpkaWZmIC0tZ2l0IGEvc3lzL3g4
Ni94ODYva3ZtLmMgYi9zeXMveDg2L3g4Ni9rdm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwLi5iNDdlYjc2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL3g4Ni94ODYva3ZtLmMK
QEAgLTAsMCArMSw4MyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgQnJ5YW4gVmVudGVp
Y2hlciA8YnJ5YW52QEZyZWVCU0Qub3JnPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENP
TlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1Ig
T1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFC
SUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisj
aW5jbHVkZSA8c3lzL2NkZWZzLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0QkIik7CisKKyNpbmNsdWRl
IDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvc3lzdG0uaD4KKworI2luY2x1ZGUgPG1hY2hp
bmUvY3B1ZnVuYy5oPgorCisjaW5jbHVkZSA8eDg2L2h5cGVydmlzb3IuaD4KKyNpbmNsdWRlIDx4
ODYva3ZtLmg+CisKK3N0YXRpYyBpbnQJCWt2bV9jcHVpZF9pZGVudGlmeSh2b2lkKTsKKworc3Rh
dGljIHVpbnQzMl90IGt2bV9jcHVpZF9iYXNlID0gLTE7CitzdGF0aWMgdWludDMyX3Qga3ZtX2Nw
dWlkX2hpZ2ggPSAtMTsKKworc3RhdGljIGludAora3ZtX2NwdWlkX2lkZW50aWZ5KHZvaWQpCit7
CisKKwlpZiAoa3ZtX2NwdWlkX2Jhc2UgPT0gLTEpIHsKKwkJaHlwZXJ2aXNvcl9jcHVpZF9iYXNl
KCJLVk1LVk1LVk1cMFwwIiwgMCwgJmt2bV9jcHVpZF9iYXNlLAorCQkgICAgJmt2bV9jcHVpZF9o
aWdoKTsKKwl9CisKKwlyZXR1cm4gKGt2bV9jcHVpZF9iYXNlID4gMCk7Cit9CisKK2ludAora3Zt
X3BhcmF2aXJ0X3N1cHBvcnRlZCh2b2lkKQoreworCisJcmV0dXJuIChrdm1fY3B1aWRfYmFzZSA+
IDApOworfQorCit1aW50MzJfdAora3ZtX2dldF9mZWF0dXJlcyh2b2lkKQoreworCXVfaW50IHJl
Z3NbNF07CisKKwlpZiAoa3ZtX3BhcmF2aXJ0X3N1cHBvcnRlZCgpKQorCQlkb19jcHVpZChrdm1f
Y3B1aWRfYmFzZSB8IEtWTV9DUFVJRF9GRUFUVVJFU19MRUFGLCByZWdzKTsKKwllbHNlCisJCXJl
Z3NbMF0gPSAwOworCisJcmV0dXJuIChyZWdzWzBdKTsKK30KKworc3RhdGljIHZvaWQKK2t2bV9p
bml0KHZvaWQpCit7CisKKwlpZiAoa3ZtX2NwdWlkX2lkZW50aWZ5KCkgIT0gMCkKKwkJaHlwZXJ2
aXNvcl9yZWdpc3RlcigiS1ZNIiwgVk1fR1VFU1RfS1ZNLCBOVUxMKTsKK30KKworSFlQRVJWSVNP
Ul9TWVNJTklUKGt2bSwga3ZtX2luaXQpOwpkaWZmIC0tZ2l0IGEvc3lzL3g4Ni94ODYva3ZtX2Ns
b2NrLmMgYi9zeXMveDg2L3g4Ni9rdm1fY2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwLi43ZGE2MzYzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzL3g4Ni94ODYva3ZtX2Ns
b2NrLmMKQEAgLTAsMCArMSwxMzIgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDE0IEJyeWFu
IFZlbnRlaWNoZXIgPGJyeWFudkBGcmVlQlNELm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9S
IEFORCBDT05UUklCVVRPUlMgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFV
VEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICog
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAq
IExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICov
CisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KK19fRkJTRElEKCIkRnJlZUJTRCQiKTsKKworI2lu
Y2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9rZXJuZWwuaD4KKyNpbmNsdWRlIDxz
eXMvbGltaXRzLmg+CisjaW5jbHVkZSA8c3lzL3N5c3RtLmg+CisjaW5jbHVkZSA8c3lzL3BjcHUu
aD4KKyNpbmNsdWRlIDxzeXMvc21wLmg+CisjaW5jbHVkZSA8c3lzL3RpbWV0Yy5oPgorCisjaW5j
bHVkZSA8dm0vdm0uaD4KKyNpbmNsdWRlIDx2bS9wbWFwLmg+CisKKyNpbmNsdWRlIDxtYWNoaW5l
L3B2Y2xvY2suaD4KKyNpbmNsdWRlIDx4ODYva3ZtLmg+CisKK3N0YXRpYyB1X2ludAlrdm1fY2xv
Y2tfZ2V0X3RpbWVjb3VudGVyKHN0cnVjdCB0aW1lY291bnRlciAqKTsKK3N0YXRpYyB2b2lkCWt2
bV9jbG9ja19wY3B1X3N5c3RlbV90aW1lKHZvaWQgKik7CisKK0RQQ1BVX0RFRklORShzdHJ1Y3Qg
cHZjbG9ja192Y3B1X3RpbWVfaW5mbywga3ZtX2Nsb2NrX3ZjcHVfdGltZV9pbmZvKTsKKworc3Rh
dGljIHN0cnVjdCB0aW1lY291bnRlciBrdm1fY2xvY2tfdGltZWNvdW50ZXIgPSB7CisJa3ZtX2Ns
b2NrX2dldF90aW1lY291bnRlciwKKwlOVUxMLAorCX4wdSwKKwkxMDAwMDAwMDAwVUxMLAorCSJL
Vk1DTE9DSyIsCisJMTAwMCwKK307CisKK3N0YXRpYyBpbnQJCWt2bV9jbG9ja19yZWdpc3RlcmVk
Oworc3RhdGljIHVpbnQzMl90CQlrdm1fY2xvY2tfd2FsbF9jbG9ja19tc3I7CitzdGF0aWMgdWlu
dDMyX3QJCWt2bV9jbG9ja19zeXN0ZW1fdGltZV9tc3I7CisKK3VpbnQ2NF90Citrdm1fY2xvY2tf
dHNjX2ZyZXEodm9pZCkKK3sKKwlzdHJ1Y3QgcHZjbG9ja192Y3B1X3RpbWVfaW5mbyAqdGk7CisJ
dWludDY0X3QgZnJlcTsKKworCWNyaXRpY2FsX2VudGVyKCk7CisJdGkgPSBEUENQVV9QVFIoa3Zt
X2Nsb2NrX3ZjcHVfdGltZV9pbmZvKTsKKwlmcmVxID0gcHZjbG9ja190c2NfZnJlcSh0aSk7CisJ
Y3JpdGljYWxfZXhpdCgpOworCisJcmV0dXJuIChmcmVxKTsKK30KKworc3RhdGljIHVfaW50Citr
dm1fY2xvY2tfZ2V0X3RpbWVjb3VudGVyKHN0cnVjdCB0aW1lY291bnRlciAqdGMpCit7CisJc3Ry
dWN0IHB2Y2xvY2tfdmNwdV90aW1lX2luZm8gKnRpOworCXVpbnQ2NF90IHRpbWU7CisKKwljcml0
aWNhbF9lbnRlcigpOworCXRpID0gRFBDUFVfUFRSKGt2bV9jbG9ja192Y3B1X3RpbWVfaW5mbyk7
CisJdGltZSA9IHB2Y2xvY2tfZ2V0X3RpbWVjb3VudCh0aSk7CisJY3JpdGljYWxfZXhpdCgpOwor
CisJcmV0dXJuICh0aW1lICYgVUlOVF9NQVgpOworfQorCitzdGF0aWMgdm9pZAora3ZtX2Nsb2Nr
X3BjcHVfc3lzdGVtX3RpbWUodm9pZCAqYXJnKQoreworCXVpbnQ2NF90IGRhdGE7CisJaW50IGVu
YWJsZTsKKworCWVuYWJsZSA9ICooaW50ICopIGFyZzsKKworCWlmIChlbmFibGUgIT0gMCkKKwkJ
ZGF0YSA9IHZ0b3BoeXMoRFBDUFVfUFRSKGt2bV9jbG9ja192Y3B1X3RpbWVfaW5mbykpIHwgMTsK
KwllbHNlCisJCWRhdGEgPSAwOworCisJd3Jtc3Ioa3ZtX2Nsb2NrX3N5c3RlbV90aW1lX21zciwg
ZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkCitrdm1fY2xvY2tfaW5pdCh2b2lkKQoreworCXVpbnQz
Ml90IGZlYXR1cmVzOworCisJaWYgKHZtX2d1ZXN0ICE9IFZNX0dVRVNUX0tWTSB8fCAha3ZtX3Bh
cmF2aXJ0X3N1cHBvcnRlZCgpKQorCQlyZXR1cm47CisKKwlmZWF0dXJlcyA9IGt2bV9nZXRfZmVh
dHVyZXMoKTsKKworCWlmIChmZWF0dXJlcyAmIEtWTV9GRUFUVVJFX0NMT0NLU09VUkNFMikgewor
CQlrdm1fY2xvY2tfd2FsbF9jbG9ja19tc3IgPSBLVk1fTVNSX1dBTExfQ0xPQ0tfTkVXOworCQlr
dm1fY2xvY2tfc3lzdGVtX3RpbWVfbXNyID0gS1ZNX01TUl9TWVNURU1fVElNRV9ORVc7CisJfSBl
bHNlIGlmIChmZWF0dXJlcyAmIEtWTV9GRUFUVVJFX0NMT0NLU09VUkNFKSB7CisJCWt2bV9jbG9j
a193YWxsX2Nsb2NrX21zciA9IEtWTV9NU1JfV0FMTF9DTE9DSzsKKwkJa3ZtX2Nsb2NrX3N5c3Rl
bV90aW1lX21zciA9IEtWTV9NU1JfU1lTVEVNX1RJTUU7CisJfSBlbHNlCisJCXJldHVybjsKKwor
CWt2bV9jbG9ja19yZWdpc3RlcmVkID0gMTsKKwlzbXBfcmVuZGV6dm91cyhzbXBfbm9fcmVuZGV2
b3VzX2JhcnJpZXIsIGt2bV9jbG9ja19wY3B1X3N5c3RlbV90aW1lLAorCSAgICBzbXBfbm9fcmVu
ZGV2b3VzX2JhcnJpZXIsICZrdm1fY2xvY2tfcmVnaXN0ZXJlZCk7CisKKwl0Y19pbml0KCZrdm1f
Y2xvY2tfdGltZWNvdW50ZXIpOworfQorCitTWVNJTklUKGt2bV9jbG9jaywgU0lfU1VCX1NNUCwg
U0lfT1JERVJfQU5ZLCBrdm1fY2xvY2tfaW5pdCwgTlVMTCk7CmRpZmYgLS1naXQgYS9zeXMveDg2
L3g4Ni9wdmNsb2NrLmMgYi9zeXMveDg2L3g4Ni9wdmNsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMC4uZDBlZWYxODUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMveDg2L3g4
Ni9wdmNsb2NrLmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDA5
IEFkcmlhbiBDaGFkZAorICogQ29weXJpZ2h0IChjKSAyMDEyIFNwZWN0cmEgTG9naWMgQ29ycG9y
YXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNCBCcnlhbiBWZW50ZWljaGVyCisgKiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNV
Q0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KK19fRkJTRElEKCIkRnJl
ZUJTRCQiKTsKKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9zeXN0bS5o
PgorI2luY2x1ZGUgPHN5cy9wcm9jLmg+CisKKyNpbmNsdWRlIDxtYWNoaW5lL2NwdWZ1bmMuaD4K
KyNpbmNsdWRlIDxtYWNoaW5lL2NwdS5oPgorI2luY2x1ZGUgPG1hY2hpbmUvYXRvbWljLmg+Cisj
aW5jbHVkZSA8bWFjaGluZS9wdmNsb2NrLmg+CisKKy8qCisgKiBMYXN0IHRpbWU7IHRoaXMgZ3Vh
cmFudGVlcyBhIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBjbG9jayBmb3Igd2hlbgorICogYSBz
dGFibGUgVFNDIGlzIG5vdCBwcm92aWRlZC4KKyAqLworc3RhdGljIHZvbGF0aWxlIHVpbnQ2NF90
IHB2Y2xvY2tfbGFzdF9jeWNsZXM7CisKK3ZvaWQKK3B2Y2xvY2tfcmVzdW1lKHZvaWQpCit7CisK
KwlhdG9taWNfc3RvcmVfcmVsXzY0KCZwdmNsb2NrX2xhc3RfY3ljbGVzLCAwKTsKK30KKwordWlu
dDY0X3QKK3B2Y2xvY2tfdHNjX2ZyZXEoc3RydWN0IHB2Y2xvY2tfdmNwdV90aW1lX2luZm8gKnRp
KQoreworCXVpbnQ2NF90IGZyZXE7CisKKwlmcmVxID0gKDEwMDAwMDAwMDBVTEwgPDwgMzIpIC8g
dGktPnRzY190b19zeXN0ZW1fbXVsOworCisJaWYgKHRpLT50c2Nfc2hpZnQgPCAwKQorCQlmcmVx
IDw8PSAtdGktPnRzY19zaGlmdDsKKwllbHNlCisJCWZyZXEgPj49IHRpLT50c2Nfc2hpZnQ7CisK
KwlyZXR1cm4gKGZyZXEpOworfQorCisvKgorICogU2NhbGUgYSA2NC1iaXQgZGVsdGEgYnkgc2Nh
bGluZyBhbmQgbXVsdGlwbHlpbmcgYnkgYSAzMi1iaXQgZnJhY3Rpb24sCisgKiB5aWVsZGluZyBh
IDY0LWJpdCByZXN1bHQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDY0X3QKK3B2Y2xvY2tfc2Nh
bGVfZGVsdGEodWludDY0X3QgZGVsdGEsIHVpbnQzMl90IG11bF9mcmFjLCBpbnQgc2hpZnQpCit7
CisJdWludDY0X3QgcHJvZHVjdDsKKworCWlmIChzaGlmdCA8IDApCisJCWRlbHRhID4+PSAtc2hp
ZnQ7CisJZWxzZQorCQlkZWx0YSA8PD0gc2hpZnQ7CisKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQor
CXsKKwkJdWludDMyX3QgdG1wMSwgdG1wMjsKKworCQkvKioKKwkJICogRm9yIGkzODYsIHRoZSBm
b3JtdWxhIGxvb2tzIGxpa2U6CisJCSAqCisJCSAqICAgbG93ZXIgPSAobXVsX2ZyYWMgKiAoZGVs
dGEgJiBVSU5UX01BWCkpID4+IDMyCisJCSAqICAgdXBwZXIgPSBtdWxfZnJhYyAqIChkZWx0YSA+
PiAzMikKKwkJICogICBwcm9kdWN0ID0gbG93ZXIgKyB1cHBlcgorCQkgKi8KKwkJX19hc21fXyAo
CisJCQkibXVsICAlNSAgICAgICA7ICIKKwkJCSJtb3YgICU0LCUlZWF4IDsgIgorCQkJIm1vdiAg
JSVlZHgsJTQgOyAiCisJCQkibXVsICAlNSAgICAgICA7ICIKKwkJCSJ4b3IgICU1LCU1ICAgIDsg
IgorCQkJImFkZCAgJTQsJSVlYXggOyAiCisJCQkiYWRjICAlNSwlJWVkeCA7ICIKKwkJCTogIj1B
IiAocHJvZHVjdCksICI9ciIgKHRtcDEpLCAiPXIiICh0bXAyKQorCQkJOiAiYSIgKCh1aW50MzJf
dClkZWx0YSksICIxIiAoKHVpbnQzMl90KShkZWx0YSA+PiAzMikpLAorCQkJICAiMiIgKG11bF9m
cmFjKSApOworCX0KKyNlbGlmIGRlZmluZWQoX19hbWQ2NF9fKQorCXsKKwkJdW5zaWduZWQgbG9u
ZyB0bXA7CisKKwkJX19hc21fXyAoCisJCQkibXVscSAlW211bF9mcmFjXSA7IHNocmQgJDMyLCAl
W2hpXSwgJVtsb10iCisJCQk6IFtsb10iPWEiIChwcm9kdWN0KSwgW2hpXSI9ZCIgKHRtcCkKKwkJ
CTogIjAiIChkZWx0YSksIFttdWxfZnJhY10icm0iKCh1aW50NjRfdCltdWxfZnJhYykpOworCX0K
KyNlbHNlCisjZXJyb3IgInB2Y2xvY2s6IHVuc3VwcG9ydGVkIHg4NiBhcmNoaXRlY3R1cmU/Igor
I2VuZGlmCisKKwlyZXR1cm4gKHByb2R1Y3QpOworfQorCitzdGF0aWMgdWludDY0X3QKK3B2Y2xv
Y2tfZ2V0X25zZWNfb2Zmc2V0KHN0cnVjdCBwdmNsb2NrX3ZjcHVfdGltZV9pbmZvICp0aSkKK3sK
Kwl1aW50NjRfdCBkZWx0YTsKKworCWRlbHRhID0gcmR0c2MoKSAtIHRpLT50c2NfdGltZXN0YW1w
OworCisJcmV0dXJuIChwdmNsb2NrX3NjYWxlX2RlbHRhKGRlbHRhLCB0aS0+dHNjX3RvX3N5c3Rl
bV9tdWwsCisJICAgIHRpLT50c2Nfc2hpZnQpKTsKK30KKworc3RhdGljIHZvaWQKK3B2Y2xvY2tf
cmVhZF90aW1lX2luZm8oc3RydWN0IHB2Y2xvY2tfdmNwdV90aW1lX2luZm8gKnRpLAorICAgIHVp
bnQ2NF90ICpjeWNsZXMsIHVpbnQ4X3QgKmZsYWdzKQoreworCXVpbnQzMl90IHZlcnNpb247CisK
KwlkbyB7CisJCXZlcnNpb24gPSB0aS0+dmVyc2lvbjsKKwkJcm1iKCk7CisJCSpjeWNsZXMgPSB0
aS0+c3lzdGVtX3RpbWUgKyBwdmNsb2NrX2dldF9uc2VjX29mZnNldCh0aSk7CisJCSpmbGFncyA9
IHRpLT5mbGFnczsKKwkJcm1iKCk7CisJfSB3aGlsZSAoKHRpLT52ZXJzaW9uICYgMSkgIT0gMCB8
fCB0aS0+dmVyc2lvbiAhPSB2ZXJzaW9uKTsKK30KKworc3RhdGljIHZvaWQKK3B2Y2xvY2tfcmVh
ZF93YWxsX2Nsb2NrKHN0cnVjdCBwdmNsb2NrX3dhbGxfY2xvY2sgKndjLCB1aW50MzJfdCAqc2Vj
LAorICAgIHVpbnQzMl90ICpuc2VjKQoreworCXVpbnQzMl90IHZlcnNpb247CisKKwlkbyB7CisJ
CXZlcnNpb24gPSB3Yy0+dmVyc2lvbjsKKwkJcm1iKCk7CisJCSpzZWMgPSB3Yy0+c2VjOworCQkq
bnNlYyA9IHdjLT5uc2VjOworCQlybWIoKTsKKwl9IHdoaWxlICgod2MtPnZlcnNpb24gJiAxKSAh
PSAwIHx8IHdjLT52ZXJzaW9uICE9IHZlcnNpb24pOworfQorCit1aW50NjRfdAorcHZjbG9ja19n
ZXRfdGltZWNvdW50KHN0cnVjdCBwdmNsb2NrX3ZjcHVfdGltZV9pbmZvICp0aSkKK3sKKwl1aW50
NjRfdCBub3c7CisJdWludDhfdCBmbGFnczsKKwl2b2xhdGlsZSB1aW50NjRfdCBsYXN0OworCisJ
cHZjbG9ja19yZWFkX3RpbWVfaW5mbyh0aSwgJm5vdywgJmZsYWdzKTsKKworCWlmIChmbGFncyAm
IFBWQ0xPQ0tfRkxBR19UU0NfU1RBQkxFKQorCQlyZXR1cm4gKG5vdyk7CisKKwkvKgorCSAqIEVu
Zm9yY2UgYSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgY2xvY2sgdGltZSBhY3Jvc3MgYWxsIFZD
UFVzLgorCSAqIElmIG91ciB0aW1lIGlzIHRvbyBvbGQsIHVzZSB0aGUgbGFzdCB0aW1lIGFuZCBy
ZXR1cm4uIE90aGVyd2lzZSwKKwkgKiB0cnkgdG8gdXBkYXRlIHRoZSBsYXN0IHRpbWUuCisJICov
CisJZG8geworCQlsYXN0ID0gYXRvbWljX2xvYWRfYWNxXzY0KCZwdmNsb2NrX2xhc3RfY3ljbGVz
KTsKKwkJaWYgKGxhc3QgPiBub3cpCisJCQlyZXR1cm4gKGxhc3QpOworCX0gd2hpbGUgKCFhdG9t
aWNfY21wc2V0XzY0KCZwdmNsb2NrX2xhc3RfY3ljbGVzLCBsYXN0LCBub3cpKTsKKworCXJldHVy
biAobm93KTsKK30KKwordm9pZAorcHZjbG9ja19nZXRfd2FsbGNsb2NrKHN0cnVjdCBwdmNsb2Nr
X3dhbGxfY2xvY2sgKndjLCBzdHJ1Y3QgdGltZXNwZWMgKnRzKQoreworCXVpbnQzMl90IHNlYywg
bnNlYzsKKworCXB2Y2xvY2tfcmVhZF93YWxsX2Nsb2NrKHdjLCAmc2VjLCAmbnNlYyk7CisJdHMt
PnR2X3NlYyA9IHNlYzsKKwl0cy0+dHZfbnNlYyA9IG5zZWM7Cit9CmRpZmYgLS1naXQgYS9zeXMv
eDg2L3g4Ni90c2MuYyBiL3N5cy94ODYveDg2L3RzYy5jCmluZGV4IDRjYTU3NGUuLmE4MzRjYjUg
MTAwNjQ0Ci0tLSBhL3N5cy94ODYveDg2L3RzYy5jCisrKyBiL3N5cy94ODYveDg2L3RzYy5jCkBA
IC0xMDQsMjIgKzEwNCw2IEBAIHN0YXRpYyBzdHJ1Y3QgdGltZWNvdW50ZXIgdHNjX3RpbWVjb3Vu
dGVyID0gewogfTsKIAogc3RhdGljIHZvaWQKLXRzY19mcmVxX3Ztd2FyZSh2b2lkKQotewotCXVf
aW50IHJlZ3NbNF07Ci0KLQlpZiAoaHZfaGlnaCA+PSAweDQwMDAwMDEwKSB7Ci0JCWRvX2NwdWlk
KDB4NDAwMDAwMTAsIHJlZ3MpOwotCQl0c2NfZnJlcSA9IHJlZ3NbMF0gKiAxMDAwOwotCX0gZWxz
ZSB7Ci0JCXZtd2FyZV9odmNhbGwoVk1XX0hWQ01EX0dFVEhaLCByZWdzKTsKLQkJaWYgKHJlZ3Nb
MV0gIT0gVUlOVF9NQVgpCi0JCQl0c2NfZnJlcSA9IHJlZ3NbMF0gfCAoKHVpbnQ2NF90KXJlZ3Nb
MV0gPDwgMzIpOwotCX0KLQl0c2NfaXNfaW52YXJpYW50ID0gMTsKLX0KLQotc3RhdGljIHZvaWQK
IHRzY19mcmVxX2ludGVsKHZvaWQpCiB7CiAJY2hhciBicmFuZFs0OF07CkBAIC0yMDEsNyArMTg1
LDggQEAgcHJvYmVfdHNjX2ZyZXEodm9pZCkKIAl9CiAKIAlpZiAodm1fZ3Vlc3QgPT0gVk1fR1VF
U1RfVk1XQVJFKSB7Ci0JCXRzY19mcmVxX3Ztd2FyZSgpOworCQl0c2NfZnJlcSA9IHZtd2FyZV90
c2NfZnJlcSgpOworCQl0c2NfaXNfaW52YXJpYW50ID0gMTsKIAkJcmV0dXJuOwogCX0KIApkaWZm
IC0tZ2l0IGEvc3lzL3g4Ni94ODYvdm13YXJlLmMgYi9zeXMveDg2L3g4Ni92bXdhcmUuYwpuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTZhY2JiCi0tLSAvZGV2L251bGwKKysr
IGIvc3lzL3g4Ni94ODYvdm13YXJlLmMKQEAgLTAsMCArMSw4NCBAQAorLyotCisgKiBDb3B5cmln
aHQgKGMpIDIwMTQgQnJ5YW4gVmVudGVpY2hlciA8YnJ5YW52QEZyZWVCU0Qub3JnPgorICogQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisg
KiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CitfX0ZCU0RJRCgi
JEZyZWVCU0QkIik7CisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvc3lz
dG0uaD4KKyNpbmNsdWRlIDxzeXMvbGltaXRzLmg+CisKKyNpbmNsdWRlIDx4ODYvaHlwZXJ2aXNv
ci5oPgorI2luY2x1ZGUgPHg4Ni92bXdhcmUuaD4KKworc3RhdGljIHVpbnQzMl90IHZtd2FyZV9j
cHVpZF9iYXNlID0gLTE7CitzdGF0aWMgdWludDMyX3Qgdm13YXJlX2NwdWlkX2hpZ2ggPSAtMTsK
Kworc3RhdGljIGludAordm13YXJlX2NwdWlkX2lkZW50aWZ5KHZvaWQpCit7CisKKwkvKgorCSAq
IEtCMTAwOTQ1ODogTWVjaGFuaXNtcyB0byBkZXRlcm1pbmUgaWYgc29mdHdhcmUgaXMgcnVubmlu
ZyBpbiBhCisJICogVk13YXJlIHZpcnR1YWwgbWFjaGluZTogaHR0cDovL2tiLnZtd2FyZS5jb20v
a2IvMTAwOTQ1OAorCSAqLworCWlmICh2bXdhcmVfY3B1aWRfYmFzZSA9PSAtMSkgeworCQloeXBl
cnZpc29yX2NwdWlkX2Jhc2UoIlZNd2FyZVZNd2FyZSIsIDAsICZ2bXdhcmVfY3B1aWRfYmFzZSwK
KwkJICAgICZ2bXdhcmVfY3B1aWRfaGlnaCk7CisJfQorCisJcmV0dXJuICh2bXdhcmVfY3B1aWRf
YmFzZSA+IDApOworfQorCit1aW50NjRfdAordm13YXJlX3RzY19mcmVxKHZvaWQpCit7CisJdWlu
dDY0X3QgZnJlcTsKKwl1X2ludCByZWdzWzRdOworCisJaWYgKHZtd2FyZV9jcHVpZF9oaWdoID49
IDB4NDAwMDAwMTApIHsKKwkJZG9fY3B1aWQoMHg0MDAwMDAxMCwgcmVncyk7CisJCWZyZXEgPSBy
ZWdzWzBdICogMTAwMDsKKwl9IGVsc2UgeworCQl2bXdhcmVfaHZjYWxsKFZNV19IVkNNRF9HRVRI
WiwgcmVncyk7CisJCWlmIChyZWdzWzFdICE9IFVJTlRfTUFYKQorCQkJZnJlcSA9IHJlZ3NbMF0g
fCAoKHVpbnQ2NF90KXJlZ3NbMV0gPDwgMzIpOworCQllbHNlCisJCQlmcmVxID0gMDsKKwl9CisK
KwlyZXR1cm4gKGZyZXEpOworfQorCitzdGF0aWMgdm9pZAordm13YXJlX2luaXQodm9pZCkKK3sK
KworCWlmICh2bXdhcmVfY3B1aWRfaWRlbnRpZnkoKSAhPSAwKQorCQloeXBlcnZpc29yX3JlZ2lz
dGVyKCJWTXdhcmUiLCBWTV9HVUVTVF9WTVdBUkUsIE5VTEwpOworfQorCitIWVBFUlZJU09SX1NZ
U0lOSVQodm13YXJlLCB2bXdhcmVfaW5pdCk7Cg==
--001a11425fb46ce52b050bd74b4a--



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