No subject


Tue Jul 27 07:17:13 PDT 2010


number of columns of the page, Iam able to sort the blocks. So that the
selection is very good.

Right now in poppler the selection is bit a problem. After doing all these
its almost look like Adobe Reader's Selection.

Please give me suggestions on improving this.

I attached two files with this mail.

getcol.c is able to sort the blocks in single/multicolumn pdfs.
getcolumn.c is based on the above sorting used to do the selection.


Thanks
-- 
A Srinivas

--001636d34ceb468fde048c5f45b0
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Hi all,<br><br>=A0=A0=A0=A0=A0=A0=A0 I used the poppler_page_get_selection_=
region() to find the line rectangles of each and every line in a page.<br>F=
rom that I find the blocks, then I find the columns of the page. From the n=
umber of columns of the page, Iam able to sort the blocks. So that the sele=
ction is very good.<br>
<br>Right now in poppler the selection is bit a problem. After doing all th=
ese its almost look like Adobe Reader&#39;s Selection.<br><br>Please give m=
e suggestions on improving this.<br><br>I attached two files with this mail=
. <br>
<br>getcol.c is able to sort the blocks in single/multicolumn pdfs. <br>get=
column.c is based on the above sorting used to do the selection.<br><br><br=
>Thanks<br>-- <br>A Srinivas<br>

--001636d34ceb468fde048c5f45b0--
--001636d34ceb468fe3048c5f45b2
Content-Type: text/x-csrc; charset=US-ASCII; name="getcolumn.c"
Content-Disposition: attachment; filename="getcolumn.c"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gc4u697v0

