Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qIGZkZm9ybWF0LmMgIC0gIExvdy1sZXZlbCBmb3JtYXRzIGEgZmxvcHB5IGRpc2sgLSBXZXJuZXIgQWxtZXNiZXJnZXIgKi8KCi8qIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BwbGQuT1JHLlBMPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqIDE5OTktMDMtMjAgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CiAqIC0gbW9yZSBpMThuL25scyB0cmFuc2xhdGFibGUgc3RyaW5ncyBtYXJrZWQKICoKICogNSBKdWx5IDIwMDMgLS0gbW9kaWZpZWQgZm9yIEJ1c3lib3ggYnkgRXJpayBBbmRlcnNlbgogKi8KCiNpbmNsdWRlICJidXN5Ym94LmgiCgoKLyogU3R1ZmYgZXh0cmFjdGVkIGZyb20gbGludXgvZmQuaCAqLwpzdHJ1Y3QgZmxvcHB5X3N0cnVjdCB7Cgl1bnNpZ25lZCBpbnQJc2l6ZSwJCS8qIG5yIG9mIHNlY3RvcnMgdG90YWwgKi8KCQkJc2VjdCwJCS8qIHNlY3RvcnMgcGVyIHRyYWNrICovCgkJCWhlYWQsCQkvKiBuciBvZiBoZWFkcyAqLwoJCQl0cmFjaywJCS8qIG5yIG9mIHRyYWNrcyAqLwoJCQlzdHJldGNoOwkvKiAhPTAgbWVhbnMgZG91YmxlIHRyYWNrIHN0ZXBzICovCiNkZWZpbmUgRkRfU1RSRVRDSCAxCiNkZWZpbmUgRkRfU1dBUFNJREVTIDIKCgl1bnNpZ25lZCBjaGFyCWdhcCwJCS8qIGdhcDEgc2l6ZSAqLwoKCQkJcmF0ZSwJCS8qIGRhdGEgcmF0ZS4gfD0gMHg0MCBmb3IgcGVycGVuZGljdWxhciAqLwojZGVmaW5lIEZEXzJNIDB4NAojZGVmaW5lIEZEX1NJWkVDT0RFTUFTSyAweDM4CiNkZWZpbmUgRkRfU0laRUNPREUoZmxvcHB5KSAoKCgoKGZsb3BweSktPnJhdGUmRkRfU0laRUNPREVNQVNLKT4+IDMpKyAyKSAlOCkKI2RlZmluZSBGRF9TRUNUU0laRShmbG9wcHkpICggKGZsb3BweSktPnJhdGUgJiBGRF8yTSA/IFwKCQkJICAgICA1MTIgOiAxMjggPDwgRkRfU0laRUNPREUoZmxvcHB5KSApCiNkZWZpbmUgRkRfUEVSUCAweDQwCgoJCQlzcGVjMSwJCS8qIHN0ZXBwaW5nIHJhdGUsIGhlYWQgdW5sb2FkIHRpbWUgKi8KCQkJZm10X2dhcDsJLyogZ2FwMiBzaXplICovCgljb25zdCBjaGFyCSogbmFtZTsgLyogdXNlZCBvbmx5IGZvciBwcmVkZWZpbmVkIGZvcm1hdHMgKi8KfTsKc3RydWN0IGZvcm1hdF9kZXNjciB7Cgl1bnNpZ25lZCBpbnQgZGV2aWNlLGhlYWQsdHJhY2s7Cn07CiNkZWZpbmUgRkRGTVRCRUcgX0lPKDIsMHg0NykKI2RlZmluZQlGREZNVFRSSyBfSU9XKDIsMHg0OCwgc3RydWN0IGZvcm1hdF9kZXNjcikKI2RlZmluZSBGREZNVEVORCBfSU8oMiwweDQ5KQojZGVmaW5lIEZER0VUUFJNIF9JT1IoMiwgMHgwNCwgc3RydWN0IGZsb3BweV9zdHJ1Y3QpCiNkZWZpbmUgRkRfRklMTF9CWVRFIDB4RjYgLyogZm9ybWF0IGZpbGwgYnl0ZS4gKi8KCnN0YXRpYyB2b2lkIHhpb2N0bChpbnQgZmQsIGludCByZXF1ZXN0LCB2b2lkICphcmdwLCBjb25zdCBjaGFyICpzdHJpbmcpCnsKCWlmIChpb2N0bChmZCwgcmVxdWVzdCwgYXJncCkgPCAwKSB7CgkJYmJfcGVycm9yX21zZ19hbmRfZGllKHN0cmluZyk7Cgl9Cn0KCmludCBmZGZvcm1hdF9tYWluKGludCBhcmdjLGNoYXIgKiphcmd2KQp7CglpbnQgZmQsIG4sIGN5bCwgcmVhZF9ieXRlcywgdmVyaWZ5OwoJdW5zaWduZWQgY2hhciAqZGF0YTsKCXN0cnVjdCBzdGF0IHN0OwoJc3RydWN0IGZsb3BweV9zdHJ1Y3QgcGFyYW07CglzdHJ1Y3QgZm9ybWF0X2Rlc2NyIGRlc2NyOwoKCWlmIChhcmdjIDwgMikgewoJCWJiX3Nob3dfdXNhZ2UoKTsKCX0KCXZlcmlmeSA9ICFnZXRvcHQzMihhcmdjLCBhcmd2LCAibiIpOwoJYXJndiArPSBvcHRpbmQ7CgoJeHN0YXQoKmFyZ3YsICZzdCk7CglpZiAoIVNfSVNCTEsoc3Quc3RfbW9kZSkpIHsKCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXM6IG5vdCBhIGJsb2NrIGRldmljZSIsICphcmd2KTsKCQkvKiBkbyBub3QgdGVzdCBtYWpvciAtIHBlcmhhcHMgdGhpcyB3YXMgYW4gVVNCIGZsb3BweSAqLwoJfQoKCS8qIE9fUkRXUiBmb3IgZm9ybWF0dGluZyBhbmQgdmVyaWZ5aW5nICovCglmZCA9IHhvcGVuKCphcmd2LCBPX1JEV1IpOwoKCS8qIG9yaWdpbmFsIG1lc3NhZ2Ugd2FzOiAiQ291bGQgbm90IGRldGVybWluZSBjdXJyZW50IGZvcm1hdCB0eXBlIiAqLwoJeGlvY3RsKGZkLCBGREdFVFBSTSwgJnBhcmFtLCAiRkRHRVRQUk0iKTsKCglwcmludGYoIiVzLXNpZGVkLCAlZCB0cmFja3MsICVkIHNlYy90cmFjay4gVG90YWwgY2FwYWNpdHkgJWQga0JcbiIsCgkJKHBhcmFtLmhlYWQgPT0gMikgPyAiRG91YmxlIiA6ICJTaW5nbGUiLAoJCXBhcmFtLnRyYWNrLCBwYXJhbS5zZWN0LCBwYXJhbS5zaXplID4+IDEpOwoKCS8qIEZPUk1BVCAqLwoJcHJpbnRmKCJGb3JtYXR0aW5nLi4uICIpOwoJeGlvY3RsKGZkLCBGREZNVEJFRywgTlVMTCwgIkZERk1UQkVHIik7CgoJLyogbiA9PSB0cmFjayAqLwoJZm9yIChuID0gMDsgbiA8IHBhcmFtLnRyYWNrOyBuKyspIHsKCQlkZXNjci5oZWFkID0gMDsKCQlkZXNjci50cmFjayA9IG47CgkJeGlvY3RsKGZkLCBGREZNVFRSSywgJmRlc2NyLCAiRkRGTVRUUksiKTsKCQlwcmludGYoIiUzZFxiXGJcYiIsIG4pOwoJCWlmIChwYXJhbS5oZWFkID09IDIpIHsKCQkJZGVzY3IuaGVhZCA9IDE7CgkJCXhpb2N0bChmZCwgRkRGTVRUUkssICZkZXNjciwgIkZERk1UVFJLIik7CgkJfQoJfQoKCXhpb2N0bChmZCwgRkRGTVRFTkQsIE5VTEwsICJGREZNVEVORCIpOwoJcHJpbnRmKCJkb25lXG4iKTsKCgkvKiBWRVJJRlkgKi8KCWlmICh2ZXJpZnkpIHsKCQkvKiBuID09IGN5bF9zaXplICovCgkJbiA9IHBhcmFtLnNlY3QqcGFyYW0uaGVhZCo1MTI7CgoJCWRhdGEgPSB4bWFsbG9jKG4pOwoJCXByaW50ZigiVmVyaWZ5aW5nLi4uICIpOwoJCWZvciAoY3lsID0gMDsgY3lsIDwgcGFyYW0udHJhY2s7IGN5bCsrKSB7CgkJCXByaW50ZigiJTNkXGJcYlxiIiwgY3lsKTsKCQkJcmVhZF9ieXRlcyA9IHNhZmVfcmVhZChmZCwgZGF0YSwgbik7CgkJCWlmIChyZWFkX2J5dGVzICE9IG4pIHsKCQkJCWlmIChyZWFkX2J5dGVzIDwgMCkgewoJCQkJCWJiX3BlcnJvcl9tc2coYmJfbXNnX3JlYWRfZXJyb3IpOwoJCQkJfQoJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInByb2JsZW0gcmVhZGluZyBjeWxpbmRlciAlZCwgIgoJCQkJCSJleHBlY3RlZCAlZCwgcmVhZCAlZCIsIGN5bCwgbiwgcmVhZF9ieXRlcyk7CgkJCQkvLyBGSVhNRTogbWF5YmUgYmV0dGVyIHNlZWsgJiBjb250aW51ZT8/CgkJCX0KCQkJLyogQ2hlY2sgYmFja3dhcmRzIHNvIHdlIGRvbid0IG5lZWQgYSBjb3VudGVyICovCgkJCXdoaWxlICgtLXJlYWRfYnl0ZXMgPj0gMCkgewoJCQkJaWYgKGRhdGFbcmVhZF9ieXRlc10gIT0gRkRfRklMTF9CWVRFKSB7CgkJCQkJIHByaW50ZigiYmFkIGRhdGEgaW4gY3lsICVkXG5Db250aW51aW5nLi4uICIsY3lsKTsKCQkJCX0KCQkJfQoJCX0KCQkvKiBUaGVyZSBpcyBubyBwb2ludCBpbiBmcmVlaW5nIGJsb2NrcyBhdCB0aGUgZW5kIG9mIGEgcHJvZ3JhbSwgYmVjYXVzZQoJCWFsbCBvZiB0aGUgcHJvZ3JhbSdzIHNwYWNlIGlzIGdpdmVuIGJhY2sgdG8gdGhlIHN5c3RlbSB3aGVuIHRoZSBwcm9jZXNzCgkJdGVybWluYXRlcy4qLwoKCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIGZyZWUoZGF0YSk7CgoJCXByaW50ZigiZG9uZVxuIik7Cgl9CgoJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSBjbG9zZShmZCk7CgoJLyogRG9uJ3QgYm90aGVyIGNsb3NpbmcuICBFeGl0IGRvZXMKCSAqIHRoYXQsIHNvIHdlIGNhbiBzYXZlIGEgZmV3IGJ5dGVzICovCglyZXR1cm4gRVhJVF9TVUNDRVNTOwp9Cg==