LyoKICAgIERyaXZlciBmb3IgU1QgU1RWMDI5OSBkZW1vZHVsYXRvcgoKICAgIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIENvbnZlcmdlbmNlIEludGVncmF0ZWQgTWVkaWEgR21iSAoJPHJhbHBoQGNvbnZlcmdlbmNlLmRlPiwKCTxob2xnZXJAY29udmVyZ2VuY2UuZGU+LAoJPGpzQGNvbnZlcmdlbmNlLmRlPgoKCiAgICBQaGlsaXBzIFNVMTI3OC9TSAoKICAgIENvcHlyaWdodCAoQykgMjAwMiBieSBQZXRlciBTY2hpbGRtYW5uIDxwZXRlci5zY2hpbGRtYW5uQHdlYi5kZT4KCgogICAgTEcgVERRRi1TMDAxRgoKICAgIENvcHlyaWdodCAoQykgMjAwMiBGZWxpeCBEb21rZSA8dG1iaW5jQGVsaXRlZHZiLm5ldD4KCQkgICAgICYgQW5kcmVhcyBPYmVycml0dGVyIDxvYmlAbGludXh0di5vcmc+CgoKICAgIFN1cHBvcnQgZm9yIFNhbXN1bmcgVEJNVTI0MTEySU1CIHVzZWQgb24gVGVjaG5pc2F0IFNreVN0YXIyIHJldi4gMi42QgoKICAgIENvcHlyaWdodCAoQykgMjAwMyBWYWRpbSBDYXRhbmEgPHNreXN0YXJAbW9sZG92YS5jYz46CgogICAgU3VwcG9ydCBmb3IgUGhpbGlwcyBTVTEyNzggb24gVGVjaG5vdHJlbmQgaGFyZHdhcmUKCiAgICBDb3B5cmlnaHQgKEMpIDIwMDQgQW5kcmV3IGRlIFF1aW5jZXkgPGFkcV9kdmJAbGlkc2tpYWxmLm5ldD4KCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KCiovCgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgoKI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgojaW5jbHVkZSAic3R2MDI5OS5oIgoKc3RydWN0IHN0djAyOTlfc3RhdGUgewoJc3RydWN0IGkyY19hZGFwdGVyKiBpMmM7CglzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7Cgljb25zdCBzdHJ1Y3Qgc3R2MDI5OV9jb25maWcqIGNvbmZpZzsKCXN0cnVjdCBkdmJfZnJvbnRlbmQgZnJvbnRlbmQ7CgoJdTggaW5pdGlhbGlzZWQ6MTsKCXUzMiB0dW5lcl9mcmVxdWVuY3k7Cgl1MzIgc3ltYm9sX3JhdGU7CglmZV9jb2RlX3JhdGVfdCBmZWNfaW5uZXI7CglpbnQgZXJybW9kZTsKfTsKCiNkZWZpbmUgU1RBVFVTX0JFUiAwCiNkZWZpbmUgU1RBVFVTX1VDQkxPQ0tTIDEKCnN0YXRpYyBpbnQgZGVidWc7CnN0YXRpYyBpbnQgZGVidWdfbGVnYWN5X2Rpc2hfc3dpdGNoOwojZGVmaW5lIGRwcmludGsoYXJncy4uLikgXAoJZG8geyBcCgkJaWYgKGRlYnVnKSBwcmludGsoS0VSTl9ERUJVRyAic3R2MDI5OTogIiBhcmdzKTsgXAoJfSB3aGlsZSAoMCkKCgpzdGF0aWMgaW50IHN0djAyOTlfd3JpdGVyZWdJIChzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUsIHU4IHJlZywgdTggZGF0YSkKewoJaW50IHJldDsKCXU4IGJ1ZiBbXSA9IHsgcmVnLCBkYXRhIH07CglzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywgLmZsYWdzID0gMCwgLmJ1ZiA9IGJ1ZiwgLmxlbiA9IDIgfTsKCglyZXQgPSBpMmNfdHJhbnNmZXIgKHN0YXRlLT5pMmMsICZtc2csIDEpOwoKCWlmIChyZXQgIT0gMSkKCQlkcHJpbnRrKCIlczogd3JpdGVyZWcgZXJyb3IgKHJlZyA9PSAweCUwMngsIHZhbCA9PSAweCUwMngsICIKCQkJInJldCA9PSAlaSlcbiIsIF9fRlVOQ1RJT05fXywgcmVnLCBkYXRhLCByZXQpOwoKCXJldHVybiAocmV0ICE9IDEpID8gLUVSRU1PVEVJTyA6IDA7Cn0KCmludCBzdHYwMjk5X3dyaXRlcmVnIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTggcmVnLCB1OCBkYXRhKQp7CglzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKCglyZXR1cm4gc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIHJlZywgZGF0YSk7Cn0KCnN0YXRpYyB1OCBzdHYwMjk5X3JlYWRyZWcgKHN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSwgdTggcmVnKQp7CglpbnQgcmV0OwoJdTggYjAgW10gPSB7IHJlZyB9OwoJdTggYjEgW10gPSB7IDAgfTsKCXN0cnVjdCBpMmNfbXNnIG1zZyBbXSA9IHsgeyAuYWRkciA9IHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsIC5mbGFncyA9IDAsIC5idWYgPSBiMCwgLmxlbiA9IDEgfSwKCQkJICAgeyAuYWRkciA9IHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsIC5mbGFncyA9IEkyQ19NX1JELCAuYnVmID0gYjEsIC5sZW4gPSAxIH0gfTsKCglyZXQgPSBpMmNfdHJhbnNmZXIgKHN0YXRlLT5pMmMsIG1zZywgMik7CgoJaWYgKHJldCAhPSAyKQoJCWRwcmludGsoIiVzOiByZWFkcmVnIGVycm9yIChyZWcgPT0gMHglMDJ4LCByZXQgPT0gJWkpXG4iLAoJCQkJX19GVU5DVElPTl9fLCByZWcsIHJldCk7CgoJcmV0dXJuIGIxWzBdOwp9CgpzdGF0aWMgaW50IHN0djAyOTlfcmVhZHJlZ3MgKHN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSwgdTggcmVnMSwgdTggKmIsIHU4IGxlbikKewoJaW50IHJldDsKCXN0cnVjdCBpMmNfbXNnIG1zZyBbXSA9IHsgeyAuYWRkciA9IHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsIC5mbGFncyA9IDAsIC5idWYgPSAmcmVnMSwgLmxlbiA9IDEgfSwKCQkJICAgeyAuYWRkciA9IHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsIC5mbGFncyA9IEkyQ19NX1JELCAuYnVmID0gYiwgLmxlbiA9IGxlbiB9IH07CgoJcmV0ID0gaTJjX3RyYW5zZmVyIChzdGF0ZS0+aTJjLCBtc2csIDIpOwoKCWlmIChyZXQgIT0gMikKCQlkcHJpbnRrKCIlczogcmVhZHJlZyBlcnJvciAocmV0ID09ICVpKVxuIiwgX19GVU5DVElPTl9fLCByZXQpOwoKCXJldHVybiByZXQgPT0gMiA/IDAgOiByZXQ7Cn0KCmludCBzdHYwMjk5X2VuYWJsZV9wbGxpMmMgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQp7CglzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKCglyZXR1cm4gc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIDB4MDUsIDB4YjUpOwkvKiAgZW5hYmxlIGkyYyByZXBlYXRlciBvbiBzdHYwMjk5ICAqLwp9CgpzdGF0aWMgaW50IHN0djAyOTlfc2V0X0ZFQyAoc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlLCBmZV9jb2RlX3JhdGVfdCBmZWMpCnsKCWRwcmludGsgKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKCglzd2l0Y2ggKGZlYykgewoJY2FzZSBGRUNfQVVUTzoKCXsKCQlyZXR1cm4gc3R2MDI5OV93cml0ZXJlZ0kgKHN0YXRlLCAweDMxLCAweDFmKTsKCX0KCWNhc2UgRkVDXzFfMjoKCXsKCQlyZXR1cm4gc3R2MDI5OV93cml0ZXJlZ0kgKHN0YXRlLCAweDMxLCAweDAxKTsKCX0KCWNhc2UgRkVDXzJfMzoKCXsKCQlyZXR1cm4gc3R2MDI5OV93cml0ZXJlZ0kgKHN0YXRlLCAweDMxLCAweDAyKTsKCX0KCWNhc2UgRkVDXzNfNDoKCXsKCQlyZXR1cm4gc3R2MDI5OV93cml0ZXJlZ0kgKHN0YXRlLCAweDMxLCAweDA0KTsKCX0KCWNhc2UgRkVDXzVfNjoKCXsKCQlyZXR1cm4gc3R2MDI5OV93cml0ZXJlZ0kgKHN0YXRlLCAweDMxLCAweDA4KTsKCX0KCWNhc2UgRkVDXzdfODoKCXsKCQlyZXR1cm4gc3R2MDI5OV93cml0ZXJlZ0kgKHN0YXRlLCAweDMxLCAweDEwKTsKCX0KCWRlZmF1bHQ6Cgl7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CiAgICB9Cn0KCnN0YXRpYyBmZV9jb2RlX3JhdGVfdCBzdHYwMjk5X2dldF9mZWMgKHN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSkKewoJc3RhdGljIGZlX2NvZGVfcmF0ZV90IGZlY190YWIgW10gPSB7IEZFQ18yXzMsIEZFQ18zXzQsIEZFQ181XzYsCgkJCQkJICAgICBGRUNfN184LCBGRUNfMV8yIH07Cgl1OCBpbmRleDsKCglkcHJpbnRrICgiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CgoJaW5kZXggPSBzdHYwMjk5X3JlYWRyZWcgKHN0YXRlLCAweDFiKTsKCWluZGV4ICY9IDB4NzsKCglpZiAoaW5kZXggPiA0KQoJCXJldHVybiBGRUNfQVVUTzsKCglyZXR1cm4gZmVjX3RhYiBbaW5kZXhdOwp9CgpzdGF0aWMgaW50IHN0djAyOTlfd2FpdF9kaXNlcWNfZmlmbyAoc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlLCBpbnQgdGltZW91dCkKewoJdW5zaWduZWQgbG9uZyBzdGFydCA9IGppZmZpZXM7CgoJZHByaW50ayAoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwoKCXdoaWxlIChzdHYwMjk5X3JlYWRyZWcoc3RhdGUsIDB4MGEpICYgMSkgewoJCWlmIChqaWZmaWVzIC0gc3RhcnQgPiB0aW1lb3V0KSB7CgkJCWRwcmludGsgKCIlczogdGltZW91dCEhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCQlyZXR1cm4gLUVUSU1FRE9VVDsKCQl9CgkJbXNsZWVwKDEwKTsKCX07CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc3R2MDI5OV93YWl0X2Rpc2VxY19pZGxlIChzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUsIGludCB0aW1lb3V0KQp7Cgl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gamlmZmllczsKCglkcHJpbnRrICgiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CgoJd2hpbGUgKChzdHYwMjk5X3JlYWRyZWcoc3RhdGUsIDB4MGEpICYgMykgIT0gMiApIHsKCQlpZiAoamlmZmllcyAtIHN0YXJ0ID4gdGltZW91dCkgewoJCQlkcHJpbnRrICgiJXM6IHRpbWVvdXQhIVxuIiwgX19GVU5DVElPTl9fKTsKCQkJcmV0dXJuIC1FVElNRURPVVQ7CgkJfQoJCW1zbGVlcCgxMCk7Cgl9OwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHN0djAyOTlfc2V0X3N5bWJvbHJhdGUgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIgc3JhdGUpCnsKCXN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwoJdTY0IGJpZyA9IHNyYXRlOwoJdTMyIHJhdGlvOwoKCS8vIGNoZWNrIHJhdGUgaXMgd2l0aGluIGxpbWl0cwoJaWYgKChzcmF0ZSA8IDEwMDAwMDApIHx8IChzcmF0ZSA+IDQ1MDAwMDAwKSkgcmV0dXJuIC1FSU5WQUw7CgoJLy8gY2FsY3VsYXRlIHZhbHVlIHRvIHByb2dyYW0KCWJpZyA9IGJpZyA8PCAyMDsKCWJpZyArPSAoc3RhdGUtPmNvbmZpZy0+bWNsay0xKTsgLy8gcm91bmQgY29ycmVjdGx5Cglkb19kaXYoYmlnLCBzdGF0ZS0+Y29uZmlnLT5tY2xrKTsKCXJhdGlvID0gYmlnIDw8IDQ7CgoJcmV0dXJuIHN0YXRlLT5jb25maWctPnNldF9zeW1ib2xfcmF0ZShmZSwgc3JhdGUsIHJhdGlvKTsKfQoKc3RhdGljIGludCBzdHYwMjk5X2dldF9zeW1ib2xyYXRlIChzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUpCnsKCXUzMiBNY2xrID0gc3RhdGUtPmNvbmZpZy0+bWNsayAvIDQwOTZMOwoJdTMyIHNyYXRlOwoJczMyIG9mZnNldDsKCXU4IHNmclszXTsKCXM4IHJ0ZjsKCglkcHJpbnRrICgiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CgoJc3R2MDI5OV9yZWFkcmVncyAoc3RhdGUsIDB4MWYsIHNmciwgMyk7CglzdHYwMjk5X3JlYWRyZWdzIChzdGF0ZSwgMHgxYSwgJnJ0ZiwgMSk7CgoJc3JhdGUgPSAoc2ZyWzBdIDw8IDgpIHwgc2ZyWzFdOwoJc3JhdGUgKj0gTWNsazsKCXNyYXRlIC89IDE2OwoJc3JhdGUgKz0gKHNmclsyXSA+PiA0KSAqIE1jbGsgLyAyNTY7CglvZmZzZXQgPSAoczMyKSBydGYgKiAoc3JhdGUgLyA0MDk2TCk7CglvZmZzZXQgLz0gMTI4OwoKCWRwcmludGsgKCIlcyA6IHNyYXRlID0gJWlcbiIsIF9fRlVOQ1RJT05fXywgc3JhdGUpOwoJZHByaW50ayAoIiVzIDogb2ZzZXQgPSAlaVxuIiwgX19GVU5DVElPTl9fLCBvZmZzZXQpOwoKCXNyYXRlICs9IG9mZnNldDsKCglzcmF0ZSArPSAxMDAwOwoJc3JhdGUgLz0gMjAwMDsKCXNyYXRlICo9IDIwMDA7CgoJcmV0dXJuIHNyYXRlOwp9CgpzdGF0aWMgaW50IHN0djAyOTlfc2VuZF9kaXNlcWNfbXNnIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKCQkJCSAgICBzdHJ1Y3QgZHZiX2Rpc2VxY19tYXN0ZXJfY21kICptKQp7CglzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKCXU4IHZhbDsKCWludCBpOwoKCWRwcmludGsgKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKCglpZiAoc3R2MDI5OV93YWl0X2Rpc2VxY19pZGxlIChzdGF0ZSwgMTAwKSA8IDApCgkJcmV0dXJuIC1FVElNRURPVVQ7CgoJdmFsID0gc3R2MDI5OV9yZWFkcmVnIChzdGF0ZSwgMHgwOCk7CgoJaWYgKHN0djAyOTlfd3JpdGVyZWdJIChzdGF0ZSwgMHgwOCwgKHZhbCAmIH4weDcpIHwgMHg2KSkgIC8qIERpU0VxQyBtb2RlICovCgkJcmV0dXJuIC1FUkVNT1RFSU87CgoJZm9yIChpPTA7IGk8bS0+bXNnX2xlbjsgaSsrKSB7CgkJaWYgKHN0djAyOTlfd2FpdF9kaXNlcWNfZmlmbyAoc3RhdGUsIDEwMCkgPCAwKQoJCQlyZXR1cm4gLUVUSU1FRE9VVDsKCgkJaWYgKHN0djAyOTlfd3JpdGVyZWdJIChzdGF0ZSwgMHgwOSwgbS0+bXNnW2ldKSkKCQkJcmV0dXJuIC1FUkVNT1RFSU87Cgl9CgoJaWYgKHN0djAyOTlfd2FpdF9kaXNlcWNfaWRsZSAoc3RhdGUsIDEwMCkgPCAwKQoJCXJldHVybiAtRVRJTUVET1VUOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHN0djAyOTlfc2VuZF9kaXNlcWNfYnVyc3QgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zZWNfbWluaV9jbWRfdCBidXJzdCkKewoJc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7Cgl1OCB2YWw7CgoJZHByaW50ayAoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwoKCWlmIChzdHYwMjk5X3dhaXRfZGlzZXFjX2lkbGUgKHN0YXRlLCAxMDApIDwgMCkKCQlyZXR1cm4gLUVUSU1FRE9VVDsKCgl2YWwgPSBzdHYwMjk5X3JlYWRyZWcgKHN0YXRlLCAweDA4KTsKCglpZiAoc3R2MDI5OV93cml0ZXJlZ0kgKHN0YXRlLCAweDA4LCAodmFsICYgfjB4NykgfCAweDIpKQkvKiBidXJzdCBtb2RlICovCgkJcmV0dXJuIC1FUkVNT1RFSU87CgoJaWYgKHN0djAyOTlfd3JpdGVyZWdJIChzdGF0ZSwgMHgwOSwgYnVyc3QgPT0gU0VDX01JTklfQSA/IDB4MDAgOiAweGZmKSkKCQlyZXR1cm4gLUVSRU1PVEVJTzsKCglpZiAoc3R2MDI5OV93YWl0X2Rpc2VxY19pZGxlIChzdGF0ZSwgMTAwKSA8IDApCgkJcmV0dXJuIC1FVElNRURPVVQ7CgoJaWYgKHN0djAyOTlfd3JpdGVyZWdJIChzdGF0ZSwgMHgwOCwgdmFsKSkKCQlyZXR1cm4gLUVSRU1PVEVJTzsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzdHYwMjk5X3NldF90b25lIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX3RvbmVfbW9kZV90IHRvbmUpCnsKCXN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwoJdTggdmFsOwoKCWlmIChzdHYwMjk5X3dhaXRfZGlzZXFjX2lkbGUgKHN0YXRlLCAxMDApIDwgMCkKCQlyZXR1cm4gLUVUSU1FRE9VVDsKCgl2YWwgPSBzdHYwMjk5X3JlYWRyZWcgKHN0YXRlLCAweDA4KTsKCglzd2l0Y2ggKHRvbmUpIHsKCWNhc2UgU0VDX1RPTkVfT046CgkJcmV0dXJuIHN0djAyOTlfd3JpdGVyZWdJIChzdGF0ZSwgMHgwOCwgdmFsIHwgMHgzKTsKCgljYXNlIFNFQ19UT05FX09GRjoKCQlyZXR1cm4gc3R2MDI5OV93cml0ZXJlZ0kgKHN0YXRlLCAweDA4LCAodmFsICYgfjB4MykgfCAweDAyKTsKCglkZWZhdWx0OgoJCXJldHVybiAtRUlOVkFMOwoJfQp9CgpzdGF0aWMgaW50IHN0djAyOTlfc2V0X3ZvbHRhZ2UgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zZWNfdm9sdGFnZV90IHZvbHRhZ2UpCnsKCXN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwoJdTggcmVnMHgwODsKCXU4IHJlZzB4MGM7CgoJZHByaW50aygiJXM6ICVzXG4iLCBfX0ZVTkNUSU9OX18sCgkJdm9sdGFnZSA9PSBTRUNfVk9MVEFHRV8xMyA/ICJTRUNfVk9MVEFHRV8xMyIgOgoJCXZvbHRhZ2UgPT0gU0VDX1ZPTFRBR0VfMTggPyAiU0VDX1ZPTFRBR0VfMTgiIDogIj8/Iik7CgoJcmVnMHgwOCA9IHN0djAyOTlfcmVhZHJlZyAoc3RhdGUsIDB4MDgpOwoJcmVnMHgwYyA9IHN0djAyOTlfcmVhZHJlZyAoc3RhdGUsIDB4MGMpOwoKCS8qKgoJICogIEgvViBzd2l0Y2hpbmcgb3ZlciBPUDAsIE9QMSBhbmQgT1AyIGFyZSBMTkIgcG93ZXIgZW5hYmxlIGJpdHMKCSAqLwoJcmVnMHgwYyAmPSAweDBmOwoKCWlmICh2b2x0YWdlID09IFNFQ19WT0xUQUdFX09GRikgewoJCXN0djAyOTlfd3JpdGVyZWdJIChzdGF0ZSwgMHgwYywgMHgwMCk7IC8qCUxOQiBwb3dlciBvZmYhICovCgkJcmV0dXJuIHN0djAyOTlfd3JpdGVyZWdJIChzdGF0ZSwgMHgwOCwgMHgwMCk7IC8qCUxOQiBwb3dlciBvZmYhICovCgl9CgoJc3R2MDI5OV93cml0ZXJlZ0kgKHN0YXRlLCAweDA4LCAocmVnMHgwOCAmIDB4M2YpIHwgKHN0YXRlLT5jb25maWctPmxvY2tfb3V0cHV0IDw8IDYpKTsKCglzd2l0Y2ggKHZvbHRhZ2UpIHsKCWNhc2UgU0VDX1ZPTFRBR0VfMTM6CgkJaWYgKHN0YXRlLT5jb25maWctPnZvbHQxM19vcDBfb3AxID09IFNUVjAyOTlfVk9MVDEzX09QMCkgcmVnMHgwYyB8PSAweDEwOwoJCWVsc2UgcmVnMHgwYyB8PSAweDQwOwoKCQlyZXR1cm4gc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIDB4MGMsIHJlZzB4MGMpOwoKCWNhc2UgU0VDX1ZPTFRBR0VfMTg6CgkJcmV0dXJuIHN0djAyOTlfd3JpdGVyZWdJKHN0YXRlLCAweDBjLCByZWcweDBjIHwgMHg1MCk7CglkZWZhdWx0OgoJCXJldHVybiAtRUlOVkFMOwoJfTsKfQoKc3RhdGljIGludCBzdHYwMjk5X3NlbmRfbGVnYWN5X2Rpc2hfY21kIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdW5zaWduZWQgbG9uZyBjbWQpCnsKCXN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwoJdTggcmVnMHgwODsKCXU4IHJlZzB4MGM7Cgl1OCBsdl9tYXNrID0gMHg0MDsKCXU4IGxhc3QgPSAxOwoJaW50IGk7CglzdHJ1Y3QgdGltZXZhbCBuZXh0dGltZTsKCXN0cnVjdCB0aW1ldmFsIHR2WzEwXTsKCglyZWcweDA4ID0gc3R2MDI5OV9yZWFkcmVnIChzdGF0ZSwgMHgwOCk7CglyZWcweDBjID0gc3R2MDI5OV9yZWFkcmVnIChzdGF0ZSwgMHgwYyk7CglyZWcweDBjICY9IDB4MGY7CglzdHYwMjk5X3dyaXRlcmVnSSAoc3RhdGUsIDB4MDgsIChyZWcweDA4ICYgMHgzZikgfCAoc3RhdGUtPmNvbmZpZy0+bG9ja19vdXRwdXQgPDwgNikpOwoJaWYgKHN0YXRlLT5jb25maWctPnZvbHQxM19vcDBfb3AxID09IFNUVjAyOTlfVk9MVDEzX09QMCkKCQlsdl9tYXNrID0gMHgxMDsKCgljbWQgPSBjbWQgPDwgMTsKCWlmIChkZWJ1Z19sZWdhY3lfZGlzaF9zd2l0Y2gpCgkJcHJpbnRrICgiJXMgc3dpdGNoIGNvbW1hbmQ6IDB4JTA0bHhcbiIsX19GVU5DVElPTl9fLCBjbWQpOwoKCWRvX2dldHRpbWVvZmRheSAoJm5leHR0aW1lKTsKCWlmIChkZWJ1Z19sZWdhY3lfZGlzaF9zd2l0Y2gpCgkJbWVtY3B5ICgmdHZbMF0sICZuZXh0dGltZSwgc2l6ZW9mIChzdHJ1Y3QgdGltZXZhbCkpOwoJc3R2MDI5OV93cml0ZXJlZ0kgKHN0YXRlLCAweDBjLCByZWcweDBjIHwgMHg1MCk7IC8qIHNldCBMTkIgdG8gMThWICovCgoJZHZiX2Zyb250ZW5kX3NsZWVwX3VudGlsKCZuZXh0dGltZSwgMzIwMDApOwoKCWZvciAoaT0wOyBpPDk7IGkrKykgewoJCWlmIChkZWJ1Z19sZWdhY3lfZGlzaF9zd2l0Y2gpCgkJCWRvX2dldHRpbWVvZmRheSAoJnR2W2krMV0pOwoJCWlmKChjbWQgJiAweDAxKSAhPSBsYXN0KSB7CgkJCS8qIHNldCB2b2x0YWdlIHRvIChsYXN0ID8gMTNWIDogMThWKSAqLwoJCQlzdHYwMjk5X3dyaXRlcmVnSSAoc3RhdGUsIDB4MGMsIHJlZzB4MGMgfCAobGFzdCA/IGx2X21hc2sgOiAweDUwKSk7CgkJCWxhc3QgPSAobGFzdCkgPyAwIDogMTsKCQl9CgoJCWNtZCA9IGNtZCA+PiAxOwoKCQlpZiAoaSAhPSA4KQoJCQlkdmJfZnJvbnRlbmRfc2xlZXBfdW50aWwoJm5leHR0aW1lLCA4MDAwKTsKCX0KCWlmIChkZWJ1Z19sZWdhY3lfZGlzaF9zd2l0Y2gpIHsKCQlwcmludGsgKCIlcyglZCk6IHN3aXRjaCBkZWxheSAoc2hvdWxkIGJlIDMyayBmb2xsb3dlZCBieSBhbGwgOGtcbiIsCgkJCV9fRlVOQ1RJT05fXywgZmUtPmR2Yi0+bnVtKTsKCQlmb3IgKGkgPSAxOyBpIDwgMTA7IGkrKykKCQkJcHJpbnRrICgiJWQ6ICVkXG4iLCBpLCB0aW1ldmFsX3VzZWNfZGlmZih0dltpLTFdICwgdHZbaV0pKTsKCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzdHYwMjk5X2luaXQgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQp7CglzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKCWludCBpOwoKCWRwcmludGsoInN0djAyOTk6IGluaXQgY2hpcFxuIik7CgoJZm9yIChpPTA7ICEoc3RhdGUtPmNvbmZpZy0+aW5pdHRhYltpXSA9PSAweGZmICYmIHN0YXRlLT5jb25maWctPmluaXR0YWJbaSsxXSA9PSAweGZmKTsgaSs9MikKCQlzdHYwMjk5X3dyaXRlcmVnSShzdGF0ZSwgc3RhdGUtPmNvbmZpZy0+aW5pdHRhYltpXSwgc3RhdGUtPmNvbmZpZy0+aW5pdHRhYltpKzFdKTsKCglpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQpIHsKCQlzdHYwMjk5X3dyaXRlcmVnSShzdGF0ZSwgMHgwNSwgMHhiNSk7CS8qICBlbmFibGUgaTJjIHJlcGVhdGVyIG9uIHN0djAyOTkgICovCgkJc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQoZmUsIHN0YXRlLT5pMmMpOwoJCXN0djAyOTlfd3JpdGVyZWdJKHN0YXRlLCAweDA1LCAweDM1KTsJLyogIGRpc2FibGUgaTJjIHJlcGVhdGVyIG9uIHN0djAyOTkgICovCgl9CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc3R2MDI5OV9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc3RhdHVzX3QqIHN0YXR1cykKewoJc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CgoJdTggc2lnbmFsID0gMHhmZiAtIHN0djAyOTlfcmVhZHJlZyAoc3RhdGUsIDB4MTgpOwoJdTggc3luYyA9IHN0djAyOTlfcmVhZHJlZyAoc3RhdGUsIDB4MWIpOwoKCWRwcmludGsgKCIlcyA6IEZFX1JFQURfU1RBVFVTIDogVlNUQVRVUzogMHglMDJ4XG4iLCBfX0ZVTkNUSU9OX18sIHN5bmMpOwoJKnN0YXR1cyA9IDA7CgoJaWYgKHNpZ25hbCA+IDEwKQoJCSpzdGF0dXMgfD0gRkVfSEFTX1NJR05BTDsKCglpZiAoc3luYyAmIDB4ODApCgkJKnN0YXR1cyB8PSBGRV9IQVNfQ0FSUklFUjsKCglpZiAoc3luYyAmIDB4MTApCgkJKnN0YXR1cyB8PSBGRV9IQVNfVklURVJCSTsKCglpZiAoc3luYyAmIDB4MDgpCgkJKnN0YXR1cyB8PSBGRV9IQVNfU1lOQzsKCglpZiAoKHN5bmMgJiAweDk4KSA9PSAweDk4KQoJCSpzdGF0dXMgfD0gRkVfSEFTX0xPQ0s7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc3R2MDI5OV9yZWFkX2JlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyKiBiZXIpCnsKCXN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwoKCWlmIChzdGF0ZS0+ZXJybW9kZSAhPSBTVEFUVVNfQkVSKSByZXR1cm4gMDsKCSpiZXIgPSAoc3R2MDI5OV9yZWFkcmVnIChzdGF0ZSwgMHgxZCkgPDwgOCkgfCBzdHYwMjk5X3JlYWRyZWcgKHN0YXRlLCAweDFlKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzdHYwMjk5X3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYqIHN0cmVuZ3RoKQp7CglzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKCglzMzIgc2lnbmFsID0gIDB4ZmZmZiAtICgoc3R2MDI5OV9yZWFkcmVnIChzdGF0ZSwgMHgxOCkgPDwgOCkKCQkJICAgICAgIHwgc3R2MDI5OV9yZWFkcmVnIChzdGF0ZSwgMHgxOSkpOwoKCWRwcmludGsgKCIlcyA6IEZFX1JFQURfU0lHTkFMX1NUUkVOR1RIIDogQUdDMkk6IDB4JTAyeCUwMngsIHNpZ25hbD0weCUwNHhcbiIsIF9fRlVOQ1RJT05fXywKCQkgc3R2MDI5OV9yZWFkcmVnIChzdGF0ZSwgMHgxOCksCgkJIHN0djAyOTlfcmVhZHJlZyAoc3RhdGUsIDB4MTkpLCAoaW50KSBzaWduYWwpOwoKCXNpZ25hbCA9IHNpZ25hbCAqIDUgLyA0OwoJKnN0cmVuZ3RoID0gKHNpZ25hbCA+IDB4ZmZmZikgPyAweGZmZmYgOiAoc2lnbmFsIDwgMCkgPyAwIDogc2lnbmFsOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHN0djAyOTlfcmVhZF9zbnIoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc25yKQp7CglzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKCglzMzIgeHNuciA9IDB4ZmZmZiAtICgoc3R2MDI5OV9yZWFkcmVnIChzdGF0ZSwgMHgyNCkgPDwgOCkKCQkJICAgfCBzdHYwMjk5X3JlYWRyZWcgKHN0YXRlLCAweDI1KSk7Cgl4c25yID0gMyAqICh4c25yIC0gMHhhMTAwKTsKCSpzbnIgPSAoeHNuciA+IDB4ZmZmZikgPyAweGZmZmYgOiAoeHNuciA8IDApID8gMCA6IHhzbnI7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc3R2MDI5OV9yZWFkX3VjYmxvY2tzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIqIHVjYmxvY2tzKQp7CglzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKCglpZiAoc3RhdGUtPmVycm1vZGUgIT0gU1RBVFVTX1VDQkxPQ0tTKSAqdWNibG9ja3MgPSAwOwoJZWxzZSAqdWNibG9ja3MgPSAoc3R2MDI5OV9yZWFkcmVnIChzdGF0ZSwgMHgxZCkgPDwgOCkgfCBzdHYwMjk5X3JlYWRyZWcgKHN0YXRlLCAweDFlKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzdHYwMjk5X3NldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICogcCkKewoJc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CglpbnQgaW52dmFsID0gMDsKCglkcHJpbnRrICgiJXMgOiBGRV9TRVRfRlJPTlRFTkRcbiIsIF9fRlVOQ1RJT05fXyk7CgoJLy8gc2V0IHRoZSBpbnZlcnNpb24KCWlmIChwLT5pbnZlcnNpb24gPT0gSU5WRVJTSU9OX09GRikgaW52dmFsID0gMDsKCWVsc2UgaWYgKHAtPmludmVyc2lvbiA9PSBJTlZFUlNJT05fT04pIGludnZhbCA9IDE7CgllbHNlIHsKCQlwcmludGsoInN0djAyOTkgZG9lcyBub3Qgc3VwcG9ydCBhdXRvLWludmVyc2lvblxuIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CglpZiAoc3RhdGUtPmNvbmZpZy0+aW52ZXJ0KSBpbnZ2YWwgPSAofmludnZhbCkgJiAxOwoJc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIDB4MGMsIChzdHYwMjk5X3JlYWRyZWcoc3RhdGUsIDB4MGMpICYgMHhmZSkgfCBpbnZ2YWwpOwoKCXN0djAyOTlfd3JpdGVyZWdJKHN0YXRlLCAweDA1LCAweGI1KTsJLyogIGVuYWJsZSBpMmMgcmVwZWF0ZXIgb24gc3R2MDI5OSAgKi8KCXN0YXRlLT5jb25maWctPnBsbF9zZXQoZmUsIHN0YXRlLT5pMmMsIHApOwoJc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIDB4MDUsIDB4MzUpOwkvKiAgZGlzYWJsZSBpMmMgcmVwZWF0ZXIgb24gc3R2MDI5OSAgKi8KCglzdHYwMjk5X3NldF9GRUMgKHN0YXRlLCBwLT51LnFwc2suZmVjX2lubmVyKTsKCXN0djAyOTlfc2V0X3N5bWJvbHJhdGUgKGZlLCBwLT51LnFwc2suc3ltYm9sX3JhdGUpOwoJc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIDB4MjIsIDB4MDApOwoJc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIDB4MjMsIDB4MDApOwoKCXN0YXRlLT50dW5lcl9mcmVxdWVuY3kgPSBwLT5mcmVxdWVuY3k7CglzdGF0ZS0+ZmVjX2lubmVyID0gcC0+dS5xcHNrLmZlY19pbm5lcjsKCXN0YXRlLT5zeW1ib2xfcmF0ZSA9IHAtPnUucXBzay5zeW1ib2xfcmF0ZTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzdHYwMjk5X2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICogcCkKewoJc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CglzMzIgZGVyb3RfZnJlcTsKCWludCBpbnZ2YWw7CgoJZGVyb3RfZnJlcSA9IChzMzIpKHMxNikgKChzdHYwMjk5X3JlYWRyZWcgKHN0YXRlLCAweDIyKSA8PCA4KQoJCQkJfCBzdHYwMjk5X3JlYWRyZWcgKHN0YXRlLCAweDIzKSk7CgoJZGVyb3RfZnJlcSAqPSAoc3RhdGUtPmNvbmZpZy0+bWNsayA+PiAxNik7CglkZXJvdF9mcmVxICs9IDUwMDsKCWRlcm90X2ZyZXEgLz0gMTAwMDsKCglwLT5mcmVxdWVuY3kgKz0gZGVyb3RfZnJlcTsKCglpbnZ2YWwgPSBzdHYwMjk5X3JlYWRyZWcgKHN0YXRlLCAweDBjKSAmIDE7CglpZiAoc3RhdGUtPmNvbmZpZy0+aW52ZXJ0KSBpbnZ2YWwgPSAofmludnZhbCkgJiAxOwoJcC0+aW52ZXJzaW9uID0gaW52dmFsID8gSU5WRVJTSU9OX09OIDogSU5WRVJTSU9OX09GRjsKCglwLT51LnFwc2suZmVjX2lubmVyID0gc3R2MDI5OV9nZXRfZmVjIChzdGF0ZSk7CglwLT51LnFwc2suc3ltYm9sX3JhdGUgPSBzdHYwMjk5X2dldF9zeW1ib2xyYXRlIChzdGF0ZSk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc3R2MDI5OV9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKewoJc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CgoJc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIDB4MDIsIDB4ODApOwoJc3RhdGUtPmluaXRpYWxpc2VkID0gMDsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzdHYwMjk5X2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MqIGZlc2V0dGluZ3MpCnsKCXN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwoKCWZlc2V0dGluZ3MtPm1pbl9kZWxheV9tcyA9IHN0YXRlLT5jb25maWctPm1pbl9kZWxheV9tczsKCWlmIChmZXNldHRpbmdzLT5wYXJhbWV0ZXJzLnUucXBzay5zeW1ib2xfcmF0ZSA8IDEwMDAwMDAwKSB7CgkJZmVzZXR0aW5ncy0+c3RlcF9zaXplID0gZmVzZXR0aW5ncy0+cGFyYW1ldGVycy51LnFwc2suc3ltYm9sX3JhdGUgLyAzMjAwMDsKCQlmZXNldHRpbmdzLT5tYXhfZHJpZnQgPSA1MDAwOwoJfSBlbHNlIHsKCQlmZXNldHRpbmdzLT5zdGVwX3NpemUgPSBmZXNldHRpbmdzLT5wYXJhbWV0ZXJzLnUucXBzay5zeW1ib2xfcmF0ZSAvIDE2MDAwOwoJCWZlc2V0dGluZ3MtPm1heF9kcmlmdCA9IGZlc2V0dGluZ3MtPnBhcmFtZXRlcnMudS5xcHNrLnN5bWJvbF9yYXRlIC8gMjAwMDsKCX0KCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBzdHYwMjk5X3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCnsKCXN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwoJa2ZyZWUoc3RhdGUpOwp9CgpzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgc3R2MDI5OV9vcHM7CgpzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBzdHYwMjk5X2F0dGFjaChjb25zdCBzdHJ1Y3Qgc3R2MDI5OV9jb25maWcqIGNvbmZpZywKCQkJCSAgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYykKewoJc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gTlVMTDsKCWludCBpZDsKCgkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLwoJc3RhdGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSksIEdGUF9LRVJORUwpOwoJaWYgKHN0YXRlID09IE5VTEwpIGdvdG8gZXJyb3I7CgoJLyogc2V0dXAgdGhlIHN0YXRlICovCglzdGF0ZS0+Y29uZmlnID0gY29uZmlnOwoJc3RhdGUtPmkyYyA9IGkyYzsKCW1lbWNweSgmc3RhdGUtPm9wcywgJnN0djAyOTlfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKCXN0YXRlLT5pbml0aWFsaXNlZCA9IDA7CglzdGF0ZS0+dHVuZXJfZnJlcXVlbmN5ID0gMDsKCXN0YXRlLT5zeW1ib2xfcmF0ZSA9IDA7CglzdGF0ZS0+ZmVjX2lubmVyID0gMDsKCXN0YXRlLT5lcnJtb2RlID0gU1RBVFVTX0JFUjsKCgkvKiBjaGVjayBpZiB0aGUgZGVtb2QgaXMgdGhlcmUgKi8KCXN0djAyOTlfd3JpdGVyZWdJKHN0YXRlLCAweDAyLCAweDM0KTsgLyogc3RhbmRieSBvZmYgKi8KCW1zbGVlcCgyMDApOwoJaWQgPSBzdHYwMjk5X3JlYWRyZWcoc3RhdGUsIDB4MDApOwoKCS8qIHJlZ2lzdGVyIDB4MDAgY29udGFpbnMgMHhhMSBmb3IgU1RWMDI5OSBhbmQgU1RWMDI5OUIgKi8KCS8qIHJlZ2lzdGVyIDB4MDAgbWlnaHQgY29udGFpbiAweDgwIHdoZW4gcmV0dXJuaW5nIGZyb20gc3RhbmRieSAqLwoJaWYgKGlkICE9IDB4YTEgJiYgaWQgIT0gMHg4MCkgZ290byBlcnJvcjsKCgkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCglzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CglzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOwoJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CgplcnJvcjoKCWtmcmVlKHN0YXRlKTsKCXJldHVybiBOVUxMOwp9CgpzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgc3R2MDI5OV9vcHMgPSB7CgoJLmluZm8gPSB7CgkJLm5hbWUJCQk9ICJTVCBTVFYwMjk5IERWQi1TIiwKCQkudHlwZQkJCT0gRkVfUVBTSywKCQkuZnJlcXVlbmN5X21pbgkJPSA5NTAwMDAsCgkJLmZyZXF1ZW5jeV9tYXgJCT0gMjE1MDAwMCwKCQkuZnJlcXVlbmN5X3N0ZXBzaXplCT0gMTI1LAkgLyoga0h6IGZvciBRUFNLIGZyb250ZW5kcyAqLwoJCS5mcmVxdWVuY3lfdG9sZXJhbmNlCT0gMCwKCQkuc3ltYm9sX3JhdGVfbWluCT0gMTAwMDAwMCwKCQkuc3ltYm9sX3JhdGVfbWF4CT0gNDUwMDAwMDAsCgkJLnN5bWJvbF9yYXRlX3RvbGVyYW5jZQk9IDUwMCwJLyogcHBtICovCgkJLmNhcHMgPSBGRV9DQU5fRkVDXzFfMiB8IEZFX0NBTl9GRUNfMl8zIHwgRkVfQ0FOX0ZFQ18zXzQgfAoJCSAgICAgIEZFX0NBTl9GRUNfNV82IHwgRkVfQ0FOX0ZFQ183XzggfAoJCSAgICAgIEZFX0NBTl9RUFNLIHwKCQkgICAgICBGRV9DQU5fRkVDX0FVVE8KCX0sCgoJLnJlbGVhc2UgPSBzdHYwMjk5X3JlbGVhc2UsCgoJLmluaXQgPSBzdHYwMjk5X2luaXQsCgkuc2xlZXAgPSBzdHYwMjk5X3NsZWVwLAoKCS5zZXRfZnJvbnRlbmQgPSBzdHYwMjk5X3NldF9mcm9udGVuZCwKCS5nZXRfZnJvbnRlbmQgPSBzdHYwMjk5X2dldF9mcm9udGVuZCwKCS5nZXRfdHVuZV9zZXR0aW5ncyA9IHN0djAyOTlfZ2V0X3R1bmVfc2V0dGluZ3MsCgoJLnJlYWRfc3RhdHVzID0gc3R2MDI5OV9yZWFkX3N0YXR1cywKCS5yZWFkX2JlciA9IHN0djAyOTlfcmVhZF9iZXIsCgkucmVhZF9zaWduYWxfc3RyZW5ndGggPSBzdHYwMjk5X3JlYWRfc2lnbmFsX3N0cmVuZ3RoLAoJLnJlYWRfc25yID0gc3R2MDI5OV9yZWFkX3NuciwKCS5yZWFkX3VjYmxvY2tzID0gc3R2MDI5OV9yZWFkX3VjYmxvY2tzLAoKCS5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gc3R2MDI5OV9zZW5kX2Rpc2VxY19tc2csCgkuZGlzZXFjX3NlbmRfYnVyc3QgPSBzdHYwMjk5X3NlbmRfZGlzZXFjX2J1cnN0LAoJLnNldF90b25lID0gc3R2MDI5OV9zZXRfdG9uZSwKCS5zZXRfdm9sdGFnZSA9IHN0djAyOTlfc2V0X3ZvbHRhZ2UsCgkuZGlzaG5ldHdvcmtfc2VuZF9sZWdhY3lfY29tbWFuZCA9IHN0djAyOTlfc2VuZF9sZWdhY3lfZGlzaF9jbWQsCn07Cgptb2R1bGVfcGFyYW0oZGVidWdfbGVnYWN5X2Rpc2hfc3dpdGNoLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRlYnVnX2xlZ2FjeV9kaXNoX3N3aXRjaCwgIkVuYWJsZSB0aW1pbmcgYW5hbHlzaXMgZm9yIERpc2ggTmV0d29yayBsZWdhY3kgc3dpdGNoZXMiKTsKCm1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIlR1cm4gb24vb2ZmIGZyb250ZW5kIGRlYnVnZ2luZyAoZGVmYXVsdDpvZmYpLiIpOwoKTU9EVUxFX0RFU0NSSVBUSU9OKCJTVCBTVFYwMjk5IERWQiBEZW1vZHVsYXRvciBkcml2ZXIiKTsKTU9EVUxFX0FVVEhPUigiUmFscGggTWV0emxlciwgSG9sZ2VyIFdhZWNodGxlciwgUGV0ZXIgU2NoaWxkbWFubiwgRmVsaXggRG9ta2UsICIKCSAgICAgICJBbmRyZWFzIE9iZXJyaXR0ZXIsIEFuZHJldyBkZSBRdWluY2V5LCBLZW5uZXRoIEFhZmz4eSIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7CgpFWFBPUlRfU1lNQk9MKHN0djAyOTlfZW5hYmxlX3BsbGkyYyk7CkVYUE9SVF9TWU1CT0woc3R2MDI5OV93cml0ZXJlZyk7CkVYUE9SVF9TWU1CT0woc3R2MDI5OV9hdHRhY2gpOwo=