Ci8qCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAqCiAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CiAqCiAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPiAKICoKICovCgojaW5jbHVkZSAiaWJtYXNtLmgiCiNpbmNsdWRlICJkb3RfY29tbWFuZC5oIgoKLyoKICogUmV2ZXJzZSBIZWFydGJlYXQsIGkuZS4gaGVhcnRiZWF0cyBzZW50IGZyb20gdGhlIGRyaXZlciB0byB0aGUKICogc2VydmljZSBwcm9jZXNzb3IuCiAqIFRoZXNlIGhlYXJ0YmVhdHMgYXJlIGluaXRpYXRlZCBieSB1c2VyIGxldmVsIHByb2dyYW1zLgogKi8KCi8qIHRoZSByZXZlcnNlIGhlYXJ0YmVhdCBkb3QgY29tbWFuZCAqLwojcHJhZ21hIHBhY2soMSkKc3RhdGljIHN0cnVjdCB7CglzdHJ1Y3QgZG90X2NvbW1hbmRfaGVhZGVyCWhlYWRlcjsKCXVuc2lnbmVkIGNoYXIJCQljb21tYW5kWzNdOwp9IHJoYl9kb3RfY21kID0gewoJLmhlYWRlciA9IHsKCQkudHlwZSA9IAlzcF9yZWFkLAoJCS5jb21tYW5kX3NpemUgPSAzLAoJCS5kYXRhX3NpemUgPQkwLAoJCS5zdGF0dXMgPSAJMAoJfSwKCS5jb21tYW5kID0geyA0LCAzLCA2IH0KfTsKI3ByYWdtYSBwYWNrKCkKCnZvaWQgaWJtYXNtX2luaXRfcmV2ZXJzZV9oZWFydGJlYXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IHJldmVyc2VfaGVhcnRiZWF0ICpyaGIpCnsKCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJoYi0+d2FpdCk7CglyaGItPnN0b3BwZWQgPSAwOwp9CgovKioKICogc3RhcnRfcmV2ZXJzZV9oZWFydGJlYXQKICogTG9vcCBmb3JldmVyLCBzZW5kaW5nIGEgcmV2ZXJzZSBoZWFydGJlYXQgZG90IGNvbW1hbmQgdG8gdGhlIHNlcnZpY2UKICogcHJvY2Vzc29yLCB0aGVuIHNsZWVwaW5nLiBUaGUgbG9vcCBjb21lcyB0byBhbiBlbmQgaWYgdGhlIHNlcnZpY2UKICogcHJvY2Vzc29yIGZhaWxzIHRvIHJlc3BvbmQgMyB0aW1lcyBvciB3ZSB3ZXJlIGludGVycnVwdGVkLgogKi8KaW50IGlibWFzbV9zdGFydF9yZXZlcnNlX2hlYXJ0YmVhdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgcmV2ZXJzZV9oZWFydGJlYXQgKnJoYikKewoJc3RydWN0IGNvbW1hbmQgKmNtZDsKCWludCB0aW1lc19mYWlsZWQgPSAwOwoJaW50IHJlc3VsdCA9IDE7CgoJY21kID0gaWJtYXNtX25ld19jb21tYW5kKHNwLCBzaXplb2YgcmhiX2RvdF9jbWQpOwoJaWYgKCFjbWQpCgkJcmV0dXJuIC1FTk9NRU07CgoJd2hpbGUgKHRpbWVzX2ZhaWxlZCA8IDMpIHsKCQltZW1jcHkoY21kLT5idWZmZXIsICh2b2lkICopJnJoYl9kb3RfY21kLCBzaXplb2YgcmhiX2RvdF9jbWQpOwoJCWNtZC0+c3RhdHVzID0gSUJNQVNNX0NNRF9QRU5ESU5HOwoJCWlibWFzbV9leGVjX2NvbW1hbmQoc3AsIGNtZCk7CgkJaWJtYXNtX3dhaXRfZm9yX3Jlc3BvbnNlKGNtZCwgSUJNQVNNX0NNRF9USU1FT1VUX05PUk1BTCk7CgoJCWlmIChjbWQtPnN0YXR1cyAhPSBJQk1BU01fQ01EX0NPTVBMRVRFKQoJCQl0aW1lc19mYWlsZWQrKzsKCgkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQocmhiLT53YWl0LCAKCQkJcmhiLT5zdG9wcGVkLAoJCQlSRVZFUlNFX0hFQVJUQkVBVF9USU1FT1VUICogSFopOyAJCgoJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSB8fCByaGItPnN0b3BwZWQpIHsKCQkJcmVzdWx0ID0gLUVJTlRSOwoJCQlicmVhazsKCQl9Cgl9Cgljb21tYW5kX3B1dChjbWQpOwoJcmhiLT5zdG9wcGVkID0gMDsKCglyZXR1cm4gcmVzdWx0Owp9Cgp2b2lkIGlibWFzbV9zdG9wX3JldmVyc2VfaGVhcnRiZWF0KHN0cnVjdCByZXZlcnNlX2hlYXJ0YmVhdCAqcmhiKQp7CglyaGItPnN0b3BwZWQgPSAxOwoJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZyaGItPndhaXQpOwp9Cg==