LyoKICogWE1TIHYyKyBlbXVsYXRpb24KICoKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqCiAqIFRoaXMgWE1TIGVtdWxhdGlvbiBpcyBob29rZWQgdGhyb3VnaCB0aGUgRFBNSSBpbnRlcnJ1cHQuCiAqLwoKI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5lL3dpbmJhc2UxNi5oIgojaW5jbHVkZSAiZ2xvYmFsLmgiCiNpbmNsdWRlICJtb2R1bGUuaCIKI2luY2x1ZGUgIm1pc2NlbXUuaCIKI2luY2x1ZGUgInRvb2xoZWxwLmgiCiNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCiNpbmNsdWRlICJzZWxlY3RvcnMuaCIKCkRFRkFVTFRfREVCVUdfQ0hBTk5FTChpbnQzMSk7Cgp0eXBlZGVmIHN0cnVjdCB7CiBXT1JEIEhhbmRsZTsKIERXT1JEIE9mZnNldDsKfSBXSU5FX1BBQ0tFRCBNT1ZFT0ZTOwoKdHlwZWRlZiBzdHJ1Y3QgewogRFdPUkQgTGVuZ3RoOwogTU9WRU9GUyBTb3VyY2U7CiBNT1ZFT0ZTIERlc3Q7Cn0gV0lORV9QQUNLRUQgTU9WRVNUUlVDVDsKCnN0YXRpYyBCWVRFICogWE1TX09mZnNldCggTU9WRU9GUyAqb2ZzICkKewogICAgaWYgKG9mcy0+SGFuZGxlKSByZXR1cm4gKEJZVEUqKUdsb2JhbExvY2sxNihvZnMtPkhhbmRsZSkrb2ZzLT5PZmZzZXQ7CiAgICAgICAgZWxzZSByZXR1cm4gKEJZVEUqKURPU01FTV9NYXBSZWFsVG9MaW5lYXIob2ZzLT5PZmZzZXQpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkgICAgWE1TX0hhbmRsZXIKICovCgp2b2lkIFdJTkFQSSBYTVNfSGFuZGxlciggQ09OVEVYVDg2ICpjb250ZXh0ICkKewogICAgc3dpdGNoKEFIX3JlZyhjb250ZXh0KSkKICAgIHsKICAgIGNhc2UgMHgwMDogICAvKiBHZXQgWE1TIHZlcnNpb24gbnVtYmVyICovCiAgICAgICAgVFJBQ0UoImdldCBYTVMgdmVyc2lvbiBudW1iZXJcbiIpOwogICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IDB4MDIwMDsgLyogMi4wICovCiAgICAgICAgQlhfcmVnKGNvbnRleHQpID0gMHgwMDAwOyAvKiBpbnRlcm5hbCByZXZpc2lvbiAqLwogICAgICAgIERYX3JlZyhjb250ZXh0KSA9IDB4MDAwMTsgLyogSE1BIGV4aXN0cyAqLwogICAgICAgIGJyZWFrOwogICAgY2FzZSAweDA4OiAgIC8qIFF1ZXJ5IEZyZWUgRXh0ZW5kZWQgTWVtb3J5ICovCiAgICB7CglNRU1NQU5JTkZPIG1taTsKCiAgICAgICAgVFJBQ0UoInF1ZXJ5IGZyZWUgZXh0ZW5kZWQgbWVtb3J5XG4iKTsKCW1taS5kd1NpemUgPSBzaXplb2YobW1pKTsKCU1lbU1hbkluZm8xNigmbW1pKTsKICAgICAgICBBWF9yZWcoY29udGV4dCkgPSBtbWkuZHdMYXJnZXN0RnJlZUJsb2NrID4+IDEwOwoJICAgIERYX3JlZyhjb250ZXh0KSA9IChtbWkuZHdGcmVlUGFnZXMgKiBWSVJUVUFMX0dldFBhZ2VTaXplKCkpID4+IDEwOwogICAgICAgIFRSQUNFKCJyZXR1cm5pbmcgbGFyZ2VzdCAlZEssIHRvdGFsICVkS1xuIiwgQVhfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkpOwogICAgfQogICAgYnJlYWs7CiAgICBjYXNlIDB4MDk6ICAgLyogQWxsb2NhdGUgRXh0ZW5kZWQgTWVtb3J5IEJsb2NrICovCiAgICAgICAgVFJBQ0UoImFsbG9jYXRlIGV4dGVuZGVkIG1lbW9yeSBibG9jayAoJWRLKVxuIiwKICAgICAgICAgICAgRFhfcmVnKGNvbnRleHQpKTsKCURYX3JlZyhjb250ZXh0KSA9IEdsb2JhbEFsbG9jMTYoR01FTV9NT1ZFQUJMRSwKCSAgICAoRFdPUkQpRFhfcmVnKGNvbnRleHQpPDwxMCk7CglBWF9yZWcoY29udGV4dCkgPSBEWF9yZWcoY29udGV4dCkgPyAxIDogMDsKCWlmICghRFhfcmVnKGNvbnRleHQpKSBCTF9yZWcoY29udGV4dCkgPSAweEEwOyAvKiBvdXQgb2YgbWVtb3J5ICovCglicmVhazsKICAgIGNhc2UgMHgwYTogICAvKiBGcmVlIEV4dGVuZGVkIE1lbW9yeSBCbG9jayAqLwoJVFJBQ0UoImZyZWUgZXh0ZW5kZWQgbWVtb3J5IGJsb2NrICUwNHhcbiIsRFhfcmVnKGNvbnRleHQpKTsKCUdsb2JhbEZyZWUxNihEWF9yZWcoY29udGV4dCkpOwoJYnJlYWs7CiAgICBjYXNlIDB4MGI6ICAgLyogTW92ZSBFeHRlbmRlZCBNZW1vcnkgQmxvY2sgKi8KICAgIHsKCU1PVkVTVFJVQ1QqbW92ZT1DVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwKCSAgICBjb250ZXh0LT5TZWdEcyxjb250ZXh0LT5Fc2kpOwogICAgICAgIEJZVEUqc3JjLCpkc3Q7CiAgICAgICAgVFJBQ0UoIm1vdmUgZXh0ZW5kZWQgbWVtb3J5IGJsb2NrXG4iKTsKICAgICAgICBzcmM9WE1TX09mZnNldCgmbW92ZS0+U291cmNlKTsKICAgICAgICBkc3Q9WE1TX09mZnNldCgmbW92ZS0+RGVzdCk7CgltZW1jcHkoZHN0LHNyYyxtb3ZlLT5MZW5ndGgpOwoJaWYgKG1vdmUtPlNvdXJjZS5IYW5kbGUpIEdsb2JhbFVubG9jazE2KG1vdmUtPlNvdXJjZS5IYW5kbGUpOwoJaWYgKG1vdmUtPkRlc3QuSGFuZGxlKSBHbG9iYWxVbmxvY2sxNihtb3ZlLT5EZXN0LkhhbmRsZSk7CglicmVhazsKICAgIH0KICAgIGRlZmF1bHQ6CiAgICAgICAgSU5UX0JBUkYoIGNvbnRleHQsIDB4MzEgKTsKICAgICAgICBBWF9yZWcoY29udGV4dCkgPSAweDAwMDA7IC8qIGZhaWx1cmUgKi8KICAgICAgICBCTF9yZWcoY29udGV4dCkgPSAweDgwOyAgIC8qIGZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZCAqLwogICAgICAgIGJyZWFrOwogICAgfQp9Cg==