I2luY2x1ZGUgPHBvcHBsZXIuaD4KI2luY2x1ZGUgPHBvcHBsZXItZG9jdW1lbnQuaD4KI2luY2x1
ZGUgPHBvcHBsZXItcGFnZS5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRsaWIu
aD4KI2luY2x1ZGUgPGd0ay9ndGsuaD4KI2luY2x1ZGUgPHN5cy90aW1lLmg+CgppbnQgcGFnZV9u
bzsgLy8gcGFnZW5vCmludCBucGFnZXM7ICAvLyBudW0gcGFnZXMKaW50IHBkZl9jb2x1bW4gPSAx
OyAvLyBkZWZhdWx0IHNpbmdsZSBjb2x1bW4KUG9wcGxlclJlY3RhbmdsZSAqKmNvbHVtbl9yZWN0
OyAvLyBmaW5kIHRoZSBib3VuZGFyaWVzIG9mIHRoZSBjb2x1bW5zCmdkb3VibGUgYngxID0gMCwg
YnkxPTAsIGJ4Mj0wLCBieTI9MDsKZ2ludCBoYW5kbGVyX2lkOwpzdHJ1Y3QgdGltZXZhbCBzdGFy
dF90aW1lLCBlbmRfdGltZTsKCmdib29sZWFuCmJsb2NrX292ZXJsYXAgKFBvcHBsZXJSZWN0YW5n
bGUgKmJsb2NrLCBQb3BwbGVyUmVjdGFuZ2xlICphcmVhKQp7CglpZighKChibG9jay0+eDEgPj0g
YXJlYS0+eDIpIHx8IChibG9jay0+eDIgPD0gYXJlYS0+eDEpIHx8IChibG9jay0+eTEgPj0gYXJl
YS0+eTIpIHx8IChibG9jay0+eTIgPD0gYXJlYS0+eTEpKSkKCQlyZXR1cm4gVFJVRTsKCWVsc2UK
CQlyZXR1cm4gRkFMU0U7Cn0KCmdib29sZWFuCnJlY3RhbmdsZV9vdmVybGFwIChQb3BwbGVyUmVj
dGFuZ2xlICpibG9jaywgUG9wcGxlclJlY3RhbmdsZSAqYXJlYSkKewoJaWYoISgoYmxvY2stPngx
ID49IGFyZWEtPngyKSB8fCAoYmxvY2stPngyIDw9IGFyZWEtPngxKSB8fCAoYmxvY2stPnkxID49
IGFyZWEtPnkyKSB8fCAoYmxvY2stPnkyIDw9IGFyZWEtPnkxLTMpKSkKCQlyZXR1cm4gVFJVRTsK
CWVsc2UKCQlyZXR1cm4gRkFMU0U7Cn0Kdm9pZCBmaW5kX2Jsb2NrKEdMaXN0ICoqYmxvY2tzLCBQ
b3BwbGVyUmVjdGFuZ2xlICpibG9jayxQb3BwbGVyUmVjdGFuZ2xlICpuZXdyZWN0LGdib29sZWFu
IGZsYWcpCnsKCWRvdWJsZSB4bWluLHltaW4seG1heCx5bWF4OwoJeG1pbiA9IGJsb2NrLT54MTsK
CXltaW4gPSBibG9jay0+eTE7Cgl4bWF4ID0gYmxvY2stPngyOwoJeW1heCA9IGJsb2NrLT55MjsK
CglnYm9vbGVhbiBpbmQgPSBGQUxTRTsKCglpZiAocmVjdGFuZ2xlX292ZXJsYXAgKGJsb2NrLCBu
ZXdyZWN0KSkKCXsKCQl4bWluID0gKHhtaW4gPiBuZXdyZWN0LT54MSkgPyBuZXdyZWN0LT54MSA6
IHhtaW47CQkKCQl4bWF4ID0gKHhtYXggPCBuZXdyZWN0LT54MikgPyBuZXdyZWN0LT54MiA6IHht
YXg7CgkJeW1pbiA9ICh5bWluID4gbmV3cmVjdC0+eTEpID8gbmV3cmVjdC0+eTEgOiB5bWluOwkJ
CgkJeW1heCA9ICh5bWF4IDwgbmV3cmVjdC0+eTIpID8gbmV3cmVjdC0+eTIgOiB5bWF4OwkJCgoJ
CWJsb2NrLT54MSA9IHhtaW47CgkJYmxvY2stPngyID0geG1heDsKCQlibG9jay0+eTEgPSB5bWlu
OwoJCWJsb2NrLT55MiA9IHltYXg7Cgl9CgllbHNlIHsKCQlpbmQgPSBUUlVFOwoJfQoKCWlmKGZs
YWcgfHwgaW5kKSB7CgkKCQlQb3BwbGVyUmVjdGFuZ2xlICpibGsgPSBnX25ldyhQb3BwbGVyUmVj
dGFuZ2xlLDEpOwoJCWJsay0+eDEgPSBibG9jay0+eDE7CgkJYmxrLT55MSA9IGJsb2NrLT55MTsK
CQlibGstPngyID0gYmxvY2stPngyOwoJCWJsay0+eTIgPSBibG9jay0+eTI7CgoJCWJsb2NrLT54
MSA9IG5ld3JlY3QtPngxOwoJCWJsb2NrLT55MSA9IG5ld3JlY3QtPnkxOwoJCWJsb2NrLT54MiA9
IG5ld3JlY3QtPngyOwoJCWJsb2NrLT55MiA9IG5ld3JlY3QtPnkyOwoKCQlQb3BwbGVyUmVjdGFu
Z2xlICpsYXN0ID0gTlVMTDsKCQlpZiAoZ19saXN0X2xlbmd0aCgqYmxvY2tzKSA+IDApIHsKCQkJ
aW50IGk7CgkJCWdib29sZWFuIG92ZXJsYXAgPWZhbHNlOwoJCQlmb3IoaT0wOyBpPGdfbGlzdF9s
ZW5ndGgoKmJsb2Nrcyk7IGkrKykgewoJCQkKCQkJCWxhc3QgPSAoUG9wcGxlclJlY3RhbmdsZSAq
KWdfbGlzdF9udGhfZGF0YSgqYmxvY2tzLCBpKTsKCgkJCQlpZiAocmVjdGFuZ2xlX292ZXJsYXAo
bGFzdCwgYmxrKSkgeyAvLyBpZiBvdmVybGFwIHRha2UgdGhlIHVuaW9uIG9mIHJlY3RhbmdsZXMK
CgkJCQkJbGFzdC0+eDEgPSBsYXN0LT54MSA8IGJsay0+eDEgPyBsYXN0LT54MTogYmxrLT54MTsK
CQkJCQlsYXN0LT55MSA9IGxhc3QtPnkxIDwgYmxrLT55MSA/IGxhc3QtPnkxOiBibGstPnkxOwoJ
CQkJCWxhc3QtPngyID0gbGFzdC0+eDIgPiBibGstPngyID8gbGFzdC0+eDI6IGJsay0+eDI7CgkJ
CQkJbGFzdC0+eTIgPSBsYXN0LT55MiA+IGJsay0+eTIgPyBsYXN0LT55MjogYmxrLT55MjsKCgkJ
CQkJb3ZlcmxhcCA9IHRydWU7CgkJCQl9CgkJCX0KCQkJaWYoIW92ZXJsYXApCgkJCQkqYmxvY2tz
CT0gZ19saXN0X2FwcGVuZCgqYmxvY2tzLGJsayk7CgkJfQoJCWVsc2UgCgkJCSpibG9ja3MJPSBn
X2xpc3RfYXBwZW5kKCpibG9ja3MsYmxrKTsKCQkKCQlpZihmbGFnICYmIGluZCkKCQkJKmJsb2Nr
cwk9IGdfbGlzdF9hcHBlbmQoKmJsb2NrcyxibG9jayk7Cgl9Cn0KCmdib29sZWFuIHlfYXhpc19v
dmVybGFwIChQb3BwbGVyUmVjdGFuZ2xlICphLCBQb3BwbGVyUmVjdGFuZ2xlICpiKQp7CglpZiAo
IShhLT54MSA+IGItPngyIHx8IGEtPngyIDwgYi0+eDEpKQoJCXJldHVybiB0cnVlOwoJcmV0dXJu
IGZhbHNlOwp9CgpnYm9vbGVhbiB4X2F4aXNfb3ZlcmxhcCAoUG9wcGxlclJlY3RhbmdsZSAqYSwg
UG9wcGxlclJlY3RhbmdsZSAqYikKewoJaWYgKCEoYS0+eTEgPiBiLT55MiB8fCBhLT55MiA8IGIt
PnkxKSkKCQlyZXR1cm4gdHJ1ZTsKCXJldHVybiBmYWxzZTsKfQoKZ2ludCBmaW5kX2NvbHVtbihQ
b3BwbGVyUmVjdGFuZ2xlICphKQp7CglpbnQgaTsKCWZvcihpPTA7IGk8cGRmX2NvbHVtbjsgaSsr
KSB7CgkJaWYgKGJsb2NrX292ZXJsYXAoYSwgY29sdW1uX3JlY3RbaV0pKQoJCQlyZXR1cm4gaTsK
CX0KfQoKZ2ludCBzb3J0X2dyb3VwcyhQb3BwbGVyUmVjdGFuZ2xlICphLCBQb3BwbGVyUmVjdGFu
Z2xlICpiKSAKewoJaW50IGMxID0gZmluZF9jb2x1bW4oYSk7CglpbnQgYzIgPSBmaW5kX2NvbHVt
bihiKTsKCglpZihjMSA8IGMyKSByZXR1cm4gLTE7CglpZihjMSA9PSBjMikgewoJCWlmKGEtPnkx
IDwgYi0+eTEpIHJldHVybiAtMTsKCQllbHNlIGlmKGEtPnkxID09IGItPnkxKSB7CgkJCWlmKGEt
PngxIDwgYi0+eDEpIHJldHVybiAtMTsKCQkJaWYoYS0+eDEgPT0gYi0+eDEpIHJldHVybiAwOwoJ
CQlpZihhLT54MSA+IGItPngxKSByZXR1cm4gMTsJCgkJCgkJfSBlbHNlIGlmKGEtPnkxID4gYi0+
eTEpCgkJICByZXR1cm4gMTsKCX0KCWlmKGMxID4gYzIpIHJldHVybiAxOwp9CgpnaW50IHNvcnRf
eWF4aXMoUG9wcGxlclJlY3RhbmdsZSAqYSwgUG9wcGxlclJlY3RhbmdsZSAqYikgCnsKCWlmIChh
LT55MSA8IGItPnkxKSByZXR1cm4gLTE7IC8vIGEgY29tZXMgYmVmb3JlIGIKCWlmIChhLT55MSA9
PSBiLT55MSkgcmV0dXJuIDA7IC8vIGVxdWFsCglpZiAoYS0+eTEgPiBiLT55MSkgcmV0dXJuIDE7
IC8vIGEgY29tZXMgYWZ0ZXIgYgp9CgovKiBzb3J0IGJsb2NrcyBhY2NvcmRpbmcgdG8gaGVpZ2h0
ICovCmdpbnQgY29tcGFyZV9mdW5jIChQb3BwbGVyUmVjdGFuZ2xlICphLCBQb3BwbGVyUmVjdGFu
Z2xlICpiKQp7CglnZG91YmxlIGhlaWdodEEgPSBhLT55MiAtIGEtPnkxOwoJZ2RvdWJsZSBoZWln
aHRCID0gYi0+eTIgLSBiLT55MTsKCglpZiAoaGVpZ2h0QSA+IGhlaWdodEIpIHJldHVybiAtMTsK
CWlmIChoZWlnaHRBID09IGhlaWdodEIpIHJldHVybiAwOwoJaWYgKGhlaWdodEEgPCBoZWlnaHRC
KSByZXR1cm4gMTsKfQoKZ2Jvb2xlYW4gcmVjdF9lcXVhbCAoUG9wcGxlclJlY3RhbmdsZSAqYSwg
UG9wcGxlclJlY3RhbmdsZSAqYikKewoJaWYgKGEtPngxID09IGItPngxICYmIGEtPnkxID09IGIt
PnkxICYmIGEtPngyID09IGItPngyICYmIGEtPnkyID09IGItPnkyKQoJCXJldHVybiB0cnVlOwoJ
cmV0dXJuIGZhbHNlOwp9CgpnYm9vbGVhbiBjaGVja19ncm91cChQb3BwbGVyUmVjdGFuZ2xlICpy
ZWN0LCBQb3BwbGVyUmVjdGFuZ2xlICpncnByZWN0KSAKewoJaWYgKHJlY3QtPnkyIDwgZ3JwcmVj
dC0+eTEpIC8vIHx8IHJlY3RfZXF1YWwocmVjdCwgZ3JwcmVjdCkpCgkJcmV0dXJuIHRydWU7Cgll
bHNlCgkJcmV0dXJuIGZhbHNlOwp9CgovKiBJZiB0aGUgbGluZSByZWN0YW5nbGUgaXMgPiA4MCUg
b3ZlcmxhcCB3aXRoIGJvdW5kYXJ5IHJlY3RhbmdsZSB0aGVuIGluY2x1ZGUgCiAgIGVsc2UgaWdu
b3JlIHRoZSByZWN0YW5nbGUgKi8KZ2Jvb2xlYW4KY2hlY2tfcmVjdGFuZ2xlX292ZXJsYXAgKFBv
cHBsZXJSZWN0YW5nbGUgKmJsb2NrLCBQb3BwbGVyUmVjdGFuZ2xlICphcmVhLCBnYm9vbGVhbiB0
b3Bib3R0b20pCnsKCWlmIChhcmVhLT55MSA+PSBibG9jay0+eTEgJiYgYXJlYS0+eTIgPD0gYmxv
Y2stPnkyKQoJCXJldHVybiBUUlVFOwoKCWdkb3VibGUgaCA9IGFyZWEtPnkyIC0gYXJlYS0+eTE7
CgoJaWYgKHRvcGJvdHRvbSA9PSB0cnVlKQoJCWFyZWEtPnkxID0gYXJlYS0+eTIgLSAoaCowLjgp
OwoJZWxzZQoJCWFyZWEtPnkyID0gYXJlYS0+eTIgLSAoaCowLjIpOwoKCWlmIChhcmVhLT55MSA+
PSBibG9jay0+eTEgJiYgYXJlYS0+eTIgPD0gYmxvY2stPnkyKQoJCXJldHVybiBUUlVFOwoKCXJl
dHVybiBGQUxTRTsKfQoKdm9pZCAKcGFnZV9ib3VuZGFyeSAoR0xpc3QgKmJsb2NrcywgZG91Ymxl
ICp4bWluLCBkb3VibGUgKnltaW4sIGRvdWJsZSAqeG1heCwgZG91YmxlICp5bWF4LCBpbnQgKm1p
bnhfaW5kZXgsIGludCAqbWF4eF9pbmRleCwgaW50ICpmYWN0b3IpIAp7CglpbnQgaSxqOwoJaW50
IGxlbmd0aCA9IGdfbGlzdF9sZW5ndGggKGJsb2Nrcyk7Cglmb3IgKGk9MDsgaTxsZW5ndGg7IGkr
KykKCXsKCQlQb3BwbGVyUmVjdGFuZ2xlICogcHIgPSAoUG9wcGxlclJlY3RhbmdsZSAqKWdfbGlz
dF9udGhfZGF0YSAoYmxvY2tzLCBpKTsKCQlpZigqeG1pbiA+IHByLT54MSkgeyAqeG1pbiA9IHBy
LT54MTsgKm1pbnhfaW5kZXggPSBpOyB9CgkJaWYoKnltaW4gPiBwci0+eTEpIHsgKnltaW4gPSBw
ci0+eTE7IH0KCQlpZigqeG1heCA8IHByLT54MikgeyAqeG1heCA9IHByLT54MjsgKm1heHhfaW5k
ZXggPSBpOyB9CgkJaWYoKnltYXggPCBwci0+eTIpIHsgKnltYXggPSBwci0+eTI7IH0KCX0KCglQ
b3BwbGVyUmVjdGFuZ2xlICptaW54YmxvY2sgPSAoUG9wcGxlclJlY3RhbmdsZSAqKSBnX2xpc3Rf
bnRoX2RhdGEgKGJsb2NrcywgKm1pbnhfaW5kZXgpOwoJaWYgKG1pbnhibG9jayAmJiAobWlueGJs
b2NrLT55MiAtIG1pbnhibG9jay0+eTEpIDwgNjApIHsKCgkJUG9wcGxlclJlY3RhbmdsZSAqdGVt
cCA9IGdfbmV3IChQb3BwbGVyUmVjdGFuZ2xlLCAxKTsKCQlmb3IoaT0qeG1pbjsgaTwoKnhtaW4r
KG1pbnhibG9jay0+eDIgLSBtaW54YmxvY2stPngxKSk7IGkrKykgewoJCQl0ZW1wLT54MSA9ICp4
bWluOwoJCQl0ZW1wLT54MiA9IGk7CgkJCXRlbXAtPnkxID0gbWlueGJsb2NrLT55MTsKCQkJdGVt
cC0+eTIgPSBtaW54YmxvY2stPnkyOwoKCQkJaW50IG92ZXJsYXAgPSAwOwoJCQlmb3Ioaj0wOyBq
PGxlbmd0aDsgaisrKSB7CgkJCQlQb3BwbGVyUmVjdGFuZ2xlICpwciA9IChQb3BwbGVyUmVjdGFu
Z2xlICopIGdfbGlzdF9udGhfZGF0YSAoYmxvY2tzLCBqKTsKCQkJCWlmICh5X2F4aXNfb3Zlcmxh
cCh0ZW1wLCBwcikpCgkJCQkJb3ZlcmxhcCsrOwoJCQkJaWYgKG92ZXJsYXAgPiAxKQoJCQkJCWJy
ZWFrOwoJCQl9CgkJCWlmIChvdmVybGFwID4gMSkgewoJCQkJKmZhY3RvciA9IGkgLSAqeG1pbjsK
CQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoJUG9wcGxlclJlY3RhbmdsZSAqbWF4eGJsb2NrID0gKFBv
cHBsZXJSZWN0YW5nbGUgKikgZ19saXN0X250aF9kYXRhIChibG9ja3MsICptYXh4X2luZGV4KTsK
CWlmIChtYXh4YmxvY2sgJiYgKG1heHhibG9jay0+eTIgLSBtYXh4YmxvY2stPnkxKSA8IDYwKSB7
CgoJCVBvcHBsZXJSZWN0YW5nbGUgKnRlbXAgPSBnX25ldyAoUG9wcGxlclJlY3RhbmdsZSwgMSk7
CgkJZm9yKGk9KnhtYXg7IGk+bWF4eGJsb2NrLT54MTsgaS0tKSB7CgkJCXRlbXAtPngxID0gaTsK
CQkJdGVtcC0+eDIgPSAqeG1heDsKCQkJdGVtcC0+eTEgPSBtaW54YmxvY2stPnkxOwoJCQl0ZW1w
LT55MiA9IG1pbnhibG9jay0+eTI7CgoJCQlpbnQgb3ZlcmxhcCA9IDA7CgkJCWZvcihqPTA7IGo8
bGVuZ3RoOyBqKyspIHsKCQkJCVBvcHBsZXJSZWN0YW5nbGUgKnByID0gKFBvcHBsZXJSZWN0YW5n
bGUgKikgZ19saXN0X250aF9kYXRhIChibG9ja3MsIGopOwoJCQkJaWYgKHlfYXhpc19vdmVybGFw
KHRlbXAsIHByKSkKCQkJCQlvdmVybGFwKys7CgkJCQlpZiAob3ZlcmxhcCA+IDEpCgkJCQkJYnJl
YWs7CgkJCX0KCQkJaWYgKG92ZXJsYXAgPiAxKSB7CgkJCQkqZmFjdG9yID0gKmZhY3RvciArICp4
bWF4IC0gaTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQp9CgpnaW50CnBhZ2VfZmluZF9jb2x1bW4o
R0xpc3QgKmJsb2NrcywgaW50IHBhZ2Vfd2lkdGgpCnsKCWludCBrID0gMCwgbiA9IDI7Cglmb3Io
az0wOyBrPGdfbGlzdF9sZW5ndGgoYmxvY2tzKTsgaysrKSB7CgkJUG9wcGxlclJlY3RhbmdsZSAq
dG1wID0gKFBvcHBsZXJSZWN0YW5nbGUgKilnX2xpc3RfbnRoX2RhdGEgKGJsb2Nrcywgayk7CgkJ
Z2RvdWJsZSB3aWR0aCA9ICh0bXAtPngyIC0gdG1wLT54MSk7CgkJaWYod2lkdGggPD0gNjApCgkJ
CWNvbnRpbnVlOwoJCW4gPSAyOwoJCXdoaWxlIChuKndpZHRoIDwgcGFnZV93aWR0aCkgCgkJCW4r
KzsKCQlyZXR1cm4gbi0xOwoJfSAKfQoKdm9pZApwYWdlX3NldF9jb2x1bW5zX2JvdW5kYXJ5IChn
ZG91YmxlIHBhZ2Vfd2lkdGgsIGludCBmYWN0b3IsIGludCBwZGZfY29sdW1uLCBkb3VibGUgeG1p
biwgZG91YmxlIHltaW4sIGRvdWJsZSB5bWF4KQp7CglpbnQgaTsKCWdkb3VibGUgY29sX3dpZHRo
ID0gKHBhZ2Vfd2lkdGggLSBmYWN0b3IpL3BkZl9jb2x1bW47Cgljb2x1bW5fcmVjdCA9IGdfbmV3
IChQb3BwbGVyUmVjdGFuZ2xlKiwgcGRmX2NvbHVtbik7Cgl4bWluICs9IGZhY3RvcjsKCWZvciAo
aT0wOyBpPHBkZl9jb2x1bW47IGkrKykgewoJCWNvbHVtbl9yZWN0W2ldID0gZ19uZXcgKFBvcHBs
ZXJSZWN0YW5nbGUsIDEpOwoJCWNvbHVtbl9yZWN0W2ldLT54MSA9IHhtaW47CgkJY29sdW1uX3Jl
Y3RbaV0tPnkxID0geW1pbjsKCQljb2x1bW5fcmVjdFtpXS0+eDIgPSB4bWluK2NvbF93aWR0aDsK
CQljb2x1bW5fcmVjdFtpXS0+eTIgPSB5bWF4OwoJCXhtaW4gPSB4bWluK2NvbF93aWR0aDsKCX0g
Cn0KCnZvaWQKcGFnZV9tZXJnZV9zbWFsbF9ibG9ja3MoR0xpc3QgKmJsb2NrcywgaW50IHBkZl9j
b2x1bW4pCnsKCWludCBpLCBqLCBrLCBjb2x1bW4xID0gMCwgY29sdW1uMiA9IDA7CglpbnQgbGVu
Z3RoID0gZ19saXN0X2xlbmd0aCAoYmxvY2tzKTsKCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkr
KykKCXsKCQlQb3BwbGVyUmVjdGFuZ2xlICogcHIxID0gKFBvcHBsZXJSZWN0YW5nbGUgKilnX2xp
c3RfbnRoX2RhdGEgKGJsb2NrcywgaSk7CgkJZm9yIChqPTA7IGo8cGRmX2NvbHVtbjsgaisrKSB7
CgkJCWlmIChwcjEtPngxID49IGNvbHVtbl9yZWN0W2pdLT54MSAmJiBwcjEtPngyIDw9IGNvbHVt
bl9yZWN0W2pdLT54MikgewkgCgkJCQljb2x1bW4xID0gajsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJ
CWZvciAoayA9IDA7IGsgPCBsZW5ndGg7IGsrKykKCQl7CgkJCVBvcHBsZXJSZWN0YW5nbGUgKiBw
cjIgPSAoUG9wcGxlclJlY3RhbmdsZSAqKWdfbGlzdF9udGhfZGF0YSAoYmxvY2tzLCBrKTsKCQkJ
aWYgKGkgIT0gaykgewoJCQkJZm9yIChqPTA7IGo8cGRmX2NvbHVtbjsgaisrKSB7CgkJCQkJaWYg
KHByMi0+eDEgPj0gY29sdW1uX3JlY3Rbal0tPngxICYmIHByMi0+eDIgPD0gY29sdW1uX3JlY3Rb
al0tPngyKSB7CSAKCQkJCQkJY29sdW1uMiA9IGo7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0K
CQkJCWlmIChjb2x1bW4xID09IGNvbHVtbjIpIHsKCQkJCQlpZiAoeF9heGlzX292ZXJsYXAocHIx
LHByMikpIHsKCQkJCQkJcHIxLT54MSA9IHByMi0+eDEgPSBwcjEtPngxIDwgcHIyLT54MSA/IHBy
MS0+eDEgOiBwcjItPngxOwoJCQkJCQlwcjEtPnkxID0gcHIyLT55MSA9IHByMS0+eTEgPCBwcjIt
PnkxID8gcHIxLT55MSA6IHByMi0+eTE7CgkJCQkJCXByMS0+eDIgPSBwcjItPngyID0gcHIxLT54
MiA+IHByMi0+eDIgPyBwcjEtPngyIDogcHIyLT54MjsKCQkJCQkJcHIxLT55MiA9IHByMi0+eTIg
PSBwcjEtPnkyID4gcHIyLT55MiA/IHByMS0+eTIgOiBwcjItPnkyOwoJCQkJCX0KCQkJCX0KCQkJ
fQoJCX0KCX0gCn0KCkdMaXN0KgpwYWdlX2ZpbmRfaW50ZXJzZWN0aW9uX2Jsb2NrcyhHTGlzdCAq
YmxvY2tzLCBpbnQgcGRmX2NvbHVtbiwgZ2RvdWJsZSBwYWdlX3dpZHRoLCBnZG91YmxlIHBhZ2Vf
aGVpZ2h0LCBpbnQgKm51bV9pcHMpCnsKCWludCBpLCBqLCBjb2x1bW4xOwoJKm51bV9pcHMgPSAx
OwoJR0xpc3QgKmludGVyc2VjdGlvbl9ibG9ja3MgPSBOVUxMOwoJZm9yIChpPTA7IGk8Z19saXN0
X2xlbmd0aChibG9ja3MpOyBpKyspIHsKCQlQb3BwbGVyUmVjdGFuZ2xlICogcHIgPSAoUG9wcGxl
clJlY3RhbmdsZSAqKWdfbGlzdF9udGhfZGF0YSAoYmxvY2tzLCBpKTsKCQljb2x1bW4xID0gLTE7
CgkJZm9yIChqPTA7IGo8cGRmX2NvbHVtbjsgaisrKSB7CgkJCgkJCWlmIChwci0+eDEgPj0gY29s
dW1uX3JlY3Rbal0tPngxICYmIHByLT54MiA8PSBjb2x1bW5fcmVjdFtqXS0+eDIpIHsJIAoJCQkJ
Y29sdW1uMSA9IGo7CgkJCQlicmVhazsKCQkJfQoJCX0KCQlpZiAoY29sdW1uMSA9PSAtMSkgewoJ
CQlpbnRlcnNlY3Rpb25fYmxvY2tzID0gZ19saXN0X2FwcGVuZCAoaW50ZXJzZWN0aW9uX2Jsb2Nr
cywgcHIpOwoJCQkoKm51bV9pcHMpKys7IAoJCX0KCX0KCglQb3BwbGVyUmVjdGFuZ2xlICpsYXN0
Z3JvdXAgPSBnX25ldyAoUG9wcGxlclJlY3RhbmdsZSwgMSk7CglsYXN0Z3JvdXAtPngxID0gMDsK
CWxhc3Rncm91cC0+eTEgPSAyKnBhZ2VfaGVpZ2h0OwoJbGFzdGdyb3VwLT54MiA9IHBhZ2Vfd2lk
dGg7CglsYXN0Z3JvdXAtPnkyID0gMipwYWdlX2hlaWdodDsKCglpbnRlcnNlY3Rpb25fYmxvY2tz
ID0gZ19saXN0X2FwcGVuZCAoaW50ZXJzZWN0aW9uX2Jsb2NrcywgbGFzdGdyb3VwKTsKCglpZiAo
aW50ZXJzZWN0aW9uX2Jsb2NrcykKCQlpbnRlcnNlY3Rpb25fYmxvY2tzID0gZ19saXN0X3NvcnQg
KGludGVyc2VjdGlvbl9ibG9ja3MsIChHQ29tcGFyZUZ1bmMpIHNvcnRfeWF4aXMpOwoKCXJldHVy
biBpbnRlcnNlY3Rpb25fYmxvY2tzOwp9CgpHTGlzdCAqKgpwYWdlX2RpdmlkZV9ibG9ja3NfdG9f
Z3JvdXBzKEdMaXN0ICpibG9ja3MsIEdMaXN0ICppbnRlcnNlY3Rpb25fYmxvY2tzLCBpbnQgbnVt
X2lwcykKewoJaW50IGksIGo7CglHTGlzdCAqKmdyb3VwcyA9IGdfbmV3IChHTGlzdCosIG51bV9p
cHMpOwoJZm9yIChpPTA7IGk8bnVtX2lwczsgaSsrKQoJCWdyb3Vwc1tpXSA9IE5VTEw7CgoJLyog
VGFrZSB0aGUgYmxvY2sgZmluZCB0aGUgYXBwcm9wcmlhdGUgZ3JvdXAgKi8KCWlmIChpbnRlcnNl
Y3Rpb25fYmxvY2tzKSB7CgkJZm9yIChpPTA7IGk8Z19saXN0X2xlbmd0aChibG9ja3MpOyBpKysp
IHsKCQkJaW50IGdyb3VwID0gLTE7CgkJCVBvcHBsZXJSZWN0YW5nbGUgKiBwciA9IChQb3BwbGVy
UmVjdGFuZ2xlICopZ19saXN0X250aF9kYXRhIChibG9ja3MsIGkpOwoJCQlQb3BwbGVyUmVjdGFu
Z2xlICp0ZW1wID0gcG9wcGxlcl9yZWN0YW5nbGVfY29weSAocHIpOwoJCQlmb3IgKGo9MDsgajxu
dW1faXBzOyBqKyspIHsKCQkJCVBvcHBsZXJSZWN0YW5nbGUgKmdycF9yZWN0ID0gKFBvcHBsZXJS
ZWN0YW5nbGUgKilnX2xpc3RfbnRoX2RhdGEgKGludGVyc2VjdGlvbl9ibG9ja3MsIGopOwoJCQkJ
aWYgKGNoZWNrX2dyb3VwKHByLCBncnBfcmVjdCkpIHsKCQkJCQlncm91cCA9IGo7CgkJCQkJYnJl
YWs7CgkJCQl9CgkJCX0KCQkJaWYgKGdyb3VwICE9IC0xKQoJCQkJZ3JvdXBzW2dyb3VwXSA9IGdf
bGlzdF9hcHBlbmQgKGdyb3Vwc1tncm91cF0sIHRlbXApOwoJCX0KCX0KCWVsc2UgewoJCWZvciAo
aT0wOyBpPG51bV9pcHM7IGkrKykgewoJCQlQb3BwbGVyUmVjdGFuZ2xlICogcHIgPSAoUG9wcGxl
clJlY3RhbmdsZSAqKWdfbGlzdF9udGhfZGF0YSAoYmxvY2tzLCBpKTsKCQkJUG9wcGxlclJlY3Rh
bmdsZSAqdGVtcCA9IHBvcHBsZXJfcmVjdGFuZ2xlX2NvcHkgKHByKTsKCQkJZ3JvdXBzW2ldID0g
Z19saXN0X2FwcGVuZCAoZ3JvdXBzW2ldLCB0ZW1wKTsKCQl9Cgl9CglyZXR1cm4gZ3JvdXBzOwp9
Cgp2b2lkCnBhZ2VfbWVyZ2VfZ3JvdXBzKEdMaXN0ICoqZ3JvdXBzLCBHTGlzdCAqKmJsb2Nrcywg
aW50IG51bV9pcHMpCnsKCWludCBpOwoJKmJsb2NrcyA9IE5VTEw7Cglmb3IgKGk9MDsgaTxudW1f
aXBzOyBpKyspIHsKCQlpZiAoZ3JvdXBzW2ldKSB7CgkJCWlmICgqYmxvY2tzID09IE5VTEwpCgkJ
CQkqYmxvY2tzID0gZ3JvdXBzW2ldOwoJCQllbHNlCgkJCQkqYmxvY2tzID0gZ19saXN0X2NvbmNh
dCAoKmJsb2NrcywgZ3JvdXBzW2ldKTsKCQl9Cgl9Cn0KCkdMaXN0KgpwYWdlX2Jsb2Nrc19yZW1v
dmVfcmVkdW5kYW50X2Jsb2NrcyhHTGlzdCAqYmxvY2tzKQp7CglpbnQgaSwgajsKCUdMaXN0ICpt
ZXJnZWRfYmxvY2tzID0gTlVMTDsKCWludCBsZW5ndGggPSBnX2xpc3RfbGVuZ3RoKGJsb2Nrcyk7
Cglmb3IgKGk9MDsgaTxsZW5ndGg7IGkrKykgewoJCVBvcHBsZXJSZWN0YW5nbGUgKiBwcjEgPSAo
UG9wcGxlclJlY3RhbmdsZSAqKWdfbGlzdF9udGhfZGF0YSAoYmxvY2tzLCBpKTsKCQlnYm9vbGVh
biBpbmQgPSBmYWxzZTsKCQlmb3Ioaj1pKzE7IGo8bGVuZ3RoOyBqKyspIHsKCQkJUG9wcGxlclJl
Y3RhbmdsZSAqIHByMiA9IChQb3BwbGVyUmVjdGFuZ2xlICopZ19saXN0X250aF9kYXRhIChibG9j
a3MsIGopOwoJCQlpZiAocmVjdF9lcXVhbCAocHIxLCBwcjIpICYmIGkhPWopCgkJCQlpbmQgPSB0
cnVlOwoJCX0KCQlpZighaW5kKQoJCQltZXJnZWRfYmxvY2tzID0gZ19saXN0X2FwcGVuZChtZXJn
ZWRfYmxvY2tzLCBwcjEpOwoJfSAKCXJldHVybiBtZXJnZWRfYmxvY2tzOwp9CgpHTGlzdCoKZmlu
ZF9pbnRlcnNlY3Rpb25fYmxvY2tzIChQb3BwbGVyUmVjdGFuZ2xlICpyZWN0YW5nbGUsIEdMaXN0
ICpibG9ja3MpCnsKCWludCBpOwoJR0xpc3QgKmlibG9ja3MgPSBOVUxMOwoJZm9yKGkgPSAwOyBp
PGdfbGlzdF9sZW5ndGgoYmxvY2tzKTsgaSsrKSB7CgoJCVBvcHBsZXJSZWN0YW5nbGUgKnByID0g
KFBvcHBsZXJSZWN0YW5nbGUgKilnX2xpc3RfbnRoX2RhdGEgKGJsb2NrcywgaSk7CgkJaWYocmVj
dGFuZ2xlX292ZXJsYXAgKHJlY3RhbmdsZSwgcHIpKQoJCQlpYmxvY2tzID0gZ19saXN0X2FwcGVu
ZCAoaWJsb2NrcywgKGdwb2ludGVyKWkpOwoJfQoJcmV0dXJuIGlibG9ja3M7Cn0KCnZvaWQgc3dh
cCAoZG91YmxlICpkYXRhMSwgZG91YmxlICpkYXRhMikKewoJZG91YmxlIHRlbXA7Cgl0ZW1wID0g
KmRhdGExOwoJKmRhdGExID0gKmRhdGEyOwoJKmRhdGEyID0gdGVtcDsKfQoKR0xpc3QqCnBhZ2Vf
Z2V0X3Jlc3VsdHMoR0xpc3QgKnJlY3RzLCBHTGlzdCAqYmxvY2tzLCBQb3BwbGVyUmVjdGFuZ2xl
ICpib3VuZGFyeV9yZWN0LCBjYWlyb190ICpjcikKewoJR0xpc3QgKnRjcmVzdWx0ID0gTlVMTDsK
CQoJaWYgKGJvdW5kYXJ5X3JlY3QtPngyIDwgYm91bmRhcnlfcmVjdC0+eDEpCgkJc3dhcCgmKGJv
dW5kYXJ5X3JlY3QtPngyKSwgJihib3VuZGFyeV9yZWN0LT54MSkpOwoJaWYgKGJvdW5kYXJ5X3Jl
Y3QtPnkyIDwgYm91bmRhcnlfcmVjdC0+eTEpCgkJc3dhcCgmKGJvdW5kYXJ5X3JlY3QtPnkyKSwg
Jihib3VuZGFyeV9yZWN0LT55MSkpOwoJaW50IHN0YXJ0LCBlbmQ7CglHTGlzdCAqaW50ZXJzZWN0
aW9uYmxvY2tzID0gZmluZF9pbnRlcnNlY3Rpb25fYmxvY2tzIChib3VuZGFyeV9yZWN0LCBibG9j
a3MpOwoJCglzdGFydCA9IChnaW50KWdfbGlzdF9udGhfZGF0YShpbnRlcnNlY3Rpb25ibG9ja3Ms
IDApOwoJZW5kID0gKGdpbnQpZ19saXN0X250aF9kYXRhKGludGVyc2VjdGlvbmJsb2NrcywgZ19s
aXN0X2xlbmd0aChpbnRlcnNlY3Rpb25ibG9ja3MpLTEpOwoJCgljYWlyb19zZXRfc291cmNlX3Jn
YmEgKGNyLCAwLjgsIDAuMCwgMC4wLCAwLjMpOwoJY2Fpcm9fbW92ZV90byAoY3IsIGJvdW5kYXJ5
X3JlY3QtPngxLCBib3VuZGFyeV9yZWN0LT55MSk7CgljYWlyb19saW5lX3RvIChjciwgYm91bmRh
cnlfcmVjdC0+eDIsIGJvdW5kYXJ5X3JlY3QtPnkyKTsKCWNhaXJvX3N0cm9rZSAoY3IpOwoKCWlm
KHN0YXJ0ID4gZW5kKSB7CgkJaW50IHRlbXAgPSBzdGFydDsKCQlzdGFydCA9IGVuZDsKCQllbmQg
PSB0ZW1wOwoJfQoKCWludCBpLCBqOwkKCWludCBmaXJzdCA9IDAsIGxhc3QgPSAwOwoKCWZvcihp
PTA7IGk8Z19saXN0X2xlbmd0aChyZWN0cyk7IGkrKykgewoKCQlQb3BwbGVyUmVjdGFuZ2xlICpw
cmVjdGFuZ2xlID0gKFBvcHBsZXJSZWN0YW5nbGUgKikgZ19saXN0X250aF9kYXRhIChyZWN0cywg
aSk7CgkJZm9yIChqPXN0YXJ0OyBqPD1lbmQ7IGorKykgewoJCQkJCgkJCVBvcHBsZXJSZWN0YW5n
bGUgKmJsayA9IChQb3BwbGVyUmVjdGFuZ2xlICopIGdfbGlzdF9udGhfZGF0YSAoYmxvY2tzLCBq
KTsKCQkJaWYgKHJlY3RhbmdsZV9vdmVybGFwKGJsaywgcHJlY3RhbmdsZSkpIHsKCgkJCQlpZiAo
aiE9IHN0YXJ0ICYmIGohPSBlbmQpCgkJCQkJdGNyZXN1bHQgPSBnX2xpc3RfYXBwZW5kICh0Y3Jl
c3VsdCwgcHJlY3RhbmdsZSk7CgkJCQllbHNlIGlmIChqID09IHN0YXJ0ICYmIGogPT0gZW5kKSB7
CgkJCQkJZ2Jvb2xlYW4gdGIgPSB0cnVlOwoJCQkJCWlmIChmaXJzdCA+IDApIHRiID0gZmFsc2U7
CgoJCQkJCWlmIChjaGVja19yZWN0YW5nbGVfb3ZlcmxhcChib3VuZGFyeV9yZWN0LCBwcmVjdGFu
Z2xlLCB0YikpIHsKCQkJCQkJCgkJCQkJCWlmICgocHJlY3RhbmdsZS0+eDEgPCBib3VuZGFyeV9y
ZWN0LT54MSkgJiYgZmlyc3QgPT0gMCkgewoJCQkJCQkJcHJlY3RhbmdsZS0+eDEgPSBib3VuZGFy
eV9yZWN0LT54MTsKCQkJCQkJfQoJCQkJCQkKCQkJCQkJaWYgKChwcmVjdGFuZ2xlLT54MiA+IGJv
dW5kYXJ5X3JlY3QtPngyKSAmJiBsYXN0ID09IDEpIHsKCQkJCQkJCXByZWN0YW5nbGUtPngyID0g
Ym91bmRhcnlfcmVjdC0+eDI7CgkJCQkJCQlsYXN0ID0gMjsKCQkJCQkJfQoKCQkJCQkJUG9wcGxl
clJlY3RhbmdsZSAqIHByMSA9IChQb3BwbGVyUmVjdGFuZ2xlICopZ19saXN0X250aF9kYXRhIChy
ZWN0cywgaSsyKTsKCQkJCQkJaWYocHIxKSB7CgkJCQkJCQlpZiAoIWNoZWNrX3JlY3RhbmdsZV9v
dmVybGFwIChib3VuZGFyeV9yZWN0LCBwcjEsIGZhbHNlKSkgCgkJCQkJCQkJbGFzdCA9IDE7CgkJ
CQkJCX0KCQkJCQkJdGNyZXN1bHQgPSBnX2xpc3RfYXBwZW5kICh0Y3Jlc3VsdCwgcHJlY3Rhbmds
ZSk7CgkJCQkJCWZpcnN0ID0gMTsKCQkJCQl9CSAKCgkJCQl9IGVsc2UgaWYgKGogPT0gc3RhcnQp
IHsKCgkJCQkJaWYgKGNoZWNrX3JlY3RhbmdsZV9vdmVybGFwKGJvdW5kYXJ5X3JlY3QsIHByZWN0
YW5nbGUsIHRydWUpIHx8IGZpcnN0ID09IDEpIHsKCgkJCQkJCWlmICgocHJlY3RhbmdsZS0+eDEg
PCBib3VuZGFyeV9yZWN0LT54MSkgJiYgZmlyc3QgPT0gMCkgewoJCQkJCQkJcHJlY3RhbmdsZS0+
eDEgPSBib3VuZGFyeV9yZWN0LT54MTsKCQkJCQkJfQoJCQkJCQl0Y3Jlc3VsdCA9IGdfbGlzdF9h
cHBlbmQgKHRjcmVzdWx0LCBwcmVjdGFuZ2xlKTsKCQkJCQkJZmlyc3QgPSAxOwoJCQkJCX0JIAoJ
CQkJfSAKCQkJCWVsc2UgaWYgKGogPT0gZW5kKSB7CgoJCQkJCSAgaWYgKGJvdW5kYXJ5X3JlY3Qt
PnkyID4gcHJlY3RhbmdsZS0+eTIpIHsKCQkJCQkJaWYgKChwcmVjdGFuZ2xlLT54MiA+IGJvdW5k
YXJ5X3JlY3QtPngyKSAmJiBsYXN0ID09IDEpIHsKCQkJCQkJCXByZWN0YW5nbGUtPngyID0gYm91
bmRhcnlfcmVjdC0+eDI7CgkJCQkJCQlsYXN0ID0gMjsKCQkJCQkJfQoJCQkJCQl0Y3Jlc3VsdCA9
IGdfbGlzdF9hcHBlbmQgKHRjcmVzdWx0LCBwcmVjdGFuZ2xlKTsKCQkJCQkJUG9wcGxlclJlY3Rh
bmdsZSAqIHByMSA9IChQb3BwbGVyUmVjdGFuZ2xlICopZ19saXN0X250aF9kYXRhIChyZWN0cywg
aSsyKTsKCQkJCQkJaWYocHIxKSB7CgkJCQkJCQlpZiAocHIxLT55MiA+IGJvdW5kYXJ5X3JlY3Qt
PnkyKQoJCQkJCQkJCWxhc3QgPSAxOwoJCQkJCQl9CgkJCQkJfQkgCgkJCQl9CgkJCX0KCQl9IAkK
CX0KCXJldHVybiB0Y3Jlc3VsdDsKfQoKdm9pZApzaG93X3Jlc3VsdCAoR0xpc3QgKnJlc3VsdCwg
Y2Fpcm9fdCAqY3IpCnsKCWlmKHJlc3VsdCAhPSBOVUxMKSB7CgkJaW50IGk7CgkJZm9yKGkgPSAw
OyBpPGdfbGlzdF9sZW5ndGggKHJlc3VsdCk7IGkrKykgewoKCQkJUG9wcGxlclJlY3RhbmdsZSAq
cmVjdAk9IChQb3BwbGVyUmVjdGFuZ2xlICopZ19saXN0X250aF9kYXRhIChyZXN1bHQsIGkpOwoJ
CQljYWlyb19zZXRfc291cmNlX3JnYmEgKGNyLCAwLjAsIDAuMCwgMS4wLCAwLjEpOwoJCQljYWly
b19yZWN0YW5nbGUgKGNyLAoJCQkJCSByZWN0LT54MSwKCQkJCQkgcmVjdC0+eTEsCgkJCQkJIHJl
Y3QtPngyIC0gcmVjdC0+eDEsCgkJCQkJIHJlY3QtPnkyIC0gcmVjdC0+eTEpOwoJCQljYWlyb19m
aWxsIChjcik7CgkJfQoJCWNhaXJvX3N0cm9rZSAoY3IpOwoJfQp9CgpnYm9vbGVhbiBleHBvc2Vf
ZXZlbnRfY2IgKEd0a1dpZGdldCAqd2lkZ2V0LCBHZGtFdmVudEV4cG9zZSAqZXZlbnQsIGdjaGFy
ICpmaWxlbmFtZSkKewoJY2Fpcm9fdCAqY3IgPSBnZGtfY2Fpcm9fY3JlYXRlICh3aWRnZXQtPndp
bmRvdyk7CgoJY2Fpcm9fc2V0X3NvdXJjZV9yZ2IgKGNyLCAxLjAsIDEuMCwgMS4wKTsKCWNhaXJv
X3BhaW50IChjcik7CgoJR0xpc3QgKnJlY3RzID0gTlVMTDsKCWNoYXIgKm5maWxlbmFtZSA9IChj
aGFyKiltYWxsb2Moc3RybGVuKGZpbGVuYW1lKSs4KTsKCglzdHJjcHkobmZpbGVuYW1lLCJmaWxl
Oi8vIik7CglzdHJjYXQobmZpbGVuYW1lLGZpbGVuYW1lKTsKCglQb3BwbGVyRG9jdW1lbnQgKnBv
cHBsZXJkb2M7CglQb3BwbGVyUGFnZQkqcGFnZTsKCglwb3BwbGVyZG9jCT0gcG9wcGxlcl9kb2N1
bWVudF9uZXdfZnJvbV9maWxlKG5maWxlbmFtZSxOVUxMLE5VTEwpOwoJbnBhZ2VzCQk9IHBvcHBs
ZXJfZG9jdW1lbnRfZ2V0X25fcGFnZXMocG9wcGxlcmRvYyk7CgoJaW50IGksajsKIAoJcGFnZQkJ
PSBwb3BwbGVyX2RvY3VtZW50X2dldF9wYWdlKHBvcHBsZXJkb2MscGFnZV9ubyk7CgkvL2NhaXJv
X3NjYWxlIChjciwgMC41LCAwLjUpOyAvL1NDQUxFLCBTQ0FMRSk7Cglwb3BwbGVyX3BhZ2VfcmVu
ZGVyIChwYWdlLCBjcik7CgoJZG91YmxlIHcsaDsKCXBvcHBsZXJfcGFnZV9nZXRfc2l6ZShwYWdl
LCZ3LCZoKTsKCglQb3BwbGVyUmVjdGFuZ2xlICpwcmVjdCA9IGdfbmV3KFBvcHBsZXJSZWN0YW5n
bGUsMSk7CglwcmVjdC0+eDEgPSAwOwoJcHJlY3QtPnkxID0gMDsKCXByZWN0LT54MiA9IHc7Cglw
cmVjdC0+eTIgPSBoOwoKCglyZWN0cwk9IHBvcHBsZXJfcGFnZV9nZXRfc2VsZWN0aW9uX3JlZ2lv
bihwYWdlLDEuMCxQT1BQTEVSX1NFTEVDVElPTl9MSU5FLHByZWN0KTsKCgkvKiBGSU5EIFRIRSBC
TE9DS1MgKi8KCUdMaXN0ICpibG9ja3MJPSBOVUxMOwkKCVBvcHBsZXJSZWN0YW5nbGUgKmJsb2Nr
ID0gTlVMTDsKCglmb3IgKGkgPSAwOyBpIDwgZ19saXN0X2xlbmd0aCAocmVjdHMpOyBpKyspCgl7
CgkJUG9wcGxlclJlY3RhbmdsZSAqIHByID0gKFBvcHBsZXJSZWN0YW5nbGUgKilnX2xpc3RfbnRo
X2RhdGEgKHJlY3RzLCBpKTsKCQlQb3BwbGVyUmVjdGFuZ2xlICp0ZW1wID0gcG9wcGxlcl9yZWN0
YW5nbGVfY29weSAocHIpOwoKCQlpZihibG9jayA9PSBOVUxMKSB7CgkJCWJsb2NrID0gdGVtcDsK
CQl9CgkJZWxzZSB7CgkJCWlmKGkgIT0gZ19saXN0X2xlbmd0aChyZWN0cyktMSkKCQkJCWZpbmRf
YmxvY2soJmJsb2NrcywgYmxvY2ssIHRlbXAsIEZBTFNFKTsKCQkJZWxzZQoJCQkJZmluZF9ibG9j
aygmYmxvY2tzLCBibG9jaywgdGVtcCwgVFJVRSk7CgkJfQoJfSAvKiBFTkQgT0YgRklORElORyBC
TE9DS1MgKi8KCQoJLyogRklORCBQQUdFIEJPVU5EQVJZICovCglkb3VibGUgeG1pbiA9IDIwMDAs
eW1pbiA9IDIwMDAgLCB4bWF4ID0gMCx5bWF4ID0gMDsKCWludCBtaW54X2luZGV4ID0gZ19saXN0
X2xlbmd0aCAoYmxvY2tzKTsKCWludCBtYXh4X2luZGV4ID0gMDsKCWludCBmYWN0b3IgPSAwOwoJ
cGFnZV9ib3VuZGFyeSAoYmxvY2tzLCAmeG1pbiwgJnltaW4sICZ4bWF4LCAmeW1heCwgJm1pbnhf
aW5kZXgsICZtYXh4X2luZGV4LCAmZmFjdG9yKTsKCgkvKiBGSU5EIFRIRSBDT0xVTU4gT0YgVEhF
IFBBR0UqLwoJZ2RvdWJsZSBwYWdlX3dpZHRoID0gKHhtYXggLSB4bWluKTsKCWdkb3VibGUgcGFn
ZV9oZWlnaHQ9ICh5bWF4IC0geW1pbik7CglibG9ja3MgPSBnX2xpc3Rfc29ydCAoYmxvY2tzLCAo
R0NvbXBhcmVGdW5jKSBjb21wYXJlX2Z1bmMpOwoJcGRmX2NvbHVtbiA9IHBhZ2VfZmluZF9jb2x1
bW4oYmxvY2tzLCBwYWdlX3dpZHRoKTsKCgkvKiBTRVQgVEhFIEJPVU5EQVJJRVMgRk9SIE1VTFRJ
Q09MVU1OUyovCglwYWdlX3NldF9jb2x1bW5zX2JvdW5kYXJ5KHBhZ2Vfd2lkdGgsIGZhY3Rvciwg
cGRmX2NvbHVtbiwgeG1pbiwgeW1pbiwgeW1heCk7CgkKCS8qIFVOSU9OIFNNQUxMIEJMT0NLUyBJ
TiBNVUxUSUNPTFVNTiBQQUdFICovCglwYWdlX21lcmdlX3NtYWxsX2Jsb2NrcyhibG9ja3MsIHBk
Zl9jb2x1bW4pOwoKCS8qIEZJTkQgVEhFIElOVEVSU0VDVElPTiBCTE9DS1MgQU5EIFNFVCBUSEUg
R1JPVVBTIEFDQ09SRElORyBUTyBUSE9TRSBQT0lOVFMqLwoJaW50IG51bV9pcHMgPSAwOwoJR0xp
c3QgKmludGVyc2VjdGlvbl9ibG9ja3MgPSBwYWdlX2ZpbmRfaW50ZXJzZWN0aW9uX2Jsb2Nrcyhi
bG9ja3MsIHBkZl9jb2x1bW4sIHBhZ2Vfd2lkdGgsIHBhZ2VfaGVpZ2h0LCAmbnVtX2lwcyk7CgkK
CS8qIERJVklERSBUSEUgQkxPQ0tTIElOVE8gR1JPVVBTIEFDQ09SRElORyBUTyBJTlRFUlNFQ1RJ
T04gQkxPQ0tTICovCglHTGlzdCAqKmdyb3VwcyA9IHBhZ2VfZGl2aWRlX2Jsb2Nrc190b19ncm91
cHMoYmxvY2tzLCBpbnRlcnNlY3Rpb25fYmxvY2tzLCBudW1faXBzKTsJCgkKCS8qIFNvcnQgaW5k
aXZpZHVhbCBibG9ja3Mgd2l0aGluIGdyb3VwcyAqLwoJZm9yIChpPTA7IGk8bnVtX2lwczsgaSsr
KQoJCWdyb3Vwc1tpXSA9IGdfbGlzdF9zb3J0IChncm91cHNbaV0sIChHQ29tcGFyZUZ1bmMpIHNv
cnRfZ3JvdXBzKTsKCgkvKiBNRVJHRSBUSEUgQUxMIEdST1VQUyBJTiBUTyBTSU5HTEUqLwoJcGFn
ZV9tZXJnZV9ncm91cHMgKGdyb3VwcywgJmJsb2NrcywgbnVtX2lwcyk7CgkKCS8qIFJFTU9WRSBS
RVBFVElUSU9OIEJMT0NLUyovCglHTGlzdCAqbWVyZ2VkX2Jsb2NrcyA9IHBhZ2VfYmxvY2tzX3Jl
bW92ZV9yZWR1bmRhbnRfYmxvY2tzKGJsb2Nrcyk7CQoJCglQb3BwbGVyUmVjdGFuZ2xlICpib3Vu
ZGFyeV9yZWN0ID0gZ19uZXcgKFBvcHBsZXJSZWN0YW5nbGUsMSk7CglQb3BwbGVyUmVjdGFuZ2xl
ICpwYWdlX3JlY3QgPSBnX25ldyAoUG9wcGxlclJlY3RhbmdsZSwxKTsKCglwYWdlX3JlY3QtPngx
ID0gMDsKCXBhZ2VfcmVjdC0+eTEgPSAwOwoJcGFnZV9yZWN0LT54MiA9IHc7CglwYWdlX3JlY3Qt
PnkyID0gaDsKCglib3VuZGFyeV9yZWN0LT54MSA9IGJ4MTsKCWJvdW5kYXJ5X3JlY3QtPnkxID0g
YnkxOwoJYm91bmRhcnlfcmVjdC0+eDIgPSBieDI7Cglib3VuZGFyeV9yZWN0LT55MiA9IGJ5MjsK
CglHTGlzdCAqcmVzdWx0ID0gcGFnZV9nZXRfcmVzdWx0cyhyZWN0cywgbWVyZ2VkX2Jsb2Nrcywg
Ym91bmRhcnlfcmVjdCwgY3IpOwoJc2hvd19yZXN1bHQgKHJlc3VsdCwgY3IpOwoKCgljYWlyb19k
ZXN0cm95IChjcik7CgoJcG9wcGxlcl9wYWdlX3NlbGVjdGlvbl9yZWdpb25fZnJlZShyZWN0cyk7
CgoJZ19vYmplY3RfdW5yZWYgKHBhZ2UpOwoJZ19vYmplY3RfdW5yZWYgKHBvcHBsZXJkb2MpOwoK
CXJldHVybiBUUlVFOwp9Cmdib29sZWFuCmJ1dHRvbl9tb3ZlX2V2ZW50X2NiIChHdGtXaWRnZXQg
KndpZGdldCwgR2RrRXZlbnRCdXR0b24gKmV2ZW50LCBnY2hhciAqZmlsZW5hbWUpCnsKCWJ4MiA9
IGV2ZW50LT54OwoJYnkyID0gZXZlbnQtPnk7CglndGtfd2lkZ2V0X3F1ZXVlX2RyYXcod2lkZ2V0
KTsKfQoKZ2Jvb2xlYW4KYnV0dG9uX3ByZXNzX2V2ZW50X2NiIChHdGtXaWRnZXQgKndpZGdldCwg
R2RrRXZlbnRCdXR0b24gKmV2ZW50LCBnY2hhciAqZmlsZW5hbWUpCnsKCWdldHRpbWVvZmRheSgm
c3RhcnRfdGltZSwgTlVMTCk7CglieDEgPSBldmVudC0+eDsKCWJ5MSA9IGV2ZW50LT55OwoJaGFu
ZGxlcl9pZCA9IGdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUICh3aWRnZXQpLCAibW90aW9uX25v
dGlmeV9ldmVudCIsIEdfQ0FMTEJBQ0sgKGJ1dHRvbl9tb3ZlX2V2ZW50X2NiKSwgZmlsZW5hbWUp
OwoJcmV0dXJuIFRSVUU7Cn0KCmdib29sZWFuCmJ1dHRvbl9yZWxlYXNlX2V2ZW50X2NiIChHdGtX
aWRnZXQgKndpZGdldCwgR2RrRXZlbnRCdXR0b24gKmV2ZW50LCBnY2hhciAqZmlsZW5hbWUpCnsK
CWJ4MiA9IGV2ZW50LT54OwoJYnkyID0gZXZlbnQtPnk7CglndGtfd2lkZ2V0X3F1ZXVlX2RyYXco
d2lkZ2V0KTsKCWdfc2lnbmFsX2hhbmRsZXJfZGlzY29ubmVjdCh3aWRnZXQsIGhhbmRsZXJfaWQp
OwoKCWdldHRpbWVvZmRheSgmZW5kX3RpbWUsIE5VTEwpOwoJCglkb3VibGUgdDEgPSBzdGFydF90
aW1lLnR2X3NlYyArIChzdGFydF90aW1lLnR2X3VzZWMvMTAwMDAwMC4wKTsKCWRvdWJsZSB0MiA9
IGVuZF90aW1lLnR2X3NlYyArIChlbmRfdGltZS50dl91c2VjLzEwMDAwMDAuMCk7CgoJcHJpbnRm
KCJcbiBzdGFydCA9ICVsZiAsIGVuZCA9ICVsZiAsIGRpZmYgPSAlbGYgXG4iLCB0MSwgdDIsICh0
Mi10MSkpOwoKCXJldHVybiBUUlVFOwp9CgoKdm9pZCBidXR0b24xX2NsaWNrZWQgKEd0a0J1dHRv
biAqYnV0dG9uLCBHdGtXaWRnZXQgKmRyYXcpCnsKCWlmIChwYWdlX25vID4gMCkKCXsKCQlwYWdl
X25vLS07CgkJYngxID0gMCwgYnkxID0gMCwgYngyID0gMCwgYnkyID0gMDsKCQlndGtfd2lkZ2V0
X3F1ZXVlX2RyYXcgKGRyYXcpOwoJfQp9Cgp2b2lkIGJ1dHRvbjJfY2xpY2tlZCAoR3RrQnV0dG9u
ICpidXR0b24sIEd0a1dpZGdldCAqZHJhdykKewoJaWYgKHBhZ2Vfbm8gPCBucGFnZXMtMSkKCXsK
CQlwYWdlX25vKys7CgkJYngxID0gMCwgYnkxID0gMCwgYngyID0gMCwgYnkyID0gMDsKCQlndGtf
d2lkZ2V0X3F1ZXVlX2RyYXcgKGRyYXcpOwoJfQp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAq
KmFyZ3YpIHsKCglnX3R5cGVfaW5pdCgpOwoJCglndGtfaW5pdCAoJmFyZ2MsICZhcmd2KTsKCUd0
a1dpZGdldCAqd2luZG93ID0gZ3RrX3dpbmRvd19uZXcgKEdUS19XSU5ET1dfVE9QTEVWRUwpOwoJ
R3RrV2lkZ2V0ICpkcmF3ID0gZ3RrX2RyYXdpbmdfYXJlYV9uZXcgKCk7CglHdGtXaWRnZXQgKnZi
b3ggPSBndGtfdmJveF9uZXcgKDAsIDApOwoJR3RrV2lkZ2V0ICpoYm94ID0gZ3RrX2hib3hfbmV3
ICgwLCAwKTsKCUd0a1dpZGdldCAqYnV0dG9uMSA9IGd0a19idXR0b25fbmV3X3dpdGhfbGFiZWwg
KCI8PCIpOwoJR3RrV2lkZ2V0ICpidXR0b24yID0gZ3RrX2J1dHRvbl9uZXdfd2l0aF9sYWJlbCAo
Ij4+Iik7CgoJZ3RrX2JveF9wYWNrX3N0YXJ0IChHVEtfQk9YICh2Ym94KSwgZHJhdywgMCwgMCwg
MCk7CglndGtfYm94X3BhY2tfc3RhcnQgKEdUS19CT1ggKHZib3gpLCBoYm94LCAwLCAwLCAwKTsK
CQoJZ3RrX2JveF9wYWNrX2VuZCAoR1RLX0JPWCAoaGJveCksIGJ1dHRvbjIsIDAsIDAsIDEwKTsK
CWd0a19ib3hfcGFja19lbmQgKEdUS19CT1ggKGhib3gpLCBidXR0b24xLCAwLCAwLCAxMCk7CgoJ
Z3RrX3dpbmRvd19zZXRfZGVmYXVsdF9zaXplIChHVEtfV0lORE9XICh3aW5kb3cpLCA2MTIsIDc5
Mik7CglndGtfd2lkZ2V0X3NldF9zaXplX3JlcXVlc3QgKGRyYXcsIDYxMiwgNzkyKTsKCglndGtf
Y29udGFpbmVyX2FkZCAoR1RLX0NPTlRBSU5FUiAod2luZG93KSwgdmJveCk7CglwYWdlX25vID0g
MDsKCglndGtfd2lkZ2V0X3Nob3dfYWxsICh3aW5kb3cpOwoKCWdfc2lnbmFsX2Nvbm5lY3QgKEdf
T0JKRUNUIChkcmF3KSwgImV4cG9zZS1ldmVudCIsIEdfQ0FMTEJBQ0sgKGV4cG9zZV9ldmVudF9j
YiksIGFyZ3YgWzFdKTsKCWdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChkcmF3KSwgImJ1dHRv
bi1wcmVzcy1ldmVudCIsIEdfQ0FMTEJBQ0sgKGJ1dHRvbl9wcmVzc19ldmVudF9jYiksIGFyZ3Yg
WzFdKTsKCWdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChkcmF3KSwgImJ1dHRvbi1yZWxlYXNl
LWV2ZW50IiwgR19DQUxMQkFDSyAoYnV0dG9uX3JlbGVhc2VfZXZlbnRfY2IpLCBhcmd2IFsxXSk7
CglndGtfd2lkZ2V0X2FkZF9ldmVudHMgKGRyYXcsIEdES19BTExfRVZFTlRTX01BU0spOwoJZ19z
aWduYWxfY29ubmVjdCAoR19PQkpFQ1QgKHdpbmRvdyksICJkZXN0cm95IiwgZ3RrX21haW5fcXVp
dCwgTlVMTCk7CglnX3NpZ25hbF9jb25uZWN0IChHX09CSkVDVCAoYnV0dG9uMSksICJjbGlja2Vk
IiwgR19DQUxMQkFDSyAoYnV0dG9uMV9jbGlja2VkKSwgZHJhdyk7CglnX3NpZ25hbF9jb25uZWN0
IChHX09CSkVDVCAoYnV0dG9uMiksICJjbGlja2VkIiwgR19DQUxMQkFDSyAoYnV0dG9uMl9jbGlj
a2VkKSwgZHJhdyk7CgkKCWd0a19tYWluICgpOwkKfQo=
--001636d34ceb468fe3048c5f45b2
Content-Type: text/x-csrc; charset=US-ASCII; name="getcol.c"
Content-Disposition: attachment; filename="getcol.c"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gc4u6uml1

