Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qIGZkZm9ybWF0LmMgIC0gIExvdy1sZXZlbCBmb3JtYXRzIGEgZmxvcHB5IGRpc2sgLSBXZXJuZXIgQWxtZXNiZXJnZXIgKi8KCi8qIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BwbGQuT1JHLlBMPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqIDE5OTktMDMtMjAgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CiAqIC0gbW9yZSBpMThuL25scyB0cmFuc2xhdGFibGUgc3RyaW5ncyBtYXJrZWQKICoKICogNSBKdWx5IDIwMDMgLS0gbW9kaWZpZWQgZm9yIEJ1c3lib3ggYnkgRXJpayBBbmRlcnNlbgogKi8KCiNpbmNsdWRlICJsaWJiYi5oIgoKCi8qIFN0dWZmIGV4dHJhY3RlZCBmcm9tIGxpbnV4L2ZkLmggKi8Kc3RydWN0IGZsb3BweV9zdHJ1Y3QgewoJdW5zaWduZWQgaW50CXNpemUsCQkvKiBuciBvZiBzZWN0b3JzIHRvdGFsICovCgkJCXNlY3QsCQkvKiBzZWN0b3JzIHBlciB0cmFjayAqLwoJCQloZWFkLAkJLyogbnIgb2YgaGVhZHMgKi8KCQkJdHJhY2ssCQkvKiBuciBvZiB0cmFja3MgKi8KCQkJc3RyZXRjaDsJLyogIT0wIG1lYW5zIGRvdWJsZSB0cmFjayBzdGVwcyAqLwojZGVmaW5lIEZEX1NUUkVUQ0ggMQojZGVmaW5lIEZEX1NXQVBTSURFUyAyCgoJdW5zaWduZWQgY2hhcglnYXAsCQkvKiBnYXAxIHNpemUgKi8KCgkJCXJhdGUsCQkvKiBkYXRhIHJhdGUuIHw9IDB4NDAgZm9yIHBlcnBlbmRpY3VsYXIgKi8KI2RlZmluZSBGRF8yTSAweDQKI2RlZmluZSBGRF9TSVpFQ09ERU1BU0sgMHgzOAojZGVmaW5lIEZEX1NJWkVDT0RFKGZsb3BweSkgKCgoKChmbG9wcHkpLT5yYXRlJkZEX1NJWkVDT0RFTUFTSyk+PiAzKSsgMikgJTgpCiNkZWZpbmUgRkRfU0VDVFNJWkUoZmxvcHB5KSAoIChmbG9wcHkpLT5yYXRlICYgRkRfMk0gPyBcCgkJCSAgICAgNTEyIDogMTI4IDw8IEZEX1NJWkVDT0RFKGZsb3BweSkgKQojZGVmaW5lIEZEX1BFUlAgMHg0MAoKCQkJc3BlYzEsCQkvKiBzdGVwcGluZyByYXRlLCBoZWFkIHVubG9hZCB0aW1lICovCgkJCWZtdF9nYXA7CS8qIGdhcDIgc2l6ZSAqLwoJY29uc3QgY2hhcgkqIG5hbWU7IC8qIHVzZWQgb25seSBmb3IgcHJlZGVmaW5lZCBmb3JtYXRzICovCn07CnN0cnVjdCBmb3JtYXRfZGVzY3IgewoJdW5zaWduZWQgaW50IGRldmljZSxoZWFkLHRyYWNrOwp9OwojZGVmaW5lIEZERk1UQkVHIF9JTygyLDB4NDcpCiNkZWZpbmUJRkRGTVRUUksgX0lPVygyLDB4NDgsIHN0cnVjdCBmb3JtYXRfZGVzY3IpCiNkZWZpbmUgRkRGTVRFTkQgX0lPKDIsMHg0OSkKI2RlZmluZSBGREdFVFBSTSBfSU9SKDIsIDB4MDQsIHN0cnVjdCBmbG9wcHlfc3RydWN0KQojZGVmaW5lIEZEX0ZJTExfQllURSAweEY2IC8qIGZvcm1hdCBmaWxsIGJ5dGUuICovCgpzdGF0aWMgdm9pZCB4aW9jdGwoaW50IGZkLCBpbnQgcmVxdWVzdCwgdm9pZCAqYXJncCwgY29uc3QgY2hhciAqc3RyaW5nKQp7CglpZiAoaW9jdGwoZmQsIHJlcXVlc3QsIGFyZ3ApIDwgMCkgewoJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZShzdHJpbmcpOwoJfQp9CgppbnQgZmRmb3JtYXRfbWFpbihpbnQgYXJnYyxjaGFyICoqYXJndik7CmludCBmZGZvcm1hdF9tYWluKGludCBhcmdjLGNoYXIgKiphcmd2KQp7CglpbnQgZmQsIG4sIGN5bCwgcmVhZF9ieXRlcywgdmVyaWZ5OwoJdW5zaWduZWQgY2hhciAqZGF0YTsKCXN0cnVjdCBzdGF0IHN0OwoJc3RydWN0IGZsb3BweV9zdHJ1Y3QgcGFyYW07CglzdHJ1Y3QgZm9ybWF0X2Rlc2NyIGRlc2NyOwoKCWlmIChhcmdjIDwgMikgewoJCWJiX3Nob3dfdXNhZ2UoKTsKCX0KCXZlcmlmeSA9ICFnZXRvcHQzMihhcmdjLCBhcmd2LCAibiIpOwoJYXJndiArPSBvcHRpbmQ7CgoJeHN0YXQoKmFyZ3YsICZzdCk7CglpZiAoIVNfSVNCTEsoc3Quc3RfbW9kZSkpIHsKCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXM6IG5vdCBhIGJsb2NrIGRldmljZSIsICphcmd2KTsKCQkvKiBkbyBub3QgdGVzdCBtYWpvciAtIHBlcmhhcHMgdGhpcyB3YXMgYW4gVVNCIGZsb3BweSAqLwoJfQoKCS8qIE9fUkRXUiBmb3IgZm9ybWF0dGluZyBhbmQgdmVyaWZ5aW5nICovCglmZCA9IHhvcGVuKCphcmd2LCBPX1JEV1IpOwoKCS8qIG9yaWdpbmFsIG1lc3NhZ2Ugd2FzOiAiQ291bGQgbm90IGRldGVybWluZSBjdXJyZW50IGZvcm1hdCB0eXBlIiAqLwoJeGlvY3RsKGZkLCBGREdFVFBSTSwgJnBhcmFtLCAiRkRHRVRQUk0iKTsKCglwcmludGYoIiVzLXNpZGVkLCAlZCB0cmFja3MsICVkIHNlYy90cmFjay4gVG90YWwgY2FwYWNpdHkgJWQga0JcbiIsCgkJKHBhcmFtLmhlYWQgPT0gMikgPyAiRG91YmxlIiA6ICJTaW5nbGUiLAoJCXBhcmFtLnRyYWNrLCBwYXJhbS5zZWN0LCBwYXJhbS5zaXplID4+IDEpOwoKCS8qIEZPUk1BVCAqLwoJcHJpbnRmKCJGb3JtYXR0aW5nLi4uICIpOwoJeGlvY3RsKGZkLCBGREZNVEJFRywgTlVMTCwgIkZERk1UQkVHIik7CgoJLyogbiA9PSB0cmFjayAqLwoJZm9yIChuID0gMDsgbiA8IHBhcmFtLnRyYWNrOyBuKyspIHsKCQlkZXNjci5oZWFkID0gMDsKCQlkZXNjci50cmFjayA9IG47CgkJeGlvY3RsKGZkLCBGREZNVFRSSywgJmRlc2NyLCAiRkRGTVRUUksiKTsKCQlwcmludGYoIiUzZFxiXGJcYiIsIG4pOwoJCWlmIChwYXJhbS5oZWFkID09IDIpIHsKCQkJZGVzY3IuaGVhZCA9IDE7CgkJCXhpb2N0bChmZCwgRkRGTVRUUkssICZkZXNjciwgIkZERk1UVFJLIik7CgkJfQoJfQoKCXhpb2N0bChmZCwgRkRGTVRFTkQsIE5VTEwsICJGREZNVEVORCIpOwoJcHJpbnRmKCJkb25lXG4iKTsKCgkvKiBWRVJJRlkgKi8KCWlmICh2ZXJpZnkpIHsKCQkvKiBuID09IGN5bF9zaXplICovCgkJbiA9IHBhcmFtLnNlY3QqcGFyYW0uaGVhZCo1MTI7CgoJCWRhdGEgPSB4bWFsbG9jKG4pOwoJCXByaW50ZigiVmVyaWZ5aW5nLi4uICIpOwoJCWZvciAoY3lsID0gMDsgY3lsIDwgcGFyYW0udHJhY2s7IGN5bCsrKSB7CgkJCXByaW50ZigiJTNkXGJcYlxiIiwgY3lsKTsKCQkJcmVhZF9ieXRlcyA9IHNhZmVfcmVhZChmZCwgZGF0YSwgbik7CgkJCWlmIChyZWFkX2J5dGVzICE9IG4pIHsKCQkJCWlmIChyZWFkX2J5dGVzIDwgMCkgewoJCQkJCWJiX3BlcnJvcl9tc2coYmJfbXNnX3JlYWRfZXJyb3IpOwoJCQkJfQoJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInByb2JsZW0gcmVhZGluZyBjeWxpbmRlciAlZCwgIgoJCQkJCSJleHBlY3RlZCAlZCwgcmVhZCAlZCIsIGN5bCwgbiwgcmVhZF9ieXRlcyk7CgkJCQkvLyBGSVhNRTogbWF5YmUgYmV0dGVyIHNlZWsgJiBjb250aW51ZT8/CgkJCX0KCQkJLyogQ2hlY2sgYmFja3dhcmRzIHNvIHdlIGRvbid0IG5lZWQgYSBjb3VudGVyICovCgkJCXdoaWxlICgtLXJlYWRfYnl0ZXMgPj0gMCkgewoJCQkJaWYgKGRhdGFbcmVhZF9ieXRlc10gIT0gRkRfRklMTF9CWVRFKSB7CgkJCQkJIHByaW50ZigiYmFkIGRhdGEgaW4gY3lsICVkXG5Db250aW51aW5nLi4uICIsY3lsKTsKCQkJCX0KCQkJfQoJCX0KCQkvKiBUaGVyZSBpcyBubyBwb2ludCBpbiBmcmVlaW5nIGJsb2NrcyBhdCB0aGUgZW5kIG9mIGEgcHJvZ3JhbSwgYmVjYXVzZQoJCWFsbCBvZiB0aGUgcHJvZ3JhbSdzIHNwYWNlIGlzIGdpdmVuIGJhY2sgdG8gdGhlIHN5c3RlbSB3aGVuIHRoZSBwcm9jZXNzCgkJdGVybWluYXRlcy4qLwoKCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIGZyZWUoZGF0YSk7CgoJCXByaW50ZigiZG9uZVxuIik7Cgl9CgoJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSBjbG9zZShmZCk7CgoJLyogRG9uJ3QgYm90aGVyIGNsb3NpbmcuICBFeGl0IGRvZXMKCSAqIHRoYXQsIHNvIHdlIGNhbiBzYXZlIGEgZmV3IGJ5dGVzICovCglyZXR1cm4gRVhJVF9TVUNDRVNTOwp9Cg==