Cygwin cross compiler

Stephen Weeks MLton@sourcelight.com
Wed, 13 Mar 2002 14:20:29 -0800


--IMkTSrqzIS
Content-Type: text/plain; charset=us-ascii
Content-Description: message body text
Content-Transfer-Encoding: 7bit


> Among the options are:
> 1. update your kernel to 2.4
> 2. always run mlton with "@MLton fixed-heap XXX --" to force the heap size
> (and avoid the RAM lookup).  You can edit the /usr/local/bin/mlton script
> to do this automatically
> 3. complain loudly to the MLton developers ;)
> 
> I've lasted with option 2 for a while now.  On the downside, you also need
> to include this option on any program compiled by MLton and run on a 2.2
> kernel, because the RAM lookup functions are in the runtime system which
> is linked into every program.

Yuck.  We need to produce executables that work on 2.2.  I just
checked in a fix, suggested by Henry a few weeks ago, but lost in the
shuffle.

  If you are compiling on a 2.4 kernel, then at run-time check if
  mem_unit is 0.  If so, pretend it is 1 (and don't try to grab any
  fields that were added in 2.4 kernels).

Anoq, here is a new gc.c file.  Remake the runtime and try
hello-world.sml.  If that works, go ahead and remake mlton.  Or, I can
post new rpms.


--IMkTSrqzIS
Content-Type: application/octet-stream
Content-Disposition: attachment;
	filename="gc.c"
Content-Transfer-Encoding: base64

