LyoKICogWE1TIHYyKyBlbXVsYXRpb24KICoKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqCiAqIFRoaXMgWE1TIGVtdWxhdGlvbiBpcyBob29rZWQgdGhyb3VnaCB0aGUgRFBNSSBpbnRlcnJ1cHQuCiAqLwoKI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJnbG9iYWwuaCIKI2luY2x1ZGUgIm1vZHVsZS5oIgojaW5jbHVkZSAibWlzY2VtdS5oIgojaW5jbHVkZSAidG9vbGhlbHAuaCIKI2luY2x1ZGUgImRlYnVnLmgiCiNpbmNsdWRlICJzZWxlY3RvcnMuaCIKCnR5cGVkZWYgc3RydWN0IHsKIFdPUkQgSGFuZGxlOwogRFdPUkQgT2Zmc2V0Owp9IFdJTkVfUEFDS0VEIE1PVkVPRlM7Cgp0eXBlZGVmIHN0cnVjdCB7CiBEV09SRCBMZW5ndGg7CiBNT1ZFT0ZTIFNvdXJjZTsKIE1PVkVPRlMgRGVzdDsKfSBXSU5FX1BBQ0tFRCBNT1ZFU1RSVUNUOwoKc3RhdGljIEJZVEUgKiBYTVNfT2Zmc2V0KCBNT1ZFT0ZTICpvZnMgKQp7CiAgICBpZiAob2ZzLT5IYW5kbGUpIHJldHVybiAoQllURSopR2xvYmFsTG9jazE2KG9mcy0+SGFuZGxlKStvZnMtPk9mZnNldDsKICAgICAgICBlbHNlIHJldHVybiAoQllURSopRE9TTUVNX01hcFJlYWxUb0xpbmVhcihvZnMtPk9mZnNldCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCSAgICBYTVNfSGFuZGxlcgogKi8KCnZvaWQgV0lOQVBJIFhNU19IYW5kbGVyKCBDT05URVhUICpjb250ZXh0ICkKewogICAgc3dpdGNoKEFIX3JlZyhjb250ZXh0KSkKICAgIHsKICAgIGNhc2UgMHgwMDogICAvKiBHZXQgWE1TIHZlcnNpb24gbnVtYmVyICovCiAgICAgICAgVFJBQ0UoaW50MzEsICJnZXQgWE1TIHZlcnNpb24gbnVtYmVyXG4iKTsKICAgICAgICBBWF9yZWcoY29udGV4dCkgPSAweDAyMDA7IC8qIDIuMCAqLwogICAgICAgIEJYX3JlZyhjb250ZXh0KSA9IDB4MDAwMDsgLyogaW50ZXJuYWwgcmV2aXNpb24gKi8KICAgICAgICBEWF9yZWcoY29udGV4dCkgPSAweDAwMDE7IC8qIEhNQSBleGlzdHMgKi8KICAgICAgICBicmVhazsKICAgIGNhc2UgMHgwODogICAvKiBRdWVyeSBGcmVlIEV4dGVuZGVkIE1lbW9yeSAqLwogICAgewoJTUVNTUFOSU5GTyBtbWk7CgogICAgICAgIFRSQUNFKGludDMxLCAicXVlcnkgZnJlZSBleHRlbmRlZCBtZW1vcnlcbiIpOwoJbW1pLmR3U2l6ZSA9IHNpemVvZihtbWkpOwoJTWVtTWFuSW5mbzE2KCZtbWkpOwogICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IG1taS5kd0xhcmdlc3RGcmVlQmxvY2sgPj4gMTA7CgkgICAgRFhfcmVnKGNvbnRleHQpID0gKG1taS5kd0ZyZWVQYWdlcyAqIFZJUlRVQUxfR2V0UGFnZVNpemUoKSkgPj4gMTA7CiAgICAgICAgVFJBQ0UoaW50MzEsICJyZXR1cm5pbmcgbGFyZ2VzdCAlZEssIHRvdGFsICVkS1xuIiwgQVhfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkpOwogICAgfQogICAgYnJlYWs7CiAgICBjYXNlIDB4MDk6ICAgLyogQWxsb2NhdGUgRXh0ZW5kZWQgTWVtb3J5IEJsb2NrICovCiAgICAgICAgVFJBQ0UoaW50MzEsICJhbGxvY2F0ZSBleHRlbmRlZCBtZW1vcnkgYmxvY2sgKCVkSylcbiIsCiAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSk7CglEWF9yZWcoY29udGV4dCkgPSBHbG9iYWxBbGxvYzE2KEdNRU1fTU9WRUFCTEUsCgkgICAgKERXT1JEKURYX3JlZyhjb250ZXh0KTw8MTApOwoJQVhfcmVnKGNvbnRleHQpID0gRFhfcmVnKGNvbnRleHQpID8gMSA6IDA7CglpZiAoIURYX3JlZyhjb250ZXh0KSkgQkxfcmVnKGNvbnRleHQpID0gMHhBMDsgLyogb3V0IG9mIG1lbW9yeSAqLwoJYnJlYWs7CiAgICBjYXNlIDB4MGE6ICAgLyogRnJlZSBFeHRlbmRlZCBNZW1vcnkgQmxvY2sgKi8KCVRSQUNFKGludDMxLCAiZnJlZSBleHRlbmRlZCBtZW1vcnkgYmxvY2sgJTA0eFxuIixEWF9yZWcoY29udGV4dCkpOwoJR2xvYmFsRnJlZTE2KERYX3JlZyhjb250ZXh0KSk7CglicmVhazsKICAgIGNhc2UgMHgwYjogICAvKiBNb3ZlIEV4dGVuZGVkIE1lbW9yeSBCbG9jayAqLwogICAgewoJTU9WRVNUUlVDVCptb3ZlPUNUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LAoJICAgIERTX3JlZyhjb250ZXh0KSxFU0lfcmVnKGNvbnRleHQpKTsKICAgICAgICBCWVRFKnNyYywqZHN0OwogICAgICAgIFRSQUNFKGludDMxLCAibW92ZSBleHRlbmRlZCBtZW1vcnkgYmxvY2tcbiIpOwogICAgICAgIHNyYz1YTVNfT2Zmc2V0KCZtb3ZlLT5Tb3VyY2UpOwogICAgICAgIGRzdD1YTVNfT2Zmc2V0KCZtb3ZlLT5EZXN0KTsKCW1lbWNweShkc3Qsc3JjLG1vdmUtPkxlbmd0aCk7CglpZiAobW92ZS0+U291cmNlLkhhbmRsZSkgR2xvYmFsVW5sb2NrMTYobW92ZS0+U291cmNlLkhhbmRsZSk7CglpZiAobW92ZS0+RGVzdC5IYW5kbGUpIEdsb2JhbFVubG9jazE2KG1vdmUtPkRlc3QuSGFuZGxlKTsKCWJyZWFrOwogICAgfQogICAgZGVmYXVsdDoKICAgICAgICBJTlRfQkFSRiggY29udGV4dCwgMHgzMSApOwogICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IDB4MDAwMDsgLyogZmFpbHVyZSAqLwogICAgICAgIEJMX3JlZyhjb250ZXh0KSA9IDB4ODA7ICAgLyogZnVuY3Rpb24gbm90IGltcGxlbWVudGVkICovCiAgICAgICAgYnJlYWs7CiAgICB9Cn0K