I2luY2x1ZGUgPHBvcHBsZXIuaD4KI2luY2x1ZGUgPHBvcHBsZXItZG9jdW1lbnQuaD4KI2luY2x1
ZGUgPHBvcHBsZXItcGFnZS5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRsaWIu
aD4KI2luY2x1ZGUgPGd0ay9ndGsuaD4KCmludCBwYWdlX25vOyAvLyBwYWdlbm8KaW50IG5wYWdl
czsgIC8vIG51bSBwYWdlcwpHTGlzdCAqYmxvY2tzID0gTlVMTDsKaW50IHBkZl9jb2x1bW4gPSAx
OyAvLyBkZWZhdWx0IHNpbmdsZSBjb2x1bW4KUG9wcGxlclJlY3RhbmdsZSAqKmNvbHVtbl9yZWN0
OyAvLyBmaW5kIHRoZSBib3VuZGFyaWVzIG9mIHRoZSBjb2x1bW5zCgpnYm9vbGVhbgpibG9ja19v
dmVybGFwIChQb3BwbGVyUmVjdGFuZ2xlICpibG9jaywgUG9wcGxlclJlY3RhbmdsZSAqYXJlYSkK
ewoJaWYoISgoYmxvY2stPngxID49IGFyZWEtPngyKSB8fCAoYmxvY2stPngyIDw9IGFyZWEtPngx
KSB8fCAoYmxvY2stPnkxID49IGFyZWEtPnkyKSB8fCAoYmxvY2stPnkyIDw9IGFyZWEtPnkxKSkp
CgkJcmV0dXJuIFRSVUU7CgllbHNlCgkJcmV0dXJuIEZBTFNFOwp9CgpnYm9vbGVhbgpyZWN0YW5n
bGVfb3ZlcmxhcCAoUG9wcGxlclJlY3RhbmdsZSAqYmxvY2ssIFBvcHBsZXJSZWN0YW5nbGUgKmFy
ZWEpCnsKCWlmKCEoKGJsb2NrLT54MSA+PSBhcmVhLT54MikgfHwgKGJsb2NrLT54MiA8PSBhcmVh
LT54MSkgfHwgKGJsb2NrLT55MSA+PSBhcmVhLT55MikgfHwgKGJsb2NrLT55MiA8PSBhcmVhLT55
MS0zKSkpCgkJcmV0dXJuIFRSVUU7CgllbHNlCgkJcmV0dXJuIEZBTFNFOwp9CnZvaWQgZmluZF9i
bG9jayhQb3BwbGVyUmVjdGFuZ2xlICpibG9jayxQb3BwbGVyUmVjdGFuZ2xlICpuZXdyZWN0LGdi
b29sZWFuIGZsYWcpCnsKCWRvdWJsZSB4bWluLHltaW4seG1heCx5bWF4OwoJeG1pbiA9IGJsb2Nr
LT54MTsKCXltaW4gPSBibG9jay0+eTE7Cgl4bWF4ID0gYmxvY2stPngyOwoJeW1heCA9IGJsb2Nr
LT55MjsKCglnYm9vbGVhbiBpbmQgPSBGQUxTRTsKCglpZiAocmVjdGFuZ2xlX292ZXJsYXAgKGJs
b2NrLCBuZXdyZWN0KSkKCXsKCQl4bWluID0gKHhtaW4gPiBuZXdyZWN0LT54MSkgPyBuZXdyZWN0
LT54MSA6IHhtaW47CQkKCQl4bWF4ID0gKHhtYXggPCBuZXdyZWN0LT54MikgPyBuZXdyZWN0LT54
MiA6IHhtYXg7CgkJeW1pbiA9ICh5bWluID4gbmV3cmVjdC0+eTEpID8gbmV3cmVjdC0+eTEgOiB5
bWluOwkJCgkJeW1heCA9ICh5bWF4IDwgbmV3cmVjdC0+eTIpID8gbmV3cmVjdC0+eTIgOiB5bWF4
OwkJCgoJCWJsb2NrLT54MSA9IHhtaW47CgkJYmxvY2stPngyID0geG1heDsKCQlibG9jay0+eTEg
PSB5bWluOwoJCWJsb2NrLT55MiA9IHltYXg7Cgl9CgllbHNlIHsKCQlpbmQgPSBUUlVFOwoJfQoK
CWlmKGZsYWcgfHwgaW5kKSB7CgkKCQlQb3BwbGVyUmVjdGFuZ2xlICpibGsgPSBnX25ldyhQb3Bw
bGVyUmVjdGFuZ2xlLDEpOwoJCWJsay0+eDEgPSBibG9jay0+eDE7CgkJYmxrLT55MSA9IGJsb2Nr
LT55MTsKCQlibGstPngyID0gYmxvY2stPngyOwoJCWJsay0+eTIgPSBibG9jay0+eTI7CgoJCWJs
b2NrLT54MSA9IG5ld3JlY3QtPngxOwoJCWJsb2NrLT55MSA9IG5ld3JlY3QtPnkxOwoJCWJsb2Nr
LT54MiA9IG5ld3JlY3QtPngyOwoJCWJsb2NrLT55MiA9IG5ld3JlY3QtPnkyOwoKCQlQb3BwbGVy
UmVjdGFuZ2xlICpsYXN0ID0gTlVMTDsKCQlpZiAoZ19saXN0X2xlbmd0aChibG9ja3MpID4gMCkg
ewoJCQlpbnQgaTsKCQkJZ2Jvb2xlYW4gb3ZlcmxhcCA9ZmFsc2U7CgkJCWZvcihpPTA7IGk8Z19s
aXN0X2xlbmd0aChibG9ja3MpOyBpKyspIHsKCQkJCgkJCQlsYXN0ID0gKFBvcHBsZXJSZWN0YW5n
bGUgKilnX2xpc3RfbnRoX2RhdGEoYmxvY2tzLCBpKTsKCgkJCQlpZiAocmVjdGFuZ2xlX292ZXJs
YXAobGFzdCwgYmxrKSkgeyAvLyBpZiBvdmVybGFwIHRha2UgdGhlIHVuaW9uIG9mIHJlY3Rhbmds
ZXMKCgkJCQkJbGFzdC0+eDEgPSBsYXN0LT54MSA8IGJsay0+eDEgPyBsYXN0LT54MTogYmxrLT54
MTsKCQkJCQlsYXN0LT55MSA9IGxhc3QtPnkxIDwgYmxrLT55MSA/IGxhc3QtPnkxOiBibGstPnkx
OwoJCQkJCWxhc3QtPngyID0gbGFzdC0+eDIgPiBibGstPngyID8gbGFzdC0+eDI6IGJsay0+eDI7
CgkJCQkJbGFzdC0+eTIgPSBsYXN0LT55MiA+IGJsay0+eTIgPyBsYXN0LT55MjogYmxrLT55MjsK
CgkJCQkJb3ZlcmxhcCA9IHRydWU7CgkJCQl9CgkJCX0KCQkJaWYoIW92ZXJsYXApCgkJCQlibG9j
a3MJPSBnX2xpc3RfYXBwZW5kKGJsb2NrcyxibGspOwoJCX0KCQllbHNlIHsgCgkJCWJsb2Nrcwk9
IGdfbGlzdF9hcHBlbmQoYmxvY2tzLGJsayk7CgkJfQoJCQoJCWlmKGZsYWcgJiYgaW5kKQoJCQli
bG9ja3MJPSBnX2xpc3RfYXBwZW5kKGJsb2NrcyxibG9jayk7Cgl9Cn0KCmdib29sZWFuIHlfYXhp
c19vdmVybGFwIChQb3BwbGVyUmVjdGFuZ2xlICphLCBQb3BwbGVyUmVjdGFuZ2xlICpiKQp7Cglp
ZiAoIShhLT54MSA+IGItPngyIHx8IGEtPngyIDwgYi0+eDEpKQoJCXJldHVybiB0cnVlOwoJcmV0
dXJuIGZhbHNlOwp9CgpnYm9vbGVhbiB4X2F4aXNfb3ZlcmxhcCAoUG9wcGxlclJlY3RhbmdsZSAq
YSwgUG9wcGxlclJlY3RhbmdsZSAqYikKewoJaWYgKCEoYS0+eTEgPiBiLT55MiB8fCBhLT55MiA8
IGItPnkxKSkKCQlyZXR1cm4gdHJ1ZTsKCXJldHVybiBmYWxzZTsKfQoKZ2ludCBmaW5kX2NvbHVt
bihQb3BwbGVyUmVjdGFuZ2xlICphKQp7CglpbnQgaTsKCWZvcihpPTA7IGk8cGRmX2NvbHVtbjsg
aSsrKSB7CgkJaWYgKGJsb2NrX292ZXJsYXAoYSwgY29sdW1uX3JlY3RbaV0pKQoJCQlyZXR1cm4g
aTsKCX0KfQoKZ2ludCBzb3J0X2dyb3VwcyhQb3BwbGVyUmVjdGFuZ2xlICphLCBQb3BwbGVyUmVj
dGFuZ2xlICpiKSAKewoJaW50IGMxID0gZmluZF9jb2x1bW4oYSk7CglpbnQgYzIgPSBmaW5kX2Nv
bHVtbihiKTsKCglpZihjMSA8IGMyKSByZXR1cm4gLTE7CglpZihjMSA9PSBjMikgewoJCWlmKGEt
PnkxIDwgYi0+eTEpIHJldHVybiAtMTsKCQllbHNlIGlmKGEtPnkxID09IGItPnkxKSB7CgkJCWlm
KGEtPngxIDwgYi0+eDEpIHJldHVybiAtMTsKCQkJaWYoYS0+eDEgPT0gYi0+eDEpIHJldHVybiAw
OwoJCQlpZihhLT54MSA+IGItPngxKSByZXR1cm4gMTsJCgkJCgkJfSBlbHNlIGlmKGEtPnkxID4g
Yi0+eTEpCgkJICByZXR1cm4gMTsKCX0KCWlmKGMxID4gYzIpIHJldHVybiAxOwp9CgpnaW50IHNv
cnRfeWF4aXMoUG9wcGxlclJlY3RhbmdsZSAqYSwgUG9wcGxlclJlY3RhbmdsZSAqYikgCnsKCWlm
IChhLT55MSA8IGItPnkxKSByZXR1cm4gLTE7IC8vIGEgY29tZXMgYmVmb3JlIGIKCWlmIChhLT55
MSA9PSBiLT55MSkgcmV0dXJuIDA7IC8vIGVxdWFsCglpZiAoYS0+eTEgPiBiLT55MSkgcmV0dXJu
IDE7IC8vIGEgY29tZXMgYWZ0ZXIgYgp9CgovKiBzb3J0IGJsb2NrcyBhY2NvcmRpbmcgdG8gaGVp
Z2h0ICovCmdpbnQgY29tcGFyZV9mdW5jIChQb3BwbGVyUmVjdGFuZ2xlICphLCBQb3BwbGVyUmVj
dGFuZ2xlICpiKQp7CglnZG91YmxlIGhlaWdodEEgPSBhLT55MiAtIGEtPnkxOwoJZ2RvdWJsZSBo
ZWlnaHRCID0gYi0+eTIgLSBiLT55MTsKCglpZiAoaGVpZ2h0QSA+IGhlaWdodEIpIHJldHVybiAt
MTsKCWlmIChoZWlnaHRBID09IGhlaWdodEIpIHJldHVybiAwOwoJaWYgKGhlaWdodEEgPCBoZWln
aHRCKSByZXR1cm4gMTsKfQoKZ2Jvb2xlYW4gcmVjdF9lcXVhbCAoUG9wcGxlclJlY3RhbmdsZSAq
YSwgUG9wcGxlclJlY3RhbmdsZSAqYikKewoJaWYgKGEtPngxID09IGItPngxICYmIGEtPnkxID09
IGItPnkxICYmIGEtPngyID09IGItPngyICYmIGEtPnkyID09IGItPnkyKQoJCXJldHVybiB0cnVl
OwoJcmV0dXJuIGZhbHNlOwp9CgpnYm9vbGVhbiBjaGVja19ncm91cChQb3BwbGVyUmVjdGFuZ2xl
ICpyZWN0LCBQb3BwbGVyUmVjdGFuZ2xlICpncnByZWN0KSAKewoJaWYgKHJlY3QtPnkyIDwgZ3Jw
cmVjdC0+eTEgfHwgcmVjdF9lcXVhbChyZWN0LCBncnByZWN0KSkKCQlyZXR1cm4gdHJ1ZTsKCWVs
c2UKCQlyZXR1cm4gZmFsc2U7Cn0KCmdib29sZWFuIGV4cG9zZV9ldmVudF9jYiAoR3RrV2lkZ2V0
ICp3aWRnZXQsIEdka0V2ZW50RXhwb3NlICpldmVudCwgZ2NoYXIgKmZpbGVuYW1lKQp7CgljYWly
b190ICpjciA9IGdka19jYWlyb19jcmVhdGUgKHdpZGdldC0+d2luZG93KTsKCgljYWlyb19zZXRf
c291cmNlX3JnYiAoY3IsIDEuMCwgMS4wLCAxLjApOwoJY2Fpcm9fcGFpbnQgKGNyKTsKCglHTGlz
dCAqcmVjdHMgPSBOVUxMOwoJY2hhciAqbmZpbGVuYW1lID0gKGNoYXIqKW1hbGxvYyhzdHJsZW4o
ZmlsZW5hbWUpKzgpOwoKCXN0cmNweShuZmlsZW5hbWUsImZpbGU6Ly8iKTsKCXN0cmNhdChuZmls
ZW5hbWUsZmlsZW5hbWUpOwoKCVBvcHBsZXJEb2N1bWVudCAqcG9wcGxlcmRvYzsKCVBvcHBsZXJQ
YWdlCSpwYWdlOwoKCXBvcHBsZXJkb2MJPSBwb3BwbGVyX2RvY3VtZW50X25ld19mcm9tX2ZpbGUo
bmZpbGVuYW1lLE5VTEwsTlVMTCk7CglucGFnZXMJCT0gcG9wcGxlcl9kb2N1bWVudF9nZXRfbl9w
YWdlcyhwb3BwbGVyZG9jKTsKCglpbnQgaSxqOwogCglwYWdlCQk9IHBvcHBsZXJfZG9jdW1lbnRf
Z2V0X3BhZ2UocG9wcGxlcmRvYyxwYWdlX25vKTsKCS8vY2Fpcm9fc2NhbGUgKGNyLCAwLjUsIDAu
NSk7IC8vU0NBTEUsIFNDQUxFKTsKCXBvcHBsZXJfcGFnZV9yZW5kZXIgKHBhZ2UsIGNyKTsKCglk
b3VibGUgdyxoOwoJcG9wcGxlcl9wYWdlX2dldF9zaXplKHBhZ2UsJncsJmgpOwoKCVBvcHBsZXJS
ZWN0YW5nbGUgKnByZWN0ID0gZ19uZXcoUG9wcGxlclJlY3RhbmdsZSwxKTsKCXByZWN0LT54MSA9
IDA7CglwcmVjdC0+eTEgPSAwOwoJcHJlY3QtPngyID0gdzsKCXByZWN0LT55MiA9IGg7CgoJcmVj
dHMJPSBwb3BwbGVyX3BhZ2VfZ2V0X3NlbGVjdGlvbl9yZWdpb24ocGFnZSwxLjAsUE9QUExFUl9T
RUxFQ1RJT05fTElORSxwcmVjdCk7CgoJLyogRklORCBUSEUgQkxPQ0tTICovCglibG9ja3MJPSBO
VUxMOwkKCVBvcHBsZXJSZWN0YW5nbGUgKmJsb2NrID0gTlVMTDsKCglmb3IgKGkgPSAwOyBpIDwg
Z19saXN0X2xlbmd0aCAocmVjdHMpOyBpKyspCgl7CgkJUG9wcGxlclJlY3RhbmdsZSAqIHByID0g
KFBvcHBsZXJSZWN0YW5nbGUgKilnX2xpc3RfbnRoX2RhdGEgKHJlY3RzLCBpKTsKCQlQb3BwbGVy
UmVjdGFuZ2xlICp0ZW1wID0gcG9wcGxlcl9yZWN0YW5nbGVfY29weSAocHIpOwoKCQlpZihibG9j
ayA9PSBOVUxMKSB7CgkJCWJsb2NrID0gdGVtcDsKCQl9CgkJZWxzZSB7CgkJCWlmKGkgIT0gZ19s
aXN0X2xlbmd0aChyZWN0cyktMSkKCQkJCWZpbmRfYmxvY2soYmxvY2ssIHRlbXAsIEZBTFNFKTsK
CQkJZWxzZQoJCQkJZmluZF9ibG9jayhibG9jaywgdGVtcCwgVFJVRSk7CgkJfQoJfSAvKiBFTkQg
T0YgRklORElORyBCTE9DS1MgKi8KCQoKCS8qIEZJTkQgUEFHRSBCT1VOREFSWSAqLwoJZG91Ymxl
IHhtaW4gPSAyMDAwLHltaW4gPSAyMDAwICwgeG1heCA9IDAseW1heCA9IDA7CglpbnQgbWlueF9p
bmRleCA9IGdfbGlzdF9sZW5ndGggKGJsb2Nrcyk7CglpbnQgbWF4eF9pbmRleCA9IDA7CglpbnQg
ZmFjdG9yID0gMDsKCglpZihibG9ja3MgIT0gTlVMTCkgewoKCQlmb3IgKGkgPSAwOyBpIDwgZ19s
aXN0X2xlbmd0aCAoYmxvY2tzKTsgaSsrKQoJCXsKCQkJUG9wcGxlclJlY3RhbmdsZSAqIHByID0g
KFBvcHBsZXJSZWN0YW5nbGUgKilnX2xpc3RfbnRoX2RhdGEgKGJsb2NrcywgaSk7CgoJCQlpZih4
bWluID4gcHItPngxKSB7IHhtaW4gPSBwci0+eDE7IG1pbnhfaW5kZXggPSBpOyB9CgkJCWlmKHlt
aW4gPiBwci0+eTEpIHsgeW1pbiA9IHByLT55MTsgfQoJCQlpZih4bWF4IDwgcHItPngyKSB7IHht
YXggPSBwci0+eDI7IG1heHhfaW5kZXggPSBpOyB9CgkJCWlmKHltYXggPCBwci0+eTIpIHsgeW1h
eCA9IHByLT55MjsgfQoJCX0KCgkJUG9wcGxlclJlY3RhbmdsZSAqbWlueGJsb2NrID0gKFBvcHBs
ZXJSZWN0YW5nbGUgKikgZ19saXN0X250aF9kYXRhIChibG9ja3MsIG1pbnhfaW5kZXgpOwoJCWlm
ICgobWlueGJsb2NrLT55MiAtIG1pbnhibG9jay0+eTEpIDwgNTApIHsKCgkJCVBvcHBsZXJSZWN0
YW5nbGUgKnRlbXAgPSBnX25ldyAoUG9wcGxlclJlY3RhbmdsZSwgMSk7CgkJCWZvcihpPXhtaW47
IGk8KHhtaW4rKG1pbnhibG9jay0+eDIgLSBtaW54YmxvY2stPngxKSk7IGkrKykgewoKCQkJCXRl
bXAtPngxID0geG1pbjsKCQkJCXRlbXAtPngyID0gaTsKCQkJCXRlbXAtPnkxID0gbWlueGJsb2Nr
LT55MTsKCQkJCXRlbXAtPnkyID0gbWlueGJsb2NrLT55MjsKCgkJCQlpbnQgb3ZlcmxhcCA9IDA7
CgkJCQlmb3Ioaj0wOyBqPGdfbGlzdF9sZW5ndGgoYmxvY2tzKTsgaisrKSB7CgkJCQkJUG9wcGxl
clJlY3RhbmdsZSAqcHIgPSAoUG9wcGxlclJlY3RhbmdsZSAqKSBnX2xpc3RfbnRoX2RhdGEgKGJs
b2Nrcywgaik7CgkJCQkJaWYgKHlfYXhpc19vdmVybGFwKHRlbXAsIHByKSkgewoJCQkJCQlvdmVy
bGFwKys7CgkJCQkJfQoJCQkJCWlmIChvdmVybGFwID4gMSkKCQkJCQkJYnJlYWs7CgkJCQl9CgkJ
CQlpZiAob3ZlcmxhcCA+IDEpIHsKCQkJCQlmYWN0b3IgPSBpIC0geG1pbjsKCQkJCQlicmVhazsK
CQkJCX0KCQkJfQoJCX0KCQlQb3BwbGVyUmVjdGFuZ2xlICptYXh4YmxvY2sgPSAoUG9wcGxlclJl
Y3RhbmdsZSAqKSBnX2xpc3RfbnRoX2RhdGEgKGJsb2NrcywgbWF4eF9pbmRleCk7CgkJaWYgKCht
YXh4YmxvY2stPnkyIC0gbWF4eGJsb2NrLT55MSkgPCA1MCkgewoKCQkJUG9wcGxlclJlY3Rhbmds
ZSAqdGVtcCA9IGdfbmV3IChQb3BwbGVyUmVjdGFuZ2xlLCAxKTsKCQkJZm9yKGk9eG1heDsgaT5t
YXh4YmxvY2stPngxOyBpLS0pIHsKCgkJCQl0ZW1wLT54MSA9IGk7CgkJCQl0ZW1wLT54MiA9IHht
YXg7CgkJCQl0ZW1wLT55MSA9IG1pbnhibG9jay0+eTE7CgkJCQl0ZW1wLT55MiA9IG1pbnhibG9j
ay0+eTI7CgoJCQkJaW50IG92ZXJsYXAgPSAwOwoJCQkJZm9yKGo9MDsgajxnX2xpc3RfbGVuZ3Ro
KGJsb2Nrcyk7IGorKykgewoJCQkJCVBvcHBsZXJSZWN0YW5nbGUgKnByID0gKFBvcHBsZXJSZWN0
YW5nbGUgKikgZ19saXN0X250aF9kYXRhIChibG9ja3MsIGopOwoJCQkJCWlmICh5X2F4aXNfb3Zl
cmxhcCh0ZW1wLCBwcikpIHsKCQkJCQkJb3ZlcmxhcCsrOwoJCQkJCX0KCQkJCQlpZiAob3Zlcmxh
cCA+IDEpCgkJCQkJCWJyZWFrOwoJCQkJfQoJCQkJaWYgKG92ZXJsYXAgPiAxKSB7CgkJCQkJZmFj
dG9yID0gZmFjdG9yICsgeG1heCAtIGk7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9Cgl9IC8q
IEVORCBPRiBGSU5ESU5HIFBBR0UgQk9VTkRBUlkgKi8KCgoJLyogRklORCBUSEUgQ09MVU1OIE9G
IFRIRSBQQUdFKi8KCWdkb3VibGUgcGFnZV93aWR0aCA9ICh4bWF4IC0geG1pbik7CglnZG91Ymxl
IHBhZ2VfaGVpZ2h0PSAoeW1heCAtIHltaW4pOwoKCWJsb2NrcyA9IGdfbGlzdF9zb3J0IChibG9j
a3MsIChHQ29tcGFyZUZ1bmMpIGNvbXBhcmVfZnVuYyk7CgoJaW50IGsgPSAwOwoJaW50IG4gPSAy
OwoJZm9yKGs9MDsgazxnX2xpc3RfbGVuZ3RoKGJsb2Nrcyk7IGsrKykgewoJCVBvcHBsZXJSZWN0
YW5nbGUgKnRtcCA9IChQb3BwbGVyUmVjdGFuZ2xlICopZ19saXN0X250aF9kYXRhIChibG9ja3Ms
IGspOwoJCWdkb3VibGUgd2lkdGggPSAodG1wLT54MiAtIHRtcC0+eDEpOwoJCWlmICggd2lkdGgg
PD0gNTApIHsKCQkJY29udGludWU7CgkJfQoJCW4gPSAyOwoJCXdoaWxlIChuKndpZHRoIDwgcGFn
ZV93aWR0aCkgCgkJCW4rKzsKCQlicmVhazsKCX0gLyogRU5EIE9GIEZJTkRJTkcgQ09MVU1OIE9G
IFRIRSBCTE9DSyAqLwoKCXBkZl9jb2x1bW4gPSBuLTE7IC8vIHNldCB0aGUgbnVtIGNvbHVtbnMg
aW4gdGhlIGRvY3VtZW50CgoJcHJpbnRmKCJcbiBwZGYgY29sdW1uID0gJWQgXG4iLCBwZGZfY29s
dW1uKTsKCgkvKiBVTklPTiBUSE9TRSBTTUFMTCBCTE9DS1MgSU4gU0lOR0xFIENPTFVNTiovCglp
ZiAobi0xID09IDEpIHsgLy9zaW5nbGUgY29sdW1uCgoJCWZvcihpPTA7IGk8Z19saXN0X2xlbmd0
aChibG9ja3MpOyBpKyspIHsKCQkJUG9wcGxlclJlY3RhbmdsZSAqcHIxID0gKFBvcHBsZXJSZWN0
YW5nbGUgKilnX2xpc3RfbnRoX2RhdGEgKGJsb2NrcywgaSk7CgkJCWZvcihqPTA7IGo8Z19saXN0
X2xlbmd0aChibG9ja3MpOyBqKyspIHsKCQkJCVBvcHBsZXJSZWN0YW5nbGUgKnByMiA9IChQb3Bw
bGVyUmVjdGFuZ2xlICopZ19saXN0X250aF9kYXRhIChibG9ja3MsIGopOwoKCQkJCWlmICh4X2F4
aXNfb3ZlcmxhcChwcjEscHIyKSkgeyAvLyBVTklPTiBUSE9TRSBCTE9DS1MKCgkJCQkJcHIxLT54
MSA9IHByMi0+eDEgPSBwcjEtPngxIDwgcHIyLT54MSA/IHByMS0+eDEgOiBwcjItPngxOwoJCQkJ
CXByMS0+eTEgPSBwcjItPnkxID0gcHIxLT55MSA8IHByMi0+eTEgPyBwcjEtPnkxIDogcHIyLT55
MTsKCQkJCQlwcjEtPngyID0gcHIyLT54MiA9IHByMS0+eDIgPiBwcjItPngyID8gcHIxLT54MiA6
IHByMi0+eDI7CgkJCQkJcHIxLT55MiA9IHByMi0+eTIgPSBwcjEtPnkyID4gcHIyLT55MiA/IHBy
MS0+eTIgOiBwcjItPnkyOwoJCQkJfQoJCQl9CgkJfQoJfSAvKkVORCBPRiBVTklPTiBTTUFMTCBC
TE9DS1MgSU4gU0lOR0xFIENPTFVNTiovCgoJZmFjdG9yID0gMDsKCXByaW50ZigiXG4gZmFjdG9y
ID0gJWQgXG4iLCBmYWN0b3IpOwoJLyogU0VUIFRIRSBCT1VOREFSSUVTIEZPUiBNVUxUSUNPTFVN
TlMqLwoJZ2RvdWJsZSBjb2xfd2lkdGggPSAocGFnZV93aWR0aCAtIGZhY3RvcikvKG4tMSk7Cglj
b2x1bW5fcmVjdCA9IGdfbmV3IChQb3BwbGVyUmVjdGFuZ2xlKiwgbi0xKTsKCXhtaW4gKz0gZmFj
dG9yOwoJZm9yIChpPTA7IGk8bi0xOyBpKyspIHsKCQljb2x1bW5fcmVjdFtpXSA9IGdfbmV3IChQ
b3BwbGVyUmVjdGFuZ2xlLCAxKTsKCQljb2x1bW5fcmVjdFtpXS0+eDEgPSB4bWluOwoJCWNvbHVt
bl9yZWN0W2ldLT55MSA9IHltaW47CgkJY29sdW1uX3JlY3RbaV0tPngyID0geG1pbitjb2xfd2lk
dGg7CgkJY29sdW1uX3JlY3RbaV0tPnkyID0geW1heDsKCQl4bWluID0geG1pbitjb2xfd2lkdGg7
CgoJCWlmIChpICUgcGRmX2NvbHVtbiA9PSAwKQoJCQljYWlyb19zZXRfc291cmNlX3JnYmEgKGNy
LCAxLjAsIDAuMCwgMC4wLCAwLjMpOwoJCWlmIChpICUgcGRmX2NvbHVtbiA9PSAxKQoJCQljYWly
b19zZXRfc291cmNlX3JnYmEgKGNyLCAwLjAsIDAuMCwgMS4wLCAwLjMpOwoJCWVsc2UgCgkJCWNh
aXJvX3NldF9zb3VyY2VfcmdiYSAoY3IsIDAuMCwgMS4wLCAwLjAsIDAuMyk7CgoJCS8qY2Fpcm9f
cmVjdGFuZ2xlIChjciwKCQljb2x1bW5fcmVjdFtpXS0+eDEsCgkJY29sdW1uX3JlY3RbaV0tPnkx
LAoJCWNvbHVtbl9yZWN0W2ldLT54MiAtIGNvbHVtbl9yZWN0W2ldLT54MSwKCQljb2x1bW5fcmVj
dFtpXS0+eTIgLSBjb2x1bW5fcmVjdFtpXS0+eTEpOwoJCWNhaXJvX2ZpbGwgKGNyKTsqLwoKCQkK
CX0gLypFTkQgT0YgU0VUVElORyBCT1VOREFSSUVTIEZPUiBNVUxUSUNPTFVNTiovCgoKCS8qIFVO
SU9OIFNNQUxMIEJMT0NLUyBJTiBNVUxUSUNPTFVNTiBQQUdFICovCglpbnQgY29sdW1uMSA9IDAs
IGNvbHVtbjIgPSAwOwoKCWZvciAoaSA9IDA7IGkgPCBnX2xpc3RfbGVuZ3RoIChibG9ja3MpOyBp
KyspCgl7CgkJUG9wcGxlclJlY3RhbmdsZSAqIHByMSA9IChQb3BwbGVyUmVjdGFuZ2xlICopZ19s
aXN0X250aF9kYXRhIChibG9ja3MsIGkpOwoJCWZvciAoaj0wOyBqPG4tMTsgaisrKSB7CgkJCgkJ
CWlmIChwcjEtPngxID49IGNvbHVtbl9yZWN0W2pdLT54MSAmJiBwcjEtPngyIDw9IGNvbHVtbl9y
ZWN0W2pdLT54MikgewkgCgkJCQljb2x1bW4xID0gajsgYnJlYWs7CgkJCX0KCQl9CgoJCWZvciAo
ayA9IDA7IGsgPCBnX2xpc3RfbGVuZ3RoIChibG9ja3MpOyBrKyspCgkJewoJCQlQb3BwbGVyUmVj
dGFuZ2xlICogcHIyID0gKFBvcHBsZXJSZWN0YW5nbGUgKilnX2xpc3RfbnRoX2RhdGEgKGJsb2Nr
cywgayk7CgkJCWlmIChpICE9IGspIHsKCQkJCWZvciAoaj0wOyBqPG4tMTsgaisrKSB7CgkJCQoJ
CQkJCWlmIChwcjItPngxID49IGNvbHVtbl9yZWN0W2pdLT54MSAmJiBwcjItPngyIDw9IGNvbHVt
bl9yZWN0W2pdLT54MikgewkgCgkJCQkJCWNvbHVtbjIgPSBqOyBicmVhazsKCQkJCQl9CgkJCQl9
CgkJCQlpZiAoY29sdW1uMSA9PSBjb2x1bW4yKSB7CgoJCQkJCWlmICh4X2F4aXNfb3ZlcmxhcChw
cjEscHIyKSkgewoKCQkJCQkJcHIxLT54MSA9IHByMi0+eDEgPSBwcjEtPngxIDwgcHIyLT54MSA/
IHByMS0+eDEgOiBwcjItPngxOwoJCQkJCQlwcjEtPnkxID0gcHIyLT55MSA9IHByMS0+eTEgPCBw
cjItPnkxID8gcHIxLT55MSA6IHByMi0+eTE7CgkJCQkJCXByMS0+eDIgPSBwcjItPngyID0gcHIx
LT54MiA+IHByMi0+eDIgPyBwcjEtPngyIDogcHIyLT54MjsKCQkJCQkJcHIxLT55MiA9IHByMi0+
eTIgPSBwcjEtPnkyID4gcHIyLT55MiA/IHByMS0+eTIgOiBwcjItPnkyOwoJCQkJCX0KCQkJCX0K
CQkJfQoJCX0KCX0gLyogRU5EIE9GIFVOSU9OIFNNQUxMIEJMT0NLUyBJTiBNVUxUSUNPTFVNTiBQ
QUdFICovCgoJLyogRklORCBUSEUgSU5URVJTRUNUSU9OIEJMT0NLUyBBTkQgU0VUIFRIRSBHUk9V
UFMgQUNDT1JESU5HIFRPIFRIT1NFIFBPSU5UUyovCgkvKiBGaW5kIHRoZSBpbnRlcnNlY3Rpb24g
UG9pbnRzICovCglpbnQgbnVtX2lwcyA9IDE7CglHTGlzdCAqaW50ZXJzZWN0aW9uX2Jsb2NrcyA9
IE5VTEw7Cglmb3IgKGk9MDsgaTxnX2xpc3RfbGVuZ3RoKGJsb2Nrcyk7IGkrKykgewoJCgkJUG9w
cGxlclJlY3RhbmdsZSAqIHByID0gKFBvcHBsZXJSZWN0YW5nbGUgKilnX2xpc3RfbnRoX2RhdGEg
KGJsb2NrcywgaSk7CgkJY29sdW1uMSA9IC0xOwoJCWZvciAoaj0wOyBqPG4tMTsgaisrKSB7CgkJ
CgkJCWlmIChwci0+eDEgPj0gY29sdW1uX3JlY3Rbal0tPngxICYmIHByLT54MiA8PSBjb2x1bW5f
cmVjdFtqXS0+eDIpIHsJIAoJCQkJY29sdW1uMSA9IGo7IGJyZWFrOwoJCQl9CgkJfQoJCWlmIChj
b2x1bW4xID09IC0xKSB7CgkJCWludGVyc2VjdGlvbl9ibG9ja3MgPSBnX2xpc3RfYXBwZW5kIChp
bnRlcnNlY3Rpb25fYmxvY2tzLCBwcik7CgkJCW51bV9pcHMrKzsKCQl9Cgl9CgoJUG9wcGxlclJl
Y3RhbmdsZSAqbGFzdGdyb3VwID0gZ19uZXcgKFBvcHBsZXJSZWN0YW5nbGUsIDEpOwoJbGFzdGdy
b3VwLT54MSA9IDA7CglsYXN0Z3JvdXAtPnkxID0gMipwYWdlX2hlaWdodDsKCWxhc3Rncm91cC0+
eDIgPSBwYWdlX3dpZHRoOwoJbGFzdGdyb3VwLT55MiA9IDIqcGFnZV9oZWlnaHQ7CgoJaW50ZXJz
ZWN0aW9uX2Jsb2NrcyA9IGdfbGlzdF9hcHBlbmQgKGludGVyc2VjdGlvbl9ibG9ja3MsIGxhc3Rn
cm91cCk7CgoJaWYgKGludGVyc2VjdGlvbl9ibG9ja3MpCgkJaW50ZXJzZWN0aW9uX2Jsb2NrcyA9
IGdfbGlzdF9zb3J0IChpbnRlcnNlY3Rpb25fYmxvY2tzLCAoR0NvbXBhcmVGdW5jKSBzb3J0X3lh
eGlzKTsKCQoJR0xpc3QgKipncm91cHMgPSBnX25ldyAoR0xpc3QqLCBudW1faXBzKTsKCWZvciAo
aT0wOyBpPG51bV9pcHM7IGkrKykgewoJCWdyb3Vwc1tpXSA9IE5VTEw7CgkJUG9wcGxlclJlY3Rh
bmdsZSAqIHByID0gKFBvcHBsZXJSZWN0YW5nbGUgKilnX2xpc3RfbnRoX2RhdGEgKGludGVyc2Vj
dGlvbl9ibG9ja3MsIGkpOwoJfQoKCgkvKiBUYWtlIHRoZSBibG9jayBmaW5kIHRoZSBhcHByb3By
aWF0ZSBncm91cCAqLwoJaWYgKGludGVyc2VjdGlvbl9ibG9ja3MpIHsKCgkJZm9yIChpPTA7IGk8
Z19saXN0X2xlbmd0aChibG9ja3MpOyBpKyspIHsKCQkKCQkJaW50IGdyb3VwID0gLTE7CgkJCVBv
cHBsZXJSZWN0YW5nbGUgKiBwciA9IChQb3BwbGVyUmVjdGFuZ2xlICopZ19saXN0X250aF9kYXRh
IChibG9ja3MsIGkpOwoJCQlQb3BwbGVyUmVjdGFuZ2xlICp0ZW1wID0gcG9wcGxlcl9yZWN0YW5n
bGVfY29weSAocHIpOwoJCQlmb3IgKGo9MDsgajxudW1faXBzOyBqKyspIHsKCQkJCVBvcHBsZXJS
ZWN0YW5nbGUgKmdycF9yZWN0ID0gKFBvcHBsZXJSZWN0YW5nbGUgKilnX2xpc3RfbnRoX2RhdGEg
KGludGVyc2VjdGlvbl9ibG9ja3MsIGopOwoJCQkJaWYgKGNoZWNrX2dyb3VwKHByLCBncnBfcmVj
dCkpIHsKCQkJCQlncm91cCA9IGo7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQkJaWYgKGdyb3Vw
ICE9IC0xKQoJCQkJZ3JvdXBzW2dyb3VwXSA9IGdfbGlzdF9hcHBlbmQgKGdyb3Vwc1tncm91cF0s
IHRlbXApOwoJCX0KCX0KCWVsc2UgewoJCWZvciAoaT0wOyBpPG51bV9pcHM7IGkrKykgewoKCQkJ
UG9wcGxlclJlY3RhbmdsZSAqIHByID0gKFBvcHBsZXJSZWN0YW5nbGUgKilnX2xpc3RfbnRoX2Rh
dGEgKGJsb2NrcywgaSk7CgkJCVBvcHBsZXJSZWN0YW5nbGUgKnRlbXAgPSBwb3BwbGVyX3JlY3Rh
bmdsZV9jb3B5IChwcik7CgkJCWdyb3Vwc1tpXSA9IGdfbGlzdF9hcHBlbmQgKGdyb3Vwc1tpXSwg
dGVtcCk7CgkJfQoJfQoJLypFTkQgT0YgRklORElORyBJTlRFUlNFQ1RJT04gQkxPQ0tTIEFORCBB
UlJBTkdFIFRIRSBCTE9DS1MgQUNDT1JESU5HIFRPIEdST1VQUyovCgkKCQoJLyogU29ydCBpbmRp
dmlkdWFsIGdyb3VwcyB3aXRoaW4gKi8KCWZvciAoaT0wOyBpPG51bV9pcHM7IGkrKykgewoJCWdy
b3Vwc1tpXSA9IGdfbGlzdF9zb3J0IChncm91cHNbaV0sIChHQ29tcGFyZUZ1bmMpIHNvcnRfZ3Jv
dXBzKTsKCX0KCgkvKiBNRVJHRSBUSEUgQUxMIEdST1VQUyBJTiBUTyBTSU5HTEUqLwoJYmxvY2tz
ID0gTlVMTDsKCWZvciAoaT0wOyBpPG51bV9pcHM7IGkrKykgewoJCWlmIChncm91cHNbaV0pIHsK
CQkJaWYgKGJsb2NrcyA9PSBOVUxMKSB7CgkJCQlibG9ja3MgPSBncm91cHNbaV07CgkJCX0KCQkJ
ZWxzZSB7CgkJCQlibG9ja3MgPSBnX2xpc3RfY29uY2F0IChibG9ja3MsIGdyb3Vwc1tpXSk7CgkJ
CX0KCQl9Cgl9IC8qRU5EIE9GIE1FUkdJTkcgQkxPQ0tTKi8KCgkvKiBSRU1PVkUgUkVQRVRJVElP
TiBCTE9DS1MqLwoJR0xpc3QgKm1lcmdlZF9ibG9ja3MgPSBOVUxMOwkKCWZvciAoaT0wOyBpPGdf
bGlzdF9sZW5ndGgoYmxvY2tzKTsgaSsrKSB7CgoJCVBvcHBsZXJSZWN0YW5nbGUgKiBwcjEgPSAo
UG9wcGxlclJlY3RhbmdsZSAqKWdfbGlzdF9udGhfZGF0YSAoYmxvY2tzLCBpKTsKCQlnYm9vbGVh
biBpbmQgPSBmYWxzZTsKCQlmb3Ioaj1pKzE7IGo8Z19saXN0X2xlbmd0aChibG9ja3MpOyBqKysp
IHsKCQkJUG9wcGxlclJlY3RhbmdsZSAqIHByMiA9IChQb3BwbGVyUmVjdGFuZ2xlICopZ19saXN0
X250aF9kYXRhIChibG9ja3MsIGopOwoKCQkJaWYgKHJlY3RfZXF1YWwgKHByMSwgcHIyKSAmJiBp
IT1qKSB7CgkJCQlpbmQgPSB0cnVlOwoJCQl9CgkJfQoJCWlmKCFpbmQpCgkJCW1lcmdlZF9ibG9j
a3MgPSBnX2xpc3RfYXBwZW5kKG1lcmdlZF9ibG9ja3MsIHByMSk7Cgl9IC8qIEVORCBPRiBSRU1P
VklORyBSRVBFVElUSU9OIEJMT0NLUyovCgoJLyogRElTUExBWSBUSEUgQk9VTkRBUklFUyBPRiBT
T1JURUQgQkxPQ0tTKi8KCWNoYXIgbnVtIFs2XTsKCVBhbmdvTGF5b3V0ICpsYXlvdXQ7CglQYW5n
b0ZvbnREZXNjcmlwdGlvbiAqZGVzYzsKCVBhbmdvQ29udGV4dCAqY29udGV4dDsKCglmb3IgKGkg
PSAwOyBpIDwgZ19saXN0X2xlbmd0aCAobWVyZ2VkX2Jsb2Nrcyk7IGkrKykKCXsKCQlQb3BwbGVy
UmVjdGFuZ2xlICogcHIgPSAoUG9wcGxlclJlY3RhbmdsZSAqKWdfbGlzdF9udGhfZGF0YSAobWVy
Z2VkX2Jsb2NrcywgaSk7CgkJCgkJY2Fpcm9fc2V0X3NvdXJjZV9yZ2JhIChjciwgMC4wLCAxLjAs
IDAuMCwgMC4zKTsKCgkJY2Fpcm9fcmVjdGFuZ2xlIChjciwKCQlwci0+eDEsCgkJcHItPnkxLAoJ
CXByLT54MiAtIHByLT54MSwKCQlwci0+eTIgLSBwci0+eTEpOwoJCWNhaXJvX2ZpbGwgKGNyKTsK
CQkKCQlzcHJpbnRmIChudW0sICIlZCIsIGkrMSk7CgkJY2Fpcm9fc2V0X3NvdXJjZV9yZ2JhIChj
ciwgMC4wLCAwLjAsIDAuMCwgMS4wKTsKCQljb250ZXh0ID0gcGFuZ29fY2Fpcm9fY3JlYXRlX2Nv
bnRleHQgKGNyKTsKCQlsYXlvdXQgPSBwYW5nb19sYXlvdXRfbmV3IChjb250ZXh0KTsKCQlwYW5n
b19sYXlvdXRfc2V0X3RleHQgKGxheW91dCwgbnVtLCAtMSk7CgkJZGVzYyA9IHBhbmdvX2ZvbnRf
ZGVzY3JpcHRpb25fZnJvbV9zdHJpbmcgKCJzYW5zIDE1Iik7CgkJcGFuZ29fbGF5b3V0X3NldF9m
b250X2Rlc2NyaXB0aW9uIChsYXlvdXQsIGRlc2MpOwoJCXBhbmdvX2ZvbnRfZGVzY3JpcHRpb25f
ZnJlZSAoZGVzYyk7CgkJY2Fpcm9fbW92ZV90byAoY3IsIHByLT54MSArKHByLT54MiAtIHByLT54
MSkvMi4wLCBwci0+eTEgKyAocHItPnkyIC0gcHItPnkxKS8yLjApOwoJCXBhbmdvX2NhaXJvX2xh
eW91dF9wYXRoIChjciwgbGF5b3V0KTsKCQljYWlyb19maWxsIChjcik7Cgl9IC8qIEVORCBPRiBE
SVNQTEFZKi8KCgljYWlyb19kZXN0cm95IChjcik7CgoJcG9wcGxlcl9wYWdlX3NlbGVjdGlvbl9y
ZWdpb25fZnJlZShyZWN0cyk7CgoJZ19vYmplY3RfdW5yZWYgKHBhZ2UpOwoJZ19vYmplY3RfdW5y
ZWYgKHBvcHBsZXJkb2MpOwoKCXJldHVybiBUUlVFOwp9CgpnYm9vbGVhbgpidXR0b25fcHJlc3Nf
ZXZlbnRfY2IgKEd0a1dpZGdldCAqd2lkZ2V0LCBHZGtFdmVudEJ1dHRvbiAqZXZlbnQsIGdjaGFy
ICpmaWxlbmFtZSkKewoJY2Fpcm9fdCAqY3IgPSBnZGtfY2Fpcm9fY3JlYXRlICh3aWRnZXQtPndp
bmRvdyk7CgoJY2Fpcm9fc2V0X3NvdXJjZV9yZ2IgKGNyLCAxLjAsIDEuMCwgMS4wKTsKCWNhaXJv
X3BhaW50IChjcik7CgoJR0xpc3QgKnJlY3RzID0gTlVMTDsKCWNoYXIgKm5maWxlbmFtZSA9IChj
aGFyKiltYWxsb2Moc3RybGVuKGZpbGVuYW1lKSs4KTsKCglzdHJjcHkobmZpbGVuYW1lLCJmaWxl
Oi8vIik7CglzdHJjYXQobmZpbGVuYW1lLGZpbGVuYW1lKTsKCglQb3BwbGVyRG9jdW1lbnQgKnBv
cHBsZXJkb2M7CglQb3BwbGVyUGFnZQkqcGFnZTsKCXBvcHBsZXJkb2MJPSBwb3BwbGVyX2RvY3Vt
ZW50X25ld19mcm9tX2ZpbGUobmZpbGVuYW1lLE5VTEwsTlVMTCk7CglwYWdlCQk9IHBvcHBsZXJf
ZG9jdW1lbnRfZ2V0X3BhZ2UocG9wcGxlcmRvYyxwYWdlX25vKTsKCXBvcHBsZXJfcGFnZV9yZW5k
ZXIgKHBhZ2UsIGNyKTsKCWNhaXJvX2Rlc3Ryb3kgKGNyKTsKCglnX29iamVjdF91bnJlZiAocGFn
ZSk7CglnX29iamVjdF91bnJlZiAocG9wcGxlcmRvYyk7CgkKCXJldHVybiBUUlVFOwoKfQp2b2lk
IGJ1dHRvbjFfY2xpY2tlZCAoR3RrQnV0dG9uICpidXR0b24sIEd0a1dpZGdldCAqZHJhdykKewoJ
aWYgKHBhZ2Vfbm8gPiAwKQoJewoJCXBhZ2Vfbm8tLTsKCQlndGtfd2lkZ2V0X3F1ZXVlX2RyYXcg
KGRyYXcpOwoJfQp9Cgp2b2lkIGJ1dHRvbjJfY2xpY2tlZCAoR3RrQnV0dG9uICpidXR0b24sIEd0
a1dpZGdldCAqZHJhdykKewoJaWYgKHBhZ2Vfbm8gPCBucGFnZXMtMSkKCXsKCQlwYWdlX25vKys7
CgkJZ3RrX3dpZGdldF9xdWV1ZV9kcmF3IChkcmF3KTsKCX0KfQoKdm9pZCBidXR0b24zX2NsaWNr
ZWQgKEd0a0J1dHRvbiAqYnV0dG9uLCBHdGtXaWRnZXQgKmRyYXcpCnsKCWRvdWJsZSB4LHkseHcs
eXc7CgoJLy9wcmludGYoIkVudGVyIHRoZSByZWN0YW5nbGUgIHggLCB5ICwgeHcsIHl3ICIpOwoJ
c2NhbmYoIiVsZiVsZiVsZiVsZiIsJngsJnksJnh3LCZ5dyk7CgljYWlyb190ICpjciA9IGdka19j
YWlyb19jcmVhdGUgKGRyYXctPndpbmRvdyk7CgljYWlyb19zZXRfc291cmNlX3JnYmEgKGNyLCAw
LjAsIDAuMCwgMS4wLCAwLjIpOwoJY2Fpcm9fcmVjdGFuZ2xlIChjciwgeCwgeSwgeHcsIHl3KTsK
CWNhaXJvX2ZpbGwgKGNyKTsKCWNhaXJvX2Rlc3Ryb3kgKGNyKTsKLy8JZ3RrX3dpZGdldF9xdWV1
ZV9kcmF3IChkcmF3KTsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CgoJZ190
eXBlX2luaXQoKTsKCQoJZ3RrX2luaXQgKCZhcmdjLCAmYXJndik7CglHdGtXaWRnZXQgKndpbmRv
dyA9IGd0a193aW5kb3dfbmV3IChHVEtfV0lORE9XX1RPUExFVkVMKTsKCUd0a1dpZGdldCAqZHJh
dyA9IGd0a19kcmF3aW5nX2FyZWFfbmV3ICgpOwoJR3RrV2lkZ2V0ICp2Ym94ID0gZ3RrX3Zib3hf
bmV3ICgwLCAwKTsKCUd0a1dpZGdldCAqaGJveCA9IGd0a19oYm94X25ldyAoMCwgMCk7CglHdGtX
aWRnZXQgKmJ1dHRvbjEgPSBndGtfYnV0dG9uX25ld193aXRoX2xhYmVsICgiPDwiKTsKCUd0a1dp
ZGdldCAqYnV0dG9uMiA9IGd0a19idXR0b25fbmV3X3dpdGhfbGFiZWwgKCI+PiIpOwoJR3RrV2lk
Z2V0ICpidXR0b24zID0gZ3RrX2J1dHRvbl9uZXdfd2l0aF9sYWJlbCAoIkZpbmQgQmxvY2siKTsK
CglndGtfYm94X3BhY2tfc3RhcnQgKEdUS19CT1ggKHZib3gpLCBkcmF3LCAwLCAwLCAwKTsKCWd0
a19ib3hfcGFja19zdGFydCAoR1RLX0JPWCAodmJveCksIGhib3gsIDAsIDAsIDApOwoJCglndGtf
Ym94X3BhY2tfZW5kIChHVEtfQk9YIChoYm94KSwgYnV0dG9uMiwgMCwgMCwgMTApOwoJZ3RrX2Jv
eF9wYWNrX2VuZCAoR1RLX0JPWCAoaGJveCksIGJ1dHRvbjEsIDAsIDAsIDEwKTsKCWd0a19ib3hf
cGFja19lbmQgKEdUS19CT1ggKGhib3gpLCBidXR0b24zLCAwLCAwLCAxMCk7CgoJZ3RrX3dpbmRv
d19zZXRfZGVmYXVsdF9zaXplIChHVEtfV0lORE9XICh3aW5kb3cpLCA2MTIsIDc5Mik7CglndGtf
d2lkZ2V0X3NldF9zaXplX3JlcXVlc3QgKGRyYXcsIDYxMiwgNzkyKTsKCglndGtfY29udGFpbmVy
X2FkZCAoR1RLX0NPTlRBSU5FUiAod2luZG93KSwgdmJveCk7CglwYWdlX25vID0gMDsKCglndGtf
d2lkZ2V0X3Nob3dfYWxsICh3aW5kb3cpOwoKCWdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChk
cmF3KSwgImV4cG9zZS1ldmVudCIsIEdfQ0FMTEJBQ0sgKGV4cG9zZV9ldmVudF9jYiksIGFyZ3Yg
WzFdKTsKCWdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChkcmF3KSwgImJ1dHRvbi1wcmVzcy1l
dmVudCIsIEdfQ0FMTEJBQ0sgKGJ1dHRvbl9wcmVzc19ldmVudF9jYiksIGFyZ3YgWzFdKTsKCWd0
a193aWRnZXRfYWRkX2V2ZW50cyAoZHJhdywgR0RLX0FMTF9FVkVOVFNfTUFTSyk7CglnX3NpZ25h
bF9jb25uZWN0IChHX09CSkVDVCAod2luZG93KSwgImRlc3Ryb3kiLCBndGtfbWFpbl9xdWl0LCBO
VUxMKTsKCWdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChidXR0b24xKSwgImNsaWNrZWQiLCBH
X0NBTExCQUNLIChidXR0b24xX2NsaWNrZWQpLCBkcmF3KTsKCWdfc2lnbmFsX2Nvbm5lY3QgKEdf
T0JKRUNUIChidXR0b24yKSwgImNsaWNrZWQiLCBHX0NBTExCQUNLIChidXR0b24yX2NsaWNrZWQp
LCBkcmF3KTsKCWdfc2lnbmFsX2Nvbm5lY3QgKEdfT0JKRUNUIChidXR0b24zKSwgImNsaWNrZWQi
LCBHX0NBTExCQUNLIChidXR0b24zX2NsaWNrZWQpLCBkcmF3KTsKCQoJZ3RrX21haW4gKCk7CQp9
Cg==
--001636d34ceb468fe3048c5f45b2--


More information about the poppler mailing list