LyogQ29weXJpZ2h0IChDKSAxOTk3LTE5OTkgTkVDIFJlc2VhcmNoIEluc3RpdHV0ZS4KICog
UGxlYXNlIHNlZSB0aGUgZmlsZSBMSUNFTlNFIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLgog
Ki8KCiNpbmNsdWRlICJnYy5oIgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPGZjbnRs
Lmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN5
cy9tbWFuLmg+CiNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KI2luY2x1ZGUgPHN5cy90aW1l
cy5oPgojaW5jbHVkZSA8dGltZS5oPgojaWYgKGRlZmluZWQgKF9fbGludXhfXykpCiNpbmNs
dWRlIDx2YWx1ZXMuaD4KI2VuZGlmCgojZGVmaW5lIE1FVEVSIEZBTFNFICAvKiBEaXNwbGF5
cyBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IHNpemVzIGF0IHByb2dyYW0gZXhpdC4gKi8KCi8q
IFRoZSBtdXRhdG9yIHNob3VsZCBtYWludGFpbiB0aGUgaW52YXJpYW50cwogKgogKiAgZnVu
Y3Rpb24gZW50cnk6IHN0YWNrVG9wICsgbWF4RnJhbWVTaXplIDw9IGVuZE9mU3RhY2sKICog
IGFueXdoZXJlIGVsc2U6IHN0YWNrVG9wICsgMiAqIG1heEZyYW1lU2l6ZSA8PSBlbmRPZlN0
YWNrCiAqIAogKiBUaGUgbGF0dGVyIHdpbGwgZ2l2ZSBpdCBlbm91Z2ggc3BhY2UgdG8gbWFr
ZSBhIGZ1bmN0aW9uIGNhbGwgYW5kIGFsd2F5cwogKiBzYXRpc2Z5IHRoZSBmb3JtZXIuICBU
aGUgZm9ybWVyIHdpbGwgYWxsb3cgaXQgdG8gbWFrZSBhIGdjIGNhbGwgYXQgdGhlCiAqIGZ1
bmN0aW9uIGVudHJ5IGxpbWl0LgogKi8KCmVudW0gewoJQk9HVVNfRVhOX1NUQUNLID0gMHhG
RkZGRkZGRiwKCUJPR1VTX1BPSU5URVIgPSAweDEsCglERUJVRyA9IEZBTFNFLAoJREVCVUdf
REVUQUlMRUQgPSBGQUxTRSwKCURFQlVHX1NJR05BTFMgPSBGQUxTRSwKCUZPUldBUkRFRCA9
IDB4RkZGRkZGRkYsCglIRUFERVJfU0laRSA9IFdPUkRfU0laRSwKCVNUQUNLX0hFQURFUl9T
SVpFID0gV09SRF9TSVpFLAp9OwoKI2RlZmluZSBTVEFDS19IRUFERVIgU1RBQ0tfVEFHCiNk
ZWZpbmUgQk9HVVNfVEhSRUFEIChHQ190aHJlYWQpQk9HVVNfUE9JTlRFUgojZGVmaW5lIFNU
UklOR19IRUFERVIgR0NfYXJyYXlIZWFkZXIoMSwgMCkKI2RlZmluZSBXT1JEOF9WRUNUT1Jf
SEVBREVSIEdDX2FycmF5SGVhZGVyKDEsIDApCiNkZWZpbmUgVEhSRUFEX0hFQURFUiBHQ19v
YmplY3RIZWFkZXIoMiwgMSkKCnN0YXRpYyB2b2lkIGxlYXZlKEdDX3N0YXRlIHMpOwoKI2Rl
ZmluZSBTUExJVF9IRUFERVIoKQkJCQkJCQkJXAoJZG8gewkJCQkJCQkJCVwKCQl0YWcgPSBo
ZWFkZXIgJiBUQUdfTUFTSzsJCQkJCVwKCQludW1Ob25Qb2ludGVycyA9IChoZWFkZXIgJiBO
T05fUE9JTlRFUl9NQVNLKSA+PiBQT0lOVEVSX0JJVFM7CVwKCQludW1Qb2ludGVycyA9IGhl
YWRlciAmIFBPSU5URVJfTUFTSzsJCQkJXAoJfSB3aGlsZSAoMCkKCnN0YXRpYyBpbmxpbmUg
dWludCB0b0J5dGVzKHVpbnQgbikgewoJcmV0dXJuIG4gPDwgMjsKfQoKc3RhdGljIGlubGlu
ZSB1aW50IG1pbih1aW50IHgsIHVpbnQgeSkgewoJcmV0dXJuICgoeCA8IHkpID8geCA6IHkp
Owp9CgpzdGF0aWMgaW5saW5lIHVpbnQgbWF4KHVpbnQgeCwgdWludCB5KSB7CglyZXR1cm4g
KCh4ID4geSkgPyB4IDogeSk7Cn0KCi8qIEEgc3VwZXItc2FmZSBtbWFwLgogKiAgQWxsb2Nh
dGVzIGEgcmVnaW9uIG9mIG1lbW9yeSB3aXRoIGRlYWQgem9uZXMgYXQgdGhlIGhpZ2ggYW5k
IGxvdyBlbmRzLgogKiAgQW55IGF0dGVtcHQgdG8gdG91Y2ggdGhlIGRlYWQgem9uZSAocmVh
ZCBvciB3cml0ZSkgd2lsbCBjYXVzZSBhCiAqICAgc2VnbWVudGF0aW9uIGZhdWx0LgogKi8K
c3RhdGljIHZvaWQgKnNzbW1hcChzaXplX3QgbGVuZ3RoLCBzaXplX3QgZGVhZF9sb3csIHNp
emVfdCBkZWFkX2hpZ2gpIHsKICB2b2lkICpiYXNlLCpsb3csKnJlc3VsdCwqaGlnaDsKCiAg
YmFzZSA9IHNtbWFwKGxlbmd0aCArIGRlYWRfbG93ICsgZGVhZF9oaWdoKTsKCiAgbG93ID0g
YmFzZTsKICBpZiAobXByb3RlY3QobG93LCBkZWFkX2xvdywgUFJPVF9OT05FKSkKICAgIGRp
ZWUoIm1wcm90ZWN0IGZhaWxlZCIpOwoKICByZXN1bHQgPSBsb3cgKyBkZWFkX2xvdzsKICBo
aWdoID0gcmVzdWx0ICsgbGVuZ3RoOwoKICBpZiAobXByb3RlY3QoaGlnaCwgZGVhZF9oaWdo
LCBQUk9UX05PTkUpKQogICAgZGllZSgibXByb3RlY3QgZmFpbGVkIik7CgogIHJldHVybiBy
ZXN1bHQ7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgICAgICAgICByb3VuZFBhZ2UgICAgICAgICAg
ICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tICovCgovKgogKiBSb3VuZCBzaXplIHVwIHRvIGEgbXVsdGlwbGUgb2Yg
dGhlIHNpemUgb2YgYSBwYWdlLgogKi8Kc3RhdGljIGlubGluZSBzaXplX3QKcm91bmRQYWdl
KEdDX3N0YXRlIHMsIHNpemVfdCBzaXplKQp7CglzaXplICs9IHMtPnBhZ2VTaXplIC0gMTsK
CXNpemUgLT0gc2l6ZSAlIHMtPnBhZ2VTaXplOwoJcmV0dXJuIChzaXplKTsKfQoKLyogLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAg
ICAgICAgICAgICAgICAgICAgICBkaXNwbGF5ICAgICAgICAgICAgICAgICAgICAgICovCi8q
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8K
CnZvaWQgR0NfZGlzcGxheShHQ19zdGF0ZSBzLCBGSUxFICpzdHJlYW0pIHsKCWZwcmludGYo
c3RyZWFtLCAiR0Mgc3RhdGVcblx0YmFzZSA9ICV4ICBmcm9udGllciAtIGJhc2UgPSAldSAg
bGltaXQgLSBmcm9udGllciA9ICV1XG4iLAoJCQkodWludCkgcy0+YmFzZSwgCgkJCXMtPmZy
b250aWVyIC0gcy0+YmFzZSwKCQkJcy0+bGltaXQgLSBzLT5mcm9udGllcik7CglmcHJpbnRm
KHN0cmVhbSwgIlx0Y2FuSGFuZGxlID0gJWRcbiIsIHMtPmNhbkhhbmRsZSk7CglmcHJpbnRm
KHN0cmVhbSwgIlx0ZXhuU3RhY2sgPSAldSAgYnl0ZXNOZWVkZWQgPSAldSAgcmVzZXJ2ZWQg
PSAldSAgdXNlZCA9ICV1XG4iLAoJCQlzLT5jdXJyZW50VGhyZWFkLT5leG5TdGFjaywKCQkJ
cy0+Y3VycmVudFRocmVhZC0+Ynl0ZXNOZWVkZWQsCgkJCXMtPmN1cnJlbnRUaHJlYWQtPnN0
YWNrLT5yZXNlcnZlZCwKCQkJcy0+Y3VycmVudFRocmVhZC0+c3RhY2stPnVzZWQpOwoJZnBy
aW50ZihzdHJlYW0sICJcdHN0YWNrQm90dG9tID0gJXhcbnN0YWNrVG9wIC0gc3RhY2tCb3R0
b20gPSAldVxuc3RhY2tMaW1pdCAtIHN0YWNrVG9wID0gJXVcbiIsCgkJCSh1aW50KXMtPnN0
YWNrQm90dG9tLAoJCQlzLT5zdGFja1RvcCAtIHMtPnN0YWNrQm90dG9tLAoJCQkocy0+c3Rh
Y2tMaW1pdCAtIHMtPnN0YWNrVG9wKSk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgICAgICAgIGVu
c3VyZUZyZWUgICAgICAgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgaW5saW5lIHZvaWQK
ZW5zdXJlRnJlZShHQ19zdGF0ZSBzLCB1aW50IGJ5dGVzUmVxdWVzdGVkKQp7CglpZiAocy0+
ZnJvbnRpZXIgKyBieXRlc1JlcXVlc3RlZCA+IHMtPmxpbWl0KSB7CgkJR0NfZG9HQyhzLCBi
eXRlc1JlcXVlc3RlZCwgMCk7Cgl9Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgICAgICAgICAgb2Jq
ZWN0ICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgaW5saW5lIHBvaW50ZXIK
b2JqZWN0KEdDX3N0YXRlIHMsIHVpbnQgaGVhZGVyLCB1aW50IGJ5dGVzUmVxdWVzdGVkKQp7
Cglwb2ludGVyIHJlc3VsdDsKCglhc3NlcnQocy0+ZnJvbnRpZXIgKyBieXRlc1JlcXVlc3Rl
ZCA8PSBzLT5saW1pdCk7Cglhc3NlcnQoaXNXb3JkQWxpZ25lZChieXRlc1JlcXVlc3RlZCkp
OwoJKih1aW50KilzLT5mcm9udGllciA9IGhlYWRlcjsKCXJlc3VsdCA9IHMtPmZyb250aWVy
ICsgSEVBREVSX1NJWkU7CglzLT5mcm9udGllciArPSBieXRlc1JlcXVlc3RlZDsKCXJldHVy
biByZXN1bHQ7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgICAgICBnZXRGcmFtZUxheW91dCAgICAg
ICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgaW5saW5lIEdDX2ZyYW1lTGF5b3V0CSoKZ2V0
RnJhbWVMYXlvdXQoR0Nfc3RhdGUgcywgd29yZCByZXR1cm5BZGRyZXNzKQp7CglHQ19mcmFt
ZUxheW91dCAqbGF5b3V0OwoJdWludCBpbmRleDsKCglpZiAocy0+bmF0aXZlKQoJCWluZGV4
ID0gKigodWludCopKHJldHVybkFkZHJlc3MgLSA0KSk7CgllbHNlCgkJaW5kZXggPSAodWlu
dClyZXR1cm5BZGRyZXNzOwoJYXNzZXJ0KDAgPD0gaW5kZXggYW5kIGluZGV4IDw9IHMtPm1h
eEZyYW1lSW5kZXgpOwoJbGF5b3V0ID0gJihzLT5mcmFtZUxheW91dHNbaW5kZXhdKTsKCWFz
c2VydChsYXlvdXQtPm51bUJ5dGVzID4gMCk7CglyZXR1cm4gbGF5b3V0Owp9CgovKiAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAg
ICAgICAgICAgICAgICAgICAgIFN0YWNrcyAgICAgICAgICAgICAgICAgICAgICAgKi8KLyog
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoK
Lyogc3RhY2tTbG9wIHJldHVybnMgdGhlIGFtb3VudCBvZiAic2xvcCIgc3BhY2UgbmVlZGVk
IGJldHdlZW4gdGhlIHRvcCBvZiAKICogdGhlIHN0YWNrIGFuZCB0aGUgZW5kIG9mIHRoZSBz
dGFjayBzcGFjZS4KICogSWYgeW91IGNoYW5nZSB0aGlzLCBtYWtlIHN1cmUgYW5kIGNoYW5n
ZSBUaHJlYWRfc3dpdGNoVG8gaW4gY2NvZGVnZW4uaAogKiAgIGFuZCB0aHJlYWRfc3dpdGNo
VG8gaW4geDg2LWdlbmVyYXRlLXRyYW5zZmVycy5zbWwuCiAqLwpzdGF0aWMgaW5saW5lIHVp
bnQgc3RhY2tTbG9wKEdDX3N0YXRlIHMpIHsKCXJldHVybiAyICogcy0+bWF4RnJhbWVTaXpl
Owp9CgpzdGF0aWMgaW5saW5lIHVpbnQgaW5pdGlhbFN0YWNrU2l6ZShHQ19zdGF0ZSBzKSB7
CglyZXR1cm4gc3RhY2tTbG9wKHMpOwp9CgpzdGF0aWMgaW5saW5lIHVpbnQKc3RhY2tCeXRl
cyh1aW50IHNpemUpCnsKCXJldHVybiB3b3JkQWxpZ24oSEVBREVSX1NJWkUgKyBzaXplb2Yo
c3RydWN0IEdDX3N0YWNrKSArIHNpemUpOwp9CgovKiBJZiB5b3UgY2hhbmdlIHRoaXMsIG1h
a2Ugc3VyZSBhbmQgY2hhbmdlIFRocmVhZF9zd2l0Y2hUbyBpbiBjY29kZWdlbi5oCiAqICAg
YW5kIHRocmVhZF9zd2l0Y2hUbyBpbiB4ODYtZ2VuZXJhdGUtdHJhbnNmZXJzLnNtbC4KICov
CnN0YXRpYyBpbmxpbmUgcG9pbnRlcgpzdGFja0JvdHRvbShHQ19zdGFjayBzdGFjaykKewoJ
cmV0dXJuICgocG9pbnRlcilzdGFjaykgKyBzaXplb2Yoc3RydWN0IEdDX3N0YWNrKTsKfQoK
LyogUG9pbnRlciB0byB0aGUgdG9wbW9zdCB3b3JkIGluIHVzZSBvbiB0aGUgc3RhY2suICov
Ci8qIElmIHlvdSBjaGFuZ2UgdGhpcywgbWFrZSBzdXJlIGFuZCBjaGFuZ2UgVGhyZWFkX3N3
aXRjaFRvIGluIGNjb2RlZ2VuLmgKICogICBhbmQgdGhyZWFkX3N3aXRjaFRvIGluIHg4Ni1n
ZW5lcmF0ZS10cmFuc2ZlcnMuc21sLgogKi8Kc3RhdGljIGlubGluZSBwb2ludGVyCnN0YWNr
VG9wKEdDX3N0YWNrIHN0YWNrKQp7CglyZXR1cm4gc3RhY2tCb3R0b20oc3RhY2spICsgc3Rh
Y2stPnVzZWQ7Cn0KCi8qIFRoZSBtYXhpbXVtIHZhbHVlIHN0YWNrVG9wIG1heSB0YWtlIG9u
LiAqLwovKiBJZiB5b3UgY2hhbmdlIHRoaXMsIG1ha2Ugc3VyZSBhbmQgY2hhbmdlIFRocmVh
ZF9zd2l0Y2hUbyBpbiBjY29kZWdlbi5oCiAqICAgYW5kIHRocmVhZF9zd2l0Y2hUbyBpbiB4
ODYtZ2VuZXJhdGUtdHJhbnNmZXJzLnNtbC4KICovCnN0YXRpYyBpbmxpbmUgcG9pbnRlcgpz
dGFja0xpbWl0KEdDX3N0YXRlIHMsIEdDX3N0YWNrIHN0YWNrKQp7CglyZXR1cm4gc3RhY2tC
b3R0b20oc3RhY2spICsgc3RhY2stPnJlc2VydmVkIC0gc3RhY2tTbG9wKHMpOwp9CgovKiBO
dW1iZXIgb2YgYnl0ZXMgdXNlZCBieSB0aGUgc3RhY2suICovCi8qIElmIHlvdSBjaGFuZ2Ug
dGhpcywgbWFrZSBzdXJlIGFuZCBjaGFuZ2UgVGhyZWFkX3N3aXRjaFRvIGluIGNjb2RlZ2Vu
LmgKICogICBhbmQgdGhyZWFkX3N3aXRjaFRvIGluIHg4Ni1nZW5lcmF0ZS10cmFuc2ZlcnMu
c21sLgogKi8Kc3RhdGljIGlubGluZSB1aW50CmN1cnJlbnRTdGFja1VzZWQoR0Nfc3RhdGUg
cykKewoJcmV0dXJuIHMtPnN0YWNrVG9wIC0gcy0+c3RhY2tCb3R0b207Cn0KCnN0YXRpYyBp
bmxpbmUgYm9vbApzdGFja0lzRW1wdHkoR0Nfc3RhY2sgc3RhY2spCnsKCXJldHVybiAwID09
IHN0YWNrLT51c2VkOwp9CgpzdGF0aWMgaW5saW5lIHVpbnQKdG9wRnJhbWVTaXplKEdDX3N0
YXRlIHMsIEdDX3N0YWNrIHN0YWNrKQp7CglHQ19mcmFtZUxheW91dCAqbGF5b3V0OwoJCglh
c3NlcnQobm90KHN0YWNrSXNFbXB0eShzdGFjaykpKTsKCWxheW91dCA9IGdldEZyYW1lTGF5
b3V0KHMsICood29yZCopKHN0YWNrVG9wKHN0YWNrKSAtIFdPUkRfU0laRSkpOwoJcmV0dXJu
IGxheW91dC0+bnVtQnl0ZXM7Cn0KCi8qIHN0YWNrVG9wSXNPayBlbnN1cmVzIHRoYXQgd2hl
biB0aGlzIHN0YWNrIGJlY29tZXMgY3VycmVudCB0aGF0IAogKiB0aGUgc3RhY2tUb3AgaXMg
bGVzcyB0aGFuIHRoZSBzdGFja0xpbWl0LgogKi8Kc3RhdGljIGlubGluZSBib29sCnN0YWNr
VG9wSXNPayhHQ19zdGF0ZSBzLCBHQ19zdGFjayBzdGFjaykKewoJcmV0dXJuIHN0YWNrVG9w
KHN0YWNrKSAKCQkgICAgICAgCTw9IHN0YWNrTGltaXQocywgc3RhY2spIAoJCQkrIChzdGFj
a0lzRW1wdHkoc3RhY2spID8gMCA6IHRvcEZyYW1lU2l6ZShzLCBzdGFjaykpOwp9CgpzdGF0
aWMgaW5saW5lIEdDX3N0YWNrCm5ld1N0YWNrKEdDX3N0YXRlIHMsIHVpbnQgc2l6ZSkKewoJ
R0Nfc3RhY2sgc3RhY2s7CgoJc3RhY2sgPSAoR0Nfc3RhY2spb2JqZWN0KHMsIFNUQUNLX0hF
QURFUiwgc3RhY2tCeXRlcyhzaXplKSk7CglzdGFjay0+cmVzZXJ2ZWQgPSBzaXplOwoJc3Rh
Y2stPnVzZWQgPSAwOwoJcmV0dXJuIHN0YWNrOwp9CgppbmxpbmUgdm9pZApHQ19zZXRTdGFj
ayhHQ19zdGF0ZSBzKQp7CglHQ19zdGFjayBzdGFjazsKCglzdGFjayA9IHMtPmN1cnJlbnRU
aHJlYWQtPnN0YWNrOwoJcy0+c3RhY2tCb3R0b20gPSBzdGFja0JvdHRvbShzdGFjayk7Cglz
LT5zdGFja1RvcCA9IHN0YWNrVG9wKHN0YWNrKTsKCXMtPnN0YWNrTGltaXQgPSBzdGFja0xp
bWl0KHMsIHN0YWNrKTsKfQoKc3RhdGljIGlubGluZSB2b2lkCnN0YWNrQ29weShHQ19zdGFj
ayBmcm9tLCBHQ19zdGFjayB0bykKewoJYXNzZXJ0KGZyb20tPnVzZWQgPD0gdG8tPnJlc2Vy
dmVkKTsKCXRvLT51c2VkID0gZnJvbS0+dXNlZDsKCW1lbWNweShzdGFja0JvdHRvbSh0byks
IHN0YWNrQm90dG9tKGZyb20pLCBmcm9tLT51c2VkKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAgICAgICAgICAgICAg
ICAgY29tcHV0ZVNlbWlTaXplICAgICAgICAgICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnR5cGVkZWYgdW5z
aWduZWQgbG9uZyBsb25nIFc2NDsKdHlwZWRlZiB1bnNpZ25lZCBsb25nIFczMjsKCnN0YXRp
YyBpbmxpbmUgdWxvbmcgbWVnICh1aW50IG4pIHsKCXJldHVybiBuIC8gKDEwMjR1bCAqIDEw
MjR1bCk7Cn0KCi8qIGNvbXB1dGVTZW1pU2l6ZSByZXR1cm5zIHRoZSBhbW91bnQgb2Ygc3Bh
Y2UgbmVlZGVkIGZvciBhIHNlbWlzcGFjZSwKICogZ2l2ZW4gdGhhdCBsaXZlIGlzIHRoZSBu
dW1iZXIgb2YgYnl0ZXMgdGhhdCB3aWxsIGJlIGNvcGVkIGludG8gdGhlIHNwYWNlCiAqIGFu
ZCB1c2VkIGlzIHRoZSBhbW91bnQgdXNlZCBieSB0aGUgb3RoZXIgc2VtaXNwYWNlLgogKiBJ
dCB3aWxsIGF0dGVtcHQgdG8gbWFrZSB0aGUgc2l6ZSBsaXZlICogcy0+bGl2ZVJhdGlvLCBi
dXQgd2lsbCBub3QKICogdmlvbGF0ZSB0aGUgaW52YXJpYW50IHRoYXQgZnJvbVNpemUgKyB0
b1NpemUgPD0gbWF4SGVhcFNpemUuICBJdCB3aWxsIGFsc28KICogYmFjayBvZmYgaW4gdGhl
IGNhc2UgdGhhdCBtb3JlIHNwYWNlIGlzIG5lZWRlZCB0aGFuIGF2YWlsYWJsZSBSQU0uCiAq
CiAqIEl0IGlzIGNhcmVmdWwgbm90IHRvIG92ZXJmbG93IHdoZW4gZG9pbmcgdGhlIG11bHRp
cGx5LgogKi8Kc3RhdGljIHVpbnQKY29tcHV0ZVNlbWlTaXplKEdDX3N0YXRlIHMsIFc2NCBs
aXZlLCB1aW50IHVzZWQsIGludCB0cnkpCnsKCVc2NCBuZWVkZWRMb25nOwoJdWludCBuZWVk
ZWQ7CgoJYXNzZXJ0KG5vdCBzLT51c2VGaXhlZEhlYXApOwoJbmVlZGVkTG9uZyA9IGxpdmUg
KiBzLT5saXZlUmF0aW87CglpZiAobmVlZGVkTG9uZyA8PSAoVzY0KXMtPm1heFNlbWkpCgkJ
bmVlZGVkID0gcm91bmRQYWdlKHMsIChXMzIpbmVlZGVkTG9uZyk7CgllbHNlIHsKCQlXNjQg
bWF5YmU7CgkJdWludCBuOwoJCXN0YXRpYyBkb3VibGUga3NbMTNdID0gezEuOTksIDEuOTks
IDEuOCwgMS43LCAxLjYsIDEuNSwgCgkJCQkJMS40LCAxLjMsIDEuMiwgMS4xNSwgMS4xLCAx
LjA1LCAxLjAxfTsKCQlkb3VibGUgazsKCgkJYXNzZXJ0ICgwIDw9IHRyeSBhbmQgdHJ5IDwg
MTMpOwoJCWsgPSBrc1t0cnldOwoJCWsgPSAoKGstMSkvMikrMTsKCQltYXliZSA9IChXNjQp
KGtzW3RyeV0gKiAoZG91YmxlKWxpdmUpOwoJCW4gPSByb3VuZFBhZ2UocywgbWF5YmUgPiAo
VzY0KShzLT50b3RhbFJhbSArIHMtPnRvdGFsU3dhcCkKCQkJCT8gcy0+dG90YWxSYW0gKyBz
LT50b3RhbFN3YXAKCQkJCTogKFczMiltYXliZSk7CgkJaWYgKG4gPD0gcy0+bWF4U2VtaSkK
CQkJbiA9IHMtPm1heFNlbWk7CgkJZWxzZSBpZiAocy0+bWVzc2FnZXMgYW5kIHRyeSA+IDAp
CgkJCQlmcHJpbnRmKHN0ZGVyciwgIltSZXF1ZXN0ZWQgJWxsdU1iICg+ICVsdU1iKSBjYW5u
b3QgYmUgc2F0aXNmaWVkLCBhbGxvY2F0aW5nICVsdU1iIGluc3RlYWQuIExpdmUgPSAlbHVN
Yiwgaz0lLjJmXVxuIiwKCQkJCQluZWVkZWRMb25nIC8gKDEwMjQgKiAxMDI0KSwgCgkJCQkJ
bWVnKHMtPm1heFNlbWkpLAoJCQkJCW1lZyhuKSwgbWVnKGxpdmUpLCBrc1t0cnldKTsKCQlu
ZWVkZWQgPSBuOwoJfQoJaWYgKHMtPm1heEhlYXBTaXplID4gMCBhbmQgbmVlZGVkID4gcy0+
bWF4SGVhcFNpemUgLSB1c2VkKQoJCXJldHVybiByb3VuZFBhZ2Uocywgcy0+bWF4SGVhcFNp
emUgLSB1c2VkKTsKCWVsc2UKCQlyZXR1cm4gbmVlZGVkOwp9CgovKiAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAgICAgICAgICAg
ICAgICAgICBhcnJheU51bUJ5dGVzICAgICAgICAgICAgICAgICAgKi8KLyogLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyogVGhlIG51
bWJlciBvZiBieXRlcyBpbiBhbiBhcnJheSwgbm90IGluY2x1ZGluZyB0aGUgaGVhZGVyLiAq
LwpzdGF0aWMgaW5saW5lIHVpbnQKYXJyYXlOdW1CeXRlcyhwb2ludGVyIHAsIAoJCSAgICAg
dWludCBudW1Qb2ludGVycywKCQkgICAgIHVpbnQgbnVtTm9uUG9pbnRlcnMpCnsKCXVpbnQg
bnVtRWxlbWVudHMsIGJ5dGVzUGVyRWxlbWVudCwgcmVzdWx0OwoJCgludW1FbGVtZW50cyA9
IEdDX2FycmF5TnVtRWxlbWVudHMocCk7CglieXRlc1BlckVsZW1lbnQgPSBudW1Ob25Qb2lu
dGVycyArIHRvQnl0ZXMobnVtUG9pbnRlcnMpOwoJcmVzdWx0ID0gd29yZEFsaWduKG51bUVs
ZW1lbnRzICogYnl0ZXNQZXJFbGVtZW50KTsKCQoJcmV0dXJuIHJlc3VsdDsKfQoKc3RhdGlj
IGlubGluZSB2b2lkCm1heWJlQ2FsbChHQ19wb2ludGVyRnVuIGYsIEdDX3N0YXRlIHMsIHBv
aW50ZXIgKnBwKQp7CglpZiAoR0NfaXNQb2ludGVyKCpwcCkpCgkJZihzLCBwcCk7Cn0KCi8q
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8K
LyogICAgICAgICAgICAgICAgIEdDX2ZvcmVhY2hHbG9iYWwgICAgICAgICAgICAgICAgICAq
LwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
ICovCgovKiBBcHBseSBmIHRvIGVhY2ggZ2xvYmFsIHBvaW50ZXIgaW50byB0aGUgaGVhcC4g
Ki8KaW5saW5lIHZvaWQKR0NfZm9yZWFjaEdsb2JhbChHQ19zdGF0ZSBzLCBHQ19wb2ludGVy
RnVuIGYpCnsKCWludCBpOwoKIAlmb3IgKGkgPSAwOyBpIDwgcy0+bnVtR2xvYmFsczsgKytp
KQoJCW1heWJlQ2FsbChmLCBzLCAmcy0+Z2xvYmFsc1tpXSk7CgltYXliZUNhbGwoZiwgcywg
KHBvaW50ZXIqKSZzLT5jdXJyZW50VGhyZWFkKTsKCW1heWJlQ2FsbChmLCBzLCAocG9pbnRl
ciopJnMtPnNhdmVkVGhyZWFkKTsKCW1heWJlQ2FsbChmLCBzLCAocG9pbnRlciopJnMtPnNp
Z25hbEhhbmRsZXIpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tICovCi8qICAgICAgICAgICAgIEdDX2ZvcmVhY2hQb2ludGVySW5P
YmplY3QgICAgICAgICAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKgogKiBBcHBseSBmIHRvIGVhY2ggcG9pbnRlciBp
biB0aGUgb2JqZWN0IHAsIHdoZXJlIHAgcG9pbnRzIGF0IHRoZSBmaXJzdAogKiBkYXRhIHdv
cmQgaW4gdGhlIG9iamVjdC4KICogUmV0dXJucyBwb2ludGVyIHRvIHRoZSBlbmQgb2Ygb2Jq
ZWN0LCBpLmUuIGp1c3QgcGFzdCBvYmplY3QuCiAqLwppbmxpbmUgcG9pbnRlcgpHQ19mb3Jl
YWNoUG9pbnRlckluT2JqZWN0KEdDX3N0YXRlIHMsIEdDX3BvaW50ZXJGdW4gZiwgcG9pbnRl
ciBwKQp7Cgl3b3JkIGhlYWRlcjsKCXVpbnQgbnVtUG9pbnRlcnM7Cgl1aW50IG51bU5vblBv
aW50ZXJzOwoJdWludCB0YWc7CgoJaGVhZGVyID0gR0NfZ2V0SGVhZGVyKHApOwoJU1BMSVRf
SEVBREVSKCk7CglpZiAoREVCVUdfREVUQUlMRUQpCgkJZnByaW50ZihzdGRlcnIsICJmb3Jl
YWNoUG9pbnRlckluT2JqZWN0IHAgPSAweCV4ICBoZWFkZXIgPSAweCV4ICB0YWcgPSAweCV4
ICBudW1Ob25Qb2ludGVycyA9ICVkICBudW1Qb2ludGVycyA9ICVkXG4iLCAKCQkJKHVpbnQp
cCwgaGVhZGVyLCB0YWcsIG51bU5vblBvaW50ZXJzLCBudW1Qb2ludGVycyk7CglpZiAoTk9S
TUFMX1RBRyA9PSB0YWcpIHsgLyogSXQncyBhIG5vcm1hbCBvYmplY3QuICovCgkJcG9pbnRl
ciBtYXg7CgoJCXAgKz0gdG9CeXRlcyhudW1Ob25Qb2ludGVycyk7CgkJbWF4ID0gcCArIHRv
Qnl0ZXMobnVtUG9pbnRlcnMpOwoJCS8qIEFwcGx5IGYgdG8gYWxsIGludGVybmFsIHBvaW50
ZXJzLiAqLwoJCWZvciAoIDsgcCA8IG1heDsgcCArPSBQT0lOVEVSX1NJWkUpCgkJCW1heWJl
Q2FsbChmLCBzLCAocG9pbnRlciopcCk7Cgl9IGVsc2UgaWYgKFNUQUNLX1RBRyA9PSB0YWcp
IHsKCQlHQ19zdGFjayBzdGFjazsKCQlwb2ludGVyIHRvcCwgYm90dG9tOwoJCWludCBpOwoJ
CXdvcmQgcmV0dXJuQWRkcmVzczsKCQlHQ19mcmFtZUxheW91dCAqbGF5b3V0OwoJCUdDX29m
ZnNldHMgZnJhbWVPZmZzZXRzOwoKCQlzdGFjayA9IChHQ19zdGFjaylwOwoJCWJvdHRvbSA9
IHN0YWNrQm90dG9tKHN0YWNrKTsKCQl0b3AgPSBzdGFja1RvcChzdGFjayk7CgkJYXNzZXJ0
KHN0YWNrLT51c2VkIDw9IHN0YWNrLT5yZXNlcnZlZCk7CgkJd2hpbGUgKHRvcCA+IGJvdHRv
bSkgewoJCQkvKiBJbnZhcmlhbnQ6IHRvcCBwb2ludHMganVzdCBwYXN0IGEgInJldHVybiBh
ZGRyZXNzIi4gKi8KCQkJcmV0dXJuQWRkcmVzcyA9ICood29yZCopICh0b3AgLSBXT1JEX1NJ
WkUpOwoJCQlpZiAoREVCVUcpCgkJCQlmcHJpbnRmKHN0ZGVyciwgCgkJCQkJIiAgdG9wID0g
JWQgIHJldHVybiBhZGRyZXNzID0gJXUuXG4iLCAKCQkJCQl0b3AgLSBib3R0b20sIAoJCQkJ
CXJldHVybkFkZHJlc3MpOwoJCQlsYXlvdXQgPSBnZXRGcmFtZUxheW91dChzLCByZXR1cm5B
ZGRyZXNzKTsgCgkJCWZyYW1lT2Zmc2V0cyA9IGxheW91dC0+b2Zmc2V0czsKCQkJdG9wIC09
IGxheW91dC0+bnVtQnl0ZXM7CgkJCWZvciAoaSA9IDAgOyBpIDwgZnJhbWVPZmZzZXRzWzBd
IDsgKytpKSB7CgkJCQlpZiAoREVCVUcpCgkJCQkJZnByaW50ZihzdGRlcnIsIAoJCQkJCQki
ICAgIG9mZnNldCAldSAgYWRkcmVzcyAleFxuIiwgCgkJCQkJCWZyYW1lT2Zmc2V0c1tpICsg
MV0sCgkJCQkJCSh1aW50KSgqKHBvaW50ZXIqKSh0b3AgKyBmcmFtZU9mZnNldHNbaSArIDFd
KSkpOwoJCQkJbWF5YmVDYWxsKGYsIHMsIAoJCQkJCSAgKHBvaW50ZXIqKQoJCQkJCSAgKHRv
cCArIGZyYW1lT2Zmc2V0c1tpICsgMV0pKTsKCQkJfQoJCX0KCQlhc3NlcnQodG9wID09IGJv
dHRvbSk7CgkJcCArPSBzaXplb2Yoc3RydWN0IEdDX3N0YWNrKSArIHN0YWNrLT5yZXNlcnZl
ZDsKCX0gZWxzZSB7IC8qIEl0J3MgYW4gYXJyYXkuICovCgkJdWludCBudW1CeXRlczsKCgkJ
YXNzZXJ0KEFSUkFZX1RBRyA9PSB0YWcpOwoJCW51bUJ5dGVzID0gYXJyYXlOdW1CeXRlcyhw
LCBudW1Qb2ludGVycywgbnVtTm9uUG9pbnRlcnMpOwoJCWlmIChudW1CeXRlcyA9PSAwKQoJ
CQkvKiBBbiBlbXB0eSBhcnJheSAtLSBza2lwIHRoZSBQT0lOVEVSX1NJWkUgYnl0ZXMKCQkJ
ICogZm9yIHRoZSBmb3J3YXJkaW5nIHBvaW50ZXIuCgkJCSAqLwoJCQlwICs9IFBPSU5URVJf
U0laRTsKCQllbHNlIHsKCQkJcG9pbnRlciBtYXg7CgoJCQltYXggPSBwICsgbnVtQnl0ZXM7
CgkJCWlmIChudW1Qb2ludGVycyA9PSAwKSB7CgkJCQkvKiBUaGVyZSBhcmUgbm8gcG9pbnRl
cnMsIGp1c3QgdXBkYXRlIHAuICovCgkJCQlwID0gbWF4OwoJCQl9IGVsc2UgaWYgKG51bU5v
blBvaW50ZXJzID09IDApIHsKCQkJICAJLyogSXQncyBhbiBhcnJheSB3aXRoIG9ubHkgcG9p
bnRlcnMuICovCgkJCQlmb3IgKDsgcCA8IG1heDsgcCArPSBQT0lOVEVSX1NJWkUpCgkJCQkJ
bWF5YmVDYWxsKGYsIHMsIChwb2ludGVyKilwKTsKCQkJfSBlbHNlIHsKCQkJCXVpbnQgbnVt
Qnl0ZXNQb2ludGVyczsKCQkJCQoJCQkJbnVtQnl0ZXNQb2ludGVycyA9IHRvQnl0ZXMobnVt
UG9pbnRlcnMpOwoJCQkJLyogRm9yIGVhY2ggYXJyYXkgZWxlbWVudC4gKi8KCQkJCXdoaWxl
IChwIDwgbWF4KSB7CgkJCQkJcG9pbnRlciBtYXgyOwoKCQkJCQlwICs9IG51bU5vblBvaW50
ZXJzOwoJCQkJCW1heDIgPSBwICsgbnVtQnl0ZXNQb2ludGVyczsKCQkJCQkvKiBGb3IgZWFj
aCBpbnRlcm5hbCBwb2ludGVyLiAqLwoJCQkJCWZvciAoIDsgcCA8IG1heDI7IHAgKz0gUE9J
TlRFUl9TSVpFKSAKCQkJCQkJbWF5YmVDYWxsKGYsIHMsIChwb2ludGVyKilwKTsKCQkJCX0K
CQkJfQoJCQlhc3NlcnQocCA9PSBtYXgpOwoJCX0KCX0KCXJldHVybiBwOwp9CgovKiAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAg
ICAgICAgICAgICAgICAgICAgIHRvRGF0YSAgICAgICAgICAgICAgICAgICAgICAgKi8KLyog
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoK
LyogcCBzaG91bGQgcG9pbnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhbiBvYmplY3QgKGkuZS4g
dGhlIGhlYWRlcikuCiAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUg
b2JqZWN0IGRhdGEuCiAqLwpzdGF0aWMgaW5saW5lIHBvaW50ZXIKdG9EYXRhKHBvaW50ZXIg
cCkKewoJd29yZCBoZWFkZXI7CQoKCWhlYWRlciA9ICood29yZCopcDsKCXJldHVybiAoKEFS
UkFZX1RBRyA9PSAoaGVhZGVyICYgVEFHX01BU0spKQoJCT8gcCArIDIgKiBXT1JEX1NJWkUK
CQk6IHAgKyBXT1JEX1NJWkUpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAgICAgICAgICAgIEdDX2ZvcmVhY2hQb2lu
dGVySW5SYW5nZSAgICAgICAgICAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyogQXBwbHkgZiB0byBlYWNoIHBvaW50
ZXIgYmV0d2VlbiBmcm9udCBhbmQgKmJhY2ssIHdoaWNoIHNob3VsZCBiZSBhIAogKiBjb250
aWd1b3VzIHNlcXVlbmNlIG9mIG9iamVjdHMsIHdoZXJlIGZyb250IHBvaW50cyBhdCB0aGUg
YmVnaW5uaW5nIG9mCiAqIHRoZSBmaXJzdCBvYmplY3QgYW5kICpiYWNrIHBvaW50cyBqdXN0
IHBhc3QgdGhlIGVuZCBvZiB0aGUgbGFzdCBvYmplY3QuCiAqIGYgbWF5IGluY3JlYXNlICpi
YWNrIChmb3IgZXhhbXBsZSwgdGhpcyBpcyBkb25lIGJ5IGZvcndhcmQpLgogKi8KCmlubGlu
ZSB2b2lkCkdDX2ZvcmVhY2hQb2ludGVySW5SYW5nZShHQ19zdGF0ZSBzLCBwb2ludGVyIGZy
b250LCBwb2ludGVyICpiYWNrLAoJCQkgR0NfcG9pbnRlckZ1biBmKQp7Cglwb2ludGVyIGI7
CgoJYiA9ICpiYWNrOwoJYXNzZXJ0KGZyb250IDw9IGIpOwogCXdoaWxlIChmcm9udCA8IGIp
IHsKCQl3aGlsZSAoZnJvbnQgPCBiKSB7CgkJCWFzc2VydChpc1dvcmRBbGlnbmVkKCh1aW50
KWZyb250KSk7CgkJCWZyb250ID0gR0NfZm9yZWFjaFBvaW50ZXJJbk9iamVjdChzLCBmLCB0
b0RhdGEoZnJvbnQpKTsKCQl9CgkJYiA9ICpiYWNrOwoJfQoJYXNzZXJ0KGZyb250ID09ICpi
YWNrKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLSAqLwovKiAgICAgICAgICAgICAgICAgICAgIGludmFyaWFudCAgICAgICAgICAg
ICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0gKi8KCiNpZm5kZWYgTk9ERUJVRwoKc3RhdGljIGlubGluZSBib29sCmlz
SW5Gcm9tU3BhY2UoR0Nfc3RhdGUgcywgcG9pbnRlciBwKQp7CiAJcmV0dXJuIChzLT5iYXNl
IDw9IHAgYW5kIHAgPCBzLT5mcm9udGllcik7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZAphc3Nl
cnRJc0luRnJvbVNwYWNlKEdDX3N0YXRlIHMsIHBvaW50ZXIgKnApCnsKCWFzc2VydChpc0lu
RnJvbVNwYWNlKHMsICpwKSk7Cn0KCnN0YXRpYyBpbmxpbmUgYm9vbAppc0luVG9TcGFjZShH
Q19zdGF0ZSBzLCBwb2ludGVyIHApCnsKCXJldHVybiAobm90KEdDX2lzUG9pbnRlcihwKSkK
CQlvciAocy0+dG9CYXNlIDw9IHAgYW5kIHAgPCBzLT50b0Jhc2UgKyBzLT50b1NpemUpKTsK
fQoKc3RhdGljIGJvb2wKaW52YXJpYW50KEdDX3N0YXRlIHMpCnsKCS8qIHdvdWxkIGJlIG5p
Y2UgdG8gYWRkIGRpdmlzaWJsaXR5IGJ5IHBhZ2VzaXplIG9mIHZhcmlvdXMgdGhpbmdzICov
CgoJLyogRnJhbWUgbGF5b3V0cyAqLwoJewkKCQlpbnQgaTsKCgkJZm9yIChpID0gMDsgaSA8
IHMtPm1heEZyYW1lSW5kZXg7ICsraSkgewoJCQlHQ19mcmFtZUxheW91dCAqbGF5b3V0OwoK
IAkJCWxheW91dCA9ICYocy0+ZnJhbWVMYXlvdXRzW2ldKTsKCQkJaWYgKGxheW91dC0+bnVt
Qnl0ZXMgPiAwKSB7CgkJCQlHQ19vZmZzZXRzIG9mZnNldHM7CgkJCQlpbnQgajsKCgkJCQlh
c3NlcnQobGF5b3V0LT5udW1CeXRlcyA8PSBzLT5tYXhGcmFtZVNpemUpOwoJCQkJb2Zmc2V0
cyA9IGxheW91dC0+b2Zmc2V0czsKCQkJCWZvciAoaiA9IDA7IGogPCBvZmZzZXRzWzBdOyAr
K2opCgkJCQkJYXNzZXJ0KG9mZnNldHNbaiArIDFdIDwgbGF5b3V0LT5udW1CeXRlcyk7CgkJ
CX0KCQl9Cgl9CgkvKiBIZWFwICovCglhc3NlcnQoaXNXb3JkQWxpZ25lZCgodWludClzLT5m
cm9udGllcikpOwoJYXNzZXJ0KHMtPmJhc2UgPD0gcy0+ZnJvbnRpZXIpOwoJYXNzZXJ0KDAg
PT0gcy0+ZnJvbVNpemUgCgkJb3IgKHMtPmZyb250aWVyIDw9IHMtPmxpbWl0ICsgTElNSVRf
U0xPUAoJCQlhbmQgcy0+bGltaXQgPT0gcy0+YmFzZSArIHMtPmZyb21TaXplIC0gTElNSVRf
U0xPUCkpOwoJYXNzZXJ0KHMtPnRvQmFzZSA9PSBOVUxMIG9yIHMtPnRvU2l6ZSA9PSBzLT5m
cm9tU2l6ZSk7CgkvKiBDaGVjayB0aGF0IGFsbCBwb2ludGVycyBhcmUgaW50byBmcm9tIHNw
YWNlLiAqLwoJR0NfZm9yZWFjaEdsb2JhbChzLCBhc3NlcnRJc0luRnJvbVNwYWNlKTsKCUdD
X2ZvcmVhY2hQb2ludGVySW5SYW5nZShzLCBzLT5iYXNlLCAmcy0+ZnJvbnRpZXIsIGFzc2Vy
dElzSW5Gcm9tU3BhY2UpOwoJLyogQ3VycmVudCB0aHJlYWQuICovCgl7Ci8qCQl1aW50IG9m
ZnNldDsgKi8KCQlHQ19zdGFjayBzdGFjazsKCgkJc3RhY2sgPSBzLT5jdXJyZW50VGhyZWFk
LT5zdGFjazsKCQlhc3NlcnQoaXNXb3JkQWxpZ25lZChzdGFjay0+cmVzZXJ2ZWQpKTsKCQlh
c3NlcnQocy0+c3RhY2tCb3R0b20gPT0gc3RhY2tCb3R0b20oc3RhY2spKTsKCQlhc3NlcnQo
cy0+c3RhY2tUb3AgPT0gc3RhY2tUb3Aoc3RhY2spKTsKCSAJYXNzZXJ0KHMtPnN0YWNrTGlt
aXQgPT0gc3RhY2tMaW1pdChzLCBzdGFjaykpOwoJCWFzc2VydChzdGFjay0+dXNlZCA9PSBj
dXJyZW50U3RhY2tVc2VkKHMpKTsKCQlhc3NlcnQoc3RhY2stPnVzZWQgPCBzdGFjay0+cmVz
ZXJ2ZWQpOwoJIAlhc3NlcnQocy0+c3RhY2tCb3R0b20gPD0gcy0+c3RhY2tUb3ApOwovKiBD
YW4ndCB3YWxrIGRvd24gdGhlIGV4Y2VwdGlvbiBzdGFjayB0aGVzZSBkYXlzLCBiZWNhdXNl
IHRoZXJlIGlzIG5vIAogKiBndWFyYW50ZWUgdGhhdCB0aGUgaGFuZGxlciBsaW5rIGFuZCBz
bG90IGFyZSBuZXh0IHRvIGVhY2ggb3RoZXIuCiAqLwovKiAJCWZvciAob2Zmc2V0ID0gcy0+
Y3VycmVudFRocmVhZC0+ZXhuU3RhY2s7ICAqLwovKiAJCQlvZmZzZXQgIT0gQk9HVVNfRVhO
X1NUQUNLOyApIHsgKi8KLyogCQkJdW5sZXNzIChzLT5zdGFja0JvdHRvbSArIG9mZnNldCA8
PSBzLT5zdGFja1RvcCkgKi8KLyogCQkJCWZwcmludGYoc3RkZXJyLCAicy0+c3RhY2tCb3R0
b20gPSAlZCAgb2Zmc2V0ID0gJWQgcy0+c3RhY2tUb3AgPSAlZFxuIiwgKHVpbnQpKHMtPnN0
YWNrQm90dG9tKSwgb2Zmc2V0LCAodWludCkocy0+c3RhY2tUb3ApKTsgKi8KLyogCQkJYXNz
ZXJ0KHMtPnN0YWNrQm90dG9tICsgb2Zmc2V0IDw9IHMtPnN0YWNrVG9wKTsgKi8KLyogCQkJ
b2Zmc2V0ID0gKih1aW50Kikocy0+c3RhY2tCb3R0b20gKyBvZmZzZXQgKyBXT1JEX1NJWkUp
OyAqLwovKiAJCX0gKi8KCX0KCglyZXR1cm4gVFJVRTsKfQoKYm9vbApHQ19tdXRhdG9ySW52
YXJpYW50KEdDX3N0YXRlIHMpCnsKCWlmIChERUJVRykKCQlHQ19kaXNwbGF5KHMsIHN0ZGVy
cik7Cglhc3NlcnQoc3RhY2tUb3BJc09rKHMsIHMtPmN1cnJlbnRUaHJlYWQtPnN0YWNrKSk7
Cglhc3NlcnQoaW52YXJpYW50KHMpKTsKCXJldHVybiBUUlVFOwp9CiNlbmRpZiAvKiAjaWZu
ZGVmIE5PREVCVUcgKi8KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgICAgICAgICAgVGhyZWFkcyAgICAg
ICAgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgaW5saW5lIHVpbnQKdGhyZWFkQnl0ZXMo
KQp7CglyZXR1cm4gd29yZEFsaWduKEhFQURFUl9TSVpFICsgc2l6ZW9mKHN0cnVjdCBHQ190
aHJlYWQpKTsKfQoKc3RhdGljIGlubGluZSB1aW50CmluaXRpYWxUaHJlYWRCeXRlcyhHQ19z
dGF0ZSBzKQp7CglyZXR1cm4gdGhyZWFkQnl0ZXMoKSArIHN0YWNrQnl0ZXMoaW5pdGlhbFN0
YWNrU2l6ZShzKSk7Cn0KCnN0YXRpYyBpbmxpbmUgR0NfdGhyZWFkCm5ld1RocmVhZE9mU2l6
ZShHQ19zdGF0ZSBzLCB1aW50IHN0YWNrU2l6ZSkKewoJR0Nfc3RhY2sgc3RhY2s7CglHQ190
aHJlYWQgdDsKCgllbnN1cmVGcmVlKHMsIHN0YWNrQnl0ZXMoc3RhY2tTaXplKSArIHRocmVh
ZEJ5dGVzKCkpOwoJc3RhY2sgPSBuZXdTdGFjayhzLCBzdGFja1NpemUpOwoJdCA9IChHQ190
aHJlYWQpb2JqZWN0KHMsIFRIUkVBRF9IRUFERVIsIHRocmVhZEJ5dGVzKCkpOwoJdC0+ZXhu
U3RhY2sgPSBCT0dVU19FWE5fU1RBQ0s7Cgl0LT5zdGFjayA9IHN0YWNrOwoJcmV0dXJuIHQ7
Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZApzd2l0Y2hUb1RocmVhZChHQ19zdGF0ZSBzLCBHQ190
aHJlYWQgdCkKewoJcy0+Y3VycmVudFRocmVhZCA9IHQ7CglHQ19zZXRTdGFjayhzKTsKfQoK
c3RhdGljIGlubGluZSB2b2lkCmNvcHlUaHJlYWQoR0Nfc3RhdGUgcywgR0NfdGhyZWFkIGZy
b20sIHVpbnQgc2l6ZSkKewoJR0NfdGhyZWFkIHRvOwoKCS8qIG5ld1RocmVhZE9mU2l6ZSBt
YXkgZG8gYSBHQywgd2hpY2ggaW52YWxpZGF0ZXMgZnJvbS4gIAoJICogSGVuY2Ugd2UgbmVl
ZCB0byBzdGFzaCBmcm9tIHdoZXJlIHRoZSBHQyBjYW4gZmluZCBpdC4KCSAqLwoJcy0+c2F2
ZWRUaHJlYWQgPSBmcm9tOwoJdG8gPSBuZXdUaHJlYWRPZlNpemUocywgc2l6ZSk7Cglmcm9t
ID0gcy0+c2F2ZWRUaHJlYWQ7CglzdGFja0NvcHkoZnJvbS0+c3RhY2ssIHRvLT5zdGFjayk7
Cgl0by0+ZXhuU3RhY2sgPSBmcm9tLT5leG5TdGFjazsKCXMtPnNhdmVkVGhyZWFkID0gdG87
Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0gKi8KLyogICAgICAgICAgICAgICAgZnJvbVNwYWNlLCB0b1NwYWNlICAgICAgICAgICAg
ICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tICovCgpzdGF0aWMgaW5saW5lIHZvaWQgc2V0TGltaXQoR0Nfc3RhdGUgcykgewoJ
cy0+bGltaXRQbHVzU2xvcCA9IHMtPmJhc2UgKyBzLT5mcm9tU2l6ZTsKCXMtPmxpbWl0ID0g
cy0+bGltaXRQbHVzU2xvcCAtIExJTUlUX1NMT1A7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgICAg
ICAgICAgU2lnbmFscyAgICAgICAgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgaW5saW5l
IHZvaWQKYmxvY2tTaWduYWxzKEdDX3N0YXRlIHMpCnsKCXNpZ3Byb2NtYXNrKFNJR19CTE9D
SywgJnMtPnNpZ25hbHNIYW5kbGVkLCBOVUxMKTsKfQoKc3RhdGljIGlubGluZSB2b2lkCnVu
YmxvY2tTaWduYWxzKEdDX3N0YXRlIHMpCnsKCXNpZ3Byb2NtYXNrKFNJR19VTkJMT0NLLCAm
cy0+c2lnbmFsc0hhbmRsZWQsIE5VTEwpOwp9CgovKiBlbnRlciBhbmQgbGVhdmUgc2hvdWxk
IGJlIGNhbGxlZCBhdCB0aGUgc3RhcnQgYW5kIGVuZCBvZiBldmVyeSBHQyBmdW5jdGlvbgog
KiB0aGF0IGlzIGV4cG9ydGVkIHRvIHRoZSBvdXRzaWRlIHdvcmxkLiAgVGhleSBtYWtlIHN1
cmUgdGhhdCBzaWduYWxzIGFyZQogKiBibG9ja2VkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhl
IGZ1bmN0aW9uIGFuZCBjaGVjayB0aGUgR0MgaW52YXJpYW50CiAqIFRoZXkgYXJlIGEgYml0
IHRyaWNreSBiZWNhdXNlIG9mIHRoZSBjYXNlIHdoZW4gdGhlIHJ1bnRpbWUgc3lzdGVtIGlz
IGludm9rZWQKICogZnJvbSB3aXRoaW4gYW4gTUwgc2lnbmFsIGhhbmRsZXIuCiAqLwppbmxp
bmUgdm9pZApHQ19lbnRlcihHQ19zdGF0ZSBzKQp7CgkvKiB1c2VkIG5lZWRzIHRvIGJlIHNl
dCBiZWNhdXNlIHRoZSBtdXRhdG9yIGhhcyBjaGFuZ2VkIHMtPnN0YWNrVG9wLiAqLwoJcy0+
Y3VycmVudFRocmVhZC0+c3RhY2stPnVzZWQgPSBjdXJyZW50U3RhY2tVc2VkKHMpOwoJaWYg
KERFQlVHKSAKCQlHQ19kaXNwbGF5KHMsIHN0ZGVycik7Cgl1bmxlc3MgKHMtPmluU2lnbmFs
SGFuZGxlcikgewoJCWJsb2NrU2lnbmFscyhzKTsKCQlpZiAocy0+bGltaXQgPT0gMCkKCQkJ
c2V0TGltaXQocyk7Cgl9Cglhc3NlcnQoaW52YXJpYW50KHMpKTsKfQoKc3RhdGljIGlubGlu
ZSB2b2lkCmxlYXZlKEdDX3N0YXRlIHMpCnsKCWFzc2VydChHQ19tdXRhdG9ySW52YXJpYW50
KHMpKTsKCWlmIChzLT5zaWduYWxJc1BlbmRpbmcgYW5kIDAgPT0gcy0+Y2FuSGFuZGxlKQoJ
CXMtPmxpbWl0ID0gMDsKCXVubGVzcyAocy0+aW5TaWduYWxIYW5kbGVyKQoJCXVuYmxvY2tT
aWduYWxzKHMpOwp9CgppbmxpbmUgdm9pZApHQ19jb3B5Q3VycmVudFRocmVhZChHQ19zdGF0
ZSBzKQp7CglHQ190aHJlYWQgdDsKCglHQ19lbnRlcihzKTsKCXQgPSBzLT5jdXJyZW50VGhy
ZWFkOwoJY29weVRocmVhZChzLCB0LCB0LT5zdGFjay0+dXNlZCk7Cglhc3NlcnQocy0+ZnJv
bnRpZXIgPD0gcy0+bGltaXQpOwoJbGVhdmUocyk7Cn0KCnN0YXRpYyBpbmxpbmUgdWludApz
dGFja05lZWRzUmVzZXJ2ZWQoR0Nfc3RhdGUgcywgR0Nfc3RhY2sgc3RhY2spCnsKCXJldHVy
biBzdGFjay0+dXNlZCArIHN0YWNrU2xvcChzKSAtIHRvcEZyYW1lU2l6ZShzLCBzdGFjayk7
Cn0KCmlubGluZSB2b2lkCkdDX2NvcHlUaHJlYWQoR0Nfc3RhdGUgcywgR0NfdGhyZWFkIHQp
CnsKCUdDX2VudGVyIChzKTsKCWFzc2VydCAodC0+c3RhY2stPnJlc2VydmVkID09IHQtPnN0
YWNrLT51c2VkKTsKCWNvcHlUaHJlYWQgKHMsIHQsIHN0YWNrTmVlZHNSZXNlcnZlZChzLCB0
LT5zdGFjaykpOwoJYXNzZXJ0KHMtPmZyb250aWVyIDw9IHMtPmxpbWl0KTsKCWxlYXZlKHMp
Owp9CgpleHRlcm4gc3RydWN0IEdDX3N0YXRlIGdjU3RhdGU7CgppbmxpbmUgdm9pZApHQ19m
cm9tU3BhY2UoR0Nfc3RhdGUgcykKewoJcy0+YmFzZSA9IHNtbWFwKHMtPmZyb21TaXplKTsK
CWlmIChzLT5mcm9tU2l6ZSA+IHMtPm1heEhlYXBTaXplU2VlbikKCQlzLT5tYXhIZWFwU2l6
ZVNlZW4gPSBzLT5mcm9tU2l6ZTsKCXNldExpbWl0KHMpOwp9CgovKiBUaGlzIHRvZ2dsZXMg
YmFjayBhbmQgZm9ydGggYmV0d2VlbiBoaWdoIGFuZCBsb3cgYWRkcmVzc2VzIHRvIGRlY3Jl
YXNlCiAqIHRoZSBjaGFuY2Ugb2YgdmlydHVhbCBtZW1vcnkgZnJhZ21lbnRhdGlvbiBjYXVz
aW5nIGFuIG1tYXAgdG8gZmFpbC4KICogVGhpcyBpcyBpbXBvcnRhbnQgZm9yIGxhcmdlICg+
MUcpIGhlYXBzLgogKi8Kc3RhdGljIHZvaWQgKnNtbWFwX2RpZW5vdChzaXplX3QgbGVuZ3Ro
LCBpbnQgZGlyZWN0aW9uKSB7CglpbnQgaTsKCXZvaWQgKnJlc3VsdCA9ICh2b2lkKiktMTsK
Cglmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewoJCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsK
CgkJYWRkcmVzcyA9IGkqMHgwODAwMDAwMHVsOwoJCWlmIChkaXJlY3Rpb24pCgkJCWFkZHJl
c3MgPSAweGY4MDAwMDAwdWwgLSBhZGRyZXNzOwoJCXJlc3VsdCA9IG1tYXAoYWRkcmVzcyso
dm9pZCopMCwgbGVuZ3RoLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAoJCQkJTUFQX1BSSVZB
VEUgfCBNQVBfQU5PTiwgLTEsIDApOwoJICBpZiAoKHZvaWQqKS0xICE9IHJlc3VsdCkKCQli
cmVhazsKCX0KCXJldHVybiByZXN1bHQ7Cn0KCnN0YXRpYyB2b2lkIAp0b1NwYWNlIChHQ19z
dGF0ZSBzKSB7CglzdGF0aWMgaW50IGRpcmVjdGlvbiA9IDE7CglzLT50b0Jhc2UgPSBzbW1h
cF9kaWVub3Qocy0+dG9TaXplLCBkaXJlY3Rpb24pOwoJaWYgKHMtPnRvQmFzZSAhPSAodm9p
ZCopLTEpIHsKCQlkaXJlY3Rpb24gPSAoZGlyZWN0aW9uPT0wKTsKCQlpZiAocy0+dG9TaXpl
ID4gcy0+bWF4SGVhcFNpemVTZWVuKQoJCQlzLT5tYXhIZWFwU2l6ZVNlZW4gPSBzLT50b1Np
emU7Cgl9Cn0KCnZvaWQgCkdDX3RvU3BhY2UoR0Nfc3RhdGUgcykKewoJdG9TcGFjZShzKTsK
IAlpZiAocy0+dG9CYXNlID09ICh2b2lkKiktMSkgCgkJZGllZSgiT3V0IG9mIHN3YXAgc3Bh
Y2UiKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLSAqLwovKiAgICAgICAgICAgICAgICAgICAgZ2V0cnVzYWdlICAgICAgICAgICAg
ICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0gKi8KCmludApmaXhlZEdldHJ1c2FnZShpbnQgd2hvLCBzdHJ1Y3QgcnVz
YWdlICpydXApCnsKCXN0cnVjdCB0bXMJdGJ1ZmY7CglpbnQJCXJlczsKCWNsb2NrX3QJCXVz
ZXIsCgkJCXN5czsKCXN0YXRpYyBib29sCWZpcnN0ID0gVFJVRTsKCXN0YXRpYyBsb25nCWh6
OwoKCWlmIChmaXJzdCkgewoJCWZpcnN0ID0gRkFMU0U7CgkJaHogPSBzeXNjb25mKF9TQ19D
TEtfVENLKTsKCX0KCXJlcyA9IGdldHJ1c2FnZSh3aG8sIHJ1cCk7Cgl1bmxlc3MgKHJlcyA9
PSAwKQoJCXJldHVybiAocmVzKTsKCWlmICh0aW1lcygmdGJ1ZmYpID09IC0xKQoJCWRpZWUo
IkltcG9zc2libGU6IHRpbWVzKCkgZmFpbGVkIik7Cglzd2l0Y2ggKHdobykgewoJY2FzZSBS
VVNBR0VfU0VMRjoKCQl1c2VyID0gdGJ1ZmYudG1zX3V0aW1lOwoJCXN5cyA9IHRidWZmLnRt
c19zdGltZTsKCQlicmVhazsKCWNhc2UgUlVTQUdFX0NISUxEUkVOOgoJCXVzZXIgPSB0YnVm
Zi50bXNfY3V0aW1lOwoJCXN5cyA9IHRidWZmLnRtc19jc3RpbWU7CgkJYnJlYWs7CglkZWZh
dWx0OgoJCWRpZSgiZ2V0cnVzYWdlKCkgYWNjZXB0ZWQgdW5rbm93biB3aG86ICVkIiwgd2hv
KTsKCQlleGl0KDEpOyAgLyogbmVlZGVkIHRvIGtlZXAgZ2NjIGZyb20gd2hpbmluZy4gKi8K
CX0KCXJ1cC0+cnVfdXRpbWUudHZfc2VjID0gdXNlciAvIGh6OwoJcnVwLT5ydV91dGltZS50
dl91c2VjID0gKHVzZXIgJSBoeikgKiAoMTAwMDAwMCAvIGh6KTsKCXJ1cC0+cnVfc3RpbWUu
dHZfc2VjID0gc3lzIC8gaHo7CglydXAtPnJ1X3N0aW1lLnR2X3VzZWMgPSAoc3lzICUgaHop
ICogKDEwMDAwMDAgLyBoeik7CglyZXR1cm4gKDApOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQK
cnVzYWdlWmVybyhzdHJ1Y3QgcnVzYWdlICpydSkKewoJbWVtc2V0KHJ1LCAwLCBzaXplb2Yo
KnJ1KSk7Cn0KCnN0YXRpYyB2b2lkCnJ1c2FnZVBsdXNNYXgoc3RydWN0IHJ1c2FnZSAqcnUx
LAoJICAgICAgc3RydWN0IHJ1c2FnZSAqcnUyLAoJICAgICAgc3RydWN0IHJ1c2FnZSAqcnUp
CnsKCWNvbnN0IGludAltaWxsaW9uID0gMTAwMDAwMDsKCXRpbWVfdAkJc2VjLAoJCQl1c2Vj
OwoKCXNlYyA9IHJ1MS0+cnVfdXRpbWUudHZfc2VjICsgcnUyLT5ydV91dGltZS50dl9zZWM7
Cgl1c2VjID0gcnUxLT5ydV91dGltZS50dl91c2VjICsgcnUyLT5ydV91dGltZS50dl91c2Vj
OwoJc2VjICs9ICh1c2VjIC8gbWlsbGlvbik7Cgl1c2VjICU9IG1pbGxpb247CglydS0+cnVf
dXRpbWUudHZfc2VjID0gc2VjOwoJcnUtPnJ1X3V0aW1lLnR2X3VzZWMgPSB1c2VjOwoKCXNl
YyA9IHJ1MS0+cnVfc3RpbWUudHZfc2VjICsgcnUyLT5ydV9zdGltZS50dl9zZWM7Cgl1c2Vj
ID0gcnUxLT5ydV9zdGltZS50dl91c2VjICsgcnUyLT5ydV9zdGltZS50dl91c2VjOwoJc2Vj
ICs9ICh1c2VjIC8gbWlsbGlvbik7Cgl1c2VjICU9IG1pbGxpb247CglydS0+cnVfc3RpbWUu
dHZfc2VjID0gc2VjOwoJcnUtPnJ1X3N0aW1lLnR2X3VzZWMgPSB1c2VjOwoKCXJ1LT5ydV9t
YXhyc3MgPSBtYXgocnUxLT5ydV9tYXhyc3MsIHJ1Mi0+cnVfbWF4cnNzKTsKCXJ1LT5ydV9p
eHJzcyA9IG1heChydTEtPnJ1X2l4cnNzLCBydTItPnJ1X2l4cnNzKTsKCXJ1LT5ydV9pZHJz
cyA9IG1heChydTEtPnJ1X2lkcnNzLCBydTItPnJ1X2lkcnNzKTsKCXJ1LT5ydV9pc3JzcyA9
IG1heChydTEtPnJ1X2lzcnNzLCBydTItPnJ1X2lzcnNzKTsKCXJ1LT5ydV9taW5mbHQgPSBy
dTEtPnJ1X21pbmZsdCArIHJ1Mi0+cnVfbWluZmx0OwoJcnUtPnJ1X21hamZsdCA9IHJ1MS0+
cnVfbWFqZmx0ICsgcnUyLT5ydV9tYWpmbHQ7CglydS0+cnVfbnN3YXAgPSBydTEtPnJ1X25z
d2FwICsgcnUyLT5ydV9uc3dhcDsKCXJ1LT5ydV9pbmJsb2NrID0gcnUxLT5ydV9pbmJsb2Nr
ICsgcnUyLT5ydV9pbmJsb2NrOwoJcnUtPnJ1X291YmxvY2sgPSBydTEtPnJ1X291YmxvY2sg
KyBydTItPnJ1X291YmxvY2s7CglydS0+cnVfbXNnc25kID0gcnUxLT5ydV9tc2dzbmQgKyBy
dTItPnJ1X21zZ3NuZDsKCXJ1LT5ydV9tc2dyY3YgPSBydTEtPnJ1X21zZ3JjdiArIHJ1Mi0+
cnVfbXNncmN2OwoJcnUtPnJ1X25zaWduYWxzID0gcnUxLT5ydV9uc2lnbmFscyArIHJ1Mi0+
cnVfbnNpZ25hbHM7CglydS0+cnVfbnZjc3cgPSBydTEtPnJ1X252Y3N3ICsgcnUyLT5ydV9u
dmNzdzsKCXJ1LT5ydV9uaXZjc3cgPSBydTEtPnJ1X25pdmNzdyArIHJ1Mi0+cnVfbml2Y3N3
Owp9CgpzdGF0aWMgdm9pZApydXNhZ2VNaW51c01heCAoc3RydWN0IHJ1c2FnZSAqcnUxLAoJ
CXN0cnVjdCBydXNhZ2UgKnJ1MiwKCQlzdHJ1Y3QgcnVzYWdlICpydSkKewoJY29uc3QgaW50
CW1pbGxpb24gPSAxMDAwMDAwOwoJdGltZV90CQlzZWMsCgkJCXVzZWM7CgoJc2VjID0gKHJ1
MS0+cnVfdXRpbWUudHZfc2VjIC0gcnUyLT5ydV91dGltZS50dl9zZWMpIC0gMTsKCXVzZWMg
PSBydTEtPnJ1X3V0aW1lLnR2X3VzZWMgKyBtaWxsaW9uIC0gcnUyLT5ydV91dGltZS50dl91
c2VjOwoJc2VjICs9ICh1c2VjIC8gbWlsbGlvbik7Cgl1c2VjICU9IG1pbGxpb247CglydS0+
cnVfdXRpbWUudHZfc2VjID0gc2VjOwoJcnUtPnJ1X3V0aW1lLnR2X3VzZWMgPSB1c2VjOwoK
CXNlYyA9IChydTEtPnJ1X3N0aW1lLnR2X3NlYyAtIHJ1Mi0+cnVfc3RpbWUudHZfc2VjKSAt
IDE7Cgl1c2VjID0gcnUxLT5ydV9zdGltZS50dl91c2VjICsgbWlsbGlvbiAtIHJ1Mi0+cnVf
c3RpbWUudHZfdXNlYzsKCXNlYyArPSAodXNlYyAvIG1pbGxpb24pOwoJdXNlYyAlPSBtaWxs
aW9uOwoJcnUtPnJ1X3N0aW1lLnR2X3NlYyA9IHNlYzsKCXJ1LT5ydV9zdGltZS50dl91c2Vj
ID0gdXNlYzsKCglydS0+cnVfbWF4cnNzID0gbWF4KHJ1MS0+cnVfbWF4cnNzLCBydTItPnJ1
X21heHJzcyk7CglydS0+cnVfaXhyc3MgPSBtYXgocnUxLT5ydV9peHJzcywgcnUyLT5ydV9p
eHJzcyk7CglydS0+cnVfaWRyc3MgPSBtYXgocnUxLT5ydV9pZHJzcywgcnUyLT5ydV9pZHJz
cyk7CglydS0+cnVfaXNyc3MgPSBtYXgocnUxLT5ydV9pc3JzcywgcnUyLT5ydV9pc3Jzcyk7
CglydS0+cnVfbWluZmx0ID0gcnUxLT5ydV9taW5mbHQgLSBydTItPnJ1X21pbmZsdDsKCXJ1
LT5ydV9tYWpmbHQgPSBydTEtPnJ1X21hamZsdCAtIHJ1Mi0+cnVfbWFqZmx0OwoJcnUtPnJ1
X25zd2FwID0gcnUxLT5ydV9uc3dhcCAtIHJ1Mi0+cnVfbnN3YXA7CglydS0+cnVfaW5ibG9j
ayA9IHJ1MS0+cnVfaW5ibG9jayAtIHJ1Mi0+cnVfaW5ibG9jazsKCXJ1LT5ydV9vdWJsb2Nr
ID0gcnUxLT5ydV9vdWJsb2NrIC0gcnUyLT5ydV9vdWJsb2NrOwoJcnUtPnJ1X21zZ3NuZCA9
IHJ1MS0+cnVfbXNnc25kIC0gcnUyLT5ydV9tc2dzbmQ7CglydS0+cnVfbXNncmN2ID0gcnUx
LT5ydV9tc2dyY3YgLSBydTItPnJ1X21zZ3JjdjsKCXJ1LT5ydV9uc2lnbmFscyA9IHJ1MS0+
cnVfbnNpZ25hbHMgLSBydTItPnJ1X25zaWduYWxzOwoJcnUtPnJ1X252Y3N3ID0gcnUxLT5y
dV9udmNzdyAtIHJ1Mi0+cnVfbnZjc3c7CglydS0+cnVfbml2Y3N3ID0gcnUxLT5ydV9uaXZj
c3cgLSBydTItPnJ1X25pdmNzdzsKfQoKc3RhdGljIHVpbnQKcnVzYWdlVGltZShzdHJ1Y3Qg
cnVzYWdlICpydSkKewoJdWludAlyZXN1bHQ7CgoJcmVzdWx0ID0gMDsKCXJlc3VsdCArPSAx
MDAwICogcnUtPnJ1X3V0aW1lLnR2X3NlYzsKCXJlc3VsdCArPSAxMDAwICogcnUtPnJ1X3N0
aW1lLnR2X3NlYzsKCXJlc3VsdCArPSBydS0+cnVfdXRpbWUudHZfdXNlYyAvIDEwMDA7Cgly
ZXN1bHQgKz0gcnUtPnJ1X3N0aW1lLnR2X3VzZWMgLyAxMDAwOwoJcmV0dXJuIHJlc3VsdDsK
fQoKLyogUmV0dXJuIHRpbWUgYXMgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4gKi8Kc3RhdGlj
IGlubGluZSB1aW50CmN1cnJlbnRUaW1lKCkKewoJc3RydWN0IHJ1c2FnZQlydTsKCglmaXhl
ZEdldHJ1c2FnZShSVVNBR0VfU0VMRiwgJnJ1KTsKCXJldHVybiAocnVzYWdlVGltZSgmcnUp
KTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLSAqLwovKiAgICAgICAgICAgICAgICAgICBpbml0U2lnbmFsU3RhY2sgICAgICAgICAg
ICAgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0gKi8KCnN0YXRpYyBpbmxpbmUgdm9pZAppbml0U2lnbmFsU3RhY2soR0Nfc3Rh
dGUgcykKewojaWYgKGRlZmluZWQgKF9fbGludXhfXykpCiAgICAgICAgc3RhdGljIHN0YWNr
X3QgYWx0c3RhY2s7CglzaXplX3Qgc3Nfc2l6ZSA9IHJvdW5kUGFnZShzLCBTSUdTVEtTWik7
CglzaXplX3QgcHNpemUgPSBzLT5wYWdlU2l6ZTsKCXZvaWQgKnNzX3NwID0gc3NtbWFwKDIg
KiBzc19zaXplLCBwc2l6ZSwgcHNpemUpOwoJYWx0c3RhY2suc3Nfc3AgPSBzc19zcCArIHNz
X3NpemU7CglhbHRzdGFjay5zc19zaXplID0gc3Nfc2l6ZTsKCWFsdHN0YWNrLnNzX2ZsYWdz
ID0gMDsKCXNpZ2FsdHN0YWNrKCZhbHRzdGFjaywgTlVMTCk7CiNlbmRpZgp9CgovKiAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAg
ICAgICAgICAgICAgICAgSW5pdGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgKi8KLyog
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoK
Lyogc2V0IGZyb21TaXplLgogKiBzaXplIG11c3Qgbm90IGJlIGFuIGFwcHJveGltYXRpb24s
IGJlY2F1c2Ugc2V0SGVhcFBhcmFtcyB3aWxsIGRpZSBpZiBpdAogKiBjYW4ndCBzZXQgZnJv
bVNpemUgYmlnIGVub3VnaC4KICovCmlubGluZSB2b2lkCkdDX3NldEhlYXBQYXJhbXMoR0Nf
c3RhdGUgcywgdWludCBzaXplKQp7CglpZiAocy0+dXNlRml4ZWRIZWFwKSB7CgkJaWYgKDAg
PT0gcy0+ZnJvbVNpemUpCgkJCXMtPmZyb21TaXplID0gcm91bmRQYWdlKHMsIHMtPnJhbVNs
b3AgKiBzLT50b3RhbFJhbSk7CgkgICAgICAgIHMtPmZyb21TaXplID0gcm91bmRQYWdlKHMs
IHMtPmZyb21TaXplIC8gMik7Cgl9IGVsc2UgewoJCXMtPmZyb21TaXplID0gY29tcHV0ZVNl
bWlTaXplKHMsIHNpemUsIDAsIDApOwoJfQoJaWYgKHNpemUgKyBMSU1JVF9TTE9QID4gcy0+
ZnJvbVNpemUpCgkJZGllKCJPdXQgb2YgbWVtb3J5IChzZXRIZWFwUGFyYW1zKS4iKTsKfQoK
c3RhdGljIGludCBwcm9jZXNzb3JfaGFzX3NzZTI9MDsKCnN0YXRpYyB2b2lkIHJlYWRQcm9j
ZXNzb3IoKSB7CiNpZiAwCglpbnQgc3RhdHVzID0gc3lzdGVtKCIvYmluL2NhdCAvcHJvYy9j
cHVpbmZvIHwgL2Jpbi9lZ3JlcCAtcSAnXmZsYWdzLio6LiogbW14IC4qeG1tJyIpOwogIAoJ
aWYgKHN0YXR1cz09MCkKCQlwcm9jZXNzb3JfaGFzX3NzZTI9MTsKCWVsc2UKCQlwcm9jZXNz
b3JfaGFzX3NzZTI9MDsKI2VuZGlmCglwcm9jZXNzb3JfaGFzX3NzZTI9MDsKfQoKLyoKICog
U2V0IFJBTSBhbmQgU1dBUCBzaXplLiAgVmVyeSBMaW51eCBzcGVjaWZpYy4KICogTm90ZSB0
aGUgdG90YWwgYW1vdW50IG9mIFJBTSBpcyBtdWx0aXBsaWVkIGJ5IHJhbVNsb3Agc28gdGhh
dCB3ZSBkb24ndAogKiB1c2UgYWxsIG9mIG1lbW9yeSBvciBzdGFydCBzd2FwcGluZy4gIEl0
IHVzZWQgdG8gYmUgLjk1LCBidXQgTGludXgKICogMi4yIGlzIG1vcmUgYWdncmVzc2l2ZSBh
Ym91dCBzd2FwcGluZy4KICoKICogRW5zdXJlIHRoYXQgcy0+dG90YWxSYW0gKyBzLT50b3Rh
bFN3YXAgPCA0Ry4KICovCgojaWYgKGRlZmluZWQgKF9fbGludXhfXykpCiNpbmNsdWRlIDxz
eXMvc3lzaW5mby5oPgpzdGF0aWMgaW5saW5lIHZvaWQKc2V0TWVtSW5mbyhHQ19zdGF0ZSBz
KQp7CglzdHJ1Y3Qgc3lzaW5mbwlzYnVmOwoJVzMyIG1heE1lbTsKCVc2NCB0bXA7CgoJbWF4
TWVtID0gMHgxMDAwMDAwMDBsbHUgLSBzLT5wYWdlU2l6ZTsKCXVubGVzcyAoMCA9PSBzeXNp
bmZvKCZzYnVmKSkKCQlkaWVlKCJzeXNpbmZvIGZhaWxlZCIpOwoJaWYgKDAgPT0gc2J1Zi5t
ZW1fdW5pdCkKCQkvKiBPbiAyLjIga2VybmVscywgbWVtX3VuaXQgd2FzIG5vdCBkZWZpbmVk
LCBidXQgd2lsbCBiZSB6ZXJvCgkJICogc28gZ28gYWhlYWQgYW5kIHByZXRlbmQgaXQgaXMg
b25lLgoJCSAqLwoJCXNidWYubWVtX3VuaXQgPSAxOwoJdG1wID0gc2J1Zi5tZW1fdW5pdCAq
IChXNjQpc2J1Zi50b3RhbHJhbTsKCXMtPnRvdGFsUmFtID0gKHRtcCA+IChXNjQpbWF4TWVt
KSA/IG1heE1lbSA6IChXMzIpdG1wOwoJbWF4TWVtID0gbWF4TWVtIC0gcy0+dG90YWxSYW07
Cgl0bXAgPSBzYnVmLm1lbV91bml0ICogKFc2NClzYnVmLnRvdGFsc3dhcDsKCXMtPnRvdGFs
U3dhcCA9ICh0bXAgPiAoVzY0KW1heE1lbSkgPyBtYXhNZW0gOiAoVzMyKXRtcDsKfQojZWxp
ZiAoZGVmaW5lZCAoX19DWUdXSU5fXykpCiNpbmNsdWRlIDx3aW5kb3dzLmg+CnN0YXRpYyBp
bmxpbmUgdm9pZApzZXRNZW1JbmZvKEdDX3N0YXRlIHMpCnsKCU1FTU9SWVNUQVRVUyBtczsg
CgoJR2xvYmFsTWVtb3J5U3RhdHVzKCZtcyk7IAoJcy0+dG90YWxSYW0gPSBtcy5kd1RvdGFs
UGh5czsKCXMtPnRvdGFsU3dhcCA9IG1zLmR3VG90YWxQYWdlRmlsZTsKCXMtPm1heFNlbWkg
PSByb3VuZFBhZ2Uocywgcy0+cmFtU2xvcCAqIChkb3VibGUpcy0+dG90YWxSYW0gLyAyKTsK
fQojZW5kaWYKCnN0YXRpYyB2b2lkIG5ld1dvcmxkKEdDX3N0YXRlIHMpCnsKCWludCBpOwoK
CWFzc2VydChpc1dvcmRBbGlnbmVkKHNpemVvZihzdHJ1Y3QgR0NfdGhyZWFkKSkpOwoJZm9y
IChpID0gMDsgaSA8IHMtPm51bUdsb2JhbHM7ICsraSkKCQlzLT5nbG9iYWxzW2ldID0gKHBv
aW50ZXIpQk9HVVNfUE9JTlRFUjsKCUdDX3NldEhlYXBQYXJhbXMocywgcy0+Ynl0ZXNMaXZl
ICsgaW5pdGlhbFRocmVhZEJ5dGVzKHMpKTsKCWFzc2VydChzLT5ieXRlc0xpdmUgKyBpbml0
aWFsVGhyZWFkQnl0ZXMocykgKyBMSU1JVF9TTE9QIDw9IHMtPmZyb21TaXplKTsKCUdDX2Zy
b21TcGFjZShzKTsKCXMtPmZyb250aWVyID0gcy0+YmFzZTsKCXMtPnRvU2l6ZSA9IHMtPmZy
b21TaXplOwoJR0NfdG9TcGFjZShzKTsgLyogRklYTUU6IFdoeSBkb2VzIHRvU3BhY2UgbmVl
ZCB0byBiZSBhbGxvY2F0ZWQ/ICovCglzd2l0Y2hUb1RocmVhZChzLCBuZXdUaHJlYWRPZlNp
emUocywgaW5pdGlhbFN0YWNrU2l6ZShzKSkpOwoJYXNzZXJ0KGluaXRpYWxUaHJlYWRCeXRl
cyhzKSA9PSBzLT5mcm9udGllciAtIHMtPmJhc2UpOwoJYXNzZXJ0KHMtPmZyb250aWVyICsg
cy0+Ynl0ZXNMaXZlIDw9IHMtPmxpbWl0KTsKCWFzc2VydChHQ19tdXRhdG9ySW52YXJpYW50
KHMpKTsKfQoKc3RhdGljIHZvaWQgdXNhZ2Uoc3RyaW5nIHMpIHsKCWRpZSgiVXNhZ2U6ICVz
IFtATUx0b24gW2ZpeGVkLWhlYXAgblt7a3xtfV1dIFtnYy1tZXNzYWdlc10gW2djLXN1bW1h
cnldIFtsb2FkLXdvcmxkIGZpbGVdIFttYXgtaGVhcCBuW3trfG19XV0gW3JhbS1zbG9wIHhd
IC0tXSBhcmdzIiwgCgkJcyk7Cn0KCnN0YXRpYyBmbG9hdCBzdHJpbmdUb0Zsb2F0KHN0cmlu
ZyBzKSB7CglmbG9hdCBmOwoKCXNzY2FuZihzLCAiJWYiLCAmZik7CglyZXR1cm4gZjsKfQoK
c3RhdGljIHVpbnQgc3RyaW5nVG9CeXRlcyhzdHJpbmcgcykgewoJY2hhciBjOwoJdWludCBy
ZXN1bHQ7CglpbnQgaSwgbTsKCQoJcmVzdWx0ID0gMDsKCWkgPSAwOwoKCXdoaWxlICgoYyA9
IHNbaSsrXSkgIT0gJ1wwMDAnKSB7CgkJc3dpdGNoIChjKSB7CgkJY2FzZSAnbSc6CgkJCWlm
IChzW2ldID09ICdcMDAwJykgCgkJCQlyZXN1bHQgPSByZXN1bHQgKiAxMDQ4NTc2OwoJCQll
bHNlIHJldHVybiAwOwoJCQlicmVhazsKCQljYXNlICdrJzoKCQkJaWYgKHNbaV0gPT0gJ1ww
MDAnKSAKCQkJCXJlc3VsdCA9IHJlc3VsdCAqIDEwMjQ7CgkJCWVsc2UgcmV0dXJuIDA7CgkJ
CWJyZWFrOwoJCWRlZmF1bHQ6CgkJCW0gPSAoaW50KShjIC0gJzAnKTsKCQkJaWYgKDAgPD0g
bSBhbmQgbSA8PSA5KQoJCQkJcmVzdWx0ID0gcmVzdWx0ICogMTAgKyBtOwoJCQllbHNlIHJl
dHVybiAwOwoJCX0KCX0KCQoJcmV0dXJuIHJlc3VsdDsKfQoKaW50CkdDX2luaXQoR0Nfc3Rh
dGUgcywgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAoJCQl2b2lkICgqbG9hZEdsb2JhbHMpKEZJ
TEUgKmZpbGUpKSB7CgljaGFyICp3b3JsZEZpbGU7CglpbnQgaTsKCglzLT5wYWdlU2l6ZSA9
IGdldHBhZ2VzaXplKCk7Cglpbml0U2lnbmFsU3RhY2socyk7CglzLT5ieXRlc0FsbG9jYXRl
ZCA9IDA7CglzLT5ieXRlc0NvcGllZCA9IDA7CglzLT5jYW5IYW5kbGUgPSAwOwoJcy0+Y3Vy
cmVudFRocmVhZCA9IEJPR1VTX1RIUkVBRDsKCXJ1c2FnZVplcm8oJnMtPnJ1X2djKTsKCXMt
PmluU2lnbmFsSGFuZGxlciA9IEZBTFNFOwoJcy0+aXNPcmlnaW5hbCA9IFRSVUU7CglzLT5t
YXhCeXRlc0xpdmUgPSAwOwoJcy0+bWF4SGVhcFNpemUgPSAwOwoJcy0+bWF4SGVhcFNpemVT
ZWVuID0gMDsKCXMtPm1heExpdmUgPSAzOwoJcy0+bWF4UGF1c2UgPSAwOwoJcy0+bWF4U3Rh
Y2tTaXplU2VlbiA9IDA7CglzLT5tZXNzYWdlcyA9IEZBTFNFOwoJcy0+bWluTGl2ZSA9IDIw
OwoJcy0+bnVtR0NzID0gMDsKCXMtPm51bUxDcyA9IDA7CglzLT5yYW1TbG9wID0gMC44NTsK
CXMtPnNhdmVkVGhyZWFkID0gQk9HVVNfVEhSRUFEOwoJcy0+c2lnbmFsSGFuZGxlciA9IEJP
R1VTX1RIUkVBRDsKCXNpZ2VtcHR5c2V0KCZzLT5zaWduYWxzSGFuZGxlZCk7CglzLT5zaWdu
YWxJc1BlbmRpbmcgPSBGQUxTRTsKCXNpZ2VtcHR5c2V0KCZzLT5zaWduYWxzUGVuZGluZyk7
CglzLT5zdGFydFRpbWUgPSBjdXJyZW50VGltZSgpOwoJcy0+c3VtbWFyeSA9IEZBTFNFOwoJ
LyogVGhlIG5leHQgYml0IGlzIGZvciBoZWFwIHJlc2l6aW5nLiAqLwoJLyogU2V0IGxpdmVS
YXRpbyAoY2xvc2UpIHRvIHRoZSBnZW9tZXRyaWMgbWVhbiBvZiBtaW5MaXZlIGFuZCBtYXhM
aXZlLiAqLwoJeyAKCQl1aW50IGk7CgkJZm9yIChpID0gcy0+bWF4TGl2ZTsgaSAqIGkgPD0g
cy0+bWluTGl2ZSAqIHMtPm1heExpdmU7ICsraSkKCQkJLyogTm90aGluZyAqLyA7CgkJcy0+
bGl2ZVJhdGlvID0gaTsKCX0KIAlyZWFkUHJvY2Vzc29yKCk7Cgl3b3JsZEZpbGUgPSBOVUxM
OwoJaSA9IDE7CglpZiAoYXJnYyA+IDEgYW5kICgwID09IHN0cmNtcChhcmd2WzFdLCAiQE1M
dG9uIikpKSB7CgkJYm9vbCBkb25lOwoKCQkvKiBwcm9jZXNzIEBNTHRvbiBhcmdzICovCgkJ
aSA9IDI7CgkJZG9uZSA9IEZBTFNFOwoJCXdoaWxlICghZG9uZSkgewoJCQlpZiAoaSA9PSBh
cmdjKQoJCQkJdXNhZ2UoYXJndlswXSk7CgkJCWVsc2UgewoJCQkJc3RyaW5nIGFyZzsKCgkJ
CQlhcmcgPSBhcmd2W2ldOwoJCQkJaWYgKDAgPT0gc3RyY21wKGFyZywgImZpeGVkLWhlYXAi
KSkgewoJCQkJCSsraTsKCQkJCQlpZiAoaSA9PSBhcmdjKQoJCQkJCQl1c2FnZShhcmd2WzBd
KTsKCQkJCQlzLT51c2VGaXhlZEhlYXAgPSBUUlVFOwoJCQkJCXMtPmZyb21TaXplID0KCQkJ
CQkJc3RyaW5nVG9CeXRlcyhhcmd2W2krK10pOwoJCQkJfSBlbHNlIGlmICgwID09IHN0cmNt
cChhcmcsICJnYy1tZXNzYWdlcyIpKSB7CgkJCQkJKytpOwoJCQkJCXMtPm1lc3NhZ2VzID0g
VFJVRTsKCQkJCX0gZWxzZSBpZiAoMCA9PSBzdHJjbXAoYXJnLCAiZ2Mtc3VtbWFyeSIpKSB7
CgkJCQkJKytpOwoJCQkJCXMtPnN1bW1hcnkgPSBUUlVFOwoJCQkJfSBlbHNlIGlmICgwID09
IHN0cmNtcChhcmcsICJsb2FkLXdvcmxkIikpIHsKCQkJCQkrK2k7CgkJCQkJcy0+aXNPcmln
aW5hbCA9IEZBTFNFOwoJCQkJCWlmIChpID09IGFyZ2MpIAoJCQkJCQl1c2FnZShhcmd2WzBd
KTsKCQkJCQl3b3JsZEZpbGUgPSBhcmd2W2krK107CgkJCQl9IGVsc2UgaWYgKDAgPT0gc3Ry
Y21wKGFyZywgIm1heC1oZWFwIikpIHsKCQkJCQlmcHJpbnRmKHN0ZGVyciwgIm1heC1oZWFw
IGlzIGN1cnJlbnRseSBkaXNhYmxlZFxuIik7CgkJCQkJKytpOwoJCQkJCWlmIChpID09IGFy
Z2MpIAoJCQkJCQl1c2FnZShhcmd2WzBdKTsKCQkJCQlzLT51c2VGaXhlZEhlYXAgPSBGQUxT
RTsKCQkJCQlzLT5tYXhIZWFwU2l6ZSA9CgkJCQkJCXN0cmluZ1RvQnl0ZXMoYXJndltpKytd
KTsKCQkJCX0gZWxzZSBpZiAoMCA9PSBzdHJjbXAoYXJnLCAicmFtLXNsb3AiKSkgewoJCQkJ
CSsraTsKCQkJCQlpZiAoaSA9PSBhcmdjKQoJCQkJCQl1c2FnZShhcmd2WzBdKTsKCQkJCQlz
LT5yYW1TbG9wID0KCQkJCQkJc3RyaW5nVG9GbG9hdChhcmd2W2krK10pOwoJCQkJfSBlbHNl
IGlmICgwID09IHN0cmNtcChhcmcsICItLSIpKSB7CgkJCQkJKytpOwoJCQkJCWRvbmUgPSBU
UlVFOwoJCQkJfSBlbHNlIGlmIChpID4gMSkKCQkJCQl1c2FnZShhcmd2WzBdKTsKCQkJICAg
ICAgICBlbHNlIGRvbmUgPSBUUlVFOwoJCQl9CgkJfQoJfQoJc2V0TWVtSW5mbyhzKTsKCXMt
Pm1heFNlbWkgPSByb3VuZFBhZ2Uocywgcy0+cmFtU2xvcCAqIChkb3VibGUpcy0+dG90YWxS
YW0gLyAyKTsKCWlmIChERUJVRykKCQlmcHJpbnRmKHN0ZGVyciwgInRvdGFsUmFtID0gJXUg
IHRvdGFsU3dhcCA9ICV1ICBtYXhTZW1pID0gJXVcbiIsCgkJCXMtPnRvdGFsUmFtLCBzLT50
b3RhbFN3YXAsIHMtPm1heFNlbWkpOwoJaWYgKHMtPmlzT3JpZ2luYWwpCgkJbmV3V29ybGQo
cyk7CgllbHNlCgkJR0NfbG9hZFdvcmxkKHMsIHdvcmxkRmlsZSwgbG9hZEdsb2JhbHMpOwoJ
cmV0dXJuIGk7Cn0KCiNpZiBNRVRFUgppbnQgc2l6ZXNbMjU2MDBdOwojZW5kaWYKCi8qIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyog
ICAgICAgICAgICAgICAgICAgICAgZm9yd2FyZCAgICAgICAgICAgICAgICAgICAgICAqLwov
KiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICov
Ci8qCiAqIEZvcndhcmQgdGhlIG9iamVjdCBwb2ludGVkIHRvIGJ5ICpwcC4KICogVXBkYXRl
ICpwcCB0byBwb2ludCB0byB0aGUgbmV3IG9iamVjdC4gCiAqLwpzdGF0aWMgaW5saW5lIHZv
aWQKZm9yd2FyZChHQ19zdGF0ZSBzLCBwb2ludGVyICpwcCkKewoJcG9pbnRlciBwOwoJd29y
ZCBoZWFkZXI7Cgl3b3JkIHRhZzsKCglpZiAoREVCVUdfREVUQUlMRUQpCgkJZnByaW50Zihz
dGRlcnIsICJmb3J3YXJkICBwcCA9IDB4JXggICpwcCA9IDB4JXhcbiIsICh1aW50KXBwLCAo
dWludCkqcHApOwoJYXNzZXJ0KGlzSW5Gcm9tU3BhY2UocywgKnBwKSk7CglwID0gKnBwOwoJ
aGVhZGVyID0gR0NfZ2V0SGVhZGVyKHApOwoJaWYgKGhlYWRlciAhPSBGT1JXQVJERUQpIHsg
LyogZm9yd2FyZCB0aGUgb2JqZWN0ICovCgkJdWludCBoZWFkZXJCeXRlcywgb2JqZWN0Qnl0
ZXMsIHNpemUsIHNraXA7CgkJdWludCBudW1Qb2ludGVycywgbnVtTm9uUG9pbnRlcnM7CgoJ
CS8qIENvbXB1dGUgdGhlIHNwYWNlIHRha2VuIGJ5IHRoZSBoZWFkZXIgYW5kIG9iamVjdCBi
b2R5LiAqLwoJCVNQTElUX0hFQURFUigpOwoJCWlmIChOT1JNQUxfVEFHID09IHRhZykgeyAv
KiBGaXhlZCBzaXplIG9iamVjdC4gKi8KCQkJaGVhZGVyQnl0ZXMgPSBHQ19PQkpFQ1RfSEVB
REVSX1NJWkU7CgkJCW9iamVjdEJ5dGVzID0gdG9CeXRlcyhudW1Qb2ludGVycyArIG51bU5v
blBvaW50ZXJzKTsKCQkJc2tpcCA9IDA7CgkJfSBlbHNlIGlmIChTVEFDS19UQUcgPT0gdGFn
KSB7IC8qIFN0YWNrLiAqLwoJCQlHQ19zdGFjayBzdGFjazsKCgkJCWhlYWRlckJ5dGVzID0g
U1RBQ0tfSEVBREVSX1NJWkU7CgkJCS8qIFJlc2l6ZSBzdGFja3Mgbm90IGJlaW5nIHVzZWQg
YXMgY29udGludWF0aW9ucy4gKi8KCQkJc3RhY2sgPSAoR0Nfc3RhY2spcDsKCQkJaWYgKHN0
YWNrLT51c2VkICE9IHN0YWNrLT5yZXNlcnZlZCkgewoJCQkJaWYgKDQgKiBzdGFjay0+dXNl
ZCA8PSBzdGFjay0+cmVzZXJ2ZWQpCgkJCQkJc3RhY2stPnJlc2VydmVkID0gc3RhY2stPnJl
c2VydmVkIC8gMjsKCQkJCWVsc2UgaWYgKDQgKiBzdGFjay0+dXNlZCA+IDMgKiBzdGFjay0+
cmVzZXJ2ZWQpCgkJCQkJc3RhY2stPnJlc2VydmVkID0gc3RhY2stPnJlc2VydmVkICogMjsK
CQkJCXN0YWNrLT5yZXNlcnZlZCA9IAoJCQkJCXdvcmRBbGlnbihtYXgoc3RhY2stPnJlc2Vy
dmVkLCAKCQkJCQkJCXN0YWNrTmVlZHNSZXNlcnZlZChzLCBzdGFjaykpKTsKCQkJCWlmIChz
dGFjay0+cmVzZXJ2ZWQgPiBzLT5tYXhTdGFja1NpemVTZWVuKQoJCQkJCXMtPm1heFN0YWNr
U2l6ZVNlZW4gPSBzdGFjay0+cmVzZXJ2ZWQ7CgkJCQlhc3NlcnQoc3RhY2tUb3BJc09rKHMs
IHN0YWNrKSk7CgkJCX0KCQkJb2JqZWN0Qnl0ZXMgPSBzaXplb2YgKHN0cnVjdCBHQ19zdGFj
aykgKyBzdGFjay0+dXNlZDsKCQkJc2tpcCA9IHN0YWNrLT5yZXNlcnZlZCAtIHN0YWNrLT51
c2VkOwoJCX0gZWxzZSB7IC8qIEFycmF5LiAqLwoJCQlhc3NlcnQoQVJSQVlfVEFHID09IHRh
Zyk7CgkJCWhlYWRlckJ5dGVzID0gR0NfQVJSQVlfSEVBREVSX1NJWkU7CgkJCW9iamVjdEJ5
dGVzID0gYXJyYXlOdW1CeXRlcyhwLCBudW1Qb2ludGVycywKCQkJCQkJCQludW1Ob25Qb2lu
dGVycyk7CgkJCXNraXAgPSAwOwoJCQkvKiBFbXB0eSBhcnJheXMgaGF2ZSBQT0lOVEVSX1NJ
WkUgYnl0ZXMgZm9yIHRoZSAKCQkJICogZm9yd2FyZGluZyBwb2ludGVyLgoJCQkgKi8KCQkJ
aWYgKDAgPT0gb2JqZWN0Qnl0ZXMpIG9iamVjdEJ5dGVzID0gUE9JTlRFUl9TSVpFOwoJCX0g
CgkJc2l6ZSA9IGhlYWRlckJ5dGVzICsgb2JqZWN0Qnl0ZXM7CgkJLyogVGhpcyBjaGVjayBp
cyBuZWNlc3NhcnksIGJlY2F1c2UgdG9TcGFjZSBtYXkgYmUgc21hbGxlcgoJCSAqIHRoYW4g
ZnJvbVNwYWNlLCBhbmQgc28gdGhlIGNvcHkgbWF5IGZhaWwuCgkJICovCiAgCQlpZiAocy0+
YmFjayArIHNpemUgKyBza2lwID4gcy0+dG9MaW1pdCkKCQkJZGllKCJPdXQgb2YgbWVtb3J5
IChmb3J3YXJkKS5cbnNpemU9JXUgc2tpcD0ldSByZW1haW5pbmc9JXUgcy0+ZnJvbVNpemU9
JXUgcy0+dG9TaXplPSV1IGhlYWRlckJ5dGVzPSVkIG9iamVjdEJ5dGVzPSV1IGhlYWRlcj0l
eFxuRGlhZ25vc3RpYzogcHJvYmFibHkgYSBSQU0gcHJvYmxlbS4iLAoJCQkJc2l6ZSwgc2tp
cCwgcy0+dG9MaW1pdCAtIHMtPmJhY2ssIHMtPmZyb21TaXplLCBzLT50b1NpemUsIGhlYWRl
ckJ5dGVzLCBvYmplY3RCeXRlcywgaGVhZGVyKTsKICAJCS8qIENvcHkgdGhlIG9iamVjdC4g
Ki8KIAkJaWYgKEZBTFNFIGFuZCBwcm9jZXNzb3JfaGFzX3NzZTIgYW5kIHNpemUgPj0gODE5
MikgewoJCQlleHRlcm4gdm9pZCBiY29weV9zaW1kKHZvaWQgKiwgdm9pZCBjb25zdCAqLCBp
bnQpOwoJCQliY29weV9zaW1kKHAgLSBoZWFkZXJCeXRlcywgcy0+YmFjaywgc2l6ZSk7CiAJ
CX0gZWxzZSB7CgkJCXVpbnQJKnRvLAoJCQkJKmZyb20sCgkJCQkqbGltaXQ7CgoJCQl0byA9
ICh1aW50ICopcy0+YmFjazsKCQkJZnJvbSA9ICh1aW50ICopKHAgLSBoZWFkZXJCeXRlcyk7
CgkJCWFzc2VydCAoaXNXb3JkQWxpZ25lZCgodWludCl0bykpOwoJCQlhc3NlcnQgKGlzV29y
ZEFsaWduZWQoKHVpbnQpZnJvbSkpOwoJCQlhc3NlcnQgKGlzV29yZEFsaWduZWQoc2l6ZSkp
OwoJCQlsaW1pdCA9ICh1aW50ICopKChjaGFyICopZnJvbSArIHNpemUpOwoJCQl1bnRpbCAo
ZnJvbSA9PSBsaW1pdCkKCQkJCSp0bysrID0gKmZyb20rKzsKCQl9CiNpZiBNRVRFUgoJCWlm
IChzaXplIDwgc2l6ZW9mKHNpemVzKS9zaXplb2Yoc2l6ZXNbMF0pKSBzaXplc1tzaXplXSsr
OwojZW5kaWYKIAkJLyogU3RvcmUgdGhlIGZvcndhcmRpbmcgcG9pbnRlciBpbiB0aGUgb2xk
IG9iamVjdC4gKi8KCQkqKHdvcmQqKShwIC0gV09SRF9TSVpFKSA9IEZPUldBUkRFRDsKCQkq
KHBvaW50ZXIqKXAgPSBzLT5iYWNrICsgaGVhZGVyQnl0ZXM7CgkJLyogVXBkYXRlIHRoZSBi
YWNrIG9mIHRoZSBxdWV1ZS4gKi8KCQlzLT5iYWNrICs9IHNpemUgKyBza2lwOwoJCWFzc2Vy
dChpc1dvcmRBbGlnbmVkKCh1aW50KXMtPmJhY2spKTsKCX0KCSpwcCA9ICoocG9pbnRlciop
cDsKCWFzc2VydChpc0luVG9TcGFjZShzLCAqcHApKTsKfQoKc3RhdGljIGlubGluZSB2b2lk
IGZvcndhcmRFYWNoUG9pbnRlckluUmFuZ2UoR0Nfc3RhdGUgcywgcG9pbnRlciBmcm9udCwK
CQkJCQkJcG9pbnRlciAqYmFjaykgewoJcG9pbnRlciBiOwoKCWIgPSAqYmFjazsKCWFzc2Vy
dChmcm9udCA8PSBiKTsKCXdoaWxlIChmcm9udCA8IGIpIHsKCQl3aGlsZSAoZnJvbnQgPCBi
KSB7CgkJCWFzc2VydChpc1dvcmRBbGlnbmVkKCh1aW50KWZyb250KSk7CgkJCWZyb250ID0g
R0NfZm9yZWFjaFBvaW50ZXJJbk9iamVjdChzLCBmb3J3YXJkLCB0b0RhdGEoZnJvbnQpKTsK
CQl9CgkJYiA9ICpiYWNrOwoJfQoJYXNzZXJ0KGZyb250ID09ICpiYWNrKTsKfQoKLyogLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAg
ICAgICAgICAgICAgICAgICAgICAgZG9HQyAgICAgICAgICAgICAgICAgICAgICAgICovCi8q
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8K
CnZvaWQgR0NfZG9HQyhHQ19zdGF0ZSBzLCB1aW50IGJ5dGVzUmVxdWVzdGVkLCB1aW50IHN0
YWNrQnl0ZXNSZXF1ZXN0ZWQpIHsKCXVpbnQgZ2NUaW1lOwoJdWludCBzaXplOwoJVzY0IGxp
dmU7Cgl1aW50IG5lZWRlZDsKCWludCB0cnk7Cglwb2ludGVyIGZyb250OwoJc3RydWN0IHJ1
c2FnZSBydV9zdGFydCwgcnVfZmluaXNoLCBydV90b3RhbDsKCglhc3NlcnQoaW52YXJpYW50
KHMpKTsKCWlmIChERUJVRyBvciBzLT5tZXNzYWdlcykKCQlmcHJpbnRmKHN0ZGVyciwgIlN0
YXJ0aW5nIGdjLiAgYnl0ZXNSZXF1ZXN0ZWQgPSAldVxuIiwKCQkJCWJ5dGVzUmVxdWVzdGVk
KTsKCWZpeGVkR2V0cnVzYWdlKFJVU0FHRV9TRUxGLCAmcnVfc3RhcnQpOwoJbGl2ZSA9IChX
NjQpcy0+Ynl0ZXNMaXZlICsgKFc2NClieXRlc1JlcXVlc3RlZCAKCQkrIChXNjQpc3RhY2tC
eXRlc1JlcXVlc3RlZDsKCXVubGVzcyAocy0+dXNlRml4ZWRIZWFwKSB7IC8qIEdldCB0b1Nw
YWNlIHJlYWR5LiAqLwoJCXRyeSA9IDA7CglyZXRyeToKCQluZWVkZWQgPSBjb21wdXRlU2Vt
aVNpemUgKHMsIGxpdmUsIHMtPmZyb21TaXplLCB0cnkpOwoJCS8qIFdlIHdvdWxkIGxpa2Ug
dG9TcGFjZSB0byBiZSBhcyBiaWcgYXMgZnJvbVNwYWNlLiBBbHRob3VnaCwKCQkgKiBpZiB3
ZSBhcmUgYmFja2luZyBvZmYgKHRyeSA+IDEpIHRoZW4gd2Ugd2lsbCBub3QgaW5zaXN0IG9u
CiAgICAgICAgICAgICAgICAgKiB0aGlzLgogICAgICAgICAgICAgICAgICovCgkJaWYgKG5l
ZWRlZCA8IHMtPmZyb21TaXplIGFuZCB0cnkgPD0gMSkKCQkJbmVlZGVkID0gcy0+ZnJvbVNp
emU7CgkJLyogTWFzc2FnZSB0b1NwYWNlIHNvIHRoYXQgaXQgaXMgb2YgbmVlZGVkIHNpemUu
ICovCgkJaWYgKHMtPnRvQmFzZSAhPSBOVUxMKSB7CgkJCWlmIChzLT50b1NpemUgPCBuZWVk
ZWQpIHsKCQkJCWlmIChERUJVRyBvciBzLT5tZXNzYWdlcykKCQkJCQlmcHJpbnRmKHN0ZGVy
ciwgIlVubWFwcGluZyB0b1NwYWNlXG4iKTsKCQkJCXNtdW5tYXAocy0+dG9CYXNlLCBzLT50
b1NpemUpOwoJCQkJcy0+dG9CYXNlID0gTlVMTDsKCQkJIH0gZWxzZSBpZiAocy0+dG9TaXpl
ID4gbmVlZGVkKSB7CgkJCQl1aW50IGRlbGV0ZTsKCgkJCQlkZWxldGUgPSBzLT50b1NpemUg
LSBuZWVkZWQ7CgkJCQlpZiAoREVCVUcgb3Igcy0+bWVzc2FnZXMpCgkJCQkJZnByaW50Zihz
dGRlcnIsICJTaHJpbmtpbmcgdG9TcGFjZSBieSAldVxuIiwKCQkJCQkJIGRlbGV0ZSk7CgkJ
CQlzbXVubWFwKHMtPnRvQmFzZSArIG5lZWRlZCwgZGVsZXRlKTsKCQkJIH0KCQl9CgkJcy0+
dG9TaXplID0gbmVlZGVkOwoJCWlmICgodm9pZCopTlVMTCA9PSBzLT50b0Jhc2UpIHsKCQkJ
dG9TcGFjZShzKTsKCQkJaWYgKCh2b2lkKiktMSA9PSBzLT50b0Jhc2UpIHsKCQkJCXMtPnRv
QmFzZSA9ICh2b2lkKilOVUxMOwoJCQkJdHJ5Kys7CgkJCQlpZiAoMTMgPT0gdHJ5KSB7CgkJ
CQkJc3RhdGljIGNoYXIgYnVmZmVyWzI1Nl07CgojaWYgKGRlZmluZWQgKF9fbGludXhfXykp
CgkJCQkJc3ByaW50ZihidWZmZXIsIAoJCQkJCQkiL2Jpbi9jYXQgL3Byb2MvJWQvbWFwc1xu
IiwgCgkJCQkJCWdldHBpZCgpKTsKCQkJCQkodm9pZClzeXN0ZW0oYnVmZmVyKTsKI2VuZGlm
CgkJCQkJZGllKCJPdXQgb2Ygc3dhcCBzcGFjZTogY2Fubm90IG9idGFpbiAldSBieXRlcy4i
LCBzLT50b1NpemUpOwoJCQkJfQoJCQkJZ290byByZXRyeTsKCQkJfQoJCX0KCX0KCS8qIHRv
U3BhY2UgaXMgcmVhZHkuICAqLwoJYXNzZXJ0KHMtPnRvQmFzZSAhPSAodm9pZCopTlVMTCk7
CiAJaWYgKERFQlVHIG9yIHMtPm1lc3NhZ2VzKSB7CgkJZnByaW50ZihzdGRlcnIsICJmcm9t
U3BhY2UgPSAleCAgdG9TcGFjZSA9ICV4XG4iLAoJCQkodWludClzLT5iYXNlLCAodWludClz
LT50b0Jhc2UpOwoJIAlmcHJpbnRmKHN0ZGVyciwgCgkJCSJmcm9tU3BhY2Ugc2l6ZSA9ICVz
IiwgdWludFRvQ29tbWFTdHJpbmcocy0+ZnJvbVNpemUpKTsKCQlmcHJpbnRmKHN0ZGVyciwg
CgkJCSIgIHRvU3BhY2UgJXNcbiIsIHVpbnRUb0NvbW1hU3RyaW5nKHMtPnRvU2l6ZSkpOwoJ
fQogCXMtPm51bUdDcysrOwogCXMtPmJ5dGVzQWxsb2NhdGVkICs9IHMtPmZyb250aWVyIC0g
cy0+YmFzZSAtIHMtPmJ5dGVzTGl2ZTsKCXMtPmJhY2sgPSBzLT50b0Jhc2U7CglzLT50b0xp
bWl0ID0gcy0+dG9CYXNlICsgcy0+dG9TaXplOwoJLyogVGhlIGFjdHVhbCBHQy4gKi8KCWZy
b250ID0gcy0+YmFjazsKCUdDX2ZvcmVhY2hHbG9iYWwocywgZm9yd2FyZCk7Cglmb3J3YXJk
RWFjaFBvaW50ZXJJblJhbmdlKHMsIGZyb250LCAmcy0+YmFjayk7CglzaXplID0gcy0+ZnJv
bVNpemU7CgkvKiBTd2FwIGZyb21TcGFjZSBhbmQgdG9TcGFjZS4gKi8KCXsKCQlwb2ludGVy
IHRtcDsKCQl0bXAgPSBzLT5iYXNlOwoJCXMtPmJhc2UgPSBzLT50b0Jhc2U7CgkJcy0+dG9C
YXNlID0gdG1wOwoJfQoJewoJCXVpbnQgdG1wOwoJCXRtcCA9IHMtPmZyb21TaXplOwoJCXMt
PmZyb21TaXplID0gcy0+dG9TaXplOwoJCXMtPnRvU2l6ZSA9IHRtcDsKCX0KCUdDX3NldFN0
YWNrKHMpOwoJcy0+ZnJvbnRpZXIgPSBzLT5iYWNrOwoJcy0+Ynl0ZXNMaXZlID0gcy0+ZnJv
bnRpZXIgLSBzLT5iYXNlOwoJaWYgKHMtPmJ5dGVzTGl2ZSA+IHMtPm1heEJ5dGVzTGl2ZSkK
CQlzLT5tYXhCeXRlc0xpdmUgPSBzLT5ieXRlc0xpdmU7CgkvKiBSZXNpemUgaGVhcCwgaWYg
bmVjZXNzYXJ5LiAqLwoJdW5sZXNzIChzLT51c2VGaXhlZEhlYXApIHsKCQlXNjQgbmVlZGVk
OwoJCXVpbnQga2VlcDsKCgkJbmVlZGVkID0gKFc2NClzLT5ieXRlc0xpdmUgKyBieXRlc1Jl
cXVlc3RlZDsKCQkvKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgbmV3IHNwYWNlIChub3cgZnJv
bVNwYWNlKS4gKi8KCQlpZiAobmVlZGVkICogcy0+bWluTGl2ZSA8IChXNjQpcy0+ZnJvbVNp
emUpIHsKCQkJLyogVGhlIHJhdGlvIG9mIGxpdmUgZGF0YSB0byBzZW1pc3BhY2Ugc2l6ZSBp
cyB0b28gbG93LAoJCQkgKiBzbyBzaHJpbmsgbmV3IHNwYWNlLgoJCQkgKi8KCQkJa2VlcCA9
IHJvdW5kUGFnZShzLCBuZWVkZWQgKiBzLT5saXZlUmF0aW8pOwoJCX0gZWxzZSBpZiAocy0+
ZnJvbVNpemUgPiBzLT5tYXhTZW1pKSB7CgkJCWlmICgyICogbmVlZGVkIDw9IChXNjQpcy0+
bWF4U2VtaSkgewoJCQkJLyogVGhlIGxpdmUgZGF0YSBmaXRzIGluIGEgc2VtaXNwYWNlIHRo
YXQgaXMgaGFsZgoJCQkJICogb2YgdGhlIFJBTSBzaXplLCB3aXRoIGEgZmFjdG9yIG9mIHR3
byB0byAKCQkJCSAqIHNwYXJlLCBzbyBzaHJpbmsgZG93biB0byBtYXhTZW1pLgogCQkJCSAq
LwoJCQkJa2VlcCA9IHMtPm1heFNlbWk7CgkJCX0gZWxzZSB7CgkJCQkvKiBOZWVkZWQgaXMg
bGFyZ2UuICBBbGxvY2F0ZSBhIGZhY3RvciBvZiB0d28KCQkJCSAqIHByb3ZpZGVkIHRoYXQg
dGhlIHNlbWlzcGFjZSB3aWxsIHN0aWxsIGZpdAoJCQkJICogaW4gUkFNLgogCQkJCSAqLwoJ
CQkJZG91YmxlIG11bHQ7CgoJCQkJbXVsdCA9ICgyICogbmVlZGVkID4gcy0+cmFtU2xvcCAq
IHMtPnRvdGFsUmFtKQoJCQkJCT8gMS4yNSA6IDIuMDsKCQkJCWtlZXAgPSBtaW4ocy0+ZnJv
bVNpemUsCgkJCQkJcm91bmRQYWdlKHMsIChzaXplX3QpbmVlZGVkICogbXVsdCkpOwoJCQl9
CgkJfSBlbHNlCgkJCS8qIFRoZSBoZWFwIGlzIGFib3V0IHJpZ2h0IC0tIGxlYXZlIG5ldyBz
cGFjZSBhbG9uZS4gKi8KCQkJa2VlcCA9IHMtPmZyb21TaXplOwoJCWFzc2VydCAoa2VlcCA8
PSBzLT5mcm9tU2l6ZSk7CgkJaWYgKGtlZXAgPCBzLT5mcm9tU2l6ZSkgewoJCQlpZiAoREVC
VUcgb3Igcy0+bWVzc2FnZXMpCgkJCQlmcHJpbnRmKHN0ZGVyciwgCgkJCQkJIlNocmlua2lu
ZyBuZXcgc3BhY2UgYXQgJXggdG8gJXUgYnl0ZXMuXG4iLAoJCQkJCSh1aW50KXMtPmJhc2Ug
LCBrZWVwKTsKCQkJYXNzZXJ0KGtlZXAgPD0gcy0+ZnJvbVNpemUpOwoJCQlzbXVubWFwKHMt
PmJhc2UgKyBrZWVwLCBzLT5mcm9tU2l6ZSAtIGtlZXApOwoJCQlzLT5mcm9tU2l6ZSA9IGtl
ZXA7CgkJfQoJCS8qIERldGVybWluZSB0aGUgc2l6ZSBvZiBvbGQgc3BhY2UsIGFuZCBwb3Nz
aWJseSB1bm1hcCBpdC4gKi8KCQlpZiAocy0+dG9TaXplIDwgcy0+ZnJvbVNpemUpCgkJCS8q
IHRvU3BhY2UgaXMgc21hbGxlciB0aGFuIGZyb21TcGFjZSwgc28gd2Ugd29uJ3QgYmUKCQkJ
ICogYWJsZSB0byB1c2UgaXQgZm9yIHRoZSBuZXh0IEdDIGFueXdheXMuCgkJCSAqLwoJCQlr
ZWVwID0gMDsKCQllbHNlIGlmIChzLT5mcm9tU2l6ZSA+IHMtPm1heFNlbWkpCgkJCS8qIEhv
bGRpbmcgb24gdG8gdG9TcGFjZSBtYXkgY2F1c2Ugc3dhcHBpbmcuICovCgkJCWtlZXAgPSAw
OwoJCWVsc2UgaWYgKHMtPmZyb21TaXplID09IHMtPm1heFNlbWkpCgkJCS8qIFdlIGZpdCBp
biBtZW1vcnksIHNvIGtlZXAgc3BhY2VzIGF0IHMtPm1heFNlbWkuICovCgkJCWtlZXAgPSBz
LT5mcm9tU2l6ZTsKCSAgICAgICAgLyogcy0+ZnJvbVNpemUgPD0gcy0+dG9TaXplIGFuZCBz
LT5mcm9tU2l6ZSA8IHMtPm1heFNlbWkgKi8KCQllbHNlIGlmIChuZWVkZWQgKiBzLT5tYXhM
aXZlID4gKFc2NClzLT50b1NpemUpCgkJCS8qIHRvU3BhY2UgaXMgdG9vIHNtYWxsICovCgkJ
CWtlZXAgPSAwOwoJCWVsc2UKIAkJCS8qIHRvU3BhY2UgaXMgYWJvdXQgcmlnaHQsIHNvIG1h
a2UgaXQgdGhlIHNhbWUgc2l6ZSBhcwoJCQkgKiBmcm9tU3BhY2UuCgkJCSAqLwoJCQlrZWVw
ID0gcy0+ZnJvbVNpemU7CgkJYXNzZXJ0IChrZWVwIDw9IHMtPnRvU2l6ZSk7CgkJaWYgKGtl
ZXAgPCBzLT50b1NpemUpIHsKCQkJaWYgKERFQlVHIG9yIHMtPm1lc3NhZ2VzKQoJCQkJZnBy
aW50ZihzdGRlcnIsIAoJCQkJCSJTaHJpbmtpbmcgb2xkIHNwYWNlIGF0ICV4IHRvICV1IGJ5
dGVzLlxuIiwKCQkJCQkodWludClzLT50b0Jhc2UgLCBrZWVwKTsKCQkJYXNzZXJ0KGtlZXAg
PD0gcy0+dG9TaXplKTsKCQkJc211bm1hcChzLT50b0Jhc2UgKyBrZWVwLCBzLT50b1NpemUg
LSBrZWVwKTsKCQkJcy0+dG9TaXplID0ga2VlcDsKCQkJaWYgKDAgPT0ga2VlcCkKCQkJCXMt
PnRvQmFzZSA9IE5VTEw7CgkJfQoJfQoJc2V0TGltaXQocyk7CglzLT5ieXRlc0NvcGllZCAr
PSBzLT5ieXRlc0xpdmU7CglmaXhlZEdldHJ1c2FnZShSVVNBR0VfU0VMRiwgJnJ1X2Zpbmlz
aCk7CglydXNhZ2VNaW51c01heCgmcnVfZmluaXNoLCAmcnVfc3RhcnQsICZydV90b3RhbCk7
CglydXNhZ2VQbHVzTWF4KCZzLT5ydV9nYywgJnJ1X3RvdGFsLCAmcy0+cnVfZ2MpOwoJZ2NU
aW1lID0gcnVzYWdlVGltZSgmcnVfdG90YWwpOwoJcy0+bWF4UGF1c2UgPSBtYXgocy0+bWF4
UGF1c2UsIGdjVGltZSk7CglpZiAoREVCVUcgb3Igcy0+bWVzc2FnZXMpIHsKCQlmcHJpbnRm
KHN0ZGVyciwgIkZpbmlzaGVkIGdjLlxuIik7CgkJZnByaW50ZihzdGRlcnIsICJ0aW1lKG1z
KTogJXNcbiIsIGludFRvQ29tbWFTdHJpbmcoZ2NUaW1lKSk7CgkJZnByaW50ZihzdGRlcnIs
ICJsaXZlKGJ5dGVzKTogJXMgKCUuMWYlJSlcbiIsIAoJCQlpbnRUb0NvbW1hU3RyaW5nKHMt
PmJ5dGVzTGl2ZSksCgkJCTEwMC4wICogKChkb3VibGUpIHMtPmJ5dGVzTGl2ZSkgLyBzaXpl
KTsKCX0KCXVubGVzcyAoYnl0ZXNSZXF1ZXN0ZWQgPD0gcy0+bGltaXQgLSBzLT5mcm9udGll
cikgewoJCWlmIChzLT51c2VGaXhlZEhlYXApIHsKCQkJZGllKCJPdXQgb2YgbWVtb3J5IChk
b0dDKS4iKTsKCQl9IAoJCWlmIChERUJVRykKCQkJZnByaW50ZihzdGRlcnIsICJSZWN1cnNp
dmUgY2FsbCB0byBkb0dDLlxuIik7CgkJR0NfZG9HQyhzLCBieXRlc1JlcXVlc3RlZCwgMCk7
Cgl9Cglhc3NlcnQoYnl0ZXNSZXF1ZXN0ZWQgPD0gcy0+bGltaXQgLSBzLT5mcm9udGllcik7
CglpZiAoREVCVUcpIAoJCUdDX2Rpc3BsYXkocywgc3RkZXJyKTsKCWFzc2VydChpbnZhcmlh
bnQocykpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tICovCi8qICAgICAgICAgICAgICAgICAgICAgICBHQ19nYyAgICAgICAgICAg
ICAgICAgICAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLSAqLwoKdm9pZCBHQ19nYyhHQ19zdGF0ZSBzLCB1aW50IGJ5dGVzUmVx
dWVzdGVkLCBib29sIGZvcmNlLAoJCXN0cmluZyBmaWxlLCBpbnQgbGluZSkgewoJcy0+Y3Vy
cmVudFRocmVhZC0+Ynl0ZXNOZWVkZWQgPSBieXRlc1JlcXVlc3RlZDsKCWRvIHsKCXVpbnQg
c3RhY2tCeXRlc1JlcXVlc3RlZDsKCUdDX2VudGVyKHMpOwoJaWYgKERFQlVHKSB7CgkJZnBy
aW50ZiAoc3RkZXJyLCAiJXMgJWQ6ICIsIGZpbGUsIGxpbmUpOwoJCUdDX2Rpc3BsYXkocywg
c3RkZXJyKTsKCX0KCXN0YWNrQnl0ZXNSZXF1ZXN0ZWQgPQoJCShzdGFja1RvcElzT2socywg
cy0+Y3VycmVudFRocmVhZC0+c3RhY2spKQoJCT8gMCAKCQk6IHN0YWNrQnl0ZXMoMiAqIHMt
PmN1cnJlbnRUaHJlYWQtPnN0YWNrLT5yZXNlcnZlZCk7CglpZiAoREVCVUcpCgkJZnByaW50
ZihzdGRlcnIsICJieXRlc1JlcXVlc3RlZCA9ICV1ICBzdGFja0J5dGVzUmVxdWVzdGVkID0g
JXVcbiIsCgkJCQlieXRlc1JlcXVlc3RlZCwgc3RhY2tCeXRlc1JlcXVlc3RlZCk7CglpZiAo
Zm9yY2Ugb3IKCQkoVzY0KShXMzIpcy0+ZnJvbnRpZXIgKyAoVzY0KWJ5dGVzUmVxdWVzdGVk
IAoJCQkrIChXNjQpc3RhY2tCeXRlc1JlcXVlc3RlZCA+IChXNjQpKFczMilzLT5saW1pdCkg
ewoJCWlmIChzLT5tZXNzYWdlcykKCQkJZnByaW50ZihzdGRlcnIsICIlcyAlZDogR0NfZG9H
Q1xuIiwgZmlsZSwgbGluZSk7CgkJLyogVGhpcyBHQyB3aWxsIGdyb3cgdGhlIHN0YWNrLCBp
ZiBuZWNlc3NhcnkuICovCgkJR0NfZG9HQyAocywgYnl0ZXNSZXF1ZXN0ZWQsIHMtPmN1cnJl
bnRUaHJlYWQtPnN0YWNrLT5yZXNlcnZlZCk7CgkJYXNzZXJ0IChieXRlc1JlcXVlc3RlZCA8
PSBzLT5saW1pdCAtIHMtPmZyb250aWVyKTsKCX0gZWxzZSBpZiAobm90IChzdGFja1RvcElz
T2sgKHMsIHMtPmN1cnJlbnRUaHJlYWQtPnN0YWNrKSkpIHsKCQl1aW50IHNpemU7CgkJR0Nf
c3RhY2sgc3RhY2s7CgoJCXNpemUgPSAyICogcy0+Y3VycmVudFRocmVhZC0+c3RhY2stPnJl
c2VydmVkOwoJCWlmIChERUJVRykKCQkJZnByaW50ZiAoc3RkZXJyLCAiR3Jvd2luZyBzdGFj
ayB0byBzaXplICV1LlxuIiwgc2l6ZSk7CgkJaWYgKHNpemUgPiBzLT5tYXhTdGFja1NpemVT
ZWVuKQoJCQlzLT5tYXhTdGFja1NpemVTZWVuID0gc2l6ZTsKCQkvKiBUaGUgbmV3U3RhY2sg
Y2FuJ3QgY2F1c2UgYSBHQywgYmVjYXVzZSB3ZSBjaGVja2VkIGFib3ZlIHRvIAoJCSAqIG1h
a2Ugc3VyZSB0aGVyZSB3YXMgZW5vdWdoIHNwYWNlLiAKCQkgKi8KCQlzdGFjayA9IG5ld1N0
YWNrKHMsIHNpemUpOwoJCXN0YWNrQ29weShzLT5jdXJyZW50VGhyZWFkLT5zdGFjaywgc3Rh
Y2spOwoJCXMtPmN1cnJlbnRUaHJlYWQtPnN0YWNrID0gc3RhY2s7CgkJR0Nfc2V0U3RhY2so
cyk7CgkJYXNzZXJ0IChieXRlc1JlcXVlc3RlZCA8PSBzLT5saW1pdCAtIHMtPmZyb250aWVy
KTsKCX0gZWxzZSB7CgkJLyogU3dpdGNoIHRvIHRoZSBzaWduYWwgaGFuZGxlciB0aHJlYWQu
ICovCgkJYXNzZXJ0ICgwID09IHMtPmNhbkhhbmRsZSk7CgkJaWYgKERFQlVHX1NJR05BTFMp
IHsKCQkJZnByaW50ZihzdGRlcnIsICJzd2l0Y2hpbmcgdG8gc2lnbmFsIGhhbmRsZXJcbiIp
OwoJCQlHQ19kaXNwbGF5KHMsIHN0ZGVycik7CgkJfQoJCWFzc2VydChzLT5zaWduYWxJc1Bl
bmRpbmcpOwoJCXMtPnNpZ25hbElzUGVuZGluZyA9IEZBTFNFOwoJCXMtPmluU2lnbmFsSGFu
ZGxlciA9IFRSVUU7CgkJcy0+c2F2ZWRUaHJlYWQgPSBzLT5jdXJyZW50VGhyZWFkOwoJCS8q
IFNldCBzLT5jYW5IYW5kbGUgdG8gMiwgd2hpY2ggd2lsbCBiZSBkZWNyZW1lbnRlZCB0byAx
CgkJICogd2hlbiBzd2l0aGNoaW5nIHRvIHRoZSBzaWduYWwgaGFuZGxlciB0aHJlYWQsIHdo
aWNoIHdpbGwgdGhlbgogICAgICAgICAgICAgICAgICogcnVuIGF0b21pY2FsbHkgYW5kIHdp
bGwgZmluaXNoIGJ5IHN3aXRjaGluZyB0byB0aGUgdGhyZWFkCgkJICogdG8gY29udGludWUg
d2l0aCwgd2hpY2ggd2lsbCBkZWNyZW1lbnQgcy0+Y2FuSGFuZGxlIHRvIDAuCiAgICAgICAg
ICAgICAgICAgKi8KCQlzLT5jYW5IYW5kbGUgPSAyOwoJCXN3aXRjaFRvVGhyZWFkKHMsIHMt
PnNpZ25hbEhhbmRsZXIpOwoJfQoJbGVhdmUocyk7Cgl9IHdoaWxlICgoVzY0KShXMzIpcy0+
ZnJvbnRpZXIgKyAoVzY0KXMtPmN1cnJlbnRUaHJlYWQtPmJ5dGVzTmVlZGVkIAoJCQk+IChX
NjQpKFczMilzLT5saW1pdCk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgICAgIEdDX2NyZWF0ZVN0
cmluZ3MgICAgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgp2b2lkIEdDX2NyZWF0ZVN0cmluZ3MoR0Nf
c3RhdGUgcywgc3RydWN0IEdDX3N0cmluZ0luaXQgaW5pdHNbXSkgewoJcG9pbnRlciBmcm9u
dGllcjsKCWludCBpOwoKCWFzc2VydChpbnZhcmlhbnQocykpOwoJZnJvbnRpZXIgPSBzLT5m
cm9udGllcjsKCWZvcihpID0gMDsgaW5pdHNbaV0uc3RyICE9IE5VTEw7ICsraSkgewoJCXVp
bnQgbnVtRWxlbWVudHMsIG51bUJ5dGVzOwoKCQludW1FbGVtZW50cyA9IGluaXRzW2ldLnNp
emU7CgkJbnVtQnl0ZXMgPSBHQ19BUlJBWV9IRUFERVJfU0laRQoJCQkrICgoMCA9PSBudW1F
bGVtZW50cykgCgkJCQk/IFBPSU5URVJfU0laRSAKCQkJCTogd29yZEFsaWduKG51bUVsZW1l
bnRzKSk7CgkJaWYgKGZyb250aWVyICsgbnVtQnl0ZXMgPj0gcy0+bGltaXQpCgkJCWRpZSgi
VW5hYmxlIHRvIGFsbG9jYXRlIHN0cmluZyBjb25zdGFudCBcIiVzXCIuIiwgCgkJCQlpbml0
c1tpXS5zdHIpOwoJCSood29yZCopZnJvbnRpZXIgPSBudW1FbGVtZW50czsKCQkqKHdvcmQq
KShmcm9udGllciArIFdPUkRfU0laRSkgPSBTVFJJTkdfSEVBREVSOwoJCXMtPmdsb2JhbHNb
aW5pdHNbaV0uZ2xvYmFsSW5kZXhdID0gCgkJCWZyb250aWVyICsgR0NfQVJSQVlfSEVBREVS
X1NJWkU7CgkJewoJCQlpbnQgajsKCgkJCWZvciAoaiA9IDA7IGogPCBudW1FbGVtZW50czsg
KytqKQoJCQkJKihmcm9udGllciArIEdDX0FSUkFZX0hFQURFUl9TSVpFICsgaikgCgkJCQkJ
PSBpbml0c1tpXS5zdHJbal07CgkJfQoJCWZyb250aWVyICs9IG51bUJ5dGVzOwoJfQoJcy0+
ZnJvbnRpZXIgPSBmcm9udGllcjsKCWFzc2VydChHQ19tdXRhdG9ySW52YXJpYW50KHMpKTsK
fQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LSAqLwovKiAgICAgICAgICAgICAgICAgICAgICBHQ19kb25lICAgICAgICAgICAgICAgICAg
ICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0gKi8KCnN0YXRpYyB2b2lkIGRpc3BsYXlVaW50IChzdHJpbmcgbmFtZSwgdWludCBu
KSB7CglmcHJpbnRmIChzdGRlcnIsICIlczogJXNcbiIsIG5hbWUsIHVpbnRUb0NvbW1hU3Ry
aW5nKG4pKTsKfQoKc3RhdGljIHZvaWQgZGlzcGxheVVsbG9uZyAoc3RyaW5nIG5hbWUsIHVs
bG9uZyBuKSB7CglmcHJpbnRmIChzdGRlcnIsICIlczogJXNcbiIsIG5hbWUsIHVsbG9uZ1Rv
Q29tbWFTdHJpbmcobikpOwp9CgppbmxpbmUgdm9pZApHQ19kb25lIChHQ19zdGF0ZSBzKQp7
CglHQ19lbnRlcihzKTsKCXNtdW5tYXAocy0+YmFzZSwgcy0+ZnJvbVNpemUpOwoJaWYgKHMt
PnRvQmFzZSAhPSBOVUxMKSBzbXVubWFwKHMtPnRvQmFzZSwgcy0+dG9TaXplKTsKCWlmIChz
LT5zdW1tYXJ5KSB7CgkJZG91YmxlIHRpbWU7CgkJdWludCBnY1RpbWUgPSBydXNhZ2VUaW1l
KCZzLT5ydV9nYyk7CgoJCWRpc3BsYXlVaW50KCJtYXggc2VtaXNwYWNlIHNpemUoYnl0ZXMp
Iiwgcy0+bWF4SGVhcFNpemVTZWVuKTsKCQlkaXNwbGF5VWludCgibWF4IHN0YWNrIHNpemUo
Ynl0ZXMpIiwgcy0+bWF4U3RhY2tTaXplU2Vlbik7CgkJdGltZSA9IChkb3VibGUpKGN1cnJl
bnRUaW1lKCkgLSBzLT5zdGFydFRpbWUpOwoJCWZwcmludGYoc3RkZXJyLCAiR0MgdGltZSht
cyk6ICVzICglLjFmJSUpXG4iLAoJCQlpbnRUb0NvbW1hU3RyaW5nKGdjVGltZSksIAoJCQko
MC4wID09IHRpbWUpID8gMC4wIAoJCQk6IDEwMC4wICogKChkb3VibGUpIGdjVGltZSkgLyB0
aW1lKTsKCQlkaXNwbGF5VWludCgibWF4UGF1c2UobXMpIiwgcy0+bWF4UGF1c2UpOwoJCWRp
c3BsYXlVaW50KCJudW1iZXIgb2YgR0NzIiwgcy0+bnVtR0NzKTsKCQlkaXNwbGF5VWxsb25n
KCJudW1iZXIgb2YgTENzIiwgcy0+bnVtTENzKTsKCQlkaXNwbGF5VWxsb25nKCJieXRlcyBh
bGxvY2F0ZWQiLAoJIAkJCXMtPmJ5dGVzQWxsb2NhdGVkIAoJCQkJKyAocy0+ZnJvbnRpZXIg
LSBzLT5iYXNlIC0gcy0+Ynl0ZXNMaXZlKSk7CgkJZGlzcGxheVVsbG9uZygiYnl0ZXMgY29w
aWVkIiwgcy0+Ynl0ZXNDb3BpZWQpOwoJCWRpc3BsYXlVaW50KCJtYXggYnl0ZXMgbGl2ZSIs
IHMtPm1heEJ5dGVzTGl2ZSk7CiNpZiBNRVRFUgoJCXsKCQkJaW50IGk7CgkJCWZvcihpID0g
MDsgaSA8IGNhcmRvZihzaXplcyk7ICsraSkgewoJCQkJaWYgKDAgIT0gc2l6ZXNbaV0pCgkJ
CQkJZnByaW50ZihzdGRlcnIsICJDT1VOVFslZF09JWRcbiIsIGksIHNpemVzW2ldKTsKCQkg
IAl9CgkJfQojZW5kaWYKCgl9CQp9CgovKiBHQ19oYW5kbGVyIHNldHMgcy0+bGltaXQgPSAw
IHNvIHRoYXQgdGhlIG5leHQgbGltaXQgY2hlY2sgd2lsbCBmYWlsLiAKICogU2lnbmFscyBu
ZWVkIHRvIGJlIGJsb2NrZWQgZHVyaW5nIHRoZSBoYW5kbGVyIChpLmUuIGl0IHNob3VsZCBy
dW4gYXRvbWljYWxseSkKICogYmVjYXVzZSBzaWdhZGRzZXQgZG9lcyBib3RoIGEgcmVhZCBh
bmQgYSB3cml0ZSBvZiBzLT5zaWduYWxzUGVuZGluZy4KICogVGhlIHNpZ25hbHMgYXJlIGJs
b2NrZWQgYnkgUG9zaXhfU2lnbmFsX2hhbmRsZSAoc2VlIFBvc2l4L1NpZ25hbC9TaWduYWwu
YykuCiAqLwppbmxpbmUgdm9pZApHQ19oYW5kbGVyKEdDX3N0YXRlIHMsIGludCBzaWdudW0p
CnsKCWlmIChERUJVR19TSUdOQUxTKQoJCWZwcmludGYoc3RkZXJyLCAiR0NfaGFuZGxlciAg
c2lnbnVtID0gJWRcbiIsIHNpZ251bSk7CglpZiAoMCA9PSBzLT5jYW5IYW5kbGUpIHsKCQlp
ZiAoREVCVUdfU0lHTkFMUykKCQkJZnByaW50ZihzdGRlcnIsICJzZXR0aW5nIGxpbWl0ID0g
MFxuIik7CgkJcy0+bGltaXQgPSAwOwoJfQoJc2lnYWRkc2V0KCZzLT5zaWduYWxzUGVuZGlu
Zywgc2lnbnVtKTsKCXMtPnNpZ25hbElzUGVuZGluZyA9IFRSVUU7CglpZiAoREVCVUdfU0lH
TkFMUykKCQlmcHJpbnRmKHN0ZGVyciwgIkdDX2hhbmRsZXIgZG9uZVxuIik7Cn0KCnZvaWQg
R0NfZmluaXNoSGFuZGxlciAoR0Nfc3RhdGUgcykgewoJYXNzZXJ0KHMtPmNhbkhhbmRsZSA9
PSAxKTsKCXMtPmluU2lnbmFsSGFuZGxlciA9IEZBTFNFOwkKCXNpZ2VtcHR5c2V0KCZzLT5z
aWduYWxzUGVuZGluZyk7Cgl1bmJsb2NrU2lnbmFscyhzKTsKfQoKLyogLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAgICAgICAgICAg
ICAgICAgICBHQ19vYmplY3RTaXplICAgICAgICAgICAgICAgICAgICovCi8qIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogQ29tcHV0
ZSB0aGUgc3BhY2UgdGFrZW4gYnkgdGhlIGhlYWRlciBhbmQgb2JqZWN0IGJvZHkuICovCgpp
bmxpbmUgdWludApHQ19vYmplY3RTaXplKHBvaW50ZXIgcCkKewoJdWludCBoZWFkZXJCeXRl
cywgb2JqZWN0Qnl0ZXM7CiAgICAgICAJd29yZCBoZWFkZXI7Cgl1aW50IHRhZywgbnVtUG9p
bnRlcnMsIG51bU5vblBvaW50ZXJzOwoKCWhlYWRlciA9IEdDX2dldEhlYWRlcihwKTsKCVNQ
TElUX0hFQURFUigpOwoJaWYgKE5PUk1BTF9UQUcgPT0gdGFnKSB7IC8qIEZpeGVkIHNpemUg
b2JqZWN0LiAqLwoJCWhlYWRlckJ5dGVzID0gR0NfT0JKRUNUX0hFQURFUl9TSVpFOwoJCW9i
amVjdEJ5dGVzID0gdG9CeXRlcyhudW1Qb2ludGVycyArIG51bU5vblBvaW50ZXJzKTsKCX0g
ZWxzZSBpZiAoU1RBQ0tfVEFHID09IHRhZykgeyAvKiBTdGFjay4gKi8KCQloZWFkZXJCeXRl
cyA9IFNUQUNLX0hFQURFUl9TSVpFOwoJCW9iamVjdEJ5dGVzID0gc2l6ZW9mKHN0cnVjdCBH
Q19zdGFjaykgKyAoKEdDX3N0YWNrKXApLT5yZXNlcnZlZDsKCX0gZWxzZSB7IC8qIEFycmF5
LiAqLwoJCWFzc2VydChBUlJBWV9UQUcgPT0gdGFnKTsKCQloZWFkZXJCeXRlcyA9IEdDX0FS
UkFZX0hFQURFUl9TSVpFOwoJCW9iamVjdEJ5dGVzID0gYXJyYXlOdW1CeXRlcyhwLCBudW1Q
b2ludGVycywgbnVtTm9uUG9pbnRlcnMpOwoJCS8qIEVtcHR5IGFycmF5cyBoYXZlIFBPSU5U
RVJfU0laRSBieXRlcyBmb3IgdGhlIAoJCSAqIGZvcndhcmRpbmcgcG9pbnRlci4KCQkgKi8K
CQlpZiAoMCA9PSBvYmplY3RCeXRlcykgb2JqZWN0Qnl0ZXMgPSBQT0lOVEVSX1NJWkU7Cgl9
CglyZXR1cm4gaGVhZGVyQnl0ZXMgKyBvYmplY3RCeXRlczsKfQo=

--IMkTSrqzIS--