LyoKICogQ29weXJpZ2h0IChjKSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiBDb3B5cmlnaHQgKGMpIEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcyBMaW1pdGVkLCBVSwogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCiAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAogKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCiAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwogKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAqCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCiAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCiAqIG9mIHRoZSBTb2Z0d2FyZS4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgogKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgogKiBJTiBOTyBFVkVOVCBTSEFMTCBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCiAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAogKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQogKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICoKICogQXV0aG9yczoKICogICAgRWxhaW5lIFdhbmcgPGVsYWluZS53YW5nQGludGVsLmNvbT4KICogICAgWmVuZyBMaSA8emVuZy5saUBpbnRlbC5jb20+CiAqCiAqLwoKCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlICJpbWdfdHlwZXMuaCIKI2luY2x1ZGUgInBzYl9kZWYuaCIKI2luY2x1ZGUgInBzYl9kcnZfZGVidWcuaCIKI2luY2x1ZGUgInBud19ob3N0aGVhZGVyLmgiCgoKLyogR2xvYmFsIHN0b3JlcyB0aGUgbGF0ZXN0IFFQIGluZm9ybWF0aW9uIGZvciB0aGUgRG9IZWFkZXIoKQogKiByb3V0aW5lLCBzaG91bGQgYmUgZmlsbGVkIGluIGJ5IHRoZSByYXRlIGNvbnRyb2wgYWxnb3JpdGhtLgogKi8KI2RlZmluZSBIRUFERVJTX1ZFUkJPU0VfT1VUUFVUIDAKCi8qICNkZWZpbmUgVVNFU1RBVElDV0hFUkVQT1NTSUJMRSAxICovCgojZGVmaW5lIE1BWE5VTUJFUkVMRU1FTlRTIDE2CiNkZWZpbmUgSEVBREVSX1NJWkUgKDEyOCoyKQoKLyogU09NRSBVU0VGVUwgVEVTVCBGVU5DVElPTlMgKi8KI2lmIDAKCnN0YXRpYyB2b2lkIFNob3dfQml0cygKICAgIElNR19VSU5UOCAqdWNCaXRTdHJlYW0sCiAgICBJTUdfVUlOVDMyIEJ5dGVTdGFydEJpdCwKICAgIElNR19VSU5UMzIgQml0cykKewogICAgY2hhciBUeHRbMTAyNF07CiAgICBJTUdfVUlOVDMyIHVpQnl0ZVNpemU7CiAgICBJTUdfVUlOVDMyIHVpTHAsIHVpQnQsIEJjbnQ7CiAgICBCY250ID0gMDsKICAgIHVpQnl0ZVNpemUgPSAoQml0cyArIEJ5dGVTdGFydEJpdCArIDcpID4+IDM7CiAgICBmb3IgKHVpTHAgPSAwOyB1aUxwIDwgdWlCeXRlU2l6ZTsgdWlMcCsrKSB7CiAgICAgICAgc25wcmludGYoVHh0LCBzdHJsZW4oIiAiKSwgIiAiKTsKICAgICAgICBmb3IgKHVpQnQgPSAxMjg7IHVpQnQgPj0gMTsgdWlCdCA9IHVpQnQgPj4gMSkgewogICAgICAgICAgICBCY250Kys7CiAgICAgICAgICAgIGlmIChCY250ID4gQml0cyArIEJ5dGVTdGFydEJpdCB8fCBCY250IDw9IEJ5dGVTdGFydEJpdCkKICAgICAgICAgICAgICAgIHNucHJpbnRmKFR4dCwgc2l6ZW9mKFR4dCksICIlc1giLCBUeHQpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzbnByaW50ZihUeHQsIHNpemVvZihUeHQpLCAiJXMlaSIsIFR4dCwgKHVjQml0U3RyZWFtW3VpTHBdICYgdWlCdCkgPiAwKTsKICAgICAgICB9CgogICAgICAgIHNucHJpbnRmKFR4dCwgc2l6ZW9mKFR4dCksICIlcyAiLCBUeHQpOwogICAgICAgIHByaW50ZigiJXMiLCBUeHQpOwogICAgICAgIGlmICgodWlMcCArIDEpICUgOCA9PSAwKSBwcmludGYoIlxuIik7CiAgICB9CgogICAgcHJpbnRmKCJcblxuIik7Cn0KI2VuZGlmCgojaWYgMAoKc3RhdGljIHZvaWQgU2hvd19FbGVtZW50cygKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyLAogICAgTVRYX0hFQURFUl9FTEVNRU5UICoqZWx0X3ApCnsKICAgIElNR19VSU5UOCBmOwogICAgSU1HX1VJTlQzMiBUb3RhbEJ5dGVTaXplOwogICAgSU1HX1VJTlQzMiBSVG90YWxCeXRlU2l6ZTsKCiAgICBSVG90YWxCeXRlU2l6ZSA9IFRvdGFsQnl0ZVNpemUgPSAwOwogICAgZm9yIChmID0gMDsgZiA8IG10eF9oZHItPkVsZW1lbnRzOyBmKyspIHsKI2lmIEhFQURFUlNfVkVSQk9TRV9PVVRQVVQKICAgICAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0dFTkVSQUwsICJFbmNvZGluZyBFbGVtZW50IFslaV0gLSBUeXBlOiVpXG4iLCBmLCBlbHRfcFtmXS0+RWxlbWVudF9UeXBlKTsKI2VuZGlmCiAgICAgICAgaWYgKGVsdF9wW2ZdLT5FbGVtZW50X1R5cGUgPT0gRUxFTUVOVF9TVEFSVENPREVfUkFXREFUQSB8fAogICAgICAgICAgICBlbHRfcFtmXS0+RWxlbWVudF9UeXBlID09IEVMRU1FTlRfUkFXREFUQSkgewogICAgICAgICAgICBUb3RhbEJ5dGVTaXplID0gZWx0X3BbZl0tPlNpemU7CiNpZiBIRUFERVJTX1ZFUkJPU0VfT1VUUFVUCiAgICAgICAgICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgIldyaXRpbmcgJWkgUkFXIGJpdHMgdG8gZWxlbWVudC5cbiIsIGVsdF9wW2ZdLT5TaXplKTsKICAgICAgICAgICAgU2hvd19CaXRzKChJTUdfVUlOVDggKikoJmVsdF9wW2ZdLT5TaXplKSArIDEsIDAsIFRvdGFsQnl0ZVNpemUpOwojZW5kaWYKICAgICAgICAgICAgVG90YWxCeXRlU2l6ZSArPSA4OwoKICAgICAgICAgICAgUlRvdGFsQnl0ZVNpemUgKz0gKCgoSU1HX1VJTlQzMikoKFRvdGFsQnl0ZVNpemUgKyA3KSAvIDgpKSAqIDgpOwogICAgICAgICAgICBSVG90YWxCeXRlU2l6ZSArPSAzMjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBUb3RhbEJ5dGVTaXplID0gMDsKICAgICAgICAgICAgc3dpdGNoIChlbHRfcFtmXS0+RWxlbWVudF9UeXBlKSB7CiAgICAgICAgICAgIGNhc2UgRUxFTUVOVF9RUDoKI2lmIEhFQURFUlNfVkVSQk9TRV9PVVRQVVQKICAgICAgICAgICAgICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgIkluc2VydCB0b2tlbiBFTEVNRU5UX1FQIChIMjY0KS0gZm9yIE1UWCB0byBnZW5lcmF0ZSBhbmQgaW5zZXJ0IHRoaXMgdmFsdWVcbiIpOwojZW5kaWYKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEVMRU1FTlRfU1FQOgojaWYgSEVBREVSU19WRVJCT1NFX09VVFBVVAogICAgICAgICAgICAgICAgZHJ2X2RlYnVnX21zZyhWSURFT19ERUJVR19HRU5FUkFMLCAiSW5zZXJ0IHRva2VuIEVMRU1FTlRfU1FQIChIMjY0KS0gZm9yIE1UWCB0byBnZW5lcmF0ZSBhbmQgaW5zZXJ0IHRoaXMgdmFsdWVcbiIpOwojZW5kaWYKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEVMRU1FTlRfRlJBTUVRU0NBTEU6CiNpZiBIRUFERVJTX1ZFUkJPU0VfT1VUUFVUCiAgICAgICAgICAgICAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0dFTkVSQUwsICJJbnNlcnQgdG9rZW4gRUxFTUVOVF9GUkFNRVFTQ0FMRSAoSDI2My9NUEVHNCkgLSBmb3IgTVRYIHRvIGdlbmVyYXRlIGFuZCBpbnNlcnQgdGhpcyB2YWx1ZVxuIik7CiNlbmRpZgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgRUxFTUVOVF9TTElDRVFTQ0FMRToKI2lmIEhFQURFUlNfVkVSQk9TRV9PVVRQVVQKICAgICAgICAgICAgICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgIkluc2VydCB0b2tlbiBFTEVNRU5UX1NMSUNFUVNDQUxFIChIMjYzL01QRUc0KSAtIGZvciBNVFggdG8gZ2VuZXJhdGUgYW5kIGluc2VydCB0aGlzIHZhbHVlXG4iKTsKI2VuZGlmCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBFTEVNRU5UX0lOU0VSVEJZVEVBTElHTl9IMjY0OgojaWYgSEVBREVSU19WRVJCT1NFX09VVFBVVAogICAgICAgICAgICAgICAgZHJ2X2RlYnVnX21zZyhWSURFT19ERUJVR19HRU5FUkFMLCAiSW5zZXJ0IHRva2VuIEVMRU1FTlRfSU5TRVJUQllURUFMSUdOX0gyNjQgLSAgTVRYIHRvIGdlbmVyYXRlICdyYnNwX3RyYWlsaW5nX2JpdHMoKScgZmllbGRcbiIpOwojZW5kaWYKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEVMRU1FTlRfSU5TRVJUQllURUFMSUdOX01QRzQ6CiNpZiBIRUFERVJTX1ZFUkJPU0VfT1VUUFVUCiAgICAgICAgICAgICAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0dFTkVSQUwsICJJbnNlcnQgdG9rZW4gRUxFTUVOVF9JTlNFUlRCWVRFQUxJR05fTVBHNCAtICBNVFggdG8gZ2VuZXJhdGUgTVBFRzQgJ2J5dGVfYWxpZ25lZF9iaXRzJyBmaWVsZFxuIik7CiNlbmRpZgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgUlRvdGFsQnl0ZVNpemUgKz0gMzI7CiNpZiBIRUFERVJTX1ZFUkJPU0VfT1VUUFVUCiAgICAgICAgICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgIk5vIFJBVyBiaXRzXG5cbiIpOwojZW5kaWYKICAgICAgICB9CiAgICB9CgogICAgLyogVG90YWxCeXRlU2l6ZT1Ub3RhbEJ5dGVTaXplKzMyKygmZWx0X3BbZi0xXS0+RWxlbWVudF9UeXBlLSZlbHRfcFswXS0+RWxlbWVudF9UeXBlKSo4OyAqLwoKI2lmIEhFQURFUlNfVkVSQk9TRV9PVVRQVVQKICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgIlxuQ29tYmluZWQgRUxFTUVOVFMgU3RyZWFtOlxuIik7CiAgICBTaG93X0JpdHMoKElNR19VSU5UOCAqKSBtdHhfaGRyLT5hc0VsZW1lbnRTdHJlYW0sIDAsIFJUb3RhbEJ5dGVTaXplKTsKI2VuZGlmCn0KI2VuZGlmCgoKLyoqCiAqIEhlYWRlciBXcml0aW5nIEZ1bmN0aW9ucwogKiBMb3cgbGV2ZWwgYml0IHdyaXRpbmcgYW5kIHVlLCBzZSBmdW5jdGlvbnMKICogSE9TVCBDT0RFCiAqLwpzdGF0aWMgdm9pZCBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cygKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyLAogICAgTVRYX0hFQURFUl9FTEVNRU5UICoqZWx0X3AsCiAgICBJTUdfVUlOVDggd3J0X2JpdHMsCiAgICBJTUdfVUlOVDE2IGJpdF9jbnQpCnsKICAgIC8qIFRoaXMgaXMgdGhlIGNvcmUgZnVuY3Rpb24gdG8gd3JpdGUgYml0cy9ieXRlcwogICAgICogdG8gYSBoZWFkZXIgc3RyZWFtLCBpdCB3cml0ZXMgdGhlbSBkaXJlY3RseSB0byBFTEVNRU5UIHN0cnVjdHVyZXMuCiAgICAgKi8KICAgIElNR19VSU5UOCAqd3J0X2J5dGVzX3A7CiAgICBJTUdfVUlOVDggKnNpemVfYml0c19wOwogICAgdW5pb24gewogICAgICAgIElNR19VSU5UMzIgVUkxNklucHV0OwogICAgICAgIElNR19VSU5UOCBVSThJbnB1dFsyXTsKICAgIH0gSW5wdXRWYWwgPSB7MCwgfTsKICAgIElNR19VSU5UOCBPdXRCeXRlSW5kZXg7CiAgICBJTUdfSU5UMTYgU2hpZnQ7CgogICAgaWYgKGJpdF9jbnQgPT0gMCkgcmV0dXJuOwoKICAgIC8qIFdBIGZvciBrbG9ja3dvcmsgKi8KICAgIGlmIChtdHhfaGRyLT5FbGVtZW50cyA+PSBNQVhOVU1CRVJFTEVNRU5UUykgewogICAgICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfRVJST1IsICJtdHhfaGRyLT5FbG1lbnRzIG92ZXJmbG93XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogRmlyc3QgZW5zdXJlIHRoYXQgdW51c2VkIGJpdHMgaW4gd3J0X2JpdHMgYXJlIHplcm9lZCAqLwogICAgd3J0X2JpdHMgJj0gKDB4MDBmZiA+PiAoOCAtIGJpdF9jbnQpKTsKCiAgICBJbnB1dFZhbC5VSTE2SW5wdXQgPSAwOwoKICAgIC8qIFBvaW50ZXIgdG8gdGhlIGJpdCBjb3VudCBmaWVsZCAqLwogICAgc2l6ZV9iaXRzX3AgPSAmKGVsdF9wW210eF9oZHItPkVsZW1lbnRzXS0+U2l6ZSk7CgogICAgLyogUG9pbnRlciB0byB0aGUgc3BhY2Ugd2hlcmUgaGVhZGVyIGJpdHMgYXJlIHRvIGJlIHdyaXR0ZW4gKi8KICAgIHdydF9ieXRlc19wID0gJihlbHRfcFttdHhfaGRyLT5FbGVtZW50c10tPkJpdHMpOwoKICAgIE91dEJ5dGVJbmRleCA9IChzaXplX2JpdHNfcFswXSAvIDgpOwoKICAgIGlmICghKHNpemVfYml0c19wWzBdICYgNykpIHsKICAgICAgICBpZiAoc2l6ZV9iaXRzX3BbMF0gPj0gMTIwICYmICgobXR4X2hkci0+RWxlbWVudHMgKyAxKSA8IE1BWE5VTUJFUkVMRU1FTlRTKSkgewogICAgICAgICAgICAvKiBFbGVtZW50IG1heGltdW0gYml0cyBzZW5kIHRvIGVsZW1lbnQsIHRpbWUgdG8gc3RhcnQgYSBuZXcgb25lICovCiAgICAgICAgICAgIG10eF9oZHItPkVsZW1lbnRzKys7IC8qIEluY3JlbWVudCBlbGVtZW50IGluZGV4ICovCiAgICAgICAgICAgIC8qIEVsZW1lbnQgcG9pbnRlciBzZXQgdG8gcG9zaXRpb24gb2YgbmV4dCBlbGVtZW50ICgxMjAvOCA9IDE1IGJ5dGVzKSAqLwogICAgICAgICAgICBlbHRfcFttdHhfaGRyLT5FbGVtZW50c10gPSAoTVRYX0hFQURFUl9FTEVNRU5UICopICYgd3J0X2J5dGVzX3BbMTVdOwoKICAgICAgICAgICAgLyogV3JpdGUgRUxFTUVOVF9UWVBFICovCiAgICAgICAgICAgIGVsdF9wW210eF9oZHItPkVsZW1lbnRzXS0+RWxlbWVudF9UeXBlID0gRUxFTUVOVF9SQVdEQVRBOwoKICAgICAgICAgICAgLyogU2V0IG5ldyBlbGVtZW50IHNpemUgKGJpdHMpIHRvIHplcm8gKi8KICAgICAgICAgICAgZWx0X3BbbXR4X2hkci0+RWxlbWVudHNdLT5TaXplID0gMDsKCiAgICAgICAgICAgIC8qIEJlZ2luIHdyaXRpbmcgdG8gdGhlIG5ldyBlbGVtZW50ICovCiAgICAgICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCB3cnRfYml0cywgYml0X2NudCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHdydF9ieXRlc19wW091dEJ5dGVJbmRleF0gPSAwOyAvKiBCZWdpbm5pbmcgYSBuZXcgYnl0ZSwgY2xlYXIgYnl0ZSAqLwogICAgfQoKICAgIFNoaWZ0ID0gKElNR19JTlQxNikoKDggLSBiaXRfY250KSAtIChzaXplX2JpdHNfcFswXSAmIDcpKTsKCiAgICBpZiAoU2hpZnQgPj0gMCkgewogICAgICAgIHdydF9iaXRzIDw8PSBTaGlmdDsKICAgICAgICB3cnRfYnl0ZXNfcFtPdXRCeXRlSW5kZXhdIHw9IHdydF9iaXRzOwogICAgICAgIHNpemVfYml0c19wWzBdID0gc2l6ZV9iaXRzX3BbMF0gKyBiaXRfY250OwogICAgfSBlbHNlIHsKICAgICAgICBJbnB1dFZhbC5VSThJbnB1dFsxXSA9IChJTUdfVUlOVDgpIHdydF9iaXRzICsgMjU2OwogICAgICAgIElucHV0VmFsLlVJMTZJbnB1dCA+Pj0gLVNoaWZ0OwoKICAgICAgICB3cnRfYnl0ZXNfcFtPdXRCeXRlSW5kZXhdIHw9IElucHV0VmFsLlVJOElucHV0WzFdOwoKICAgICAgICBzaXplX2JpdHNfcFswXSA9IHNpemVfYml0c19wWzBdICsgYml0X2NudDsKICAgICAgICBzaXplX2JpdHNfcFswXSA9IHNpemVfYml0c19wWzBdIC0gKChJTUdfVUlOVDgpIC0gU2hpZnQpOwogICAgICAgIElucHV0VmFsLlVJOElucHV0WzBdID0gSW5wdXRWYWwuVUk4SW5wdXRbMF0gPj4gKDggKyBTaGlmdCk7CgogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCBJbnB1dFZhbC5VSThJbnB1dFswXSwgKElNR19VSU5UMTYpIC0gU2hpZnQpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBwbndfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMoCiAgICBNVFhfSEVBREVSX1BBUkFNUyAqbXR4X2hkciwKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqKmVsdF9wLAogICAgSU1HX1VJTlQzMiB3cnRfYml0cywKICAgIElNR19VSU5UMzIgYml0X2NudCkKewogICAgSU1HX1VJTlQzMiBCaXRMcDsKICAgIElNR19VSU5UMzIgRW5kQnl0ZTsKICAgIElNR19VSU5UOCBCeXRlc1s0XTsKCiAgICBmb3IgKEJpdExwID0gMDsgQml0THAgPCA0OyBCaXRMcCsrKSB7CiAgICAgICAgQnl0ZXNbQml0THBdID0gKElNR19VSU5UOCkod3J0X2JpdHMgJiAyNTUpOwogICAgICAgIHdydF9iaXRzID0gd3J0X2JpdHMgPj4gODsKICAgIH0KCiAgICBFbmRCeXRlID0gKChiaXRfY250ICsgNykgLyA4KTsKCiAgICBpZiAoKGJpdF9jbnQpICUgOCkKICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgQnl0ZXNbRW5kQnl0ZS0xXSwgKElNR19VSU5UOCkoKGJpdF9jbnQpICUgOCkpOwogICAgZWxzZQogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCBCeXRlc1tFbmRCeXRlLTFdLCA4KTsKCiAgICBpZiAoRW5kQnl0ZSA+IDEpCiAgICAgICAgZm9yIChCaXRMcCA9IEVuZEJ5dGUgLSAxOyBCaXRMcCA+IDA7IEJpdExwLS0pIHsKICAgICAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIEJ5dGVzW0JpdExwLTFdLCA4KTsKICAgICAgICB9Cn0KCnN0YXRpYyB2b2lkIHBud19fZ2VuZXJhdGVfdWUoCiAgICBNVFhfSEVBREVSX1BBUkFNUyAqbXR4X2hkciwKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqKmVsdF9wLAogICAgSU1HX1VJTlQzMiB1aVZhbCkKewogICAgSU1HX1VJTlQzMiB1aUxwOwogICAgSU1HX1VJTlQ4IHVjWmVyb3M7CiAgICBJTUdfVUlOVDMyIHVpQ2h1bms7CgogICAgZm9yICh1aUxwID0gMSwgdWNaZXJvcyA9IDA7ICh1aUxwIC0gMSkgPCB1aVZhbCA7IHVpTHAgPSB1aUxwICsgdWlMcCwgdWNaZXJvcysrKQogICAgICAgIHVpVmFsID0gdWlWYWwgLSB1aUxwOwoKICAgIC8qIHVjWmVyb3MgPSBudW1iZXIgb2YgcHJlY2VkaW5nIHplcm9zIHJlcXVpcmVkCiAgICAgKiB1aVZhbCA9IHZhbHVlIHRvIGFwcGVuZCBhZnRlciB6ZXJvcyBhbmQgMSBiaXQKICAgICAqLwoKICAgIC8qIFdyaXRlIHByZWNlZGluZyB6ZXJvcyAqLwogICAgZm9yICh1aUxwID0gKElNR19VSU5UMzIpIHVjWmVyb3M7IHVpTHAgKyAxID4gODsgdWlMcCAtPSA4KQogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCA4KTsKCiAgICAvKiBXcml0ZSB6ZXJvcyBhbmQgMSBiaXQgc2V0ICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgKElNR19VSU5UOCkgMSwgKElNR19VSU5UOCkodWlMcCArIDEpKTsKCiAgICAvKiBXcml0ZSBOdW1lcmljIHBhcnQgKi8KICAgIHdoaWxlICh1Y1plcm9zID4gOCkgewogICAgICAgIHVjWmVyb3MgLT0gODsKICAgICAgICB1aUNodW5rID0gKHVpVmFsID4+IHVjWmVyb3MpOwogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAoSU1HX1VJTlQ4KSB1aUNodW5rLCA4KTsKICAgICAgICB1aVZhbCA9IHVpVmFsIC0gKHVpQ2h1bmsgPDwgdWNaZXJvcyk7CiAgICB9CgogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIChJTUdfVUlOVDgpIHVpVmFsLCB1Y1plcm9zKTsKfQoKCnN0YXRpYyB2b2lkIHBud19fZ2VuZXJhdGVfc2UoCiAgICBNVFhfSEVBREVSX1BBUkFNUyAqbXR4X2hkciwKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqKmVsdF9wLAogICAgaW50IGlWYWwpCnsKICAgIElNR19VSU5UMzIgdWlDb2RlTnVtOwoKICAgIGlmIChpVmFsID4gMCkKICAgICAgICB1aUNvZGVOdW0gPSAoSU1HX1VJTlQzMikoaVZhbCArIGlWYWwgLSAxKTsKICAgIGVsc2UKICAgICAgICB1aUNvZGVOdW0gPSAoSU1HX1VJTlQzMikoLWlWYWwgLSBpVmFsKTsKCiAgICBwbndfX2dlbmVyYXRlX3VlKG10eF9oZHIsIGVsdF9wLCB1aUNvZGVOdW0pOwp9CgoKc3RhdGljIHZvaWQgcG53X19pbnNlcnRfZWxlbWVudF90b2tlbigKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyLAogICAgTVRYX0hFQURFUl9FTEVNRU5UICoqZWx0X3AsCiAgICBIRUFERVJfRUxFTUVOVF9UWVBFIFRva2VuKQp7CiAgICBJTUdfVUlOVDggT2Zmc2V0OwogICAgSU1HX1VJTlQ4ICpQOwoKICAgIGlmIChtdHhfaGRyLT5FbGVtZW50cyAhPSBFTEVNRU5UU19FTVBUWSAmJgoJICAgIG10eF9oZHItPkVsZW1lbnRzID4gKE1BWE5VTUJFUkVMRU1FTlRTIC0gMSkpCglyZXR1cm47CgogICAgaWYgKG10eF9oZHItPkVsZW1lbnRzICE9IEVMRU1FTlRTX0VNUFRZKSB7CiAgICAgICAgaWYgKGVsdF9wW210eF9oZHItPkVsZW1lbnRzXS0+RWxlbWVudF9UeXBlID09IEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEKICAgICAgICAgICAgfHwgZWx0X3BbbXR4X2hkci0+RWxlbWVudHNdLT5FbGVtZW50X1R5cGUgPT0gRUxFTUVOVF9SQVdEQVRBKSB7CiAgICAgICAgICAgIC8qQWRkIGEgbmV3IGVsZW1lbnQgYWxpZ25lZCB0byB3b3JkIGJvdW5kYXJ5CiAgICAgICAgICAgICAqRmluZCBSQVdCaXQgc2l6ZSBpbiBieXRlcyAocm91bmRlZCB0byB3b3JkIGJvdW5kYXJ5KSkKICAgICAgICAgICAgICovCgogICAgICAgICAgICAvKiBOdW1iZXJvZlJhd2JpdHMgKGV4Y2x1ZGluZyBzaXplIG9mIGJpdCBjb3VudCBmaWVsZCkrIHNpemUgb2YgdGhlIGJpdGNvdW50IGZpZWxkICAqLwogICAgICAgICAgICBPZmZzZXQgPSBlbHRfcFttdHhfaGRyLT5FbGVtZW50c10tPlNpemUgKyA4ICsgMzE7CiAgICAgICAgICAgIE9mZnNldCAvPSAzMjsvKiBOb3cgY29udGFpbnMgcmF3Yml0cyBzaXplIGluIHdvcmRzICovCiAgICAgICAgICAgIE9mZnNldCArPSAxOy8qIE5vdyBjb250YWlucyByYXdiaXRzK2VsZW1lbnRfdHlwZSBzaXplIGluIHdvcmRzICovCiAgICAgICAgICAgIE9mZnNldCAqPSA0Oy8qIENvbnZlcnQgdG8gbnVtYmVyIG9mIGJ5dGVzICh0b3RhbCBzaXplIG9mIHN0cnVjdHVyZSBpbiBieXRlcywgYWxpZ25lZCB0byB3b3JkIGJvdW5kYXJ5KSAqLwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIE9mZnNldCA9IDQ7CiAgICAgICAgfQoKICAgICAgICBtdHhfaGRyLT5FbGVtZW50cysrOwoKCWlmIChtdHhfaGRyLT5FbGVtZW50cyA+IChNQVhOVU1CRVJFTEVNRU5UUyAtIDEpKQoJICAgIHJldHVybjsKICAgICAgICBQID0gKElNR19VSU5UOCAqKSBlbHRfcFttdHhfaGRyLT5FbGVtZW50cy0xXTsKICAgICAgICBQICs9IE9mZnNldDsKICAgICAgICBlbHRfcFttdHhfaGRyLT5FbGVtZW50c10gPSAoTVRYX0hFQURFUl9FTEVNRU5UICopIFA7CiAgICB9IGVsc2UKICAgICAgICBtdHhfaGRyLT5FbGVtZW50cyA9IDA7CgogICAgZWx0X3BbbXR4X2hkci0+RWxlbWVudHNdLT5FbGVtZW50X1R5cGUgPSBUb2tlbjsKICAgIGVsdF9wW210eF9oZHItPkVsZW1lbnRzXS0+U2l6ZSA9IDA7Cn0KCi8qCiAqIEludGVybWVkaWFyeSBmdW5jdGlvbnMgdG8gYnVpbGQgSDI2NCBoZWFkZXJzCiAqLwpzdGF0aWMgdm9pZCBwbndfX0gyNjRfd3JpdGViaXRzX3N0YXJ0Y29kZV9wcmVmaXhfZWxlbWVudCgKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyLAogICAgTVRYX0hFQURFUl9FTEVNRU5UICoqZWx0X3AsCiAgICBJTUdfVUlOVDMyIEJ5dGVTaXplKQp7CiAgICAvKiBHRU5FUkFURVMgVEhFIEZJUlNUIEVMRU1FTlQgT0YgVEhFIEgyNjRfU0VRVUVOQ0VfSEVBREVSKCkgU1RSVUNUVVJFICovCiAgICBJTUdfVUlOVDMyIExwOwoKICAgIC8qCiAgICAgKiBCeXRlIGFsaWduZWQgKGJpdCAwKQogICAgICogKDMgYnl0ZXMgaW4gc2xpY2UgaGVhZGVyIHdoZW4gc2xpY2UgaXMgZmlyc3QgaW4gYSBwaWN0dXJlCiAgICAgKiB3aXRob3V0IHNlcXVlbmNlL3BpY3R1cmVfaGVhZGVyIGJlZm9yZSBwaWN0dXJlCiAgICAgKi8KCiAgICBmb3IgKExwID0gMDsgTHAgPCBCeXRlU2l6ZSAtIDE7IExwKyspCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDgpOwoKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCA4KTsKCiAgICAvKiBCeXRlIGFsaWduZWQgKGJpdCAzMiBvciAyNCkgKi8KICAgIHJldHVybjsKfQoKCnN0YXRpYyB2b2lkIHBud19fSDI2NF93cml0ZWJpdHNfVlVJX3BhcmFtcygKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyLAogICAgTVRYX0hFQURFUl9FTEVNRU5UICoqZWx0X3AsCiAgICBIMjY0X1ZVSV9QQVJBTVMgKlZVSVBhcmFtcykKewogICAgLyogQnVpbGRzIFZVSSBQYXJhbXMgZm9yIHRoZSBTZXF1ZW5jZSBIZWFkZXIgKG9ubHkgcHJlc2VudCBpbiB0aGUgMXN0IHNlcXVlbmNlIG9mIHN0cmVhbSkgKi8KICAgIGlmIChWVUlQYXJhbXMtPmFzcGVjdF9yYXRpb19pbmZvX3ByZXNlbnRfZmxhZyAmJiAoVlVJUGFyYW1zLT5hc3BlY3RfcmF0aW9faWRjID09IDB4ZmYpKSB7CiAgICAgICAgLyogYXNwZWN0X3JhdGlvX2luZm9fcHJlc2VudF9mbGFnIHUoMSkgKi8KICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMSk7CiAgICAgICAgLyogYXNwZWN0X3JhdGlvX2lkYyB1KDgpIEV4dGVuZGVkX1NBUiAqLwogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAweGZmLCA4KTsKICAgICAgICAvKiBzYXJfd2lkdGggdSgxNikgKi8KICAgICAgICBwbndfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIFZVSVBhcmFtcy0+c2FyX3dpZHRoLCAxNik7CiAgICAgICAgLyogc2FyX2hlaWdodCB1KDE2KSAqLwogICAgICAgIHBud19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgVlVJUGFyYW1zLT5zYXJfaGVpZ2h0LCAxNik7CiAgICB9IGVsc2UgewogICAgICAgIC8qIGFzcGVjdF9yYXRpb19pbmZvX3ByZXNlbnRfZmxhZyB1KDEpICovCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDEpOwogICAgfQoKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKAogICAgICAgICAgICAgICAgbXR4X2hkciwgZWx0X3AsCiAgICAgICAgICAgICAgICAoMCA8PCAzKSB8IC8qIG92ZXJzY2FuX2luZm9fcHJlc2VudF9mbGFnICgxIGJpdCkgPSAwIGluIFRvcGF6ICovCiAgICAgICAgICAgICAgICAoMCA8PCAyKSB8IC8qIHZpZGVvX3NpZ25hbF90eXBlX3ByZXNlbnRfZmxhZyAoMSBiaXQpID0gMCBpbiBUb3BheiAqLwogICAgICAgICAgICAgICAgKDAgPDwgMSkgfCAvKiBjaHJvbWFfbG9jX2luZm9fcHJlc2VudF9mbGFnICgxIGJpdCkgPSAwIGluIFRvcGF6ICovCiAgICAgICAgICAgICAgICAoMSksLyogdGltaW5nX2luZm9fcHJlc2VudF9mbGFnICgxIGJpdCkgPSAxIGluIFRvcGF6ICovCiAgICAgICAgICAgICAgICA0KTsKCiAgICAvKiBudW1fdW5pdHNfaW5fdGljayAoMzIgYml0cykgPSAxIGluIFRvcGF6ICovCiAgICBwbndfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIFZVSVBhcmFtcy0+bnVtX3VuaXRzX2luX3RpY2ssIDMyKTsKCiAgICAvKiB0aW1lX3NjYWxlICgzMiBiaXRzKSA9IGZyYW1lIHJhdGUgKi8KICAgIHBud19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgVlVJUGFyYW1zLT5UaW1lX1NjYWxlLCAzMik7CgogICAgLyogZml4ZWRfZnJhbWVfcmF0ZV9mbGFnICgxIGJpdCkgPSAxIGluIFRvcGF6ICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMSk7CiAgICAvKiBuYWxfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnICgxIGJpdCkgPSAxIGluIFRvcGF6ICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMSk7CgogICAgLyoqIERlZmluaXRpb25zIGZvciBuYWxfaHJkX3BhcmFtZXRlcnMoKSBjb250YWluZWQgaW4gVlVJIHN0cnVjdHVyZSBmb3IgVG9wYXoKICAgICAqICBjcGJfY250X21pbnVzMSB1ZSh2KSA9IDAgaW4gVG9wYXogPSAxYgogICAgICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMSk7CiAgICAvKiBiaXRfcmF0ZV9zY2FsZSAoNCBiaXRzKSA9IDAgaW4gVG9wYXosIGNwYl9zaXplX3NjYWxlICg0IGJpdHMpID0gMCBpbiBUb3BheiAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDQpOwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDIsIDQpOwoKICAgIC8qIGJpdF9yYXRlX3ZhbHVlX21pbnVzMVswXSB1ZSh2KSA9IChCaXRyYXRlLzY0KS0xIFtSQU5HRTowIHRvICgyXjMyKS0yXSAqLwogICAgcG53X19nZW5lcmF0ZV91ZShtdHhfaGRyLCBlbHRfcCwgVlVJUGFyYW1zLT5iaXRfcmF0ZV92YWx1ZV9taW51czEpOwogICAgLyogY3BiX3NpemVfdmFsdWVfbWludXMxWzBdIHVlKHYpID0gKENQQl9CaXRzX1NpemUvMTYpLTEKICAgICAqIHdoZXJlIENQQl9CaXRzX1NpemUgPSAxLjUgKiBCaXRyYXRlICBbUkFOR0U6MCB0byAoMl4zMiktMl0KICAgICAqLwogICAgcG53X19nZW5lcmF0ZV91ZShtdHhfaGRyLCBlbHRfcCwgVlVJUGFyYW1zLT5jYnBfc2l6ZV92YWx1ZV9taW51czEpOwoKICAgIC8qIGNicl9mbGFnWzBdICgxIGJpdCkgPSAwIGZvciBWQlIsIDEgZm9yIENCUiAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIFZVSVBhcmFtcy0+Q0JSLCAxKTsKCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cygKICAgICAgICBtdHhfaGRyLCBlbHRfcCwKICAgICAgICBWVUlQYXJhbXMtPmluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoX21pbnVzMSwKICAgICAgICA1KTsgLyogaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxICg1IGJpdHMpID0gPz8/ICovCgogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMoCiAgICAgICAgbXR4X2hkciwKICAgICAgICBlbHRfcCwKICAgICAgICBWVUlQYXJhbXMtPmNwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aF9taW51czEsCiAgICAgICAgNSk7IC8qIGNwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aF9taW51czEgKDUgYml0cykgPSA/Pz8gKi8KCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cygKICAgICAgICBtdHhfaGRyLCBlbHRfcCwKICAgICAgICBWVUlQYXJhbXMtPmRwYl9vdXRwdXRfZGVsYXlfbGVuZ3RoX21pbnVzMSwKICAgICAgICA1KTsgLyogZHBiX291dHB1dF9kZWxheV9sZW5ndGhfbWludXMxICg1IGJpdHMpID0gPz8/ICovCgogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMoCiAgICAgICAgbXR4X2hkciwKICAgICAgICBlbHRfcCwKICAgICAgICBWVUlQYXJhbXMtPnRpbWVfb2Zmc2V0X2xlbmd0aCwKICAgICAgICA1KTsgLyogdGltZV9vZmZzdF9sZW5ndGggKDUgYml0cykgPSA/Pz8gKi8KCiAgICAvKiBFbmQgb2YgbmFsX2hyZF9wYXJhbWV0ZXJzKCkgICovCgogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMoCiAgICAgICAgbXR4X2hkciwKICAgICAgICBlbHRfcCwKICAgICAgICAwLCAxKTsvKiB2Y2xfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnICgxIGJpdCkgPSAwIGluIFRvcGF6ICovCgogICAgLyogaWYoIG5hbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgIHx8ICB2Y2xfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnICkKICAgICAqIEZJWCBmb3IgQlJOMjMwMzkKICAgICAqIGxvd19kZWxheV9ocmRfZmxhZwogICAgICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cygKICAgICAgICBtdHhfaGRyLCBlbHRfcCwKICAgICAgICAwLCAxKTsvKiBsb3dfZGVsYXlfaHJkX2ZsYWcgKi8KCgogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMoCiAgICAgICAgbXR4X2hkciwgZWx0X3AsCiAgICAgICAgMCwgMSk7LyogcGljX3N0cnVjdF9wcmVzZW50X2ZsYWcgKDEgYml0KSA9IDAgaW4gVG9wYXogKi8KCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cygKICAgICAgICBtdHhfaGRyLCBlbHRfcCwKICAgICAgICAwLCAxKTsvKiBiaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZyAoMSBiaXQpID0gMCBpbiBUb3BheiAqLwp9CgoKc3RhdGljIHZvaWQgcG53X19IMjY0X3dyaXRlYml0c19waWN0dXJlX2hlYWRlcigKICAgIE1UWF9IRUFERVJfUEFSQU1TICpwTVRYX0hlYWRlciwKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqKmF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgSU1HX0JPT0wgYkNhYmFjRW5hYmxlZCwKICAgIElNR19CT09MIGJfOHg4dHJhbnNmb3JtLAogICAgSU1HX0JPT0wgYkludHJhQ29uc3RyYWluZWQsCiAgICBJTUdfSU5UOCBpOENiUVBPZmZzZXQsCiAgICBJTUdfSU5UOCBpOENyUVBPZmZzZXQpCnsKICAgIC8vKiotLSBCZWdpbiBidWlsZGluZyB0aGUgcGljdHVyZSBoZWFkZXIgZWxlbWVudAogICAgSU1HX1VJTlQ4IHVpOEVDTUYgPSAoYkNhYmFjRW5hYmxlZCA/IDEgOiAwKTsKCiAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9TVEFSVENPREVfUkFXREFUQSk7CgogICAgcG53X19IMjY0X3dyaXRlYml0c19zdGFydGNvZGVfcHJlZml4X2VsZW1lbnQocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCA0KTsKCiAgICAvLy8qIEdFTkVSQVRFUyBUSEUgRklSU1QgKFNUQVRJQykgRUxFTUVOVCBPRiBUSEUgSDI2NF9QSUNUVVJFX0hFQURFUigpIFNUUlVDVFVSRSAqLy8vCiAgICAvLy8qKioqIEVMRU1FTlQgQklUQ09VTlQ6IDE4CgogICAgLy8gNCBCeXRlIFN0YXJ0Q29kZVByZWZpeCBQcmVnZW5lcmF0ZWQgaW46IEgyNjRfV3JpdGVCaXRzX1N0YXJ0Q29kZVByZWZpeF9FbGVtZW50KCkKICAgIC8vIEJ5dGUgYWxpZ25lZCAoYml0IDMyKQogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwIDw8IDcpIHwgICAgLy8gZm9yYmlkZGVuX3plcm9fYml0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCA1KSB8ICAgIC8vIG5hbF9yZWZfaWRjICgyIGJpdHMpID0gMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDgpLCAgLy8gbmFsX3VuaXRfdHB5ZSAoNSBiaXRzKSA9IDgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgpOwogICAgLy8gQnl0ZSBhbGlnbmVkIChiaXQgNDApCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgNykgfCAgICAgICAgICAgIC8vIHBpY19wYXJhbWV0ZXJfc2V0X2lkIHVlKHYpID0gMCBpbiBUb3BhegogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgNikgfCAgICAgICAgICAgIC8vIHNlcV9wYXJhbWV0ZXJfc2V0X2lkIHVlKHYpID0gMCBpbiBUb3BhegogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpOEVDTUYgPDwgNSkgfCAgICAgIC8vIGVudHJvcHlfY29kaW5nX21vZGVfZmxhZyAoMSBiaXQpIDAgZm9yIENBVkxDCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCA8PCA0KSB8ICAgICAgICAgICAgLy8gcGljX29yZGVyX3ByZXNlbnRfZmxhZyAoMSBiaXQpID0gMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMykgfCAgICAgICAgICAgIC8vIG51bV9zbGljZV9ncm91cF9taW51czEgdWUodikgPSAwIGluIFRvcGF6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyKSB8ICAgICAgICAgICAgLy8gbnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSB1ZSh2KSA9IDAgaW4gVG9wYXoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDEpIHwgICAgICAgICAgICAvLyBudW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxIHVlKHYpID0gMCBpbiBUb3BhegogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDApLCAgICAgICAgICAvLyB3ZWlnaHRlZF9wcmVkX2ZsYWcgKDEgYml0KSA9IDAgaW4gVG9wYXoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgpOwogICAgLy8gQnl0ZSBhbGlnbmVkIChiaXQgNDgpCiAgICAvLyB3ZWlnaHRlZF9iaXByZWRfZmxhZyAoMiBiaXRzKSA9IDAgaW4gVG9wYXoKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMik7CgogICAgLy9NVFggZmlsbHMgdGhpcyB2YWx1ZSBpbgogICAgcG53X19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfUVApOwogICAgcG53X19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfUkFXREFUQSk7CgogICAgLy8vKioqKiBHRU5FUkFURVMgVEhFIFNFQ09ORCBFTEVNRU5UIE9GIFRIRSBIMjY0X1BJQ1RVUkVfSEVBREVSKCkgU1RSVUNUVVJFICoqKiovLy8KICAgIC8vLyoqKiogRUxFTUVOVCBCSVRDT1VOVDogNQogICAgLy9UaGUgZm9sbG93aW5nIGZpZWxkIHdpbGwgYmUgZ2VuZXJhdGVkIGFzIGEgc3BlY2lhbCBjYXNlIGJ5IE1UWCAtIHNvIG5vdCBoZXJlCiAgICAvLyBwbndfX2dlbmVyYXRlX3NlKHBNVFhfSGVhZGVyLCBwUEhQYXJhbXMtPnBpY19pbml0X3FwX21pbnVzMjYpOwogICAgLy8gcGljX2ludF9xcF9taW51czI2IHNlKHYpID0gLTI2IHRvIDI1IGluIFRvcGF6CiAgICAvLyBwaWNfaW50X3FzX21pbnVzMjYgc2UodikgPSAwIGluIFRvcGF6CiAgICAvL2Nocm9tYV9xcF9pbmRleF9vZmZzZXQgc2UodikgPSAwIGluIFRvcGF6CiAgICBwbndfX2dlbmVyYXRlX3NlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCk7CiAgICBwbndfX2dlbmVyYXRlX3NlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgaThDYlFQT2Zmc2V0KTsKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZyAoMSBiaXQpID0gMSBpbiBUb3BhegogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMikgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3RyYWluZWRfaW50cmFfcHJlZF9GbGFnICgxIGJpdCkgPSAwIGluIFRvcGF6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJJbnRyYUNvbnN0cmFpbmVkID8gMSA6IDApIDw8IDEpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwKSwvLyByZWR1bmRhbnRfcGljX2NudF9wcmVzZW50X2ZsYWcgKDEgYml0KSA9IDAgaW4gVG9wYXoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMpOwogICAgLy8gQnl0ZSBhbGlnbiBpcyBkb25lIHVzaW5nIGFuIGVsZW1lbnQgY29tbWFuZCAoTVRYIGVsZW1lbnRzIGluIHRoaXMgc3RydWN0dXJlLCB3ZSBkb24ndCBrbm93IGl0J3Mgc2l6ZSkKCiAgICBpZiAoYl84eDh0cmFuc2Zvcm0gfHwgKGk4Q2JRUE9mZnNldCAhPSBpOENyUVBPZmZzZXQpKSB7CiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiXzh4OHRyYW5zZm9ybSA8PCAxKSB8ICAgLy8gOHg4IHRyYW5zZm9ybSBmbGFnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDApLCAgICAgIC8vIHBpY19zY2FsaW5nX21hdHJpeF9wcmVzZW50X2ZsYWcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsKICAgICAgICBwbndfX2dlbmVyYXRlX3NlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgaThDclFQT2Zmc2V0KTsKICAgICAgICAvLyBzZWNvbmRfY2hyb21hX3FwX2luZGV4X29mZnNldCBzZSh2KSA9IDAgaW4gVG9wYXoKICAgIH0KICAgIC8vIFRlbGwgTVRYIHRvIGluc2VydCB0aGUgYnl0ZSBhbGlnbiBmaWVsZCAod2UgZG9uJ3Qga25vdyBmaW5hbCBzdHJlYW0gc2l6ZSBmb3IgYWxpZ25tZW50IGF0IHRoaXMgcG9pbnQpCiAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9JTlNFUlRCWVRFQUxJR05fSDI2NCk7CgogICAgcmV0dXJuOwp9CgoKc3RhdGljIHZvaWQgcG53X19IMjY0X3dyaXRlYml0c19zbGljZV9oZWFkZXIwKAogICAgTVRYX0hFQURFUl9QQVJBTVMgKm10eF9oZHIsCiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKiplbHRfcCwKICAgIEgyNjRfU0xJQ0VfSEVBREVSX1BBUkFNUyAqcFNsSFBhcmFtcykKewogICAgLyogR0VORVJBVEVTIFRIRSBGSVJTVCBFTEVNRU5UIE9GIFRIRSBIMjY0X1NMSUNFX0hFQURFUigpIFNUUlVDVFVSRQogICAgICogRUxFTUVOVCBCSVRDT1VOVDogOAogICAgICoKICAgICAqIFN0YXJ0Q29kZVByZWZpeCBQcmVnZW5lcmF0ZWQgaW46IEJ1aWxkX0gyNjRfNEJ5dGVfU3RhcnRDb2RlUHJlZml4X0VsZW1lbnQoKSAoNCBvciAzIGJ5dGVzKQogICAgICogKDMgYnl0ZXMgd2hlbiBzbGljZSBpcyBmaXJzdCBpbiBhIHBpY3R1cmUgd2l0aG91dCBzZXF1ZW5jZS9waWN0dXJlX2hlYWRlciBiZWZvcmUgcGljdHVyZQogICAgICogQnl0ZSBhbGlnbmVkIChiaXQgMzIgb3IgMjQpCiAgICAgKiBOT1RFOiBTbGljZV9UeXBlIGFuZCBGcmFtZV9UeXBlIGFyZSBhbHdheXMgdGhlIHNhbWUsIGhlbmNlIFNsaWNlRnJhbWVfVHlwZQogICAgICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cygKICAgICAgICBtdHhfaGRyLCBlbHRfcCwKICAgICAgICAoMCA8PCA3KSB8LyogZm9yYmlkZGVuX3plcm9fYml0ICovCiAgICAgICAgKChwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgPT0gU0xIUF9CX1NMSUNFRlJBTUVfVFlQRSA/IDAgOiAxKSA8PCA1KSB8IC8qIG5hbF9yZWZfaWRjICgyIGJpdHMpID0gMCBmb3IgQi1mcmFtZSBhbmQgMSBmb3IgSSBvciBQLWZyYW1lICovCiAgICAgICAgKChwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgPT0gU0xIUF9JRFJfU0xJQ0VGUkFNRV9UWVBFID8gNSA6IDEpKSwvKiBuYWxfdW5pdF90cHllICg1IGJpdHMpID0gSS1mcmFtZSBJRFIsIGFuZCAxIGZvciAgcmVzdCAqLwogICAgICAgIDgpOwp9CgoKc3RhdGljIHZvaWQgcG53X19IMjY0X3dyaXRlYml0c19zbGljZV9oZWFkZXIxKAogICAgTVRYX0hFQURFUl9QQVJBTVMgKm10eF9oZHIsCiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKiplbHRfcCwKICAgIEgyNjRfU0xJQ0VfSEVBREVSX1BBUkFNUyAqcFNsSFBhcmFtcywKICAgIElNR19VSU5UMTYgdWlJZHJQaWNJZCkKewogICAgLyogR0VORVJBVEVTIFRIRSBTRUNPTkQgRUxFTUVOVCBPRiBUSEUgSDI2NF9TTElDRV9IRUFERVIoKSBTVFJVQ1RVUkUKICAgICAqIFRoZSBmb2xsb3dpbmcgaXMgc2xpY2UgcGFyYW1ldGVyIHNldCBpbiBCUC9NUAogICAgICovCgogICAgLyogZmlyc3RfbWJfaW5fc2xpY2UgPSBGaXJzdCBNQiBhZGRyZXNzIGluIHNsaWNlOiB1ZShSYW5nZSAwIC0gIDE2MTkpICovCiAgICBwbndfX2dlbmVyYXRlX3VlKG10eF9oZHIsIGVsdF9wLCAoSU1HX1VJTlQzMikgcFNsSFBhcmFtcy0+Rmlyc3RfTUJfQWRkcmVzcyk7CgogICAgcG53X19nZW5lcmF0ZV91ZSgKICAgICAgICBtdHhfaGRyLCBlbHRfcCwKICAgICAgICAoSU1HX1VJTlQzMikoKHBTbEhQYXJhbXMtPlNsaWNlRnJhbWVfVHlwZSA9PSBTTEhQX0lEUl9TTElDRUZSQU1FX1RZUEUpID8gU0xIUF9JX1NMSUNFRlJBTUVfVFlQRSA6IHBTbEhQYXJhbXMtPlNsaWNlRnJhbWVfVHlwZSkpOyAgLyogc2xpY2VfdHlwZSB1ZSh2KTogMCBmb3IgUC1zbGljZSwgMSBmb3IgQi1zbGljZSwgMiBmb3IgSS1zbGljZSAqLwoKICAgIC8qIGthYjogbm90IGNsZWFuIGNoYW5nZSBmcm9tIElEUiB0byBpbnRyYSwgSURSIHNob3VsZCBoYXZlIHNlcGFyYXRlIGZsYWcgKi8KCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cygKICAgICAgICBtdHhfaGRyLCBlbHRfcCwKICAgICAgICAoMSA8PCA1KSB8IC8qIHBpY19wYXJhbWV0ZXJfc2V0X2lkLCB1ZSh2KSA9IDAgICg9MWIpIGluIFRvcGF6ICovCiAgICAgICAgcFNsSFBhcmFtcy0+RnJhbWVfTnVtX0RPLC8qIGZyYW1lX251bSAoNSBiaXRzKSA9IGZyYW1lIG51by4gaW4gZGVjb2Rpbmcgb3JkZXIgKi8KICAgICAgICA2KTsKCiAgICAvKiBmcmFtZV9tYl9vbmx5X2ZsYWcgaXMgYWx3YXlzIDEsIHNvIG5vIG5lZWQgZm9yIGZpZWxkX3BpY19mbGFnIG9yIGJvdHRvbV9maWVsZF9mbGFnICovCiAgICBpZiAocFNsSFBhcmFtcy0+U2xpY2VGcmFtZV9UeXBlID09IFNMSFBfSURSX1NMSUNFRlJBTUVfVFlQRSkKICAgICAgICBwbndfX2dlbmVyYXRlX3VlKG10eF9oZHIsIGVsdF9wLCB1aUlkclBpY0lkKTsvKiBpZHJfcGljX2lkIHVlKHYpID0gMCAoMWIpIGluIFRvcGF6ICovCgogICAgLyoga2FiOiBJZHJfcGljX2lkIG9ubHkgZm9yIElEUiwgbm90IG5lc3Nlc2FyZWx5IGZvciBhbGwgSSBwaWN0dXJlcyAqLwoKICAgIC8qIGN1c3RvbWVyIHJlcXVlc3QgUE9DIHR5cGUgc2hvdWxkIGJlIDIqLwogICAgLyogaWYgKHBpY19vcmRlcl9jbnRfdHlwZSA9PSAwKSBOb3RlOiAocGljX29yZGVyX2NudF90eXBlIGFsd2F5cyAwIGluIFRvcGF6KQogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMoCiAgICAgICAgbXR4X2hkciwgZWx0X3AsCiAgICAgICAgcFNsSFBhcmFtcy0+UGljdHVyZV9OdW1fRE8sCiAgICAgICAgNik7ICBwaWNfb3JkZXJfY250X2xzYiAoNiBiaXRzKSAtIHBpY3R1cmUgbm8gaW4gZGlzcGxheSBvcmRlciAqLwoKI2lmIDAKICAgIGlmIChwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgPT0gU0xIUF9CX1NMSUNFRlJBTUVfVFlQRSkKICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cygKICAgICAgICAgICAgbXR4X2hkciwKICAgICAgICAgICAgZWx0X3AsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDEpOy8qIGRpcmVjdF9zcGF0aWFsX212X3ByZWRfZmxhZyAoMSBiaXQpID0gMCwgc3BhdGlhbCBkaXJlY3QgbW9kZSBub3Qgc3VwcG9ydGVkIGluIFRvcGF6ICovCiNlbmRpZgoKICAgIGlmIChwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgPT0gU0xIUF9QX1NMSUNFRlJBTUVfVFlQRSB8fCBwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgPT0gU0xIUF9CX1NMSUNFRlJBTUVfVFlQRSkKICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cygKICAgICAgICAgICAgbXR4X2hkciwKICAgICAgICAgICAgZWx0X3AsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDEpOy8qIG51bV9yZWZfaWR4X2FjdGl2ZV9vdmVycmlkZV9mbGFnICgxIGJpdCkgPSAwIGluIFRvcGF6ICovCgogICAgaWYgKHBTbEhQYXJhbXMtPlNsaWNlRnJhbWVfVHlwZSAhPSBTTEhQX0lfU0xJQ0VGUkFNRV9UWVBFICYmCiAgICAgICAgcFNsSFBhcmFtcy0+U2xpY2VGcmFtZV9UeXBlICE9IFNMSFBfSURSX1NMSUNFRlJBTUVfVFlQRSkgewogICAgICAgIC8qCiAgICAgICAgaWYgKHBTbEhQYXJhbXMtPlVzZXNMb25nVGVybVJlZikgewogICAgICAgICAgICAvLyByZWZfcGljX2xpc3Rfb3JkZXJpbmdfZmxhZ19JMCAoMSBiaXQpID0gMSwgTDAgcmVmZXJlbmNlIHBpY3R1cmUgb3JkZXJpbmcKICAgICAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDEpOwogICAgICAgICAgICAvLyBtb2RpZmljYXRpb25fb2ZfcGljX251bXNfaWRjID0gMgogICAgICAgICAgICBwbndfX2dlbmVyYXRlX3VlKG10eF9oZHIsIGVsdF9wLCAyKTsKICAgICAgICAgICAgLy8gbG9uZ190ZXJtX3BpY19udW0gPSAwCiAgICAgICAgICAgIHBud19fZ2VuZXJhdGVfdWUobXR4X2hkciwgZWx0X3AsIDApOwogICAgICAgICAgICAvLyBtb2RpZmljYXRpb25fb2ZfcGljX251bXNfaWRjID0gMwogICAgICAgICAgICBwbndfX2dlbmVyYXRlX3VlKG10eF9oZHIsIGVsdF9wLCAzKTsKICAgICAgICB9IGVsc2UKICAgICAgICAqLwogICAgICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cygKICAgICAgICAgICAgICAgIG10eF9oZHIsCiAgICAgICAgICAgICAgICBlbHRfcCwKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAxKTsvKiByZWZfcGljX2xpc3Rfb3JkZXJpbmdfZmxhZ19JMCAoMSBiaXQpID0gMCAqLwogICAgfQoKI2lmIDAgICAgCiAgICBpZiAocFNsSFBhcmFtcy0+U2xpY2VGcmFtZV9UeXBlID09IFNMSFBfQl9TTElDRUZSQU1FX1RZUEUpCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMoCiAgICAgICAgICAgIG10eF9oZHIsCiAgICAgICAgICAgIGVsdF9wLAogICAgICAgICAgICAwLAogICAgICAgICAgICAxKTsgLyogcmVmX3BpY19saXN0X29yZGVyaW5nX2ZsYWdfSTEgKDEgYml0KSA9IDAsIG5vIHJlZmVyZW5jZSBwaWN0dXJlIG9yZGVyaW5nIGluIFRvcGF6ICovCiNlbmRpZgoKICAgIGlmIChwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgPT0gU0xIUF9JRFJfU0xJQ0VGUkFNRV9UWVBFKSB7CiAgICAgICAgLyogbm9fb3V0cHV0X29mX3ByaW9yX3BpY3NfZmxhZyAoMSBiaXQpID0gMCAqLwogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCAxKTsKICAgICAgICAvKiBsb25nX3Rlcm1fcmVmZXJlbmNlX2ZsYWcgKDEgYml0KSovCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNsSFBhcmFtcy0+SXNMb25nVGVybVJlZiA/IDEgOiAwLCAxKTsKICAgIH0gCiNpZiAwCiAgICBlbHNlIGlmIChwU2xIUGFyYW1zLT5Vc2VzTG9uZ1Rlcm1SZWYpIHsKICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMSk7LyogbG9uZ190ZXJtX3JlZmVyZW5jZV9mbGFnICgxIGJpdCkgPSAwICovCiAgICAgICAgLy8gQWxsb3cgYSBzaW5nbGUgbG9uZy10ZXJtIHJlZmVyZW5jZQogICAgICAgIHBud19fZ2VuZXJhdGVfdWUobXR4X2hkciwgZWx0X3AsIDQpOwogICAgICAgIC8vIG1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uCiAgICAgICAgcG53X19nZW5lcmF0ZV91ZShtdHhfaGRyLCBlbHRfcCwgMSk7CgogICAgICAgIC8vIFNldCBjdXJyZW50IHBpY3R1cmUgYXMgdGhlIGxvbmctdGVybSByZWZlcmVuY2UKICAgICAgICAvLyBtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbgogICAgICAgIHBud19fZ2VuZXJhdGVfdWUobXR4X2hkciwgZWx0X3AsIDYpOwogICAgICAgIC8vIGxvbmdfdGVybV9mcmFtZV9pZHgKICAgICAgICBwbndfX2dlbmVyYXRlX3VlKG10eF9oZHIsIGVsdF9wLCAwKTsKCiAgICAgICAgLy8gRW5kCiAgICAgICAgcG53X19nZW5lcmF0ZV91ZShtdHhfaGRyLCBlbHRfcCwgMCk7CiAgICB9IAojZW5kaWYKICAgIGVsc2UgewogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCAxKTsvKiBhZGFwdGl2ZV9yZWZfcGljX21hcmtpbmdfbW9kZV9mbGFnICgxIGJpdCkgPSAwICovCiAgICB9Cn0KCgpzdGF0aWMgdm9pZCBwbndfX0gyNjRfd3JpdGViaXRzX3NsaWNlX2hlYWRlcjIoCiAgICBNVFhfSEVBREVSX1BBUkFNUyAqbXR4X2hkciwKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqKmVsdF9wLAogICAgSDI2NF9TTElDRV9IRUFERVJfUEFSQU1TICpwU2xIUGFyYW1zKQp7CiAgICAvKiBHRU5FUkFURVMgRUxFTUVOVCBPRiBUSEUgSDI2NF9TTElDRV9IRUFERVIoKSBTVFJVQ1RVUkUKICAgICAqIEVMRU1FTlQgQklUQ09VTlQ6IDExCiAgICAgKi8KCiNpZiAwCiAgICAvKiBOZXh0IGZpZWxkIGlzIGdlbmVyYXRlZCBvbiBNVFggd2l0aCBhIHNwZWNpYWwgY29tbW5hZCAobm90IEVMRU1FTlRfUkFXKSAtIHNvIG5vdCBkZWZpbmVkIGhlcmUgKi8KCiAgICAvKiBzbGljZV9xcF9kZWx0YSBzZSh2KSA9IFNsaWNlUVB5IC0gKHBpY19pbml0X3FwX21pbnVzMjYrMjYpICovCiAgICAvKiBwdWNIUz1wbndfX2dlbmVyYXRlX3NlKHB1Y0hTLCBwdWlCaXRQb3MsIHBTbEhQYXJhbXMtPlNsaWNlX1FQX0RlbHRhKTsgICovCiNlbmRpZgoKICAgIHBud19fZ2VuZXJhdGVfdWUoCiAgICAgICAgbXR4X2hkciwKICAgICAgICBlbHRfcCwKICAgICAgICBwU2xIUGFyYW1zLT5EaXNhYmxlX0RlYmxvY2tpbmdfRmlsdGVyX0lkYyk7IC8qIGRpc2FibGVfZGVibG9ja2luZ19maWx0ZXJfaWRjIHVlKHYpID0gMj8gICovCgogICAgaWYgKHBTbEhQYXJhbXMtPkRpc2FibGVfRGVibG9ja2luZ19GaWx0ZXJfSWRjICE9IDEpIHsKICAgICAgICBwbndfX2dlbmVyYXRlX3NlKG10eF9oZHIsIGVsdF9wLCAwKTsgLyogc2xpY2VfYWxwaGFfYzBfb2Zmc2V0X2RpdjIgc2UodikgPSAwICgxYikgaW4gVG9wYXogKi8KICAgICAgICBwbndfX2dlbmVyYXRlX3NlKG10eF9oZHIsIGVsdF9wLCAwKTsgLyogc2xpY2VfYmV0YV9vZmZzZXRfZGl2MiBzZSh2KSA9IDAgKDFiKSBpbiBUb3BheiAqLwogICAgfQoKICAgIC8qIG51bV9zbGljZV9ncm91cHNfbWludXMxID09MCBpbiBUb3Bheiwgc28gbm8gc2xpY2VfZ3JvdXBfY2hhbmdlX2N5Y2xlIGZpZWxkIGhlcmUKICAgICAqIG5vIGJ5dGUgYWxpZ25tZW50IGF0IGVuZCBvZiBzbGljZSBoZWFkZXJzCiAgICAgKi8KfQoKc3RhdGljIHZvaWQgcG53X19IMjY0X3dyaXRlYml0c19zZXF1ZW5jZV9oZWFkZXIoCiAgICBNVFhfSEVBREVSX1BBUkFNUyAqcE1UWF9IZWFkZXIsCiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKiphdWkzMkVsZW1lbnRQb2ludGVycywKICAgIEgyNjRfU0VRVUVOQ0VfSEVBREVSX1BBUkFNUyAqcFNIUGFyYW1zLCBIMjY0X0NST1BfUEFSQU1TICpwc0Nyb3ApCnsKICAgIElNR19VSU5UOCB1aThTQlAgPSAwOwoKICAgIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTEVNRU5UX1NUQVJUQ09ERV9SQVdEQVRBKTsKCiAgICBwbndfX0gyNjRfd3JpdGViaXRzX3N0YXJ0Y29kZV9wcmVmaXhfZWxlbWVudChwTVRYX0hlYWRlciwKICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgIDQpOwoKICAgIC8vLyoqKiogR0VORVJBVEVTIFRIRSBGSVJTVCBFTEVNRU5UIE9GIFRIRSBIMjY0X1NFUVVFTkNFX0hFQURFUigpIFNUUlVDVFVSRSAqKioqLy8vCgogICAgLy8gNCBCeXRlIFN0YXJ0Q29kZVByZWZpeCBQcmVnZW5lcmF0ZWQgaW46IEgyNjRfV3JpdGVCaXRzX1N0YXJ0Q29kZVByZWZpeF9FbGVtZW50KCkKICAgIC8vIEJ5dGUgYWxpZ25lZCAoYml0IDMyKQogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywgKDAgPDwgNykgfCAgICAgIC8vIGZvcmJpZGRlbl96ZXJvX2JpdD0wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzIDw8IDUpIHwgICAgICAgICAgICAgICAgICAvLyBuYWxfcmVmX2lkYz0wMSAobWF5IGJlIDExKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDcpLCAgICAgICAgICAvLyBuYWxfdW5pdF90eXBlPTAwMTExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4KTsKCiAgICBpZiAocFNIUGFyYW1zLT51Y1Byb2ZpbGUgIT0gU0hfUFJPRklMRV9IUCkgewogICAgICAgIC8vIHByb2ZpbGVfaWRjID0gOCBiaXRzID0gNjYgZm9yIEJQIChQUk9GSUxFX0lEQ19CUCksIDc3IGZvciBNUCAoUFJPRklMRV9JRENfTVApCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBTSFBhcmFtcy0+dWNQcm9maWxlID09IFNIX1BST0ZJTEVfQlAgPyA2NiA6IDc3KSwgOCk7CgogICAgICAgIC8vIEJ5dGUgYWxpZ25lZCAoYml0IDQ4KQogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0cmFpbl9zZXQwX2ZsYWcgPSAxIGZvciBCUCBjb25zdHJhaW50cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAoMCA8PCA3KSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3RyYWluX3NldDFfZmxhZyAgPSAxIGZvciBNUCBjb25zdHJhaW50cyBhbmQgQ29uc3RyYWluZWQgQmFzZWxpbmUgcHJvZmlsZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBTSFBhcmFtcy0+dWNQcm9maWxlID09IFNIX1BST0ZJTEVfQlAgPyAxIDogMCkgPDwgNikgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwIDw8IDUpIHwgICAgICAgIC8vIGNvbnN0cmFpbl9zZXQyX2ZsYWcgPSAxIGZvciBIUAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0cmFpbl9zZXQzX2ZsYWcgPSAxIGZvciBsZXZlbCAxYiwgMCBmb3Igb3RoZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwU0hQYXJhbXMtPnVjTGV2ZWwgPT0gU0hfTEVWRUxfMUIgPyAgICAgMSA6IDApIDw8ICAgICAgIDQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2VydmVkX3plcm9fNGJpdHMgPSAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCk7CiAgICAgICAgLy8gQnl0ZSBhbGlnbmVkIChiaXQgNTYpCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV2ZWxfaWRjICg4IGJpdHMpID0gMTEgZm9yIDFiLCAxMHhsZXZlbCBmb3Igb3RoZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElNR19VSU5UOCkgcFNIUGFyYW1zLT51Y0xldmVsLCA4KTsKI2lmIDAKICAgICAgICAvLyBCeXRlIGFsaWduZWQgKGJpdCA2NCkKICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXFfcGFyYW1ldGVyX1NldF9pZCA9IDAgaW4gVG9wYXogLT4gIHVlKDApPSAxYgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAoMSA8PCA3KSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIgPDwgNCkgfC8vIGxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgPSAxIGluIFRvcGF6IC0+ICB1ZSgxKT0gMDEwYgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDMpIHwgICAgICAgIC8vIHBpY19vcmRlcl9jbnRfdHlwZSA9IDAgaW4gVG9wYXogLT4gIHVlKDApPSAxYgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzKSwgICAgICAvLyBsb2cyX21heF9waWNfb3JkZXJfY250X0lzYl9taW51czQgPSAyIGluIFRvcGF6IC0+ICB1ZSgyKT0gMDExYgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgpOwogICAgICAgIC8vIEJ5dGVzIGFsaWduZWQgKGJpdCA3MikKI2Vsc2UKICAgICAgICAvKkN1c3RvbWVyIHJlcXVlc3QgUE9DIHR5cGUgc2hvdWxkIGJlIDIqLwogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlcV9wYXJhbWV0ZXJfU2V0X2lkID0gMCBpbiBUb3BheiAtPiAgdWUoMCk9IDFiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsICgxIDw8IDYpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiA8PCAzKSB8Ly8gbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCA9IDEgaW4gVG9wYXogLT4gIHVlKDEpPSAwMTBiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMpLC8vIGxvZzJfbWF4X3BpY19vcmRlcl9jbnRfSXNiX21pbnVzNCA9IDIgaW4gVG9wYXogLT4gIHVlKDIpPSAwMTFiJAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcpOwojZW5kaWYKICAgIH0gZWxzZSB7CiNpZiBQU0JfTUZMRF9EVU1NWV9DT0RFCiAgICAgICAgLy8gQnl0ZSBhbGlnbmVkIChiaXQgNDApCiAgICAgICAgLy8gcHJvZmlsZV9pZGMgPSA4IGJpdHMgPSA2NiBmb3IgQlAgKFBST0ZJTEVfSURDX0JQKSwgNzcgZm9yIE1QIChQUk9GSUxFX0lEQ19NUCkKICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEwMCwgOCk7CgogICAgICAgIC8vIEJ5dGUgYWxpZ25lZCAoYml0IDQ4KQogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAoMSA8PCA3KSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3RyYWluX3NldDBfZmxhZyA9IDEgZm9yIE1QICsgQlAgY29uc3RyYWludHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCA2KSB8ICAgICAgICAvLyBjb25zdHJhaW5fc2V0MV9mbGFnICA9IDEgZm9yIE1QICsgQlAgY29uc3RyYWludHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCA8PCA1KSB8ICAgICAgICAvLyBjb25zdHJhaW5fc2V0Ml9mbGFnID0gYWx3YXlzIDAgaW4gQlAvTVAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCA8PCA0KSwgLy8gY29uc3RyYWluX3NldDNfZmxhZyA9IDEgZm9yIGxldmVsIDFiLCAwIGZvciBvdGhlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNlcnZlZF96ZXJvXzRiaXRzID0gMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgpOwoKICAgICAgICAvLyBCeXRlIGFsaWduZWQgKGJpdCA1NikKICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywgKElNR19VSU5UOCkgcFNIUGFyYW1zLT51Y0xldmVsLCA4KTsKICAgICAgICAvLyBsZXZlbF9pZGMgKDggYml0cykgPSAxMSBmb3IgMWIsIDEweGxldmVsIGZvciBvdGhlcnMKCiAgICAgICAgcG53X19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDApOwogICAgICAgIC8vIHNlcV9wYXJhbWV0ZXJfU2V0X2lkID0gMAogICAgICAgIHBud19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxKTsKICAgICAgICAvLyBjaHJvbWFfZm9ybWF0X2lkYyA9IDEKICAgICAgICBwbndfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCk7CiAgICAgICAgLy8gYml0X2RlcHRoX2x1bWFfbWludXM4ID0gMAogICAgICAgIHBud19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwKTsKICAgICAgICAvLyBiaXRfZGVwdGhfY2hyb21hX21pbnVzOCA9IDAKICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDEpOwogICAgICAgIC8vIHFwcHJpbWVfeV96ZXJvX3RyYW5zZm9ybV9ieXBhc3NfZmxhZyA9IDAKCiAgICAgICAgLy9pZiAocFNIUGFyYW1zLT5iVXNlRGVmYXVsdFNjYWxpbmdMaXN0KQogICAgICAgIC8vewogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSwgMSk7CiAgICAgICAgLy8gc2VxX3NjYWxpbmdfbWF0cml4X3ByZXNlbnRfZmxhZwogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgOCk7CiAgICAgICAgLy8gc2VxX3NjYWxpbmdfbWF0cml4X3ByZXNlbnRfZmxhZ1tpXSA9IDA7IDAgPCBpIDwgOAogICAgICAgIC8vfQogICAgICAgIC8vZWxzZQogICAgICAgIC8vewogICAgICAgIC8vICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwLCAxKTsgICAgICAgICAvLyBzZXFfc2NhbGluZ19tYXRyaXhfcHJlc2VudF9mbGFnCiAgICAgICAgLy99CgogICAgICAgIHBud19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxKTsKICAgICAgICAvLyBsb2cyX21heF9mcmFtZV9udW1fbWludXM0ID0gMQogICAgICAgIC8vIEN1c3RvbWVyIHJlcXVlc3QgUE9DIHR5cGUgc2hvdWxkIGJlIDIuCiAgICAgICAgLy9wbndfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCk7CiAgICAgICAgLy8gcGljX29yZGVyX2NudF90eXBlID0gMAogICAgICAgIHBud19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAyKTsKICAgICAgICAvLyBsb2cyX21heF9waWNfb3JkZXJfY250X0lzYl9taW51czQgPSAyCgogICAgICAgIC8vIEJ5dGVzIGFsaWduZWQgKGJpdCA3MikKI2VuZGlmCiAgICB9CiAgICAvLyBtYXhfbnVtX3JlZl9mcmFtZXMuIGxvbmcgdGVybSByZWZlcmVuY2UgaXNuJ3QgdXNlZC4KICAgIC8vcG53X19nZW5lcmF0ZV91KHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgcFNIUGFyYW1zLT5tYXhfbnVtX3JlZl9mcmFtZXMpOwogICAgcG53X19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEpOwogICAgLy8gZ2Fwc19pbl9mcmFtZV9udW1fdmFsdWVfYWxsb3dlZF9GbGFnIC0gKDEgYml0KQogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwU0hQYXJhbXMtPmdhcHNfaW5fZnJhbWVfbnVtX3ZhbHVlLCAxKTsKCgogICAgLy8vKioqKiBHRU5FUkFURVMgVEhFIFNFQ09ORCwgVkFSSUFCTEUgTEVOR1RILCBFTEVNRU5UIE9GIFRIRSBIMjY0X1NFUVVFTkNFX0hFQURFUigpIFNUUlVDVFVSRSAqKioqLy8vCiAgICAvLy8qKioqIEVMRU1FTlQgQklUQ09VTlQ6IHh4CiAgICBwbndfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgcFNIUGFyYW1zLT51Y1dpZHRoX2luX21ic19taW51czEpOwogICAgLy9waWNfd2lkdGhfaW5fbWJzX21pbnVzMTogdWUodikgZnJvbSAxMCB0byA0NCAoMTc2IHRvIDcyMCBwaXhlbCBwZXIgcm93KQogICAgcG53X19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBTSFBhcmFtcy0+dWNIZWlnaHRfaW5fbWFwc191bml0c19taW51czEpOwogICAgLy9waWNfaGVpZ2h0X2luX21hcHNfdW5pdHNfbWludXMxOiB1ZSh2KSBWYWx1ZSBmcm9tIDggdG8gMzUgKDE0NCB0byA1NzYgcGl4ZWxzIHBlciBjb2x1bW4pCgogICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgYWxpZ25tZW50IGF0IHRoaXMgcG9pbnQsIHNvIHdpbGwgaGF2ZSB0byB1c2UgYml0IHdyaXRpbmcgZnVuY3Rpb25zCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBTSFBhcmFtcy0+dWNGcmFtZV9tYnNfb25seV9mbGFnLCAxKTsKICAgIC8vIGZyYW1lX21iX29ubHlfZmxhZyAxPWZyYW1lIGVuY29kaW5nLCAwPWZpZWxkIGVuY29kaW5nCgojaWYgMAogICAgaWYgKCFwU0hQYXJhbXMtPnVjRnJhbWVfbWJzX29ubHlfZmxhZykgLy8gaW4gdGhlIGNhc2Ugb2YgaW50ZXJsYWNlZCBlbmNvZGluZwogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMSk7CiAgICAvLyBtYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnID0gMCBpbiBUb3BheihmaWVsZCBlbmNvZGluZyBhdCB0aGUgc2VxdWVuY2UgbGV2ZWwpCiNlbmRpZgoKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSwgMSk7CiAgICAvLyBkaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnPTEgaW4gVG9wYXoKCiAgICBpZiAocHNDcm9wLT5iQ2xpcCkgewogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSwgMSk7CiAgICAgICAgcG53X19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBzQ3JvcC0+TGVmdENyb3BPZmZzZXQpOwogICAgICAgIHBud19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwc0Nyb3AtPlJpZ2h0Q3JvcE9mZnNldCk7CiAgICAgICAgcG53X19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBzQ3JvcC0+VG9wQ3JvcE9mZnNldCk7CiAgICAgICAgcG53X19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBzQ3JvcC0+Qm90dG9tQ3JvcE9mZnNldCk7CgogICAgfSBlbHNlIHsKICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDEpOwogICAgfQoKICAgIC8vLyoqKiogR0VORVJBVEVTIFRIRSBUSElSRCBFTEVNRU5UIE9GIFRIRSBIMjY0X1NFUVVFTkNFX0hFQURFUigpIFNUUlVDVFVSRSAqKioqLy8vCiAgICAvLy8qKioqIEVMRU1FTlQgQklUQ09VTlQ6IHh4CiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFNIUGFyYW1zLT5WVUlfUGFyYW1zX1ByZXNlbnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdnVpX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnIChWVUkgb25seSBpbiAxc3Qgc2VxdWVuY2Ugb2Ygc3RyZWFtKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CiAgICBpZiAocFNIUGFyYW1zLT5WVUlfUGFyYW1zX1ByZXNlbnQgPiAwKQogICAgICAgIHBud19fSDI2NF93cml0ZWJpdHNfVlVJX3BhcmFtcyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsICYocFNIUGFyYW1zLT5WVUlfUGFyYW1zKSk7CgogICAgLy8gRmluYWxseSB3ZSBuZWVkIHRvIGFsaWduIHRvIHRoZSBuZXh0IGJ5dGUKICAgIC8vIFdlIGtub3cgdGhlIHNpemUgb2YgdGhlIGRhdGEgaW4gdGhlIHNlcXVlbmNlIGhlYWRlciAobm8gTVRYIHZhcmlhYmxlcykgIGFuZCBzdGFydCBpcyBieXRlIGFsaWduZWQsIHNvIGl0J3MgcG9zc2libGUgdG8gYWRkIHRoaXMgZmllbGQgaGVyZSByYXRoZXIgdGhhbiBNVFggRUxFTUVOVF9JTlNFUlRCWVRFQUxJR05fSDI2NCBjb21tYW5kLgogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCAxKTsKICAgIGlmIChwTVRYX0hlYWRlci0+RWxlbWVudHMgPCBNQVhOVU1CRVJFTEVNRU5UUykgewogICAgICAgIHVpOFNCUCA9IChhdWkzMkVsZW1lbnRQb2ludGVyc1twTVRYX0hlYWRlci0+RWxlbWVudHNdLT5TaXplKSAmIDc7CiAgICB9IGVsc2UgewogICAgICAgIHVpOFNCUCA9IDA7CiAgICB9CiAgICBpZiAodWk4U0JQID4gMCkKICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDggLSAodWk4U0JQKSk7CiAgICByZXR1cm47Cn0KCgpzdGF0aWMgdm9pZCBwbndfX0gyNjRfd3JpdGViaXRzX3NsaWNlX2hlYWRlcigKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyLAogICAgTVRYX0hFQURFUl9FTEVNRU5UICoqZWx0X3AsCiAgICBIMjY0X1NMSUNFX0hFQURFUl9QQVJBTVMgKnBTbEhQYXJhbXMsCiAgICBJTUdfQk9PTCBfX21heWJlX3VudXNlZCBiQ2FiYWNFbmFibGVkLAogICAgSU1HX1VJTlQxNiB1aUlkclBpY0lkKQp7CiNpZmRlZiBVU0VTVEFUSUNXSEVSRVBPU1NJQkxFCiAgICBJTUdfVUlOVDMyICpwOwogICAgcCA9IChJTUdfVUlOVDMyICopIG10eF9oZHI7CgogICAgcFswXSA9IHBbMV0gPSAwOwogICAgcFsyXSA9IDQwOwogICAgaWYgKHBTbEhQYXJhbXMtPlNsaWNlRnJhbWVfVHlwZSA9PSBTTEhQX0JfU0xJQ0VGUkFNRV9UWVBFKSBwWzNdID0gMjU3OwogICAgZWxzZSBpZiAocFNsSFBhcmFtcy0+U2xpY2VGcmFtZV9UeXBlID09IFNMSFBfSURSX1NMSUNFRlJBTUVfVFlQRSkgcFszXSA9IDk0NzM7CiAgICBlbHNlIHBbM10gPSA4NDQ5OwojZWxzZQogICAgLyogLS0gQmVnaW4gYnVpbGRpbmcgdGhlIHBpY3R1cmUgaGVhZGVyIGVsZW1lbnQgKi8KICAgIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4obXR4X2hkciwgZWx0X3AsIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwoKICAgIHBud19fSDI2NF93cml0ZWJpdHNfc3RhcnRjb2RlX3ByZWZpeF9lbGVtZW50KAogICAgICAgIG10eF9oZHIsCiAgICAgICAgZWx0X3AsCiAgICAgICAgcFNsSFBhcmFtcy0+U3RhcnRfQ29kZV9QcmVmaXhfU2l6ZV9CeXRlcyk7IC8qIENhbiBiZSAzIG9yIDQgYnl0ZXMgLSBhbHdheXMgNCBieXRlcyBpbiBvdXIgaW1wbGVtZW50YXRpb25zICovCiAgICBwbndfX0gyNjRfd3JpdGViaXRzX3NsaWNlX2hlYWRlcjAobXR4X2hkciwgZWx0X3AsIHBTbEhQYXJhbXMpOwojZW5kaWYKCiAgICBwbndfX0gyNjRfd3JpdGViaXRzX3NsaWNlX2hlYWRlcjEobXR4X2hkciwgZWx0X3AsIHBTbEhQYXJhbXMsIHVpSWRyUGljSWQpOwoKI2lmIDAKICAgIGlmIChiQ2FiYWNFbmFibGVkICYmICgoU0xIUF9QX1NMSUNFRlJBTUVfVFlQRSA9PSBwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgKFNMSFBfQl9TTElDRUZSQU1FX1RZUEUgPT0gcFNsSFBhcmFtcy0+U2xpY2VGcmFtZV9UeXBlKSkpIHsKICAgICAgICBwbndfX2dlbmVyYXRlX3VlKG10eF9oZHIsIGVsdF9wLCAwKTsgICAgLyogaGFyZCBjb2RlIGNhYmFjX2luaXRfaWRjIHZhbHVlIG9mIDAgKi8KICAgIH0KI2VuZGlmCgogICAgcG53X19pbnNlcnRfZWxlbWVudF90b2tlbihtdHhfaGRyLCBlbHRfcCwgRUxFTUVOVF9TUVApOyAvKiBNVFggZmlsbHMgdGhpcyB2YWx1ZSBpbiAqLwoKICAgIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4obXR4X2hkciwgZWx0X3AsIEVMRU1FTlRfUkFXREFUQSk7CiAgICBwbndfX0gyNjRfd3JpdGViaXRzX3NsaWNlX2hlYWRlcjIobXR4X2hkciwgZWx0X3AsIHBTbEhQYXJhbXMpOwoKICAgIC8qIG5vIGJ5dGUgYWxpZ25tZW50IGF0IGVuZCBvZiBzbGljZSBoZWFkZXJzICovCn0KCgpzdGF0aWMgdm9pZCBwbndfX0gyNjRfZ2V0ZWxlbWVudHNfc2tpcF9QX3NsaWNlKAogICAgTVRYX0hFQURFUl9QQVJBTVMgKm10eF9oZHIsCiAgICBIMjY0X1NMSUNFX0hFQURFUl9QQVJBTVMgKnBTbEhQYXJhbXMsCiAgICBJTUdfVUlOVDMyIE1CX05vX0luX1NsaWNlLAogICAgSU1HX0JPT0wgYkNhYmFjRW5hYmxlZCkKewogICAgLyogU2tpcHBlZCBQLVNsaWNlCiAgICAgKiBFbnN1cmUgcFNsSFBhcmFtcyBpcyBmaWxsZWQgd2l0aCBhcHByb3ByaWF0ZSBwYXJhbWV0ZXJzIGZvciBhIEItc2xpY2UKICAgICAqIEVzc2VudGlhbCB3ZSBpbml0aWFsaXNlIG91ciBoZWFkZXIgc3RydWN0dXJlcyBiZWZvcmUgYnVpbGRpbmcKICAgICAqLwogICAgTVRYX0hFQURFUl9FTEVNRU5UICpUaGlzX0VsZW1lbnQ7CiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKmVsdF9wW01BWE5VTUJFUkVMRU1FTlRTXTsKICAgIG10eF9oZHItPkVsZW1lbnRzID0gRUxFTUVOVFNfRU1QVFk7CiAgICBUaGlzX0VsZW1lbnQgPSAoTVRYX0hFQURFUl9FTEVNRU5UICopIG10eF9oZHItPmFzRWxlbWVudFN0cmVhbTsKICAgIGVsdF9wWzBdID0gVGhpc19FbGVtZW50OwoKICAgIC8qIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4obXR4X2hkciwgRUxFTUVOVF9TVEFSVENPVU5URVIpOyAqLwogICAgLyogTm90IHN1cmUgaWYgdGhpcyB3aWxsIGJlIHJlcXVpcmVkIGluIHRoZSBmaW5hbCBzcGVjICovCiAgICBwbndfX0gyNjRfd3JpdGViaXRzX3NsaWNlX2hlYWRlcihtdHhfaGRyLCBlbHRfcCwgcFNsSFBhcmFtcywgYkNhYmFjRW5hYmxlZCwgMCk7CiAgICBwbndfX2dlbmVyYXRlX3VlKG10eF9oZHIsIGVsdF9wLCBNQl9Ob19Jbl9TbGljZSk7IC8qIG1iX3NraXBfcnVuID0gbWJfbm9faW5fc2xpY2UgKi8KCiAgICAvKiBUZWxsIE1UWCB0byBpbnNlcnQgdGhlIGJ5dGUgYWxpZ24gZmllbGQgKHdlIGRvbid0IGtub3cgZmluYWwgc3RyZWFtIHNpemUgZm9yIGFsaWdubWVudCBhdCB0aGlzIHBvaW50KSAqLwogICAgcG53X19pbnNlcnRfZWxlbWVudF90b2tlbihtdHhfaGRyLCBlbHRfcCwgRUxFTUVOVF9JTlNFUlRCWVRFQUxJR05fSDI2NCk7CiAgICBtdHhfaGRyLT5FbGVtZW50cysrOyAvKiBIYXMgYmVlbiB1c2VkIGFzIGFuIGluZGV4LCBzbyBuZWVkIHRvIGFkZCAxIGZvciBhIHZhbGlkIGVsZW1lbnQgY291bnQgKi8KfQoKCgpzdGF0aWMgdm9pZCBwbndfX0gyNjRfZ2V0ZWxlbWVudHNfc2VxdWVuY2VfaGVhZGVyKAogICAgTVRYX0hFQURFUl9QQVJBTVMgKm10eF9oZHIsCiAgICBIMjY0X1NFUVVFTkNFX0hFQURFUl9QQVJBTVMgKnBTSFBhcmFtcywKICAgIEgyNjRfQ1JPUF9QQVJBTVMgKnBzQ3JvcFBhcmFtcykKewogICAgLyogQnVpbGRzIGEgc2VxdWVuY2UsIHBpY3R1cmUgYW5kIHNsaWNlIGhlYWRlciB3aXRoIGZyb20gdGhlIGdpdmVuIGlucHV0cyBwYXJhbWV0ZXJzIChzdGFydCBvZiBuZXcgZnJhbWUpCiAgICAgKiBFc3NlbnRpYWwgd2UgaW5pdGlhbGlzZSBvdXIgaGVhZGVyIHN0cnVjdHVyZXMgYmVmb3JlIGJ1aWxkaW5nCiAgICAgKi8KICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqVGhpc19FbGVtZW50OwogICAgTVRYX0hFQURFUl9FTEVNRU5UICplbHRfcFtNQVhOVU1CRVJFTEVNRU5UU107CiAgICBtdHhfaGRyLT5FbGVtZW50cyA9IEVMRU1FTlRTX0VNUFRZOwogICAgVGhpc19FbGVtZW50ID0gKE1UWF9IRUFERVJfRUxFTUVOVCAqKSBtdHhfaGRyLT5hc0VsZW1lbnRTdHJlYW07CiAgICBlbHRfcFswXSA9IFRoaXNfRWxlbWVudDsKCiAgICBwbndfX0gyNjRfd3JpdGViaXRzX3NlcXVlbmNlX2hlYWRlcihtdHhfaGRyLCBlbHRfcCwgcFNIUGFyYW1zLCBwc0Nyb3BQYXJhbXMpOwogICAgbXR4X2hkci0+RWxlbWVudHMrKzsgLyogSGFzIGJlZW4gdXNlZCBhcyBhbiBpbmRleCwgc28gbmVlZCB0byBhZGQgMSBmb3IgYSB2YWxpZCBlbGVtZW50IGNvdW50ICovCn0KCgoKc3RhdGljIHZvaWQgcG53X19IMjY0X2dldGVsZW1lbnRzX3NsaWNlX2hlYWRlcigKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyLAogICAgSDI2NF9TTElDRV9IRUFERVJfUEFSQU1TICpwU2xIUGFyYW1zLAogICAgSU1HX0JPT0wgYkNhYmFjRW5hYmxlZCwKICAgIElNR19VSU5UMTYgdWlJZHJQaWNJZCkKewogICAgLyogQnVpbGRzIGEgc2luZ2xlIHNsaWNlIGhlYWRlciBmcm9tIHRoZSBnaXZlbiBwYXJhbWV0ZXJzIChtaWQgZnJhbWUpCiAgICAgKiBFc3NlbnRpYWwgd2UgaW5pdGlhbGlzZSBvdXIgaGVhZGVyIHN0cnVjdHVyZXMgYmVmb3JlIGJ1aWxkaW5nCiAgICAgKi8KICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqVGhpc19FbGVtZW50OwogICAgTVRYX0hFQURFUl9FTEVNRU5UICplbHRfcFtNQVhOVU1CRVJFTEVNRU5UU107CiAgICBtdHhfaGRyLT5FbGVtZW50cyA9IEVMRU1FTlRTX0VNUFRZOwogICAgVGhpc19FbGVtZW50ID0gKE1UWF9IRUFERVJfRUxFTUVOVCAqKSBtdHhfaGRyLT5hc0VsZW1lbnRTdHJlYW07CiAgICBlbHRfcFswXSA9IFRoaXNfRWxlbWVudDsKCiAgICAvKiBOb3Qgc3VyZSBpZiB0aGlzIHdpbGwgYmUgcmVxdWlyZWQgaW4gdGhlIGZpbmFsIHNwZWMgKi8KICAgIC8qIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4obXR4X2hkciwgRUxFTUVOVF9TVEFSVENPVU5URVIpOyovCiAgICBwbndfX0gyNjRfd3JpdGViaXRzX3NsaWNlX2hlYWRlcihtdHhfaGRyLCBlbHRfcCwgcFNsSFBhcmFtcywgYkNhYmFjRW5hYmxlZCwgdWlJZHJQaWNJZCk7CgogICAgbXR4X2hkci0+RWxlbWVudHMrKzsgLyogSGFzIGJlZW4gdXNlZCBhcyBhbiBpbmRleCwgc28gbmVlZCB0byBhZGQgMSBmb3IgYSB2YWxpZCBlbGVtZW50IGNvdW50ICovCn0KCgpzdGF0aWMgSU1HX1VJTlQ4IEJpdHMyQ29kZShJTUdfVUlOVDMyIENvZGVWYWwpCnsKICAgIElNR19VSU5UOCBCaXRzID0gMzI7CiAgICBpZiAoQ29kZVZhbCA9PSAwKQogICAgICAgIHJldHVybiAxOwogICAgd2hpbGUgKCEoQ29kZVZhbCAmIDB4ODAwMDAwMDApKSB7CiAgICAgICAgQ29kZVZhbCA8PD0gMTsKICAgICAgICBCaXRzLS07CiAgICB9CiAgICByZXR1cm4gQml0czsKfQoKLyoKICogSW50ZXJtZWRpYXJ5IGZ1bmN0aW9ucyB0byBidWlsZCBNUEVHNCBoZWFkZXJzCiAqLwojZGVmaW5lIE1BVENIX1RPX0VOQwoKCnN0YXRpYyB2b2lkIHBud19fTVBFRzRfd3JpdGViaXRzX3NlcXVlbmNlX2hlYWRlcigKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyLAogICAgTVRYX0hFQURFUl9FTEVNRU5UICoqZWx0X3AsCiAgICBJTUdfQk9PTCBfX21heWJlX3VudXNlZCBiQkZyYW1lLAogICAgTVBFRzRfUFJPRklMRV9UWVBFIGJQcm9maWxlLAogICAgSU1HX1VJTlQ4IFByb2ZpbGVfYW5kX2xldmVsX2luZGljYXRpb24sCiAgICBGSVhFRF9WT1BfVElNRV9UWVBFIF9fbWF5YmVfdW51c2VkIHNGaXhlZF92b3BfdGltZV9pbmNyZW1lbnQsCiAgICBJTUdfVUlOVDMyIFBpY3R1cmVfV2lkdGhfUGl4ZWxzLAogICAgSU1HX1VJTlQzMiBQaWN0dXJlX0hlaWdodF9QaXhlbHMsCiAgICBWQlZQQVJBTVMgX19tYXliZV91bnVzZWQgKiBzVkJWUGFyYW1zLAogICAgSU1HX1VJTlQzMiBWb3BUaW1lUmVzb2x1dGlvbikgLyogU2VuZCBOVUxMIHBvaW50ZXIgaWYgdGhlcmUgYXJlIG5vIFZCVlBhcmFtcyAqLwp7CiAgICAvKiBFc3NlbnRpYWwgd2UgaW5zZXJ0IHRoZSBlbGVtZW50IGJlZm9yZSB3ZSB0cnkgdG8gZmlsbCBpdCEgKi8KICAgIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4obXR4X2hkciwgZWx0X3AsIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwoKICAgIC8qIHZpc3VhbF9vYmplY3Rfc2VxdWVuY2Vfc3RhcnRfY29kZSAgICAgICAgPSAzMiBCaXRzICAgICAgID0gMHgxQjAgKi8KICAgIHBud19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgNDMyLCAzMik7CgogICAgLyogcHJvZmlsZV9hbmRfbGV2ZWxfaW5kaWNhdGlvbiA9IDggQml0cyA9IFNQIEwwLUwzIGFuZCBTUCBMNC1MNSBhcmUgc3VwcG9ydGVkICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgUHJvZmlsZV9hbmRfbGV2ZWxfaW5kaWNhdGlvbiwgOCk7CgogICAgLyogdmlzdWFsX29iamVjdF9zdGFydF9jb2RlID0gMzIgQml0cyAgICAgICA9IDB4MUI1ICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgOCk7CiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgOCk7CiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgOCk7CiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMTgxLCA4KTsKCiAgICAvKiBpc192aXN1YWxfb2JqZWN0X2lkZW50aWZpZXIgPSAxIEJpdCAgICAgID0gMCAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDEpOwoKICAgIC8qIHZpc3VhbF9vYmplY3RfdHlwZSA9IDQgQml0cyAgICAgID0gVmlkZW8gSUQgPSAxICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgNCk7CgogICAgLyogdmlkZW9fc2lnbmFsX3R5cGUgPSAxIEJpdCAgICAgICAgICAgICAgICA9IDEgKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCAxKTsKCiAgICAvKiBieXRlX2FsaWduZWRfYml0cyA9IDIgQml0cyAgICAgICA9IDAxYiAoYnl0ZV9hbGlnbmVkX2JpdHMgaXMgMi1iaXQgc3R1ZmZpbmcgYml0IGZpZWxkIDAxKSAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDIpOwoKICAgIC8qIHZpZGVvX29iamVjdF9zdGFydF9jb2RlID0gMzIgQml0cyAgICAgICAgPSAweDEwMCBPbmUgVk8gb25seSBpbiBhIFRvcGF6IHZpZGVvIHN0cmVhbSAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDgpOwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDgpOwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDgpOwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDgpOwoKICAgIC8qIHZpZGVvX29iamVjdF9sYXllcl9zdGFydF9jb2RlID0gMzIgQml0cyAgPSAweDEyMCBPbmUgVk9MIG9ubHkgaW4gYSBUb3BheiBzdHJlYW0gKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCA4KTsKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCA4KTsKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCA4KTsKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAzMiwgOCk7CgogICAgLyogcmFuZG9tX2FjY2Vzc2libGVfdm9sID0gMSBCaXQgICAgICAgICAgICA9IDAgKFAtRnJhbWUgaW4gR09QKSAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDEpOwoKICAgIGlmIChiUHJvZmlsZSA9PSBTUCkgewogICAgICAgIC8qIHZpZGVvX29iamVjdF90eXBlX2luZGljYXRpb24gPSA4IEJpdHMgICAgICAgID0gMHgwMSBmb3IgU1AgKi8KICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgOCk7CiNpZm5kZWYgTUFUQ0hfVE9fRU5DCiAgICAgICAgLyogaXNfb2JqZWN0X2xheWVyX2lkZW50aWZpZXIgICA9IDEgQml0ICAgICAgICAgPSAwIGZvciBTUCAqLwogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCAxKTsKI2Vsc2UKICAgICAgICAvKiB0byBtYXRjaCB0aGUgZW5jb2RlciAqLwoKICAgICAgICAvKiBpc19vYmplY3RfbGF5ZXJfaWRlbnRpZmllciAgID0gMSBCaXQgICAgICAgICAgKi8KICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMSk7CgogICAgICAgIC8qIHZpZGVvX29iamVjdF9sYXllcl92ZXJpZCAgICAgPSA0IEJpdHMgICAgICAgICAqLwogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCA0KTsKCiAgICAgICAgLyogdmlkZW9fb2JqZWN0X2xheWVyX3ByaW9yaXR5ICA9IDMgQml0cyAgICAgICAgICovCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDMpOyAgLy8gMCBpcyByZXNlcnZlZC4uLgojZW5kaWYKICAgIH0gZWxzZSB7CiAgICAgICAgLyogdmlkZW9fb2JqZWN0X3R5cGVfaW5kaWNhdGlvbiA9IDggQml0cyAgICAgICAgPSAweDExIGZvciBBU1AgKi8KICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMywgOCk7CgogICAgICAgIC8qIGlzX29iamVjdF9sYXllcl9pZGVudGlmaWVyICAgPSAxIEJpdCAgICAgICAgID0gMSBmb3IgQVNQICovCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDEpOwoKICAgICAgICAvKiB2aWRlb19vYmplY3RfbGF5ZXJfdmVyaWQgICAgID0gNCBCaXRzICAgICAgICA9IDUgaXMgZm9yIEFTUCAqLwogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCA1LCA0KTsKCiAgICAgICAgLyogdmlkZW9fb2JqZWN0X2xheWVyX3ByaW9yaXR5ICA9IDMgQml0cyAgICAgICAgPSAxIChIaWdoZXN0IHByaW9yaXR5KSAqLwogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAzKTsKICAgIH0KCiAgICAvKiBhc3BlY3RfcmF0aW9faW5mbyAgICAgICAgICAgICAgICA9IDQgQml0cyAgICAgICAgPTB4MSAoU3F1YXJlIHBpeGVsKSAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDQpOwojaWZuZGVmIE1BVENIX1RPX0VOQwogICAgLyogdm9sX2NvbnRyb2xfcGFyYW1ldGVycyAgICAgICAgICAgPSAxIEJpdCAgICAgICAgID0gMSAoQWx3YXlzIHNlbmQgVk9MIGNvbnRyb2wgcGFyYW1ldGVycykgKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAxKTsKI2Vsc2UKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCAxKTsKCiNlbmRpZgoKI2lmbmRlZiBNQVRDSF9UT19FTkMKICAgIC8qIGNocm9tYV9mb3JtYXQgICAgICAgICAgICAgICAgICAgID0gMiBCaXRzICAgICAgICA9IDAxYiAoNDoyOjApICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMik7CgogICAgLyogbG93X2RlbGF5ID0gMSBCaXQgPSAwIHdpdGggQi1mcmFtZSBhbmQgMSB3aXRob3V0IEItZnJhbWUgKi8KICAgIGlmIChiQkZyYW1lKQogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCAxKTsKICAgIGVsc2UKICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMSk7CgogICAgLyogdmJ2X3BhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgPSAxIEJpdCAgICAgICAgICAgICAgICAgPTAvMSAgKi8KICAgIGlmIChzVkJWUGFyYW1zKSB7CiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDEpOwoKICAgICAgICAvKiBGb3IgcmVjb3JkaW5nLCBvbmx5IHNlbmQgdmJ2IHBhcmFtZXRlcnMgaW4gMXN0IHNlcXVlbmNlIGhlYWRlci4KICAgICAgICAgKiBGb3IgdmlkZW8gcGhvbmUsIGl0IHNob3VsZCBiZSBzZW50IG1vcmUgb2Z0ZW4sIHN1Y2ggYXMgb25jZSBwZXIgc2VxdWVuY2UKICAgICAgICAgKi8KICAgICAgICBwbndfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMoCiAgICAgICAgICAgIG10eF9oZHIsCiAgICAgICAgICAgIGVsdF9wLAogICAgICAgICAgICBzVkJWUGFyYW1zLT5GaXJzdF9oYWxmX2JpdF9yYXRlLAogICAgICAgICAgICAxNSk7IC8qIGZpcnN0X2hhbGZfYml0X3JhdGUgKi8KCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDEpOy8qIE1hcmtlciBCaXQgPSAxICovCiAgICAgICAgcG53X193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKAogICAgICAgICAgICBtdHhfaGRyLAogICAgICAgICAgICBlbHRfcCwKICAgICAgICAgICAgc1ZCVlBhcmFtcy0+TGF0dGVyX2hhbGZfYml0X3JhdGUsCiAgICAgICAgICAgIDE1KTsgLyogbGF0dGVyX2hhbGZfYml0X3JhdGUgKi8KCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDEpOy8qIE1hcmtlciBCaXQgPSAxICovCiAgICAgICAgcG53X193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKAogICAgICAgICAgICBtdHhfaGRyLAogICAgICAgICAgICBlbHRfcCwKICAgICAgICAgICAgc1ZCVlBhcmFtcy0+Rmlyc3RfaGFsZl92YnZfYnVmZmVyX3NpemUsCiAgICAgICAgICAgIDE1KTsvKiBmaXJzdF9oYWxmX3Zidl9idWZmZXJfc2l6ZSAqLwoKICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMSk7IC8qIE1hcmtlciBCaXQgPSAxICovCiAgICAgICAgcG53X193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKAogICAgICAgICAgICBtdHhfaGRyLCBlbHRfcCwKICAgICAgICAgICAgc1ZCVlBhcmFtcy0+TGF0dGVyX2hhbGZfdmJ2X2J1ZmZlcl9zaXplLAogICAgICAgICAgICAxNSk7IC8qIGxhdHRlcl9oYWxmX3Zidl9idWZmZXJfc2l6ZSAqLwogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAxKTsvKiBNYXJrZXIgQml0ID0gMSAqLwogICAgICAgIHBud19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cygKICAgICAgICAgICAgbXR4X2hkciwKICAgICAgICAgICAgZWx0X3AsCiAgICAgICAgICAgIHNWQlZQYXJhbXMtPkZpcnN0X2hhbGZfdmJ2X29jY3VwYW5jeSwKICAgICAgICAgICAgMTUpOyAgLyogZmlyc3RfaGFsZl92YnZfb2NjdXBhbmN5ICovCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDEpOy8qIE1hcmtlciBCaXQgPSAxICovCiAgICAgICAgcG53X193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKAogICAgICAgICAgICBtdHhfaGRyLAogICAgICAgICAgICBlbHRfcCwKICAgICAgICAgICAgc1ZCVlBhcmFtcy0+TGF0dGVyX2hhbGZfdmJ2X29jY3VwYW5jeSwKICAgICAgICAgICAgMTUpOyAvKiBsYXR0ZXJfaGFsZl92YnZfb2NjdXBhbmN5ICovCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDEpOy8qIE1hcmtlciBCaXQgPSAxICovCiAgICB9IGVsc2UKICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgMSk7IC8qIE5vIHZidiBwYXJhbWV0ZXJzIHByZXNlbnQgKi8KI2VuZGlmCiAgICAvKiB2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPSAyIEJpdHMgPSAgICAgIDAwYiAgICAgUmVjdGFuZ3VsYXIgc2hhcGUgKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCAyKTsKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAxKTsgLyogTWFya2VyIEJpdCA9IDEgKi8KCiAgICAvKiB2b3BfdGltZV9pbmNyZW1lbnRfc29sdXRpb24gPSAxNiBCaXRzICovCiAgICBwbndfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIFZvcFRpbWVSZXNvbHV0aW9uLCAxNik7CiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMSk7IC8qIE1hcmtlciBCaXQgPSAxICovCgojaWZuZGVmIE1BVENIX1RPX0VOQwogICAgLyogZml4ZWRfdm9wX3JhdGUgPSAxIEJpdHMgID0gMSBBbHdheXMgZml4ZWQgZnJhbWUgcmF0ZSAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDEpOwoKICAgIC8qIGZpeGVkX3ZvcF90aW1lX2luY3JlbWVudCAgICAgICAgID0gVmFyaWFibGUgbnVtYmVyIG9mIGJpdHMgYmFzZWQgb24gdGhlIHRpbWUgaW5jcmVtZW50IHJlc29sdXRpb24uICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgQml0czJDb2RlKFZvcFRpbWVSZXNvbHV0aW9uIC0gMSkpOwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDEpOyAvKiBNYXJrZXIgQml0ID0gMSAqLwojZWxzZQogICAgLyogZml4ZWRfdm9wX3JhdGUgICA9IDEgQml0cyA9ICAgICAgMCAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDEpOwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDEpOyAvKiBNYXJrZXIgQml0ID0gMSAqLwoKI2VuZGlmCiAgICAvKiB2aWRlb19vYmplY3RfbGF5ZXJfd2lkdGggPSAxMyBCaXRzICBQaWN0dXJlIHdpZHRoIGluIHBpeGVsIHVuaXRzICovCiAgICBwbndfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIFBpY3R1cmVfV2lkdGhfUGl4ZWxzLCAxMyk7CiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMSk7IC8qIE1hcmtlciBCaXQgPSAxICovCgogICAgLyogdmlkZW9fb2JqZWN0X2xheWVyX2hlaWdodCA9IDEzIEJpdHMgUGljdHVyZSBoZWlnaHQgaW4gcGl4ZWwgdW5pdHMgKi8KICAgIHBud19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgUGljdHVyZV9IZWlnaHRfUGl4ZWxzLCAxMyk7CiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMSk7IC8qIE1hcmtlciBCaXQgPSAxICovCgogICAgLyogaW50ZXJsYWNlZCA9IDEgQml0ID0gMCBUb3BheiBvbmx5IGVuY29kZXMgcHJvZ3Jlc3NpdmUgZnJhbWVzICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgMSk7CgogICAgLyogb2JtY19kaXNhYmxlID0gMSBCaXQgPSAxIE5vIG92ZXJsYXBwZWQgTUMgaW4gVG9wYXogKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAxKTsKCiAgICAvKiBzcHJpdGVfZW5hYmxlID0gMSBCaXQgPSAwIE5vdCB1c2Ugc3ByaXRlIGluIFRvcGF6ICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgMSk7CgogICAgLyogbm90XzhfYml0ID0gMSAgICBCaXQgPSAwIDgtYml0IHZpZGVvIGluIFRvcGF6ICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgMSk7CgogICAgLyogcXVhbnRfdHlwZSA9IDEgQml0ID0gMCAybmQgcXVhbnRpemF0aW9uIG1ldGhvZCBpbiBUb3BheiAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDEpOwoKICAgIGlmIChiUHJvZmlsZSA9PSBBU1ApIHsKICAgICAgICAvKiBxdWFydGVyX3NhbXBsZSA9IDEgQml0ID0gMCBObyC8LXBlbCBNQyBpbiBUb3BheiAqLwogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCAxKTsKICAgIH0KCiAgICAvKiBjb21wbGV4aXR5X2VzdGltYXRpb25fZGlzYWJsZSAgICA9IDEgQml0ID0gMSBObyBjb21wbGV4aXR5IGVzdGltYXRpb24gaW4gVG9wYXogKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAxKTsKI2lmbmRlZiBNQVRDSF9UT19FTkMKCiAgICAvKiByZXN5bmNfbWFya2VyX2Rpc2FibGUgPSAxIEJpdCA9IDAgQWx3YXlzIGVuYWJsZSByZXN5bmMgbWFya2VyIGluIFRvcGF6ICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgMSk7CiNlbHNlCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMSk7CiNlbmRpZgogICAgLyogZGF0YV9wYXJ0aXRpb25lZCA9IDEgQml0ID0gMCBObyBkYXRhIHBhcnRpdGlvbmluZyBpbiBUb3BheiAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDEpOwoKICAgIGlmIChiUHJvZmlsZSA9PSBBU1ApIHsKICAgICAgICAvKiBuZXdwcmVkX2VuYWJsZSA9IDEgQml0ID0gMCBObyBuZXdwcmVkIG1vZGUgaW4gU1AvQVNQICovCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDEpOwogICAgICAgIC8qIHJlZHVjZWRfdm9wX3Jlc29sdXRpb25fZW5hYmxlPTEgQml0ID0gMCAgICAgIE5vIHJlZHVjZWQgcmVzb2x1dGlvbiBmcmFtZSBpbiBTUC9BU1AgKi8KICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgMSk7CiAgICB9CgogICAgLyogc2NhbGFiaWxpdHkgPSAxIEJpdCA9IDAgIE5vIHNjYWxhYmlsaXR5IGluIFNQL0FTUCAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDEpOwoKICAgIC8qIGJ5dGVfYWxpZ25lZF9iaXRzICovCgogICAgLyogVGVsbCBNVFggdG8gaW5zZXJ0IHRoZSBieXRlIGFsaWduIGZpZWxkCiAgICAgKiAod2UgZG9uJ3Qga25vdyBmaW5hbCBzdHJlYW0gc2l6ZSBmb3IgYWxpZ25tZW50IGF0IHRoaXMgcG9pbnQpCiAgICAgKi8KICAgIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4oCiAgICAgICAgbXR4X2hkciwKICAgICAgICBlbHRfcCwKICAgICAgICBFTEVNRU5UX0lOU0VSVEJZVEVBTElHTl9NUEc0KTsKCiAgICByZXR1cm47Cn0KCgovKiBVdGlsaXR5IGZ1bmN0aW9uICovCi8qCiAgSU1HX1VJTlQ4IEJpdHMyQ29kZShJTUdfVUlOVDMyIENvZGVWYWwpCiAgewogIElNR19VSU5UOCBCaXRzPTMyOwogIGlmKENvZGVWYWw9PTApCiAgcmV0dXJuIDE7CiAgd2hpbGUoIShDb2RlVmFsICYgMHg4MDAwMDAwMCkpCiAgewogIENvZGVWYWw8PD0xOwogIEJpdHMtLTsKICB9CiAgcmV0dXJuIEJpdHM7CiAgfQoqLwoKLyogTVBFRyA0IFZPUCAoUGljdHVyZSkgSGVhZGVyICovCnN0YXRpYyB2b2lkIHBud19fTVBFRzRfd3JpdGViaXRzX1ZPUF9oZWFkZXIoCiAgICBNVFhfSEVBREVSX1BBUkFNUyAqbXR4X2hkciwKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqKmVsdF9wLAogICAgSU1HX0JPT0wgICAgYklzVk9QX2NvZGVkLAogICAgSU1HX1VJTlQ4ICAgVk9QX3RpbWVfaW5jcmVtZW50LAogICAgU0VBUkNIX1JBTkdFX1RZUEUgc1NlYXJjaF9yYW5nZSwKICAgIFZPUF9DT0RJTkdfVFlQRSBzVm9wQ29kaW5nVHlwZSwKICAgIElNR19VSU5UMzIgVm9wVGltZVJlc29sdXRpb24pCnsKICAgIElNR19CT09MIGJJc1N5bmNQb2ludDsKICAgIC8qIEVzc2VudGlhbCB3ZSBpbnNlcnQgdGhlIGVsZW1lbnQgYmVmb3JlIHdlIHRyeSB0byBmaWxsIGl0ISAqLwogICAgcG53X19pbnNlcnRfZWxlbWVudF90b2tlbihtdHhfaGRyLCBlbHRfcCwgRUxFTUVOVF9TVEFSVENPREVfUkFXREFUQSk7CgogICAgLyogdmlzdWFsX29iamVjdF9zZXF1ZW5jZV9zdGFydF9jb2RlICAgICAgICA9IDMyIEJpdHMgICAgICAgPSAweDFCNiAqLwogICAgcG53X193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCA0MzgsIDMyKTsKCiAgICAvKiB2b3BfY29kaW5nX3R5cGUgID0gMiBCaXRzID0gMCBmb3IgSS1mcmFtZSBhbmQgMSBmb3IgUC1mcmFtZSAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIHNWb3BDb2RpbmdUeXBlLCAyKTsKICAgIGJJc1N5bmNQb2ludCA9IChWT1BfdGltZV9pbmNyZW1lbnQgPiAxKSAmJiAoKFZPUF90aW1lX2luY3JlbWVudCkgJSBWb3BUaW1lUmVzb2x1dGlvbiA9PSAwKTsKCiNpZm5kZWYgTUFUQ0hfVE9fRU5DCiAgICAvKiBtb2R1bG9fdGltZV9iYXNlID0gMSBCaXQgPSAwIEFzIGF0IGxlYXN0ICAxIHN5bmNocm9uaXphdGlvbiBwb2ludCAoSS1mcmFtZSkgcGVyIHNlY29uZCBpbiBUb3BheiAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDEpOwojZWxzZQoKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCBiSXNTeW5jUG9pbnQgID8gMiA6IDAgLCBiSXNTeW5jUG9pbnQgPyAyIDogMSk7CgojZW5kaWYKCiAgICAvKiBtYXJrZXJfYml0ID0gMSAgIEJpdHMgICAgPSAxICAgICAgKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAxKTsKCiNpZm5kZWYgTUFUQ0hfVE9fRU5DCiAgICAvKiB2b3BfdGltZV9pbmNyZW1lbnQgPSBWYXJpYWJsZSBiaXRzIGJhc2VkIG9uIHJlc29sdXRpb24KICAgICAqICA9IHggUmVzZXQgdG8gMCBhdCBJLWZyYW1lIGFuZCBwbHVzIGZpeGVkX3ZvcF90aW1lX2luY3JlbWVudCBlYWNoIGZyYW1lCiAgICAgKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCBWT1BfdGltZV9pbmNyZW1lbnQsIDUpOwojZWxzZQogICAgLyogd2lsbCBjaHJhc2ggaGVyZS4uLiAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMoCiAgICAgICAgbXR4X2hkciwgZWx0X3AsCiAgICAgICAgKFZPUF90aW1lX2luY3JlbWVudCkgJSBWb3BUaW1lUmVzb2x1dGlvbiwKICAgICAgICBCaXRzMkNvZGUoVm9wVGltZVJlc29sdXRpb24gLSAxKSk7CgojZW5kaWYKICAgIC8qIG1hcmtlcl9iaXQgPSAxIEJpdCAgICAgICAgICAgICAgID0gMSAgICAgICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMSk7CgogICAgaWYgKCFiSXNWT1BfY29kZWQpIHsKICAgICAgICAvKiB2b3BfY29kZWQgICAgPSAxIEJpdCAgICAgICAgID0gMCBmb3Igc2tpcHBlZCBmcmFtZSAqLwogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCAxKTsKCiAgICAgICAgLyogYnl0ZV9hbGlnbmVkX2JpdHMgKHNraXBwZWQgcGljdHVyZXMgYXJlIGJ5dGUgYWxpZ25lZCkgKi8KICAgICAgICAvKiBUZWxsIE1UWCB0byBpbnNlcnQgdGhlIGJ5dGUgYWxpZ24gZmllbGQgKHdlIGRvbid0IGtub3cgZmluYWwgc3RyZWFtIHNpemUgZm9yIGFsaWdubWVudCBhdCB0aGlzIHBvaW50KQogICAgICAgICAqIEVuZCBvZiBWT1AgLSBza2lwcGVkIHBpY3R1cmUKICAgICAgICAgKi8KICAgICAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKG10eF9oZHIsIGVsdF9wLCBFTEVNRU5UX0lOU0VSVEJZVEVBTElHTl9NUEc0KTsKICAgIH0gZWxzZSB7CiAgICAgICAgLyogdm9wX2NvZGVkID0gMSBCaXQgICAgICAgICAgICA9IDEgZm9yIG5vcm1hbCBjb2RlZCBmcmFtZSAqLwogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAxKTsKCiAgICAgICAgaWYgKHNWb3BDb2RpbmdUeXBlID09IFBfRlJBTUUpIHsKICAgICAgICAgICAgLyogdm9wX3JvdW5kaW5nX3R5cGUgPSAxIEJpdCA9IDAgdm9wX3JvdW5kaW5nX3R5cGUgaXMgMCBpbiBUb3BheiAqLwogICAgICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgMSk7CiAgICAgICAgfQoKICAgICAgICAvKiBpbnRyYV9kY192bGNfdGhyID0gMyBCaXRzID0gMCBVc2UgaW50cmEgREMgVkxDIGluIFRvcGF6ICovCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDMpOwoKICAgICAgICAvKiB2b3BfcXVhbnQgPSA1IEJpdHMgICA9IHggICAgIDUtYml0IGZyYW1lIFFfc2NhbGUgZnJvbSByYXRlIGNvbnRyb2wgLSBHRU5FUkFURUQgQlkgTVRYICovCiAgICAgICAgLyogcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIEZyYW1lX1Ffc2NhbGUsIDUpOyAqLwogICAgICAgIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4obXR4X2hkciwgZWx0X3AsIEVMRU1FTlRfRlJBTUVRU0NBTEUpOwoKICAgICAgICBpZiAoc1ZvcENvZGluZ1R5cGUgPT0gUF9GUkFNRSkgewogICAgICAgICAgICAvKiB2b3BfZmNvZGVfZm9yd2FyZCA9IDMgYml0cyAgICAgICA9IDIgZm9yICsvLTMyIGFuZCAzIGZvciArLy02NCBzZWFyY2ggcmFuZ2UgICovCiAgICAgICAgICAgIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4obXR4X2hkciwgZWx0X3AsIEVMRU1FTlRfUkFXREFUQSk7CiAgICAgICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCBzU2VhcmNoX3JhbmdlLCAzKTsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgKioqKiBUSEUgRklOQUwgUEFSVCBPRiBWT1AgU1RSVUNUVVJFIENBTidUIEJFIEdFTkVSQVRFRCBIRVJFCiAgICAgICAgcG53X19pbnNlcnRfZWxlbWVudF90b2tlbihtdHhfaGRyLCBlbHRfcCwgRUxFTUVOVF9SQVdEQVRBKTsKICAgICAgICB2aWRlb19wYWNrZXRfZGF0YSAoICkgICAgICAgICAgICAgICAgICAgPSAxc3QgIFZQIHRoYXQgZG9lc26SdCBoYXZlIHRoZSBWUCBoZWFkZXIKCiAgICAgICAgd2hpbGUgKG5leHRiaXRzX2J5dGVhbGlnbmVkICggKSA9PSByZXN5bmNfbWFya2VyKQogICAgICAgIHsKICAgICAgICB2aWRlb19wYWNrZXQgX2hlYWRlciggKQogICAgICAgIHZpZGVvX3BhY2tldCBfZGF0YSggKSAgICAgICAgICAgICAgICAgICBBbGwgTUIgaW4gdGhlIHNsaWNlCiAgICAgICAgfQogICAgICAgICovCiAgICB9Cn0KCiNpZiBQU0JfTUZMRF9EVU1NWV9DT0RFCi8qCiAqIEludGVybWVkaWFyeSBmdW5jdGlvbnMgdG8gYnVpbGQgSDI2MyBoZWFkZXJzCiAqLwpzdGF0aWMgdm9pZCBIMjYzX3dyaXRlYml0c19WaWRlb1NlcXVlbmNlSGVhZGVyKAogICAgTVRYX0hFQURFUl9QQVJBTVMgKm10eF9oZHIsCiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKiplbHRfcCwKICAgIElNR19VSU5UOCBQcm9maWxlX2FuZF9sZXZlbF9pbmRpY2F0aW9uKQp7CiAgICAvKiBFc3NlbnRpYWwgd2UgaW5zZXJ0IHRoZSBlbGVtZW50IGJlZm9yZSB3ZSB0cnkgdG8gZmlsbCBpdCEgKi8KICAgIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4obXR4X2hkciwgZWx0X3AsIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwoKICAgIC8qIHZpc3VhbF9vYmplY3Rfc2VxdWVuY2Vfc3RhcnRfY29kZSAgICAgICAgPSAzMiBCaXRzICAgICAgID0gMHgxQjAgKi8KICAgIHBud19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgNDMyLCAzMik7CgogICAgLyogcHJvZmlsZV9hbmRfbGV2ZWxfaW5kaWNhdGlvbiA9IDggQml0cyA9ICB4IFNQIEwwLUwzIGFuZCBTUCBMNC1MNSBhcmUgc3VwcG9ydGVkICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgUHJvZmlsZV9hbmRfbGV2ZWxfaW5kaWNhdGlvbiwgOCk7CgogICAgLyogdmlzdWFsX29iamVjdF9zdGFydF9jb2RlID0gMzIgQml0cyAgICAgICA9IDB4MUI1ICovCgogICAgLyogNDM3IHRvbyBsYXJnZSBmb3IgdGhlICAgcG53X193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzIGZ1bmN0aW9uICovCiAgICBwbndfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDQzNywgMzIpOwoKICAgIC8qIGlzX3Zpc3VhbF9vYmplY3RfaWRlbnRpZmllciA9IDEgQml0ICAgICAgICAgICAgICA9IDAgKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCAxKTsKCiAgICAvKiBpc192aXN1YWxfb2JqZWN0X3R5cGUgICAgPSA0IEJpdHMgICAgICAgID0gMSBWaWRlbyBJRCAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDQpOwoKICAgIC8qIHZpZGVvX3NpZ25hbF90eXBlID0gMSBCaXQgICAgICAgICAgICAgICAgPSAwICAgICAgKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCAxKTsKCiAgICAvKiBieXRlX2FsaWduZWRfYml0cyA9IDIgQml0cyA9IDAxYiBieXRlX2FsaWduZWRfYml0cyBpcyAyLWJpdCBzdHVmZmluZyBiaXQgZmllbGQgMDEgKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAyKTsKCiAgICAvKiB2aWRlb19vYmplY3Rfc3RhcnRfY29kZSAgPTMyIEJpdHMgICAgICAgID0gMHgxMDAgT25lIFZPIG9ubHkgaW4gYSBUb3BheiB2aWRlbyBzdHJlYW0gKi8KICAgIHBud19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMjU2LCAzMik7CgogICAgcmV0dXJuOwp9CiNlbmRpZgoKCnN0YXRpYyB2b2lkIEgyNjNfd3JpdGViaXRzX1ZpZGVvUGljdHVyZUhlYWRlcigKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyLAogICAgTVRYX0hFQURFUl9FTEVNRU5UICoqZWx0X3AsCiAgICBJTUdfVUlOVDggVGVtcG9yYWxfUmVmLAogICAgSDI2M19QSUNUVVJFX0NPRElOR19UWVBFIFBpY3R1cmVDb2RpbmdUeXBlLAogICAgLy9JTUdfVUlOVDggUV9TY2FsZSwKICAgIEgyNjNfU09VUkNFX0ZPUk1BVF9UWVBFIFNvdXJjZUZvcm1hdFR5cGUsCiAgICBJTUdfVUlOVDggRnJhbWVSYXRlLAogICAgSU1HX1VJTlQzMiBQaWN0dXJlV2lkdGgsCiAgICBJTUdfVUlOVDMyIFBpY3R1cmVIZWlnaHQpCnsKICAgIElNR19VSU5UOCBVRkVQOwogICAgSU1HX1VJTlQ4IE9DUENGID0gMDsKCiAgICAvKiBFc3NlbnRpYWwgd2UgaW5zZXJ0IHRoZSBlbGVtZW50IGJlZm9yZSB3ZSB0cnkgdG8gZmlsbCBpdCEgKi8KICAgIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4obXR4X2hkciwgZWx0X3AsIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwoKICAgIC8qIHNob3J0X3ZpZGVvX3N0YXJ0X21hcmtlciA9IDIyIEJpdHMgICAgICAgPSAweDIwIFBpY3R1cmUgc3RhcnQgY29kZSAqLwogICAgcG53X193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAzMiwgMjIpOwoKICAgIC8qIHRlbXBvcmFsX3JlZmVyZW5jZSA9IDggQml0cyAgICAgID0gMC0yNTUgRWFjaCBwaWN0dXJlIGluY3JlYXNlZCBieSAxICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgVGVtcG9yYWxfUmVmLCA4KTsKCiAgICAvKiBtYXJrZXJfYml0ID0gMSBCaXQgPSAxICAgICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSwgMSk7CgogICAgLyogemVyb19iaXQgPSAxIEJpdHMgICAgICAgID0gMCAgICAgICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgMSk7CgogICAgLyogc3BsaXRfc2NyZWVuX2luZGljYXRvciAgID0gMSAgICAgQml0cyAgICA9IDAgICAgIE5vIGRpcmVjdCBlZmZlY3Qgb24gZW5jb2Rpbmcgb2YgcGljdHVyZSAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDEpOwoKICAgIC8qIGRvY3VtZW50X2NhbWVyYV9pbmRpY2F0b3I9IDEgICAgIEJpdHMgICAgPSAwICAgICBObyBkaXJlY3QgZWZmZWN0IG9uIGVuY29kaW5nIG9mIHBpY3R1cmUgKi8KICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCAxKTsKCiAgICAvKiBmdWxsX3BpY3R1cmVfZnJlZXplX3JlbGVhc2U9MSBCaXRzICAgICAgID0gMCAgICAgTm8gZGlyZWN0IGVmZmVjdCBvbiBlbmNvZGluZyBvZiBwaWN0dXJlICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgMSk7CgogICAgLyogc291cmNlX2Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgIEJpdHMgICAgPSAxLTQgICBTZWUgbm90ZSAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIFNvdXJjZUZvcm1hdFR5cGUsIDMpOwoKICAgIC8qV3JpdGUgb3B0aW9uYWwgQ3VzdG9tIFBpY3R1cmUgQ2xvY2sgRnJlcXVlbmN5KE9DUENGKSovCiAgICBpZiAoRnJhbWVSYXRlID09IDMwIHx8IEZyYW1lUmF0ZSA9PSAwLyogdW5zcGVjaWZpZWQgKi8pIHsKICAgICAgICBPQ1BDRiA9IDA7IC8vIDAgZm9yIENJRiBQQ0YKICAgIH0gZWxzZSB7CiAgICAgICAgT0NQQ0YgPSAxOyAvLzEgZm9yIEN1c3RvbSBQQ0YKICAgIH0KCiAgICBpZiAoU291cmNlRm9ybWF0VHlwZSAhPSA3KSB7CiAgICAgICAgLy8gcGljdHVyZV9jb2RpbmdfdHlwZSAgICAgICAgICA9IDEgQml0ICAgICAgICAgPSAwLzEgICAwIGZvciBJLWZyYW1lIGFuZCAxIGZvciBQLWZyYW1lCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIFBpY3R1cmVDb2RpbmdUeXBlLCAxKTsKICAgICAgICAvLyBmb3VyX3Jlc2VydmVkX3plcm9fYml0cyAgICAgID0gNCBCaXRzICAgICAgICA9IDAKICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgNCk7CiAgICB9IGVsc2UgewogICAgICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyICBSVFlQRSA9IDA7CgogICAgICAgIC8vIGlmIEktIEZyYW1lIHNldCBVcGRhdGUgRnVsbCBFeHRlbmRlZCBQVFlQRSB0byB0cnVlCiAgICAgICAgaWYgKChQaWN0dXJlQ29kaW5nVHlwZSA9PSBJX0ZSQU1FKSB8fCAoU291cmNlRm9ybWF0VHlwZSA9PSA3KSB8fCBPQ1BDRikgewogICAgICAgICAgICBVRkVQID0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBVRkVQID0gMDsKICAgICAgICB9CiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIFVGRVAsIDMpOwogICAgICAgIGlmIChVRkVQID09IDEpIHsKICAgICAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDYsIDMpOwogICAgICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgT0NQQ0YgLCAxKTsKCiAgICAgICAgICAgIC8qIDEwIHJlc2VydmUgYml0cyAoIE9wdGlvbmFsIHN1cHBvcnQgZm9yIHRoZSBlbmNvZGluZykuIEFsbCBhcmUgT0ZGKDApLgogICAgICAgICAgICAgKiAgLSBPcHRpb25hbCBVbnJlc3RyaWN0ZWQgTW90aW9uIFZlY3RvciAoVU1WKQogICAgICAgICAgICAgKiAgLSBPcHRpb25hbCBTeW50YXgtYmFzZWQgQXJpdGhtZXRpYyBDb2RpbmcgKFNBQykKICAgICAgICAgICAgICogIC0gT3B0aW9uYWwgQWR2YW5jZWQgUHJlZGljdGlvbiAoQVApIG1vZGUKICAgICAgICAgICAgICogIC0gT3B0aW9uYWwgQWR2YW5jZWQgSU5UUkEgQ29kaW5nIChBSUMpIG1vZGUKICAgICAgICAgICAgICogIC0gT3B0aW9uYWwgRGVibG9ja2luZyBGaWx0ZXIgKERGKSBtb2RlCiAgICAgICAgICAgICAqICAtIE9wdGlvbmFsIFNsaWNlIFN0cnVjdHVyZWQgKFNTKSBtb2RlCiAgICAgICAgICAgICAqICAtIE9wdGlvbmFsIFJlZmVyZW5jZSBQaWN0dXJlIFNlbGVjdGlvbihSUFMpIG1vZGUuCiAgICAgICAgICAgICAqICAtIE9wdGlvbmFsIEluZGVwZW5kZW50IFNlZ21lbnQgRGVjb2RpbmcgKElTRCkgbW9kZQogICAgICAgICAgICAgKiAgLSBPcHRpb25hbCBBbHRlcm5hdGl2ZSBJTlRFUiBWTEMgKEFJVikgbW9kZQogICAgICAgICAgICAgKiAgLSBPcHRpb25hbCBNb2RpZmllZCBRdWFudGl6YXRpb24gKE1RKSBtb2RlICovCgogICAgICAgICAgICBwbndfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDEwKTsKICAgICAgICAgICAgLy8gMTAgcmVzZXJ2ZSBiaXRzCiAgICAgICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCA4LCA0KTsKICAgICAgICAgICAgLy8gNCByZXNlcnZlIGJpdHMKICAgICAgICB9CiAgICAgICAgLy8gcGljdHVyZV9jb2RpbmdfdHlwZSAgICAgICAgICA9IDEgQml0ICAgICAgICAgPSAwLzEgICAwIGZvciBJLWZyYW1lIGFuZCAxIGZvciBQLWZyYW1lCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIFBpY3R1cmVDb2RpbmdUeXBlLCAzKTsKCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDIpOwogICAgICAgIC8vIHR3b19yZXNlcnZlX2JpdHMsICAgICAgcm91bmRpbmdfdHlwZSwgICAgICAgdHdvX3Jlc2VydmVfYml0cyAgICAgICBtYXJrZXJfYml0ICAgICAgIENQTQogICAgICAgIC8vIFJvdW5kaW5nIFR5cGUgKFJUWVBFKSAoMSBmb3IgUCBQaWN0dXJlLCAwIGZvciBhbGwgb3RoZXIgUGljdHVyZSBmcmFtZXMuCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIFJUWVBFLCAxKTsKICAgICAgICAvLzIgcmVzZXJ2ZSBiaXRzCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDAsIDIpOwogICAgICAgIC8vICAgLSAxIChPTikgdG8gcHJldmVudCBzdGFydCBjb2RlIGVtdWxhdGlvbi4KICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMSAsIDEpOwogICAgICAgIC8vIENQTSBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZSBQUFRZUEUgcGFydCBvZiB0aGUgaGVhZGVyLgogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwICwgMSk7CgoKICAgICAgICBpZiAoVUZFUCA9PSAxKSB7CiAgICAgICAgICAgIElNR19VSU5UMTYgdWkxNlBXSSwgdWkxNlBISTsKICAgICAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIDEsIDQpOwogICAgICAgICAgICAvLyBhc3BlY3QgcmF0aW8KICAgICAgICAgICAgLy9QaWN0dXJlV2lkdGgtLTsKICAgICAgICAgICAgLy9wbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgKElNR19VSU5UOCkoUGljdHVyZVdpZHRoID4+IDgpLCAxKTsKICAgICAgICAgICAgLy9wbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgKElNR19VSU5UOCkoUGljdHVyZVdpZHRoICYgMHhGRiksIDgpOwogICAgICAgICAgICAvL1dpZHRoID0gKFBXSS0xKSo0LCBIZWlnaHQgPSBQSEkqNCwgc2VlIEgyNjMgc3BlYyA1LjEuNQogICAgICAgICAgICB1aTE2UFdJID0gKFBpY3R1cmVXaWR0aCA+PiAyKSAtIDE7CiAgICAgICAgICAgIHBud19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgKElNR19VSU5UOCl1aTE2UFdJLCA5KTsKCiAgICAgICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAxKTsKICAgICAgICAgICAgLy8gbWFya2VyX2JpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgQml0ICAgICAgICAgPSAxCiAgICAgICAgICAgIC8vcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIChJTUdfVUlOVDgpKFBpY3R1cmVIZWlnaHQgPj4gOCksIDEpOwogICAgICAgICAgICAvL3Bud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAoSU1HX1VJTlQ4KShQaWN0dXJlSGVpZ2h0ICYgMHhGRiksIDgpOwoKICAgICAgICAgICAgdWkxNlBISSA9IFBpY3R1cmVIZWlnaHQgPj4gMjsKICAgICAgICAgICAgcG53X193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAoSU1HX1VJTlQ4KXVpMTZQSEksIDkpOwogICAgICAgICAgICAvLyBnb29kIHVwIHRvIHRoYXQgcG9pbnQKICAgICAgICAgICAgLy8gIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAxKTsKICAgICAgICAgICAgLy8gbWFya2VyX2JpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgQml0ICAgICAgICAgPSAxCiAgICAgICAgICAgIC8vIGp1c3QgY2hlY2tpbmcKICAgICAgICAgICAgaWYgKE9DUENGID09IDEpIHsKICAgICAgICAgICAgICAgIC8vSU1HX1VJTlQ4IENQQ0ZDOwogICAgICAgICAgICAgICAgLy9DUENGQyA9IChJTUdfVUlOVDgpKDE4MDAvKElNR19VSU5UMTYpRnJhbWVSYXRlKTsKICAgICAgICAgICAgICAgIC8qIHlvdSBjYW4gdXNlIHRoZSB0YWJsZSBmb3IgZGl2aXNpb24gKi8KICAgICAgICAgICAgICAgIC8vQ1BDRkMgPDw9IDE7IC8qIGZvciBDbG9jayBDb252ZXJzaW9uIENvZGUgKi8KICAgICAgICAgICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAxKTsKICAgICAgICAgICAgICAgIC8vIENsb2NrIERpdmlzb3IgOiA3IGJpdHMgVGhlIG5hdHVyYWwgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZSBvZiB0aGUgY2xvY2sgZGl2aXNvci4KICAgICAgICAgICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxODAwMDAwIC8gKEZyYW1lUmF0ZSAqIDEwMDApLCA3KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoT0NQQ0YgPT0gMSkgewogICAgICAgICAgICBJTUdfVUlOVDggdWk4RVRSOyAvLyBleHRlbmRlZCBUZW1wb3JhbCByZWZlcmVuY2UKICAgICAgICAgICAgLy8gVHdvIE1TQnMgb2YgMTAgYml0IHRlbXBvcmFsX3JlZmVyZW5jZSA6IHZhbHVlIDAKICAgICAgICAgICAgdWk4RVRSID0gVGVtcG9yYWxfUmVmID4+IDg7CgogICAgICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgdWk4RVRSLCAyKTsKICAgICAgICAgICAgLyogVHdvIE1TQnMgb2YgdGVtcG9yYWxfcmVmZXJlbmNlICovCiAgICAgICAgfQogICAgfQogICAgLy8gdm9wX3F1YW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUgQml0cyAgICAgICAgPSB4ICAgICA1LWJpdCBmcmFtZSBRX3NjYWxlIGZyb20gcmF0ZSBjb250cm9sIC0gR0VORVJBVEVEIEJZIE1UWAogICAgLy9wbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgdWk4UV9TY2FsZSwgNSk7CiAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKG10eF9oZHIsIGVsdF9wLCBFTEVNRU5UX0ZSQU1FUVNDQUxFKTsgLy8gSW5zZXJ0IHRva2VuIHRvIHRlbGwgTVRYIHRvIGluc2VydCByYXRlLWNvbnRyb2wgdmFsdWUgKFFTY2FsZSBpcyBzZW50IGFzIGFuIGFyZ3VtZW50IGluIE1UWF9TZW5kX0VsZW1lbnRzX1RvX1ZMQygmTVRYX0hlYWRlciwgRnJhbWVRU2NhbGUpKQogICAgcG53X19pbnNlcnRfZWxlbWVudF90b2tlbihtdHhfaGRyLCBlbHRfcCwgRUxFTUVOVF9SQVdEQVRBKTsKICAgIC8vIHplcm9fYml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxIEJpdCAgICAgICAgID0gMAogICAgLy8gcGVpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSBCaXQgICAgICAgICA9IDAgICAgIE5vIGRpcmVjdCBlZmZlY3Qgb24gZW5jb2Rpbmcgb2YgcGljdHVyZQogICAgaWYgKFNvdXJjZUZvcm1hdFR5cGUgIT0gNykgewogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAwLCAxKTsKICAgIH0KCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgMCwgMSk7CiAgICAvLyBGT0xMT1dJTkcgU0VDVElPTiBDQU4nVCBCRSBHRU5FUkFURUQgSEVSRQogICAgLy9nb2JfZGF0YSggKQogICAgLy9mb3IoaT0xOyBpPG51bV9nb2JfaW5fcGljdHVyZTsgaSsrKSB7CiAgICAvLyAgICAgIGdvYl9oZWFkZXIoICkKICAgIC8vICAgICAgZ29iX2RhdGEoICkKICAgIC8vIH0KICAgIHJldHVybjsKfQoKc3RhdGljIHZvaWQgSDI2M193cml0ZWJpdHNfR09CU2xpY2VIZWFkZXIoCiAgICBNVFhfSEVBREVSX1BBUkFNUyAqbXR4X2hkciwKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqKmVsdF9wLAogICAgSU1HX1VJTlQ4IEdPQk51bWJlciwKICAgIElNR19VSU5UOCBHT0JGcmFtZUlkKQp7CiAgICAvKiBFc3NlbnRpYWwgd2UgaW5zZXJ0IHRoZSBlbGVtZW50IGJlZm9yZSB3ZSB0cnkgdG8gZmlsbCBpdCEgKi8KICAgIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4obXR4X2hkciwgZWx0X3AsIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwoKICAgIC8qIGdvYl9yZXN5bmNfbWFya2VyICAgICAgICAgICAgICAgID0gMTcgICAgICAgICAgICA9IDB4MSAqLwogICAgcG53X193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGVsdF9wLCAxLCAxNyk7CgogICAgLyogZ29iX251bWJlciA9IDUgICA9IDAtMTcgIEl0IGlzIGdvYiBudW1iZXIgaW4gYSBwaWN0dXJlICovCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgR09CTnVtYmVyLCA1KTsKCiAgICAvKiBnb2JfZnJhbWVfaWQgICAgID0gMiA9IDAtMyAgICAgICBTZWUgbm90ZSAqLwogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgZWx0X3AsIEdPQkZyYW1lSWQsIDIpOwoKICAgIC8qIHF1YW50X3NjYWxlICAgICAgPSA1ICAgICA9IDEtMzIgIGdvYiAoU2xpY2UpIFFfc2NhbGUgICovCiAgICAvKiBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBlbHRfcCwgR09CX1FfU2NhbGUsIDUpOyAqLwoKICAgIC8qIEluc2VydCB0b2tlbiB0byB0ZWxsIE1UWCB0byBpbnNlcnQgcmF0ZS1jb250cm9sIHZhbHVlCiAgICAgKiAgKFFTY2FsZSBpcyBzZW50IGFzIGFuIGFyZ3VtZW50IGluIE1UWF9TZW5kX0VsZW1lbnRzX1RvX1ZMQygmTVRYX0hlYWRlciwgU2xpY2VRU2NhbGUpKQogICAgICovCiAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKG10eF9oZHIsIGVsdF9wLCBFTEVNRU5UX1NMSUNFUVNDQUxFKTsKICAgIHJldHVybjsKfQoKLyoKICogSGlnaCBsZXZlbCBmdW5jdGlvbnMgdG8gY2FsbCB3aGVuIGEgSDI2MyBoZWFkZXIgaXMgcmVxdWlyZWQgLSBIT1NUIFJPVVRJTkVTCiAqLwoKLy8gU0VJX0lOU0VSVElPTgojaWYgUFNCX01GTERfRFVNTVlfQ09ERQpzdGF0aWMgdm9pZCBwbndfX0gyNjRfd3JpdGViaXRzX0FVRF9oZWFkZXIoCiAgICBNVFhfSEVBREVSX1BBUkFNUyAqcE1UWF9IZWFkZXIsCiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKiphdWkzMkVsZW1lbnRQb2ludGVycykKewogICAgLy8gRXNzZW50aWFsIHdlIGluc2VydCB0aGUgZWxlbWVudCBiZWZvcmUgd2UgdHJ5IHRvIGZpbGwgaXQhCiAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9TVEFSVENPREVfUkFXREFUQSk7CgogICAgcG53X19IMjY0X3dyaXRlYml0c19zdGFydGNvZGVfcHJlZml4X2VsZW1lbnQocE1UWF9IZWFkZXIsCiAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLCA0KTsgLy8gMDAgMDAgMDAgMDEgc3RhcnQgY29kZSBwcmVmaXgKCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgpOyAvLyBBVUQgbmFsX3VuaXRfdHlwZSA9IDA5CgogICAgLy8gcHJpbWFyeV9waWNfdHlwZSAgdSgzKSAwPUkgc2xpY2UsIDE9UCBvciBJIHNsaWNlLCAyPVAsQiBvciBJIHNsaWNlCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMpOwoKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIDw8IDQsIDUpOyAvLyByYnNwX3RyYWlsaW5nX2JpdHMKCiAgICAvLyBXcml0ZSB0ZXJtaW5hdG9yCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAweDgwLCA4KTsKICAgIHJldHVybjsKfQojZW5kaWYKI2RlZmluZSBTRUlfTk9UX1VTRV9UT0tFTl9BTElHTgoKc3RhdGljIHZvaWQgcG53X19IMjY0X3dyaXRlYml0c19TRUlfYnVmZmVyaW5nX3BlcmlvZF9oZWFkZXIoCiAgICBNVFhfSEVBREVSX1BBUkFNUyAqcE1UWF9IZWFkZXIsCiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKiphdWkzMkVsZW1lbnRQb2ludGVycywKICAgIElNR19VSU5UOCB1aThOYWxIcmRCcFByZXNlbnRGbGFnLAogICAgSU1HX1VJTlQ4IHVpOG5hbF9jcGJfY250X21pbnVzMSwKICAgIElNR19VSU5UOCB1aThuYWxfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGgsCiAgICBJTUdfVUlOVDMyIHVpMzJuYWxfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheSwKICAgIElNR19VSU5UMzIgdWkzMm5hbF9pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X29mZnNldCwKICAgIElNR19VSU5UOCB1aThWY2xIcmRCcFByZXNlbnRGbGFnLAogICAgSU1HX1VJTlQ4IHVpOHZjbF9jcGJfY250X21pbnVzMSwKICAgIElNR19VSU5UMzIgdWkzMnZjbF9pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5LAogICAgSU1HX1VJTlQzMiB1aTMydmNsX2luaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfb2Zmc2V0KQp7CiAgICBJTUdfVUlOVDggdWk4U2NoZWRTZWxJZHg7CiAgICBJTUdfVUlOVDggdWk4UGF5bG9hZFNpemVCaXRzOwojaWZkZWYgU0VJX05PVF9VU0VfVE9LRU5fQUxJR04KICAgIElNR19VSU5UOCB1aThQYWQ7CiNlbmRpZgogICAgLy8gRXNzZW50aWFsIHdlIGluc2VydCB0aGUgZWxlbWVudCBiZWZvcmUgd2UgdHJ5IHRvIGZpbGwgaXQhCiAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9TVEFSVENPREVfUkFXREFUQSk7CgogICAgcG53X19IMjY0X3dyaXRlYml0c19zdGFydGNvZGVfcHJlZml4X2VsZW1lbnQocE1UWF9IZWFkZXIsCiAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICA0KTsgLy8gMDAgMDAgMDEgc3RhcnQgY29kZSBwcmVmaXgKCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwgOCk7IC8vIG5hbF91bml0X3R5cGUgPSAwNiAoU0VJIE1lc3NhZ2UpCgogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDgpOyAvLyBTRUkgcGF5bG9hZCB0eXBlIChidWZmZXJpbmcgcGVyaW9kKQoKICAgIHVpOFBheWxvYWRTaXplQml0cyA9IDE7IC8vIHNlcV9wYXJhbWV0ZXJfc2V0X2lkIGJpdHNpemUgPSAxCiAgICBpZiAodWk4TmFsSHJkQnBQcmVzZW50RmxhZykKICAgICAgICB1aThQYXlsb2FkU2l6ZUJpdHMgKz0gKCh1aThuYWxfY3BiX2NudF9taW51czEgKyAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB1aThuYWxfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGggKiAyKTsKICAgIGlmICh1aThWY2xIcmRCcFByZXNlbnRGbGFnKQogICAgICAgIHVpOFBheWxvYWRTaXplQml0cyArPSAoKHVpOHZjbF9jcGJfY250X21pbnVzMSArIDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHVpOG5hbF9pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aCAqIDIpOwoKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpOFBheWxvYWRTaXplQml0cyArIDcpIC8gOCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4KTsKICAgIC8vIFNFSSBwYXlsb2FkIHNpemUgPSBObyBvZiBieXRlcyByZXF1aXJlZCBmb3IgU0VJIHBheWxvYWQKICAgIC8vIChpbmNsdWRpbmcgc2VxX3BhcmFtZXRlcl9zZXRfaWQpCgogICAgLy9zZXFfcGFyYW1ldGVyX3NldF9pZCAgICAgIHVlKHYpID0gMCBkZWZhdWx0PyA9IDEgKGJpbmFyeSkKICAgIC8vPSBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IGNvbnRhaW5pbmcgSFJEIGF0dHJpYnV0ZXMKICAgIHBud19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwKTsKCiAgICBpZiAodWk4TmFsSHJkQnBQcmVzZW50RmxhZykgewogICAgICAgIGZvciAodWk4U2NoZWRTZWxJZHggPSAwOyB1aThTY2hlZFNlbElkeCA8PSB1aThuYWxfY3BiX2NudF9taW51czE7IHVpOFNjaGVkU2VsSWR4KyspIHsKICAgICAgICAgICAgLy8gdWkzMm5hbF9pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5ID0gZGVsYXkgYmV0d2VlbiB0aW1lIG9mIGFycml2YWwgaW4gQ09ERUQgUElDVFVSRSBCVUZGRVIgb2YgY29kZWQgZGF0YSBvZiB0aGlzIGFjY2VzcwogICAgICAgICAgICAvLyB1bml0IGFuZCB0aW1lIG9mIHJlbW92YWwgZnJvbSBDT0RFRCBQSUNUVVJFIEJVRkZFUiBvZiB0aGUgY29kZWQgZGF0YSBvZiB0aGUgc2FtZSBhY2Nlc3MgdW5pdC4KICAgICAgICAgICAgLy8gRGVsYXkgaXMgYmFzZWQgb24gdGhlIHRpbWUgdGFrZW4gZm9yIGEgOTAga0h6IGNsb2NrLgogICAgICAgICAgICAvLyBSYW5nZSA+MCBhbmQgPCA5MDAwMCAqIChDUEJzaXplIC8gQml0UmF0ZSkKICAgICAgICAgICAgLy8gRm9yIHRoZSAxc3QgYnVmZmVyaW5nIHBlcmlvZCBhZnRlciBIQVJEV0FSRSBSRUZFUkVOQ0UgREVDT0RFUiBpbml0aWFsaXNhdGlvbi4KICAgICAgICAgICAgLy8gcG53X19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfTkFMX0lOSVRfQ1BCX1JFTU9WQUxfREVMQVkpOyAvLyBFdmVudHVhbGx5IHVzZSB0aGlzIGlmIGZpcm13YXJlIHZhbHVlIHJlcXVpcmVkCgogICAgICAgICAgICBwbndfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLAoJCSAgICB1aTMybmFsX2luaXRpYWxfY3BiX3JlbW92YWxfZGVsYXksCgkJICAgIHVpOG5hbF9pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aCk7CgovKgogICAgICAgICAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQSF9TRUlfTkFMX0lOSVRJQUxfQ1BCX1JFTU9WQUxfREVMQVkpOyovCgogICAgICAgICAgICAvLyB1aTMybmFsX2luaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfb2Zmc2V0ID0gdXNlZCBmb3IgdGhlIFNjaGVkU2VsSWR4LXRoIENQQiBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBjcGJfcmVtb3ZhbF9kZWxheSB0bwogICAgICAgICAgICAvLyBzcGVjaWZ5IHRoZSBpbml0aWFsIGRlbGl2ZXJ5IHRpbWUgb2YgY29kZWQgYWNjZXNzIHVuaXRzIHRvIHRoZSBDT0RFRCBQSUNUVVJFIEJVRkZFUiBpbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X29mZnNldAogICAgICAgICAgICAvLyBEZWxheSBpcyBiYXNlZCBvbiB0aGUgdGltZSB0YWtlbiBmb3IgYSA5MCBrSHogY2xvY2suCiAgICAgICAgICAgIC8vIE5PVCBVU0VEIEJZIERFQ09ERVJTIGFuZCBpcyBuZWVkZWQgb25seSBmb3IgdGhlIGRlbGl2ZXJ5IHNjaGVkdWxlciAoSFNTKSBzcGVjaWZpZWQgaW4gQW5uZXggQwoKICAgICAgICAgICAgcG53X193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywKCQkgICAgdWkzMm5hbF9pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X29mZnNldCwKCQkgICAgdWk4bmFsX2luaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoKTsKCiAgICAgICAgICAgIC8qcG53X19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUEhfU0VJX05BTF9JTklUSUFMX0NQQl9SRU1PVkFMX0RFTEFZX09GRlNFVCk7Ki8KCiAgICAgICAgfQogICAgfQogICAgaWYgKHVpOFZjbEhyZEJwUHJlc2VudEZsYWcpIHsKICAgICAgICBmb3IgKHVpOFNjaGVkU2VsSWR4ID0gMDsgdWk4U2NoZWRTZWxJZHggPD0gdWk4dmNsX2NwYl9jbnRfbWludXMxOyB1aThTY2hlZFNlbElkeCsrKSB7CiAgICAgICAgICAgIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9TVEFSVENPREVfUkFXREFUQSk7CiAgICAgICAgICAgIC8vIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX1ZDTF9JTklUX0NQQl9SRU1PVkFMX0RFTEFZKTsgLy8gRXZlbnR1YWxseSB1c2UgdGhpcyBpZiBmaXJtd2FyZSB2YWx1ZSByZXF1aXJlZAogICAgICAgICAgICBwbndfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpMzJ2Y2xfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOG5hbF9pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aCk7CiAgICAgICAgICAgIC8vIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX1ZDTF9JTklUX0NQQl9SRU1PVkFMX0RFTEFZX0NQQik7IC8vIEV2ZW50dWFsbHkgdXNlIHRoaXMgaWYgZmlybXdhcmUgdmFsdWUgcmVxdWlyZWQKICAgICAgICAgICAgcG53X193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aTMydmNsX2luaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWk4bmFsX2luaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gUGFkIHRvIGVuZCBvZiBieXRlCiNpZmRlZiBTRUlfTk9UX1VTRV9UT0tFTl9BTElHTgogICAgaWYgKCF1aThWY2xIcmRCcFByZXNlbnRGbGFnKQogICAgICAgIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwogICAgdWk4UGFkID0gKHVpOFBheWxvYWRTaXplQml0cyArIDcpIC8gODsKICAgIHVpOFBhZCA9ICh1aThQYWQgKiA4KSAtIHVpOFBheWxvYWRTaXplQml0czsKICAgIGlmICh1aThQYWQgPiAwKQogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPDwgKHVpOFBhZCAtIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOFBhZCk7IC8vIFNFSSBwYXlsb2FkIHR5cGUgKGJ1ZmZlcmluZyBwZXJpb2QpCiNlbHNlCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMSk7IC8vIHJic3BfdHJhaWxpbmdfYml0cwoKICAgIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTEVNRU5UX0lOU0VSVEJZVEVBTElHTl9IMjY0KTsKICAgIC8vIFRlbGwgTVRYIHRvIGluc2VydCB0aGUgYnl0ZSBhbGlnbiBmaWVsZAogICAgcG53X19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwojZW5kaWYKCiAgICAvLyBXcml0ZSB0ZXJtaW5hdG9yCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDB4ODAsIDgpOwoKICAgIHJldHVybjsKfQoKI2RlZmluZSBTRUlfSE9TVENBTENfQ1BCX0RQQgoKc3RhdGljIHZvaWQgcG53X19IMjY0X3dyaXRlYml0c19TRUlfcGljdHVyZV90aW1pbmdfaGVhZGVyKAogICAgTVRYX0hFQURFUl9QQVJBTVMgKnBNVFhfSGVhZGVyLCBNVFhfSEVBREVSX0VMRU1FTlQgKiphdWkzMkVsZW1lbnRQb2ludGVycywKICAgIElNR19VSU5UOCB1aThDcGJEcGJEZWxheXNQcmVzZW50RmxhZywKICAgIElNR19VSU5UMzIgdWkzMmNwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aF9taW51czEsCiAgICBJTUdfVUlOVDMyIHVpMzJkcGJfb3V0cHV0X2RlbGF5X2xlbmd0aF9taW51czEsCiAgICBJTUdfVUlOVDMyIHVpMzJjcGJfcmVtb3ZhbF9kZWxheSwKICAgIElNR19VSU5UMzIgdWkzMmRwYl9vdXRwdXRfZGVsYXksCiAgICBJTUdfVUlOVDggdWk4cGljX3N0cnVjdF9wcmVzZW50X2ZsYWcsCiAgICBJTUdfVUlOVDggX19tYXliZV91bnVzZWQgdWk4cGljX3N0cnVjdCwKICAgIElNR19VSU5UOCBfX21heWJlX3VudXNlZCB1aThOdW1DbG9ja1RTLAogICAgSU1HX1VJTlQ4IF9fbWF5YmVfdW51c2VkICogYXVpOGNsb2NrX3RpbWVzdGFtcF9mbGFnLAogICAgSU1HX1VJTlQ4IF9fbWF5YmVfdW51c2VkIHVpOGZ1bGxfdGltZXN0YW1wX2ZsYWcsCiAgICBJTUdfVUlOVDggX19tYXliZV91bnVzZWQgdWk4c2Vjb25kc19mbGFnLAogICAgSU1HX1VJTlQ4IF9fbWF5YmVfdW51c2VkIHVpOG1pbnV0ZXNfZmxhZywKICAgIElNR19VSU5UOCBfX21heWJlX3VudXNlZCB1aThob3Vyc19mbGFnLAogICAgSU1HX1VJTlQ4IF9fbWF5YmVfdW51c2VkIHVpOHNlY29uZHNfdmFsdWUsCiAgICBJTUdfVUlOVDggX19tYXliZV91bnVzZWQgdWk4bWludXRlc192YWx1ZSwKICAgIElNR19VSU5UOCBfX21heWJlX3VudXNlZCB1aThob3Vyc192YWx1ZSwKICAgIElNR19VSU5UOCBfX21heWJlX3VudXNlZCB1aThjdF90eXBlLAogICAgSU1HX1VJTlQ4IF9fbWF5YmVfdW51c2VkIHVpOG51aXRfZmllbGRfYmFzZWRfZmxhZywKICAgIElNR19VSU5UOCBfX21heWJlX3VudXNlZCB1aThjb3VudGluZ190eXBlLAogICAgSU1HX1VJTlQ4IF9fbWF5YmVfdW51c2VkIHVpOGRpc2NvbnRpbnVpdHlfZmxhZywKICAgIElNR19VSU5UOCBfX21heWJlX3VudXNlZCB1aThjbnRfZHJvcHBlZF9mbGFnLAogICAgSU1HX1VJTlQ4IF9fbWF5YmVfdW51c2VkIHVpOG5fZnJhbWVzLAogICAgSU1HX1VJTlQ4IF9fbWF5YmVfdW51c2VkIHVpOHRpbWVfb2Zmc2V0X2xlbmd0aCwKICAgIElNR19VSU5UMzIgX19tYXliZV91bnVzZWQgaTMydGltZV9vZmZzZXQpCnsKICAgIElNR19VSU5UOCB1aThQYXlsb2FkU2l6ZUJpdHMsIHVpOFRtcDsKI2lmZGVmIFNFSV9OT1RfVVNFX1RPS0VOX0FMSUdOCiAgICBJTUdfVUlOVDggdWk4UGFkOwojZW5kaWYKCiAgICAvLyBFc3NlbnRpYWwgd2UgaW5zZXJ0IHRoZSBlbGVtZW50IGJlZm9yZSB3ZSB0cnkgdG8gZmlsbCBpdCEKICAgIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTEVNRU5UX1NUQVJUQ09ERV9SQVdEQVRBKTsKCiAgICBwbndfX0gyNjRfd3JpdGViaXRzX3N0YXJ0Y29kZV9wcmVmaXhfZWxlbWVudChwTVRYX0hlYWRlciwKICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgIDQpOyAvLyAwMCAwMCAwMSBzdGFydCBjb2RlIHByZWZpeAoKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LCA4KTsgLy8gbmFsX3VuaXRfdHlwZSA9IDA2IChTRUkgTWVzc2FnZSkKCiAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgOCk7IC8vIFNFSSBwYXlsb2FkIHR5cGUgKHBpY3R1cmUgdGltaW5nKQoKCiAgICAvLyBQcmVjYWxjdWxhdGUgdGhlIHBheWxvYWQgYml0IHNpemUKICAgIHVpOFBheWxvYWRTaXplQml0cyA9IDA7CiAgICBpZiAodWk4Q3BiRHBiRGVsYXlzUHJlc2VudEZsYWcpCiAgICAgICAgdWk4UGF5bG9hZFNpemVCaXRzICs9IHVpMzJjcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMSArIHVpMzJkcGJfb3V0cHV0X2RlbGF5X2xlbmd0aF9taW51czEgKyAxOwoKI2lmIDAKICAgIGlmICh1aThwaWNfc3RydWN0X3ByZXNlbnRfZmxhZykgewogICAgICAgIHVpOFBheWxvYWRTaXplQml0cyArPSA0OwogICAgICAgIGZvciAodWk4VG1wID0gMDsgdWk4VG1wIDwgdWk4TnVtQ2xvY2tUUyA7IHVpOFRtcCsrKSB7CiAgICAgICAgICAgIHVpOFBheWxvYWRTaXplQml0cyArPSAxOwoKICAgICAgICAgICAgaWYgKGF1aThjbG9ja190aW1lc3RhbXBfZmxhZ1t1aThUbXBdKSB7CiAgICAgICAgICAgICAgICB1aThQYXlsb2FkU2l6ZUJpdHMgKz0gMiArIDEgKyA1ICsgMSArIDEgKyAxICsgODsKICAgICAgICAgICAgICAgIGlmICh1aThmdWxsX3RpbWVzdGFtcF9mbGFnKQogICAgICAgICAgICAgICAgICAgIHVpOFBheWxvYWRTaXplQml0cyArPSA2ICsgNiArIDU7CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB1aThQYXlsb2FkU2l6ZUJpdHMgKz0gMTsKICAgICAgICAgICAgICAgICAgICBpZiAodWk4c2Vjb25kc19mbGFnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVpOFBheWxvYWRTaXplQml0cyArPSA2ICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVpOG1pbnV0ZXNfZmxhZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdWk4UGF5bG9hZFNpemVCaXRzICs9IDYgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVpOGhvdXJzX2ZsYWcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWk4UGF5bG9hZFNpemVCaXRzICs9IDU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHVpOHRpbWVfb2Zmc2V0X2xlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgdWk4UGF5bG9hZFNpemVCaXRzICs9IHVpOHRpbWVfb2Zmc2V0X2xlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KI2VuZGlmCgogICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWk4UGF5bG9hZFNpemVCaXRzICsgNykgLyA4KSwgOCk7CiAgICAvLyBTRUkgcGF5bG9hZCBzaXplID0gTm8gb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIFNFSSBwYXlsb2FkIChpbmNsdWRpbmcgc2VxX3BhcmFtZXRlcl9zZXRfaWQpCgoKICAgIGlmICh1aThDcGJEcGJEZWxheXNQcmVzZW50RmxhZykgewogICAgICAgIC8vU0VJX0lOU0VSVElPTgojaWZkZWYgU0VJX0hPU1RDQUxDX0NQQl9EUEIKICAgICAgICBwbndfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aTMyY3BiX3JlbW92YWxfZGVsYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpMzJjcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxICsgMSk7IC8vIGNwYl9yZW1vdmFsX2RlbGF5CiAgICAgICAgcG53X193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWkzMmRwYl9vdXRwdXRfZGVsYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpMzJkcGJfb3V0cHV0X2RlbGF5X2xlbmd0aF9taW51czEgKyAxKTsgLy8gZHBiX291dHB1dF9kZWxheQojZWxzZQogICAgICAgIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUSF9TRUlfTkFMX0NQQl9SRU1PVkFMX0RFTEFZKTsKICAgICAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVEhfU0VJX05BTF9EUEJfT1VUUFVUX0RFTEFZKTsKI2VuZGlmCiAgICB9CgojaWYgMAogICAgaWYgKHVpOHBpY19zdHJ1Y3RfcHJlc2VudF9mbGFnKSB7CiAgICAgICAgcG53X19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9TVEFSVENPREVfUkFXREFUQSk7CiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWk4cGljX3N0cnVjdCwgNCk7IC8vIFNlZSBUUk0gYWJsZSBEIDEgliBJbnRlcnByZXRhdGlvbiBvZiBwaWNfc3RydWN0CgogICAgICAgIGZvciAodWk4VG1wID0gMDsgdWk4VG1wIDwgdWk4TnVtQ2xvY2tUUyA7IHVpOFRtcCsrKSB7CiAgICAgICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpOGNsb2NrX3RpbWVzdGFtcF9mbGFnW3VpOFRtcF0sIDEpOwoKICAgICAgICAgICAgaWYgKGF1aThjbG9ja190aW1lc3RhbXBfZmxhZ1t1aThUbXBdKSB7CiAgICAgICAgICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWk4Y3RfdHlwZSwgMik7CiAgICAgICAgICAgICAgICAvLyAoMj1Vbmtub3duKSBTZWUgVFJNIFRhYmxlIEQgMiCWIE1hcHBpbmcgb2YgY3RfdHlwZSB0byBzb3VyY2UgcGljdHVyZSBzY2FuCiAgICAgICAgICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWk4bnVpdF9maWVsZF9iYXNlZF9mbGFnLCAxKTsKICAgICAgICAgICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aThjb3VudGluZ190eXBlLCA1KTsKICAgICAgICAgICAgICAgIC8vIFNlZSBUUk0gVGFibGUgRCAzIJYgRGVmaW5pdGlvbiBvZiBjb3VudGluZ190eXBlIHZhbHVlcwogICAgICAgICAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOGZ1bGxfdGltZXN0YW1wX2ZsYWcsIDEpOwogICAgICAgICAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOGRpc2NvbnRpbnVpdHlfZmxhZywgMSk7CiAgICAgICAgICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWk4Y250X2Ryb3BwZWRfZmxhZywgMSk7CiAgICAgICAgICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWk4bl9mcmFtZXMsIDgpOwoKICAgICAgICAgICAgICAgIGlmICh1aThmdWxsX3RpbWVzdGFtcF9mbGFnKSB7CiAgICAgICAgICAgICAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWk4c2Vjb25kc192YWx1ZSwgNik7IC8vIDAgLSA1OQogICAgICAgICAgICAgICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOG1pbnV0ZXNfdmFsdWUsIDYpOyAvLyAwIC0gNTkKICAgICAgICAgICAgICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aThob3Vyc192YWx1ZSwgNSk7IC8vIDAgLSAyMwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aThzZWNvbmRzX2ZsYWcsIDEpOwoKICAgICAgICAgICAgICAgICAgICBpZiAodWk4c2Vjb25kc19mbGFnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWk4c2Vjb25kc192YWx1ZSwgNik7IC8vIDAgLSA1OQogICAgICAgICAgICAgICAgICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOG1pbnV0ZXNfZmxhZywgMSk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodWk4bWludXRlc19mbGFnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbndfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWk4bWludXRlc192YWx1ZSwgNik7IC8vIDAgLSA1OQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOGhvdXJzX2ZsYWcsIDEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1aThob3Vyc19mbGFnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOGhvdXJzX3ZhbHVlLCA1KTsgLy8gMCAtIDIzCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHVpOHRpbWVfb2Zmc2V0X2xlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAvLyBUd28ncyBjb21wbGVtZW50IHN0b3JhZ2UgOiBJZiB0aW1lX29mZnNldDwwID0gKCgyIF4gdikgKyB0aW1lX29mZnNldCkKICAgICAgICAgICAgICAgICAgICBpZiAoKGludClpMzJ0aW1lX29mZnNldCA8IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHBud19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElNR19VSU5UMzIpKCgyIF4gdWk4dGltZV9vZmZzZXRfbGVuZ3RoKSArIGkzMnRpbWVfb2Zmc2V0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOHRpbWVfb2Zmc2V0X2xlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBwbndfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTUdfVUlOVDMyKSBpMzJ0aW1lX29mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOHRpbWVfb2Zmc2V0X2xlbmd0aCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiNlbmRpZgoKI2lmZGVmIFNFSV9OT1RfVVNFX1RPS0VOX0FMSUdOCiAgICAvLyBQYWQgdG8gZW5kIG9mIGJ5dGUKICAgIGlmICghdWk4cGljX3N0cnVjdF9wcmVzZW50X2ZsYWcpCiAgICAgICAgcG53X19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9TVEFSVENPREVfUkFXREFUQSk7CiAgICB1aThQYWQgPSAodWk4UGF5bG9hZFNpemVCaXRzICsgNykgLyA4OwogICAgdWk4UGFkID0gKHVpOFBhZCAqIDgpIC0gdWk4UGF5bG9hZFNpemVCaXRzOwogICAgaWYgKHVpOFBhZCA+IDApCiAgICAgICAgcG53X193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA8PCAodWk4UGFkIC0gMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWk4UGFkKTsgLy8gU0VJIHBheWxvYWQgdHlwZSAoYnVmZmVyaW5nIHBlcmlvZCkKI2Vsc2UKICAgIHBud19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTEVNRU5UX0lOU0VSVEJZVEVBTElHTl9IMjY0KTsgLy8gVGVsbCBNVFggdG8gaW5zZXJ0IHRoZSBieXRlIGFsaWduIGZpZWxkCiAgICBwbndfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9TVEFSVENPREVfUkFXREFUQSk7CiNlbmRpZgoKICAgIC8vIFdyaXRlIHRlcm1pbmF0b3IKICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwLCA4KTsKICAgIHJldHVybjsKfQoKc3RhdGljIHZvaWQgcG53X19IMjY0X3dyaXRlYml0c19TRUlfRlBBX2hlYWRlcigKICAgICAgICBNVFhfSEVBREVSX1BBUkFNUyAqcE1UWF9IZWFkZXIsIE1UWF9IRUFERVJfRUxFTUVOVCAqKmF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgIGNoYXIqIHNlaV9kYXRhX2J1ZiwgSU1HX1VJTlQzMiBkYXRhX3NpemUpCnsKICAgIElNR19VSU5UOCBpOwoKICAgIC8vIEVzc2VudGlhbCB3ZSBpbnNlcnQgdGhlIGVsZW1lbnQgYmVmb3JlIHdlIHRyeSB0byBmaWxsIGl0IQogICAgcG53X19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwKICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwoKICAgIHBud19fSDI2NF93cml0ZWJpdHNfc3RhcnRjb2RlX3ByZWZpeF9lbGVtZW50KHBNVFhfSGVhZGVyLAogICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgNCk7IC8vIDAwIDAwIDAxIHN0YXJ0IGNvZGUgcHJlZml4CgogICAgZm9yIChpID0gMDsgaSA8IGRhdGFfc2l6ZTsgaSsrKQogICAgICAgIHBud19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICBzZWlfZGF0YV9idWZbaV0sIDgpOyAvL3NlaV9kYXRhX2J1ZiAoU0VJIE1lc3NhZ2UpCiAgICAvLyBUZWxsIE1UWCB0byBpbnNlcnQgdGhlIGJ5dGUgYWxpZ24gZmllbGQgKHdlIGRvbid0IGtub3cgZmluYWwgc3RyZWFtIHNpemUgZm9yIGFsaWdubWVudCBhdCB0aGlzIHBvaW50KQogICAgLy9wbndfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9JTlNFUlRCWVRFQUxJR05fSDI2NCk7CgogICAgcmV0dXJuOwp9CgoKI2lmIFBTQl9NRkxEX0RVTU1ZX0NPREUKdm9pZCBwbndfX0gyNjRfcHJlcGFyZV9BVURfaGVhZGVyKE1UWF9IRUFERVJfUEFSQU1TICogcE1UWF9IZWFkZXIpCnsKICAgIC8vIEVzc2VudGlhbCB3ZSBpbml0aWFsaXNlIG91ciBoZWFkZXIgc3RydWN0dXJlcyBiZWZvcmUgYnVpbGRpbmcKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqVGhpc19FbGVtZW50OwogICAgTVRYX0hFQURFUl9FTEVNRU5UICphdWkzMkVsZW1lbnRQb2ludGVyc1tNQVhOVU1CRVJFTEVNRU5UU107CiAgICBwTVRYX0hlYWRlci0+RWxlbWVudHMgPSBFTEVNRU5UU19FTVBUWTsKICAgIFRoaXNfRWxlbWVudCA9IChNVFhfSEVBREVSX0VMRU1FTlQgKikgcE1UWF9IZWFkZXItPmFzRWxlbWVudFN0cmVhbTsKICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzWzBdID0gVGhpc19FbGVtZW50OwoKICAgIHBud19fSDI2NF93cml0ZWJpdHNfQVVEX2hlYWRlcihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMpOwoKICAgIHBNVFhfSGVhZGVyLT5FbGVtZW50cysrOyAvL0hhcyBiZWVuIHVzZWQgYXMgYW4gaW5kZXgsIHNvIG5lZWQgdG8gYWRkIDEgZm9yIGEgdmFsaWQgZWxlbWVudCBjb3VudAp9CiNlbmRpZgoKdm9pZCBwbndfX0gyNjRfcHJlcGFyZV9TRUlfYnVmZmVyaW5nX3BlcmlvZF9oZWFkZXIoCiAgICBNVFhfSEVBREVSX1BBUkFNUyAqIHBNVFhfSGVhZGVyLAogICAgSU1HX1VJTlQ4IHVpOE5hbEhyZEJwUHJlc2VudEZsYWcsCiAgICBJTUdfVUlOVDggdWk4bmFsX2NwYl9jbnRfbWludXMxLAogICAgSU1HX1VJTlQ4IHVpOG5hbF9pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aCwKICAgIElNR19VSU5UMzIgdWkzMm5hbF9pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5LAogICAgSU1HX1VJTlQzMiB1aTMybmFsX2luaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfb2Zmc2V0LAogICAgSU1HX1VJTlQ4IHVpOFZjbEhyZEJwUHJlc2VudEZsYWcsCiAgICBJTUdfVUlOVDggdWk4dmNsX2NwYl9jbnRfbWludXMxLAogICAgSU1HX1VJTlQzMiB1aTMydmNsX2luaXRpYWxfY3BiX3JlbW92YWxfZGVsYXksCiAgICBJTUdfVUlOVDMyIHVpMzJ2Y2xfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9vZmZzZXQpCnsKICAgIC8vIEVzc2VudGlhbCB3ZSBpbml0aWFsaXNlIG91ciBoZWFkZXIgc3RydWN0dXJlcyBiZWZvcmUgYnVpbGRpbmcKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqVGhpc19FbGVtZW50OwogICAgTVRYX0hFQURFUl9FTEVNRU5UICphdWkzMkVsZW1lbnRQb2ludGVyc1tNQVhOVU1CRVJFTEVNRU5UU107CiAgICBwTVRYX0hlYWRlci0+RWxlbWVudHMgPSBFTEVNRU5UU19FTVBUWTsKICAgIFRoaXNfRWxlbWVudCA9IChNVFhfSEVBREVSX0VMRU1FTlQgKikgcE1UWF9IZWFkZXItPmFzRWxlbWVudFN0cmVhbTsKICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzWzBdID0gVGhpc19FbGVtZW50OwoKICAgIHBud19fSDI2NF93cml0ZWJpdHNfU0VJX2J1ZmZlcmluZ19wZXJpb2RfaGVhZGVyKAogICAgICAgIHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICB1aThOYWxIcmRCcFByZXNlbnRGbGFnLAogICAgICAgIHVpOG5hbF9jcGJfY250X21pbnVzMSwKICAgICAgICB1aThuYWxfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGgsCiAgICAgICAgdWkzMm5hbF9pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5LAogICAgICAgIHVpMzJuYWxfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9vZmZzZXQsCiAgICAgICAgdWk4VmNsSHJkQnBQcmVzZW50RmxhZywKICAgICAgICB1aTh2Y2xfY3BiX2NudF9taW51czEsCiAgICAgICAgdWkzMnZjbF9pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5LAogICAgICAgIHVpMzJ2Y2xfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9vZmZzZXQpOwoKICAgIHBNVFhfSGVhZGVyLT5FbGVtZW50cysrOwogICAgLy9IYXMgYmVlbiB1c2VkIGFzIGFuIGluZGV4LCBzbyBuZWVkIHRvIGFkZCAxIGZvciBhIHZhbGlkIGVsZW1lbnQgY291bnQKICAgIHJldHVybjsKfQoKdm9pZCBwbndfX0gyNjRfcHJlcGFyZV9TRUlfcGljdHVyZV90aW1pbmdfaGVhZGVyKAogICAgTVRYX0hFQURFUl9QQVJBTVMgKiBwTVRYX0hlYWRlciwKICAgIElNR19VSU5UOCB1aThDcGJEcGJEZWxheXNQcmVzZW50RmxhZywKICAgIElNR19VSU5UMzIgdWkzMmNwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aF9taW51czEsCiAgICBJTUdfVUlOVDMyIHVpMzJkcGJfb3V0cHV0X2RlbGF5X2xlbmd0aF9taW51czEsCiAgICBJTUdfVUlOVDMyIHVpMzJjcGJfcmVtb3ZhbF9kZWxheSwKICAgIElNR19VSU5UMzIgdWkzMmRwYl9vdXRwdXRfZGVsYXksCiAgICBJTUdfVUlOVDggdWk4cGljX3N0cnVjdF9wcmVzZW50X2ZsYWcsCiAgICBJTUdfVUlOVDggdWk4cGljX3N0cnVjdCwKICAgIElNR19VSU5UOCB1aThOdW1DbG9ja1RTLAogICAgSU1HX1VJTlQ4ICphdWk4Y2xvY2tfdGltZXN0YW1wX2ZsYWcsCiAgICBJTUdfVUlOVDggdWk4ZnVsbF90aW1lc3RhbXBfZmxhZywKICAgIElNR19VSU5UOCB1aThzZWNvbmRzX2ZsYWcsCiAgICBJTUdfVUlOVDggdWk4bWludXRlc19mbGFnLAogICAgSU1HX1VJTlQ4IHVpOGhvdXJzX2ZsYWcsCiAgICBJTUdfVUlOVDggdWk4c2Vjb25kc192YWx1ZSwKICAgIElNR19VSU5UOCB1aThtaW51dGVzX3ZhbHVlLAogICAgSU1HX1VJTlQ4IHVpOGhvdXJzX3ZhbHVlLAogICAgSU1HX1VJTlQ4IHVpOGN0X3R5cGUsCiAgICBJTUdfVUlOVDggdWk4bnVpdF9maWVsZF9iYXNlZF9mbGFnLAogICAgSU1HX1VJTlQ4IHVpOGNvdW50aW5nX3R5cGUsCiAgICBJTUdfVUlOVDggdWk4ZGlzY29udGludWl0eV9mbGFnLAogICAgSU1HX1VJTlQ4IHVpOGNudF9kcm9wcGVkX2ZsYWcsCiAgICBJTUdfVUlOVDggdWk4bl9mcmFtZXMsCiAgICBJTUdfVUlOVDggdWk4dGltZV9vZmZzZXRfbGVuZ3RoLAogICAgSU1HX0lOVDMyIGkzMnRpbWVfb2Zmc2V0KQp7CiAgICAvLyBFc3NlbnRpYWwgd2UgaW5pdGlhbGlzZSBvdXIgaGVhZGVyIHN0cnVjdHVyZXMgYmVmb3JlIGJ1aWxkaW5nCiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKlRoaXNfRWxlbWVudDsKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqYXVpMzJFbGVtZW50UG9pbnRlcnNbTUFYTlVNQkVSRUxFTUVOVFNdOwogICAgcE1UWF9IZWFkZXItPkVsZW1lbnRzID0gRUxFTUVOVFNfRU1QVFk7CiAgICBUaGlzX0VsZW1lbnQgPSAoTVRYX0hFQURFUl9FTEVNRU5UICopIHBNVFhfSGVhZGVyLT5hc0VsZW1lbnRTdHJlYW07CiAgICBhdWkzMkVsZW1lbnRQb2ludGVyc1swXSA9IFRoaXNfRWxlbWVudDsKCiAgICBwbndfX0gyNjRfd3JpdGViaXRzX1NFSV9waWN0dXJlX3RpbWluZ19oZWFkZXIoCiAgICAgICAgcE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgIHVpOENwYkRwYkRlbGF5c1ByZXNlbnRGbGFnLAogICAgICAgIHVpMzJjcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxLAogICAgICAgIHVpMzJkcGJfb3V0cHV0X2RlbGF5X2xlbmd0aF9taW51czEsCiAgICAgICAgdWkzMmNwYl9yZW1vdmFsX2RlbGF5LAogICAgICAgIHVpMzJkcGJfb3V0cHV0X2RlbGF5LAogICAgICAgIHVpOHBpY19zdHJ1Y3RfcHJlc2VudF9mbGFnLAogICAgICAgIHVpOHBpY19zdHJ1Y3QsCiAgICAgICAgdWk4TnVtQ2xvY2tUUywKICAgICAgICBhdWk4Y2xvY2tfdGltZXN0YW1wX2ZsYWcsCiAgICAgICAgdWk4ZnVsbF90aW1lc3RhbXBfZmxhZywKICAgICAgICB1aThzZWNvbmRzX2ZsYWcsCiAgICAgICAgdWk4bWludXRlc19mbGFnLAogICAgICAgIHVpOGhvdXJzX2ZsYWcsCiAgICAgICAgdWk4c2Vjb25kc192YWx1ZSwKICAgICAgICB1aThtaW51dGVzX3ZhbHVlLAogICAgICAgIHVpOGhvdXJzX3ZhbHVlLAogICAgICAgIHVpOGN0X3R5cGUsCiAgICAgICAgdWk4bnVpdF9maWVsZF9iYXNlZF9mbGFnLAogICAgICAgIHVpOGNvdW50aW5nX3R5cGUsCiAgICAgICAgdWk4ZGlzY29udGludWl0eV9mbGFnLAogICAgICAgIHVpOGNudF9kcm9wcGVkX2ZsYWcsCiAgICAgICAgdWk4bl9mcmFtZXMsCiAgICAgICAgdWk4dGltZV9vZmZzZXRfbGVuZ3RoLAogICAgICAgIGkzMnRpbWVfb2Zmc2V0KTsKCiAgICBwTVRYX0hlYWRlci0+RWxlbWVudHMrKzsKICAgIC8vSGFzIGJlZW4gdXNlZCBhcyBhbiBpbmRleCwgc28gbmVlZCB0byBhZGQgMSBmb3IgYSB2YWxpZCBlbGVtZW50IGNvdW50CiAgICByZXR1cm47Cn0KCiNpZiBQU0JfTUZMRF9EVU1NWV9DT0RFCnZvaWQgcG53X19IMjY0X3ByZXBhcmVfU0VJX0ZQQV9oZWFkZXIoCiAgICAgICAgTVRYX0hFQURFUl9QQVJBTVMgKiBwTVRYX0hlYWRlciwKICAgICAgICBjaGFyKiBzZWlfZGF0YV9idWYsCiAgICAgICAgSU1HX1VJTlQzMiBkYXRhX3NpemUpCnsKICAgIC8vIEVzc2VudGlhbCB3ZSBpbml0aWFsaXNlIG91ciBoZWFkZXIgc3RydWN0dXJlcyBiZWZvcmUgYnVpbGRpbmcKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqVGhpc19FbGVtZW50OwogICAgTVRYX0hFQURFUl9FTEVNRU5UICphdWkzMkVsZW1lbnRQb2ludGVyc1tNQVhOVU1CRVJFTEVNRU5UU107CiAgICBwTVRYX0hlYWRlci0+RWxlbWVudHMgPSBFTEVNRU5UU19FTVBUWTsKICAgIFRoaXNfRWxlbWVudCA9IChNVFhfSEVBREVSX0VMRU1FTlQgKikgcE1UWF9IZWFkZXItPmFzRWxlbWVudFN0cmVhbTsKICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzWzBdID0gVGhpc19FbGVtZW50OwoKICAgIHBud19fSDI2NF93cml0ZWJpdHNfU0VJX0ZQQV9oZWFkZXIoCiAgICAgICAgICAgIHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgc2VpX2RhdGFfYnVmLCBkYXRhX3NpemUpOwoKICAgIHBNVFhfSGVhZGVyLT5FbGVtZW50cysrOwogICAgLy9IYXMgYmVlbiB1c2VkIGFzIGFuIGluZGV4LCBzbyBuZWVkIHRvIGFkZCAxIGZvciBhIHZhbGlkIGVsZW1lbnQgY291bnQKICAgIHJldHVybjsKfQojZW5kaWYKCgp2b2lkIHBud19fSDI2NF9wcmVwYXJlX3NlcXVlbmNlX2hlYWRlcigKICAgICAgICB1bnNpZ25lZCBjaGFyICpwSGVhZGVyTWVtb3J5LAogICAgICAgIElNR19VSU5UMzIgdWlQaWNXaWR0aEluTWJzLAogICAgICAgIElNR19VSU5UMzIgdWlQaWNIZWlnaHRJbk1icywKICAgICAgICBJTUdfQk9PTCBWVUlfcHJlc2VudCwgSDI2NF9WVUlfUEFSQU1TICpWVUlfcGFyYW1zLAogICAgICAgIEgyNjRfQ1JPUF9QQVJBTVMgKnBzQ3JvcFBhcmFtcywKICAgICAgICBJTUdfVUlOVDggdWlMZXZlbCwKICAgICAgICBJTUdfVUlOVDggdWlQcm9maWxlKQp7CiAgICBIMjY0X1NFUVVFTkNFX0hFQURFUl9QQVJBTVMgU0hQYXJhbXM7CiAgICBNVFhfSEVBREVSX1BBUkFNUyAgICptdHhfaGRyOwoKICAgIC8qIFJvdXRlIG91dHB1dCBlbGVtZW50cyB0byBtZW1vcnkgcHJvdmlkZWQgKi8KICAgIG1lbXNldCgmU0hQYXJhbXMsIDAsIHNpemVvZihTSFBhcmFtcykpOwogICAgbXR4X2hkciA9IChNVFhfSEVBREVSX1BBUkFNUyAqKSBwSGVhZGVyTWVtb3J5OwoKICAgIC8qIFNldHVwIFNlcXVlbmNlIEhlYWRlciBpbmZvcm1hdGlvbiAgKi8KCgogICAgc3dpdGNoICh1aVByb2ZpbGUpIHsKICAgIGNhc2UgNToKICAgICAgICBTSFBhcmFtcy51Y1Byb2ZpbGUgID0gU0hfUFJPRklMRV9CUDsKICAgICAgICBicmVhazsKICAgIGNhc2UgNjoKICAgICAgICBTSFBhcmFtcy51Y1Byb2ZpbGUgID0gU0hfUFJPRklMRV9NUDsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgU0hQYXJhbXMudWNQcm9maWxlICA9IFNIX1BST0ZJTEVfTVA7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgc3dpdGNoICh1aUxldmVsKSB7CiAgICBjYXNlIDEwOgogICAgICAgIFNIUGFyYW1zLnVjTGV2ZWwgPSAgU0hfTEVWRUxfMTsKICAgICAgICBicmVhazsKICAgIGNhc2UgMTExOgogICAgICAgIFNIUGFyYW1zLnVjTGV2ZWwgPSAgU0hfTEVWRUxfMUI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDExOgogICAgICAgIFNIUGFyYW1zLnVjTGV2ZWwgPSAgU0hfTEVWRUxfMTE7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDEyOgogICAgICAgIFNIUGFyYW1zLnVjTGV2ZWwgPSAgU0hfTEVWRUxfMTI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDIwOgogICAgICAgIFNIUGFyYW1zLnVjTGV2ZWwgPSAgU0hfTEVWRUxfMjsKICAgICAgICBicmVhazsKICAgIGNhc2UgMzA6CiAgICAgICAgU0hQYXJhbXMudWNMZXZlbCA9ICBTSF9MRVZFTF8zOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAzMToKICAgICAgICBTSFBhcmFtcy51Y0xldmVsID0gIFNIX0xFVkVMXzMxOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAzMjoKICAgICAgICBTSFBhcmFtcy51Y0xldmVsID0gIFNIX0xFVkVMXzMyOwogICAgICAgIGJyZWFrOwogICAgY2FzZSA0MDoKICAgICAgICBTSFBhcmFtcy51Y0xldmVsID0gIFNIX0xFVkVMXzQ7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDQxOgogICAgICAgIFNIUGFyYW1zLnVjTGV2ZWwgPSAgU0hfTEVWRUxfNDE7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDQyOgogICAgICAgIFNIUGFyYW1zLnVjTGV2ZWwgPSAgU0hfTEVWRUxfNDI7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIFNIUGFyYW1zLnVjTGV2ZWwgPSAgU0hfTEVWRUxfMzsKICAgICAgICBicmVhazsKICAgIH0KCiAgICBTSFBhcmFtcy51Y1dpZHRoX2luX21ic19taW51czEgPSAoSU1HX1VJTlQ4KSh1aVBpY1dpZHRoSW5NYnMgLSAxKTsKICAgIFNIUGFyYW1zLnVjSGVpZ2h0X2luX21hcHNfdW5pdHNfbWludXMxID0gKElNR19VSU5UOCkodWlQaWNIZWlnaHRJbk1icyAtIDEpOwogICAgU0hQYXJhbXMuVlVJX1BhcmFtc19QcmVzZW50ID0gVlVJX3ByZXNlbnQ7CiAgICBpZiAoVlVJX3ByZXNlbnQpCiAgICAgICAgU0hQYXJhbXMuVlVJX1BhcmFtcyA9ICpWVUlfcGFyYW1zOwogICAgU0hQYXJhbXMuZ2Fwc19pbl9mcmFtZV9udW1fdmFsdWUgPSBJTUdfRkFMU0U7CiAgICBTSFBhcmFtcy51Y0ZyYW1lX21ic19vbmx5X2ZsYWcgPSBJTUdfVFJVRTsKCiAgICAvKiBBbGwgcGljdHVyZSBoZWFkZXIgaW5mb3JtYXRpb24gaXMgc3RhdGljCiAgICAgKiAoYXBhcnQgZnJvbSAncGljX2luaXRfcXBfbWludXMyNicgYW5kICdyc2JwX2J5dGVfYWxpZ24nIGZpZWxkcywgd2hpY2ggYXJlIHNldCBpbiBNVFggYW55d2F5KQogICAgICovCgogICAgLyogQ2xlYXJzIGVuc3VyZXMgZWxlbWVudHN0cmVhbSBtZW1vcnkgaXMgemVyb2VkLi4gbm90IG5lY2Vzc2FyeSwgYnV0IG1ha2VzIGl0IGVhc2llciB0byBkZWJ1ZwogICAgICogZm9yIChMcD0wO0xwPE1BWF9IRUFERVJTSVpFV09SRFMtMTtMcCsrKSBNVFhfSGVhZGVyLmFzRWxlbWVudFN0cmVhbVtMcF09MDsKICAgICAqLwoKI2lmIEhFQURFUlNfVkVSQk9TRV9PVVRQVVQKICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgIlxuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgIioqKioqKioqIEhPU1QgRklSTVdBUkUgUk9VVElORVMgVE8gUEFTUyBIRUFERVJTIEFORCBUT0tFTlMgVE8gTVRYKioqKioqXG4iKTsKICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuIik7CiNlbmRpZgoKICAgIC8qIEZ1bmN0aW9ucyB0aGF0IGFjdHVhbGx5IHBhY2sgRWxlbWVudHMgKE1UWF9IRUFERVJfUEFSQU1TIHN0cnVjdHVyZSkgd2l0aCBoZWFkZXIgaW5mb3JtYXRpb24gKi8KICAgIHBud19fSDI2NF9nZXRlbGVtZW50c19zZXF1ZW5jZV9oZWFkZXIobXR4X2hkciwgJlNIUGFyYW1zLCBwc0Nyb3BQYXJhbXMpOwp9Cgp2b2lkIHBud19fSDI2NF9wcmVwYXJlX3BpY3R1cmVfaGVhZGVyKHVuc2lnbmVkIGNoYXIgKnBIZWFkZXJNZW1vcnksIElNR19CT09MIGJDYWJhY0VuYWJsZWQsIElNR19JTlQ4IENRUE9mZnNldCkKewogICAgTVRYX0hFQURFUl9QQVJBTVMgKm10eF9oZHI7CgogICAgLyogUm91dGUgb3V0cHV0IGVsZW1lbnRzIHRvIG1lbW9yeSBwcm92aWRlZCAqLwogICAgbXR4X2hkciA9IChNVFhfSEVBREVSX1BBUkFNUyAqKSBwSGVhZGVyTWVtb3J5OwoKCiAgICAvKiBCdWlsZHMgYSBzZXF1ZW5jZSwgcGljdHVyZSBhbmQgc2xpY2UgaGVhZGVyIHdpdGggZnJvbSB0aGUgZ2l2ZW4gaW5wdXRzIHBhcmFtZXRlcnMgKHN0YXJ0IG9mIG5ldyBmcmFtZSkKICAgICAqIEVzc2VudGlhbCB3ZSBpbml0aWFsaXNlIG91ciBoZWFkZXIgc3RydWN0dXJlcyBiZWZvcmUgYnVpbGRpbmcKICAgICAqLwogICAgTVRYX0hFQURFUl9FTEVNRU5UICpUaGlzX0VsZW1lbnQ7CiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKmVsdF9wW01BWE5VTUJFUkVMRU1FTlRTXTsKICAgIG10eF9oZHItPkVsZW1lbnRzID0gRUxFTUVOVFNfRU1QVFk7CiAgICBUaGlzX0VsZW1lbnQgPSAoTVRYX0hFQURFUl9FTEVNRU5UICopIG10eF9oZHItPmFzRWxlbWVudFN0cmVhbTsKICAgIGVsdF9wWzBdID0gVGhpc19FbGVtZW50OwoKICAgIHBud19fSDI2NF93cml0ZWJpdHNfcGljdHVyZV9oZWFkZXIobXR4X2hkciwgZWx0X3AsIGJDYWJhY0VuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENRUE9mZnNldCwgQ1FQT2Zmc2V0KTsKICAgIG10eF9oZHItPkVsZW1lbnRzKys7IC8qIEhhcyBiZWVuIHVzZWQgYXMgYW4gaW5kZXgsIHNvIG5lZWQgdG8gYWRkIDEgZm9yIGEgdmFsaWQgZWxlbWVudCBjb3VudCAqLwp9Cgp2b2lkIHBud19fSDI2NF9wcmVwYXJlX3NsaWNlX2hlYWRlcigKICAgIHVuc2lnbmVkIGNoYXIgKnBIZWFkZXJNZW1vcnksCiAgICBJTUdfQk9PTCAgICBiSW50cmFTbGljZSwKICAgIElNR19VSU5UMzIgdWlEaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklEQywKICAgIElNR19VSU5UMzIgdWlGcmFtZU51bWJlciwKICAgIElNR19VSU5UMzIgdWlGaXJzdF9NQl9BZGRyZXNzLAogICAgSU1HX1VJTlQzMiB1aU1CU2tpcFJ1biwKICAgIElNR19CT09MIGJDYWJhY0VuYWJsZWQsCiAgICBJTUdfQk9PTCBiRm9yY2VJRFIsCiAgICBJTUdfQk9PTCBiVXNlc0xvbmdUZXJtUmVmLAogICAgSU1HX0JPT0wgYklzTG9uZ1Rlcm1SZWYsCiAgICBJTUdfVUlOVDE2IHVpSWRyUGljSWQpCnsKICAgIEgyNjRfU0xJQ0VfSEVBREVSX1BBUkFNUyBTbEhQYXJhbXM7CiAgICBNVFhfSEVBREVSX1BBUkFNUyAqbXR4X2hkcjsKCiAgICBtZW1zZXQoJlNsSFBhcmFtcywgMCwgc2l6ZW9mKFNsSFBhcmFtcykpOwoKICAgIC8qIFJvdXRlIG91dHB1dCBlbGVtZW50cyB0byBtZW1vcnkgcHJvdmlkZWQgKi8KICAgIG10eF9oZHIgPSAoTVRYX0hFQURFUl9QQVJBTVMgKikgcEhlYWRlck1lbW9yeTsKCiAgICBTbEhQYXJhbXMuU3RhcnRfQ29kZV9QcmVmaXhfU2l6ZV9CeXRlcyA9IDQ7CiAgICBTbEhQYXJhbXMuVXNlc0xvbmdUZXJtUmVmID0gYlVzZXNMb25nVGVybVJlZjsKICAgIFNsSFBhcmFtcy5Jc0xvbmdUZXJtUmVmID0gYklzTG9uZ1Rlcm1SZWY7CgogICAgaWYgKGJGb3JjZUlEUiB8fCAodWlGcmFtZU51bWJlciA9PSAwKSkgewogICAgICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgIlRPUEFaOiBHZW5lcmF0ZSBhIElEUiBzbGljZVxuIik7CiAgICAgICAgU2xIUGFyYW1zLlNsaWNlRnJhbWVfVHlwZSA9IFNMSFBfSURSX1NMSUNFRlJBTUVfVFlQRTsKICAgIH0gZWxzZQogICAgICAgIFNsSFBhcmFtcy5TbGljZUZyYW1lX1R5cGUgPSBiSW50cmFTbGljZSA/IFNMSFBfSV9TTElDRUZSQU1FX1RZUEUgOiBTTEhQX1BfU0xJQ0VGUkFNRV9UWVBFOwoKICAgIC8qU2xIUGFyYW1zLlNsaWNlRnJhbWVfVHlwZSA9ICAgICAgIGJJbnRyYVNsaWNlID8gKCgodWlGcmFtZU51bWJlciUoMTw8NSkpPT0wKSA/IFNMSFBfSURSX1NMSUNFRlJBTUVfVFlQRSA6U0xIUF9JX1NMSUNFRlJBTUVfVFlQRSApIDogU0xIUF9QX1NMSUNFRlJBTUVfVFlQRTsqLwogICAgU2xIUGFyYW1zLkZyYW1lX051bV9ETyA9IChJTUdfVUlOVDgpIHVpRnJhbWVOdW1iZXIgJSAoMSA8PCA1KTsKICAgIFNsSFBhcmFtcy5QaWN0dXJlX051bV9ETyA9IChJTUdfVUlOVDgpKFNsSFBhcmFtcy5GcmFtZV9OdW1fRE8gKiAyKTsKCgogICAgU2xIUGFyYW1zLkZpcnN0X01CX0FkZHJlc3MgID0gIHVpRmlyc3RfTUJfQWRkcmVzczsKICAgIFNsSFBhcmFtcy5EaXNhYmxlX0RlYmxvY2tpbmdfRmlsdGVyX0lkYyA9IChJTUdfVUlOVDgpIHVpRGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJREM7CgogICAgewogICAgICAgIElNR19VSU5UMzIgICAgICAqcE1UWF9IZWFkZXJfTWVtID0gKElNR19VSU5UMzIgKiltdHhfaGRyOwogICAgICAgIC8vIHJoazogZmlyc3QgaW5zZXJ0IG5vcm1hbCBoZWFkZXIuCiAgICAgICAgcG53X19IMjY0X2dldGVsZW1lbnRzX3NsaWNlX2hlYWRlcihtdHhfaGRyLCAmU2xIUGFyYW1zLCBiQ2FiYWNFbmFibGVkLCB1aUlkclBpY0lkKTsKCiAgICAgICAgLy8gcHV0IGEgbWFya2VyIHRvIGluZGljYXRlIHRoYXQgdGhpcyBpcyBhIGNvbXBsZXggaGVhZGVyCiAgICAgICAgLy8gbm90ZSB0aGF0IGZpcnN0ICJpbnQiIGluIHRoZSBidWZmZXIgaXMgdXNlZCBmb3IgbnVtYmVyIG9mIGVsZW1lbnRzCiAgICAgICAgLy8gd2hpY2ggaXMgbm90IGdvaW5nIHRvIGJlIG1vcmUgdGhhbiAyNTUKICAgICAgICAqcE1UWF9IZWFkZXJfTWVtIHw9IDB4MTAwOwoKICAgICAgICAvLyByaGs6IGluc2VydCBza2lwcGVkIGZyYW1lIGhlYWRlciBhdCBhbiBvZmZzZXQgb2YgMTI4IGJ5dGVzCiAgICAgICAgcE1UWF9IZWFkZXJfTWVtICs9IChIRUFERVJfU0laRSA+PiAzKTsgIC8vIGdldCBhIHBvaW50ZXIgdG8gdGhlIHNlY29uZCBoYWxmIG9mIG1lbW9yeQogICAgICAgIG10eF9oZHIgPSAoTVRYX0hFQURFUl9QQVJBTVMgKilwTVRYX0hlYWRlcl9NZW07CiAgICAgICAgcG53X19IMjY0X2dldGVsZW1lbnRzX3NraXBfUF9zbGljZShtdHhfaGRyLCAmU2xIUGFyYW1zLCB1aU1CU2tpcFJ1biwgYkNhYmFjRW5hYmxlZCk7CiAgICB9Cgp9CgoKdm9pZCBwbndfX01QRUc0X3ByZXBhcmVfc2VxdWVuY2VfaGVhZGVyKAogICAgdW5zaWduZWQgY2hhciAqcEhlYWRlck1lbW9yeSwKICAgIElNR19CT09MIGJCRnJhbWUsCiAgICBNUEVHNF9QUk9GSUxFX1RZUEUgc1Byb2ZpbGUsCiAgICBJTUdfVUlOVDggUHJvZmlsZV9hbmRfbGV2ZWxfaW5kaWNhdGlvbiwKICAgIEZJWEVEX1ZPUF9USU1FX1RZUEUgc0ZpeGVkX3ZvcF90aW1lX2luY3JlbWVudCwKICAgIElNR19VSU5UMzIgUGljdHVyZV9XaWR0aF9QaXhlbHMsCiAgICBJTUdfVUlOVDMyIFBpY3R1cmVfSGVpZ2h0X1BpeGVscywKICAgIFZCVlBBUkFNUyAqIHBzVkJWUGFyYW1zLAogICAgSU1HX1VJTlQzMiBWb3BUaW1lUmVzb2x1dGlvbikKewogICAgTVRYX0hFQURFUl9QQVJBTVMgKm10eF9oZHI7CgogICAgLyogUm91dGUgb3V0cHV0IGVsZW1lbnRzIHRvIG1lbW9yeSBwcm92aWRlZCAqLwogICAgbXR4X2hkciA9IChNVFhfSEVBREVSX1BBUkFNUyAqKSBwSGVhZGVyTWVtb3J5OwogICAgLyogQnVpbGRzIGEgc2luZ2xlIE1QRUc0IHZpZGVvIHNlcXVlbmNlIGhlYWRlciBmcm9tIHRoZSBnaXZlbiBwYXJhbWV0ZXJzICovCgogICAgLyogRXNzZW50aWFsIHdlIGluaXRpYWxpc2Ugb3VyIGhlYWRlciBzdHJ1Y3R1cmVzIGJlZm9yZSBidWlsZGluZyAqLwogICAgTVRYX0hFQURFUl9FTEVNRU5UICpUaGlzX0VsZW1lbnQ7CiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKmVsdF9wW01BWE5VTUJFUkVMRU1FTlRTXTsKICAgIG10eF9oZHItPkVsZW1lbnRzID0gRUxFTUVOVFNfRU1QVFk7CiAgICBUaGlzX0VsZW1lbnQgPSAoTVRYX0hFQURFUl9FTEVNRU5UICopIG10eF9oZHItPmFzRWxlbWVudFN0cmVhbTsKICAgIGVsdF9wWzBdID0gVGhpc19FbGVtZW50OwoKICAgIHBud19fTVBFRzRfd3JpdGViaXRzX3NlcXVlbmNlX2hlYWRlcigKICAgICAgICBtdHhfaGRyLAogICAgICAgIGVsdF9wLAogICAgICAgIGJCRnJhbWUsIHNQcm9maWxlLAogICAgICAgIFByb2ZpbGVfYW5kX2xldmVsX2luZGljYXRpb24sCiAgICAgICAgc0ZpeGVkX3ZvcF90aW1lX2luY3JlbWVudCwKICAgICAgICBQaWN0dXJlX1dpZHRoX1BpeGVscywKICAgICAgICBQaWN0dXJlX0hlaWdodF9QaXhlbHMsCiAgICAgICAgcHNWQlZQYXJhbXMsIFZvcFRpbWVSZXNvbHV0aW9uKTsKCiAgICBtdHhfaGRyLT5FbGVtZW50cysrOyAvKiBIYXMgYmVlbiB1c2VkIGFzIGFuIGluZGV4LCBzbyBuZWVkIHRvIGFkZCAxIGZvciBhIHZhbGlkIGVsZW1lbnQgY291bnQgKi8KCn0KCnZvaWQgcG53X19NUEVHNF9wcmVwYXJlX3ZvcF9oZWFkZXIoCiAgICB1bnNpZ25lZCBjaGFyICpwSGVhZGVyTWVtLAogICAgSU1HX0JPT0wgYklzVk9QX2NvZGVkLAogICAgSU1HX1VJTlQzMiBWT1BfdGltZV9pbmNyZW1lbnQsCiAgICBJTUdfVUlOVDggc1NlYXJjaF9yYW5nZSwKICAgIElNR19VSU5UOCBlVm9wX0NvZGluZ19UeXBlLAogICAgSU1HX1VJTlQzMiBWb3BUaW1lUmVzb2x1dGlvbikKewogICAgTVRYX0hFQURFUl9QQVJBTVMgKm10eF9oZHI7CgogICAgbXR4X2hkciA9IChNVFhfSEVBREVSX1BBUkFNUyAqKSBwSGVhZGVyTWVtOwoKICAgIC8qIEJ1aWxkcyBhIHNpbmdsZSBNUEVHNCBWT1AgKHBpY3R1cmUpIGhlYWRlciBmcm9tIHRoZSBnaXZlbiBwYXJhbWV0ZXJzICovCiAgICAvKiBFc3NlbnRpYWwgd2UgaW5pdGlhbGlzZSBvdXIgaGVhZGVyIHN0cnVjdHVyZXMgYmVmb3JlIGJ1aWxkaW5nICovCiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKlRoaXNfRWxlbWVudDsKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqZWx0X3BbTUFYTlVNQkVSRUxFTUVOVFNdOwogICAgbXR4X2hkci0+RWxlbWVudHMgPSBFTEVNRU5UU19FTVBUWTsKICAgIFRoaXNfRWxlbWVudCA9IChNVFhfSEVBREVSX0VMRU1FTlQgKikgbXR4X2hkci0+YXNFbGVtZW50U3RyZWFtOwogICAgZWx0X3BbMF0gPSBUaGlzX0VsZW1lbnQ7CgogICAgLyogRnJhbWUgUVNjYWxlIG5vIGxvbmdlciB3cml0dGVuIGhlcmUgYXMgaXQgaXMgaW5zZXJ0ZWQgYnkgTVRYIGxhdGVyCiAgICAgKiAoYWRkIGFzIHBhcmFtZXRlciB0byBNVFhfU2VuZF9FbGVtZW50c19Ub19WTEMpCiAgICAgKi8KICAgIHBud19fTVBFRzRfd3JpdGViaXRzX1ZPUF9oZWFkZXIoCiAgICAgICAgbXR4X2hkciwgZWx0X3AsIGJJc1ZPUF9jb2RlZCwKICAgICAgICBWT1BfdGltZV9pbmNyZW1lbnQsCiAgICAgICAgc1NlYXJjaF9yYW5nZSwKICAgICAgICBlVm9wX0NvZGluZ19UeXBlLAogICAgICAgIFZvcFRpbWVSZXNvbHV0aW9uKTsKCiAgICBtdHhfaGRyLT5FbGVtZW50cysrOyAvKiBIYXMgYmVlbiB1c2VkIGFzIGFuIGluZGV4LCBzbyBuZWVkIHRvIGFkZCAxIGZvciBhIHZhbGlkIGVsZW1lbnQgY291bnQgKi8KCn0KCgojaWYgUFNCX01GTERfRFVNTVlfQ09ERQp2b2lkIHBud19fSDI2M19wcmVwYXJlX3NlcXVlbmNlX2hlYWRlcigKICAgIHVuc2lnbmVkIGNoYXIgKnBIZWFkZXJNZW0sCiAgICBJTUdfVUlOVDggUHJvZmlsZV9hbmRfbGV2ZWxfaW5kaWNhdGlvbikKewogICAgTVRYX0hFQURFUl9QQVJBTVMgKm10eF9oZHI7CgogICAgbXR4X2hkciA9IChNVFhfSEVBREVSX1BBUkFNUyAqKSBwSGVhZGVyTWVtOwoKICAgIC8qIEJ1aWxkcyBhIHNpbmdsZSBIMjYzIHZpZGVvIHNlcXVlbmNlIGhlYWRlciBmcm9tIHRoZSBnaXZlbiBwYXJhbWV0ZXJzICovCgogICAgLyogRXNzZW50aWFsIHdlIGluaXRpYWxpc2Ugb3VyIGhlYWRlciBzdHJ1Y3R1cmVzIGJlZm9yZSBidWlsZGluZyAqLwogICAgTVRYX0hFQURFUl9FTEVNRU5UICpUaGlzX0VsZW1lbnQ7CiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKmVsdF9wW01BWE5VTUJFUkVMRU1FTlRTXTsKICAgIG10eF9oZHItPkVsZW1lbnRzID0gRUxFTUVOVFNfRU1QVFk7CiAgICBUaGlzX0VsZW1lbnQgPSAoTVRYX0hFQURFUl9FTEVNRU5UICopIG10eF9oZHItPmFzRWxlbWVudFN0cmVhbTsKICAgIGVsdF9wWzBdID0gVGhpc19FbGVtZW50OwoKICAgIEgyNjNfd3JpdGViaXRzX1ZpZGVvU2VxdWVuY2VIZWFkZXIobXR4X2hkciwgZWx0X3AsIFByb2ZpbGVfYW5kX2xldmVsX2luZGljYXRpb24pOwoKICAgIG10eF9oZHItPkVsZW1lbnRzKys7IC8qIEhhcyBiZWVuIHVzZWQgYXMgYW4gaW5kZXgsIHNvIG5lZWQgdG8gYWRkIDEgZm9yIGEgdmFsaWQgZWxlbWVudCBjb3VudCAqLwoKfQojZW5kaWYKCnZvaWQgcG53X19IMjYzX3ByZXBhcmVfcGljdHVyZV9oZWFkZXIoCiAgICB1bnNpZ25lZCBjaGFyICpwSGVhZGVyTWVtLAogICAgSU1HX1VJTlQ4IFRlbXBvcmFsX1JlZiwKICAgIEgyNjNfUElDVFVSRV9DT0RJTkdfVFlQRSBQaWN0dXJlQ29kaW5nVHlwZSwKICAgIEgyNjNfU09VUkNFX0ZPUk1BVF9UWVBFIFNvdXJjZUZvcm1hdFR5cGUsCiAgICBJTUdfVUlOVDggRnJhbWVSYXRlLAogICAgSU1HX1VJTlQxNiBQaWN0dXJlV2lkdGgsCiAgICBJTUdfVUlOVDE2IFBpY3R1cmVIZWlndGgpCnsKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyOwoKICAgIG10eF9oZHIgPSAoTVRYX0hFQURFUl9QQVJBTVMgKikgcEhlYWRlck1lbTsKCiAgICAvKiBFc3NlbnRpYWwgd2UgaW5pdGlhbGlzZSBvdXIgaGVhZGVyIHN0cnVjdHVyZXMgYmVmb3JlIGJ1aWxkaW5nICovCiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKlRoaXNfRWxlbWVudDsKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqZWx0X3BbTUFYTlVNQkVSRUxFTUVOVFNdOwogICAgbXR4X2hkci0+RWxlbWVudHMgPSBFTEVNRU5UU19FTVBUWTsKICAgIFRoaXNfRWxlbWVudCA9IChNVFhfSEVBREVSX0VMRU1FTlQgKikgbXR4X2hkci0+YXNFbGVtZW50U3RyZWFtOwogICAgZWx0X3BbMF0gPSBUaGlzX0VsZW1lbnQ7CgogICAgSDI2M193cml0ZWJpdHNfVmlkZW9QaWN0dXJlSGVhZGVyKAogICAgICAgIG10eF9oZHIsIGVsdF9wLAogICAgICAgIFRlbXBvcmFsX1JlZiwKICAgICAgICBQaWN0dXJlQ29kaW5nVHlwZSwKICAgICAgICBTb3VyY2VGb3JtYXRUeXBlLAogICAgICAgIEZyYW1lUmF0ZSwKICAgICAgICBQaWN0dXJlV2lkdGgsCiAgICAgICAgUGljdHVyZUhlaWd0aCk7CgogICAgbXR4X2hkci0+RWxlbWVudHMrKzsgLyogSGFzIGJlZW4gdXNlZCBhcyBhbiBpbmRleCwgc28gbmVlZCB0byBhZGQgMSBmb3IgYSB2YWxpZCBlbGVtZW50IGNvdW50ICovCn0KCnZvaWQgcG53X19IMjYzX3ByZXBhcmVfR09Cc2xpY2VfaGVhZGVyKAogICAgdW5zaWduZWQgY2hhciAqcEhlYWRlck1lbSwKICAgIElNR19VSU5UOCBHT0JOdW1iZXIsCiAgICBJTUdfVUlOVDggR09CRnJhbWVJZCkKewogICAgTVRYX0hFQURFUl9QQVJBTVMgKm10eF9oZHI7CgogICAgbXR4X2hkciA9IChNVFhfSEVBREVSX1BBUkFNUyAqKSBwSGVhZGVyTWVtOwoKICAgIC8qIEVzc2VudGlhbCB3ZSBpbml0aWFsaXNlIG91ciBoZWFkZXIgc3RydWN0dXJlcyBiZWZvcmUgYnVpbGRpbmcgKi8KICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqVGhpc19FbGVtZW50OwogICAgTVRYX0hFQURFUl9FTEVNRU5UICplbHRfcFtNQVhOVU1CRVJFTEVNRU5UU107CiAgICBtdHhfaGRyLT5FbGVtZW50cyA9IEVMRU1FTlRTX0VNUFRZOwogICAgVGhpc19FbGVtZW50ID0gKE1UWF9IRUFERVJfRUxFTUVOVCAqKSBtdHhfaGRyLT5hc0VsZW1lbnRTdHJlYW07CiAgICBlbHRfcFswXSA9IFRoaXNfRWxlbWVudDsKCiAgICBIMjYzX3dyaXRlYml0c19HT0JTbGljZUhlYWRlcihtdHhfaGRyLCBlbHRfcCwgR09CTnVtYmVyLCBHT0JGcmFtZUlkKTsKCiAgICBtdHhfaGRyLT5FbGVtZW50cysrOyAvL0hhcyBiZWVuIHVzZWQgYXMgYW4gaW5kZXgsIHNvIG5lZWQgdG8gYWRkIDEgZm9yIGEgdmFsaWQgZWxlbWVudCBjb3VudAogICAgCiAgICAvKgogICAgKHZvaWQpcG53X19IMjY0X3dyaXRlYml0c19TRUlfcmJzcGhlYWRlcjsKICAgICh2b2lkKXBud19fSDI2NF9nZXRlbGVtZW50c19za2lwX0Jfc2xpY2U7CiAgICAodm9pZClwbndfX0gyNjRfZ2V0ZWxlbWVudHNfYmFja3dhcmRfemVyb19CX3NsaWNlOwogICAgKHZvaWQpcG53X19IMjY0X2dldGVsZW1lbnRzX3Jic3BfQVRFX29ubHk7CiAgICAodm9pZClwbndfTVBFRzRfZ2V0ZWxlbWVudHNfdmlkZW9fcGFja2V0X2hlYWRlcjsKICAgICovCn0KCg==