I2lmbmRlZiBHSU1fTUFUSF9IX0lOQ0xVREVECiNkZWZpbmUgR0lNX01BVEhfSF9JTkNMVURFRAovKiEgXGZpbGUgZ2ltX21hdGguaApcYXV0aG9yIEZyYW5jaXNjbyBMZX9uIE7famVyYQoqLwovKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpUaGlzIHNvdXJjZSBmaWxlIGlzIHBhcnQgb2YgR0lNUEFDVCBMaWJyYXJ5LgoKRm9yIHRoZSBsYXRlc3QgaW5mbywgc2VlIGh0dHA6Ly9naW1wYWN0LnNvdXJjZWZvcmdlLm5ldC8KCkNvcHlyaWdodCAoYykgMjAwNiBGcmFuY2lzY28gTGVvbiBOYWplcmEuIEMuQy4gODAwODczNzEuCmVtYWlsOiBwcm9qZWN0aWxlbWFuQHlhaG9vLmNvbQoKIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgRUlUSEVSOgogICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CiAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIFRoZSB0ZXh0IG9mIHRoZSBHTlUgTGVzc2VyCiAgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBsaWJyYXJ5IGluIHRoZQogICAgICAgZmlsZSBHSU1QQUNULUxJQ0VOU0UtTEdQTC5UWFQuCiAgICgyKSBUaGUgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgbGlicmFyeSBpbgogICAgICAgdGhlIGZpbGUgR0lNUEFDVC1MSUNFTlNFLUJTRC5UWFQuCiAgICgzKSBUaGUgemxpYi9saWJwbmcgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBsaWJyYXJ5IGluCiAgICAgICB0aGUgZmlsZSBHSU1QQUNULUxJQ0VOU0UtWkxJQi5UWFQuCgogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIGZpbGVzCiBHSU1QQUNULUxJQ0VOU0UtTEdQTC5UWFQsIEdJTVBBQ1QtTElDRU5TRS1aTElCLlRYVCBhbmQgR0lNUEFDVC1MSUNFTlNFLUJTRC5UWFQgZm9yIG1vcmUgZGV0YWlscy4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiovCgojaW5jbHVkZSAiTGluZWFyTWF0aC9idFNjYWxhci5oIgoKCgojZGVmaW5lIEdSRUFMIGJ0U2NhbGFyCiNkZWZpbmUgR1JFQUwyIGRvdWJsZQojZGVmaW5lIEdJTlQgaW50CiNkZWZpbmUgR1VJTlQgdW5zaWduZWQgaW50CiNkZWZpbmUgR1NIT1JUIHNob3J0CiNkZWZpbmUgR1VTSE9SVCB1bnNpZ25lZCBzaG9ydAojZGVmaW5lIEdJTlQ2NCBsb25nIGxvbmcKI2RlZmluZSBHVUlOVDY0IHVuc2lnbmVkIGxvbmcgbG9uZwoKCgojZGVmaW5lIEdfUEkgMy4xNDE1OTI2NTM1ODk3OWYKI2RlZmluZSBHX0hBTEZfUEkgMS41NzA3OTYzZgovLzI2Nzk0ODk2NgojZGVmaW5lIEdfVFdPX1BJIDYuMjgzMTg1MzBmCi8vNzE3OTU4NjQKI2RlZmluZSBHX1JPT1QzIDEuNzMyMDVmCiNkZWZpbmUgR19ST09UMiAxLjQxNDIxZgojZGVmaW5lIEdfVUlOVF9JTkZJTklUWSAweGZmZmZmZmZmIC8vITwgQSB2ZXJ5IHZlcnkgaGlnaCB2YWx1ZQojZGVmaW5lIEdfUkVBTF9JTkZJTklUWSBGTFRfTUFYCiNkZWZpbmUJR19TSUdOX0JJVE1BU0sJCQkweDgwMDAwMDAwCiNkZWZpbmUgR19FUFNJTE9OIFNJTURfRVBTSUxPTgoKCgplbnVtIEdJTV9TQ0FMQVJfVFlQRVMKewoJR19TVFlQRV9SRUFMID0wLAoJR19TVFlQRV9SRUFMMiwKCUdfU1RZUEVfU0hPUlQsCglHX1NUWVBFX1VTSE9SVCwKCUdfU1RZUEVfSU5ULAoJR19TVFlQRV9VSU5ULAoJR19TVFlQRV9JTlQ2NCwKCUdfU1RZUEVfVUlOVDY0Cn07CgoKCiNkZWZpbmUgR19ERUdUT1JBRChYKSAoKFgpKjMuMTQxNTkyNmYvMTgwLjBmKQojZGVmaW5lIEdfUkFEVE9ERUcoWCkgKChYKSoxODAuMGYvMy4xNDE1OTI2ZikKCi8vISBJbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIGEgZmxvYXRpbmctcG9pbnQgdmFsdWUuCiNkZWZpbmUgR0lNX0lSKHgpCQkJCQkoKEdVSU5UJikoeCkpCgovLyEgU2lnbmVkIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgYSBmbG9hdGluZy1wb2ludCB2YWx1ZS4KI2RlZmluZSBHSU1fU0lSKHgpCQkJCQkoKEdJTlQmKSh4KSkKCi8vISBBYnNvbHV0ZSBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIGEgZmxvYXRpbmctcG9pbnQgdmFsdWUKI2RlZmluZSBHSU1fQUlSKHgpCQkJCQkoR0lNX0lSKHgpJjB4N2ZmZmZmZmYpCgovLyEgRmxvYXRpbmctcG9pbnQgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZWdlciB2YWx1ZS4KI2RlZmluZSBHSU1fRlIoeCkJCQkJCSgoR1JFQUwmKSh4KSkKCiNkZWZpbmUgR0lNX01BWChhLGIpIChhPGI/YjphKQojZGVmaW5lIEdJTV9NSU4oYSxiKSAoYT5iP2I6YSkKCiNkZWZpbmUgR0lNX01BWDMoYSxiLGMpIEdJTV9NQVgoYSxHSU1fTUFYKGIsYykpCiNkZWZpbmUgR0lNX01JTjMoYSxiLGMpIEdJTV9NSU4oYSxHSU1fTUlOKGIsYykpCgojZGVmaW5lIEdJTV9JU19aRVJPKHZhbHVlKSAodmFsdWUgPCBHX0VQU0lMT04gJiYgIHZhbHVlID4gLUdfRVBTSUxPTikKCiNkZWZpbmUgR0lNX0lTX05FR0FUSVZFKHZhbHVlKSAodmFsdWUgPD0gLUdfRVBTSUxPTikKCiNkZWZpbmUgR0lNX0lTX1BPU0lTSVRWRSh2YWx1ZSkgKHZhbHVlID49IEdfRVBTSUxPTikKCiNkZWZpbmUgR0lNX05FQVJfRVFVQUwodjEsdjIpIEdJTV9JU19aRVJPKCh2MS12MikpCgovLy9yZXR1cm5zIGEgY2xhbXBlZCBudW1iZXIKI2RlZmluZSBHSU1fQ0xBTVAobnVtYmVyLG1pbnZhbCxtYXh2YWwpIChudW1iZXI8bWludmFsP21pbnZhbDoobnVtYmVyPm1heHZhbD9tYXh2YWw6bnVtYmVyKSkKCiNkZWZpbmUgR0lNX0dSRUFURVIoeCwgeSkJYnRGYWJzKHgpID4gKHkpCgovLy9Td2FwIG51bWJlcnMKI2RlZmluZSBHSU1fU1dBUF9OVU1CRVJTKGEsYil7IFwKICAgIGEgPSBhK2I7IFwKICAgIGIgPSBhLWI7IFwKICAgIGEgPSBhLWI7IFwKfVwKCiNkZWZpbmUgR0lNX0lOVl9TUVJUKHZhLGlzdmEpXAp7XAogICAgaWYodmE8PTAuMDAwMDAwMWYpXAogICAge1wKICAgICAgICBpc3ZhID0gR19SRUFMX0lORklOSVRZO1wKICAgIH1cCiAgICBlbHNlXAogICAge1wKICAgICAgICBHUkVBTCBfeCA9IHZhICogMC41ZjtcCiAgICAgICAgR1VJTlQgX3kgPSAweDVmMzc1OWRmIC0gKCBHSU1fSVIodmEpID4+IDEpO1wKICAgICAgICBpc3ZhID0gR0lNX0ZSKF95KTtcCiAgICAgICAgaXN2YSAgPSBpc3ZhICogKCAxLjVmIC0gKCBfeCAqIGlzdmEgKiBpc3ZhICkgKTtcCiAgICB9XAp9XAoKI2RlZmluZSBHSU1fU1FSVCh2YSxzdmEpXAp7XAogICAgR0lNX0lOVl9TUVJUKHZhLHN2YSk7XAogICAgc3ZhID0gMS4wZi9zdmE7XAp9XAoKLy8hIENvbXB1dGVzIDEuMGYgLyBzcXJ0Zih4KS4gQ29tZXMgZnJvbSBRdWFrZTMuIFNlZSBodHRwOi8vd3d3Lm1hZ2ljLXNvZnR3YXJlLmNvbS8zREdFREludlNxcnQuaHRtbAppbmxpbmUgR1JFQUwgZ2ltX2ludl9zcXJ0KEdSRUFMIGYpCnsKICAgIEdSRUFMIHI7CiAgICBHSU1fSU5WX1NRUlQoZixyKTsKICAgIHJldHVybiByOwp9CgppbmxpbmUgR1JFQUwgZ2ltX3NxcnQoR1JFQUwgZikKewogICAgR1JFQUwgcjsKICAgIEdJTV9TUVJUKGYscik7CiAgICByZXR1cm4gcjsKfQoKCgojZW5kaWYgLy8gR0lNX01BVEhfSF9JTkNMVURFRAo=