LyoKICogQ29weXJpZ2h0IChjKSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiBDb3B5cmlnaHQgKGMpIEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcyBMaW1pdGVkLCBVSwogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCiAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAogKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCiAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwogKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAqCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCiAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCiAqIG9mIHRoZSBTb2Z0d2FyZS4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgogKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgogKiBJTiBOTyBFVkVOVCBTSEFMTCBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCiAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAogKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQogKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICoKICogQXV0aG9yczoKICogICAgRWxhaW5lIFdhbmcgPGVsYWluZS53YW5nQGludGVsLmNvbT4KICogICAgWmVuZyBMaSA8emVuZy5saUBpbnRlbC5jb20+CiAqICAgIEVkd2FyZCBMaW4gPGVkd2FyZC5saW5AaW50ZWwuY29tPgogKgogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlICJpbWdfdHlwZXMuaCIKI2luY2x1ZGUgInBzYl9kZWYuaCIKI2luY2x1ZGUgInBzYl9kcnZfZGVidWcuaCIKI2luY2x1ZGUgInRuZ19ob3N0aGVhZGVyLmgiCiNpZmRlZiBfVE9QQVpIUF9QRFVNUF8KI2luY2x1ZGUgInRuZ190cmFjZS5oIgojZW5kaWYKLyogR2xvYmFsIHN0b3JlcyB0aGUgbGF0ZXN0IFFQIGluZm9ybWF0aW9uIGZvciB0aGUgRG9IZWFkZXIoKQogKiByb3V0aW5lLCBzaG91bGQgYmUgZmlsbGVkIGluIGJ5IHRoZSByYXRlIGNvbnRyb2wgYWxnb3JpdGhtLgogKi8KI2RlZmluZSBIRUFERVJTX1ZFUkJPU0VfT1VUUFVUIDAKCi8qICNkZWZpbmUgVVNFU1RBVElDV0hFUkVQT1NTSUJMRSAxICovCgojZGVmaW5lIE1BWE5VTUJFUkVMRU1FTlRTIDE2CgovKiBTT01FIFVTRUZVTCBURVNUIEZVTkNUSU9OUyAqLwojaWZuZGVmIFRPUEFaX01UWF9IVwpzdGF0aWMgdm9pZCBTaG93X0JpdHMoCiAgICBJTUdfVUlOVDggX19tYXliZV91bnVzZWQgKiB1Y0JpdFN0cmVhbSwKICAgIElNR19VSU5UMzIgX19tYXliZV91bnVzZWQgQnl0ZVN0YXJ0Qml0LAogICAgSU1HX1VJTlQzMiBfX21heWJlX3VudXNlZCBCaXRzKQp7CiAgICByZXR1cm4gOwojaWYgMAogICAgY2hhciBUeHRbMTAyNF07CiAgICBJTUdfVUlOVDMyIHVpQnl0ZVNpemU7CiAgICBJTUdfVUlOVDMyIHVpTHAsIHVpQnQsIEJjbnQ7CiAgICBCY250ID0gMDsKICAgIHVpQnl0ZVNpemUgPSAoQml0cyArIEJ5dGVTdGFydEJpdCArIDcpID4+IDM7CiAgICBmb3IgKHVpTHAgPSAwOyB1aUxwIDwgdWlCeXRlU2l6ZTsgdWlMcCsrKSB7CiAgICAgICAgc25wcmludGYoVHh0LCBzdHJsZW4oIiAiKSwgIiAiKTsKICAgICAgICBmb3IgKHVpQnQgPSAxMjg7IHVpQnQgPj0gMTsgdWlCdCA9IHVpQnQgPj4gMSkgewogICAgICAgICAgICBCY250Kys7CiAgICAgICAgICAgIGlmIChCY250ID4gQml0cyArIEJ5dGVTdGFydEJpdCB8fCBCY250IDw9IEJ5dGVTdGFydEJpdCkKICAgICAgICAgICAgICAgIHNucHJpbnRmKFR4dCwgc2l6ZW9mKFR4dCksICIlc1giLCBUeHQpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzbnByaW50ZihUeHQsIHNpemVvZihUeHQpLCAiJXMlaSIsIFR4dCwgKHVjQml0U3RyZWFtW3VpTHBdICYgdWlCdCkgPiAwKTsKICAgICAgICB9CgogICAgICAgIHNucHJpbnRmKFR4dCwgc2l6ZW9mKFR4dCksICIlcyAiLCBUeHQpOwogICAgICAgIC8vcHJpbnRmKFR4dCk7CiAgICAgICAgaWYgKCh1aUxwICsgMSkgJSA4ID09IDApIHByaW50ZigiXG4iKTsKICAgIH0KCiAgICBwcmludGYoIlxuXG4iKTsKI2VuZGlmCn0KI2VuZGlmCgojaWZuZGVmIFRPUEFaX01UWF9IVwoKc3RhdGljIHZvaWQgU2hvd19FbGVtZW50cygKICAgIE1UWF9IRUFERVJfUEFSQU1TIF9fbWF5YmVfdW51c2VkICogbXR4X2hkciwKICAgIE1UWF9IRUFERVJfRUxFTUVOVCBfX21heWJlX3VudXNlZCAqKiBhdWkzMkVsZW1lbnRQb2ludGVycykKewogICAgcmV0dXJuIDsKI2lmIDAKICAgIElNR19VSU5UOCBmOwogICAgSU1HX1VJTlQzMiBUb3RhbEJ5dGVTaXplOwogICAgSU1HX1VJTlQzMiBSVG90YWxCeXRlU2l6ZTsKCiAgICBSVG90YWxCeXRlU2l6ZSA9IFRvdGFsQnl0ZVNpemUgPSAwOwogICAgZm9yIChmID0gMDsgZiA8IG10eF9oZHItPnVpMzJFbGVtZW50czsgZisrKSB7CiNpZiBIRUFERVJTX1ZFUkJPU0VfT1VUUFVUCiAgICAgICAgZHJ2X2RlYnVnX21zZyhWSURFT19ERUJVR19HRU5FUkFMLCAiRW5jb2RpbmcgRWxlbWVudCBbJWldIC0gVHlwZTolaVxuIiwgZiwgYXVpMzJFbGVtZW50UG9pbnRlcnNbZl0tPkVsZW1lbnRfVHlwZSk7CiNlbmRpZgogICAgICAgIGlmIChhdWkzMkVsZW1lbnRQb2ludGVyc1tmXS0+RWxlbWVudF9UeXBlID09IEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEgfHwKICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnNbZl0tPkVsZW1lbnRfVHlwZSA9PSBFTEVNRU5UX1JBV0RBVEEpIHsKICAgICAgICAgICAgVG90YWxCeXRlU2l6ZSA9IGF1aTMyRWxlbWVudFBvaW50ZXJzW2ZdLT51aThTaXplOwojaWYgSEVBREVSU19WRVJCT1NFX09VVFBVVAogICAgICAgICAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0dFTkVSQUwsICJXcml0aW5nICVpIFJBVyBiaXRzIHRvIGVsZW1lbnQuXG4iLCBhdWkzMkVsZW1lbnRQb2ludGVyc1tmXS0+dWk4U2l6ZSk7CiAgICAgICAgICAgIFNob3dfQml0cygoSU1HX1VJTlQ4ICopKCZhdWkzMkVsZW1lbnRQb2ludGVyc1tmXS0+dWk4U2l6ZSkgKyAxLCAwLCBUb3RhbEJ5dGVTaXplKTsKI2VuZGlmCiAgICAgICAgICAgIFRvdGFsQnl0ZVNpemUgKz0gODsKCiAgICAgICAgICAgIFJUb3RhbEJ5dGVTaXplICs9ICgoKElNR19VSU5UMzIpKChUb3RhbEJ5dGVTaXplICsgNykgLyA4KSkgKiA4KTsKICAgICAgICAgICAgUlRvdGFsQnl0ZVNpemUgKz0gMzI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgVG90YWxCeXRlU2l6ZSA9IDA7CiAgICAgICAgICAgIHN3aXRjaCAoYXVpMzJFbGVtZW50UG9pbnRlcnNbZl0tPkVsZW1lbnRfVHlwZSkgewogICAgICAgICAgICBjYXNlIEVMRU1FTlRfUVA6CiNpZiBIRUFERVJTX1ZFUkJPU0VfT1VUUFVUCiAgICAgICAgICAgICAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0dFTkVSQUwsICJJbnNlcnQgdG9rZW4gRUxFTUVOVF9RUCAoSDI2NCktIGZvciBNVFggdG8gZ2VuZXJhdGUgYW5kIGluc2VydCB0aGlzIHZhbHVlXG4iKTsKI2VuZGlmCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBFTEVNRU5UX1NRUDoKI2lmIEhFQURFUlNfVkVSQk9TRV9PVVRQVVQKICAgICAgICAgICAgICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgIkluc2VydCB0b2tlbiBFTEVNRU5UX1NRUCAoSDI2NCktIGZvciBNVFggdG8gZ2VuZXJhdGUgYW5kIGluc2VydCB0aGlzIHZhbHVlXG4iKTsKI2VuZGlmCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBFTEVNRU5UX0ZSQU1FUVNDQUxFOgojaWYgSEVBREVSU19WRVJCT1NFX09VVFBVVAogICAgICAgICAgICAgICAgZHJ2X2RlYnVnX21zZyhWSURFT19ERUJVR19HRU5FUkFMLCAiSW5zZXJ0IHRva2VuIEVMRU1FTlRfRlJBTUVRU0NBTEUgKEgyNjMvTVBFRzQpIC0gZm9yIE1UWCB0byBnZW5lcmF0ZSBhbmQgaW5zZXJ0IHRoaXMgdmFsdWVcbiIpOwojZW5kaWYKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEVMRU1FTlRfU0xJQ0VRU0NBTEU6CiNpZiBIRUFERVJTX1ZFUkJPU0VfT1VUUFVUCiAgICAgICAgICAgICAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0dFTkVSQUwsICJJbnNlcnQgdG9rZW4gRUxFTUVOVF9TTElDRVFTQ0FMRSAoSDI2My9NUEVHNCkgLSBmb3IgTVRYIHRvIGdlbmVyYXRlIGFuZCBpbnNlcnQgdGhpcyB2YWx1ZVxuIik7CiNlbmRpZgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgRUxFTUVOVF9JTlNFUlRCWVRFQUxJR05fSDI2NDoKI2lmIEhFQURFUlNfVkVSQk9TRV9PVVRQVVQKICAgICAgICAgICAgICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgIkluc2VydCB0b2tlbiBFTEVNRU5UX0lOU0VSVEJZVEVBTElHTl9IMjY0IC0gIE1UWCB0byBnZW5lcmF0ZSAncmJzcF90cmFpbGluZ19iaXRzKCknIGZpZWxkXG4iKTsKI2VuZGlmCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBFTEVNRU5UX0lOU0VSVEJZVEVBTElHTl9NUEc0OgojaWYgSEVBREVSU19WRVJCT1NFX09VVFBVVAogICAgICAgICAgICAgICAgZHJ2X2RlYnVnX21zZyhWSURFT19ERUJVR19HRU5FUkFMLCAiSW5zZXJ0IHRva2VuIEVMRU1FTlRfSU5TRVJUQllURUFMSUdOX01QRzQgLSAgTVRYIHRvIGdlbmVyYXRlIE1QRUc0ICdieXRlX2FsaWduZWRfYml0cycgZmllbGRcbiIpOwojZW5kaWYKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFJUb3RhbEJ5dGVTaXplICs9IDMyOwojaWYgSEVBREVSU19WRVJCT1NFX09VVFBVVAogICAgICAgICAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0dFTkVSQUwsICJObyBSQVcgYml0c1xuXG4iKTsKI2VuZGlmCiAgICAgICAgfQogICAgfQoKICAgIC8qIFRvdGFsQnl0ZVNpemU9VG90YWxCeXRlU2l6ZSszMisoJmF1aTMyRWxlbWVudFBvaW50ZXJzW2YtMV0tPkVsZW1lbnRfVHlwZS0mYXVpMzJFbGVtZW50UG9pbnRlcnNbMF0tPkVsZW1lbnRfVHlwZSkqODsgKi8KCiNpZiBIRUFERVJTX1ZFUkJPU0VfT1VUUFVUCiAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0dFTkVSQUwsICJcbkNvbWJpbmVkIEVMRU1FTlRTIFN0cmVhbTpcbiIpOwogICAgU2hvd19CaXRzKChJTUdfVUlOVDggKikgbXR4X2hkci0+YXNFbGVtZW50U3RyZWFtLCAwLCBSVG90YWxCeXRlU2l6ZSk7CiNlbmRpZgojZW5kaWYgLy8wCn0KI2VuZGlmCgpzdGF0aWMgdm9pZCB0bmdfcHJpbnQodW5zaWduZWQgY2hhciAqcHRtcCwgaW50IG51bSkKewogICAgaW50IHRtcDsgCiAgICBkbyB7ICAKICAgICAgZm9yKHRtcD0wO3RtcCA8IG51bTt0bXArKykgewogICAgICAgIGlmKHRtcCU4PT0wKQogICAgICAgICAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0dFTkVSQUwsICJcblx0XHQiKTsgIAogICAgICAgZHJ2X2RlYnVnX21zZyhWSURFT19ERUJVR19HRU5FUkFMLCAiXHQweCUwMngiLCBwdG1wW3RtcF0pOwogICAgIH0gCiAgICAgZHJ2X2RlYnVnX21zZyhWSURFT19ERUJVR19HRU5FUkFMLCAiXG5cdFx0fVxuIik7IAogICAgfSB3aGlsZSAoMCk7Cn0KCi8qKgogKiBIZWFkZXIgV3JpdGluZyBGdW5jdGlvbnMKICogTG93IGxldmVsIGJpdCB3cml0aW5nIGFuZCB1ZSwgc2UgZnVuY3Rpb25zCiAqIEhPU1QgQ09ERQogKi8Kc3RhdGljIHZvaWQgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMoCiAgICBNVFhfSEVBREVSX1BBUkFNUyAqcE1UWF9IZWFkZXIsCiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKiphdWkzMkVsZW1lbnRQb2ludGVycywKICAgIElNR19VSU5UOCB1aThXcml0ZUJpdHMsCiAgICBJTUdfVUlOVDE2IHVpMTZCaXRDbnQpCnsKICAgIC8vIFRoaXMgaXMgdGhlIGNvcmUgZnVuY3Rpb24gdG8gd3JpdGUgYml0cy9ieXRlcyB0byBhIGhlYWRlciBzdHJlYW0sIGl0IHdyaXRlcyB0aGVtIGRpcmVjdGx5IHRvIEVMRU1FTlQgc3RydWN0dXJlcy4KICAgIElNR19VSU5UOCAqcHVpOFdyaXRlQnl0ZXM7CiAgICBJTUdfVUlOVDggKnB1aThTaXplQml0czsKICAgIHVuaW9uIHsKICAgICAgICBJTUdfVUlOVDMyIFVJMTZJbnB1dDsKICAgICAgICBJTUdfVUlOVDggVUk4SW5wdXRbMl07CiAgICB9IElucHV0VmFsOwogICAgSU1HX1VJTlQ4IHVpOE91dEJ5dGVJbmRleDsKICAgIElNR19JTlQxNiBpMTZTaGlmdDsKICAgIGlmICh1aTE2Qml0Q250PT0wKQogICAgICAgIHJldHVybiA7CgovLyAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0dFTkVSQUwsICIlczogbXR4X2hkci0+dWkzMkVsbWVudHMgb3ZlcmZsb3cgKCVkKVxuIiwgX19GVU5DVElPTl9fLCBwTVRYX0hlYWRlci0+dWkzMkVsZW1lbnRzKTsKICAgIC8qIFdBIGZvciBrbG9ja3dvcmsgKi8KCi8vICAgIGlmIChwTVRYX0hlYWRlci0+dWkzMkVsZW1lbnRzID49IE1BWE5VTUJFUkVMRU1FTlRTKSB7Ci8vICAgICAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0VSUk9SLCAiJXM6IG10eF9oZHItPnVpMzJFbG1lbnRzIG92ZXJmbG93ICglZClcbiIsIF9fRlVOQ1RJT05fXywgcE1UWF9IZWFkZXItPnVpMzJFbGVtZW50cyk7Ci8vICAgICAgICByZXR1cm47Ci8vICAgIH0KICAgIC8vIEZpcnN0IGVuc3VyZSB0aGF0IHVudXNlZCBiaXRzICBpbiB1aThXcml0ZUJpdHMgYXJlIHplcm9lZAogICAgdWk4V3JpdGVCaXRzICY9ICgweDAwZmYgPj4gKDggLSB1aTE2Qml0Q250KSk7CiAgICBJbnB1dFZhbC5VSTE2SW5wdXQ9MDsKICAgIHB1aThTaXplQml0cz0mKGF1aTMyRWxlbWVudFBvaW50ZXJzW3BNVFhfSGVhZGVyLT51aTMyRWxlbWVudHNdLT51aThTaXplKTsgLy9Qb2ludGVyIHRvIHRoZSBiaXQgY291bnQgZmllbGQKICAgIHB1aThXcml0ZUJ5dGVzPSYoYXVpMzJFbGVtZW50UG9pbnRlcnNbcE1UWF9IZWFkZXItPnVpMzJFbGVtZW50c10tPmF1aThCaXRzKTsgLy9Qb2ludGVyIHRvIHRoZSBzcGFjZSB3aGVyZSBoZWFkZXIgYml0cyBhcmUgdG8gYmUgd3JpdHRlbgogICAgdWk4T3V0Qnl0ZUluZGV4PShwdWk4U2l6ZUJpdHNbMF0gLyA4KTsKICAgIGlmICghKHB1aThTaXplQml0c1swXSY3KSkgewogICAgICAgIGlmIChwdWk4U2l6ZUJpdHNbMF0+PTEyMCkgewogICAgICAgICAgICAvL0VsZW1lbnQgbWF4aW11bSBiaXRzIHNlbmQgdG8gZWxlbWVudCwgdGltZSB0byBzdGFydCBhIG5ldyBvbmUKICAgICAgICAgICAgcE1UWF9IZWFkZXItPnVpMzJFbGVtZW50cysrOyAvLyBJbmNyZW1lbnQgZWxlbWVudCBpbmRleAogICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVyc1twTVRYX0hlYWRlci0+dWkzMkVsZW1lbnRzXT0oTVRYX0hFQURFUl9FTEVNRU5UICopICZwdWk4V3JpdGVCeXRlc1sxNV07IC8vRWxlbWVudCBwb2ludGVyIHNldCB0byBwb3NpdGlvbiBvZiBuZXh0IGVsZW1lbnQgKDEyMC84ID0gMTUgYnl0ZXMpCiAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzW3BNVFhfSGVhZGVyLT51aTMyRWxlbWVudHNdLT5FbGVtZW50X1R5cGU9RUxFTUVOVF9SQVdEQVRBOyAvL1dyaXRlIEVMRU1FTlRfVFlQRQogICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVyc1twTVRYX0hlYWRlci0+dWkzMkVsZW1lbnRzXS0+dWk4U2l6ZT0wOyAvLyBTZXQgbmV3IGVsZW1lbnQgc2l6ZSAoYml0cykgdG8gemVybwogICAgICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlcixhdWkzMkVsZW1lbnRQb2ludGVycywgdWk4V3JpdGVCaXRzLCB1aTE2Qml0Q250KTsgLy8gQmVnaW4gd3JpdGluZyB0byB0aGUgbmV3IGVsZW1lbnQKICAgICAgICByZXR1cm4gOy8vKElNR19VSU5UMzIpIHVpMTZCaXRDbnQ7CiAgICAgICAgfQogICAgICAgIHB1aThXcml0ZUJ5dGVzW3VpOE91dEJ5dGVJbmRleF09MDsgLy8gQmVnaW5uaW5nIGEgbmV3IGJ5dGUsIGNsZWFyIGJ5dGUKICAgIH0KICAgIGkxNlNoaWZ0PShJTUdfSU5UMTYpICgoOC11aTE2Qml0Q250KS0ocHVpOFNpemVCaXRzWzBdJjcpKTsKICAgIGlmIChpMTZTaGlmdD49MCkgewogICAgICAgIHVpOFdyaXRlQml0cyA8PD0gaTE2U2hpZnQ7CiAgICAgICAgcHVpOFdyaXRlQnl0ZXNbdWk4T3V0Qnl0ZUluZGV4XXw9dWk4V3JpdGVCaXRzOwogICAgICAgIHB1aThTaXplQml0c1swXT1wdWk4U2l6ZUJpdHNbMF0rdWkxNkJpdENudDsKICAgIH0gZWxzZSB7CiAgICAgICAgSW5wdXRWYWwuVUk4SW5wdXRbMV09KElNR19VSU5UOCkgdWk4V3JpdGVCaXRzKzI1NjsKICAgICAgICBJbnB1dFZhbC5VSTE2SW5wdXQgPj49IC1pMTZTaGlmdDsKICAgICAgICBwdWk4V3JpdGVCeXRlc1t1aThPdXRCeXRlSW5kZXhdfD1JbnB1dFZhbC5VSThJbnB1dFsxXTsKCiAgICAgICAgcHVpOFNpemVCaXRzWzBdPXB1aThTaXplQml0c1swXSt1aTE2Qml0Q250OwogICAgICAgIHB1aThTaXplQml0c1swXT1wdWk4U2l6ZUJpdHNbMF0tKChJTUdfVUlOVDgpIC1pMTZTaGlmdCk7CiAgICAgICAgSW5wdXRWYWwuVUk4SW5wdXRbMF09SW5wdXRWYWwuVUk4SW5wdXRbMF0gPj4gKDgraTE2U2hpZnQpOwogICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgSW5wdXRWYWwuVUk4SW5wdXRbMF0sKElNR19VSU5UMTYpIC1pMTZTaGlmdCk7CiAgICB9CiAgICByZXR1cm4gOy8vKElNR19VSU5UMzIpIHVpMTZCaXRDbnQ7Cn0KCnN0YXRpYyB2b2lkIHRuZ19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cygKICAgIE1UWF9IRUFERVJfUEFSQU1TICpwTVRYX0hlYWRlciwKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqKmF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgSU1HX1VJTlQzMiB1aTMyV3JpdGVCaXRzLAogICAgSU1HX1VJTlQzMiB1aTMyQml0Q250KQp7CiAgICBJTUdfVUlOVDMyIHVpMzJCaXRMcDsKICAgIElNR19VSU5UMzIgdWkzMkVuZEJ5dGU7CiAgICBJTUdfVUlOVDggdWk4Qnl0ZXNbNF07CiAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0dFTkVSQUwsICJXQlMoMzIpIGJpdHMgJXgsIGNudCA9ICVkXG4iLCB1aTMyV3JpdGVCaXRzLCB1aTMyQml0Q250KTsKICAgIGZvciAodWkzMkJpdExwPTA7IHVpMzJCaXRMcDw0OyB1aTMyQml0THArKykgewogICAgICAgIHVpOEJ5dGVzW3VpMzJCaXRMcF09KElNR19VSU5UOCkgKHVpMzJXcml0ZUJpdHMgJiAyNTUpOwogICAgICAgIHVpMzJXcml0ZUJpdHMgPSB1aTMyV3JpdGVCaXRzID4+IDg7CiAgICB9CgogICAgdWkzMkVuZEJ5dGU9KCh1aTMyQml0Q250KzcpLzgpOwogICAgaWYgKCh1aTMyQml0Q250KSU4KQogICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgdWk4Qnl0ZXNbdWkzMkVuZEJ5dGUtMV0sIChJTUdfVUlOVDgpICgodWkzMkJpdENudCklOCkpOwogICAgZWxzZQogICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgdWk4Qnl0ZXNbdWkzMkVuZEJ5dGUtMV0sIDgpOwogICAgaWYgKHVpMzJFbmRCeXRlPjEpCiAgICAgICAgZm9yICh1aTMyQml0THA9dWkzMkVuZEJ5dGUtMTsgdWkzMkJpdExwPjA7IHVpMzJCaXRMcC0tKSB7CiAgICAgICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgdWk4Qnl0ZXNbdWkzMkJpdExwLTFdLCA4KTsKICAgICAgICB9CiAgICByZXR1cm4gOy8vdWkzMkJpdENudDsKfQoKc3RhdGljIHZvaWQgdG5nX19nZW5lcmF0ZV91ZSgKICAgIE1UWF9IRUFERVJfUEFSQU1TICpwTVRYX0hlYWRlciwKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqKmF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgSU1HX1VJTlQzMiB1aVZhbCkKewogICAgSU1HX1VJTlQzMiB1aUxwOwogICAgSU1HX1VJTlQ4IHVjWmVyb3M7CiAgICBJTUdfVUlOVDMyIHVpQ2h1bms7CgogICAgZm9yICh1aUxwPTEsIHVjWmVyb3M9MDsgICh1aUxwLTEpIDwgdWlWYWwgOyB1aUxwPXVpTHArdWlMcCwgdWNaZXJvcysrKQogICAgICAgIHVpVmFsPXVpVmFsLXVpTHA7CiAgICAvLyB1Y1plcm9zID0gbnVtYmVyIG9mIHByZWNlZGluZyB6ZXJvcyByZXF1aXJlZAogICAgLy8gdWlWYWwgPSB2YWx1ZSB0byBhcHBlbmQgYWZ0ZXIgemVyb3MgYW5kIDEgYml0CiAgICAvLyoqIFdyaXRlIHByZWNlZGluZyB6ZXJvcwogICAgZm9yICh1aUxwPShJTUdfVUlOVDMyKSB1Y1plcm9zOyB1aUxwKzE+ODsgdWlMcC09OCkKICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDgpOwogICAgLy8qKiBXcml0ZSB6ZXJvcyBhbmQgMSBiaXQgc2V0CiAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIChJTUdfVUlOVDgpIDEsIChJTUdfVUlOVDgpICh1aUxwKzEpKTsKICAgIC8vKiogV3JpdGUgTnVtZXJpYyBwYXJ0CiAgICB3aGlsZSAodWNaZXJvcz44KSB7CiAgICAgICAgdWNaZXJvcy09ODsKICAgICAgICB1aUNodW5rPSh1aVZhbCA+PiB1Y1plcm9zKTsKICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIChJTUdfVUlOVDgpIHVpQ2h1bmssIDgpOwogICAgICAgIHVpVmFsPXVpVmFsLSh1aUNodW5rIDw8IHVjWmVyb3MpOwogICAgfQogICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAoSU1HX1VJTlQ4KSB1aVZhbCwgdWNaZXJvcyk7CgogICAgcmV0dXJuIDsvL3VpMzJCaXRDbnRlcjsKfQoKc3RhdGljIHZvaWQgdG5nX19nZW5lcmF0ZV9zZSgKICAgIE1UWF9IRUFERVJfUEFSQU1TICpwTVRYX0hlYWRlciwKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqKmF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgaW50IGlWYWwpCnsKICAgIElNR19VSU5UMzIgdWlDb2RlTnVtOwoKICAgIGlmIChpVmFsID4gMCkKICAgICAgICB1aUNvZGVOdW09KElNR19VSU5UMzIpIChpVmFsK2lWYWwtMSk7CiAgICBlbHNlCiAgICAgICAgdWlDb2RlTnVtPShJTUdfVUlOVDMyKSAoLWlWYWwtaVZhbCk7CiAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgdWlDb2RlTnVtKTsKICAgIHJldHVybiA7Ly91aTMyQml0Q250ZXI7Cn0KCgpzdGF0aWMgdm9pZCB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKAogICAgTVRYX0hFQURFUl9QQVJBTVMgKnBNVFhfSGVhZGVyLAogICAgTVRYX0hFQURFUl9FTEVNRU5UICoqYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICBIRUFERVJfRUxFTUVOVF9UWVBFIHVpMzJUb2tlbikKewogICAgSU1HX1VJTlQ4IHVpOE9mZnNldCA9IDA7CiAgICBJTUdfVUlOVDggKnVpOFAgPSBOVUxMOwoKICAgIC8qIFdBIGZvciBrbG9ja3dvcmsgKi8KICAgIGlmICgocE1UWF9IZWFkZXItPnVpMzJFbGVtZW50cyAhPSBFTEVNRU5UU19FTVBUWSkgJiYKICAgICAgICAocE1UWF9IZWFkZXItPnVpMzJFbGVtZW50cyA+PSBNQVhOVU1CRVJFTEVNRU5UUykpIHsKICAgICAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0VSUk9SLCAiJXM6IG10eF9oZHItPnVpMzJFbG1lbnRzIG92ZXJmbG93XG4iLCBfX0ZVTkNUSU9OX18pOwogICAgICAgIHJldHVybjsKICAgIH0KCgogICAgaWYgKHBNVFhfSGVhZGVyLT51aTMyRWxlbWVudHMhPUVMRU1FTlRTX0VNUFRZKSB7CiAgICAgICAgaWYgKGF1aTMyRWxlbWVudFBvaW50ZXJzW3BNVFhfSGVhZGVyLT51aTMyRWxlbWVudHNdLT5FbGVtZW50X1R5cGU9PUVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEgfHwKICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnNbcE1UWF9IZWFkZXItPnVpMzJFbGVtZW50c10tPkVsZW1lbnRfVHlwZT09RUxFTUVOVF9SQVdEQVRBIHx8CiAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzW3BNVFhfSGVhZGVyLT51aTMyRWxlbWVudHNdLT5FbGVtZW50X1R5cGU9PUVMRU1FTlRfU1RBUlRDT0RFX01JREhEUikgewogICAgICAgICAgICAvL0FkZCBhIG5ldyBlbGVtZW50IGFsaWduZWQgdG8gd29yZCBib3VuZGFyeQogICAgICAgICAgICAvL0ZpbmQgUkFXQml0IHNpemUgaW4gYnl0ZXMgKHJvdW5kZWQgdG8gd29yZCBib3VuZGFyeSkpCiAgICAgICAgICAgIHVpOE9mZnNldD1hdWkzMkVsZW1lbnRQb2ludGVyc1twTVRYX0hlYWRlci0+dWkzMkVsZW1lbnRzXS0+dWk4U2l6ZSs4KzMxOyAvLyBOdW1iZXJvZlJhd2JpdHMgKGV4Y2x1ZGluZyBzaXplIG9mIGJpdCBjb3VudCBmaWVsZCkrIHNpemUgb2YgdGhlIGJpdGNvdW50IGZpZWxkCiAgICAgICAgICAgIHVpOE9mZnNldC89MzI7IC8vTm93IGNvbnRhaW5zIHJhd2JpdHMgc2l6ZSBpbiB3b3JkcwogICAgICAgICAgICB1aThPZmZzZXQrPTE7IC8vTm93IGNvbnRhaW5zIHJhd2JpdHMrZWxlbWVudF90eXBlIHNpemUgaW4gd29yZHMKICAgICAgICAgICAgdWk4T2Zmc2V0Kj00OyAvL0NvbnZlcnQgdG8gbnVtYmVyIG9mIGJ5dGVzICh0b3RhbCBzaXplIG9mIHN0cnVjdHVyZSBpbiBieXRlcywgYWxpZ25lZCB0byB3b3JkIGJvdW5kYXJ5KS4KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1aThPZmZzZXQ9NDsKICAgICAgICB9CiAgICAgICAgcE1UWF9IZWFkZXItPnVpMzJFbGVtZW50cysrOwogICAgICAgIHVpOFA9KElNR19VSU5UOCAqKSBhdWkzMkVsZW1lbnRQb2ludGVyc1twTVRYX0hlYWRlci0+dWkzMkVsZW1lbnRzLTFdOwogICAgICAgIHVpOFArPXVpOE9mZnNldDsKICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVyc1twTVRYX0hlYWRlci0+dWkzMkVsZW1lbnRzXT0oTVRYX0hFQURFUl9FTEVNRU5UICopIHVpOFA7CiAgICB9CiAgICBlbHNlCiAgICAgICAgcE1UWF9IZWFkZXItPnVpMzJFbGVtZW50cz0wOwoKICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzW3BNVFhfSGVhZGVyLT51aTMyRWxlbWVudHNdLT5FbGVtZW50X1R5cGU9dWkzMlRva2VuOwogICAgYXVpMzJFbGVtZW50UG9pbnRlcnNbcE1UWF9IZWFkZXItPnVpMzJFbGVtZW50c10tPnVpOFNpemU9MDsKfQoKLyoKICogSW50ZXJtZWRpYXJ5IGZ1bmN0aW9ucyB0byBidWlsZCBIMjY0IGhlYWRlcnMKICovCnN0YXRpYyB2b2lkIHRuZ19fSDI2NF93cml0ZWJpdHNfc3RhcnRjb2RlX3ByZWZpeF9lbGVtZW50KAogICAgTVRYX0hFQURFUl9QQVJBTVMgKnBNVFhfSGVhZGVyLAogICAgTVRYX0hFQURFUl9FTEVNRU5UICoqYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICBJTUdfVUlOVDMyIHVpMzJCeXRlU2l6ZSkKewogICAgLy8vKioqKiBHRU5FUkFURVMgVEhFIEZJUlNUIEVMRU1FTlQgT0YgVEhFIEgyNjRfU0VRVUVOQ0VfSEVBREVSKCkgU1RSVUNUVVJFICoqKiovLy8KICAgIElNR19VSU5UMzIgdWkzMkxwOwogICAgLy8gQnl0ZSBhbGlnbmVkIChiaXQgMCkKICAgIC8vKDMgYnl0ZXMgaW4gc2xpY2UgaGVhZGVyIHdoZW4gc2xpY2UgaXMgZmlyc3QgaW4gYSBwaWN0dXJlIHdpdGhvdXQgc2VxdWVuY2UvcGljdHVyZV9oZWFkZXIgYmVmb3JlIHBpY3R1cmUKCiAgICBmb3IgKHVpMzJMcD0wO3VpMzJMcDx1aTMyQnl0ZVNpemUtMTt1aTMyTHArKykKICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDgpOwogICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCA4KTsKICAgIC8vIEJ5dGUgYWxpZ25lZCAoYml0IDMyIG9yIDI0KQogICAgcmV0dXJuOwp9CgovLyBoZWxwZXIgZnVuY3Rpb24gdG8gc3RhcnQgbmV3IHJhdyBkYXRhIGJsb2NrCnN0YXRpYyBJTUdfQk9PTCBiU3RhcnROZXh0UmF3RGF0YUVsZW1lbnQgPSBJTUdfRkFMU0U7CnN0YXRpYyB2b2lkIENoZWNrU3RhcnRSYXdEYXRhRWxlbWVudChNVFhfSEVBREVSX1BBUkFNUyAqcE1UWF9IZWFkZXIsIE1UWF9IRUFERVJfRUxFTUVOVCAqKmF1aTMyRWxlbWVudFBvaW50ZXJzKQp7CiAgICBpZihiU3RhcnROZXh0UmF3RGF0YUVsZW1lbnQpCiAgICB7CiAgICAgICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfUkFXREFUQSk7CiAgICAgICAgYlN0YXJ0TmV4dFJhd0RhdGFFbGVtZW50ID0gSU1HX0ZBTFNFOwogICAgfQp9CgoKc3RhdGljIHZvaWQgdG5nX19pbnNlcnRfcHJlZml4X25hbF9oZWFkZXIoTVRYX0hFQURFUl9QQVJBTVMgKnBNVFhfSGVhZGVyLCBNVFhfSEVBREVSX0VMRU1FTlQgKiphdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICBIMjY0X1NMSUNFX0hFQURFUl9QQVJBTVMgKnBTbEhQYXJhbXMsIElNR19CT09MIF9fbWF5YmVfdW51c2VkIGJDYWJhY0VuYWJsZWQpCnsKICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX1NUQVJUQ09ERV9SQVdEQVRBKTsKCiAgICB0bmdfX0gyNjRfd3JpdGViaXRzX3N0YXJ0Y29kZV9wcmVmaXhfZWxlbWVudChwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBTbEhQYXJhbXMtPnVpOFN0YXJ0X0NvZGVfUHJlZml4X1NpemVfQnl0ZXMpOyAvL0NhbiBiZSAzIG9yIDQgYnl0ZXMgLSBhbHdheXMgNCBieXRlcyBpbiBvdXIgaW1wbGVtZW50YXRpb25zCiAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9SQVdEQVRBKTsKCiAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsICAgICAgICAwLCAxKTsgICAvLyBmb3JiaWRkZW5femVyb19iaXQKCiAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9SRUZFUkVOQ0UpOyAvL01UWCBmaWxscyB0aGlzIHZhbHVlIGluCiAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9SQVdEQVRBKTsKCiAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDE0LCA1KTsgICAgLy8gbmFsIHVuaXQgdHlwZQoKICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgICAgMCwgMSk7ICAgLy8gU1ZDIGV4dGVuc2lvbiBmbGFnCgogICAgLy8gbmFsX3VuaXRfaGVhZGVyX212Y19leHRlbnNpb24oKQogICAgewogICAgICAgIGlmIChwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgPT0gU0xIUF9JRFJfU0xJQ0VGUkFNRV9UWVBFKSB7CiAgICAgICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgICAgMCwgMSk7ICAgLy8gbm9uX2lkcl9mbGFnIGZsYWcKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsICAgIDEsIDEpOyAgIC8vIG5vbl9pZHJfZmxhZyBmbGFnCiAgICAgICAgfQoKICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsICAgIDAsIDYpOyAgIC8vIHByaW9yaXR5X2lkIGZsYWcKICAgICAgICB0bmdfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAgICAwLCAxMCk7ICAgLy8gdmlld19pZCBmbGFnCgogICAgICAgIC8vdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAgICAwLCAzKTsgICAvLyB0ZW1wb3JhbF9pZCBmbGFnCiAgICAgICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfVEVNUE9SQUxfSUQpOyAvLyB0ZW1wb3JhbF9pZCBmbGFnCgogICAgICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX0FOQ0hPUl9QSUNfRkxBRyk7IC8vIGFuY2hvcl9waWNfZmxhZwoKICAgICAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9SQVdEQVRBKTsKCiAgICAgICAgaWYgKHBTbEhQYXJhbXMtPlNsaWNlRnJhbWVfVHlwZSA9PSBTTEhQX0JfU0xJQ0VGUkFNRV9UWVBFKSB7CiAgICAgICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgICAgMCwgMSk7ICAgLy8gaW50ZXJ2aWV3IGZsYWcKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsICAgIDEsIDEpOyAgIC8vIGludGVydmlldyBmbGFnCiAgICAgICAgfQoKICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsICAgIDEsIDEpOyAgIC8vIHJlc2VydmVkIG9uZSBiaXQKICAgIH0KCn0KCnN0YXRpYyB2b2lkIHRuZ19fSDI2NF93cml0ZWJpdHNfVlVJX3BhcmFtcygKICAgIE1UWF9IRUFERVJfUEFSQU1TICpwTVRYX0hlYWRlciwKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqKmF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgSDI2NF9WVUlfUEFSQU1TICpWVUlQYXJhbXMpCnsKCS8vIEJ1aWxkcyBWVUkgUGFyYW1zIGZvciB0aGUgU2VxdWVuY2UgSGVhZGVyIChvbmx5IHByZXNlbnQgaW4gdGhlIDFzdCBzZXF1ZW5jZSBvZiBzdHJlYW0pCgl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsCgkoMCA8PCA0KSB8CS8vIGFzcGVjdF9yYXRpb19pbmZvX3ByZXNlbnRfZmxhZyA9IDAgaW4gVG9wYXoKCSgwIDw8IDMpIHwJLy8gb3ZlcnNjYW5faW5mb19wcmVzZW50X2ZsYWcgKDEgYml0KSA9IDAgaW4gVG9wYXoKCSgwIDw8IDIpIHwJLy8gdmlkZW9fc2lnbmFsX3R5cGVfcHJlc2VudF9mbGFnICgxIGJpdCkgPSAwIGluIFRvcGF6CgkoMCA8PCAxKSB8CS8vIGNocm9tYV9sb2NfaW5mb19wcmVzZW50X2ZsYWcgKDEgYml0KSA9IDAgaW4gVG9wYXoKCSgxKSwJCQkJCQkJCQkJCQkvLyB0aW1pbmdfaW5mb19wcmVzZW50X2ZsYWcgKDEgYml0KSA9IDEgaW4gVG9wYXoKCTUpOwoJLy8gbnVtX3VuaXRzX2luX3RpY2sgKDMyIGJpdHMpID0gMSBpbiBUb3BhegogICAgICAgIHRuZ19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIFZVSVBhcmFtcy0+bnVtX3VuaXRzX2luX3RpY2ssIDMyKTsKCgkvLyB0aW1lX3NjYWxlICgzMiBiaXRzKSA9IGZyYW1lIHJhdGUKCXRuZ19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIFZVSVBhcmFtcy0+VGltZV9TY2FsZSwgMzIpOwoJdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCAxKTsJLy8gZml4ZWRfZnJhbWVfcmF0ZV9mbGFnICgxIGJpdCkgPSAxIGluIFRvcGF6Cgl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDEpOwkvLyBuYWxfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnICgxIGJpdCkgPSAxIGluIFRvcGF6CgkvLyoqIERlZmluaXRpb25zIGZvciBuYWxfaHJkX3BhcmFtZXRlcnMoKSBjb250YWluZWQgaW4gVlVJIHN0cnVjdHVyZSBmb3IgVG9wYXoKCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSwgMSk7CS8vIGNwYl9jbnRfbWludXMxIHVlKHYpID0gMCBpbiBUb3BheiA9IDFiCgl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDQpOwkvLyBiaXRfcmF0ZV9zY2FsZSAoNCBiaXRzKSA9IDAgaW4gVG9wYXoKCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMiwgNCk7CS8vIGNwYl9zaXplX3NjYWxlICg0IGJpdHMpID0gMiBpbiBUb3BhegoKCXRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBWVUlQYXJhbXMtPmJpdF9yYXRlX3ZhbHVlX21pbnVzMSk7IC8vIGJpdF9yYXRlX3ZhbHVlX21pbnVzMVswXSB1ZSh2KSA9IChCaXRyYXRlLzY0KS0xIFtSQU5HRTowIHRvICgyXjMyKS0yXQoJdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIFZVSVBhcmFtcy0+Y2JwX3NpemVfdmFsdWVfbWludXMxKTsgLy8gY3BiX3NpemVfdmFsdWVfbWludXMxWzBdIHVlKHYpID0gKENQQl9CaXRzX1NpemUvMTYpLTEgICB3aGVyZSBDUEJfQml0c19TaXplID0gMS41ICogQml0cmF0ZSAgW1JBTkdFOjAgdG8gKDJeMzIpLTJdCgl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIFZVSVBhcmFtcy0+Q0JSLDEpOy8vIGNicl9mbGFnWzBdICgxIGJpdCkgPSAwIGZvciBWQlIsIDEgZm9yIENCUgoJdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBWVUlQYXJhbXMtPmluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoX21pbnVzMSwgNSk7IC8vIGluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoX21pbnVzMSAoNSBiaXRzKSA9ID8/PwoJdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBWVUlQYXJhbXMtPmNwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aF9taW51czEsIDUpOyAvLyBjcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxICg1IGJpdHMpID0gPz8/Cgl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIFZVSVBhcmFtcy0+ZHBiX291dHB1dF9kZWxheV9sZW5ndGhfbWludXMxLCA1KTsgLy8gZHBiX291dHB1dF9kZWxheV9sZW5ndGhfbWludXMxICg1IGJpdHMpID0gPz8/Cgl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIFZVSVBhcmFtcy0+dGltZV9vZmZzZXRfbGVuZ3RoLCA1KTsgLy8gdGltZV9vZmZzdF9sZW5ndGggKDUgYml0cykgPSA/Pz8KCS8vLyoqIEVuZCBvZiBuYWxfaHJkX3BhcmFtZXRlcnMoKQoJdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwLCAxKTsJLy8gdmNsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyAoMSBiaXQpID0gMCBpbiBUb3BhegoJLy9pZiggbmFsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyAgfHwgIHZjbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgKQoJLy9GSVggZm9yIEJSTjIzMDM5CgkvLwlsb3dfZGVsYXlfaHJkX2ZsYWcKCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMSk7CS8vIGxvd19kZWxheV9ocmRfZmxhZwoKCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMSk7CS8vIHBpY19zdHJ1Y3RfcHJlc2VudF9mbGFnICgxIGJpdCkgPSAwIGluIFRvcGF6Cgl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDEpOwkvLyBiaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZyAoMSBiaXQpID0gMCBpbiBUb3Bhegp9CgoKc3RhdGljIHZvaWQgdG5nX19IMjY0RVNfd3JpdGViaXRzX3BpY3R1cmVfaGVhZGVyKAogICAgTVRYX0hFQURFUl9QQVJBTVMgKnBNVFhfSGVhZGVyLAogICAgTVRYX0hFQURFUl9FTEVNRU5UICoqYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICBIMjY0X1BJQ1RVUkVfSEVBREVSX1BBUkFNUyAqcFBIUGFyYW1zLAogICAgSDI2NF9TQ0FMSU5HX01BVFJJWF9QQVJBTVMgX19tYXliZV91bnVzZWQgKiBwc1NjYWxpbmdNYXRyaXgpCnsKI2lmZGVmIF9UT1BBWkhQX1RSQUNFXwogICAgZHJ2X2RlYnVnX21zZyhWSURFT19ERUJVR19HRU5FUkFMLCAiJXM6IHBpY19wYXJhbWV0ZXJfc2V0X2lkID0gJWRcbiIsX19GVU5DVElPTl9fLCBwUEhQYXJhbXMtPnBpY19wYXJhbWV0ZXJfc2V0X2lkKTsKICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgIiVzOiBzZXFfcGFyYW1ldGVyX3NldF9pZCA9ICVkXG4iLF9fRlVOQ1RJT05fXywgcFBIUGFyYW1zLT5zZXFfcGFyYW1ldGVyX3NldF9pZCk7CiAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0dFTkVSQUwsICIlczogZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnID0gJWRcbiIsX19GVU5DVElPTl9fLCBwUEhQYXJhbXMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyk7CiAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0dFTkVSQUwsICIlczogd2VpZ2h0ZWRfcHJlZF9mbGFnID0gJWRcbiIsX19GVU5DVElPTl9fLCBwUEhQYXJhbXMtPndlaWdodGVkX3ByZWRfZmxhZyk7CiAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0dFTkVSQUwsICIlczogd2VpZ2h0ZWRfYmlwcmVkX2lkYyA9ICVkXG4iLF9fRlVOQ1RJT05fXywgcFBIUGFyYW1zLT53ZWlnaHRlZF9iaXByZWRfaWRjKTsKICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgIiVzOiBjaHJvbWFfcXBfaW5kZXhfb2Zmc2V0ID0gJWRcbiIsX19GVU5DVElPTl9fLCBwUEhQYXJhbXMtPmNocm9tYV9xcF9pbmRleF9vZmZzZXQpOwogICAgZHJ2X2RlYnVnX21zZyhWSURFT19ERUJVR19HRU5FUkFMLCAiJXM6IGNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZyA9ICVkXG4iLF9fRlVOQ1RJT05fXywgcFBIUGFyYW1zLT5jb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWcpOwogICAgZHJ2X2RlYnVnX21zZyhWSURFT19ERUJVR19HRU5FUkFMLCAiJXM6IHRyYW5zZm9ybV84eDhfbW9kZV9mbGFnID0gJWRcbiIsX19GVU5DVElPTl9fLCBwUEhQYXJhbXMtPnRyYW5zZm9ybV84eDhfbW9kZV9mbGFnKTsKICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgIiVzOiBwaWNfc2NhbGluZ19tYXRyaXhfcHJlc2VudF9mbGFnID0gJWRcbiIsX19GVU5DVElPTl9fLCBwUEhQYXJhbXMtPnBpY19zY2FsaW5nX21hdHJpeF9wcmVzZW50X2ZsYWcpOwogICAgZHJ2X2RlYnVnX21zZyhWSURFT19ERUJVR19HRU5FUkFMLCAiJXM6IGJVc2VEZWZhdWx0U2NhbGluZ0xpc3QgPSAlZFxuIixfX0ZVTkNUSU9OX18sIHBQSFBhcmFtcy0+YlVzZURlZmF1bHRTY2FsaW5nTGlzdCk7CiAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0dFTkVSQUwsICIlczogc2Vjb25kX2Nocm9tYV9xcF9pbmRleF9vZmZzZXQgPSAlZFxuIixfX0ZVTkNUSU9OX18sIHBQSFBhcmFtcy0+c2Vjb25kX2Nocm9tYV9xcF9pbmRleF9vZmZzZXQpOwojZW5kaWYKICAgIC8vKiotLSBCZWdpbiBidWlsZGluZyB0aGUgcGljdHVyZSBoZWFkZXIgZWxlbWVudAogICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwogICAgdG5nX19IMjY0X3dyaXRlYml0c19zdGFydGNvZGVfcHJlZml4X2VsZW1lbnQocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCA0KTsKCiAgICAvLy8qIEdFTkVSQVRFUyBUSEUgRklSU1QgKFNUQVRJQykgRUxFTUVOVCBPRiBUSEUgSDI2NF9QSUNUVVJFX0hFQURFUigpIFNUUlVDVFVSRSAqLy8vCiAgICAvLy8qKioqIEVMRU1FTlQgQklUQ09VTlQ6IDE4CgogICAgLy8gNCBCeXRlIFN0YXJ0Q29kZVByZWZpeCBQcmVnZW5lcmF0ZWQgaW46IEgyNjRfV3JpdGVCaXRzX1N0YXJ0Q29kZVByZWZpeF9FbGVtZW50KCkKICAgIC8vIEJ5dGUgYWxpZ25lZCAoYml0IDMyKQogICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwIDw8IDcpIHwgICAgLy8gZm9yYmlkZGVuX3plcm9fYml0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMyA8PCA1KSB8ICAgIC8vIG5hbF9yZWZfaWRjICgyIGJpdHMpID0gMHgzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOCksICAvLyBuYWxfdW5pdF90cHllICg1IGJpdHMpID0gOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCk7CiAgIC8vIEJ5dGUgYWxpZ25lZCAoYml0IDQwKQogICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBQSFBhcmFtcy0+cGljX3BhcmFtZXRlcl9zZXRfaWQpOyAgLy8gcGljX3BhcmFtZXRlcl9zZXRfaWQgdWUodikKICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwUEhQYXJhbXMtPnNlcV9wYXJhbWV0ZXJfc2V0X2lkKTsgIC8vIHNlcV9wYXJhbWV0ZXJfc2V0X2lkIHVlKHYpCiAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBQSFBhcmFtcy0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnIDw8IDQpIHwgICAgLy8gZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnICgxIGJpdCkgMCBmb3IgQ0FWTEMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwIDw8IDMpIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGljX29yZGVyX3ByZXNlbnRfZmxhZyAoMSBiaXQpID0gMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMikgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBudW1fc2xpY2VfZ3JvdXBfbWludXMxIHVlKHYpID0gMCBpbiBUb3BhegogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMSkgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBudW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxIHVlKHYpID0gMCBpbiBUb3BhegogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgdWUodikgPSAwIGluIFRvcGF6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1KTsKICAgIC8vIFdFSUdIVEVEIFBSRURJQ1RJT04KICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgIChwUEhQYXJhbXMtPndlaWdodGVkX3ByZWRfZmxhZyA8PCAyKSB8ICAvLyB3ZWlnaHRlZF9wcmVkX2ZsYWcgKDEgYml0KQogICAgICAgIChwUEhQYXJhbXMtPndlaWdodGVkX2JpcHJlZF9pZGMpLCAgICAgICAgICAgLy8gd2VpZ2h0ZWRfYmlwcmVkX2ZsYWcgKDIgYml0cykKICAgICAgICAzKTsKCiAgICAvL01UWCBmaWxscyB0aGlzIHZhbHVlIGluCiAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9RUCk7CiAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9SQVdEQVRBKTsKCiAgICAvLy8qKioqIEdFTkVSQVRFUyBUSEUgU0VDT05EIEVMRU1FTlQgT0YgVEhFIEgyNjRfUElDVFVSRV9IRUFERVIoKSBTVFJVQ1RVUkUgKioqKi8vLwogICAgLy8vKioqKiBFTEVNRU5UIEJJVENPVU5UOiA1CiAgICAvL1RoZSBmb2xsb3dpbmcgZmllbGQgd2lsbCBiZSBnZW5lcmF0ZWQgYXMgYSBzcGVjaWFsIGNhc2UgYnkgTVRYIC0gc28gbm90IGhlcmUKICAgIC8vIHRuZ19fZ2VuZXJhdGVfc2UocE1UWF9IZWFkZXIsIHBQSFBhcmFtcy0+cGljX2luaXRfcXBfbWludXMyNik7IC8vIHBpY19pbnRfcXBfbWludXMyNiBzZSh2KSA9IC0yNiB0byAyNSBpbiBUb3BhegogICAgLy8gcGljX2ludF9xc19taW51czI2IHNlKHYpID0gMCBpbiBUb3BhegogICAgdG5nX19nZW5lcmF0ZV9zZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDApOwoKICAgIC8vIGNocm9tYV9xcF9pbmRleF9vZmZzZXQgc2UodikgPSAwIGluIFRvcGF6CiAgICB0bmdfX2dlbmVyYXRlX3NlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgcFBIUGFyYW1zLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0KTsKCiAgICAvLyBkZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZyAoMSBiaXQpID0gMSBpbiBUb3BhegogICAgLy8gY29uc3RyYWluZWRfaW50cmFfcHJlZF9GbGFnICgxIGJpdCkgPSAwIGluIFRvcGF6CiAgICAvLyByZWR1bmRhbnRfcGljX2NudF9wcmVzZW50X2ZsYWcgKDEgYml0KSA9IDAgaW4gVG9wYXoKICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgKDEgPDwgMikgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBQSFBhcmFtcy0+Y29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnIDw8IDEpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMpOwoKICAgIGlmIChwUEhQYXJhbXMtPnRyYW5zZm9ybV84eDhfbW9kZV9mbGFnIHx8CiAgICAgICAgKHBQSFBhcmFtcy0+c2Vjb25kX2Nocm9tYV9xcF9pbmRleF9vZmZzZXQgIT0gcFBIUGFyYW1zLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0KSB8fAogICAgICAgIHBQSFBhcmFtcy0+cGljX3NjYWxpbmdfbWF0cml4X3ByZXNlbnRfZmxhZykgewogICAgICAgIC8vIDh4OCB0cmFuc2Zvcm0gZmxhZwogICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgcFBIUGFyYW1zLT50cmFuc2Zvcm1fOHg4X21vZGVfZmxhZywgMSk7CiAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwLCAxKTsKICAgICAgICAvLyBzZWNvbmRfY2hyb21hX3FwX2luZGV4X29mZnNldCBzZSh2KSA9IDAgaW4gVG9wYXoKICAgICAgICB0bmdfX2dlbmVyYXRlX3NlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgcFBIUGFyYW1zLT5zZWNvbmRfY2hyb21hX3FwX2luZGV4X29mZnNldCk7CiAgICB9CgogICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfSU5TRVJUQllURUFMSUdOX0gyNjQpOyAvLyBUZWxsIE1UWCB0byBpbnNlcnQgdGhlIGJ5dGUgYWxpZ24gZmllbGQgKHdlIGRvbid0IGtub3cgZmluYWwgc3RyZWFtIHNpemUgZm9yIGFsaWdubWVudCBhdCB0aGlzIHBvaW50KQogICAgZHJ2X2RlYnVnX21zZyhWSURFT19ERUJVR19HRU5FUkFMLCAiJXM6IGVuZFxuIixfX0ZVTkNUSU9OX18pOwoKICAgIHJldHVybjsKfQoKc3RhdGljIHZvaWQgdG5nX19IMjY0RVNfd3JpdGViaXRzX3NjYWxpbmdsaXN0cygKICAgIE1UWF9IRUFERVJfUEFSQU1TICpwTVRYX0hlYWRlciwKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqKmF1aTMyRWxlbWVudFBvaW50ZXJzLCAKICAgIEgyNjRfU0NBTElOR19NQVRSSVhfUEFSQU1TICogcHNTY2FsaW5nTWF0cml4LAogICAgSU1HX0JPT0wgYldyaXRlOHg4KQp7CgkvLyBVc2VkIGJ5IEgyNjRfV3JpdGVCaXRzX1NlcXVlbmNlSGVhZGVyIGFuZCBIMjY0X1dyaXRlQml0c19QaWN0dXJlSGVhZGVyCglJTUdfVUlOVDMyCXVpMzJMaXN0LCB1aTMySW5kZXg7CglJTUdfSU5UMzIJaTMyQ3VyU2NhbGUsIGkzMkRlbHRhU2NhbGU7CgoJaWYgKCFwc1NjYWxpbmdNYXRyaXgpCgl7CgkJdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfQ1VTVE9NX1FVQU5UKTsKCQlyZXR1cm47Cgl9CgoJZm9yICh1aTMyTGlzdCA9IDA7IHVpMzJMaXN0IDwgNjsgdWkzMkxpc3QrKykKCXsKCQlpZiAocHNTY2FsaW5nTWF0cml4LT51aTMyTGlzdE1hc2sgJiAoMSA8PCB1aTMyTGlzdCkpCgkJewoJCQl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDEpOyAJLy8gc2VxX3NjYWxpbmdfbGlzdF9wcmVzZW50X2ZsYWdbdWkzMkxpc3RdID0gMQoKCQkJaTMyQ3VyU2NhbGUgPSA4OwoJCQlmb3IgKHVpMzJJbmRleCA9IDA7IHVpMzJJbmRleCA8IDE2OyB1aTMySW5kZXgrKykKCQkJewoJCQkJaTMyRGVsdGFTY2FsZSA9ICgoSU1HX0lOVDMyKXBzU2NhbGluZ01hdHJpeC0+dWk4U2NhbGluZ0xpc3RzNHg0W3VpMzJMaXN0XVt1aTMySW5kZXhdKSAtIGkzMkN1clNjYWxlOwoJCQkJaTMyQ3VyU2NhbGUgKz0gaTMyRGVsdGFTY2FsZTsKCQkJCXRuZ19fZ2VuZXJhdGVfc2UocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBpMzJEZWx0YVNjYWxlKTsgCS8vIGRlbHRhX3NjYWxlCgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwLCAxKTsgCS8vIHNlcV9zY2FsaW5nX2xpc3RfcHJlc2VudF9mbGFnW3VpMzJMaXN0XSA9IDAKCQl9Cgl9CgoJaWYgKCFiV3JpdGU4eDgpIHJldHVybjsKCglmb3IgKDsgdWkzMkxpc3QgPCA4OyB1aTMyTGlzdCsrKQoJewoJCWlmIChwc1NjYWxpbmdNYXRyaXgtPnVpMzJMaXN0TWFzayAmICgxIDw8IHVpMzJMaXN0KSkKCQl7CgkJCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSwgMSk7IAkvLyBzZXFfc2NhbGluZ19saXN0X3ByZXNlbnRfZmxhZ1t1aTMyTGlzdF0gPSAxCgoJCQlpMzJDdXJTY2FsZSA9IDg7CgkJCWZvciAodWkzMkluZGV4ID0gMDsgdWkzMkluZGV4IDwgNjQ7IHVpMzJJbmRleCsrKQoJCQl7CgkJCQlpMzJEZWx0YVNjYWxlID0gKChJTUdfSU5UMzIpcHNTY2FsaW5nTWF0cml4LT51aThTY2FsaW5nTGlzdHM4eDhbdWkzMkxpc3QgLSA2XVt1aTMySW5kZXhdKSAtIGkzMkN1clNjYWxlOwoJCQkJaTMyQ3VyU2NhbGUgKz0gaTMyRGVsdGFTY2FsZTsKCQkJCXRuZ19fZ2VuZXJhdGVfc2UocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBpMzJEZWx0YVNjYWxlKTsJCS8vIGRlbHRhX3NjYWxlCgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwLCAxKTsgCS8vIHNlcV9zY2FsaW5nX2xpc3RfcHJlc2VudF9mbGFnW3VpMzJMaXN0XSA9IDAKCQl9Cgl9Cgp9CgpzdGF0aWMgdm9pZCB0bmdfX0gyNjRFU193cml0ZWJpdHNfc2VxdWVuY2VfaGVhZGVyKAogICAgTVRYX0hFQURFUl9QQVJBTVMgKnBNVFhfSGVhZGVyLAogICAgTVRYX0hFQURFUl9FTEVNRU5UICoqYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICBIMjY0X1NFUVVFTkNFX0hFQURFUl9QQVJBTVMgKnBTSFBhcmFtcywKICAgIEgyNjRfQ1JPUF9QQVJBTVMgKnBzQ3JvcCwKICAgIEgyNjRfU0NBTElOR19NQVRSSVhfUEFSQU1TICogcHNTY2FsaW5nTWF0cml4LAogICAgSU1HX0JPT0w4IF9fbWF5YmVfdW51c2VkIGJBU08pCnsKICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX1NUQVJUQ09ERV9SQVdEQVRBKTsKICAgIHRuZ19fSDI2NF93cml0ZWJpdHNfc3RhcnRjb2RlX3ByZWZpeF9lbGVtZW50KHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgNCk7CgoKICAgIC8vLyoqKiogR0VORVJBVEVTIFRIRSBGSVJTVCBFTEVNRU5UIE9GIFRIRSBIMjY0X1NFUVVFTkNFX0hFQURFUigpIFNUUlVDVFVSRSAqKioqLy8vCiAgICAvLyA0IEJ5dGUgU3RhcnRDb2RlUHJlZml4IFByZWdlbmVyYXRlZCBpbjogSDI2NF9Xcml0ZUJpdHNfU3RhcnRDb2RlUHJlZml4X0VsZW1lbnQoKQogICAgLy8gQnl0ZSBhbGlnbmVkIChiaXQgMzIpCiAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgCiAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsKDAgPDwgNykgfCAvLyBmb3JiaWRkZW5femVyb19iaXQ9MAoJKDB4MyA8PCA1KSB8IC8vIG5hbF9yZWZfaWRjPTB4MwoJKDcpLCAvLyBuYWxfdW5pdF90eXBlPTAwMTExCiAgICAgICAgOCk7CiAgICAvLyBCeXRlIGFsaWduZWQgKGJpdCA0MCkKICAgIHN3aXRjaCAocFNIUGFyYW1zLT51Y1Byb2ZpbGUpIHsKICAgICAgICBjYXNlIFNIX1BST0ZJTEVfQlA6CgkgICAgLy8gcHJvZmlsZV9pZGMgPSA4IGJpdHMgPSA2NiBmb3IgQlAgKFBST0ZJTEVfSURDX0JQKQogICAgICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDY2LCA4KTsKCiAgICAgICAgICAgIC8vIEJ5dGUJYWxpZ25lZAkoYml0IDQ4KQogICAgICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAoMSA8PCA3KSB8ICAgIC8vIGNvbnN0cmFpbnRfc2V0MF9mbGFnID0gMSBmb3IgQlAgY29uc3RyYWludHMKICAgICAgICAgICAgICAgICgwIDw8IDYpIHwgICAgLy8gY29uc3RyYWludF9zZXQxX2ZsYWcgPSAwIGZvciBNUCBjb25zdHJhaW50cwogICAgICAgICAgICAgICAgKDAgPDwgNSkgfCAgICAvLyBjb25zdHJhaW50X3NldDJfZmxhZyA9IDAgZm9yIEVQIGNvbnN0cmFpbnRzCiAgICAgICAgICAgICAgICAoKHBTSFBhcmFtcy0+dWNMZXZlbD09U0hfTEVWRUxfMUIgPyAxOjApIDw8IDQpLCAgLy8gY29uc3RyYWludF9zZXQzX2ZsYWcgPSAxIGZvciBsZXZlbCAxYiwgMCBmb3Igb3RoZXJzCiAgICAgICAgICAgICAgICAvLyByZXNlcnZlZF96ZXJvXzRiaXRzID0gMAogICAgICAgICAgICAgICAgOCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU0hfUFJPRklMRV9NUDoKICAgICAgICAgICAgLy8gcHJvZmlsZV9pZGMgPSA4IGJpdHMgPSA3NyBmb3IgTVAgKFBST0ZJTEVfSURDX01QKQogICAgICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDc3LCA4KTsKCiAgICAgICAgICAgIC8vIEJ5dGUgYWxpZ25lZCAoYml0IDQ4KQogICAgICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAoMCA8PCA3KSB8IC8vIGNvbnN0cmFpbnRfc2V0MF9mbGFnID0gMCBmb3Igbm8gQlAgY29uc3RyYWludHMKICAgICAgICAgICAgICAgICgxIDw8IDYpIHwgLy8gY29uc3RyYWludF9zZXQxX2ZsYWcgPSAxIGZvciBNUCBjb25zdHJhaW50cwogICAgICAgICAgICAgICAgKDAgPDwgNSkgfCAvLyBjb25zdHJhaW50X3NldDJfZmxhZyA9IDAgZm9yIEVQIGNvbnN0cmFpbnRzCiAgICAgICAgICAgICAgICAoKHBTSFBhcmFtcy0+dWNMZXZlbD09U0hfTEVWRUxfMUIgPyAxOjApIDw8IDQpLCAgICAvLyBjb25zdHJhaW50X3NldDNfZmxhZyA9IDEgZm9yIGxldmVsIDFiLCAwIGZvciBvdGhlcnMKICAgICAgICAgICAgICAgIC8vIHJlc2VydmVkX3plcm9fNGJpdHMgPSAwCiAgICAgICAgICAgICAgICA4KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTSF9QUk9GSUxFX0hQOgogICAgICAgICAgICAvLyBwcm9maWxlX2lkYyA9IDggYml0cyA9IDEwMCBmb3IgSFAgKFBST0ZJTEVfSURDX0hQKQogICAgICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEwMCwgOCk7CiAgICAgICAgICAgIC8vIEJ5dGUgYWxpZ25lZCAoYml0IDQ4KQogICAgICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAoMCA8PCA3KSB8IC8vIGNvbnN0cmFpbnRfc2V0MF9mbGFnID0gMCBmb3Igbm8gQlAgY29uc3RyYWludHMKICAgICAgICAgICAgICAgICgwIDw8IDYpIHwgLy8gY29uc3RyYWludF9zZXQxX2ZsYWcgPSAwIGZvciBubyBNUCBjb25zdHJhaW50cwogICAgICAgICAgICAgICAgKDAgPDwgNSkgfCAvLyBjb25zdHJhaW50X3NldDJfZmxhZyA9IDAgZm9yIG5vIEVQIGNvbnN0cmFpbnRzCiAgICAgICAgICAgICAgICAoMCA8PCA0KSwgIC8vIGNvbnN0cmFpbnRfc2V0M19mbGFnID0gMAogICAgICAgICAgICAgICAgLy8gcmVzZXJ2ZWRfemVyb180Yml0cyA9IDAKICAgICAgICAgICAgICAgIDgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFNIX1BST0ZJTEVfSDQ0NFA6CiAgICAgICAgICAgIC8vIHByb2ZpbGVfaWRjID0gOCBiaXRzID0gMjQ0IGZvciBINDQ0UCAoUFJPRklMRV9JRENfSDQ0NFApCiAgICAgICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMjQ0LCA4KTsKCiAgICAgICAgICAgIC8vIEJ5dGUgYWxpZ25lZCAoYml0IDQ4KQogICAgICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAoMCA8PCA3KSB8ICAgICAgLy8gY29uc3RyYWludF9zZXQwX2ZsYWcgPSAwIGZvciBubyBCUCBjb25zdHJhaW50cwogICAgICAgICAgICAgICAgKDAgPDwgNikgfCAgICAgIC8vIGNvbnN0cmFpbnRfc2V0MV9mbGFnID0gMCBmb3Igbm8gTVAgY29uc3RyYWludHMKICAgICAgICAgICAgICAgICgwIDw8IDUpIHwgICAgICAvLyBjb25zdHJhaW50X3NldDJfZmxhZyA9IDAgZm9yIG5vIEVQIGNvbnN0cmFpbnRzCiAgICAgICAgICAgICAgICAoMCA8PCA0KSwJICAgICAgICAvLyBjb25zdHJhaW50X3NldDNfZmxhZyA9IDAKICAgICAgICAgICAgICAgIC8vIHJlc2VydmVkX3plcm9fNGJpdHMgPSAwCiAgICAgICAgICAgICAgICA4KTsKICAgICAgICAgICAgYnJlYWs7Cgl9CgoKICAgIC8vIEJ5dGUgYWxpZ25lZCAoYml0IDU2KQogICAgLy8gbGV2ZWxfaWRjICg4IGJpdHMpID0gMTEgZm9yIDFiLCAxMHhsZXZlbCBmb3Igb3RoZXJzCiAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIChwU0hQYXJhbXMtPnVjTGV2ZWwgPT0gU0hfTEVWRUxfMUIpID8gMTEgOiAoSU1HX1VJTlQ4KXBTSFBhcmFtcy0+dWNMZXZlbCwgOCk7CiAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCk7CQkvLyBzZXFfcGFyYW1ldGVyX3NldF9pZCA9IDAKCiAgICBpZiAoKHBTSFBhcmFtcy0+dWNQcm9maWxlID09IFNIX1BST0ZJTEVfSFApIHx8IChwU0hQYXJhbXMtPnVjUHJvZmlsZSA9PSBTSF9QUk9GSUxFX0g0NDRQKSkgewogICAgICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxKTsgICAgLy8gY2hyb21hX2Zvcm1hdF9pZGMgPSAxCiAgICAgICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDApOyAgICAvLyBiaXRfZGVwdGhfbHVtYV9taW51czggPSAwCiAgICAgICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDApOyAgICAvLyBiaXRfZGVwdGhfY2hyb21hX21pbnVzOCA9IDAKICAgICAgICAvLyBxcHByaW1lX3lfemVyb190cmFuc2Zvcm1fYnlwYXNzX2ZsYWcgPSAxIGlmIGxvc3NsZXNzCiAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwU0hQYXJhbXMtPmJJc0xvc3NsZXNzPzE6MCwgMSk7CiAgICAgICAgaWYgKHBTSFBhcmFtcy0+YlVzZURlZmF1bHRTY2FsaW5nTGlzdCB8fCBwU0hQYXJhbXMtPnNlcV9zY2FsaW5nX21hdHJpeF9wcmVzZW50X2ZsYWcpIHsKICAgICAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCAxKTsgCS8vIHNlcV9zY2FsaW5nX21hdHJpeF9wcmVzZW50X2ZsYWcKICAgICAgICAgICAgaWYgKCFwU0hQYXJhbXMtPmJVc2VEZWZhdWx0U2NhbGluZ0xpc3QpIHsKICAgICAgICAgICAgICAgIHRuZ19fSDI2NEVTX3dyaXRlYml0c19zY2FsaW5nbGlzdHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwc1NjYWxpbmdNYXRyaXgsIElNR19UUlVFKTsKICAgICAgICAgICAgICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX1JBV0RBVEEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gc2VxX3NjYWxpbmdfbGlzdF9wcmVzZW50X2ZsYWdbaV0gPSAwOyAwIDwgaSA8IDgKICAgICAgICAgICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgOCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDEpOyAgLy8gc2VxX3NjYWxpbmdfbWF0cml4X3ByZXNlbnRfZmxhZwogICAgICAgIH0KICAgIH0KCiAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSk7ICAvLyBsb2cyX21heF9mcmFtZV9udW1fbWludXM0ID0gMQogICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDApOyAgLy8gcGljX29yZGVyX2NudF90eXBlID0gMAogICAgLy8gbG9nMl9tYXhfcGljX29yZGVyX2NudF9Jc2JfbWludXM0ID0gMgogICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBTSFBhcmFtcy0+bG9nMl9tYXhfcGljX29yZGVyX2NudCAtIDQpOwogICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBTSFBhcmFtcy0+bWF4X251bV9yZWZfZnJhbWVzKTsgLy9udW1fcmVmX2ZyYW1lcyB1ZSgyKSwgdHlwaWNhbGx5IDIKICAgIC8vIEJ5dGVzIGFsaWduZWQgKGJpdCA3MikKICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgCiAgICAgICAgKHBTSFBhcmFtcy0+Z2Fwc19pbl9mcmFtZV9udW1fdmFsdWUpLCAvLyBnYXBzX2luX2ZyYW1lX251bV92YWx1ZV9hbGxvd2VkX0ZsYWcJLSAoMSBiaXQpCiAgICAgICAgMSk7CiAgICAvLy8qKioqIEdFTkVSQVRFUyBUSEUgU0VDT05ELCBWQVJJQUJMRSBMRU5HVEgsIEVMRU1FTlQgT0YgVEhFIEgyNjRfU0VRVUVOQ0VfSEVBREVSKCkgU1RSVUNUVVJFICoqKiovLy8KICAgIC8vLyoqKiogRUxFTUVOVCBCSVRDT1VOVDogeHgKICAgIC8vcGljX3dpZHRoX2luX21ic19taW51czE6IHVlKHYpIGZyb20gMTAgdG8gNDQgKDE3NiB0byA3MjAgcGl4ZWwgcGVyIHJvdykKICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwU0hQYXJhbXMtPnVjV2lkdGhfaW5fbWJzX21pbnVzMSk7CiAgICAvL3BpY19oZWlnaHRfaW5fbWFwc191bml0c19taW51czE6IHVlKHYpIFZhbHVlIGZyb20gOCB0byAzNSAoMTQ0IHRvIDU3NiBwaXhlbHMgcGVyIGNvbHVtbikKICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwU0hQYXJhbXMtPnVjSGVpZ2h0X2luX21hcHNfdW5pdHNfbWludXMxKTsKICAgIC8vIFdlIGRvbid0IGtub3cgdGhlIGFsaWdubWVudCBhdCB0aGlzIHBvaW50LCBzbyB3aWxsIGhhdmUgdG8gdXNlIGJpdCB3cml0aW5nIGZ1bmN0aW9ucwogICAgLy8gZnJhbWVfbWJfb25seV9mbGFnIDE9ZnJhbWUgZW5jb2RpbmcsIDA9ZmllbGQgZW5jb2RpbmcKICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycyxwU0hQYXJhbXMtPnVjRnJhbWVfbWJzX29ubHlfZmxhZywxKTsKICAgIGlmICghcFNIUGFyYW1zLT51Y0ZyYW1lX21ic19vbmx5X2ZsYWcpIC8vIGluIHRoZSBjYXNlIG9mIGludGVybGFjZWQgZW5jb2RpbmcKICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsMCwxKTsgLy8gbWJfYWRhcHRpdmVfZnJhbWVfZmllbGRfZmxhZyA9IDAgaW4gVG9wYXooZmllbGQgZW5jb2RpbmcgYXQgdGhlIHNlcXVlbmNlIGxldmVsKQoKICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywxLDEpOyAvLyBkaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnPTEgaW4gVG9wYXoKICAgIGlmIChwc0Nyb3AtPmJDbGlwKSB7CiAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLDEsMSk7CiAgICAgICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBzQ3JvcC0+dWkxNkxlZnRDcm9wT2Zmc2V0KTsKCXRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwc0Nyb3AtPnVpMTZSaWdodENyb3BPZmZzZXQpOwoJdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBzQ3JvcC0+dWkxNlRvcENyb3BPZmZzZXQpOwoJdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBzQ3JvcC0+dWkxNkJvdHRvbUNyb3BPZmZzZXQpOwogICAgfSBlbHNlIHsKICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsMCwxKTsKICAgIH0KCiAgICAvLy8qKioqIEdFTkVSQVRFUyBUSEUgVEhJUkQgRUxFTUVOVCBPRiBUSEUgSDI2NF9TRVFVRU5DRV9IRUFERVIoKSBTVFJVQ1RVUkUgKioqKi8vLwogICAgLy8vKioqKiBFTEVNRU5UIEJJVENPVU5UOiB4eAogICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgIChwU0hQYXJhbXMtPlZVSV9QYXJhbXNfUHJlc2VudCksIC8vIHZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyAoVlVJIG9ubHkgaW4gMXN0IHNlcXVlbmNlIG9mIHN0cmVhbSkKICAgICAgICAxKTsKCiAgICBpZiAocFNIUGFyYW1zLT5WVUlfUGFyYW1zX1ByZXNlbnQgPiAwKQogICAgICAgIHRuZ19fSDI2NF93cml0ZWJpdHNfVlVJX3BhcmFtcyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsICYocFNIUGFyYW1zLT5WVUlfUGFyYW1zKSk7CgoKICAgIC8vIEZpbmFsbHkgd2UgbmVlZCB0byBhbGlnbiB0byB0aGUgbmV4dCBieXRlCiAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9JTlNFUlRCWVRFQUxJR05fSDI2NCk7CiAgICAvLyBUZWxsIE1UWCB0byBpbnNlcnQgdGhlIGJ5dGUgYWxpZ24gZmllbGQgKHdlIGRvbid0IGtub3cgZmluYWwgc3RyZWFtIHNpemUgZm9yIGFsaWdubWVudCBhdCB0aGlzIHBvaW50KQoKICAgIC8vdG5nX3ByaW50KHBNVFhfSGVhZGVyLCA2NCk7CiAgICByZXR1cm47Cn0KCgpzdGF0aWMgdm9pZCB0bmdfX0gyNjRFU193cml0ZWJpdHNfc2xpY2VfaGVhZGVyKAogICAgTVRYX0hFQURFUl9QQVJBTVMgKnBNVFhfSGVhZGVyLAogICAgTVRYX0hFQURFUl9FTEVNRU5UICoqYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICBIMjY0X1NMSUNFX0hFQURFUl9QQVJBTVMgKnBTbEhQYXJhbXMsCiAgICBJTUdfQk9PTCBiQ2FiYWNFbmFibGVkCikKewogICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwogICAgLy9DYW4gYmUgMyBvciA0IGJ5dGVzIC0gYWx3YXlzIDQgYnl0ZXMgaW4gb3VyIGltcGxlbWVudGF0aW9ucwogICAgdG5nX19IMjY0X3dyaXRlYml0c19zdGFydGNvZGVfcHJlZml4X2VsZW1lbnQocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwU2xIUGFyYW1zLT51aThTdGFydF9Db2RlX1ByZWZpeF9TaXplX0J5dGVzKTsKCiAgICAvLy8qKioqIEdFTkVSQVRFUyBUSEUgRklSU1QgRUxFTUVOVCBPRiBUSEUgSDI2NF9TTElDRV9IRUFERVIoKSBTVFJVQ1RVUkUgKioqKi8vLwogICAgLy8vKioqKiBFTEVNRU5UIEJJVENPVU5UOiA4CgogICAgLy8gU3RhcnRDb2RlUHJlZml4IFByZWdlbmVyYXRlZCBpbjogQnVpbGRfSDI2NF80Qnl0ZV9TdGFydENvZGVQcmVmaXhfRWxlbWVudCgpICg0IG9yIDMgYnl0ZXMpCiAgICAvLygzIGJ5dGVzIHdoZW4gc2xpY2UgaXMgZmlyc3QgaW4gYSBwaWN0dXJlIHdpdGhvdXQgc2VxdWVuY2UvcGljdHVyZV9oZWFkZXIgYmVmb3JlIHBpY3R1cmUKICAgIC8vIEJ5dGUgYWxpZ25lZCAoYml0IDMyIG9yIDI0KQogICAgLy8gTk9URTogU2xpY2VfVHlwZSBhbmQgRnJhbWVfVHlwZSBhcmUgYWx3YXlzIHRoZSBzYW1lLCBoZW5jZSBTbGljZUZyYW1lX1R5cGUKICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsICgwIDw8IDcpIHwgICAgICAgICAgICAgICAgLy8gZm9yYmlkZGVuX3plcm9fYml0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBTbEhQYXJhbXMtPmJSZWZlcmVuY2VQaWN0dXJlKSA8PCA1KSB8ICAgICAgICAvLyBuYWxfcmVmX2lkYyAoMiBiaXRzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgPT0gU0xIUF9JRFJfU0xJQ0VGUkFNRV9UWVBFID8gNSA6IDEpKSwgICAgLy8gbmFsX3VuaXRfdHB5ZSAoNSBiaXRzKSA9IEktZnJhbWUgSURSLCBhbmQgMSBmb3IgIHJlc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgpOwoKICAgIC8vTVRYIGZpbGxzIHRoaXMgdmFsdWUgaW4KICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX0NVUlJNQk5SKTsKICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX1JBV0RBVEEpOwoKICAgIC8vLyoqKiogR0VORVJBVEVTIFRIRSBTRUNPTkQgRUxFTUVOVCBPRiBUSEUgSDI2NF9TTElDRV9IRUFERVIoKSBTVFJVQ1RVUkUgKioqKi8vLwogICAgLyogVGhlIGZvbGxvd2luZyBpcyBzbGljZSBwYXJhbWV0ZXIgc2V0IGluIEJQL01QICovCiAgICAvL3RuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAoSU1HX1VJTlQzMikgcFNsSFBhcmFtcy0+Rmlyc3RfTUJfQWRkcmVzcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmlyc3RfbWJfaW5fc2xpY2UgPSBGaXJzdCBNQiBhZGRyZXNzIGluIHNsaWNlOiB1ZShSYW5nZSAwIC0gIDE2MTkpCiAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgKElNR19VSU5UMzIpKChwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgPT0gU0xIUF9JRFJfU0xJQ0VGUkFNRV9UWVBFKSA/IFNMSFBfSV9TTElDRUZSQU1FX1RZUEUgOiBwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3NsaWNlX3R5cGUgdWUodik6IDAgZm9yIFAtc2xpY2UsIDEgZm9yIEItc2xpY2UsIDIgZm9yIEktc2xpY2UKICAgIC8vIGthYjogLy9ub3QgY2xlYW4gY2hhbmdlIGZyb20gSURSIHRvIGludHJhLCBJRFIgc2hvdWxkIGhhdmUgc2VwYXJhdGUgZmxhZwogICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgNSkgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcGljX3BhcmFtZXRlcl9zZXRfaWQsIHVlKHYpID0gMCAgKD0xYikgaW4gVG9wYXoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTbEhQYXJhbXMtPkZyYW1lX051bV9ETywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZyYW1lX251bSAoNSBiaXRzKSA9IGZyYW1lIG51by4gaW4gZGVjb2Rpbmcgb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYpOwoKICAgIC8vIGludGVybGFjZWQgZW5jb2RpbmcKICAgIGlmIChwU2xIUGFyYW1zLT5iUGlDSW50ZXJsYWNlKSB7CiAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWVsZF9waWNfZmxhZyA9IDEKICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBTbEhQYXJhbXMtPmJGaWVsZFR5cGUsIDEpOyAvLyBib3R0b21fZmllbGRfZmxhZyAoMD10b3AgZmllbGQsIDE9Ym90dG9tIGZpZWxkKQogICAgfQoKICAgIGlmIChwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgPT0gU0xIUF9JRFJfU0xJQ0VGUkFNRV9UWVBFKQogICAgICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwU2xIUGFyYW1zLT5JZHJfUGljX0lkKTsgICAgLy8gaWRyX3BpY19pZCB1ZSh2KQoKICAgIGlmIChwU2xIUGFyYW1zLT5iUGlDSW50ZXJsYWNlKQogICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgKHBTbEhQYXJhbXMtPlBpY3R1cmVfTnVtX0RPICsgcFNsSFBhcmFtcy0+YkZpZWxkVHlwZSksIHBTbEhQYXJhbXMtPmxvZzJfbWF4X3BpY19vcmRlcl9jbnQpOyAgICAgICAgICAgICAgICAgICAgLy8gcGljX29yZGVyX2NudF9sc2IgKDYgYml0cykgLSBwaWN0dXJlIG5vIGluIGRpc3BsYXkgb3JkZXIKICAgIGVsc2UKICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBTbEhQYXJhbXMtPlBpY3R1cmVfTnVtX0RPLCBwU2xIUGFyYW1zLT5sb2cyX21heF9waWNfb3JkZXJfY250KTsgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpY19vcmRlcl9jbnRfbHNiICg2IGJpdHMpIC0gcGljdHVyZSBubyBpbiBkaXNwbGF5IG9yZGVyCgoKICAgIGlmIChwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgPT0gU0xIUF9CX1NMSUNFRlJBTUVfVFlQRSkKICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBTbEhQYXJhbXMtPmRpcmVjdF9zcGF0aWFsX212X3ByZWRfZmxhZywgMSk7Ly8gZGlyZWN0X3NwYXRpYWxfbXZfcHJlZF9mbGFnICgxIGJpdCkKICAgIGlmIChwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgPT0gU0xIUF9QX1NMSUNFRlJBTUVfVFlQRSB8fCBwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgPT0gU0xIUF9CX1NMSUNFRlJBTUVfVFlQRSkgewogICAgICAgIGlmIChwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgPT0gU0xIUF9QX1NMSUNFRlJBTUVfVFlQRSAmJiBwU2xIUGFyYW1zLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxID4gMCkgeyAvL0RvIHdlIGhhdmUgbW9yZSB0aGVuIG9uZSByZWZlcmVuY2UgcGljdHVyZT8KICAgICAgICAgICAgLy9PdmVycmlkZSBhbW91bnQgb2YgcmVmIHBpY3MgdG8gYmUgb25seSAxIGluIEwwIGRpcmVjdGlvbgogICAgICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDEpOwogICAgICAgICAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgcFNsSFBhcmFtcy0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSk7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIC8vIG51bV9yZWZfaWR4X2FjdGl2ZV9vdmVycmlkZV9mbGFnICgxIGJpdCkgPSAwIGluIFRvcGF6CiAgICAgICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMSk7CiAgICB9CiAgICBpZiAocFNsSFBhcmFtcy0+U2xpY2VGcmFtZV9UeXBlICE9IFNMSFBfSV9TTElDRUZSQU1FX1RZUEUgJiYgcFNsSFBhcmFtcy0+U2xpY2VGcmFtZV9UeXBlICE9IFNMSFBfSURSX1NMSUNFRlJBTUVfVFlQRSkgewogICAgICAgIGlmICgocFNsSFBhcmFtcy0+ZGlmZl9yZWZfcGljX251bVswXSB8fCBwU2xIUGFyYW1zLT5iUmVmSXNMb25nVGVybVJlZlswXSkKICAgICAgICAgICAgfHwgKChwU2xIUGFyYW1zLT5kaWZmX3JlZl9waWNfbnVtWzFdIHx8IHBTbEhQYXJhbXMtPmJSZWZJc0xvbmdUZXJtUmVmWzFdKSAmJiAocFNsSFBhcmFtcy0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSA+IDApKSkgewogICAgICAgICAgICAvL1NwZWNpZml5IGZpcnN0IHJlZiBwaWMgaW4gTDAKICAgICAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCAxKTsgLy9yZWZfcGljX2xpc3RfbW9kaWZpY2F0aW9uX2ZsYWdfbDAKCiAgICAgICAgICAgIGlmIChwU2xIUGFyYW1zLT5iUmVmSXNMb25nVGVybVJlZlswXSkgewogICAgICAgICAgICAgICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDIpOyAvLyBtb2Rfb2ZfcGljX251bSA9IDIgKGxvbmcgdGVybSByZWYpCiAgICAgICAgICAgICAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgcFNsSFBhcmFtcy0+dVJlZkxvbmdUZXJtUmVmTnVtWzBdKTsgLy8gbG9uZ190ZXJtX3BpY19udW0KICAgICAgICAgICAgfSBlbHNlIGlmIChwU2xIUGFyYW1zLT5kaWZmX3JlZl9waWNfbnVtWzBdID09IDApIHsKICAgICAgICAgICAgICAgIC8vIENhbid0IHVzZSAwLCBzbyB1c2UgTWF4UGljTnVtIHdoaWNoIHdpbGwgd3JhcCB0byAwCiAgICAgICAgICAgICAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSk7IC8vIG1vZF9vZl9waWNfbnVtID0gMSAoYWRkIHRvKQogICAgICAgICAgICAgICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDMxKTsgLy8gYWJzX2RpZmZfbWludXNfMQogICAgICAgICAgICB9IGVsc2UgaWYgKHBTbEhQYXJhbXMtPmRpZmZfcmVmX3BpY19udW1bMF0gPCAwKSB7CiAgICAgICAgICAgICAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCk7IC8vIG1vZF9vZl9waWNfbnVtID0gMCAoc3VidHJhY3QgZnJvbSkKICAgICAgICAgICAgICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAtcFNsSFBhcmFtcy0+ZGlmZl9yZWZfcGljX251bVswXSAtIDEpOyAvLyBhYnNfZGlmZl9taW51c18xCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSk7IC8vIG1vZF9vZl9waWNfbnVtID0gMSAoYWRkIHRvbykKICAgICAgICAgICAgICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwU2xIUGFyYW1zLT5kaWZmX3JlZl9waWNfbnVtWzBdIC0gMSk7IC8vIGFic19kaWZmX21pbnVzXzEKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKChwU2xIUGFyYW1zLT5kaWZmX3JlZl9waWNfbnVtWzFdIHx8IHBTbEhQYXJhbXMtPmJSZWZJc0xvbmdUZXJtUmVmWzFdKSAmJiBwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgIT0gU0xIUF9CX1NMSUNFRlJBTUVfVFlQRSkgeyAvL3BvdGVudGlhbGx5IHNlY29uZCByZWZlcmVuY2UgcGljdHVyZSBvbiBQCiAgICAgICAgICAgICAgICBpZiAocFNsSFBhcmFtcy0+YlJlZklzTG9uZ1Rlcm1SZWZbMV0pIHsKICAgICAgICAgICAgICAgICAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMik7IC8vIG1vZF9vZl9waWNfbnVtID0gMiAobG9uZyB0ZXJtIHJlZikKICAgICAgICAgICAgICAgICAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgcFNsSFBhcmFtcy0+dVJlZkxvbmdUZXJtUmVmTnVtWzFdKTsgLy8gbG9uZ190ZXJtX3BpY19udW0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocFNsSFBhcmFtcy0+ZGlmZl9yZWZfcGljX251bVsxXSA8IDApIHsKICAgICAgICAgICAgICAgICAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCk7IC8vIG1vZF9vZl9waWNfbnVtID0gMCAoc3VidHJhY3QgZnJvbSkKICAgICAgICAgICAgICAgICAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgLXBTbEhQYXJhbXMtPmRpZmZfcmVmX3BpY19udW1bMV0gLSAxKTsgLy8gYWJzX2RpZmZfbWludXNfMQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSk7IC8vIG1vZF9vZl9waWNfbnVtID0gMSAoYWRkIHRvbykKICAgICAgICAgICAgICAgICAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgcFNsSFBhcmFtcy0+ZGlmZl9yZWZfcGljX251bVsxXSAtIDEpOyAvLyBhYnNfZGlmZl9taW51c18xCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAzKTsgLy8gbW9kX29mX3BpY19udW0gPSAzIChubyBtb3JlIGNoYW5nZXMpCiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMSk7IC8vIHJlZl9waWNfbGlzdF9vcmRlcmluZ19mbGFnX0kwICgxIGJpdCkgPSAwLCBubyByZWZlcmVuY2UgcGljdHVyZSBvcmRlcmluZyBpbiBUb3BhegogICAgfQogICAgaWYgKHBTbEhQYXJhbXMtPlNsaWNlRnJhbWVfVHlwZSA9PSBTTEhQX0JfU0xJQ0VGUkFNRV9UWVBFKSB7CiAgICAgICAgaWYgKHBTbEhQYXJhbXMtPmRpZmZfcmVmX3BpY19udW1bMV0gfHwgcFNsSFBhcmFtcy0+YlJlZklzTG9uZ1Rlcm1SZWZbMV0pIHsKICAgICAgICAgICAgLy9TcGVjaWZpeSBmaXJzdCByZWYgcGljIGluIEwxCiAgICAgICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSwgMSk7IC8vcmVmX3BpY19saXN0X21vZGlmaWNhdGlvbl9mbGFnX2wxCgogICAgICAgICAgICBpZiAocFNsSFBhcmFtcy0+YlJlZklzTG9uZ1Rlcm1SZWZbMV0pIHsKICAgICAgICAgICAgICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAyKTsgLy8gbW9kX29mX3BpY19udW0gPSAyIChsb25nIHRlcm0gcmVmKQogICAgICAgICAgICAgICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBTbEhQYXJhbXMtPnVSZWZMb25nVGVybVJlZk51bVsxXSk7IC8vIGxvbmdfdGVybV9waWNfbnVtCiAgICAgICAgICAgIH0gZWxzZSBpZiAocFNsSFBhcmFtcy0+ZGlmZl9yZWZfcGljX251bVsxXSA8IDApIHsKICAgICAgICAgICAgICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwKTsgLy8gbW9kX29mX3BpY19udW0gPSAwIChzdWJ0cmFjdCBmcm9tKQogICAgICAgICAgICAgICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIC1wU2xIUGFyYW1zLT5kaWZmX3JlZl9waWNfbnVtWzFdIC0gMSk7IC8vIGFic19kaWZmX21pbnVzXzEKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxKTsgLy8gbW9kX29mX3BpY19udW0gPSAxIChhZGQgdG9vKQogICAgICAgICAgICAgICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBTbEhQYXJhbXMtPmRpZmZfcmVmX3BpY19udW1bMV0gLSAxKTsgLy8gYWJzX2RpZmZfbWludXNfMQogICAgICAgICAgICB9CgogICAgICAgICAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMyk7IC8vIG1vZF9vZl9waWNfbnVtID0gMyAobm8gbW9yZSBjaGFuZ2VzKQogICAgICAgIH0gZWxzZQogICAgICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDEpOyAvLyByZWZfcGljX2xpc3Rfb3JkZXJpbmdfZmxhZ19JMSAoMSBiaXQpID0gMCwgbm8gcmVmZXJlbmNlIHBpY3R1cmUgb3JkZXJpbmcgaW4gVG9wYXoKICAgIH0KICAgIGlmIChwU2xIUGFyYW1zLT53ZWlnaHRlZF9wcmVkX2ZsYWcgJiYKICAgICAgICAoKHBTbEhQYXJhbXMtPlNsaWNlRnJhbWVfVHlwZSA9PSBTTEhQX1BfU0xJQ0VGUkFNRV9UWVBFKSB8fCAocFNsSFBhcmFtcy0+U2xpY2VGcmFtZV9UeXBlID09IFNMSFBfQl9TTElDRUZSQU1FX1RZUEUpKQogICAgICAgICYmIChwU2xIUGFyYW1zLT53ZWlnaHRlZF9iaXByZWRfaWRjID09IDEpKSB7CiAgICAgICAgaW50IGk7CiAgICAgICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBTbEhQYXJhbXMtPmx1bWFfbG9nMl93ZWlnaHRfZGVub20pOwogICAgICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwU2xIUGFyYW1zLT5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20pOyAvLyBBbHdheXMgZG8gY2hyb21hCiAgICAgICAgZm9yIChpID0gMDsgaSA8IChwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgPT0gU0xIUF9CX1NMSUNFRlJBTUVfVFlQRSA/IDIgOiAocFNsSFBhcmFtcy0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSArIDEpKTsgaSsrKSB7IC8vIEVpdGhlciAxIG9yIDIKICAgICAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwU2xIUGFyYW1zLT5sdW1hX3dlaWdodF9sMF9mbGFnW2ldLCAxKTsKICAgICAgICAgICAgaWYgKHBTbEhQYXJhbXMtPmx1bWFfd2VpZ2h0X2wwX2ZsYWdbaV0pIHsKICAgICAgICAgICAgICAgIHRuZ19fZ2VuZXJhdGVfc2UocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwU2xIUGFyYW1zLT5sdW1hX3dlaWdodF9sMFtpXSk7CiAgICAgICAgICAgICAgICB0bmdfX2dlbmVyYXRlX3NlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgcFNsSFBhcmFtcy0+bHVtYV9vZmZzZXRfbDBbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgcFNsSFBhcmFtcy0+Y2hyb21hX3dlaWdodF9sMF9mbGFnW2ldLCAxKTsKICAgICAgICAgICAgaWYgKHBTbEhQYXJhbXMtPmNocm9tYV93ZWlnaHRfbDBfZmxhZ1tpXSkgewogICAgICAgICAgICAgICAgdG5nX19nZW5lcmF0ZV9zZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBTbEhQYXJhbXMtPmNocm9tYUJfd2VpZ2h0X2wwW2ldKTsKICAgICAgICAgICAgICAgIHRuZ19fZ2VuZXJhdGVfc2UocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwU2xIUGFyYW1zLT5jaHJvbWFCX29mZnNldF9sMFtpXSk7CiAgICAgICAgICAgICAgICB0bmdfX2dlbmVyYXRlX3NlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgcFNsSFBhcmFtcy0+Y2hyb21hUl93ZWlnaHRfbDBbaV0pOwogICAgICAgICAgICAgICAgdG5nX19nZW5lcmF0ZV9zZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBTbEhQYXJhbXMtPmNocm9tYVJfb2Zmc2V0X2wwW2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAocFNsSFBhcmFtcy0+U2xpY2VGcmFtZV9UeXBlID09IFNMSFBfSURSX1NMSUNFRlJBTUVfVFlQRSkgewogICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub19vdXRwdXRfb2ZfcHJpb3JfcGljc19mbGFnICgxIGJpdCkgPSAwCiAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwU2xIUGFyYW1zLT5iSXNMb25nVGVybVJlZiA/IDEgOiAwLCAxKTsgIC8vIGxvbmdfdGVybV9yZWZlcmVuY2VfZmxhZyAoMSBiaXQpID0gMAogICAgfSBlbHNlIGlmIChwU2xIUGFyYW1zLT5iUmVmZXJlbmNlUGljdHVyZSkgewogICAgICAgIGlmIChwU2xIUGFyYW1zLT5iSXNMb25nVGVybVJlZikgewogICAgICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDEpOyAvLyBhZGFwdGl2ZV9yZWZfcGljX21hcmtpbmdfbW9kZV9mbGFnICgxIGJpdCkgPSAwCgogICAgICAgICAgICAvLyBBbGxvdyBhIHNpbmdsZSBsb25nLXRlcm0gcmVmZXJlbmNlCiAgICAgICAgICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbgogICAgICAgICAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4X2xvbmdfdGVybV9mcmFtZV9pZHhfcGx1czEKCiAgICAgICAgICAgIC8vIFNldCBjdXJyZW50IHBpY3R1cmUgYXMgdGhlIGxvbmctdGVybSByZWZlcmVuY2UKICAgICAgICAgICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uCiAgICAgICAgICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwU2xIUGFyYW1zLT51TG9uZ1Rlcm1SZWZOdW0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvbmdfdGVybV9mcmFtZV9pZHgKCiAgICAgICAgICAgIC8vIEVuZAogICAgICAgICAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24KICAgICAgICB9IGVsc2UKICAgICAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwLCAxKTsgICAgICAgICAvLyBhZGFwdGl2ZV9yZWZfcGljX21hcmtpbmdfbW9kZV9mbGFnICgxIGJpdCkgPSAwCiAgICB9CgogICAgaWYgKGJDYWJhY0VuYWJsZWQgJiYgKChTTEhQX1BfU0xJQ0VGUkFNRV9UWVBFID09IHBTbEhQYXJhbXMtPlNsaWNlRnJhbWVfVHlwZSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAoU0xIUF9CX1NMSUNFRlJBTUVfVFlQRSA9PSBwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUpKSkgewogICAgICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwKTsgLy8gaGFyZCBjb2RlIGNhYmFjX2luaXRfaWRjIHZhbHVlIG9mIDAKICAgIH0KICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX1NRUCk7IC8vTVRYIGZpbGxzIHRoaXMgdmFsdWUgaW4KICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX1JBV0RBVEEpOwoKICAgIC8vLyoqKiogR0VORVJBVEVTIEVMRU1FTlQgT0YgVEhFIEgyNjRfU0xJQ0VfSEVBREVSKCkgU1RSVUNUVVJFICoqKiovLy8KICAgIC8vLyoqKiogRUxFTUVOVCBCSVRDT1VOVDogMTEKICAgIC8vIE5leHQgZmllbGQgaXMgZ2VuZXJhdGVkIG9uIE1UWCB3aXRoIGEgc3BlY2lhbCBjb21tbmFkIChub3QgRUxFTUVOVF9SQVcpIC0gc28gbm90IGRlZmluZWQgaGVyZQogICAgLy9wdWNIUz10bmdfX2dlbmVyYXRlX3NlKHB1Y0hTLCBwdWlCaXRQb3MsIHBTbEhQYXJhbXMtPlNsaWNlX1FQX0RlbHRhKTsgLy9zbGljZV9xcF9kZWx0YSBzZSh2KSA9IFNsaWNlUVB5IC0gKHBpY19pbml0X3FwX21pbnVzMjYrMjYpCiAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgcFNsSFBhcmFtcy0+RGlzYWJsZV9EZWJsb2NraW5nX0ZpbHRlcl9JZGMpOyAvL2Rpc2FibGVfZGVibG9ja2luZ19maWx0ZXJfaWRjIHVlKHYpID0gMj8KICAgIGlmIChwU2xIUGFyYW1zLT5EaXNhYmxlX0RlYmxvY2tpbmdfRmlsdGVyX0lkYyAhPSAxKSB7CiAgICAgICAgdG5nX19nZW5lcmF0ZV9zZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBTbEhQYXJhbXMtPmlEZWJBbHBoYU9mZnNldERpdjIpOyAvL3NsaWNlX2FscGhhX2MwX29mZnNldF9kaXYyIHNlKHYpID0gMCAoMWIpIGluIFRvcGF6CiAgICAgICAgdG5nX19nZW5lcmF0ZV9zZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBTbEhQYXJhbXMtPmlEZWJCZXRhT2Zmc2V0RGl2Mik7IC8vc2xpY2VfYmV0YV9vZmZzZXRfZGl2MiBzZSh2KSA9IDAgKDFiKSBpbiBUb3BhegogICAgfQogICAgLy9udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSA9PTAgaW4gVG9wYXosIHNvIG5vIHNsaWNlX2dyb3VwX2NoYW5nZV9jeWNsZSBmaWVsZCBoZXJlCiAgICAvLyBubyBieXRlIGFsaWdubWVudCBhdCBlbmQgb2Ygc2xpY2UgaGVhZGVycwogICAgcmV0dXJuIDsKfQoKCnN0YXRpYyB2b2lkIHRuZ19fSDI2NF9nZXRlbGVtZW50c19za2lwX1Bfc2xpY2UoCiAgICBNVFhfSEVBREVSX1BBUkFNUyAqbXR4X2hkciwKICAgIEgyNjRfU0xJQ0VfSEVBREVSX1BBUkFNUyAqcFNsSFBhcmFtcywKICAgIElNR19VSU5UMzIgTUJfTm9fSW5fU2xpY2UsCiAgICBJTUdfQk9PTCBiQ2FiYWNFbmFibGVkKQp7CiAgICAvKiBTa2lwcGVkIFAtU2xpY2UKICAgICAqIEVuc3VyZSBwU2xIUGFyYW1zIGlzIGZpbGxlZCB3aXRoIGFwcHJvcHJpYXRlIHBhcmFtZXRlcnMgZm9yIGEgQi1zbGljZQogICAgICogRXNzZW50aWFsIHdlIGluaXRpYWxpc2Ugb3VyIGhlYWRlciBzdHJ1Y3R1cmVzIGJlZm9yZSBidWlsZGluZwogICAgICovCiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKlRoaXNfRWxlbWVudDsKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqYXVpMzJFbGVtZW50UG9pbnRlcnNbTUFYTlVNQkVSRUxFTUVOVFNdOwogICAgbXR4X2hkci0+dWkzMkVsZW1lbnRzID0gRUxFTUVOVFNfRU1QVFk7CiAgICBUaGlzX0VsZW1lbnQgPSAoTVRYX0hFQURFUl9FTEVNRU5UICopIG10eF9oZHItPmFzRWxlbWVudFN0cmVhbTsKICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzWzBdID0gVGhpc19FbGVtZW50OwoKICAgIC8qIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4obXR4X2hkciwgRUxFTUVOVF9TVEFSVENPVU5URVIpOyAqLwogICAgLyogTm90IHN1cmUgaWYgdGhpcyB3aWxsIGJlIHJlcXVpcmVkIGluIHRoZSBmaW5hbCBzcGVjICovCiAgICB0bmdfX0gyNjRFU193cml0ZWJpdHNfc2xpY2VfaGVhZGVyKG10eF9oZHIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwU2xIUGFyYW1zLCBiQ2FiYWNFbmFibGVkKTsKICAgIHRuZ19fZ2VuZXJhdGVfdWUobXR4X2hkciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIE1CX05vX0luX1NsaWNlKTsgLyogbWJfc2tpcF9ydW4gPSBtYl9ub19pbl9zbGljZSAqLwoKICAgIC8qIFRlbGwgTVRYIHRvIGluc2VydCB0aGUgYnl0ZSBhbGlnbiBmaWVsZCAod2UgZG9uJ3Qga25vdyBmaW5hbCBzdHJlYW0gc2l6ZSBmb3IgYWxpZ25tZW50IGF0IHRoaXMgcG9pbnQpICovCiAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKG10eF9oZHIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX0lOU0VSVEJZVEVBTElHTl9IMjY0KTsKICAgIG10eF9oZHItPnVpMzJFbGVtZW50cysrOyAvKiBIYXMgYmVlbiB1c2VkIGFzIGFuIGluZGV4LCBzbyBuZWVkIHRvIGFkZCAxIGZvciBhIHZhbGlkIGVsZW1lbnQgY291bnQgKi8KfQoKCiNpZiAwCnN0YXRpYyB2b2lkIHRuZ19fSDI2NF9nZXRlbGVtZW50c19zZXF1ZW5jZV9oZWFkZXIoCiAgICBNVFhfSEVBREVSX1BBUkFNUyAqbXR4X2hkciwKICAgIEgyNjRfU0VRVUVOQ0VfSEVBREVSX1BBUkFNUyAqcFNIUGFyYW1zLAogICAgSDI2NF9DUk9QX1BBUkFNUyAqcHNDcm9wUGFyYW1zKQp7CiAgICAvKiBCdWlsZHMgYSBzZXF1ZW5jZSwgcGljdHVyZSBhbmQgc2xpY2UgaGVhZGVyIHdpdGggZnJvbSB0aGUgZ2l2ZW4gaW5wdXRzIHBhcmFtZXRlcnMgKHN0YXJ0IG9mIG5ldyBmcmFtZSkKICAgICAqIEVzc2VudGlhbCB3ZSBpbml0aWFsaXNlIG91ciBoZWFkZXIgc3RydWN0dXJlcyBiZWZvcmUgYnVpbGRpbmcKICAgICAqLwogICAgTVRYX0hFQURFUl9FTEVNRU5UICpUaGlzX0VsZW1lbnQ7CiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKmF1aTMyRWxlbWVudFBvaW50ZXJzW01BWE5VTUJFUkVMRU1FTlRTXTsKICAgIG10eF9oZHItPnVpMzJFbGVtZW50cyA9IEVMRU1FTlRTX0VNUFRZOwogICAgVGhpc19FbGVtZW50ID0gKE1UWF9IRUFERVJfRUxFTUVOVCAqKSBtdHhfaGRyLT5hc0VsZW1lbnRTdHJlYW07CiAgICBhdWkzMkVsZW1lbnRQb2ludGVyc1swXSA9IFRoaXNfRWxlbWVudDsKCiAgICB0bmdfX0gyNjRFU193cml0ZWJpdHNfc2VxdWVuY2VfaGVhZGVyKG10eF9oZHIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwU0hQYXJhbXMsIHBzQ3JvcFBhcmFtcywgTlVMTCk7CiAgICBtdHhfaGRyLT51aTMyRWxlbWVudHMrKzsgLyogSGFzIGJlZW4gdXNlZCBhcyBhbiBpbmRleCwgc28gbmVlZCB0byBhZGQgMSBmb3IgYSB2YWxpZCBlbGVtZW50IGNvdW50ICovCn0KI2VuZGlmCgovL3N0YXRpYyB2b2lkIHRuZ19fSDI2NF9nZXRlbGVtZW50c19waWN0dXJlX2hlYWRlcihNVFhfSEVBREVSX1BBUkFNUyAqbXR4X2hkcikKLy97Ci8vLyogQnVpbGRzIGEgc2VxdWVuY2UsIHBpY3R1cmUgYW5kIHNsaWNlIGhlYWRlciB3aXRoIGZyb20gdGhlIGdpdmVuIGlucHV0cyBwYXJhbWV0ZXJzIChzdGFydCBvZiBuZXcgZnJhbWUpCi8vKiBFc3NlbnRpYWwgd2UgaW5pdGlhbGlzZSBvdXIgaGVhZGVyIHN0cnVjdHVyZXMgYmVmb3JlIGJ1aWxkaW5nCi8vKi8KLy9NVFhfSEVBREVSX0VMRU1FTlQgKlRoaXNfRWxlbWVudDsKLy9NVFhfSEVBREVSX0VMRU1FTlQgKmF1aTMyRWxlbWVudFBvaW50ZXJzW01BWE5VTUJFUkVMRU1FTlRTXTsKLy9tdHhfaGRyLT5FbGVtZW50cz1FTEVNRU5UU19FTVBUWTsKLy9UaGlzX0VsZW1lbnQ9KE1UWF9IRUFERVJfRUxFTUVOVCAqKSBtdHhfaGRyLT5hc0VsZW1lbnRTdHJlYW07Ci8vYXVpMzJFbGVtZW50UG9pbnRlcnNbMF09VGhpc19FbGVtZW50OwovLwovL3RuZ19fSDI2NEVTX3dyaXRlYml0c19waWN0dXJlX2hlYWRlcihtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycyk7Ci8vbXR4X2hkci0+RWxlbWVudHMrKzsgLy9IYXMgYmVlbiB1c2VkIGFzIGFuIGluZGV4LCBzbyBuZWVkIHRvIGFkZCAxIGZvciBhIHZhbGlkIGVsZW1lbnQgY291bnQKLy99CgoKc3RhdGljIHZvaWQgdG5nX19IMjY0X2dldGVsZW1lbnRzX3NsaWNlX2hlYWRlcigKICAgIE1UWF9IRUFERVJfUEFSQU1TICpwTVRYX0hlYWRlciwKICAgIEgyNjRfU0xJQ0VfSEVBREVSX1BBUkFNUyAqcFNsSFBhcmFtcywKICAgIElNR19CT09MIGJDYWJhY0VuYWJsZWQKKQp7CiAgICAvKiBCdWlsZHMgYSBzaW5nbGUgc2xpY2UgaGVhZGVyIGZyb20gdGhlIGdpdmVuIHBhcmFtZXRlcnMgKG1pZCBmcmFtZSkKICAgICAqIEVzc2VudGlhbCB3ZSBpbml0aWFsaXNlIG91ciBoZWFkZXIgc3RydWN0dXJlcyBiZWZvcmUgYnVpbGRpbmcKICAgICAqLwogICAgTVRYX0hFQURFUl9FTEVNRU5UICpUaGlzX0VsZW1lbnQ7CiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKmF1aTMyRWxlbWVudFBvaW50ZXJzW01BWE5VTUJFUkVMRU1FTlRTXTsKICAgIHBNVFhfSGVhZGVyLT51aTMyRWxlbWVudHMgPSBFTEVNRU5UU19FTVBUWTsKICAgIFRoaXNfRWxlbWVudCA9IChNVFhfSEVBREVSX0VMRU1FTlQgKikgcE1UWF9IZWFkZXItPmFzRWxlbWVudFN0cmVhbTsKICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzWzBdID0gVGhpc19FbGVtZW50OwoKICAgIC8qIE5vdCBzdXJlIGlmIHRoaXMgd2lsbCBiZSByZXF1aXJlZCBpbiB0aGUgZmluYWwgc3BlYyAqLwogICAgLyogdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihtdHhfaGRyLCBFTEVNRU5UX1NUQVJUQ09VTlRFUik7Ki8KICAgIHRuZ19fSDI2NEVTX3dyaXRlYml0c19zbGljZV9oZWFkZXIocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwU2xIUGFyYW1zLCBiQ2FiYWNFbmFibGVkKTsKCiAgICBwTVRYX0hlYWRlci0+dWkzMkVsZW1lbnRzKys7IC8qIEhhcyBiZWVuIHVzZWQgYXMgYW4gaW5kZXgsIHNvIG5lZWQgdG8gYWRkIDEgZm9yIGEgdmFsaWQgZWxlbWVudCBjb3VudCAqLwp9Cgp2b2lkIEgyNjNfTk9URk9SU0lNU19Xcml0ZUJpdHNfVmlkZW9QaWN0dXJlSGVhZGVyKE1UWF9IRUFERVJfUEFSQU1TICpwTVRYX0hlYWRlciwgTVRYX0hFQURFUl9FTEVNRU5UICoqYXVpMzJFbGVtZW50UG9pbnRlcnMsCgkJCQkJICAgSDI2M19QSUNUVVJFX0NPRElOR19UWVBFIFBpY3R1cmVDb2RpbmdUeXBlLAoJCQkJCSAgIC8vSU1HX1VJTlQ4IHVpOFFfU2NhbGUsCgkJCQkJICAgSDI2M19TT1VSQ0VfRk9STUFUX1RZUEUgU291cmNlRm9ybWF0VHlwZSwKCQkJCQkgICBJTUdfVUlOVDggX19tYXliZV91bnVzZWQgdWk4RnJhbWVSYXRlLAoJCQkJCSAgIElNR19VSU5UMzIgdWkzMlBpY3R1cmVXaWR0aCwKCQkJCQkgICBJTUdfVUlOVDMyIHVpMzJQaWN0dXJlSGVpZ2h0CgkJCQkJICAgKQp7CiAgICBJTUdfVUlOVDggVUZFUDsKCiAgICAvLyBFc3NlbnRpYWwgd2UgaW5zZXJ0IHRoZSBlbGVtZW50IGJlZm9yZSB3ZSB0cnkgdG8gZmlsbCBpdCEKICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX1NUQVJUQ09ERV9SQVdEQVRBKTsKCiAgICAvLyBzaG9ydF92aWRlb19zdGFydF9tYXJrZXIJPSAyMiBCaXRzCT0gMHgyMCBQaWN0dXJlIHN0YXJ0IGNvZGUKICAgIHRuZ19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDMyLCAyMik7CgogICAgLy8gdGVtcG9yYWxfcmVmZXJlbmNlCQk9IDggQml0cwk9IDAtMjU1CUVhY2ggcGljdHVyZSBpbmNyZWFzZWQgYnkgMQogICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfVEVNUE9SQUxfUkVGRVJFTkNFKTsKICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX1JBV0RBVEEpOwoKICAgIC8vIG1hcmtlcl9iaXQJCQkJPSAxIEJpdAkJPSAxCiAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDEpOwoKICAgIC8vIHplcm9fYml0CQkJCQk9IDEgQml0cwk9IDAKICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMSk7CgogICAgLy8gc3BsaXRfc2NyZWVuX2luZGljYXRvcgk9IDEJQml0cwk9IDAJTm8gZGlyZWN0IGVmZmVjdCBvbiBlbmNvZGluZyBvZiBwaWN0dXJlCiAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDEpOwoJCiAgICAvLyBkb2N1bWVudF9jYW1lcmFfaW5kaWNhdG9yPSAxCUJpdHMJPSAwCU5vIGRpcmVjdCBlZmZlY3Qgb24gZW5jb2Rpbmcgb2YgcGljdHVyZQogICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwLCAxKTsKCiAgICAvLyBmdWxsX3BpY3R1cmVfZnJlZXplX3JlbGVhc2U9MSBCaXRzCT0gMAlObyBkaXJlY3QgZWZmZWN0IG9uIGVuY29kaW5nIG9mIHBpY3R1cmUKICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMSk7CgogICAgLy8gc291cmNlX2Zvcm1hdAkJCQk9IDMJQml0cwk9IDEtNAlTZWUgbm90ZQogICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBTb3VyY2VGb3JtYXRUeXBlLCAzKTsKCiAgICBpZiAoU291cmNlRm9ybWF0VHlwZSAhPSA3KQogICAgewoJLy8gcGljdHVyZV9jb2RpbmdfdHlwZQkJPSAxIEJpdAkJPSAwLzEJMCBmb3IgSS1mcmFtZSBhbmQgMSBmb3IgUC1mcmFtZQoJdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBQaWN0dXJlQ29kaW5nVHlwZSwgMSk7CgkvLyBmb3VyX3Jlc2VydmVkX3plcm9fYml0cwk9IDQgQml0cwk9IDAKCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgNCk7CiAgICB9CiAgICAvLyB0aGUgZWxzZSBibG9jayBpcyBmb3IgUExVU1BUWVBFIGhlYWRlciBpbnNlcnRpb24uCiAgICBlbHNlCiAgICB7CglzdGF0aWMgSU1HX1VJTlQ4IFJUWVBFID0gMDsKCiAgICAgICAgLy8gaWYgSS0gRnJhbWUgc2V0IFVwZGF0ZSBGdWxsIEV4dGVuZGVkIFBUWVBFIHRvIHRydWUKCWlmIChQaWN0dXJlQ29kaW5nVHlwZSA9PSBJX0ZSQU1FKQoJewoJICAgIFVGRVAgPSAxOwoJfQoJZWxzZQoJewoJICAgIFVGRVAgPSAwOwoJfQogICAgICAgIAogICAgICAgIC8vIHdyaXRlIFVGRVAgb2YgMyBiaXRzLgoJdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBVRkVQLCAzKTsKCiAgICAgICAgLy8gaWYgVUZFUCB3YXMgcHJlc2VudCggaWYgaXQgd2FzIDEpLgogICAgICAgIC8vIE9wdGlvbmFsIHBhcnQgb2YgUFBUWVBFLgoJaWYgKFVGRVAgPT0gMSkKCXsKCSAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDYsIDMpOwoJICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMSk7CgogICAgICAgICAgICAvKiAxMCByZXNlcnZlIGJpdHMgKCBPcHRpb25hbCBzdXBwb3J0IGZvciB0aGUgZW5jb2RpbmcpLiBBbGwgYXJlIE9GRigwKS4KICAgICAgICAgICAgICAgLSBPcHRpb25hbCBVbnJlc3RyaWN0ZWQgTW90aW9uIFZlY3RvciAoVU1WKQogICAgICAgICAgICAgICAtIE9wdGlvbmFsIFN5bnRheC1iYXNlZCBBcml0aG1ldGljIENvZGluZyAoU0FDKQogICAgICAgICAgICAgICAtIE9wdGlvbmFsIEFkdmFuY2VkIFByZWRpY3Rpb24gKEFQKSBtb2RlCiAgICAgICAgICAgICAgIC0gT3B0aW9uYWwgQWR2YW5jZWQgSU5UUkEgQ29kaW5nIChBSUMpIG1vZGUKICAgICAgICAgICAgICAgLSBPcHRpb25hbCBEZWJsb2NraW5nIEZpbHRlciAoREYpIG1vZGUKICAgICAgICAgICAgICAgLSBPcHRpb25hbCBTbGljZSBTdHJ1Y3R1cmVkIChTUykgbW9kZQogICAgICAgICAgICAgICAtIE9wdGlvbmFsIFJlZmVyZW5jZSBQaWN0dXJlIFNlbGVjdGlvbihSUFMpIG1vZGUuCiAgICAgICAgICAgICAgIC0gT3B0aW9uYWwgSW5kZXBlbmRlbnQgU2VnbWVudCBEZWNvZGluZyAoSVNEKSBtb2RlCiAgICAgICAgICAgICAgIC0gT3B0aW9uYWwgQWx0ZXJuYXRpdmUgSU5URVIgVkxDIChBSVYpIG1vZGUKICAgICAgICAgICAgICAgLSBPcHRpb25hbCBNb2RpZmllZCBRdWFudGl6YXRpb24gKE1RKSBtb2RlCiAgICAgICAgICAgICovCgkgICAgdG5nX193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMTApOyAvLyAxMCByZXNlcnZlIGJpdHMKCiAgICAgICAgICAgIC8qIDQgcmVzZXJ2ZSBiaXRzCiAgICAgICAgICAgICAgIC0gMSAoT04pIHRvIHByZXZlbnQgc3RhcnQgY29kZSBlbXVsYXRpb24uCiAgICAgICAgICAgICAgIC0gMCAgUmVzZXJ2ZWQoc2hhbGwgYmUgMCkuCiAgICAgICAgICAgICAgIC0gMCAgUmVzZXJ2ZWQoc2hhbGwgYmUgMCkuCiAgICAgICAgICAgICAgIC0gMCAgUmVzZXJ2ZWQoc2hhbGwgYmUgMCkuCiAgICAgICAgICAgICovCgkgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCA4LCA0KTsJLy8gNCByZXNlcnZlIGJpdHMKCX0KICAgICAgICAvLyBPcHRpb25hbCBQYXJ0IG9mIFBQVFlQRSBlbmRzLgoKICAgICAgICAvLyBNYW5kYXRvcnkgcGFydCBvZiBQUFRZUEUgc3RhcnRzLihNUFBUWVBFKQogICAgICAgIC8vIHBpY3R1cmVfY29kaW5nX3R5cGUJCT0gMSBCaXQJCT0gMC8xCTAgZm9yIEktZnJhbWUgYW5kIDEgZm9yIFAtZnJhbWUKCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgUGljdHVyZUNvZGluZ1R5cGUsIDMgKTsKCQogICAgICAgIC8qCiAgICAgICAgICAgIC0gT3B0aW9uYWwgUmVmZXJlbmNlIFBpY3R1cmUgUmVzYW1wbGluZyAoUlBSKSBtb2RlICggT0ZGKSA6IDAKICAgICAgICAgICAgLSBPcHRpb25hbCBSZWZlcmVuY2UgUGljdHVyZSBSZXNhbXBsaW5nIChSUFIpIG1vZGUgKE9GRikgOiAwCiAgICAgICAgICovCgl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAgLCAyKTsKCiAgICAgICAgLy8gUm91bmRpbmcgVHlwZSAoUlRZUEUpICgxIGZvciBQIFBpY3R1cmUsIDAgZm9yIGFsbCBvdGhlciBQaWN0dXJlIGZyYW1lcy4KICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIFJUWVBFLCAxKTsKCiAgICAgICAgLyogMiByZXNlcnZlIGJpdHMKICAgICAgICAgICAtIDAgIFJlc2VydmVkKHNoYWxsIGJlIDApLgogICAgICAgICAgIC0gMCAgUmVzZXJ2ZWQoc2hhbGwgYmUgMCkuCiAgICAgICAgKi8KICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDIpOwoKICAgICAgICAvLyAgIC0gMSAoT04pIHRvIHByZXZlbnQgc3RhcnQgY29kZSBlbXVsYXRpb24uCiAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxICwgMSk7CgkJLy8gTWFuZGF0b3J5IHBhcnQgb2YgUFRZUEUgZW5kcy4KCiAgICAgICAgLy8gQ1BNIGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlIFBQVFlQRSBwYXJ0IG9mIHRoZSBoZWFkZXIuCiAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwICwxKTsKCiAgICAgICAgLyogQ3VzdG9tIFBpY3R1cmUgRm9ybWF0IChDUEZNVCkgKi8KICAgICAgICAvKiBpZiBVRkVQIHdhcyBwcmVzZW50IGFuZCBTb3VyY2UgRm9ybWF0IHR5cGUgd2FzIDcoY3VzdG9tIGZvcm1hdCkgKi8KCWlmIChVRkVQID09IDEpCgl7CgkgICAgSU1HX1VJTlQxNiB1aTE2UFdJLHVpMTZQSEk7CgogICAgICAgICAgICAvLyBhc3BlY3QgcmF0aW8gNCBiaXRzIHZhbHVlID0gMDAxMCAoMTI6MTEpCgkJCS8vdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAweDAxLCA0KTsKICAgICAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAyLCA0KTsKCiAgICAgICAgICAgIC8vIFBpY3R1cmUgV2lkdGggSW5kaWNhdGlvbiA5IGJpdHMuCgkJCS8vdWkxNlBpY3R1cmVXaWR0aCAtLTsKCQkJLy90bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIChJTUdfVUlOVDgpKHVpMTZQaWN0dXJlV2lkdGggPj4gOCksIDEpOwoJCQkvL3RuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgKElNR19VSU5UOCkodWkxNlBpY3R1cmVXaWR0aCAmIDB4RkYpLCA4KTsKICAgICAgICAgICAgdWkxNlBXSSA9ICh1aTMyUGljdHVyZVdpZHRoID4+IDIpIC0gMTsKICAgICAgICAgICAgdG5nX193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycyx1aTE2UFdJLCA5KTsKCQkJCiAgICAgICAgICAgIC8vIE1hcmtlciBiaXQgMWJpdCA9IDEgdG8gcHJldmVudCBzdGFydCBjb2RlIGVtdWxhdGlvbi4KCSAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDEpOwoJCQkKICAgICAgICAgICAgLy8gUGljdHVyZSBIZWlnaHQgSW5kaWNhdGlvbiA5IGJpdHMuCgkJCS8vdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAoSU1HX1VJTlQ4KSh1aTE2UGljdHVyZUhlaWd0aCA+PiA4KSwgMSk7CgkJCS8vdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAoSU1HX1VJTlQ4KSh1aTE2UGljdHVyZUhlaWd0aCAmIDB4RkYpLCA4KTsKICAgICAgICAgICAgdWkxNlBISSA9IHVpMzJQaWN0dXJlSGVpZ2h0ID4+IDI7CiAgICAgICAgICAgIHRuZ19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsdWkxNlBISSwgOSk7CiAgICAgICAgICAgIC8vIGdvb2QgdXAgdG8gdGhhdCBwb2ludAoJfQogICAgfQogICAgLy8gSW5zZXJ0IHRva2VuIHRvIHRlbGwgTVRYIHRvIGluc2VydCByYXRlLWNvbnRyb2wgdmFsdWUgKFFTY2FsZSBpcyBzZW50IGFzIGFuIGFyZ3VtZW50IGluIE1UWF9TZW5kX0VsZW1lbnRzX1RvX1ZMQygmTVRYX0hlYWRlciwgRnJhbWVRU2NhbGUpKQogICAgLy8gdm9wX3F1YW50CQkJCT0gNSBCaXRzCT0geAk1LWJpdCBmcmFtZSBRX3NjYWxlIGZyb20gcmF0ZSBjb250cm9sIC0gR0VORVJBVEVEIEJZIE1UWAogICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfRlJBTUVRU0NBTEUpOyAKCiAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9SQVdEQVRBKTsKCiAgICAvLyBpZiBpdCB3YXMgbm90IFBMVVNQVFlQRSBpLmUgZm9yIHN0YW5kYXJkIGZvcm1hdCBzaXplIGluc2VydCBDUE0gYml0IGhlcmUuCiAgICBpZiAoU291cmNlRm9ybWF0VHlwZSAhPSA3KQogICAgewogICAgICAgIC8vIGNwbQk9IDEgQml0CQk9IDAJTm8gZGlyZWN0IGVmZmVjdCBvbiBlbmNvZGluZyBvZiBwaWN0dXJlCiAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwICwxKTsKICAgIH0KICAgIC8vIHBlaQkJCQkJCT0gMSBCaXQJCT0gMAlObyBkaXJlY3QgZWZmZWN0IG9uIGVuY29kaW5nIG9mIHBpY3R1cmUKICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMSk7CgogICAgcmV0dXJuOwp9Cgp2b2lkIE1QRUc0X05PVEZPUlNJTVNfV3JpdGVCaXRzX1ZPUEhlYWRlcihNVFhfSEVBREVSX1BBUkFNUyAqcE1UWF9IZWFkZXIsIE1UWF9IRUFERVJfRUxFTUVOVCAqKmF1aTMyRWxlbWVudFBvaW50ZXJzLAoJCQkJCQkJSU1HX0JPT0wJYklzVk9QX2NvZGVkLAoJCQkJCQkJU0VBUkNIX1JBTkdFX1RZUEUgc1NlYXJjaF9yYW5nZSwKCQkJCQkJCVZPUF9DT0RJTkdfVFlQRSBzVm9wQ29kaW5nVHlwZSkKewogICAgLy8gRXNzZW50aWFsIHdlIGluc2VydCB0aGUgZWxlbWVudCBiZWZvcmUgd2UgdHJ5IHRvIGZpbGwgaXQhCiAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9TVEFSVENPREVfUkFXREFUQSk7CiAgICAvLyB2aXN1YWxfb2JqZWN0X3NlcXVlbmNlX3N0YXJ0X2NvZGUJPSAzMiBCaXRzCT0gMHgxQjYKICAgIHRuZ19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDQzOCwgMzIpOwogICAgLy8gdm9wX2NvZGluZ190eXBlCQkJCQkJPSAyIEJpdHMJPSAwIGZvciBJLWZyYW1lIGFuZCAxIGZvciBQLWZyYW1lCiAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHNWb3BDb2RpbmdUeXBlLCAyKTsKCiAgICAvLyBtb2R1bG9fdGltZV9iYXNlCQogICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfTU9EVUxPX1RJTUVfQkFTRSk7CiAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9SQVdEQVRBKTsKCiAgICAvLyBtYXJrZXJfYml0CQkJCQkJCT0gMQlCaXRzCT0gMQogICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCAxKTsKCiAgICAvLyB2b3BfdGltZV9pbmNyZW1lbnQKICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX1ZPUF9USU1FX0lOQ1JFTUVOVCk7CiAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9SQVdEQVRBKTsKCiAgICAvLyBtYXJrZXJfYml0CQkJCQkJCT0gMSBCaXQJCT0gMQogICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCAxKTsKCiAgICBpZiAoIWJJc1ZPUF9jb2RlZCkKICAgIHsKCS8vIHZvcF9jb2RlZAkJCQkJCT0gMSBCaXQJCT0gMCBmb3Igc2tpcHBlZCBmcmFtZQoJdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwLCAxKTsKICAgICAgIAkvLyBieXRlX2FsaWduZWRfYml0cyAoc2tpcHBlZCBwaWN0dXJlcyBhcmUgYnl0ZSBhbGlnbmVkKQoJdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfSU5TRVJUQllURUFMSUdOX01QRzQpOyAvLyBUZWxsIE1UWCB0byBpbnNlcnQgdGhlIGJ5dGUgYWxpZ24gZmllbGQgKHdlIGRvbid0IGtub3cgZmluYWwgc3RyZWFtIHNpemUgZm9yIGFsaWdubWVudCBhdCB0aGlzIHBvaW50KQoJLy8gRW5kIG9mIFZPUCAtIHNraXBwZWQgcGljdHVyZQogICAgfSBlbHNlIHsKCS8vIHZvcF9jb2RlZAkJCQkJCT0gMSBCaXQJCT0gMSBmb3Igbm9ybWFsIGNvZGVkIGZyYW1lCgl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDEpOwoJaWYgKHNWb3BDb2RpbmdUeXBlID09IFBfRlJBTUUpCgl7CgkgICAgLy8gdm9wX3JvdW5kaW5nX3R5cGUJCQk9IDEgQml0CQk9IDAgdm9wX3JvdW5kaW5nX3R5cGUgaXMgMCBpbiBUb3BhegoJICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMSk7Cgl9CgkvLyBpbnRyYV9kY192bGNfdGhyCQkJCQk9IDMgQml0cwk9IDAgVXNlIGludHJhIERDIFZMQyBpbiBUb3BhegoJdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwLCAzKTsKCS8vIHZvcF9xdWFudAkJCQk9IDUgQml0cwk9IHgJNS1iaXQgZnJhbWUgUV9zY2FsZSBmcm9tIHJhdGUgY29udHJvbCAtIEdFTkVSQVRFRCBCWSBNVFgKCS8vdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBGcmFtZV9RX3NjYWxlLCA1KTsKCXRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX0ZSQU1FUVNDQUxFKTsKCWlmIChzVm9wQ29kaW5nVHlwZSA9PSBQX0ZSQU1FKQoJewoJICAgIC8vIHZvcF9mY29kZV9mb3J3YXJkCQkJPSAzIGJpdHMJPSAyIGZvciArLy0zMiBhbmQgMyBmb3IgKy8tNjQgc2VhcmNoIHJhbmdlCgkgICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfUkFXREFUQSk7CgkgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBzU2VhcmNoX3JhbmdlLCAzKTsKCX0KICAgIH0KfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogKiBGdW5jdGlvbjogICAgICAgICBIMjYzX0dlbmVyYXRlUGljSGRyVGVtcGxhdGUKICogKiBEZXNjcmlwdGlvbjogICAgICBHZW5lcmF0ZXMgdGhlIGguMjYzIHBpY3R1cmUgaGVhZGVyIHRlbXBsYXRlCiAqICoKICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHRuZ19fSDI2M19ub3Rmb3JzaW1zX3ByZXBhcmVfdmlkZW9fcGljdHVyZWhlYWRlcigKICAgIE1UWF9IRUFERVJfUEFSQU1TKiBwTVRYX0hlYWRlciwKICAgIEgyNjNfUElDVFVSRV9DT0RJTkdfVFlQRSBlUGljdHVyZUNvZGluZ1R5cGUsCiAgICBIMjYzX1NPVVJDRV9GT1JNQVRfVFlQRSBlU291cmNlRm9ybWF0VHlwZSwKICAgIElNR19VSU5UOCB1aThGcmFtZVJhdGUsCiAgICBJTUdfVUlOVDMyIHVpMzJQaWN0dXJlV2lkdGgsCiAgICBJTUdfVUlOVDMyIHVpMzJQaWN0dXJlSGVpZ3RoICkKewogICAgLy8gRXNzZW50aWFsIHdlIGluaXRpYWxpc2Ugb3VyIGhlYWRlciBzdHJ1Y3R1cmVzIGJlZm9yZSBidWlsZGluZwogICAgTVRYX0hFQURFUl9FTEVNRU5UICpUaGlzX0VsZW1lbnQ7CiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKmF1aTMyRWxlbWVudFBvaW50ZXJzW01BWE5VTUJFUkVMRU1FTlRTXTsKICAgIHBNVFhfSGVhZGVyLT51aTMyRWxlbWVudHM9RUxFTUVOVFNfRU1QVFk7CiAgICBUaGlzX0VsZW1lbnQ9KE1UWF9IRUFERVJfRUxFTUVOVCAqKSBwTVRYX0hlYWRlci0+YXNFbGVtZW50U3RyZWFtOwogICAgYXVpMzJFbGVtZW50UG9pbnRlcnNbMF09VGhpc19FbGVtZW50OwoKICAgIEgyNjNfTk9URk9SU0lNU19Xcml0ZUJpdHNfVmlkZW9QaWN0dXJlSGVhZGVyKAogICAgICAgICAgICAgICBwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgIGVQaWN0dXJlQ29kaW5nVHlwZSwKICAgICAgICAgICAgICAgZVNvdXJjZUZvcm1hdFR5cGUsCiAgICAgICAgICAgICAgIHVpOEZyYW1lUmF0ZSwKICAgICAgICAgICAgICAgdWkzMlBpY3R1cmVXaWR0aCwKICAgICAgICAgICAgICAgdWkzMlBpY3R1cmVIZWlndGggKTsKCiAgICBwTVRYX0hlYWRlci0+dWkzMkVsZW1lbnRzKys7IC8vSGFzIGJlZW4gdXNlZCBhcyBhbiBpbmRleCwgc28gbmVlZCB0byBhZGQgMSBmb3IgYSB2YWxpZCBlbGVtZW50IGNvdW50Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAqIEZ1bmN0aW9uOiAgICAgICAgIE1QRUc0X0dlbmVyYXRlUGljSGRyVGVtcGxhdGUKICogKiBEZXNjcmlwdGlvbjogICAgICBHZW5lcmF0ZXMgdGhlIE1QRUc0IHBpY3R1cmUgaGVhZGVyIHRlbXBsYXRlCiAqICoKICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHRuZ19fTVBFRzRfbm90Zm9yc2ltc19wcmVwYXJlX3ZvcF9oZWFkZXIoCiAgICBNVFhfSEVBREVSX1BBUkFNUyogcE1UWF9IZWFkZXIsCiAgICBJTUdfQk9PTCBiSXNWT1BfY29kZWQsCiAgICBTRUFSQ0hfUkFOR0VfVFlQRSBlU2VhcmNoX3JhbmdlLAogICAgVk9QX0NPRElOR19UWVBFIGVWb3BfQ29kaW5nX1R5cGUpCnsKICAgIC8vQnVpbGRzIGEgc2luZ2xlIE1QRUc0IFZPUCAocGljdHVyZSkgaGVhZGVyIGZyb20gdGhlIGdpdmVuIHBhcmFtZXRlcnMKICAgIC8vRXNzZW50aWFsIHdlIGluaXRpYWxpc2Ugb3VyIGhlYWRlciBzdHJ1Y3R1cmVzIGJlZm9yZSBidWlsZGluZwogICAgTVRYX0hFQURFUl9FTEVNRU5UICpUaGlzX0VsZW1lbnQ7CiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKmF1aTMyRWxlbWVudFBvaW50ZXJzW01BWE5VTUJFUkVMRU1FTlRTXTsKICAgIHBNVFhfSGVhZGVyLT51aTMyRWxlbWVudHM9RUxFTUVOVFNfRU1QVFk7CiAgICBUaGlzX0VsZW1lbnQ9KE1UWF9IRUFERVJfRUxFTUVOVCAqKSBwTVRYX0hlYWRlci0+YXNFbGVtZW50U3RyZWFtOwogICAgYXVpMzJFbGVtZW50UG9pbnRlcnNbMF09VGhpc19FbGVtZW50OwoKICAgIC8vRnJhbWUgUVNjYWxlIG5vIGxvbmdlciB3cml0dGVuIGhlcmUgYXMgaXQgaXMgaW5zZXJ0ZWQgYnkgTVRYIGxhdGVyIChhZGQgYXMgcGFyYW1ldGVyIHRvIE1UWF9TZW5kX0VsZW1lbnRzX1RvX1ZMQykKICAgIE1QRUc0X05PVEZPUlNJTVNfV3JpdGVCaXRzX1ZPUEhlYWRlcigKCXBNVFhfSGVhZGVyLCAKCWF1aTMyRWxlbWVudFBvaW50ZXJzLCAKCWJJc1ZPUF9jb2RlZCwgCgllU2VhcmNoX3JhbmdlLCAKCWVWb3BfQ29kaW5nX1R5cGUpOwoKICAgIHBNVFhfSGVhZGVyLT51aTMyRWxlbWVudHMrKzsgLy9IYXMgYmVlbiB1c2VkIGFzIGFuIGluZGV4LCBzbyBuZWVkIHRvIGFkZCAxIGZvciBhIHZhbGlkIGVsZW1lbnQgY291bnQKfQoKdm9pZCBIMjYzX05PVEZPUlNJTVNfV3JpdGVCaXRzX0dPQlNsaWNlSGVhZGVyKE1UWF9IRUFERVJfUEFSQU1TICpwTVRYX0hlYWRlciwgTVRYX0hFQURFUl9FTEVNRU5UICoqYXVpMzJFbGVtZW50UG9pbnRlcnMpCnsKICAgICAgIC8vIEVzc2VudGlhbCB3ZSBpbnNlcnQgdGhlIGVsZW1lbnQgYmVmb3JlIHdlIHRyeSB0byBmaWxsIGl0IQogICAgICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwogICAgLy8gZ29iX3Jlc3luY19tYXJrZXIgICAgICAgICAgICAgICA9IDE3ICAgICAgICAgICAgPSAweDEKICAgICAgIHRuZ19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDE3KTsKCiAgICAgICAvLyBnb2JfbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1ICAgICAgICAgICAgICAgICAgICAgPSAwLTE3ICBJdCBpcyBnb2IgbnVtYmVyIGluIGEgcGljdHVyZQogICAgICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfU0xJQ0VfTlVNKTsgLy8gSW5zZXJ0IHRva2VuIHRvIHRlbGwgTVRYIHRvIGluc2VydCBnb2JfbnVtYmVyCgogICAgLy8gZ29iX2ZyYW1lX2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAgICAgICAgID0gMC0zICAgU2VlIG5vdGUKICAgICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX0dPQl9GUkFNRV9JRCk7IC8vIEluc2VydCB0b2tlbiB0byB0ZWxsIE1UWCB0byBpbnNlcnQgZ29iX2ZyYW1lX2lkCgogICAgICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfUkFXREFUQSk7CgogICAgICAgLy8gcXVhbnRfc2NhbGUgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSAgICAgICAgICAgICAgICAgICAgID0gMS0zMiAgZ29iIChTbGljZSkgUV9zY2FsZQogICAgICAgLy8gdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCB1aThHT0JfUV9TY2FsZSwgNSk7CiAgICAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9TTElDRVFTQ0FMRSk7IC8vIEluc2VydCB0b2tlbiB0byB0ZWxsIE1UWCB0byBpbnNlcnQgcmF0ZS1jb250cm9sIHZhbHVlIChRU2NhbGUgaXMgc2VudCBhcyBhbiBhcmd1bWVudAp9CgoKCnN0YXRpYyBJTUdfVUlOVDggQml0czJDb2RlKElNR19VSU5UMzIgQ29kZVZhbCkKewogICAgSU1HX1VJTlQ4IEJpdHMgPSAzMjsKICAgIGlmIChDb2RlVmFsID09IDApCiAgICAgICAgcmV0dXJuIDE7CiAgICB3aGlsZSAoIShDb2RlVmFsICYgMHg4MDAwMDAwMCkpIHsKICAgICAgICBDb2RlVmFsIDw8PSAxOwogICAgICAgIEJpdHMtLTsKICAgIH0KICAgIHJldHVybiBCaXRzOwp9CgovKgogKiBJbnRlcm1lZGlhcnkgZnVuY3Rpb25zIHRvIGJ1aWxkIE1QRUc0IGhlYWRlcnMKICovCiNkZWZpbmUgTUFUQ0hfVE9fRU5DCgoKc3RhdGljIHZvaWQgdG5nX19NUEVHNF93cml0ZWJpdHNfc2VxdWVuY2VfaGVhZGVyKAogICAgTVRYX0hFQURFUl9QQVJBTVMgKnBNVFhfSGVhZGVyLAogICAgTVRYX0hFQURFUl9FTEVNRU5UICoqYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICBJTUdfQk9PTCBiQkZyYW1lLAogICAgTVBFRzRfUFJPRklMRV9UWVBFIGJQcm9maWxlLAogICAgSU1HX1VJTlQ4IHVpOFByb2ZpbGVfYW5kX2xldmVsX2luZGljYXRpb24sCiAgICBGSVhFRF9WT1BfVElNRV9UWVBFIF9fbWF5YmVfdW51c2VkIHNGaXhlZF92b3BfdGltZV9pbmNyZW1lbnQsCiAgICBJTUdfVUlOVDMyIFBpY3R1cmVfV2lkdGhfUGl4ZWxzLAogICAgSU1HX1VJTlQzMiBQaWN0dXJlX0hlaWdodF9QaXhlbHMsCiAgICBWQlZQQVJBTVMgKnNWQlZQYXJhbXMsIElNR19VSU5UMzIgdWkzMlZvcFRpbWVSZXNvbHV0aW9uKSAvKiBTZW5kIE5VTEwgcG9pbnRlciBpZiB0aGVyZSBhcmUgbm8gVkJWUGFyYW1zICovCnsKCS8vIEVzc2VudGlhbCB3ZSBpbnNlcnQgdGhlIGVsZW1lbnQgYmVmb3JlIHdlIHRyeSB0byBmaWxsIGl0IQoJdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwoJLy8gdmlzdWFsX29iamVjdF9zZXF1ZW5jZV9zdGFydF9jb2RlCT0gMzIgQml0cwk9IDB4MUIwCgl0bmdfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCA0MzIsIDMyKTsKCS8vcHJvZmlsZV9hbmRfbGV2ZWxfaW5kaWNhdGlvbgkJCT0gOCBCaXRzCT0gU1AgTDAtTDMgYW5kIFNQIEw0LUw1IGFyZSBzdXBwb3J0ZWQKCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgdWk4UHJvZmlsZV9hbmRfbGV2ZWxfaW5kaWNhdGlvbiwgOCk7CgoJdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwoJLy8gdmlzdWFsX29iamVjdF9zdGFydF9jb2RlCQkJCT0gMzIgQml0cwk9IDB4MUI1Cgl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDgpOwoJdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwLCA4KTsKCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSwgOCk7Cgl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDE4MSwgOCk7CgkvLyBpc192aXN1YWxfb2JqZWN0X2lkZW50aWZpZXIJCQk9IDEgQml0IAk9IDAKCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMSk7CgkvLyB2aXN1YWxfb2JqZWN0X3R5cGUJCQkJCT0gNCBCaXRzCT0gVmlkZW8gSUQgPSAxCgl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDQpOwoJLy8gdmlkZW9fc2lnbmFsX3R5cGUJCQkJCT0gMSBCaXQJCT0gMQoJdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwLCAxKTsKCS8vIGJ5dGVfYWxpZ25lZF9iaXRzCQkJCQk9IDIgQml0cwk9IDAxYiAoYnl0ZV9hbGlnbmVkX2JpdHMgaXMgMi1iaXQgc3R1ZmZpbmcgYml0IGZpZWxkIDAxKQoJdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCAyKTsKCgl0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9TVEFSVENPREVfUkFXREFUQSk7CgkvL3ZpZGVvX29iamVjdF9zdGFydF9jb2RlCQkJCT0gMzIgQml0cwk9IDB4MTAwIE9uZSBWTyBvbmx5IGluIGEgVG9wYXogdmlkZW8gc3RyZWFtCgl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDgpOwoJdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwLCA4KTsKCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSwgOCk7Cgl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDgpOwoKCXRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX1NUQVJUQ09ERV9SQVdEQVRBKTsKCS8vIHZpZGVvX29iamVjdF9sYXllcl9zdGFydF9jb2RlCQk9IDMyIEJpdHMJPSAweDEyMCBPbmUgVk9MIG9ubHkgaW4gYSBUb3BheiBzdHJlYW0KCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgOCk7Cgl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDgpOwoJdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCA4KTsKCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMzIsIDgpOwoJLy8gcmFuZG9tX2FjY2Vzc2libGVfdm9sCQkJCT0gMSBCaXQJCT0gMCAoUC1GcmFtZSBpbiBHT1ApCgl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDEpOwoJaWYgKGJQcm9maWxlID09IFNQKQoJewoJCS8vIHZpZGVvX29iamVjdF90eXBlX2luZGljYXRpb24JCQk9IDggQml0cwk9IDB4MDEgZm9yIFNQCgkJdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCA4KTsKI2lmbmRlZiBNQVRDSF9UT19FTkMKCQkvLyBpc19vYmplY3RfbGF5ZXJfaWRlbnRpZmllcgkJCT0gMSBCaXQJCT0gMCBmb3IgU1AKCQl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDEpOwojZWxzZQoJLy8gdG8gbWF0Y2ggdGhlIGVuY29kZXIKCQkvLyBpc19vYmplY3RfbGF5ZXJfaWRlbnRpZmllcgkJCT0gMSBCaXQKCQl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDEpOwoJCS8vIHZpZGVvX29iamVjdF9sYXllcl92ZXJpZAkJCQk9IDQgQml0cwoJCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSwgNCk7CiAgICAgICAgLy8gdmlkZW9fb2JqZWN0X2xheWVyX3ByaW9yaXR5CQkJPSAzIEJpdHMKCQl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDMpOyAgLy8gMCBpcyByZXNlcnZlZC4uLgojZW5kaWYKCX0KCWVsc2UKCXsKCQkvLyB2aWRlb19vYmplY3RfdHlwZV9pbmRpY2F0aW9uCQkJPSA4IEJpdHMJPSAweDExIGZvciBBU1AKCQl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDMsIDgpOwoJCS8vIGlzX29iamVjdF9sYXllcl9pZGVudGlmaWVyCQkJPSAxIEJpdAkJPSAxIGZvciBBU1AKCQl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDEpOwoJCS8vIHZpZGVvX29iamVjdF9sYXllcl92ZXJpZAkJCQk9IDQgQml0cwk9IDUgaXMgZm9yIEFTUAoJCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgNSwgNCk7CiAgICAgICAgLy8gdmlkZW9fb2JqZWN0X2xheWVyX3ByaW9yaXR5CQkJPSAzIEJpdHMJPSAxIChIaWdoZXN0IHByaW9yaXR5KQoJCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSwgMyk7Cgl9CgkvLyBhc3BlY3RfcmF0aW9faW5mbwkJCQkJCT0gNCBCaXRzCT0weDEgKFNxdWFyZSBwaXhlbCkKCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSwgNCk7CiNpZiAhZGVmaW5lZChNQVRDSF9UT19FTkMpIHx8ICFkZWZpbmVkIChFWENMVURFX1ZPTF9DT05UUk9MX1BBUkFNUykKCS8vIHZvbF9jb250cm9sX3BhcmFtZXRlcnMJCQkJCT0gMSBCaXQJCT0gMSAoQWx3YXlzIHNlbmQgVk9MIGNvbnRyb2wgcGFyYW1ldGVycykKCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSwgMSk7CgogICAgLy8gY2hyb21hX2Zvcm1hdAkJCQkJCQk9IDIgQml0cwk9IDAxYiAoNDoyOjApCgl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDIpOwoJLy8gbG93X2RlbGF5CQkJCQkJCT0gMSBCaXQJCQk9IDAgd2l0aCBCLWZyYW1lIGFuZCAxIHdpdGhvdXQgQi1mcmFtZQoJaWYgKGJCRnJhbWUpCgkJdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwLCAxKTsKCWVsc2UKCQl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDEpOwogICAgLy8gdmJ2X3BhcmFtZXRlcnMJCQkJCQk9IDEgQml0CQkJPTAvMQoJaWYgKHNWQlZQYXJhbXMpCgl7CgkJdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCAxKTsKCQkgLy9Gb3IgcmVjb3JkaW5nLCBvbmx5IHNlbmQgdmJ2IHBhcmFtZXRlcnMgaW4gMXN0IHNlcXVlbmNlIGhlYWRlci4gRm9yIHZpZGVvIHBob25lLCBpdCBzaG91bGQgYmUgc2VudCBtb3JlIG9mdGVuLCBzdWNoIGFzIG9uY2UgcGVyIHNlcXVlbmNlCgkJdG5nX193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgc1ZCVlBhcmFtcy0+Rmlyc3RfaGFsZl9iaXRfcmF0ZSwgMTUpOwkJCS8vIGZpcnN0X2hhbGZfYml0X3JhdGUKICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDEpOwkvLyBNYXJrZXIgQml0ID0gMQoJCXRuZ19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHNWQlZQYXJhbXMtPkxhdHRlcl9oYWxmX2JpdF9yYXRlLCAxNSk7CQkJLy8gbGF0dGVyX2hhbGZfYml0X3JhdGUKICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDEpOwkvLyBNYXJrZXIgQml0ID0gMQoJCXRuZ19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHNWQlZQYXJhbXMtPkZpcnN0X2hhbGZfdmJ2X2J1ZmZlcl9zaXplLCAxNSk7CS8vIGZpcnN0X2hhbGZfdmJ2X2J1ZmZlcl9zaXplCiAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCAxKTsJLy8gTWFya2VyIEJpdCA9IDEKICAgICAgICB0bmdfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBzVkJWUGFyYW1zLT5MYXR0ZXJfaGFsZl92YnZfYnVmZmVyX3NpemUsIDMpOwkvLyAgbGF0dGVyX2hhbGZfdmJ2X2J1ZmZlcl9zaXplCiAgICAgICAgdG5nX193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgc1ZCVlBhcmFtcy0+Rmlyc3RfaGFsZl92YnZfb2NjdXBhbmN5LCAxMSk7CQkvLyAgZmlyc3RfaGFsZl92YnZfb2NjdXBhbmN5CiAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCAxKTsJLy8gTWFya2VyIEJpdCA9IDEKCQl0bmdfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBzVkJWUGFyYW1zLT5MYXR0ZXJfaGFsZl92YnZfb2NjdXBhbmN5LCAxNSk7CQkvLyAgbGF0dGVyX2hhbGZfdmJ2X29jY3VwYW5jeQogICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSwgMSk7CS8vIE1hcmtlciBCaXQgPSAxCgl9CgllbHNlCgkJdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwLCAxKTsgLy8gTm8gdmJ2IHBhcmFtZXRlcnMgcHJlc2VudAojZWxzZQoJdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwLCAxKTsKI2VuZGlmCgkvLyB2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUJCQk9IDIgQml0cwkJPQkwMGIJUmVjdGFuZ3VsYXIgc2hhcGUKCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMik7Cgl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDEpOwkJLy8gTWFya2VyIEJpdCA9IDEKCS8vIHZvcF90aW1lX2luY3JlbWVudF9zb2x1dGlvbgkJPSAxNiBCaXRzCgl0bmdfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCB1aTMyVm9wVGltZVJlc29sdXRpb24sIDE2KTsKCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSwgMSk7CQkvLyBNYXJrZXIgQml0ID0gMQojaWZuZGVmIE1BVENIX1RPX0VOQwoJLy8gZml4ZWRfdm9wX3JhdGUJCQkJCT0gMSBCaXRzCQk9CTEgQWx3YXlzIGZpeGVkIGZyYW1lIHJhdGUKCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSwgMSk7CgkvLyBmaXhlZF92b3BfdGltZV9pbmNyZW1lbnQJCQk9IFZhcmlhYmxlIG51bWJlciBvZiBiaXRzIGJhc2VkIG9uIHRoZSB0aW1lIGluY3JlbWVudCByZXNvbHV0aW9uLgoJdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCBCaXRzMkNvZGUodWkzMlZvcFRpbWVSZXNvbHV0aW9uKSk7Cgl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDEpOwkJLy8gTWFya2VyIEJpdCA9IDEKI2Vsc2UKCS8vIGZpeGVkX3ZvcF9yYXRlCQkJCQk9IDEgQml0cwkJPQkwCgl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDEpOwoJdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCAxKTsJCS8vIE1hcmtlciBCaXQgPSAxCiNlbmRpZgoJLy8gdmlkZW9fb2JqZWN0X2xheWVyX3dpZHRoCQkJPSAxMyBCaXRzCQlQaWN0dXJlIHdpZHRoIGluIHBpeGVsIHVuaXRzCgl0bmdfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBQaWN0dXJlX1dpZHRoX1BpeGVscywgMTMpOwoJdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCAxKTsJCS8vIE1hcmtlciBCaXQgPSAxCgkvLyB2aWRlb19vYmplY3RfbGF5ZXJfaGVpZ2h0CQk9IDEzIEJpdHMJCVBpY3R1cmUgaGVpZ2h0IGluIHBpeGVsIHVuaXRzCgl0bmdfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBQaWN0dXJlX0hlaWdodF9QaXhlbHMsIDEzKTsKCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSwgMSk7CQkvLyBNYXJrZXIgQml0ID0gMQoJLy8gaW50ZXJsYWNlZAkJCQkJCT0gMSBCaXQJCQk9IDAgVG9wYXogb25seSBlbmNvZGVzIHByb2dyZXNzaXZlIGZyYW1lcwoJdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwLCAxKTsKCS8vIG9ibWNfZGlzYWJsZQkJCQkJCT0gMSBCaXQJCQk9IDEgTm8gb3ZlcmxhcHBlZCBNQyBpbiBUb3BhegoJdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCAxKTsKICAgIC8vIHNwcml0ZV9lbmFibGUJCQkJCT0gMSBCaXQJCQk9IDAgTm90IHVzZSBzcHJpdGUgaW4gVG9wYXoKCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMSk7CgkvLyBub3RfOF9iaXQJCQkJCQk9IDEJQml0CQkJPSAwCTgtYml0IHZpZGVvIGluIFRvcGF6Cgl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDEpOwoJLy8gcXVhbnRfdHlwZQkJCQkJCT0gMSBCaXQJCQk9IDAgMm5kIHF1YW50aXphdGlvbiBtZXRob2QgaW4gVG9wYXoKCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMSk7CglpZiAoYlByb2ZpbGU9PUFTUCkKCXsKCQkvLyBxdWFydGVyX3NhbXBsZQkJCQk9IDEgQml0CQkJPSAwIE5vID9wZWwgTUMgaW4gVG9wYXoKCQl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDEpOwoJfQoKCS8vIGNvbXBsZXhpdHlfZXN0aW1hdGlvbl9kaXNhYmxlCT0gMSBCaXQJCQk9IDEJTm8gY29tcGxleGl0eSBlc3RpbWF0aW9uIGluIFRvcGF6Cgl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDEpOwojaWZuZGVmIE1BVENIX1RPX0VOQwoJLy8gcmVzeW5jX21hcmtlcl9kaXNhYmxlCQkJPSAxIEJpdAkJCT0gMCBBbHdheXMgZW5hYmxlIHJlc3luYyBtYXJrZXIgaW4gVG9wYXoKCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMSk7CiNlbHNlCgl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDEpOwojZW5kaWYKICAgIC8vIGRhdGFfcGFydGl0aW9uZWQJCQkJCT0gMSBCaXQJCQk9IDAgTm8gZGF0YSBwYXJ0aXRpb25pbmcgaW4gVG9wYXoKCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMSk7CiAgICBpZiAoYlByb2ZpbGUgPT0gQVNQKQoJewoJCS8vIG5ld3ByZWRfZW5hYmxlCQkJCT0gMSBCaXQJCQk9IDAgTm8gbmV3cHJlZCBtb2RlIGluIFNQL0FTUAoJCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMSk7CgkJLy8gcmVkdWNlZF92b3BfcmVzb2x1dGlvbl9lbmFibGU9MSBCaXQJCQk9IDAJTm8gcmVkdWNlZCByZXNvbHV0aW9uIGZyYW1lIGluIFNQL0FTUAoJCXRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMSk7CiAgICB9CiAgICAvLyBzY2FsYWJpbGl0eQkJCQkJCT0gMSBCaXQJCQk9IDAJTm8gc2NhbGFiaWxpdHkgaW4gU1AvQVNQCgl0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDEpOwoJLy8gYnl0ZV9hbGlnbmVkX2JpdHMKICAgCXRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX0lOU0VSVEJZVEVBTElHTl9NUEc0KTsgLy8gVGVsbCBNVFggdG8gaW5zZXJ0IHRoZSBieXRlIGFsaWduIGZpZWxkICh3ZSBkb24ndCBrbm93IGZpbmFsIHN0cmVhbSBzaXplIGZvciBhbGlnbm1lbnQgYXQgdGhpcyBwb2ludCkKCXJldHVybjsKfQoKCi8qIFV0aWxpdHkgZnVuY3Rpb24gKi8KLyoKICBJTUdfVUlOVDggQml0czJDb2RlKElNR19VSU5UMzIgQ29kZVZhbCkKICB7CiAgSU1HX1VJTlQ4IEJpdHM9MzI7CiAgaWYoQ29kZVZhbD09MCkKICByZXR1cm4gMTsKICB3aGlsZSghKENvZGVWYWwgJiAweDgwMDAwMDAwKSkKICB7CiAgQ29kZVZhbDw8PTE7CiAgQml0cy0tOwogIH0KICByZXR1cm4gQml0czsKICB9CiovCgovKiBNUEVHIDQgVk9QIChQaWN0dXJlKSBIZWFkZXIgKi8Kc3RhdGljIHZvaWQgdG5nX19NUEVHNF93cml0ZWJpdHNfVk9QX2hlYWRlcigKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyLAogICAgTVRYX0hFQURFUl9FTEVNRU5UICoqYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICBJTUdfQk9PTCAgICBiSXNWT1BfY29kZWQsCiAgICBJTUdfVUlOVDggICBWT1BfdGltZV9pbmNyZW1lbnQsCiAgICBTRUFSQ0hfUkFOR0VfVFlQRSBzU2VhcmNoX3JhbmdlLAogICAgVk9QX0NPRElOR19UWVBFIHNWb3BDb2RpbmdUeXBlLAogICAgSU1HX1VJTlQzMiBWb3BUaW1lUmVzb2x1dGlvbikKewogICAgSU1HX0JPT0wgYklzU3luY1BvaW50OwogICAgLyogRXNzZW50aWFsIHdlIGluc2VydCB0aGUgZWxlbWVudCBiZWZvcmUgd2UgdHJ5IHRvIGZpbGwgaXQhICovCiAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKG10eF9oZHIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX1NUQVJUQ09ERV9SQVdEQVRBKTsKCiAgICAvKiB2aXN1YWxfb2JqZWN0X3NlcXVlbmNlX3N0YXJ0X2NvZGUgICAgICAgID0gMzIgQml0cyAgICAgICA9IDB4MUI2ICovCiAgICB0bmdfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMobXR4X2hkciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDQzOCwgMzIpOwoKICAgIC8qIHZvcF9jb2RpbmdfdHlwZSAgPSAyIEJpdHMgPSAwIGZvciBJLWZyYW1lIGFuZCAxIGZvciBQLWZyYW1lICovCiAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgc1ZvcENvZGluZ1R5cGUsIDIpOwogICAgYklzU3luY1BvaW50ID0gKFZPUF90aW1lX2luY3JlbWVudCA+IDEpICYmICgoVk9QX3RpbWVfaW5jcmVtZW50KSAlIFZvcFRpbWVSZXNvbHV0aW9uID09IDApOwoKI2lmbmRlZiBNQVRDSF9UT19FTkMKICAgIC8qIG1vZHVsb190aW1lX2Jhc2UgPSAxIEJpdCA9IDAgQXMgYXQgbGVhc3QgIDEgc3luY2hyb25pemF0aW9uIHBvaW50IChJLWZyYW1lKSBwZXIgc2Vjb25kIGluIFRvcGF6ICovCiAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMSk7CiNlbHNlCgogICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIGJJc1N5bmNQb2ludCAgPyAyIDogMCAsIGJJc1N5bmNQb2ludCA/IDIgOiAxKTsKCiNlbmRpZgoKICAgIC8qIG1hcmtlcl9iaXQgPSAxICAgQml0cyAgICA9IDEgICAgICAqLwogICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDEpOwoKI2lmbmRlZiBNQVRDSF9UT19FTkMKICAgIC8qIHZvcF90aW1lX2luY3JlbWVudCA9IFZhcmlhYmxlIGJpdHMgYmFzZWQgb24gcmVzb2x1dGlvbgogICAgICogID0geCBSZXNldCB0byAwIGF0IEktZnJhbWUgYW5kIHBsdXMgZml4ZWRfdm9wX3RpbWVfaW5jcmVtZW50IGVhY2ggZnJhbWUKICAgICAqLwogICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIFZPUF90aW1lX2luY3JlbWVudCwgNSk7CiNlbHNlCiAgICAvKiB3aWxsIGNocmFzaCBoZXJlLi4uICovCiAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cygKICAgICAgICBtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAoVk9QX3RpbWVfaW5jcmVtZW50KSAlIFZvcFRpbWVSZXNvbHV0aW9uLAogICAgICAgIEJpdHMyQ29kZShWb3BUaW1lUmVzb2x1dGlvbiAtIDEpKTsKCiNlbmRpZgogICAgLyogbWFya2VyX2JpdCA9IDEgQml0ICAgICAgICAgICAgICAgPSAxICAgICAgKi8KICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCAxKTsKCiAgICBpZiAoIWJJc1ZPUF9jb2RlZCkgewogICAgICAgIC8qIHZvcF9jb2RlZCAgICA9IDEgQml0ICAgICAgICAgPSAwIGZvciBza2lwcGVkIGZyYW1lICovCiAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDEpOwoKICAgICAgICAvKiBieXRlX2FsaWduZWRfYml0cyAoc2tpcHBlZCBwaWN0dXJlcyBhcmUgYnl0ZSBhbGlnbmVkKSAqLwogICAgICAgIC8qIFRlbGwgTVRYIHRvIGluc2VydCB0aGUgYnl0ZSBhbGlnbiBmaWVsZCAod2UgZG9uJ3Qga25vdyBmaW5hbCBzdHJlYW0gc2l6ZSBmb3IgYWxpZ25tZW50IGF0IHRoaXMgcG9pbnQpCiAgICAgICAgICogRW5kIG9mIFZPUCAtIHNraXBwZWQgcGljdHVyZQogICAgICAgICAqLwogICAgICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4obXR4X2hkciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfSU5TRVJUQllURUFMSUdOX01QRzQpOwogICAgfSBlbHNlIHsKICAgICAgICAvKiB2b3BfY29kZWQgPSAxIEJpdCAgICAgICAgICAgID0gMSBmb3Igbm9ybWFsIGNvZGVkIGZyYW1lICovCiAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDEpOwoKICAgICAgICBpZiAoc1ZvcENvZGluZ1R5cGUgPT0gUF9GUkFNRSkgewogICAgICAgICAgICAvKiB2b3Bfcm91bmRpbmdfdHlwZSA9IDEgQml0ID0gMCB2b3Bfcm91bmRpbmdfdHlwZSBpcyAwIGluIFRvcGF6ICovCiAgICAgICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwLCAxKTsKICAgICAgICB9CgogICAgICAgIC8qIGludHJhX2RjX3ZsY190aHIgPSAzIEJpdHMgPSAwIFVzZSBpbnRyYSBEQyBWTEMgaW4gVG9wYXogKi8KICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMyk7CgogICAgICAgIC8qIHZvcF9xdWFudCA9IDUgQml0cyAgID0geCAgICAgNS1iaXQgZnJhbWUgUV9zY2FsZSBmcm9tIHJhdGUgY29udHJvbCAtIEdFTkVSQVRFRCBCWSBNVFggKi8KICAgICAgICAvKiB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRnJhbWVfUV9zY2FsZSwgNSk7ICovCiAgICAgICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9GUkFNRVFTQ0FMRSk7CgogICAgICAgIGlmIChzVm9wQ29kaW5nVHlwZSA9PSBQX0ZSQU1FKSB7CiAgICAgICAgICAgIC8qIHZvcF9mY29kZV9mb3J3YXJkID0gMyBiaXRzICAgICAgID0gMiBmb3IgKy8tMzIgYW5kIDMgZm9yICsvLTY0IHNlYXJjaCByYW5nZSAgKi8KICAgICAgICAgICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9SQVdEQVRBKTsKICAgICAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHNTZWFyY2hfcmFuZ2UsIDMpOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAqKioqIFRIRSBGSU5BTCBQQVJUIE9GIFZPUCBTVFJVQ1RVUkUgQ0FOJ1QgQkUgR0VORVJBVEVEIEhFUkUKICAgICAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKG10eF9oZHIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX1JBV0RBVEEpOwogICAgICAgIHZpZGVvX3BhY2tldF9kYXRhICggKSAgICAgICAgICAgICAgICAgICA9IDFzdCAgVlAgdGhhdCBkb2VzbpJ0IGhhdmUgdGhlIFZQIGhlYWRlcgoKICAgICAgICB3aGlsZSAobmV4dGJpdHNfYnl0ZWFsaWduZWQgKCApID09IHJlc3luY19tYXJrZXIpCiAgICAgICAgewogICAgICAgIHZpZGVvX3BhY2tldCBfaGVhZGVyKCApCiAgICAgICAgdmlkZW9fcGFja2V0IF9kYXRhKCApICAgICAgICAgICAgICAgICAgIEFsbCBNQiBpbiB0aGUgc2xpY2UKICAgICAgICB9CiAgICAgICAgKi8KICAgIH0KfQoKLyoKICogSW50ZXJtZWRpYXJ5IGZ1bmN0aW9ucyB0byBidWlsZCBIMjYzIGhlYWRlcnMKICovCnN0YXRpYyB2b2lkIEgyNjNfd3JpdGViaXRzX1ZpZGVvU2VxdWVuY2VIZWFkZXIoCiAgICBNVFhfSEVBREVSX1BBUkFNUyAqbXR4X2hkciwKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqKmF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgSU1HX1VJTlQ4IFByb2ZpbGVfYW5kX2xldmVsX2luZGljYXRpb24pCnsKICAgIC8qIEVzc2VudGlhbCB3ZSBpbnNlcnQgdGhlIGVsZW1lbnQgYmVmb3JlIHdlIHRyeSB0byBmaWxsIGl0ISAqLwogICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9TVEFSVENPREVfUkFXREFUQSk7CgogICAgLyogdmlzdWFsX29iamVjdF9zZXF1ZW5jZV9zdGFydF9jb2RlICAgICAgICA9IDMyIEJpdHMgICAgICAgPSAweDFCMCAqLwogICAgdG5nX193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCA0MzIsIDMyKTsKCiAgICAvKiBwcm9maWxlX2FuZF9sZXZlbF9pbmRpY2F0aW9uID0gOCBCaXRzID0gIHggU1AgTDAtTDMgYW5kIFNQIEw0LUw1IGFyZSBzdXBwb3J0ZWQgKi8KICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBQcm9maWxlX2FuZF9sZXZlbF9pbmRpY2F0aW9uLCA4KTsKCiAgICAvKiB2aXN1YWxfb2JqZWN0X3N0YXJ0X2NvZGUgPSAzMiBCaXRzICAgICAgID0gMHgxQjUgKi8KCiAgICAvKiA0MzcgdG9vIGxhcmdlIGZvciB0aGUgICB0bmdfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMgZnVuY3Rpb24gKi8KICAgIHRuZ19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgNDM3LCAzMik7CgogICAgLyogaXNfdmlzdWFsX29iamVjdF9pZGVudGlmaWVyID0gMSBCaXQgICAgICAgICAgICAgID0gMCAqLwogICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDEpOwoKICAgIC8qIGlzX3Zpc3VhbF9vYmplY3RfdHlwZSAgICA9IDQgQml0cyAgICAgICAgPSAxIFZpZGVvIElEICovCiAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSwgNCk7CgogICAgLyogdmlkZW9fc2lnbmFsX3R5cGUgPSAxIEJpdCAgICAgICAgICAgICAgICA9IDAgICAgICAqLwogICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDEpOwoKICAgIC8qIGJ5dGVfYWxpZ25lZF9iaXRzID0gMiBCaXRzID0gMDFiIGJ5dGVfYWxpZ25lZF9iaXRzIGlzIDItYml0IHN0dWZmaW5nIGJpdCBmaWVsZCAwMSAqLwogICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDIpOwoKICAgIC8qIHZpZGVvX29iamVjdF9zdGFydF9jb2RlICA9MzIgQml0cyAgICAgICAgPSAweDEwMCBPbmUgVk8gb25seSBpbiBhIFRvcGF6IHZpZGVvIHN0cmVhbSAqLwogICAgdG5nX193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAyNTYsIDMyKTsKCiAgICByZXR1cm47Cn0KCnN0YXRpYyB2b2lkIEgyNjNfd3JpdGViaXRzX1ZpZGVvUGljdHVyZUhlYWRlcigKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyLAogICAgTVRYX0hFQURFUl9FTEVNRU5UICoqYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICBJTUdfVUlOVDggVGVtcG9yYWxfUmVmLAogICAgSDI2M19QSUNUVVJFX0NPRElOR19UWVBFIFBpY3R1cmVDb2RpbmdUeXBlLAogICAgLy9JTUdfVUlOVDggUV9TY2FsZSwKICAgIEgyNjNfU09VUkNFX0ZPUk1BVF9UWVBFIFNvdXJjZUZvcm1hdFR5cGUsCiAgICBJTUdfVUlOVDggX19tYXliZV91bnVzZWQgRnJhbWVSYXRlLAogICAgSU1HX1VJTlQzMiBQaWN0dXJlV2lkdGgsCiAgICBJTUdfVUlOVDMyIFBpY3R1cmVIZWlnaHQpCnsKICAgIElNR19VSU5UOCBVRkVQOwoKICAgIC8qIEVzc2VudGlhbCB3ZSBpbnNlcnQgdGhlIGVsZW1lbnQgYmVmb3JlIHdlIHRyeSB0byBmaWxsIGl0ISAqLwogICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9TVEFSVENPREVfUkFXREFUQSk7CgogICAgLyogc2hvcnRfdmlkZW9fc3RhcnRfbWFya2VyID0gMjIgQml0cyAgICAgICA9IDB4MjAgUGljdHVyZSBzdGFydCBjb2RlICovCiAgICB0bmdfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMobXR4X2hkciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDMyLCAyMik7CgogICAgLyogdGVtcG9yYWxfcmVmZXJlbmNlID0gOCBCaXRzICAgICAgPSAwLTI1NSBFYWNoIHBpY3R1cmUgaW5jcmVhc2VkIGJ5IDEgKi8KICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBUZW1wb3JhbF9SZWYsIDgpOwoKICAgIC8qIG1hcmtlcl9iaXQgPSAxIEJpdCA9IDEgICAgKi8KICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCAxKTsKCiAgICAvKiB6ZXJvX2JpdCA9IDEgQml0cyAgICAgICAgPSAwICAgICAgKi8KICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwLCAxKTsKCiAgICAvKiBzcGxpdF9zY3JlZW5faW5kaWNhdG9yICAgPSAxICAgICBCaXRzICAgID0gMCAgICAgTm8gZGlyZWN0IGVmZmVjdCBvbiBlbmNvZGluZyBvZiBwaWN0dXJlICovCiAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMSk7CgogICAgLyogZG9jdW1lbnRfY2FtZXJhX2luZGljYXRvcj0gMSAgICAgQml0cyAgICA9IDAgICAgIE5vIGRpcmVjdCBlZmZlY3Qgb24gZW5jb2Rpbmcgb2YgcGljdHVyZSAqLwogICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDEpOwoKICAgIC8qIGZ1bGxfcGljdHVyZV9mcmVlemVfcmVsZWFzZT0xIEJpdHMgICAgICAgPSAwICAgICBObyBkaXJlY3QgZWZmZWN0IG9uIGVuY29kaW5nIG9mIHBpY3R1cmUgKi8KICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwLCAxKTsKCiAgICAvKiBzb3VyY2VfZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgQml0cyAgICA9IDEtNCAgIFNlZSBub3RlICovCiAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgU291cmNlRm9ybWF0VHlwZSwgMyk7CgogICAgaWYgKFNvdXJjZUZvcm1hdFR5cGUgIT0gNykgewogICAgICAgIC8vIHBpY3R1cmVfY29kaW5nX3R5cGUgICAgICAgICAgPSAxIEJpdCAgICAgICAgID0gMC8xICAgMCBmb3IgSS1mcmFtZSBhbmQgMSBmb3IgUC1mcmFtZQogICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBQaWN0dXJlQ29kaW5nVHlwZSwgMSk7CiAgICAgICAgLy8gZm91cl9yZXNlcnZlZF96ZXJvX2JpdHMgICAgICA9IDQgQml0cyAgICAgICAgPSAwCiAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDQpOwogICAgfSBlbHNlIHsKICAgICAgICBzdGF0aWMgdW5zaWduZWQgY2hhciAgUlRZUEUgPSAwOwoKICAgICAgICAvLyBpZiBJLSBGcmFtZSBzZXQgVXBkYXRlIEZ1bGwgRXh0ZW5kZWQgUFRZUEUgdG8gdHJ1ZQogICAgICAgIGlmIChQaWN0dXJlQ29kaW5nVHlwZSA9PSBJX0ZSQU1FKSB7CiAgICAgICAgICAgIFVGRVAgPSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFVGRVAgPSAwOwogICAgICAgIH0KICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgVUZFUCwgMyk7CiAgICAgICAgaWYgKFVGRVAgPT0gMSkgewogICAgICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgNiwgMyk7CiAgICAgICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwLCAxKTsKCiAgICAgICAgICAgIC8qIDEwIHJlc2VydmUgYml0cyAoIE9wdGlvbmFsIHN1cHBvcnQgZm9yIHRoZSBlbmNvZGluZykuIEFsbCBhcmUgT0ZGKDApLgogICAgICAgICAgICAgKiAgLSBPcHRpb25hbCBVbnJlc3RyaWN0ZWQgTW90aW9uIFZlY3RvciAoVU1WKQogICAgICAgICAgICAgKiAgLSBPcHRpb25hbCBTeW50YXgtYmFzZWQgQXJpdGhtZXRpYyBDb2RpbmcgKFNBQykKICAgICAgICAgICAgICogIC0gT3B0aW9uYWwgQWR2YW5jZWQgUHJlZGljdGlvbiAoQVApIG1vZGUKICAgICAgICAgICAgICogIC0gT3B0aW9uYWwgQWR2YW5jZWQgSU5UUkEgQ29kaW5nIChBSUMpIG1vZGUKICAgICAgICAgICAgICogIC0gT3B0aW9uYWwgRGVibG9ja2luZyBGaWx0ZXIgKERGKSBtb2RlCiAgICAgICAgICAgICAqICAtIE9wdGlvbmFsIFNsaWNlIFN0cnVjdHVyZWQgKFNTKSBtb2RlCiAgICAgICAgICAgICAqICAtIE9wdGlvbmFsIFJlZmVyZW5jZSBQaWN0dXJlIFNlbGVjdGlvbihSUFMpIG1vZGUuCiAgICAgICAgICAgICAqICAtIE9wdGlvbmFsIEluZGVwZW5kZW50IFNlZ21lbnQgRGVjb2RpbmcgKElTRCkgbW9kZQogICAgICAgICAgICAgKiAgLSBPcHRpb25hbCBBbHRlcm5hdGl2ZSBJTlRFUiBWTEMgKEFJVikgbW9kZQogICAgICAgICAgICAgKiAgLSBPcHRpb25hbCBNb2RpZmllZCBRdWFudGl6YXRpb24gKE1RKSBtb2RlICovCgogICAgICAgICAgICB0bmdfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMobXR4X2hkciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDEwKTsKICAgICAgICAgICAgLy8gMTAgcmVzZXJ2ZSBiaXRzCiAgICAgICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCA4LCA0KTsKICAgICAgICAgICAgLy8gNCByZXNlcnZlIGJpdHMKICAgICAgICB9CiAgICAgICAgLy8gcGljdHVyZV9jb2RpbmdfdHlwZSAgICAgICAgICA9IDEgQml0ICAgICAgICAgPSAwLzEgICAwIGZvciBJLWZyYW1lIGFuZCAxIGZvciBQLWZyYW1lCiAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIFBpY3R1cmVDb2RpbmdUeXBlLCAzKTsKCiAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDIpOwogICAgICAgIC8vIHR3b19yZXNlcnZlX2JpdHMsICAgICAgcm91bmRpbmdfdHlwZSwgICAgICAgdHdvX3Jlc2VydmVfYml0cyAgICAgICBtYXJrZXJfYml0ICAgICAgIENQTQogICAgICAgIC8vIFJvdW5kaW5nIFR5cGUgKFJUWVBFKSAoMSBmb3IgUCBQaWN0dXJlLCAwIGZvciBhbGwgb3RoZXIgUGljdHVyZSBmcmFtZXMuCiAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIFJUWVBFLCAxKTsKICAgICAgICAvLzIgcmVzZXJ2ZSBiaXRzCiAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDIpOwogICAgICAgIC8vICAgLSAxIChPTikgdG8gcHJldmVudCBzdGFydCBjb2RlIGVtdWxhdGlvbi4KICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSAsIDEpOwogICAgICAgIC8vIENQTSBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZSBQUFRZUEUgcGFydCBvZiB0aGUgaGVhZGVyLgogICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwICwgMSk7CgoKICAgICAgICBpZiAoVUZFUCA9PSAxKSB7CiAgICAgICAgICAgIElNR19VSU5UMTYgdWkxNlBXSSwgdWkxNlBISTsKICAgICAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDQpOwogICAgICAgICAgICAvLyBhc3BlY3QgcmF0aW8KICAgICAgICAgICAgLy9QaWN0dXJlV2lkdGgtLTsKICAgICAgICAgICAgLy90bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgKElNR19VSU5UOCkoUGljdHVyZVdpZHRoID4+IDgpLCAxKTsKICAgICAgICAgICAgLy90bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgKElNR19VSU5UOCkoUGljdHVyZVdpZHRoICYgMHhGRiksIDgpOwogICAgICAgICAgICAvL1dpZHRoID0gKFBXSS0xKSo0LCBIZWlnaHQgPSBQSEkqNCwgc2VlIEgyNjMgc3BlYyA1LjEuNQogICAgICAgICAgICB1aTE2UFdJID0gKFBpY3R1cmVXaWR0aCA+PiAyKSAtIDE7CiAgICAgICAgICAgIHRuZ19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgKElNR19VSU5UOCl1aTE2UFdJLCA5KTsKCiAgICAgICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCAxKTsKICAgICAgICAgICAgLy8gbWFya2VyX2JpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgQml0ICAgICAgICAgPSAxCiAgICAgICAgICAgIC8vdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIChJTUdfVUlOVDgpKFBpY3R1cmVIZWlnaHQgPj4gOCksIDEpOwogICAgICAgICAgICAvL3RuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAoSU1HX1VJTlQ4KShQaWN0dXJlSGVpZ2h0ICYgMHhGRiksIDgpOwoKICAgICAgICAgICAgdWkxNlBISSA9IFBpY3R1cmVIZWlnaHQgPj4gMjsKICAgICAgICAgICAgdG5nX193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAoSU1HX1VJTlQ4KXVpMTZQSEksIDkpOwogICAgICAgICAgICAvLyBnb29kIHVwIHRvIHRoYXQgcG9pbnQKICAgICAgICAgICAgLy8gIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCAxKTsKICAgICAgICAgICAgLy8gbWFya2VyX2JpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgQml0ICAgICAgICAgPSAxCiAgICAgICAgICAgIC8vIGp1c3QgY2hlY2tpbmcKICAgICAgICB9CiAgICB9CiAgICAvLyB2b3BfcXVhbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSBCaXRzICAgICAgICA9IHggICAgIDUtYml0IGZyYW1lIFFfc2NhbGUgZnJvbSByYXRlIGNvbnRyb2wgLSBHRU5FUkFURUQgQlkgTVRYCiAgICAvL3RuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCB1aThRX1NjYWxlLCA1KTsKICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4obXR4X2hkciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfRlJBTUVRU0NBTEUpOyAvLyBJbnNlcnQgdG9rZW4gdG8gdGVsbCBNVFggdG8gaW5zZXJ0IHJhdGUtY29udHJvbCB2YWx1ZSAoUVNjYWxlIAoJCQkJCQkJCQkJICAgLy9pcyBzZW50IGFzIGFuIGFyZ3VtZW50IGluIE1UWF9TZW5kX0VsZW1lbnRzX1RvX1ZMQygmTVRYX0hlYWRlciwgRnJhbWVRU2NhbGUpKQogICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9SQVdEQVRBKTsKICAgIC8vIHplcm9fYml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxIEJpdCAgICAgICAgID0gMAogICAgLy8gcGVpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSBCaXQgICAgICAgICA9IDAgICAgIE5vIGRpcmVjdCBlZmZlY3Qgb24gZW5jb2Rpbmcgb2YgcGljdHVyZQogICAgaWYgKFNvdXJjZUZvcm1hdFR5cGUgIT0gNykgewogICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwLCAxKTsKICAgIH0KCiAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMSk7CiAgICAvLyBGT0xMT1dJTkcgU0VDVElPTiBDQU4nVCBCRSBHRU5FUkFURUQgSEVSRQogICAgLy9nb2JfZGF0YSggKQogICAgLy9mb3IoaT0xOyBpPG51bV9nb2JfaW5fcGljdHVyZTsgaSsrKSB7CiAgICAvLyAgICAgIGdvYl9oZWFkZXIoICkKICAgIC8vICAgICAgZ29iX2RhdGEoICkKICAgIC8vIH0KICAgIHJldHVybjsKfQoKc3RhdGljIHZvaWQgSDI2M193cml0ZWJpdHNfR09CU2xpY2VIZWFkZXIoCiAgICBNVFhfSEVBREVSX1BBUkFNUyAqbXR4X2hkciwKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqKmF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgSU1HX1VJTlQ4IEdPQk51bWJlciwKICAgIElNR19VSU5UOCBHT0JGcmFtZUlkKQp7CiAgICAvKiBFc3NlbnRpYWwgd2UgaW5zZXJ0IHRoZSBlbGVtZW50IGJlZm9yZSB3ZSB0cnkgdG8gZmlsbCBpdCEgKi8KICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4obXR4X2hkciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwoKICAgIC8qIGdvYl9yZXN5bmNfbWFya2VyICAgICAgICAgICAgICAgID0gMTcgICAgICAgICAgICA9IDB4MSAqLwogICAgdG5nX193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKG10eF9oZHIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCAxNyk7CgogICAgLyogZ29iX251bWJlciA9IDUgICA9IDAtMTcgIEl0IGlzIGdvYiBudW1iZXIgaW4gYSBwaWN0dXJlICovCiAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgR09CTnVtYmVyLCA1KTsKCiAgICAvKiBnb2JfZnJhbWVfaWQgICAgID0gMiA9IDAtMyAgICAgICBTZWUgbm90ZSAqLwogICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMobXR4X2hkciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEdPQkZyYW1lSWQsIDIpOwoKICAgIC8qIHF1YW50X3NjYWxlICAgICAgPSA1ICAgICA9IDEtMzIgIGdvYiAoU2xpY2UpIFFfc2NhbGUgICovCiAgICAvKiB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgR09CX1FfU2NhbGUsIDUpOyAqLwoKICAgIC8qIEluc2VydCB0b2tlbiB0byB0ZWxsIE1UWCB0byBpbnNlcnQgcmF0ZS1jb250cm9sIHZhbHVlCiAgICAgKiAgKFFTY2FsZSBpcyBzZW50IGFzIGFuIGFyZ3VtZW50IGluIE1UWF9TZW5kX0VsZW1lbnRzX1RvX1ZMQygmTVRYX0hlYWRlciwgU2xpY2VRU2NhbGUpKQogICAgICovCiAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKG10eF9oZHIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX1NMSUNFUVNDQUxFKTsKICAgIHJldHVybjsKfQoKLyoKICogSGlnaCBsZXZlbCBmdW5jdGlvbnMgdG8gY2FsbCB3aGVuIGEgSDI2MyBoZWFkZXIgaXMgcmVxdWlyZWQgLSBIT1NUIFJPVVRJTkVTCiAqLwovL3N0YXRpYyB2b2lkIHRuZ19fSDI2M19nZXRlbGVtZW50c192aWRlb3NlcXVlbmNlX2hlYWRlcigKLy9NVFhfSEVBREVSX1BBUkFNUyAqbXR4X2hkciwKLy9JTUdfVUlOVDggUHJvZmlsZV9hbmRfbGV2ZWxfaW5kaWNhdGlvbikKLy97Ci8vLyogQnVpbGRzIGEgc2luZ2xlIEgyNjMgdmlkZW8gc2VxdWVuY2UgaGVhZGVyIGZyb20gdGhlIGdpdmVuIHBhcmFtZXRlcnMgKi8KLy8KLy8vKiBFc3NlbnRpYWwgd2UgaW5pdGlhbGlzZSBvdXIgaGVhZGVyIHN0cnVjdHVyZXMgYmVmb3JlIGJ1aWxkaW5nICovCi8vTVRYX0hFQURFUl9FTEVNRU5UICpUaGlzX0VsZW1lbnQ7Ci8vTVRYX0hFQURFUl9FTEVNRU5UICphdWkzMkVsZW1lbnRQb2ludGVyc1tNQVhOVU1CRVJFTEVNRU5UU107Ci8vbXR4X2hkci0+RWxlbWVudHM9RUxFTUVOVFNfRU1QVFk7Ci8vVGhpc19FbGVtZW50PShNVFhfSEVBREVSX0VMRU1FTlQgKikgbXR4X2hkci0+YXNFbGVtZW50U3RyZWFtOwovL2F1aTMyRWxlbWVudFBvaW50ZXJzWzBdPVRoaXNfRWxlbWVudDsKLy8KLy9IMjYzX3dyaXRlYml0c19WaWRlb1NlcXVlbmNlSGVhZGVyKG10eF9oZHIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBQcm9maWxlX2FuZF9sZXZlbF9pbmRpY2F0aW9uKTsKLy8KLy9tdHhfaGRyLT5FbGVtZW50cysrOyAvKiBIYXMgYmVlbiB1c2VkIGFzIGFuIGluZGV4LCBzbyBuZWVkIHRvIGFkZCAxIGZvciBhIHZhbGlkIGVsZW1lbnQgY291bnQgKi8KLy99CgovL3N0YXRpYyB2b2lkIHRuZ19fSDI2M19nZXRlbGVtZW50c192aWRlb3BpY3R1cmVfaGVhZGVyKAovL01UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyLAovL0lNR19VSU5UOCBUZW1wb3JhbF9SZWYsCi8vSDI2M19QSUNUVVJFX0NPRElOR19UWVBFIFBpY3R1cmVDb2RpbmdUeXBlLAovL0gyNjNfU09VUkNFX0ZPUk1BVF9UWVBFIFNvdXJjZUZvcm1hdFR5cGUsCi8vSU1HX1VJTlQ4IEZyYW1lUmF0ZSwKLy9JTUdfVUlOVDE2IFBpY3R1cmVXaWR0aCwKLy9JTUdfVUlOVDE2IFBpY3R1cmVIZWlndGgpCi8vewovLy8qIEVzc2VudGlhbCB3ZSBpbml0aWFsaXNlIG91ciBoZWFkZXIgc3RydWN0dXJlcyBiZWZvcmUgYnVpbGRpbmcgKi8KLy9NVFhfSEVBREVSX0VMRU1FTlQgKlRoaXNfRWxlbWVudDsKLy9NVFhfSEVBREVSX0VMRU1FTlQgKmF1aTMyRWxlbWVudFBvaW50ZXJzW01BWE5VTUJFUkVMRU1FTlRTXTsKLy9tdHhfaGRyLT5FbGVtZW50cz1FTEVNRU5UU19FTVBUWTsKLy9UaGlzX0VsZW1lbnQ9KE1UWF9IRUFERVJfRUxFTUVOVCAqKSBtdHhfaGRyLT5hc0VsZW1lbnRTdHJlYW07Ci8vYXVpMzJFbGVtZW50UG9pbnRlcnNbMF09VGhpc19FbGVtZW50OwovLwovL0gyNjNfd3JpdGViaXRzX1ZpZGVvUGljdHVyZUhlYWRlcigKLy9tdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywKLy9UZW1wb3JhbF9SZWYsCi8vUGljdHVyZUNvZGluZ1R5cGUsCi8vU291cmNlRm9ybWF0VHlwZSwKLy9GcmFtZVJhdGUsCi8vUGljdHVyZVdpZHRoLAovL1BpY3R1cmVIZWlndGgpOwovLwovL210eF9oZHItPkVsZW1lbnRzKys7IC8qIEhhcyBiZWVuIHVzZWQgYXMgYW4gaW5kZXgsIHNvIG5lZWQgdG8gYWRkIDEgZm9yIGEgdmFsaWQgZWxlbWVudCBjb3VudCAqLwovL30KCi8vc3RhdGljIHZvaWQgdG5nX19IMjYzX2dldGVsZW1lbnRzX0dPQnNsaWNlX2hlYWRlcigKLy9NVFhfSEVBREVSX1BBUkFNUyAqbXR4X2hkciwKLy9JTUdfVUlOVDggR09CTnVtYmVyLAovL0lNR19VSU5UOCBHT0JGcmFtZUlkKQovL3sKLy8vKiBFc3NlbnRpYWwgd2UgaW5pdGlhbGlzZSBvdXIgaGVhZGVyIHN0cnVjdHVyZXMgYmVmb3JlIGJ1aWxkaW5nICovCi8vTVRYX0hFQURFUl9FTEVNRU5UICpUaGlzX0VsZW1lbnQ7Ci8vTVRYX0hFQURFUl9FTEVNRU5UICphdWkzMkVsZW1lbnRQb2ludGVyc1tNQVhOVU1CRVJFTEVNRU5UU107Ci8vbXR4X2hkci0+RWxlbWVudHM9RUxFTUVOVFNfRU1QVFk7Ci8vVGhpc19FbGVtZW50PShNVFhfSEVBREVSX0VMRU1FTlQgKikgbXR4X2hkci0+YXNFbGVtZW50U3RyZWFtOwovL2F1aTMyRWxlbWVudFBvaW50ZXJzWzBdPVRoaXNfRWxlbWVudDsKLy8KLy9IMjYzX3dyaXRlYml0c19HT0JTbGljZUhlYWRlcihtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgR09CTnVtYmVyLCBHT0JGcmFtZUlkKTsKLy8KLy9tdHhfaGRyLT5FbGVtZW50cysrOyAvL0hhcyBiZWVuIHVzZWQgYXMgYW4gaW5kZXgsIHNvIG5lZWQgdG8gYWRkIDEgZm9yIGEgdmFsaWQgZWxlbWVudCBjb3VudAovL30KCi8vIFNFSV9JTlNFUlRJT04Kc3RhdGljIHZvaWQgdG5nX19IMjY0RVNfd3JpdGViaXRzX0FVRF9oZWFkZXIoCiAgICBNVFhfSEVBREVSX1BBUkFNUyAqcE1UWF9IZWFkZXIsCiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKiphdWkzMkVsZW1lbnRQb2ludGVycykKewogICAgLy8gRXNzZW50aWFsIHdlIGluc2VydCB0aGUgZWxlbWVudCBiZWZvcmUgd2UgdHJ5IHRvIGZpbGwgaXQhCiAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLAogICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX1NUQVJUQ09ERV9SQVdEQVRBKTsKCiAgICB0bmdfX0gyNjRfd3JpdGViaXRzX3N0YXJ0Y29kZV9wcmVmaXhfZWxlbWVudChwTVRYX0hlYWRlciwKICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywgNCk7IC8vIDAwIDAwIDAwIDAxIHN0YXJ0IGNvZGUgcHJlZml4CgogICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDksIDgpOyAvLyBBVUQgbmFsX3VuaXRfdHlwZSA9IDA5CgogICAgLy8gcHJpbWFyeV9waWNfdHlwZSAgdSgzKSAwPUkgc2xpY2UsIDE9UCBvciBJIHNsaWNlLCAyPVAsQiBvciBJIHNsaWNlCiAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywgMiwgMyk7CgogICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEgPDwgNCwgNSk7IC8vIHJic3BfdHJhaWxpbmdfYml0cwoKICAgIC8vIFdyaXRlIHRlcm1pbmF0b3IKICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAweDgwLCA4KTsKICAgIHJldHVybjsKfQoKLy8jZGVmaW5lIFNFSV9OT1RfVVNFX1RPS0VOX0FMSUdOCgpzdGF0aWMgdm9pZCB0bmdfX0gyNjRFU193cml0ZWJpdHNfU0VJX2J1ZmZlcmluZ19wZXJpb2RfaGVhZGVyKAogICAgTVRYX0hFQURFUl9QQVJBTVMgKnBNVFhfSGVhZGVyLAogICAgTVRYX0hFQURFUl9FTEVNRU5UICoqYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICBJTUdfVUlOVDggdWk4TmFsSHJkQnBQcmVzZW50RmxhZywKICAgIElNR19VSU5UOCB1aThuYWxfY3BiX2NudF9taW51czEsCiAgICBJTUdfVUlOVDggdWk4bmFsX2luaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoLAogICAgSU1HX1VJTlQzMiBfX21heWJlX3VudXNlZCB1aTMybmFsX2luaXRpYWxfY3BiX3JlbW92YWxfZGVsYXksCiAgICBJTUdfVUlOVDMyIF9fbWF5YmVfdW51c2VkIHVpMzJuYWxfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9vZmZzZXQsCiAgICBJTUdfVUlOVDggdWk4VmNsSHJkQnBQcmVzZW50RmxhZywKICAgIElNR19VSU5UOCB1aTh2Y2xfY3BiX2NudF9taW51czEsCiAgICBJTUdfVUlOVDMyIHVpMzJ2Y2xfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheSwKICAgIElNR19VSU5UMzIgdWkzMnZjbF9pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X29mZnNldCkKewogICAgSU1HX1VJTlQ4IHVpOFNjaGVkU2VsSWR4OwogICAgSU1HX1VJTlQ4IHVpOFBheWxvYWRTaXplQml0czsKI2lmZGVmIFNFSV9OT1RfVVNFX1RPS0VOX0FMSUdOCiAgICBJTUdfVUlOVDggdWk4UGFkOwojZW5kaWYKCiAgICAvLyBFc3NlbnRpYWwgd2UgaW5zZXJ0IHRoZSBlbGVtZW50IGJlZm9yZSB3ZSB0cnkgdG8gZmlsbCBpdCEKICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsCiAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwoKICAgIHRuZ19fSDI2NF93cml0ZWJpdHNfc3RhcnRjb2RlX3ByZWZpeF9lbGVtZW50KHBNVFhfSGVhZGVyLAogICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAzKTsgLy8gMDAgMDAgMDEgc3RhcnQgY29kZSBwcmVmaXgKCiAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywgNiwgOCk7IC8vIG5hbF91bml0X3R5cGUgPSAwNiAoU0VJIE1lc3NhZ2UpCgogICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDgpOyAvLyBTRUkgcGF5bG9hZCB0eXBlIChidWZmZXJpbmcgcGVyaW9kKQoKICAgIHVpOFBheWxvYWRTaXplQml0cyA9IDE7IC8vIHNlcV9wYXJhbWV0ZXJfc2V0X2lkIGJpdHNpemUgPSAxCiAgICBpZiAodWk4TmFsSHJkQnBQcmVzZW50RmxhZykKICAgICAgICB1aThQYXlsb2FkU2l6ZUJpdHMgKz0gKCh1aThuYWxfY3BiX2NudF9taW51czEgKyAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB1aThuYWxfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGggKiAyKTsKICAgIGlmICh1aThWY2xIcmRCcFByZXNlbnRGbGFnKQogICAgICAgIHVpOFBheWxvYWRTaXplQml0cyArPSAoKHVpOHZjbF9jcGJfY250X21pbnVzMSArIDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHVpOG5hbF9pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aCAqIDIpOwoKICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpOFBheWxvYWRTaXplQml0cyArIDcpIC8gOCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4KTsKICAgIC8vIFNFSSBwYXlsb2FkIHNpemUgPSBObyBvZiBieXRlcyByZXF1aXJlZCBmb3IgU0VJIHBheWxvYWQKICAgIC8vIChpbmNsdWRpbmcgc2VxX3BhcmFtZXRlcl9zZXRfaWQpCgogICAgLy9zZXFfcGFyYW1ldGVyX3NldF9pZCAgICAgIHVlKHYpID0gMCBkZWZhdWx0PyA9IDEgKGJpbmFyeSkKICAgIC8vPSBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IGNvbnRhaW5pbmcgSFJEIGF0dHJpYnV0ZXMKICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwKTsKCiAgICBpZiAodWk4TmFsSHJkQnBQcmVzZW50RmxhZykgewogICAgICAgIGZvciAodWk4U2NoZWRTZWxJZHggPSAwOyB1aThTY2hlZFNlbElkeCA8PSB1aThuYWxfY3BiX2NudF9taW51czE7IHVpOFNjaGVkU2VsSWR4KyspIHsKICAgICAgICAgICAgLy8gdWkzMm5hbF9pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5ID0gZGVsYXkgYmV0d2VlbiB0aW1lIG9mIGFycml2YWwgaW4gQ09ERUQgUElDVFVSRSBCVUZGRVIgb2YgY29kZWQgZGF0YSBvZiB0aGlzIGFjY2VzcwogICAgICAgICAgICAvLyB1bml0IGFuZCB0aW1lIG9mIHJlbW92YWwgZnJvbSBDT0RFRCBQSUNUVVJFIEJVRkZFUiBvZiB0aGUgY29kZWQgZGF0YSBvZiB0aGUgc2FtZSBhY2Nlc3MgdW5pdC4KICAgICAgICAgICAgLy8gRGVsYXkgaXMgYmFzZWQgb24gdGhlIHRpbWUgdGFrZW4gZm9yIGEgOTAga0h6IGNsb2NrLgogICAgICAgICAgICAvLyBSYW5nZSA+MCBhbmQgPCA5MDAwMCAqIChDUEJzaXplIC8gQml0UmF0ZSkKICAgICAgICAgICAgLy8gRm9yIHRoZSAxc3QgYnVmZmVyaW5nIHBlcmlvZCBhZnRlciBIQVJEV0FSRSBSRUZFUkVOQ0UgREVDT0RFUiBpbml0aWFsaXNhdGlvbi4KICAgICAgICAgICAgLy8gdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfTkFMX0lOSVRfQ1BCX1JFTU9WQUxfREVMQVkpOyAvLyBFdmVudHVhbGx5IHVzZSB0aGlzIGlmIGZpcm13YXJlIHZhbHVlIHJlcXVpcmVkCgogICAgICAgICAgICAvL3RuZ19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHVpMzJuYWxfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheSwgdWk4bmFsX2luaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoKTsKICAgICAgICAgICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUEhfU0VJX05BTF9JTklUSUFMX0NQQl9SRU1PVkFMX0RFTEFZKTsKCiAgICAgICAgICAgIC8vIHVpMzJuYWxfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9vZmZzZXQgPSB1c2VkIGZvciB0aGUgU2NoZWRTZWxJZHgtdGggQ1BCIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIGNwYl9yZW1vdmFsX2RlbGF5IHRvCiAgICAgICAgICAgIC8vIHNwZWNpZnkgdGhlIGluaXRpYWwgZGVsaXZlcnkgdGltZSBvZiBjb2RlZCBhY2Nlc3MgdW5pdHMgdG8gdGhlIENPREVEIFBJQ1RVUkUgQlVGRkVSIGluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfb2Zmc2V0CiAgICAgICAgICAgIC8vIERlbGF5IGlzIGJhc2VkIG9uIHRoZSB0aW1lIHRha2VuIGZvciBhIDkwIGtIeiBjbG9jay4KICAgICAgICAgICAgLy8gTk9UIFVTRUQgQlkgREVDT0RFUlMgYW5kIGlzIG5lZWRlZCBvbmx5IGZvciB0aGUgZGVsaXZlcnkgc2NoZWR1bGVyIChIU1MpIHNwZWNpZmllZCBpbiBBbm5leCBDCgogICAgICAgICAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQSF9TRUlfTkFMX0lOSVRJQUxfQ1BCX1JFTU9WQUxfREVMQVlfT0ZGU0VUKTsKICAgICAgICB9CiAgICB9CiAgICBpZiAodWk4VmNsSHJkQnBQcmVzZW50RmxhZykgewogICAgICAgIGZvciAodWk4U2NoZWRTZWxJZHggPSAwOyB1aThTY2hlZFNlbElkeCA8PSB1aTh2Y2xfY3BiX2NudF9taW51czE7IHVpOFNjaGVkU2VsSWR4KyspIHsKICAgICAgICAgICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTEVNRU5UX1NUQVJUQ09ERV9SQVdEQVRBKTsKICAgICAgICAgICAgLy8gdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfVkNMX0lOSVRfQ1BCX1JFTU9WQUxfREVMQVkpOyAvLyBFdmVudHVhbGx5IHVzZSB0aGlzIGlmIGZpcm13YXJlIHZhbHVlIHJlcXVpcmVkCiAgICAgICAgICAgIHRuZ19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWkzMnZjbF9pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWk4bmFsX2luaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoKTsKICAgICAgICAgICAgLy8gdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfVkNMX0lOSVRfQ1BCX1JFTU9WQUxfREVMQVlfQ1BCKTsgLy8gRXZlbnR1YWxseSB1c2UgdGhpcyBpZiBmaXJtd2FyZSB2YWx1ZSByZXF1aXJlZAogICAgICAgICAgICB0bmdfX3dyaXRlX3VwdG8zMmJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpMzJ2Y2xfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9vZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aThuYWxfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGgpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBQYWQgdG8gZW5kIG9mIGJ5dGUKI2lmZGVmIFNFSV9OT1RfVVNFX1RPS0VOX0FMSUdOCiAgICBpZiAoIXVpOFZjbEhyZEJwUHJlc2VudEZsYWcpCiAgICAgICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9TVEFSVENPREVfUkFXREFUQSk7CiAgICB1aThQYWQgPSAodWk4UGF5bG9hZFNpemVCaXRzICsgNykgLyA4OwogICAgdWk4UGFkID0gKHVpOFBhZCAqIDgpIC0gdWk4UGF5bG9hZFNpemVCaXRzOwogICAgaWYgKHVpOFBhZCA+IDApCiAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA8PCAodWk4UGFkIC0gMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWk4UGFkKTsgLy8gU0VJIHBheWxvYWQgdHlwZSAoYnVmZmVyaW5nIHBlcmlvZCkKI2Vsc2UKICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTEVNRU5UX0lOU0VSVEJZVEVBTElHTl9IMjY0KTsKICAgIC8vIFRlbGwgTVRYIHRvIGluc2VydCB0aGUgYnl0ZSBhbGlnbiBmaWVsZAogICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwojZW5kaWYKCiAgICAvLyBXcml0ZSB0ZXJtaW5hdG9yCiAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDB4ODAsIDgpOwoKICAgIHJldHVybjsKfQoKLy8jZGVmaW5lIFNFSV9IT1NUQ0FMQ19DUEJfRFBCCgpzdGF0aWMgdm9pZCB0bmdfX0gyNjRFU193cml0ZWJpdHNfU0VJX3BpY3R1cmVfdGltaW5nX2hlYWRlcigKICAgIE1UWF9IRUFERVJfUEFSQU1TICpwTVRYX0hlYWRlciwgTVRYX0hFQURFUl9FTEVNRU5UICoqYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICBJTUdfVUlOVDggdWk4Q3BiRHBiRGVsYXlzUHJlc2VudEZsYWcsCiAgICBJTUdfVUlOVDMyIHVpMzJjcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxLAogICAgSU1HX1VJTlQzMiB1aTMyZHBiX291dHB1dF9kZWxheV9sZW5ndGhfbWludXMxLAogICAgSU1HX1VJTlQzMiBfX21heWJlX3VudXNlZCB1aTMyY3BiX3JlbW92YWxfZGVsYXksCiAgICBJTUdfVUlOVDMyIF9fbWF5YmVfdW51c2VkIHVpMzJkcGJfb3V0cHV0X2RlbGF5LAogICAgSU1HX1VJTlQ4IHVpOHBpY19zdHJ1Y3RfcHJlc2VudF9mbGFnLAogICAgSU1HX1VJTlQ4IHVpOHBpY19zdHJ1Y3QsCiAgICBJTUdfVUlOVDggdWk4TnVtQ2xvY2tUUywKICAgIElNR19VSU5UOCAqYXVpOGNsb2NrX3RpbWVzdGFtcF9mbGFnLAogICAgSU1HX1VJTlQ4IHVpOGZ1bGxfdGltZXN0YW1wX2ZsYWcsCiAgICBJTUdfVUlOVDggdWk4c2Vjb25kc19mbGFnLAogICAgSU1HX1VJTlQ4IHVpOG1pbnV0ZXNfZmxhZywKICAgIElNR19VSU5UOCB1aThob3Vyc19mbGFnLAogICAgSU1HX1VJTlQ4IHVpOHNlY29uZHNfdmFsdWUsCiAgICBJTUdfVUlOVDggdWk4bWludXRlc192YWx1ZSwKICAgIElNR19VSU5UOCB1aThob3Vyc192YWx1ZSwKICAgIElNR19VSU5UOCB1aThjdF90eXBlLAogICAgSU1HX1VJTlQ4IHVpOG51aXRfZmllbGRfYmFzZWRfZmxhZywKICAgIElNR19VSU5UOCB1aThjb3VudGluZ190eXBlLAogICAgSU1HX1VJTlQ4IHVpOGRpc2NvbnRpbnVpdHlfZmxhZywKICAgIElNR19VSU5UOCB1aThjbnRfZHJvcHBlZF9mbGFnLAogICAgSU1HX1VJTlQ4IHVpOG5fZnJhbWVzLAogICAgSU1HX1VJTlQ4IHVpOHRpbWVfb2Zmc2V0X2xlbmd0aCwKICAgIElNR19JTlQzMiBpMzJ0aW1lX29mZnNldCkKewogICAgSU1HX1VJTlQ4IHVpOFBheWxvYWRTaXplQml0cywgdWk4VG1wOwojaWZkZWYgU0VJX05PVF9VU0VfVE9LRU5fQUxJR04KICAgIElNR19VSU5UOCB1aThQYWQ7CiNlbmRpZgoKICAgIC8vIEVzc2VudGlhbCB3ZSBpbnNlcnQgdGhlIGVsZW1lbnQgYmVmb3JlIHdlIHRyeSB0byBmaWxsIGl0IQogICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwoKICAgIHRuZ19fSDI2NF93cml0ZWJpdHNfc3RhcnRjb2RlX3ByZWZpeF9lbGVtZW50KHBNVFhfSGVhZGVyLAogICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgMyk7IC8vIDAwIDAwIDAxIHN0YXJ0IGNvZGUgcHJlZml4CgogICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsIDgpOyAvLyBuYWxfdW5pdF90eXBlID0gMDYgKFNFSSBNZXNzYWdlKQoKICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCA4KTsgLy8gU0VJIHBheWxvYWQgdHlwZSAocGljdHVyZSB0aW1pbmcpCgoKICAgIC8vIFByZWNhbGN1bGF0ZSB0aGUgcGF5bG9hZCBiaXQgc2l6ZQogICAgdWk4UGF5bG9hZFNpemVCaXRzID0gMDsKICAgIGlmICh1aThDcGJEcGJEZWxheXNQcmVzZW50RmxhZykKICAgICAgICB1aThQYXlsb2FkU2l6ZUJpdHMgKz0gdWkzMmNwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aF9taW51czEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxICsgdWkzMmRwYl9vdXRwdXRfZGVsYXlfbGVuZ3RoX21pbnVzMSArIDE7CgogICAgaWYgKHVpOHBpY19zdHJ1Y3RfcHJlc2VudF9mbGFnKSB7CiAgICAgICAgdWk4UGF5bG9hZFNpemVCaXRzICs9IDQ7CiAgICAgICAgZm9yICh1aThUbXAgPSAwOyB1aThUbXAgPCB1aThOdW1DbG9ja1RTIDsgdWk4VG1wKyspIHsKICAgICAgICAgICAgdWk4UGF5bG9hZFNpemVCaXRzICs9IDE7CgogICAgICAgICAgICBpZiAoYXVpOGNsb2NrX3RpbWVzdGFtcF9mbGFnW3VpOFRtcF0pIHsKICAgICAgICAgICAgICAgIHVpOFBheWxvYWRTaXplQml0cyArPSAyICsgMSArIDUgKyAxICsgMSArIDEgKyA4OwogICAgICAgICAgICAgICAgaWYgKHVpOGZ1bGxfdGltZXN0YW1wX2ZsYWcpCiAgICAgICAgICAgICAgICAgICAgdWk4UGF5bG9hZFNpemVCaXRzICs9IDYgKyA2ICsgNTsKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHVpOFBheWxvYWRTaXplQml0cyArPSAxOwogICAgICAgICAgICAgICAgICAgIGlmICh1aThzZWNvbmRzX2ZsYWcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdWk4UGF5bG9hZFNpemVCaXRzICs9IDYgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodWk4bWludXRlc19mbGFnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aThQYXlsb2FkU2l6ZUJpdHMgKz0gNiArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodWk4aG91cnNfZmxhZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aThQYXlsb2FkU2l6ZUJpdHMgKz0gNTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodWk4dGltZV9vZmZzZXRfbGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgICAgICB1aThQYXlsb2FkU2l6ZUJpdHMgKz0gdWk4dGltZV9vZmZzZXRfbGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpOFBheWxvYWRTaXplQml0cyArIDcpIC8gOCksIDgpOwogICAgLy8gU0VJIHBheWxvYWQgc2l6ZSA9IE5vIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciBTRUkgcGF5bG9hZCAoaW5jbHVkaW5nIHNlcV9wYXJhbWV0ZXJfc2V0X2lkKQoKCiAgICBpZiAodWk4Q3BiRHBiRGVsYXlzUHJlc2VudEZsYWcpIHsKICAgICAgICAvL1NFSV9JTlNFUlRJT04KI2lmZGVmIFNFSV9IT1NUQ0FMQ19DUEJfRFBCCiAgICAgICAgdG5nX193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWkzMmNwYl9yZW1vdmFsX2RlbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aTMyY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoX21pbnVzMSArIDEpOyAvLyBjcGJfcmVtb3ZhbF9kZWxheQogICAgICAgIHRuZ19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpMzJkcGJfb3V0cHV0X2RlbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aTMyZHBiX291dHB1dF9kZWxheV9sZW5ndGhfbWludXMxICsgMSk7IC8vIGRwYl9vdXRwdXRfZGVsYXkKI2Vsc2UKICAgICAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVEhfU0VJX05BTF9DUEJfUkVNT1ZBTF9ERUxBWSk7CiAgICAgICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFRIX1NFSV9OQUxfRFBCX09VVFBVVF9ERUxBWSk7CiNlbmRpZgogICAgfQoKICAgIGlmICh1aThwaWNfc3RydWN0X3ByZXNlbnRfZmxhZykgewogICAgICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwogICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOHBpY19zdHJ1Y3QsIDQpOyAvLyBTZWUgVFJNIGFibGUgRCAxID9JbnRlcnByZXRhdGlvbiBvZiBwaWNfc3RydWN0CgogICAgICAgIGZvciAodWk4VG1wID0gMDsgdWk4VG1wIDwgdWk4TnVtQ2xvY2tUUyA7IHVpOFRtcCsrKSB7CiAgICAgICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpOGNsb2NrX3RpbWVzdGFtcF9mbGFnW3VpOFRtcF0sIDEpOwoKICAgICAgICAgICAgaWYgKGF1aThjbG9ja190aW1lc3RhbXBfZmxhZ1t1aThUbXBdKSB7CiAgICAgICAgICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWk4Y3RfdHlwZSwgMik7CiAgICAgICAgICAgICAgICAvLyAoMj1Vbmtub3duKSBTZWUgVFJNIFRhYmxlIEQgMiA/TWFwcGluZyBvZiBjdF90eXBlIHRvIHNvdXJjZSBwaWN0dXJlIHNjYW4KICAgICAgICAgICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aThudWl0X2ZpZWxkX2Jhc2VkX2ZsYWcsIDEpOwogICAgICAgICAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOGNvdW50aW5nX3R5cGUsIDUpOwogICAgICAgICAgICAgICAgLy8gU2VlIFRSTSBUYWJsZSBEIDMgP0RlZmluaXRpb24gb2YgY291bnRpbmdfdHlwZSB2YWx1ZXMKICAgICAgICAgICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aThmdWxsX3RpbWVzdGFtcF9mbGFnLCAxKTsKICAgICAgICAgICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aThkaXNjb250aW51aXR5X2ZsYWcsIDEpOwogICAgICAgICAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOGNudF9kcm9wcGVkX2ZsYWcsIDEpOwogICAgICAgICAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOG5fZnJhbWVzLCA4KTsKCiAgICAgICAgICAgICAgICBpZiAodWk4ZnVsbF90aW1lc3RhbXBfZmxhZykgewogICAgICAgICAgICAgICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOHNlY29uZHNfdmFsdWUsIDYpOyAvLyAwIC0gNTkKICAgICAgICAgICAgICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aThtaW51dGVzX3ZhbHVlLCA2KTsgLy8gMCAtIDU5CiAgICAgICAgICAgICAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWk4aG91cnNfdmFsdWUsIDUpOyAvLyAwIC0gMjMKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWk4c2Vjb25kc19mbGFnLCAxKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHVpOHNlY29uZHNfZmxhZykgewogICAgICAgICAgICAgICAgICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOHNlY29uZHNfdmFsdWUsIDYpOyAvLyAwIC0gNTkKICAgICAgICAgICAgICAgICAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aThtaW51dGVzX2ZsYWcsIDEpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVpOG1pbnV0ZXNfZmxhZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOG1pbnV0ZXNfdmFsdWUsIDYpOyAvLyAwIC0gNTkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aThob3Vyc19mbGFnLCAxKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodWk4aG91cnNfZmxhZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aThob3Vyc192YWx1ZSwgNSk7IC8vIDAgLSAyMwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh1aTh0aW1lX29mZnNldF9sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gVHdvJ3MgY29tcGxlbWVudCBzdG9yYWdlIDogSWYgdGltZV9vZmZzZXQ8MCA9ICgoMiBeIHYpICsgdGltZV9vZmZzZXQpCiAgICAgICAgICAgICAgICAgICAgaWYgKGkzMnRpbWVfb2Zmc2V0IDwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgdG5nX193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSU1HX1VJTlQzMikoKDIgXiB1aTh0aW1lX29mZnNldF9sZW5ndGgpICsgaTMydGltZV9vZmZzZXQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWk4dGltZV9vZmZzZXRfbGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHRuZ19fd3JpdGVfdXB0bzMyYml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElNR19VSU5UMzIpIGkzMnRpbWVfb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWk4dGltZV9vZmZzZXRfbGVuZ3RoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiNpZmRlZiBTRUlfTk9UX1VTRV9UT0tFTl9BTElHTgogICAgLy8gUGFkIHRvIGVuZCBvZiBieXRlCiAgICBpZiAoIXVpOHBpY19zdHJ1Y3RfcHJlc2VudF9mbGFnKQogICAgICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwogICAgdWk4UGFkID0gKHVpOFBheWxvYWRTaXplQml0cyArIDcpIC8gODsKICAgIHVpOFBhZCA9ICh1aThQYWQgKiA4KSAtIHVpOFBheWxvYWRTaXplQml0czsKICAgIGlmICh1aThQYWQgPiAwKQogICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPDwgKHVpOFBhZCAtIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOFBhZCk7IC8vIFNFSSBwYXlsb2FkIHR5cGUgKGJ1ZmZlcmluZyBwZXJpb2QpCiNlbHNlCiAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9JTlNFUlRCWVRFQUxJR05fSDI2NCk7IC8vIFRlbGwgTVRYIHRvIGluc2VydCB0aGUgYnl0ZSBhbGlnbiBmaWVsZAogICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwojZW5kaWYKCiAgICAvLyBXcml0ZSB0ZXJtaW5hdG9yCiAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MCwgOCk7CiAgICByZXR1cm47Cn0KCgoKdm9pZCB0bmdfX0gyNjRFU19wcmVwYXJlX0FVRF9oZWFkZXIodW5zaWduZWQgY2hhciAqdmlydHVhbF9hZGRyKQp7CiAgICAvLyBFc3NlbnRpYWwgd2UgaW5pdGlhbGlzZSBvdXIgaGVhZGVyIHN0cnVjdHVyZXMgYmVmb3JlIGJ1aWxkaW5nCiAgICBNVFhfSEVBREVSX1BBUkFNUyAqIHBNVFhfSGVhZGVyID0gKE1UWF9IRUFERVJfUEFSQU1TICopdmlydHVhbF9hZGRyOwogICAgTVRYX0hFQURFUl9FTEVNRU5UICpUaGlzX0VsZW1lbnQ7CiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKmF1aTMyRWxlbWVudFBvaW50ZXJzW01BWE5VTUJFUkVMRU1FTlRTXTsKICAgIHBNVFhfSGVhZGVyLT51aTMyRWxlbWVudHMgPSBFTEVNRU5UU19FTVBUWTsKICAgIFRoaXNfRWxlbWVudCA9IChNVFhfSEVBREVSX0VMRU1FTlQgKikgcE1UWF9IZWFkZXItPmFzRWxlbWVudFN0cmVhbTsKICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzWzBdID0gVGhpc19FbGVtZW50OwoKICAgIHRuZ19fSDI2NEVTX3dyaXRlYml0c19BVURfaGVhZGVyKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycyk7CgogICAgcE1UWF9IZWFkZXItPnVpMzJFbGVtZW50cysrOyAvL0hhcyBiZWVuIHVzZWQgYXMgYW4gaW5kZXgsIHNvIG5lZWQgdG8gYWRkIDEgZm9yIGEgdmFsaWQgZWxlbWVudCBjb3VudAp9CgoKdm9pZCB0bmdfX0gyNjRFU19wcmVwYXJlX1NFSV9idWZmZXJpbmdfcGVyaW9kX2hlYWRlcigKICAgIHVuc2lnbmVkIGNoYXIgKnZpcnR1YWxfYWRkciwKICAgIElNR19VSU5UOCB1aThuYWxfY3BiX2NudF9taW51czEsCiAgICBJTUdfVUlOVDggdWk4bmFsX2luaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoLAogICAgSU1HX1VJTlQ4IHVpOE5hbEhyZEJwUHJlc2VudEZsYWcsCiAgICBJTUdfVUlOVDMyIHVpMzJuYWxfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheSwKICAgIElNR19VSU5UMzIgdWkzMm5hbF9pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X29mZnNldCwKICAgIElNR19VSU5UOCB1aThWY2xIcmRCcFByZXNlbnRGbGFnLAogICAgSU1HX1VJTlQzMiB1aTMydmNsX2luaXRpYWxfY3BiX3JlbW92YWxfZGVsYXksCiAgICBJTUdfVUlOVDMyIHVpMzJ2Y2xfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9vZmZzZXQpCnsKICAgIC8vIEVzc2VudGlhbCB3ZSBpbml0aWFsaXNlIG91ciBoZWFkZXIgc3RydWN0dXJlcyBiZWZvcmUgYnVpbGRpbmcKICAgIE1UWF9IRUFERVJfUEFSQU1TICogcE1UWF9IZWFkZXIgPSAoTVRYX0hFQURFUl9QQVJBTVMgKil2aXJ0dWFsX2FkZHI7CiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKlRoaXNfRWxlbWVudDsKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqYXVpMzJFbGVtZW50UG9pbnRlcnNbTUFYTlVNQkVSRUxFTUVOVFNdOwogICAgcE1UWF9IZWFkZXItPnVpMzJFbGVtZW50cyA9IEVMRU1FTlRTX0VNUFRZOwogICAgVGhpc19FbGVtZW50ID0gKE1UWF9IRUFERVJfRUxFTUVOVCAqKSBwTVRYX0hlYWRlci0+YXNFbGVtZW50U3RyZWFtOwogICAgYXVpMzJFbGVtZW50UG9pbnRlcnNbMF0gPSBUaGlzX0VsZW1lbnQ7CgogICAgdG5nX19IMjY0RVNfd3JpdGViaXRzX1NFSV9idWZmZXJpbmdfcGVyaW9kX2hlYWRlcigKICAgICAgICBwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgdWk4TmFsSHJkQnBQcmVzZW50RmxhZywKICAgICAgICB1aThuYWxfY3BiX2NudF9taW51czEsCiAgICAgICAgdWk4bmFsX2luaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoLAogICAgICAgIHVpMzJuYWxfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheSwKICAgICAgICB1aTMybmFsX2luaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfb2Zmc2V0LAogICAgICAgIHVpOFZjbEhyZEJwUHJlc2VudEZsYWcsCiAgICAgICAgdWk4bmFsX2NwYl9jbnRfbWludXMxLAogICAgICAgIHVpMzJ2Y2xfaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheSwKICAgICAgICB1aTMydmNsX2luaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfb2Zmc2V0KTsKCiAgICBwTVRYX0hlYWRlci0+dWkzMkVsZW1lbnRzKys7CiAgICAvL0hhcyBiZWVuIHVzZWQgYXMgYW4gaW5kZXgsIHNvIG5lZWQgdG8gYWRkIDEgZm9yIGEgdmFsaWQgZWxlbWVudCBjb3VudAogICAgcmV0dXJuOwp9Cgp2b2lkIHRuZ19fSDI2NEVTX3ByZXBhcmVfU0VJX3BpY3R1cmVfdGltaW5nX2hlYWRlcigKICAgIHVuc2lnbmVkIGNoYXIgKnZpcnR1YWxfYWRkciwKICAgIElNR19VSU5UOCB1aThDcGJEcGJEZWxheXNQcmVzZW50RmxhZywKICAgIElNR19VSU5UMzIgdWkzMmNwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aF9taW51czEsCiAgICBJTUdfVUlOVDMyIHVpMzJkcGJfb3V0cHV0X2RlbGF5X2xlbmd0aF9taW51czEsCiAgICBJTUdfVUlOVDMyIHVpMzJjcGJfcmVtb3ZhbF9kZWxheSwKICAgIElNR19VSU5UMzIgdWkzMmRwYl9vdXRwdXRfZGVsYXksCiAgICBJTUdfVUlOVDggdWk4cGljX3N0cnVjdF9wcmVzZW50X2ZsYWcsCiAgICBJTUdfVUlOVDggdWk4cGljX3N0cnVjdCwKICAgIElNR19VSU5UOCB1aThOdW1DbG9ja1RTLAogICAgSU1HX1VJTlQ4ICphdWk4Y2xvY2tfdGltZXN0YW1wX2ZsYWcsCiAgICBJTUdfVUlOVDggdWk4ZnVsbF90aW1lc3RhbXBfZmxhZywKICAgIElNR19VSU5UOCB1aThzZWNvbmRzX2ZsYWcsCiAgICBJTUdfVUlOVDggdWk4bWludXRlc19mbGFnLAogICAgSU1HX1VJTlQ4IHVpOGhvdXJzX2ZsYWcsCiAgICBJTUdfVUlOVDggdWk4c2Vjb25kc192YWx1ZSwKICAgIElNR19VSU5UOCB1aThtaW51dGVzX3ZhbHVlLAogICAgSU1HX1VJTlQ4IHVpOGhvdXJzX3ZhbHVlLAogICAgSU1HX1VJTlQ4IHVpOGN0X3R5cGUsCiAgICBJTUdfVUlOVDggdWk4bnVpdF9maWVsZF9iYXNlZF9mbGFnLAogICAgSU1HX1VJTlQ4IHVpOGNvdW50aW5nX3R5cGUsCiAgICBJTUdfVUlOVDggdWk4ZGlzY29udGludWl0eV9mbGFnLAogICAgSU1HX1VJTlQ4IHVpOGNudF9kcm9wcGVkX2ZsYWcsCiAgICBJTUdfVUlOVDggdWk4bl9mcmFtZXMsCiAgICBJTUdfVUlOVDggdWk4dGltZV9vZmZzZXRfbGVuZ3RoLAogICAgSU1HX0lOVDMyIGkzMnRpbWVfb2Zmc2V0KQp7CiAgICAvLyBFc3NlbnRpYWwgd2UgaW5pdGlhbGlzZSBvdXIgaGVhZGVyIHN0cnVjdHVyZXMgYmVmb3JlIGJ1aWxkaW5nCiAgICBNVFhfSEVBREVSX1BBUkFNUyAqIHBNVFhfSGVhZGVyID0gKE1UWF9IRUFERVJfUEFSQU1TICopdmlydHVhbF9hZGRyOwogICAgTVRYX0hFQURFUl9FTEVNRU5UICpUaGlzX0VsZW1lbnQ7CiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKmF1aTMyRWxlbWVudFBvaW50ZXJzW01BWE5VTUJFUkVMRU1FTlRTXTsKICAgIHBNVFhfSGVhZGVyLT51aTMyRWxlbWVudHMgPSBFTEVNRU5UU19FTVBUWTsKICAgIFRoaXNfRWxlbWVudCA9IChNVFhfSEVBREVSX0VMRU1FTlQgKikgcE1UWF9IZWFkZXItPmFzRWxlbWVudFN0cmVhbTsKICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzWzBdID0gVGhpc19FbGVtZW50OwoKICAgIHRuZ19fSDI2NEVTX3dyaXRlYml0c19TRUlfcGljdHVyZV90aW1pbmdfaGVhZGVyKAogICAgICAgIHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICB1aThDcGJEcGJEZWxheXNQcmVzZW50RmxhZywKICAgICAgICB1aTMyY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoX21pbnVzMSwKICAgICAgICB1aTMyZHBiX291dHB1dF9kZWxheV9sZW5ndGhfbWludXMxLAogICAgICAgIHVpMzJjcGJfcmVtb3ZhbF9kZWxheSwKICAgICAgICB1aTMyZHBiX291dHB1dF9kZWxheSwKICAgICAgICB1aThwaWNfc3RydWN0X3ByZXNlbnRfZmxhZywKICAgICAgICB1aThwaWNfc3RydWN0LAogICAgICAgIHVpOE51bUNsb2NrVFMsCiAgICAgICAgYXVpOGNsb2NrX3RpbWVzdGFtcF9mbGFnLAogICAgICAgIHVpOGZ1bGxfdGltZXN0YW1wX2ZsYWcsCiAgICAgICAgdWk4c2Vjb25kc19mbGFnLAogICAgICAgIHVpOG1pbnV0ZXNfZmxhZywKICAgICAgICB1aThob3Vyc19mbGFnLAogICAgICAgIHVpOHNlY29uZHNfdmFsdWUsCiAgICAgICAgdWk4bWludXRlc192YWx1ZSwKICAgICAgICB1aThob3Vyc192YWx1ZSwKICAgICAgICB1aThjdF90eXBlLAogICAgICAgIHVpOG51aXRfZmllbGRfYmFzZWRfZmxhZywKICAgICAgICB1aThjb3VudGluZ190eXBlLAogICAgICAgIHVpOGRpc2NvbnRpbnVpdHlfZmxhZywKICAgICAgICB1aThjbnRfZHJvcHBlZF9mbGFnLAogICAgICAgIHVpOG5fZnJhbWVzLAogICAgICAgIHVpOHRpbWVfb2Zmc2V0X2xlbmd0aCwKICAgICAgICBpMzJ0aW1lX29mZnNldCk7CgogICAgcE1UWF9IZWFkZXItPnVpMzJFbGVtZW50cysrOwogICAgLy9IYXMgYmVlbiB1c2VkIGFzIGFuIGluZGV4LCBzbyBuZWVkIHRvIGFkZCAxIGZvciBhIHZhbGlkIGVsZW1lbnQgY291bnQKICAgIHJldHVybjsKfQoKc3RhdGljIHZvaWQgdG5nX19IMjY0RVNfc2V0X3NlcXVlbmNlX2xldmVsX3Byb2ZpbGUoCiAgICBIMjY0X1NFUVVFTkNFX0hFQURFUl9QQVJBTVMgKnBTSFBhcmFtcywKICAgIElNR19VSU5UOCB1aUxldmVsLAogICAgSU1HX1VJTlQ4IHVpUHJvZmlsZSkKewogICAgc3dpdGNoICh1aUxldmVsKSB7CiAgICBjYXNlIDEwOgogICAgICAgIHBTSFBhcmFtcy0+dWNMZXZlbCA9ICBTSF9MRVZFTF8xMDsKICAgICAgICBicmVhazsKICAgIGNhc2UgMTExOgogICAgICAgIHBTSFBhcmFtcy0+dWNMZXZlbCA9ICBTSF9MRVZFTF8xQjsKICAgICAgICBicmVhazsKICAgIGNhc2UgMTE6CiAgICAgICAgcFNIUGFyYW1zLT51Y0xldmVsID0gIFNIX0xFVkVMXzExOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAxMjoKICAgICAgICBwU0hQYXJhbXMtPnVjTGV2ZWwgPSAgU0hfTEVWRUxfMTI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDIwOgogICAgICAgIHBTSFBhcmFtcy0+dWNMZXZlbCA9ICBTSF9MRVZFTF8yMDsKICAgICAgICBicmVhazsKICAgIGNhc2UgMzA6CiAgICAgICAgcFNIUGFyYW1zLT51Y0xldmVsID0gIFNIX0xFVkVMXzMwOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAzMToKICAgICAgICBwU0hQYXJhbXMtPnVjTGV2ZWwgPSAgU0hfTEVWRUxfMzE7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDMyOgogICAgICAgIHBTSFBhcmFtcy0+dWNMZXZlbCA9ICBTSF9MRVZFTF8zMjsKICAgICAgICBicmVhazsKICAgIGNhc2UgNDA6CiAgICAgICAgcFNIUGFyYW1zLT51Y0xldmVsID0gIFNIX0xFVkVMXzQwOwogICAgICAgIGJyZWFrOwogICAgY2FzZSA0MToKICAgICAgICBwU0hQYXJhbXMtPnVjTGV2ZWwgPSAgU0hfTEVWRUxfNDE7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDQyOgogICAgICAgIHBTSFBhcmFtcy0+dWNMZXZlbCA9ICBTSF9MRVZFTF80MjsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgcFNIUGFyYW1zLT51Y0xldmVsID0gIFNIX0xFVkVMXzMwOwogICAgICAgIGJyZWFrOwogICAgfQoKICAgIHN3aXRjaCAodWlQcm9maWxlKSB7CiAgICBjYXNlIDU6CiAgICAgICAgcFNIUGFyYW1zLT51Y1Byb2ZpbGUgID0gU0hfUFJPRklMRV9CUDsKICAgICAgICBicmVhazsKICAgIGNhc2UgNjoKICAgICAgICBwU0hQYXJhbXMtPnVjUHJvZmlsZSAgPSBTSF9QUk9GSUxFX01QOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBwU0hQYXJhbXMtPnVjUHJvZmlsZSAgPSBTSF9QUk9GSUxFX01QOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIDsKfQoKdm9pZCB0bmdfX0gyNjRFU19wcmVwYXJlX3NlcXVlbmNlX2hlYWRlcigKICAgIHZvaWQgKnBIZWFkZXJNZW1vcnksCiAgICBIMjY0X1ZVSV9QQVJBTVMgKnBzVlVJX1BhcmFtcywKICAgIEgyNjRfQ1JPUF9QQVJBTVMgKnBzQ3JvcFBhcmFtcywKICAgIElNR19VSU5UMTYgdWkxNlBpY3R1cmVXaWR0aCwKICAgIElNR19VSU5UMTYgdWkxNlBpY3R1cmVIZWlnaHQsCiAgICBJTUdfVUlOVDMyIHVpMzJDdXN0b21RdWFudE1hc2ssCiAgICBJTUdfVUlOVDggdWk4UHJvZmlsZUlkYywKICAgIElNR19VSU5UOCB1aThMZXZlbElkYywKICAgIElNR19VSU5UOCB1aThGaWVsZENvdW50LAogICAgSU1HX1VJTlQ4IHVpOE1heE51bVJlZkZyYW1lcywKICAgIElNR19CT09MICBiUHBzU2NhbGluZywKICAgIElNR19CT09MICBiVXNlRGVmYXVsdFNjYWxpbmdMaXN0LAogICAgSU1HX0JPT0wgIGJFbmFibGVMb3NzbGVzcywKICAgIElNR19CT09MICBiQVNPCikKewogICAgLyogQnVpbGRzIGEgc2VxdWVuY2UsIHBpY3R1cmUgYW5kIHNsaWNlIGhlYWRlciB3aXRoIGZyb20gdGhlIGdpdmVuIGlucHV0cyBwYXJhbWV0ZXJzIChzdGFydCBvZiBuZXcgZnJhbWUpCiAgICAgKiBFc3NlbnRpYWwgd2UgaW5pdGlhbGlzZSBvdXIgaGVhZGVyIHN0cnVjdHVyZXMgYmVmb3JlIGJ1aWxkaW5nCiAgICAgKi8KICAgIEgyNjRfU0VRVUVOQ0VfSEVBREVSX1BBUkFNUyBTSFBhcmFtczsKICAgIC8qIFJvdXRlIG91dHB1dCBlbGVtZW50cyB0byBtZW1vcnkgcHJvdmlkZWQgKi8KICAgIE1UWF9IRUFERVJfUEFSQU1TICAqbXR4X2hkciA9IChNVFhfSEVBREVSX1BBUkFNUyAqKSBwSGVhZGVyTWVtb3J5OwogICAgTVRYX0hFQURFUl9FTEVNRU5UICpUaGlzX0VsZW1lbnQ7CiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKmF1aTMyRWxlbWVudFBvaW50ZXJzW01BWE5VTUJFUkVMRU1FTlRTXTsKICAgIG10eF9oZHItPnVpMzJFbGVtZW50cyA9IEVMRU1FTlRTX0VNUFRZOwogICAgVGhpc19FbGVtZW50ID0gbXR4X2hkci0+YXNFbGVtZW50U3RyZWFtOwogICAgYXVpMzJFbGVtZW50UG9pbnRlcnNbMF0gPSBUaGlzX0VsZW1lbnQ7CgogICAgbWVtc2V0KCZTSFBhcmFtcywgMCwgc2l6ZW9mKEgyNjRfU0VRVUVOQ0VfSEVBREVSX1BBUkFNUykpOwoKICAgIFNIUGFyYW1zLnVjUHJvZmlsZSA9IHVpOFByb2ZpbGVJZGMgLSA1OwogICAgU0hQYXJhbXMudWNMZXZlbCA9ICh1aThMZXZlbElkYyAhPSAxMTEpID8gdWk4TGV2ZWxJZGMgOiBTSF9MRVZFTF8xQjsKICAgIFNIUGFyYW1zLnVjV2lkdGhfaW5fbWJzX21pbnVzMSA9IChJTUdfVUlOVDgpKCh1aTE2UGljdHVyZVdpZHRoID4+IDQpLSAxKTsKICAgIFNIUGFyYW1zLnVjSGVpZ2h0X2luX21hcHNfdW5pdHNfbWludXMxID0gKElNR19VSU5UOCkoKHVpMTZQaWN0dXJlSGVpZ2h0ID4+IDQpIC0gMSk7CiAgICBTSFBhcmFtcy5nYXBzX2luX2ZyYW1lX251bV92YWx1ZSA9IElNR19GQUxTRTsKICAgIFNIUGFyYW1zLlZVSV9QYXJhbXNfUHJlc2VudCA9IHBzVlVJX1BhcmFtcy0+dnVpX2ZsYWc7CiAgICBpZiAoU0hQYXJhbXMuVlVJX1BhcmFtc19QcmVzZW50KQogICAgICAgIG1lbWNweSgmU0hQYXJhbXMuVlVJX1BhcmFtcywgcHNWVUlfUGFyYW1zLCBzaXplb2YoSDI2NF9WVUlfUEFSQU1TKSk7CiAgICBTSFBhcmFtcy51Y0ZyYW1lX21ic19vbmx5X2ZsYWcgPSAodWk4RmllbGRDb3VudCA+IDEpID8gSU1HX0ZBTFNFIDogSU1HX1RSVUU7CiAgICAKICAgIFNIUGFyYW1zLnNlcV9zY2FsaW5nX21hdHJpeF9wcmVzZW50X2ZsYWcgPSAoYlBwc1NjYWxpbmcpID8gSU1HX0ZBTFNFIDogKElNR19VSU5UOCkodWkzMkN1c3RvbVF1YW50TWFzayk7CiAgICBTSFBhcmFtcy5iVXNlRGVmYXVsdFNjYWxpbmdMaXN0ID0gKGJQcHNTY2FsaW5nKSA/IElNR19GQUxTRSA6IGJVc2VEZWZhdWx0U2NhbGluZ0xpc3Q7CgogICAgCiAgICBTSFBhcmFtcy5zZXFfc2NhbGluZ19tYXRyaXhfcHJlc2VudF9mbGFnID0gKHVpMzJDdXN0b21RdWFudE1hc2sgIT0gMCAmJiAhYlBwc1NjYWxpbmcpOwogICAgU0hQYXJhbXMuYlVzZURlZmF1bHRTY2FsaW5nTGlzdCA9IChiVXNlRGVmYXVsdFNjYWxpbmdMaXN0ICYmICFiUHBzU2NhbGluZyk7CgogICAgU0hQYXJhbXMubWF4X251bV9yZWZfZnJhbWVzID0gdWk4TWF4TnVtUmVmRnJhbWVzOwogICAgU0hQYXJhbXMuYklzTG9zc2xlc3MgPSBiRW5hYmxlTG9zc2xlc3M7CiAgICBTSFBhcmFtcy5sb2cyX21heF9waWNfb3JkZXJfY250ID0gNjsKI2lmZGVmIF9UT1BBWkhQX1BEVU1QXwogICAgdG5nX3RyYWNlX3NlcV9oZWFkZXJfcGFyYW1zKCZTSFBhcmFtcyk7CiNlbmRpZgogICAgdG5nX19IMjY0RVNfd3JpdGViaXRzX3NlcXVlbmNlX2hlYWRlcihtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgJlNIUGFyYW1zLCBwc0Nyb3BQYXJhbXMsIE5VTEwsIGJBU08pOwogICAgbXR4X2hkci0+dWkzMkVsZW1lbnRzKys7IC8qIEhhcyBiZWVuIHVzZWQgYXMgYW4gaW5kZXgsIHNvIG5lZWQgdG8gYWRkIDEgZm9yIGEgdmFsaWQgZWxlbWVudCBjb3VudCAqLwp9CgpzdGF0aWMgdm9pZCB0bmdfX0gyNjRFU193cml0ZWJpdHNfbXZjX3NlcXVlbmNlX2hlYWRlcigKICAgIE1UWF9IRUFERVJfUEFSQU1TICpwTVRYX0hlYWRlciwKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqKmF1aTMyRWxlbWVudFBvaW50ZXJzLAogICAgSDI2NF9TRVFVRU5DRV9IRUFERVJfUEFSQU1TICpwU0hQYXJhbXMsCiAgICBIMjY0X0NST1BfUEFSQU1TICpwc0Nyb3AsCiAgICBIMjY0X1NDQUxJTkdfTUFUUklYX1BBUkFNUyBfX21heWJlX3VudXNlZCAqIHBzU2NhbGluZ01hdHJpeCkKewogICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfU1RBUlRDT0RFX1JBV0RBVEEpOwogICAgdG5nX19IMjY0X3dyaXRlYml0c19zdGFydGNvZGVfcHJlZml4X2VsZW1lbnQocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCA0KTsKCiAgICAvLy8qKioqIEdFTkVSQVRFUyBUSEUgRklSU1QgRUxFTUVOVCBPRiBUSEUgSDI2NF9TRVFVRU5DRV9IRUFERVIoKSBTVFJVQ1RVUkUgKioqKi8vLwoKICAgIC8vIDQgQnl0ZSBTdGFydENvZGVQcmVmaXggUHJlZ2VuZXJhdGVkIGluOiBIMjY0X1dyaXRlQml0c19TdGFydENvZGVQcmVmaXhfRWxlbWVudCgpCiAgICAvLyBCeXRlIGFsaWduZWQgKGJpdCAzMikKICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpMzJFbGVtZW50UG9pbnRlcnMsICgwIDw8IDcpIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmJpZGRlbl96ZXJvX2JpdD0wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzIDw8IDUpIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFsX3JlZl9pZGM9MDEgKG1heSBiZSAxMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxNSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5hbF91bml0X3R5cGU9MTUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgpOwoKICAgIC8vIEJ5dGUgYWxpZ25lZCAoYml0IDQwKQogICAgLy8gcHJvZmlsZV9pZGMgPSA4IGJpdHMgPSA2NiBmb3IgQlAgKFBST0ZJTEVfSURDX0JQKSwgNzcgZm9yIE1QIChQUk9GSUxFX0lEQ19NUCkKICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMTE4LCA4KTsKCiAgICAvLyBCeXRlIGFsaWduZWQgKGJpdCA0OCkKICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgKDAgPDwgNykgfCAgICAgLy8gY29uc3RyYWluX3NldDBfZmxhZyA9IDEgZm9yIE1QICsgQlAgY29uc3RyYWludHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwIDw8IDYpIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0cmFpbl9zZXQxX2ZsYWcgID0gMSBmb3IgTVAgKyBCUCBjb25zdHJhaW50cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAgPDwgNSkgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdHJhaW5fc2V0Ml9mbGFnID0gYWx3YXlzIDAgaW4gQlAvTVAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwIDw8IDQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3RyYWluX3NldDNfZmxhZyA9IDEgZm9yIGxldmVsIDFiLCAwIGZvciBvdGhlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2VydmVkX3plcm9fNGJpdHMgPSAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4KTsKCiAgICAvLyBCeXRlIGFsaWduZWQgKGJpdCA1NikKICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgKHBTSFBhcmFtcy0+dWNMZXZlbCA9PSBTSF9MRVZFTF8xQikgPyAxMSA6IChJTUdfVUlOVDgpcFNIUGFyYW1zLT51Y0xldmVsLCA4KTsgICAgICAgICAgICAgICAgICAvLyBsZXZlbF9pZGMgKDggYml0cykgPSAxMSBmb3IgMWIsIDEweGxldmVsIGZvciBvdGhlcnMKCiAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgTVZDX1NQU19JRCk7ICAgICAgICAgICAgICAgIC8vIHNlcV9wYXJhbWV0ZXJfU2V0X2lkID0gMSBGT1Igc3Vic2V0LVNQUwogICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEpOyAgICAgICAgIC8vIGNocm9tYV9mb3JtYXRfaWRjID0gMQogICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDApOyAgICAgICAgIC8vIGJpdF9kZXB0aF9sdW1hX21pbnVzOCA9IDAKICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwKTsgICAgICAgICAvLyBiaXRfZGVwdGhfY2hyb21hX21pbnVzOCA9IDAKICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgcFNIUGFyYW1zLT5iSXNMb3NzbGVzcyA/IDEgOiAwLCAxKTsgLy8gcXBwcmltZV95X3plcm9fdHJhbnNmb3JtX2J5cGFzc19mbGFnID0gMAoKICAgIGlmIChwU0hQYXJhbXMtPmJVc2VEZWZhdWx0U2NhbGluZ0xpc3QgfHwgcFNIUGFyYW1zLT5zZXFfc2NhbGluZ19tYXRyaXhfcHJlc2VudF9mbGFnKSB7CiAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCAxKTsgICAgICAgICAvLyBzZXFfc2NhbGluZ19tYXRyaXhfcHJlc2VudF9mbGFnCiAgICAgICAgaWYgKCFwU0hQYXJhbXMtPmJVc2VEZWZhdWx0U2NhbGluZ0xpc3QpIHsKI2lmZGVmIF9GSVhNRV8KICAgICAgICAgICAgSDI2NF9Xcml0ZUJpdHNfU2NhbGluZ0xpc3RzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgcHNTY2FsaW5nTWF0cml4LCBJTUdfVFJVRSk7CiNlbmRpZgogICAgICAgICAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9SQVdEQVRBKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDgpOyAgICAgICAgIC8vIHNlcV9zY2FsaW5nX2xpc3RfcHJlc2VudF9mbGFnW2ldID0gMDsgMCA8IGkgPCA4CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDEpOyAgICAgICAgIC8vIHNlcV9zY2FsaW5nX21hdHJpeF9wcmVzZW50X2ZsYWcKICAgIH0KCiAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSk7ICAgICAgICAgLy8gbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCA9IDEKICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwKTsgICAgICAgICAvLyBwaWNfb3JkZXJfY250X3R5cGUgPSAwCiAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMik7ICAgICAgICAgLy8gbG9nMl9tYXhfcGljX29yZGVyX2NudF9Jc2JfbWludXM0ID0gMgoKICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwU0hQYXJhbXMtPm1heF9udW1fcmVmX2ZyYW1lcyk7IC8vbnVtX3JlZl9mcmFtZXMgdWUoMiksIHR5cGljYWxseSAyCiAgICAvLyBCeXRlcyBhbGlnbmVkIChiaXQgNzIpCiAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFNIUGFyYW1zLT5nYXBzX2luX2ZyYW1lX251bV92YWx1ZSksIC8vIGdhcHNfaW5fZnJhbWVfbnVtX3ZhbHVlX2FsbG93ZWRfRmxhZyAgIC0gKDEgYml0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CgogICAgLy8vKioqKiBHRU5FUkFURVMgVEhFIFNFQ09ORCwgVkFSSUFCTEUgTEVOR1RILCBFTEVNRU5UIE9GIFRIRSBIMjY0X1NFUVVFTkNFX0hFQURFUigpIFNUUlVDVFVSRSAqKioqLy8vCiAgICAvLy8qKioqIEVMRU1FTlQgQklUQ09VTlQ6IHh4CiAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgcFNIUGFyYW1zLT51Y1dpZHRoX2luX21ic19taW51czEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy9waWNfd2lkdGhfaW5fbWJzX21pbnVzMTogdWUodikgZnJvbSAxMCB0byA0NCAoMTc2IHRvIDcyMCBwaXhlbCBwZXIgcm93KQogICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBTSFBhcmFtcy0+dWNIZWlnaHRfaW5fbWFwc191bml0c19taW51czEpOyAgICAgICAgICAvL3BpY19oZWlnaHRfaW5fbWFwc191bml0c19taW51czE6IHVlKHYpIFZhbHVlIGZyb20gOCB0byAzNSAoMTQ0IHRvIDU3NiBwaXhlbHMgcGVyIGNvbHVtbikKICAgIC8vIFdlIGRvbid0IGtub3cgdGhlIGFsaWdubWVudCBhdCB0aGlzIHBvaW50LCBzbyB3aWxsIGhhdmUgdG8gdXNlIGJpdCB3cml0aW5nIGZ1bmN0aW9ucwoKICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgcFNIUGFyYW1zLT51Y0ZyYW1lX21ic19vbmx5X2ZsYWcsIDEpOyAvLyBmcmFtZV9tYl9vbmx5X2ZsYWcgMT1mcmFtZSBlbmNvZGluZywgMD1maWVsZCBlbmNvZGluZwoKICAgIGlmICghcFNIUGFyYW1zLT51Y0ZyYW1lX21ic19vbmx5X2ZsYWcpIC8vIGluIHRoZSBjYXNlIG9mIGludGVybGFjZWQgZW5jb2RpbmcKICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDEpOyAvLyBtYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnID0gMCBpbiBUb3BheihmaWVsZCBlbmNvZGluZyBhdCB0aGUgc2VxdWVuY2UgbGV2ZWwpCgogICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCAxKTsgLy8gZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZz0xIGluIFRvcGF6CgogICAgaWYgKHBzQ3JvcC0+YkNsaXApIHsKICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEsIDEpOwogICAgICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwc0Nyb3AtPnVpMTZMZWZ0Q3JvcE9mZnNldCk7CiAgICAgICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBzQ3JvcC0+dWkxNlJpZ2h0Q3JvcE9mZnNldCk7CiAgICAgICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBzQ3JvcC0+dWkxNlRvcENyb3BPZmZzZXQpOwogICAgICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwc0Nyb3AtPnVpMTZCb3R0b21Dcm9wT2Zmc2V0KTsKCiAgICB9IGVsc2UgewogICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMSk7CiAgICB9CgogICAgLy8vKioqKiBHRU5FUkFURVMgVEhFIFRISVJEIEVMRU1FTlQgT0YgVEhFIEgyNjRfU0VRVUVOQ0VfSEVBREVSKCkgU1RSVUNUVVJFICoqKiovLy8KICAgIC8vLyoqKiogRUxFTUVOVCBCSVRDT1VOVDogeHgKICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwU0hQYXJhbXMtPlZVSV9QYXJhbXNfUHJlc2VudCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyAoVlVJIG9ubHkgaW4gMXN0IHNlcXVlbmNlIG9mIHN0cmVhbSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOwogICAgaWYgKHBTSFBhcmFtcy0+VlVJX1BhcmFtc19QcmVzZW50ID4gMCkKICAgICAgICB0bmdfX0gyNjRfd3JpdGViaXRzX1ZVSV9wYXJhbXMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAmKHBTSFBhcmFtcy0+VlVJX1BhcmFtcykpOwoKCiAgICB7CiAgICAgICAgaW50IHZpZXdJZHggPSAwOwogICAgICAgIGludCBudW1WaWV3cyA9IE1BWF9NVkNfVklFV1M7CiAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCAxKTsgLy9iaXRfZXF1YWxfdG9fb25lCgogICAgICAgIC8vIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgTVZDIGV4dGVuc2lvbgogICAgICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAobnVtVmlld3MgLSAxKSk7ICAgICAvL251bV92aWV3c19taW51czEKICAgICAgICBmb3IgKHZpZXdJZHggPSAwOyB2aWV3SWR4IDwgbnVtVmlld3M7IHZpZXdJZHgrKykgewogICAgICAgICAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgdmlld0lkeCk7CiAgICAgICAgfQoKICAgICAgICAvLyBhbmNob3IgcmVmZXJlbmNlcwogICAgICAgIGZvciAodmlld0lkeCA9IDE7IHZpZXdJZHggPCBudW1WaWV3czsgdmlld0lkeCsrKSB7CiAgICAgICAgICAgIC8vdG5nX19nZW5lcmF0ZV91ZSggcE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwKTsgICAgIC8vIG51bV9hbmNob3JfcmVmc19sMCAgPSAwCiAgICAgICAgICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxKTsgICAgICAvLyBudW1fYW5jaG9yX3JlZnNfbDAgID0gMTsgdmlldy0xIHJlZmVycyB0byB2aWV3LTAKICAgICAgICAgICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDApOyAgICAgIC8vIGFuY2hvcl9yZWZfbDAgPSAwCgogICAgICAgICAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCk7ICAgICAgLy8gbnVtX2FuY2hvcl9yZWZzX2wxICA9IDAKICAgICAgICB9CgogICAgICAgIC8vIG5vbi1hbmNob3IgcmVmZXJlbmNlcwogICAgICAgIGZvciAodmlld0lkeCA9IDE7IHZpZXdJZHggPCBudW1WaWV3czsgdmlld0lkeCsrKSB7CiAgICAgICAgICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxKTsgICAgICAvLyBudW1fbm9uX2FuY2hvcl9yZWZzX2wwICA9IDAKICAgICAgICAgICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDApOyAgICAgIC8vIG5vbl9hbmNob3JfcmVmc19sMCAgPSAwCgogICAgICAgICAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCk7ICAgICAgLy8gbnVtX25vbl9hbmNob3JfcmVmc19sMSAgPSAwCiAgICAgICAgfQoKICAgICAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCk7IC8vIG51bV9sZXZlbF92YWx1ZXNfc2lnbmFsZWRfbWludXMxICA9IDAKCiAgICAgICAgLy9mb3IobGV2ZWxJZHg9MDsgbGV2ZWxJZHg8PSAwOyBsZXZlbElkeCsrKQogICAgICAgIHsKICAgICAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAocFNIUGFyYW1zLT51Y0xldmVsID09IFNIX0xFVkVMXzFCKSA/IDExIDogKElNR19VSU5UOClwU0hQYXJhbXMtPnVjTGV2ZWwsIDgpOyAgICAgICAgICAvLyBsZXZlbF9pZGMgKDggYml0cykgPSAxMSBmb3IgMWIsIDEweGxldmVsIGZvciBvdGhlcnMKICAgICAgICAgICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDApOyAvLyBudW1fYXBwbGljYWJsZV9vcHNfbWludXMxICA9IDAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwLCAzKTsgLy8gYXBwbGljYWJsZV9vcHNfdGVtcG9yYWxfaWQgID0gMAogICAgICAgICAgICAgICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDApOyAgICAgICAgICAgICAgICAgIC8vIGFwcGxpY2FibGVfb3BfbnVtX3RhcmdldF92aWV3c19taW51czEgID0gMAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwKTsgICAgICAgICAgICAgIC8vIGFwcGxpY2FibGVfb3BfdGFyZ2V0X3ZpZXdfaWQgID0gMAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDApOyAgICAgICAgICAgICAgICAgIC8vIGFwcGxpY2FibGVfb3BfbnVtX3ZpZXdzX21pbnVzMSAgPSAwCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgLy8gbXZjX3Z1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyA9MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOwoKICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIC8vIGFkZGl0aW9uYWxfZXh0ZW5zaW9uMl9mbGFnID0wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CiAgICB9CgoKICAgIC8vIEZpbmFsbHkgd2UgbmVlZCB0byBhbGlnbiB0byB0aGUgbmV4dCBieXRlCiAgICAvLyBUZWxsIE1UWCB0byBpbnNlcnQgdGhlIGJ5dGUgYWxpZ24gZmllbGQgKHdlIGRvbid0IGtub3cgZmluYWwgc3RyZWFtIHNpemUgZm9yIGFsaWdubWVudCBhdCB0aGlzIHBvaW50KQogICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfSU5TRVJUQllURUFMSUdOX0gyNjQpOwp9CgoKLyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBARnVuY3Rpb24gICAgICAgICAgICAgIEgyNjRfUHJlcGFyZU12Y1NlcXVlbmNlSGVhZGVyCiBAZGV0YWlscwogUHJlcGFyZSBhbiBIMjY0IFNQUyBpbiBhIGZvcm0gZm9yIHRoZSBNVFggdG8gZW5jb2RlIGludG8gYSBiaXRzdHJlYW0uCiBAcGFyYW0gICAgcE1UWF9IZWFkZXIgICAgICAgOiBwb2ludGVyIHRvIGhlYWRlciBzdHJ1Y3R1cmUgdG8gcG9wdWxhdGUKIEBwYXJhbSAgICB1aVBpY1dpZHRoSW5NYnMgICA6IHBpY3R1cmUgd2lkdGggaW4gTUJzCiBAcGFyYW0gICAgdWlQaWNIZWlnaHRJbk1icyAgOiBwaWN0dXJlIGhlaWdodCBpbiBNQnMKIEBwYXJhbSAgICBiVnVpUGFyYW1zUHJlc2VudCA6IElNR19UUlVFIGlmIFZVSSBwYXJhbXRlcnMgcHJlc2VudAogQHBhcmFtICAgIHBzUGFyYW1zICAgICAgICAgIDogVlVJIHBhcmFtZXRlcnMKIEBwYXJhbSAgICBwc0Nyb3AgICAgICAgICAgICAgICAgICAgICAgICAgOiBQb2ludGVyIHRvIGNyb3AgcGFyYW1ldGVyIHN0cnVjdHVyZQogQHBhcmFtICAgcHNTSFBhcmFtcyAgICAgICAgICAgICAgOiBQb2ludGVyIHRvIHNlcXVlbmNlIGhlYWRlciBwYXJhbXMgc3RydWN0dXJlCiBAcmV0dXJuICAgTm9uZQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgdG5nX19IMjY0RVNfcHJlcGFyZV9tdmNfc2VxdWVuY2VfaGVhZGVyKAogICAgdm9pZCAqcEhlYWRlck1lbW9yeSwKICAgIEgyNjRfQ1JPUF9QQVJBTVMgKnBzQ3JvcFBhcmFtcywKICAgIElNR19VSU5UMTYgdWkxNlBpY3R1cmVXaWR0aCwKICAgIElNR19VSU5UMTYgdWkxNlBpY3R1cmVIZWlnaHQsCiAgICBJTUdfVUlOVDMyIHVpMzJDdXN0b21RdWFudE1hc2ssCiAgICBJTUdfVUlOVDggdWk4UHJvZmlsZUlkYywKICAgIElNR19VSU5UOCB1aThMZXZlbElkYywKICAgIElNR19VSU5UOCB1aThGaWVsZENvdW50LAogICAgSU1HX1VJTlQ4IHVpOE1heE51bVJlZkZyYW1lcywKICAgIElNR19CT09MICBiUHBzU2NhbGluZywKICAgIElNR19CT09MICBiVXNlRGVmYXVsdFNjYWxpbmdMaXN0LAogICAgSU1HX0JPT0wgIGJFbmFibGVMb3NzbGVzcywKICAgIElNR19CT09MICBfX21heWJlX3VudXNlZCBiQVNPKQp7CiAgICBIMjY0X1NFUVVFTkNFX0hFQURFUl9QQVJBTVMgc1NIUGFyYW1zOwogICAgTVRYX0hFQURFUl9QQVJBTVMgKiBwTVRYX0hlYWRlcjsKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqVGhpc19FbGVtZW50OwogICAgTVRYX0hFQURFUl9FTEVNRU5UICphdWkzMkVsZW1lbnRQb2ludGVyc1tNQVhOVU1CRVJFTEVNRU5UU107CiAgICBwTVRYX0hlYWRlciA9IChNVFhfSEVBREVSX1BBUkFNUyAqKSBwSGVhZGVyTWVtb3J5OwoKI2lmIEhFQURFUlNfVkVSQk9TRV9PVVRQVVQKICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgIlxuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgIioqKioqKioqIEhPU1QgRklSTVdBUkUgUk9VVElORVMgVE8gUEFTUyBIRUFERVJTIEFORCBUT0tFTlMgVE8gTVRYKioqKioqXG4iKTsKICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuIik7CiNlbmRpZgoKICAgIC8vIEJ1aWxkcyBhIHNlcXVlbmNlLCBwaWN0dXJlIGFuZCBzbGljZSBoZWFkZXIgd2l0aCBmcm9tIHRoZSBnaXZlbiBpbnB1dHMgcGFyYW1ldGVycyAoc3RhcnQgb2YgbmV3IGZyYW1lKQogICAgLy8gRXNzZW50aWFsIHdlIGluaXRpYWxpc2Ugb3VyIGhlYWRlciBzdHJ1Y3R1cmVzIGJlZm9yZSBidWlsZGluZwogICAgcE1UWF9IZWFkZXItPnVpMzJFbGVtZW50cyA9IEVMRU1FTlRTX0VNUFRZOwogICAgVGhpc19FbGVtZW50ID0gKE1UWF9IRUFERVJfRUxFTUVOVCAqKSBwTVRYX0hlYWRlci0+YXNFbGVtZW50U3RyZWFtOwogICAgYXVpMzJFbGVtZW50UG9pbnRlcnNbMF0gPSBUaGlzX0VsZW1lbnQ7CgogICAgbWVtc2V0KCZzU0hQYXJhbXMsIDAsIHNpemVvZihIMjY0X1NFUVVFTkNFX0hFQURFUl9QQVJBTVMpKTsKCiAgICBzU0hQYXJhbXMudWNQcm9maWxlID0gdWk4UHJvZmlsZUlkYyAtIDU7CiAgICBzU0hQYXJhbXMudWNMZXZlbCA9ICh1aThMZXZlbElkYyAhPSAxMTEpID8gdWk4TGV2ZWxJZGMgOiBTSF9MRVZFTF8xQjsKICAgIHNTSFBhcmFtcy51Y1dpZHRoX2luX21ic19taW51czEgPSAoSU1HX1VJTlQ4KSgodWkxNlBpY3R1cmVXaWR0aCA+PiA0KS0gMSk7CiAgICBzU0hQYXJhbXMudWNIZWlnaHRfaW5fbWFwc191bml0c19taW51czEgPSAoSU1HX1VJTlQ4KSgodWkxNlBpY3R1cmVIZWlnaHQgPj4gNCkgLSAxKTsKICAgIHNTSFBhcmFtcy5nYXBzX2luX2ZyYW1lX251bV92YWx1ZSA9IElNR19GQUxTRTsKICAgIHNTSFBhcmFtcy5WVUlfUGFyYW1zX1ByZXNlbnQgPSBJTUdfRkFMU0U7CiAgICBzU0hQYXJhbXMudWNGcmFtZV9tYnNfb25seV9mbGFnID0gKHVpOEZpZWxkQ291bnQgPiAxKSA/IElNR19GQUxTRSA6IElNR19UUlVFOwogICAgc1NIUGFyYW1zLnNlcV9zY2FsaW5nX21hdHJpeF9wcmVzZW50X2ZsYWcgPSAoYlBwc1NjYWxpbmcpID8gSU1HX0ZBTFNFIDogKElNR19VSU5UOCkodWkzMkN1c3RvbVF1YW50TWFzayk7CiAgICBzU0hQYXJhbXMuYlVzZURlZmF1bHRTY2FsaW5nTGlzdCA9IChiUHBzU2NhbGluZykgPyBJTUdfRkFMU0UgOiBiVXNlRGVmYXVsdFNjYWxpbmdMaXN0OwogICAgc1NIUGFyYW1zLm1heF9udW1fcmVmX2ZyYW1lcyA9IHVpOE1heE51bVJlZkZyYW1lczsKICAgIHNTSFBhcmFtcy5iSXNMb3NzbGVzcyA9IGJFbmFibGVMb3NzbGVzczsKICAgIHNTSFBhcmFtcy5sb2cyX21heF9waWNfb3JkZXJfY250ID0gNjsKI2lmZGVmIF9UT1BBWkhQX1BEVU1QXwogICAgdG5nX3RyYWNlX3NlcV9oZWFkZXJfcGFyYW1zKCZzU0hQYXJhbXMpOwojZW5kaWYKICAgIHRuZ19fSDI2NEVTX3dyaXRlYml0c19tdmNfc2VxdWVuY2VfaGVhZGVyKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgJnNTSFBhcmFtcywgcHNDcm9wUGFyYW1zLCBOVUxMKTsKICAgIHBNVFhfSGVhZGVyLT51aTMyRWxlbWVudHMrKzsgLy9IYXMgYmVlbiB1c2VkIGFzIGFuIGluZGV4LCBzbyBuZWVkIHRvIGFkZCAxIGZvciBhIHZhbGlkIGVsZW1lbnQgY291bnQKICAgIHJldHVybiA7Cn0KCnZvaWQgdG5nX19IMjY0RVNfcHJlcGFyZV9waWN0dXJlX2hlYWRlcigKICAgIHZvaWQgKnBIZWFkZXJNZW1vcnksCiAgICBJTUdfQk9PTCAgICBiQ2FiYWNFbmFibGVkLAogICAgSU1HX0JPT0wgICAgYl84eDh0cmFuc2Zvcm0sCiAgICBJTUdfQk9PTCAgICBiSW50cmFDb25zdHJhaW5lZCwKICAgIElNR19JTlQ4ICAgIGk4Q1FQT2Zmc2V0LAogICAgSU1HX0JPT0wgICAgYldlaWdodGVkUHJlZGljdGlvbiwKICAgIElNR19VSU5UOCAgIHVpOFdlaWdodGVkQmlQcmVkLAogICAgSU1HX0JPT0wgICAgYk12Y1BQUywKICAgIElNR19CT09MICAgIGJTY2FsaW5nTWF0cml4LAogICAgSU1HX0JPT0wgICAgYlNjYWxpbmdMaXN0cykKewogICAgTVRYX0hFQURFUl9QQVJBTVMgKnBNVFhfSGVhZGVyOwogICAgSDI2NF9QSUNUVVJFX0hFQURFUl9QQVJBTVMgc1BIUGFyYW1zOwoKICAgIC8qIFJvdXRlIG91dHB1dCBlbGVtZW50cyB0byBtZW1vcnkgcHJvdmlkZWQgKi8KICAgIHBNVFhfSGVhZGVyID0gKE1UWF9IRUFERVJfUEFSQU1TICopIHBIZWFkZXJNZW1vcnk7CiAgICAvKiBCdWlsZHMgYSBzZXF1ZW5jZSwgcGljdHVyZSBhbmQgc2xpY2UgaGVhZGVyIHdpdGggZnJvbSB0aGUgZ2l2ZW4gaW5wdXRzIHBhcmFtZXRlcnMgKHN0YXJ0IG9mIG5ldyBmcmFtZSkKICAgICAqIEVzc2VudGlhbCB3ZSBpbml0aWFsaXNlIG91ciBoZWFkZXIgc3RydWN0dXJlcyBiZWZvcmUgYnVpbGRpbmcKICAgICAqLwogICAgTVRYX0hFQURFUl9FTEVNRU5UICpUaGlzX0VsZW1lbnQ7CiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKmF1aTMyRWxlbWVudFBvaW50ZXJzW01BWE5VTUJFUkVMRU1FTlRTXTsKICAgIHBNVFhfSGVhZGVyLT51aTMyRWxlbWVudHMgPSBFTEVNRU5UU19FTVBUWTsKICAgIFRoaXNfRWxlbWVudCA9IChNVFhfSEVBREVSX0VMRU1FTlQgKikgcE1UWF9IZWFkZXItPmFzRWxlbWVudFN0cmVhbTsKICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzWzBdID0gVGhpc19FbGVtZW50OwoKICAgIG1lbXNldCgmc1BIUGFyYW1zLCAwLCBzaXplb2YoSDI2NF9QSUNUVVJFX0hFQURFUl9QQVJBTVMpKTsKCiAgICBzUEhQYXJhbXMucGljX3BhcmFtZXRlcl9zZXRfaWQgPSBiTXZjUFBTID8gTVZDX1BQU19JRCA6IDA7CiAgICBzUEhQYXJhbXMuc2VxX3BhcmFtZXRlcl9zZXRfaWQgPSBiTXZjUFBTID8gTVZDX1NQU19JRCA6IDA7CiAgICBzUEhQYXJhbXMuZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnID0gYkNhYmFjRW5hYmxlZCA/IDEgOiAwOwogICAgc1BIUGFyYW1zLndlaWdodGVkX3ByZWRfZmxhZyA9IGJXZWlnaHRlZFByZWRpY3Rpb247CiAgICBzUEhQYXJhbXMud2VpZ2h0ZWRfYmlwcmVkX2lkYyA9IHVpOFdlaWdodGVkQmlQcmVkOwogICAgc1BIUGFyYW1zLmNocm9tYV9xcF9pbmRleF9vZmZzZXQgPSBpOENRUE9mZnNldDsKICAgIHNQSFBhcmFtcy5jb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWcgPSBiSW50cmFDb25zdHJhaW5lZCA/IDEgOiAwOwogICAgc1BIUGFyYW1zLnRyYW5zZm9ybV84eDhfbW9kZV9mbGFnID0gYl84eDh0cmFuc2Zvcm0gPyAxIDogMDsKICAgIHNQSFBhcmFtcy5waWNfc2NhbGluZ19tYXRyaXhfcHJlc2VudF9mbGFnID0gYlNjYWxpbmdNYXRyaXggPyAxIDogMDsKICAgIHNQSFBhcmFtcy5iVXNlRGVmYXVsdFNjYWxpbmdMaXN0ID0gIWJTY2FsaW5nTGlzdHM7CiAgICBzUEhQYXJhbXMuc2Vjb25kX2Nocm9tYV9xcF9pbmRleF9vZmZzZXQgPSBpOENRUE9mZnNldDsKI2lmZGVmIF9UT1BBWkhQX1BEVU1QXwogICAgdG5nX3RyYWNlX3BpY19oZWFkZXJfcGFyYW1zKCZzUEhQYXJhbXMpOwojZW5kaWYKICAgIHRuZ19fSDI2NEVTX3dyaXRlYml0c19waWN0dXJlX2hlYWRlcihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsICZzUEhQYXJhbXMsIE5VTEwpOwogICAgLyogSGFzIGJlZW4gdXNlZCBhcyBhbiBpbmRleCwgc28gbmVlZCB0byBhZGQgMSBmb3IgYSB2YWxpZCBlbGVtZW50IGNvdW50ICovCiAgICBwTVRYX0hlYWRlci0+dWkzMkVsZW1lbnRzKys7CiAgICByZXR1cm4gOwp9Cgp2b2lkIHRuZ19fSDI2NF9wcmVwYXJlX3NsaWNlX2hlYWRlcigKICAgIElNR19VSU5UMzIgKnBIZWFkZXJNZW1vcnksCiAgICBJTUdfQk9PTCAgICAgICAgYkludHJhU2xpY2UsCiAgICBJTUdfQk9PTCAgICAgICAgYkludGVyQlNsaWNlLAogICAgSU1HX0JPT0wgICAgICAgIGJNdWx0aVJlZiwKICAgIElNR19VSU5UOCAgICAgICB1aThEaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklEQywKICAgIElNR19VSU5UMzIgICAgICB1aTMyRGlzcGxheUZyYW1lTnVtYmVyLAogICAgSU1HX1VJTlQzMiAgICAgIHVpMzJGcmFtZU51bUlkLAogICAgSU1HX1VJTlQzMiAgICAgIHVpRmlyc3RfTUJfQWRkcmVzcywKICAgIElNR19VSU5UMzIgICAgICBfX21heWJlX3VudXNlZCB1aU1CU2tpcFJ1biwKICAgIElNR19CT09MICAgICAgICBiQ2FiYWNFbmFibGVkLAogICAgSU1HX0JPT0wgICAgICAgIGJJc0ludGVybGFjZWQsCiAgICBJTUdfVUlOVDggICAgICAgdWk4RmllbGROdW0sCiAgICBXRUlHSFRFRF9QUkVESUNUSU9OX1ZBTFVFUyAqcFdlaWdodGVkU2V0dXAsCiAgICBJTUdfQk9PTCAgICAgICAgYklzTG9uZ1Rlcm1SZWYKKQp7CiAgICBIMjY0X1NMSUNFX0hFQURFUl9QQVJBTVMgU2xIUGFyYW1zOwogICAgTVRYX0hFQURFUl9QQVJBTVMgKnBNVFhfSGVhZGVyOwogICAgLyogUm91dGUgb3V0cHV0IGVsZW1lbnRzIHRvIG1lbW9yeSBwcm92aWRlZCAqLwogICAgcE1UWF9IZWFkZXIgPSAoTVRYX0hFQURFUl9QQVJBTVMgKikgcEhlYWRlck1lbW9yeTsKCiAgICBtZW1zZXQoJlNsSFBhcmFtcywgMCwgc2l6ZW9mKEgyNjRfU0xJQ0VfSEVBREVSX1BBUkFNUykpOwoKCiAgICBTbEhQYXJhbXMudWk4U3RhcnRfQ29kZV9QcmVmaXhfU2l6ZV9CeXRlcyA9IDQ7CiAgICAvKiBwY2IgLSAgICAgICAgSSB0aGluayB0aGF0IHRoaXMgaXMgbW9yZSBjb3JyZWN0IG5vdyovCiAgICBTbEhQYXJhbXMuU2xpY2VGcmFtZV9UeXBlID0gYkludHJhU2xpY2UgPyAoKCh1aTMyRnJhbWVOdW1JZCAlICgxIDw8IDUpKSA9PSAwKSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xIUF9JRFJfU0xJQ0VGUkFNRV9UWVBFIDogU0xIUF9JX1NMSUNFRlJBTUVfVFlQRSkgOiAoYkludGVyQlNsaWNlID8gU0xIUF9CX1NMSUNFRlJBTUVfVFlQRSA6IFNMSFBfUF9TTElDRUZSQU1FX1RZUEUpOwogICAgLyoKICAgIGlmIChiSW50cmFTbGljZSkgewogICAgICAgIGlmICgodWkzMkZyYW1lTnVtSWQlKDE8PDUpKT09MCkKICAgICAgICAgICAgU2xIUGFyYW1zLlNsaWNlRnJhbWVfVHlwZSA9IFNMSFBfSURSX1NMSUNFRlJBTUVfVFlQRTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIFNsSFBhcmFtcy5TbGljZUZyYW1lX1R5cGUgPSBTTEhQX0lfU0xJQ0VGUkFNRV9UWVBFOwogICAgfSBlbHNlIHsKICAgICAgICBpZiAoYkludGVyQlNsaWNlKQogICAgICAgICAgICBTbEhQYXJhbXMuU2xpY2VGcmFtZV9UeXBlID0gU0xIUF9CX1NMSUNFRlJBTUVfVFlQRTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIFNsSFBhcmFtcy5TbGljZUZyYW1lX1R5cGUgPSBTTEhQX1BfU0xJQ0VGUkFNRV9UWVBFOwogICAgfQogICAgKi8KICAgIFNsSFBhcmFtcy5GcmFtZV9OdW1fRE8gICA9IChJTUdfVUlOVDgpIHVpMzJGcmFtZU51bUlkICUgKDEgPDwgNSk7CiAgICBTbEhQYXJhbXMuSWRyX1BpY19JZCAgICAgPSAoSU1HX1VJTlQ4KSh1aTMyRGlzcGxheUZyYW1lTnVtYmVyICYgMSk7CiAgICBTbEhQYXJhbXMuUGljdHVyZV9OdW1fRE8gPSAoSU1HX1VJTlQ4KSgodWkzMkRpc3BsYXlGcmFtZU51bWJlciAlICgxIDw8IDUpKSAqIDIpOwoKICAgIFNsSFBhcmFtcy5GaXJzdF9NQl9BZGRyZXNzID0gIHVpRmlyc3RfTUJfQWRkcmVzczsKICAgIFNsSFBhcmFtcy5EaXNhYmxlX0RlYmxvY2tpbmdfRmlsdGVyX0lkYyA9IChJTUdfVUlOVDgpIHVpOERpc2FibGVEZWJsb2NraW5nRmlsdGVySURDOwogICAgU2xIUGFyYW1zLmJQaUNJbnRlcmxhY2UgPSBiSXNJbnRlcmxhY2VkOwogICAgU2xIUGFyYW1zLmJGaWVsZFR5cGUgICAgPSB1aThGaWVsZE51bTsKICAgIFNsSFBhcmFtcy5pRGViQWxwaGFPZmZzZXREaXYyICAgPSAwOwogICAgU2xIUGFyYW1zLmlEZWJCZXRhT2Zmc2V0RGl2MiAgICA9IDA7CgogICAgaWYgKGJNdWx0aVJlZikKICAgICAgICBTbEhQYXJhbXMubnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSA9IDE7CiAgICBlbHNlCiAgICAgICAgU2xIUGFyYW1zLm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgPSAwOwoKICAgIFNsSFBhcmFtcy53ZWlnaHRlZF9wcmVkX2ZsYWcgICAgICAgICAgICA9IHBXZWlnaHRlZFNldHVwID8gcFdlaWdodGVkU2V0dXAtPndlaWdodGVkX3ByZWRfZmxhZyAgICAgICAgICAgICA6IDA7CiAgICBTbEhQYXJhbXMud2VpZ2h0ZWRfYmlwcmVkX2lkYyAgID0gcFdlaWdodGVkU2V0dXAgPyBwV2VpZ2h0ZWRTZXR1cC0+d2VpZ2h0ZWRfYmlwcmVkX2lkYyAgICAgICAgICAgIDogMDsKICAgIFNsSFBhcmFtcy5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tICAgICAgICA9IHBXZWlnaHRlZFNldHVwID8gcFdlaWdodGVkU2V0dXAtPmx1bWFfbG9nMl93ZWlnaHRfZGVub20gICAgICAgICA6IDA7CiAgICBTbEhQYXJhbXMuY2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tICAgICAgPSBwV2VpZ2h0ZWRTZXR1cCA/IHBXZWlnaHRlZFNldHVwLT5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20gOiAwOwogICAgU2xIUGFyYW1zLmx1bWFfd2VpZ2h0X2wwX2ZsYWdbMF0gICAgICAgID0gcFdlaWdodGVkU2V0dXAgPyBwV2VpZ2h0ZWRTZXR1cC0+d2VpZ2h0X2ZsYWdbMF1bMF0gICAgICAgICAgICAgICAgICAgICAgOiAwOwogICAgU2xIUGFyYW1zLmx1bWFfd2VpZ2h0X2wwWzBdICAgICAgICAgICAgID0gcFdlaWdodGVkU2V0dXAgPyBwV2VpZ2h0ZWRTZXR1cC0+d2VpZ2h0WzBdWzBdICAgICAgICAgICAgICAgICAgIDogMDsKICAgIFNsSFBhcmFtcy5sdW1hX29mZnNldF9sMFswXSAgICAgICAgICAgICA9IHBXZWlnaHRlZFNldHVwID8gcFdlaWdodGVkU2V0dXAtPm9mZnNldFswXVswXSAgICAgICAgICAgICAgICAgICA6IDA7CiAgICBTbEhQYXJhbXMuY2hyb21hX3dlaWdodF9sMF9mbGFnWzBdICAgICAgPSBwV2VpZ2h0ZWRTZXR1cCA/IHBXZWlnaHRlZFNldHVwLT53ZWlnaHRfZmxhZ1sxXVswXSAgICAgICAgICAgICAgICAgICAgICA6IDA7CiAgICBTbEhQYXJhbXMuY2hyb21hQl93ZWlnaHRfbDBbMF0gICAgICAgICAgPSBwV2VpZ2h0ZWRTZXR1cCA/IHBXZWlnaHRlZFNldHVwLT53ZWlnaHRbMV1bMF0gICAgICAgICAgICAgICAgICAgOiAwOwogICAgU2xIUGFyYW1zLmNocm9tYUJfb2Zmc2V0X2wwWzBdICAgICAgICAgID0gcFdlaWdodGVkU2V0dXAgPyBwV2VpZ2h0ZWRTZXR1cC0+b2Zmc2V0WzFdWzBdICAgICAgICAgICAgICAgICAgIDogMDsKICAgIFNsSFBhcmFtcy5jaHJvbWFSX3dlaWdodF9sMFswXSAgICAgICAgICA9IHBXZWlnaHRlZFNldHVwID8gcFdlaWdodGVkU2V0dXAtPndlaWdodFsyXVswXSAgICAgICAgICAgICAgICAgICA6IDA7CiAgICBTbEhQYXJhbXMuY2hyb21hUl9vZmZzZXRfbDBbMF0gICAgICAgICAgPSBwV2VpZ2h0ZWRTZXR1cCA/IHBXZWlnaHRlZFNldHVwLT5vZmZzZXRbMl1bMF0gICAgICAgICAgICAgICAgICAgOiAwOwogICAgU2xIUGFyYW1zLmx1bWFfd2VpZ2h0X2wwX2ZsYWdbMV0gICAgICAgID0gcFdlaWdodGVkU2V0dXAgPyBwV2VpZ2h0ZWRTZXR1cC0+d2VpZ2h0X2ZsYWdbMF1bMV0gICAgICAgICAgICAgICAgICAgICAgOiAwOwogICAgU2xIUGFyYW1zLmx1bWFfd2VpZ2h0X2wwWzFdICAgICAgICAgICAgID0gcFdlaWdodGVkU2V0dXAgPyBwV2VpZ2h0ZWRTZXR1cC0+d2VpZ2h0WzBdWzFdICAgICAgICAgICAgICAgICAgIDogMDsKICAgIFNsSFBhcmFtcy5sdW1hX29mZnNldF9sMFsxXSAgICAgICAgICAgICA9IHBXZWlnaHRlZFNldHVwID8gcFdlaWdodGVkU2V0dXAtPm9mZnNldFswXVsxXSAgICAgICAgICAgICAgICAgICA6IDA7CiAgICBTbEhQYXJhbXMuY2hyb21hX3dlaWdodF9sMF9mbGFnWzFdICAgICAgPSBwV2VpZ2h0ZWRTZXR1cCA/IHBXZWlnaHRlZFNldHVwLT53ZWlnaHRfZmxhZ1sxXVsxXSAgICAgICAgICAgICAgICAgICAgICA6IDA7CiAgICBTbEhQYXJhbXMuY2hyb21hQl93ZWlnaHRfbDBbMV0gICAgICAgICAgPSBwV2VpZ2h0ZWRTZXR1cCA/IHBXZWlnaHRlZFNldHVwLT53ZWlnaHRbMV1bMV0gICAgICAgICAgICAgICAgICAgOiAwOwogICAgU2xIUGFyYW1zLmNocm9tYUJfb2Zmc2V0X2wwWzFdICAgICAgICAgID0gcFdlaWdodGVkU2V0dXAgPyBwV2VpZ2h0ZWRTZXR1cC0+b2Zmc2V0WzFdWzFdICAgICAgICAgICAgICAgICAgIDogMDsKICAgIFNsSFBhcmFtcy5jaHJvbWFSX3dlaWdodF9sMFsxXSAgICAgICAgICA9IHBXZWlnaHRlZFNldHVwID8gcFdlaWdodGVkU2V0dXAtPndlaWdodFsyXVsxXSAgICAgICAgICAgICAgICAgICA6IDA7CiAgICBTbEhQYXJhbXMuY2hyb21hUl9vZmZzZXRfbDBbMV0gICAgICAgICAgPSBwV2VpZ2h0ZWRTZXR1cCA/IHBXZWlnaHRlZFNldHVwLT5vZmZzZXRbMl1bMV0gICAgICAgICAgICAgICAgICAgOiAwOwoKICAgIFNsSFBhcmFtcy5iSXNMb25nVGVybVJlZiA9IGJJc0xvbmdUZXJtUmVmOwogICAgdG5nX19IMjY0X2dldGVsZW1lbnRzX3NsaWNlX2hlYWRlcihwTVRYX0hlYWRlciwgJlNsSFBhcmFtcywgYkNhYmFjRW5hYmxlZCk7CgogICAgLyoKICAgICAgICB7CiAgICAgICAgICAgIElNR19VSU5UMzIgICAgICAqcE1UWF9IZWFkZXJfTWVtID0gKElNR19VSU5UMzIgKiltdHhfaGRyOwogICAgICAgICAgICAvLyByaGs6IGZpcnN0IGluc2VydCBub3JtYWwgaGVhZGVyLgogICAgICAgICAgICB0bmdfX0gyNjRfZ2V0ZWxlbWVudHNfc2xpY2VfaGVhZGVyKG10eF9oZHIsICZTbEhQYXJhbXMsIGJDYWJhY0VuYWJsZWQsIHVpSWRyUGljSWQpOwoKICAgICAgICAgICAgLy8gcHV0IGEgbWFya2VyIHRvIGluZGljYXRlIHRoYXQgdGhpcyBpcyBhIGNvbXBsZXggaGVhZGVyCiAgICAgICAgICAgIC8vIG5vdGUgdGhhdCBmaXJzdCAiaW50IiBpbiB0aGUgYnVmZmVyIGlzIHVzZWQgZm9yIG51bWJlciBvZiBlbGVtZW50cwogICAgICAgICAgICAvLyB3aGljaCBpcyBub3QgZ29pbmcgdG8gYmUgbW9yZSB0aGFuIDI1NQogICAgICAgICAgICAqcE1UWF9IZWFkZXJfTWVtIHw9IDB4MTAwOwoKICAgICAgICAgICAgLy8gcmhrOiBpbnNlcnQgc2tpcHBlZCBmcmFtZSBoZWFkZXIgYXQgYW4gb2Zmc2V0IG9mIDEyOCBieXRlcwogICAgICAgICAgICBwTVRYX0hlYWRlcl9NZW0gKz0gKEhFQURFUl9TSVpFID4+IDMpOyAgLy8gZ2V0IGEgcG9pbnRlciB0byB0aGUgc2Vjb25kIGhhbGYgb2YgbWVtb3J5CiAgICAgICAgICAgIG10eF9oZHIgPSAoTVRYX0hFQURFUl9QQVJBTVMgKilwTVRYX0hlYWRlcl9NZW07CiAgICAgICAgICAgIHRuZ19fSDI2NF9nZXRlbGVtZW50c19za2lwX1Bfc2xpY2UobXR4X2hkciwgJlNsSFBhcmFtcywgdWlNQlNraXBSdW4sIGJDYWJhY0VuYWJsZWQpOwogICAgICAgIH0KICAgICovCn0KCnZvaWQgdG5nX19NUEVHNF9wcmVwYXJlX3NlcXVlbmNlX2hlYWRlcigKICAgIHZvaWQgKnBIZWFkZXJNZW1vcnksCiAgICBJTUdfQk9PTCBiQkZyYW1lLAogICAgTVBFRzRfUFJPRklMRV9UWVBFIHNQcm9maWxlLAogICAgSU1HX1VJTlQ4IFByb2ZpbGVfYW5kX2xldmVsX2luZGljYXRpb24sCiAgICBGSVhFRF9WT1BfVElNRV9UWVBFIHNGaXhlZF92b3BfdGltZV9pbmNyZW1lbnQsCiAgICBJTUdfVUlOVDMyIFBpY3R1cmVfV2lkdGhfUGl4ZWxzLAogICAgSU1HX1VJTlQzMiBQaWN0dXJlX0hlaWdodF9QaXhlbHMsCiAgICBWQlZQQVJBTVMgKiBwc1ZCVlBhcmFtcywKICAgIElNR19VSU5UMzIgVm9wVGltZVJlc29sdXRpb24pCnsKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyOwoKICAgIC8qIFJvdXRlIG91dHB1dCBlbGVtZW50cyB0byBtZW1vcnkgcHJvdmlkZWQgKi8KICAgIG10eF9oZHIgPSAoTVRYX0hFQURFUl9QQVJBTVMgKikgcEhlYWRlck1lbW9yeTsKICAgIC8qIEJ1aWxkcyBhIHNpbmdsZSBNUEVHNCB2aWRlbyBzZXF1ZW5jZSBoZWFkZXIgZnJvbSB0aGUgZ2l2ZW4gcGFyYW1ldGVycyAqLwoKICAgIC8qIEVzc2VudGlhbCB3ZSBpbml0aWFsaXNlIG91ciBoZWFkZXIgc3RydWN0dXJlcyBiZWZvcmUgYnVpbGRpbmcgKi8KICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqVGhpc19FbGVtZW50OwogICAgbXR4X2hkci0+dWkzMkVsZW1lbnRzID0gRUxFTUVOVFNfRU1QVFk7CiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKmF1aTMyRWxlbWVudFBvaW50ZXJzW01BWE5VTUJFUkVMRU1FTlRTXTsKICAgIFRoaXNfRWxlbWVudCA9IChNVFhfSEVBREVSX0VMRU1FTlQgKikgbXR4X2hkci0+YXNFbGVtZW50U3RyZWFtOwogICAgYXVpMzJFbGVtZW50UG9pbnRlcnNbMF0gPSBUaGlzX0VsZW1lbnQ7CgogICAgdG5nX19NUEVHNF93cml0ZWJpdHNfc2VxdWVuY2VfaGVhZGVyKG10eF9oZHIsCiAgICAgICAgCQkJCSBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAJCQkJIGJCRnJhbWUsCgkJCQkJIHNQcm9maWxlLAogICAgICAgCQkJCSAJIFByb2ZpbGVfYW5kX2xldmVsX2luZGljYXRpb24sCiAgICAgICAJCQkJIAkgc0ZpeGVkX3ZvcF90aW1lX2luY3JlbWVudCwKICAgICAgICAJCQkJIFBpY3R1cmVfV2lkdGhfUGl4ZWxzLAogICAgICAgIAkJCQkgUGljdHVyZV9IZWlnaHRfUGl4ZWxzLAogICAgICAgIAkJCQkgcHNWQlZQYXJhbXMsCgkJCQkJIFZvcFRpbWVSZXNvbHV0aW9uKTsKCiAgICBtdHhfaGRyLT51aTMyRWxlbWVudHMrKzsgLyogSGFzIGJlZW4gdXNlZCBhcyBhbiBpbmRleCwgc28gbmVlZCB0byBhZGQgMSBmb3IgYSB2YWxpZCBlbGVtZW50IGNvdW50ICovCgp9Cgp2b2lkIHRuZ19fTVBFRzRfcHJlcGFyZV92b3BfaGVhZGVyKAogICAgSU1HX1VJTlQzMiAqcEhlYWRlck1lbSwKICAgIElNR19CT09MIGJJc1ZPUF9jb2RlZCwKICAgIElNR19VSU5UMzIgVk9QX3RpbWVfaW5jcmVtZW50LAogICAgSU1HX1VJTlQ4IHNTZWFyY2hfcmFuZ2UsCiAgICBJTUdfVUlOVDggZVZvcF9Db2RpbmdfVHlwZSwKICAgIElNR19VSU5UMzIgVm9wVGltZVJlc29sdXRpb24pCnsKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyOwoKICAgIG10eF9oZHIgPSAoTVRYX0hFQURFUl9QQVJBTVMgKikgcEhlYWRlck1lbTsKCiAgICAvKiBCdWlsZHMgYSBzaW5nbGUgTVBFRzQgVk9QIChwaWN0dXJlKSBoZWFkZXIgZnJvbSB0aGUgZ2l2ZW4gcGFyYW1ldGVycyAqLwogICAgLyogRXNzZW50aWFsIHdlIGluaXRpYWxpc2Ugb3VyIGhlYWRlciBzdHJ1Y3R1cmVzIGJlZm9yZSBidWlsZGluZyAqLwogICAgTVRYX0hFQURFUl9FTEVNRU5UICpUaGlzX0VsZW1lbnQ7CiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKmF1aTMyRWxlbWVudFBvaW50ZXJzW01BWE5VTUJFUkVMRU1FTlRTXTsKICAgIG10eF9oZHItPnVpMzJFbGVtZW50cyA9IEVMRU1FTlRTX0VNUFRZOwogICAgVGhpc19FbGVtZW50ID0gKE1UWF9IRUFERVJfRUxFTUVOVCAqKSBtdHhfaGRyLT5hc0VsZW1lbnRTdHJlYW07CiAgICBhdWkzMkVsZW1lbnRQb2ludGVyc1swXSA9IFRoaXNfRWxlbWVudDsKCiAgICAvKiBGcmFtZSBRU2NhbGUgbm8gbG9uZ2VyIHdyaXR0ZW4gaGVyZSBhcyBpdCBpcyBpbnNlcnRlZCBieSBNVFggbGF0ZXIKICAgICAqIChhZGQgYXMgcGFyYW1ldGVyIHRvIE1UWF9TZW5kX0VsZW1lbnRzX1RvX1ZMQykKICAgICAqLwogICAgdG5nX19NUEVHNF93cml0ZWJpdHNfVk9QX2hlYWRlcigKICAgICAgICBtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgYklzVk9QX2NvZGVkLAogICAgICAgIFZPUF90aW1lX2luY3JlbWVudCwKICAgICAgICBzU2VhcmNoX3JhbmdlLAogICAgICAgIGVWb3BfQ29kaW5nX1R5cGUsCiAgICAgICAgVm9wVGltZVJlc29sdXRpb24pOwoKICAgIG10eF9oZHItPnVpMzJFbGVtZW50cysrOyAvKiBIYXMgYmVlbiB1c2VkIGFzIGFuIGluZGV4LCBzbyBuZWVkIHRvIGFkZCAxIGZvciBhIHZhbGlkIGVsZW1lbnQgY291bnQgKi8KCn0KCnZvaWQgdG5nX19IMjYzX3ByZXBhcmVfc2VxdWVuY2VfaGVhZGVyKAogICAgSU1HX1VJTlQzMiAqcEhlYWRlck1lbSwKICAgIElNR19VSU5UOCBQcm9maWxlX2FuZF9sZXZlbF9pbmRpY2F0aW9uKQp7CiAgICBNVFhfSEVBREVSX1BBUkFNUyAqbXR4X2hkcjsKCiAgICBtdHhfaGRyID0gKE1UWF9IRUFERVJfUEFSQU1TICopIHBIZWFkZXJNZW07CgogICAgLyogQnVpbGRzIGEgc2luZ2xlIEgyNjMgdmlkZW8gc2VxdWVuY2UgaGVhZGVyIGZyb20gdGhlIGdpdmVuIHBhcmFtZXRlcnMgKi8KCiAgICAvKiBFc3NlbnRpYWwgd2UgaW5pdGlhbGlzZSBvdXIgaGVhZGVyIHN0cnVjdHVyZXMgYmVmb3JlIGJ1aWxkaW5nICovCiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKlRoaXNfRWxlbWVudDsKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqYXVpMzJFbGVtZW50UG9pbnRlcnNbTUFYTlVNQkVSRUxFTUVOVFNdOwogICAgbXR4X2hkci0+dWkzMkVsZW1lbnRzID0gRUxFTUVOVFNfRU1QVFk7CiAgICBUaGlzX0VsZW1lbnQgPSAoTVRYX0hFQURFUl9FTEVNRU5UICopIG10eF9oZHItPmFzRWxlbWVudFN0cmVhbTsKICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzWzBdID0gVGhpc19FbGVtZW50OwoKICAgIEgyNjNfd3JpdGViaXRzX1ZpZGVvU2VxdWVuY2VIZWFkZXIobXR4X2hkciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIFByb2ZpbGVfYW5kX2xldmVsX2luZGljYXRpb24pOwoKICAgIG10eF9oZHItPnVpMzJFbGVtZW50cysrOyAvKiBIYXMgYmVlbiB1c2VkIGFzIGFuIGluZGV4LCBzbyBuZWVkIHRvIGFkZCAxIGZvciBhIHZhbGlkIGVsZW1lbnQgY291bnQgKi8KCn0KCnZvaWQgdG5nX19IMjYzX3ByZXBhcmVfcGljdHVyZV9oZWFkZXIoCiAgICBJTUdfVUlOVDMyICpwSGVhZGVyTWVtLAogICAgSU1HX1VJTlQ4IFRlbXBvcmFsX1JlZiwKICAgIEgyNjNfUElDVFVSRV9DT0RJTkdfVFlQRSBQaWN0dXJlQ29kaW5nVHlwZSwKICAgIEgyNjNfU09VUkNFX0ZPUk1BVF9UWVBFIFNvdXJjZUZvcm1hdFR5cGUsCiAgICBJTUdfVUlOVDggRnJhbWVSYXRlLAogICAgSU1HX1VJTlQxNiBQaWN0dXJlV2lkdGgsCiAgICBJTUdfVUlOVDE2IFBpY3R1cmVIZWlndGgpCnsKICAgIE1UWF9IRUFERVJfUEFSQU1TICptdHhfaGRyOwoKICAgIG10eF9oZHIgPSAoTVRYX0hFQURFUl9QQVJBTVMgKikgcEhlYWRlck1lbTsKCiAgICAvKiBFc3NlbnRpYWwgd2UgaW5pdGlhbGlzZSBvdXIgaGVhZGVyIHN0cnVjdHVyZXMgYmVmb3JlIGJ1aWxkaW5nICovCiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKlRoaXNfRWxlbWVudDsKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqYXVpMzJFbGVtZW50UG9pbnRlcnNbTUFYTlVNQkVSRUxFTUVOVFNdOwogICAgbXR4X2hkci0+dWkzMkVsZW1lbnRzID0gRUxFTUVOVFNfRU1QVFk7CiAgICBUaGlzX0VsZW1lbnQgPSAoTVRYX0hFQURFUl9FTEVNRU5UICopIG10eF9oZHItPmFzRWxlbWVudFN0cmVhbTsKICAgIGF1aTMyRWxlbWVudFBvaW50ZXJzWzBdID0gVGhpc19FbGVtZW50OwoKICAgIEgyNjNfd3JpdGViaXRzX1ZpZGVvUGljdHVyZUhlYWRlcigKICAgICAgICBtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICBUZW1wb3JhbF9SZWYsCiAgICAgICAgUGljdHVyZUNvZGluZ1R5cGUsCiAgICAgICAgU291cmNlRm9ybWF0VHlwZSwKICAgICAgICBGcmFtZVJhdGUsCiAgICAgICAgUGljdHVyZVdpZHRoLAogICAgICAgIFBpY3R1cmVIZWlndGgpOwoKICAgIG10eF9oZHItPnVpMzJFbGVtZW50cysrOyAvKiBIYXMgYmVlbiB1c2VkIGFzIGFuIGluZGV4LCBzbyBuZWVkIHRvIGFkZCAxIGZvciBhIHZhbGlkIGVsZW1lbnQgY291bnQgKi8KfQoKdm9pZCB0bmdfX0gyNjNfcHJlcGFyZV9HT0JzbGljZV9oZWFkZXIoCiAgICBJTUdfVUlOVDMyICpwSGVhZGVyTWVtLAogICAgSU1HX1VJTlQ4IEdPQk51bWJlciwKICAgIElNR19VSU5UOCBHT0JGcmFtZUlkKQp7CiAgICBNVFhfSEVBREVSX1BBUkFNUyAqbXR4X2hkcjsKCiAgICBtdHhfaGRyID0gKE1UWF9IRUFERVJfUEFSQU1TICopIHBIZWFkZXJNZW07CgogICAgLyogRXNzZW50aWFsIHdlIGluaXRpYWxpc2Ugb3VyIGhlYWRlciBzdHJ1Y3R1cmVzIGJlZm9yZSBidWlsZGluZyAqLwogICAgTVRYX0hFQURFUl9FTEVNRU5UICpUaGlzX0VsZW1lbnQ7CiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKmF1aTMyRWxlbWVudFBvaW50ZXJzW01BWE5VTUJFUkVMRU1FTlRTXTsKICAgIG10eF9oZHItPnVpMzJFbGVtZW50cyA9IEVMRU1FTlRTX0VNUFRZOwogICAgVGhpc19FbGVtZW50ID0gKE1UWF9IRUFERVJfRUxFTUVOVCAqKSBtdHhfaGRyLT5hc0VsZW1lbnRTdHJlYW07CiAgICBhdWkzMkVsZW1lbnRQb2ludGVyc1swXSA9IFRoaXNfRWxlbWVudDsKCiAgICBIMjYzX3dyaXRlYml0c19HT0JTbGljZUhlYWRlcihtdHhfaGRyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgR09CTnVtYmVyLCBHT0JGcmFtZUlkKTsKCiAgICBtdHhfaGRyLT51aTMyRWxlbWVudHMrKzsgLy9IYXMgYmVlbiB1c2VkIGFzIGFuIGluZGV4LCBzbyBuZWVkIHRvIGFkZCAxIGZvciBhIHZhbGlkIGVsZW1lbnQgY291bnQKCiAgICAvKiBzaWxlbnQgdGhlIHdhcm5pbmcgbWVzc2FnZSAqLwogICAgKHZvaWQpU2hvd19CaXRzOwogICAgKHZvaWQpU2hvd19FbGVtZW50czsKICAgIC8qCiAgICAodm9pZCl0bmdfX0gyNjRfd3JpdGViaXRzX1NFSV9yYnNwaGVhZGVyOwogICAgKHZvaWQpdG5nX19IMjY0X2dldGVsZW1lbnRzX3NraXBfQl9zbGljZTsKICAgICh2b2lkKXRuZ19fSDI2NF9nZXRlbGVtZW50c19iYWNrd2FyZF96ZXJvX0Jfc2xpY2U7CiAgICAodm9pZCl0bmdfX0gyNjRfZ2V0ZWxlbWVudHNfcmJzcF9BVEVfb25seTsKICAgICh2b2lkKXRuZ19NUEVHNF9nZXRlbGVtZW50c192aWRlb19wYWNrZXRfaGVhZGVyOwogICAgKi8KfQoKdm9pZCB0bmdfX0gyNjRFU19ub3Rmb3JzaW1zX3dyaXRlYml0c19leHRlbnNpb25fc2xpY2VoZWFkZXIoCiAgICBNVFhfSEVBREVSX1BBUkFNUyAqcE1UWF9IZWFkZXIsCiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKiphdWkzMkVsZW1lbnRQb2ludGVycywKICAgIEgyNjRfU0xJQ0VfSEVBREVSX1BBUkFNUyAqcFNsSFBhcmFtcywKICAgIElNR19CT09MIGJDYWJhY0VuYWJsZWQsIElNR19CT09MIGJJc0lEUikKewogICAgYlN0YXJ0TmV4dFJhd0RhdGFFbGVtZW50ID0gSU1HX0ZBTFNFOwoKICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX1NUQVJUQ09ERV9SQVdEQVRBKTsKCiAgICB0bmdfX0gyNjRfd3JpdGViaXRzX3N0YXJ0Y29kZV9wcmVmaXhfZWxlbWVudChwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIHBTbEhQYXJhbXMtPnVpOFN0YXJ0X0NvZGVfUHJlZml4X1NpemVfQnl0ZXMpOyAvL0NhbiBiZSAzIG9yIDQgYnl0ZXMgLSBhbHdheXMgNCBieXRlcyBpbiBvdXIgaW1wbGVtZW50YXRpb25zCgogICAgLy8vKioqKiBHRU5FUkFURVMgVEhFIEZJUlNUIEVMRU1FTlQgT0YgVEhFIEgyNjRfU0xJQ0VfSEVBREVSKCkgU1RSVUNUVVJFICoqKiovLy8KICAgIC8vLyoqKiogRUxFTUVOVCBCSVRDT1VOVDogOAoKICAgIC8vIFN0YXJ0Q29kZVByZWZpeCBQcmVnZW5lcmF0ZWQgaW46IEJ1aWxkX0gyNjRfNEJ5dGVfU3RhcnRDb2RlUHJlZml4X0VsZW1lbnQoKSAoNCBvciAzIGJ5dGVzKQogICAgLy8oMyBieXRlcyB3aGVuIHNsaWNlIGlzIGZpcnN0IGluIGEgcGljdHVyZSB3aXRob3V0IHNlcXVlbmNlL3BpY3R1cmVfaGVhZGVyIGJlZm9yZSBwaWN0dXJlCiAgICAvLyBCeXRlIGFsaWduZWQgKGJpdCAzMiBvciAyNCkKICAgIC8vIE5PVEU6IFNsaWNlX1R5cGUgYW5kIEZyYW1lX1R5cGUgYXJlIGFsd2F5cyB0aGUgc2FtZSwgaGVuY2UgU2xpY2VGcmFtZV9UeXBlCiAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDEpOyAgIC8vIGZvcmJpZGRlbl96ZXJvX2JpdAoKICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX1JFRkVSRU5DRSk7IC8vTVRYIGZpbGxzIHRoaXMgdmFsdWUgaW4KICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX1JBV0RBVEEpOwoKICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMjAsIDUpOyAgICAvLyBuYWxfdW5pdF90eXBlIGZvciBjb2RlZF9zbGljZV9leHRlbnNpb24KCgogICAgLy9pZihuYWxfdW5pdF90eXBlID09IDE0IHx8IG5hbF91bml0X3R5cGUgPT0gMjApCiAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDEpOyAgIC8vIFNWQyBleHRlbnNpb24gZmxhZwoKICAgIC8vIG5hbF91bml0X2hlYWRlcl9tdmNfZXh0ZW5zaW9uKCkKICAgIHsKICAgICAgICBpZiAocFNsSFBhcmFtcy0+U2xpY2VGcmFtZV9UeXBlID09IFNMSFBfSURSX1NMSUNFRlJBTUVfVFlQRSkgewogICAgICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsICAgIDAsIDEpOyAgIC8vIG5vbl9pZHJfZmxhZyBmbGFnCiAgICAgICAgfSBlbHNlIGlmICgocFNsSFBhcmFtcy0+U2xpY2VGcmFtZV9UeXBlID09IFNMSFBfUF9TTElDRUZSQU1FX1RZUEUpICYmIGJJc0lEUikgewogICAgICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsICAgIDAsIDEpOyAgIC8vIG5vbl9pZHJfZmxhZyBmbGFnCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAgICAxLCAxKTsgICAvLyBub25faWRyX2ZsYWcgZmxhZwogICAgICAgIH0KCiAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAgICAwLCA2KTsgICAvLyBwcmlvcml0eV9pZCBmbGFnCiAgICAgICAgdG5nX193cml0ZV91cHRvMzJiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgICAgMSwgMTApOyAgIC8vIHZpZXdfaWQgPSBoYXJkY29kZWQgdG8gMSBmb3IgZGVwZW5kZW50IHZpZXcKCiAgICAgICAgLy90bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsICAgIDAsIDMpOyAgIC8vIHRlbXBvcmFsX2lkIGZsYWcKICAgICAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9URU1QT1JBTF9JRCk7IC8vIHRlbXBvcmFsX2lkIGZsYWcKICAgICAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9BTkNIT1JfUElDX0ZMQUcpOyAvLyBhbmNob3JfcGljX2ZsYWcKCiAgICAgICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfUkFXREFUQSk7CgogICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgICAgMCwgMSk7ICAgLy8gaW50ZXJ2aWV3IGZsYWcgaXMgYWx3YXlzIEZBTFNFIGZvciBkZXBlbmRlbnQgZnJhbWVzCgogICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgICAgMSwgMSk7ICAgLy8gcmVzZXJ2ZWQgb25lIGJpdAogICAgfQoKICAgIC8vIHNsaWNlIGhlYWRlcgogICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfQ1VSUk1CTlIpOyAvL01UWCBmaWxscyB0aGlzIHZhbHVlIGluCgogICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfUkFXREFUQSk7CgogICAgLy8vKioqKiBHRU5FUkFURVMgVEhFIFNFQ09ORCBFTEVNRU5UIE9GIFRIRSBIMjY0X1NMSUNFX0hFQURFUigpIFNUUlVDVFVSRSAqKioqLy8vCiAgICAvKiBUaGUgZm9sbG93aW5nIGlzIHNsaWNlIHBhcmFtZXRlciBzZXQgaW4gQlAvTVAgKi8KICAgIC8vdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIChJTUdfVUlOVDMyKSBwU2xIUGFyYW1zLT5GaXJzdF9NQl9BZGRyZXNzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maXJzdF9tYl9pbl9zbGljZSA9IEZpcnN0IE1CIGFkZHJlc3MgaW4gc2xpY2U6IHVlKFJhbmdlIDAgLSAgMTYxOSkKICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAoSU1HX1VJTlQzMikoKHBTbEhQYXJhbXMtPlNsaWNlRnJhbWVfVHlwZSA9PSBTTEhQX0lEUl9TTElDRUZSQU1FX1RZUEUpID8gU0xIUF9JX1NMSUNFRlJBTUVfVFlQRSA6IHBTbEhQYXJhbXMtPlNsaWNlRnJhbWVfVHlwZSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc2xpY2VfdHlwZSB1ZSh2KTogMCBmb3IgUC1zbGljZSwgMSBmb3IgQi1zbGljZSwgMiBmb3IgSS1zbGljZQogICAgLy8ga2FiOiAvL25vdCBjbGVhbiBjaGFuZ2UgZnJvbSBJRFIgdG8gaW50cmEsIElEUiBzaG91bGQgaGF2ZSBzZXBhcmF0ZSBmbGFnCgogICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEpOyAgLy8gcGljX3BhcmFtZXRlcl9zZXRfaWQgPSAxIGZvciBkZXBlbmRlbnQgdmlldwoKICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX0ZSQU1FX05VTSk7IC8vIEluc2VydCB0b2tlbiB0byB0ZWxsIE1UWCB0byBpbnNlcnQgZnJhbWVfbnVtCiAgICBiU3RhcnROZXh0UmF3RGF0YUVsZW1lbnQgPSBJTUdfVFJVRTsKCiAgICBpZiAoKHBTbEhQYXJhbXMtPmJQaUNJbnRlcmxhY2UpIHx8IChwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgPT0gU0xIUF9JRFJfU0xJQ0VGUkFNRV9UWVBFKSkgewogICAgICAgIC8vdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfUkFXREFUQSk7CgogICAgICAgIC8vIGludGVybGFjZWQgZW5jb2RpbmcKICAgICAgICBpZiAocFNsSFBhcmFtcy0+YlBpQ0ludGVybGFjZSkgewogICAgICAgICAgICBDaGVja1N0YXJ0UmF3RGF0YUVsZW1lbnQocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzKTsKICAgICAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWVsZF9waWNfZmxhZyA9IDEKICAgICAgICAgICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfQk9UVE9NX0ZJRUxEKTsgLy8gSW5zZXJ0IHRva2VuIHRvIHRlbGwgTVRYIHRvIGluc2VydCBCT1RUT01fRklFTEQgZmxhZyBpZiByZXF1aXJlZAogICAgICAgICAgICAvL3RuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX1JBV0RBVEEpOwogICAgICAgICAgICBiU3RhcnROZXh0UmF3RGF0YUVsZW1lbnQgPSBJTUdfVFJVRTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKChwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgPT0gU0xIUF9JRFJfU0xJQ0VGUkFNRV9UWVBFKSB8fCAoYklzSURSKSkgewogICAgICAgIENoZWNrU3RhcnRSYXdEYXRhRWxlbWVudChwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMpOwogICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSwgMSk7IC8vIGlkcl9waWNfaWQgdWUodikgPSAwICgxYikgaW4gVG9wYXoKICAgIH0KCiAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9QSUNfT1JERVJfQ05UKTsgLy8gSW5zZXJ0IHRva2VuIHRvIHRlbGwgTVRYIHRvIGluc2VydCBwaWNfb3JkZXJfY250X2xzYgogICAgYlN0YXJ0TmV4dFJhd0RhdGFFbGVtZW50ID0gSU1HX1RSVUU7CgogICAgaWYgKHBTbEhQYXJhbXMtPlNsaWNlRnJhbWVfVHlwZSA9PSBTTEhQX0JfU0xJQ0VGUkFNRV9UWVBFKQogICAgICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX0RJUkVDVF9TUEFUSUFMX01WX0ZMQUcpOyAvLyBJbnNlcnQgdG9rZW4gdG8gdGVsbCBNVFggdG8gaW5zZXJ0IGRpcmVjdF9zcGF0aWFsX212X3ByZWRfZmxhZwoKICAgIGlmIChwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgPT0gU0xIUF9QX1NMSUNFRlJBTUVfVFlQRSkgewogICAgICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX05VTV9SRUZfSURYX0FDVElWRSk7CiAgICAgICAgYlN0YXJ0TmV4dFJhd0RhdGFFbGVtZW50ID0gSU1HX1RSVUU7CiAgICB9IGVsc2UgaWYgKHBTbEhQYXJhbXMtPlNsaWNlRnJhbWVfVHlwZSA9PSBTTEhQX0JfU0xJQ0VGUkFNRV9UWVBFKSB7CiAgICAgICAgQ2hlY2tTdGFydFJhd0RhdGFFbGVtZW50KHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycyk7CiAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwLCAxKTsgICAgICAgICAgICAgLy8gbnVtX3JlZl9pZHhfYWN0aXZlX292ZXJyaWRlX2ZsYWcgKDEgYml0KSA9IDAgaW4gVG9wYXoKICAgIH0KCiAgICAvLyByZWZlcmVuY2UgcGljdHVyZSBsaXN0IG1vZGlmaWNhdGlvbgogICAgaWYgKHBTbEhQYXJhbXMtPlNsaWNlRnJhbWVfVHlwZSAhPSBTTEhQX0lfU0xJQ0VGUkFNRV9UWVBFICYmIHBTbEhQYXJhbXMtPlNsaWNlRnJhbWVfVHlwZSAhPSBTTEhQX0lEUl9TTElDRUZSQU1FX1RZUEUpIHsKICAgICAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9SRU9SREVSX0wwKTsgLy8gSW5zZXJ0IHRva2VuIHRvIHRlbGwgTVRYIHRvIGluc2VydCBCT1RUT01fRklFTEQgZmxhZyBpZiByZXF1aXJlZAogICAgICAgIC8vdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfUkFXREFUQSk7CiAgICAgICAgYlN0YXJ0TmV4dFJhd0RhdGFFbGVtZW50ID0gSU1HX1RSVUU7CiAgICB9CgogICAgaWYgKHBTbEhQYXJhbXMtPlNsaWNlRnJhbWVfVHlwZSA9PSBTTEhQX0JfU0xJQ0VGUkFNRV9UWVBFKSAgICAgICAgewogICAgICAgIENoZWNrU3RhcnRSYXdEYXRhRWxlbWVudChwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMpOwogICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWZfcGljX2xpc3Rfb3JkZXJpbmdfZmxhZ19sMSAoMSBiaXQpID0gMCwgbm8gcmVmZXJlbmNlIHBpY3R1cmUgb3JkZXJpbmcgaW4gVG9wYXoKICAgIH0KCiAgICAvLyBXRUlHSFRFRCBQUkVESUNUSU9OCiAgICAvKiAgICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX1NMSUNFV0VJR0hURURQUkVESUNUSU9OU1RSVUNUKTsKICAgICAgICBiU3RhcnROZXh0UmF3RGF0YUVsZW1lbnQgPSBJTUdfVFJVRTsqLwoKICAgIGlmICgocFNsSFBhcmFtcy0+U2xpY2VGcmFtZV9UeXBlID09IFNMSFBfSURSX1NMSUNFRlJBTUVfVFlQRSkgfHwgKGJJc0lEUikpIHsKICAgICAgICBDaGVja1N0YXJ0UmF3RGF0YUVsZW1lbnQocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzKTsKICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9fb3V0cHV0X29mX3ByaW9yX3BpY3NfZmxhZyAoMSBiaXQpID0gMAogICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb25nX3Rlcm1fcmVmZXJlbmNlX2ZsYWcgKDEgYml0KSA9IDAKICAgIH0gZWxzZSB7CiAgICAgICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfQURBUFRJVkUpOyAvL01UWCBmaWxscyB0aGlzIHZhbHVlIGluCiAgICAgICAgLy90bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9SQVdEQVRBKTsKICAgICAgICBiU3RhcnROZXh0UmF3RGF0YUVsZW1lbnQgPSBJTUdfVFJVRTsKICAgIH0KCiAgICBpZiAoYkNhYmFjRW5hYmxlZCAmJiAoKFNMSFBfUF9TTElDRUZSQU1FX1RZUEUgPT0gcFNsSFBhcmFtcy0+U2xpY2VGcmFtZV9UeXBlKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgIChTTEhQX0JfU0xJQ0VGUkFNRV9UWVBFID09IHBTbEhQYXJhbXMtPlNsaWNlRnJhbWVfVHlwZSkpKSB7CiAgICAgICAgQ2hlY2tTdGFydFJhd0RhdGFFbGVtZW50KHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycyk7CiAgICAgICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDApOyAvLyBoYXJkIGNvZGUgY2FiYWNfaW5pdF9pZGMgdmFsdWUgb2YgMAogICAgfQogICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfU1FQKTsgLy9NVFggZmlsbHMgdGhpcyB2YWx1ZSBpbgogICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfUkFXREFUQSk7CgogICAgLy8vKioqKiBHRU5FUkFURVMgRUxFTUVOVCBPRiBUSEUgSDI2NF9TTElDRV9IRUFERVIoKSBTVFJVQ1RVUkUgKioqKi8vLwogICAgLy8vKioqKiBFTEVNRU5UIEJJVENPVU5UOiAxMQogICAgLy8gTmV4dCBmaWVsZCBpcyBnZW5lcmF0ZWQgb24gTVRYIHdpdGggYSBzcGVjaWFsIGNvbW1uYWQgKG5vdCBFTEVNRU5UX1JBVykgLSBzbyBub3QgZGVmaW5lZCBoZXJlCiAgICAvL3B1Y0hTPXRuZ19fZ2VuZXJhdGVfc2UocHVjSFMsIHB1aUJpdFBvcywgcFNsSFBhcmFtcy0+U2xpY2VfUVBfRGVsdGEpOyAvL3NsaWNlX3FwX2RlbHRhIHNlKHYpID0gU2xpY2VRUHkgLSAocGljX2luaXRfcXBfbWludXMyNisyNikKICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwU2xIUGFyYW1zLT5EaXNhYmxlX0RlYmxvY2tpbmdfRmlsdGVyX0lkYyk7IC8vZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9pZGMgdWUodikgPSAyPwogICAgaWYgKHBTbEhQYXJhbXMtPkRpc2FibGVfRGVibG9ja2luZ19GaWx0ZXJfSWRjICE9IDEpIHsKICAgICAgICB0bmdfX2dlbmVyYXRlX3NlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgcFNsSFBhcmFtcy0+aURlYkFscGhhT2Zmc2V0RGl2Mik7IC8vc2xpY2VfYWxwaGFfYzBfb2Zmc2V0X2RpdjIgc2UodikgPSAwICgxYikgaW4gVG9wYXoKICAgICAgICB0bmdfX2dlbmVyYXRlX3NlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgcFNsSFBhcmFtcy0+aURlYkJldGFPZmZzZXREaXYyKTsgLy9zbGljZV9iZXRhX29mZnNldF9kaXYyIHNlKHYpID0gMCAoMWIpIGluIFRvcGF6CiAgICB9CiAgICAvL251bV9zbGljZV9ncm91cHNfbWludXMxID09MCBpbiBUb3Bheiwgc28gbm8gc2xpY2VfZ3JvdXBfY2hhbmdlX2N5Y2xlIGZpZWxkIGhlcmUKICAgIC8vIG5vIGJ5dGUgYWxpZ25tZW50IGF0IGVuZCBvZiBzbGljZSBoZWFkZXJzCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZCB0bmdfX0gyNjRFU19ub3Rmb3JzaW1zX3dyaXRlYml0c19zbGljZV9oZWFkZXIoCiAgICBNVFhfSEVBREVSX1BBUkFNUyAqcE1UWF9IZWFkZXIsCiAgICBNVFhfSEVBREVSX0VMRU1FTlQgKiphdWkzMkVsZW1lbnRQb2ludGVycywKICAgIEgyNjRfU0xJQ0VfSEVBREVSX1BBUkFNUyAqcFNsSFBhcmFtcywKICAgIElNR19CT09MIGJDYWJhY0VuYWJsZWQsIElNR19CT09MIGJJc0lEUikKewogICAgYlN0YXJ0TmV4dFJhd0RhdGFFbGVtZW50ID0gSU1HX0ZBTFNFOwogICAgdW5zaWduZWQgY2hhciogcGRnID0gKHVuc2lnbmVkIGNoYXIqKXBNVFhfSGVhZGVyOwoKICAgIGlmIChwU2xIUGFyYW1zLT51aTE2TXZjVmlld0lkeCA9PSAoSU1HX1VJTlQxNikoTk9OX01WQ19WSUVXKSkgewogICAgICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX1NUQVJUQ09ERV9SQVdEQVRBKTsKICAgIH0gZWxzZSBpZiAocFNsSFBhcmFtcy0+dWkxNk12Y1ZpZXdJZHggPT0gTVZDX0JBU0VfVklFV19JRFgpIHsKICAgICAgICB0bmdfX2luc2VydF9wcmVmaXhfbmFsX2hlYWRlcihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNsSFBhcmFtcywgYkNhYmFjRW5hYmxlZCk7CiAgICAgICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfU1RBUlRDT0RFX01JREhEUik7CiAgICB9IGVsc2UgewogICAgICAgIC8vSW5zZXJ0CiAgICAgICAgdG5nX19IMjY0RVNfbm90Zm9yc2ltc193cml0ZWJpdHNfZXh0ZW5zaW9uX3NsaWNlaGVhZGVyKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywKICAgICAgICAgICAgICAgIHBTbEhQYXJhbXMsIGJDYWJhY0VuYWJsZWQsIGJJc0lEUik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHRuZ19fSDI2NF93cml0ZWJpdHNfc3RhcnRjb2RlX3ByZWZpeF9lbGVtZW50KHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgcFNsSFBhcmFtcy0+dWk4U3RhcnRfQ29kZV9QcmVmaXhfU2l6ZV9CeXRlcyk7IC8vQ2FuIGJlIDMgb3IgNCBieXRlcyAtIGFsd2F5cyA0IGJ5dGVzIGluIG91ciBpbXBsZW1lbnRhdGlvbnMKCiAgICAvLy8qKioqIEdFTkVSQVRFUyBUSEUgRklSU1QgRUxFTUVOVCBPRiBUSEUgSDI2NF9TTElDRV9IRUFERVIoKSBTVFJVQ1RVUkUgKioqKi8vLwogICAgLy8vKioqKiBFTEVNRU5UIEJJVENPVU5UOiA4CgogICAgLy8gU3RhcnRDb2RlUHJlZml4IFByZWdlbmVyYXRlZCBpbjogQnVpbGRfSDI2NF80Qnl0ZV9TdGFydENvZGVQcmVmaXhfRWxlbWVudCgpICg0IG9yIDMgYnl0ZXMpCiAgICAvLygzIGJ5dGVzIHdoZW4gc2xpY2UgaXMgZmlyc3QgaW4gYSBwaWN0dXJlIHdpdGhvdXQgc2VxdWVuY2UvcGljdHVyZV9oZWFkZXIgYmVmb3JlIHBpY3R1cmUKICAgIC8vIEJ5dGUgYWxpZ25lZCAoYml0IDMyIG9yIDI0KQogICAgLy8gTk9URTogU2xpY2VfVHlwZSBhbmQgRnJhbWVfVHlwZSBhcmUgYWx3YXlzIHRoZSBzYW1lLCBoZW5jZSBTbGljZUZyYW1lX1R5cGUKCiAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDEpOyAgIC8vIGZvcmJpZGRlbl96ZXJvX2JpdAoKICAgIC8vIG5hbF9yZWZfaWRjLCAweDAzIGZvciBJRFIgc2xpY2UsIGZvciBub24tSURSIHNsaWNlLCBmdyBjaG9zZSBhIHZhbHVlCiAgICAvL3RuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgKChwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgPT0gU0xIUF9JRFJfU0xJQ0VGUkFNRV9UWVBFID8gMyA6IEVMRU1FTlRfUkVGRVJFTkNFKSksIDIpOwogICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfUkVGRVJFTkNFKTsKICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX1JBV0RBVEEpOwoKICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgKChwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgPT0gU0xIUF9JRFJfU0xJQ0VGUkFNRV9UWVBFID8gNSA6IDEpKSwgICAgICAgICAgICAgICAgICAgLy8gbmFsX3VuaXRfdHB5ZSAoNSBiaXRzKSA9IEktZnJhbWUgSURSLCBhbmQgMSBmb3IgIHJlc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUpOwoKICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX0NVUlJNQk5SKTsgLy9NVFggZmlsbHMgdGhpcyB2YWx1ZSBpbgogICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfUkFXREFUQSk7CgoKICAgIC8vLyoqKiogR0VORVJBVEVTIFRIRSBTRUNPTkQgRUxFTUVOVCBPRiBUSEUgSDI2NF9TTElDRV9IRUFERVIoKSBTVFJVQ1RVUkUgKioqKi8vLwogICAgLyogVGhlIGZvbGxvd2luZyBpcyBzbGljZSBwYXJhbWV0ZXIgc2V0IGluIEJQL01QICovCiAgICAvL3RuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAoSU1HX1VJTlQzMikgcFNsSFBhcmFtcy0+Rmlyc3RfTUJfQWRkcmVzcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmlyc3RfbWJfaW5fc2xpY2UgPSBGaXJzdCBNQiBhZGRyZXNzIGluIHNsaWNlOiB1ZShSYW5nZSAwIC0gIDE2MTkpCiAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgKElNR19VSU5UMzIpKChwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgPT0gU0xIUF9JRFJfU0xJQ0VGUkFNRV9UWVBFKSA/IFNMSFBfSV9TTElDRUZSQU1FX1RZUEUgOiBwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3NsaWNlX3R5cGUgdWUodik6IDAgZm9yIFAtc2xpY2UsIDEgZm9yIEItc2xpY2UsIDIgZm9yIEktc2xpY2UKICAgIC8vIGthYjogLy9ub3QgY2xlYW4gY2hhbmdlIGZyb20gSURSIHRvIGludHJhLCBJRFIgc2hvdWxkIGhhdmUgc2VwYXJhdGUgZmxhZwogICAgaWYgKHBTbEhQYXJhbXMtPnVpMTZNdmNWaWV3SWR4ICE9IChJTUdfVUlOVDE2KShOT05fTVZDX1ZJRVcpKQogICAgICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwU2xIUGFyYW1zLT51aTE2TXZjVmlld0lkeCk7ICAvLyBwaWNfcGFyYW1ldGVyX3NldF9pZCA9IDAKICAgIGVsc2UKICAgICAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCk7ICAvLyBwaWNfcGFyYW1ldGVyX3NldF9pZCA9IDAKCiAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9GUkFNRV9OVU0pOyAvLyBJbnNlcnQgdG9rZW4gdG8gdGVsbCBNVFggdG8gaW5zZXJ0IGZyYW1lX251bQoKICAgIGlmICgocFNsSFBhcmFtcy0+YlBpQ0ludGVybGFjZSkgfHwgKHBTbEhQYXJhbXMtPlNsaWNlRnJhbWVfVHlwZSA9PSBTTEhQX0lEUl9TTElDRUZSQU1FX1RZUEUpKSB7CiAgICAgICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfUkFXREFUQSk7CiAgICAgICAgLy8gaW50ZXJsYWNlZCBlbmNvZGluZwogICAgICAgIGlmIChwU2xIUGFyYW1zLT5iUGlDSW50ZXJsYWNlKSB7CiAgICAgICAgICAgIHRuZ19fd3JpdGVfdXB0bzhiaXRzX2VsZW1lbnRzKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMSwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmllbGRfcGljX2ZsYWcgPSAxCiAgICAgICAgICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX0JPVFRPTV9GSUVMRCk7IC8vIEluc2VydCB0b2tlbiB0byB0ZWxsIE1UWCB0byBpbnNlcnQgQk9UVE9NX0ZJRUxEIGZsYWcgaWYgcmVxdWlyZWQKICAgICAgICAgICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfUkFXREFUQSk7CiAgICAgICAgfQoKICAgICAgICBpZiAocFNsSFBhcmFtcy0+U2xpY2VGcmFtZV9UeXBlID09IFNMSFBfSURSX1NMSUNFRlJBTUVfVFlQRSkKICAgICAgICAgICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfSURSX1BJQ19JRCk7ICAgICAgIC8vIGlkcl9waWNfaWQgdWUodikKICAgIH0KCiAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9QSUNfT1JERVJfQ05UKTsgLy8gSW5zZXJ0IHRva2VuIHRvIHRlbGwgTVRYIHRvIGluc2VydCBwaWNfb3JkZXJfY250X2xzYgoKICAgIGlmIChwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgPT0gU0xIUF9CX1NMSUNFRlJBTUVfVFlQRSkKICAgICAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9ESVJFQ1RfU1BBVElBTF9NVl9GTEFHKTsgLy8gSW5zZXJ0IHRva2VuIHRvIHRlbGwgTVRYIHRvIGluc2VydCBkaXJlY3Rfc3BhdGlhbF9tdl9wcmVkX2ZsYWcKCiAgICBpZiAocFNsSFBhcmFtcy0+U2xpY2VGcmFtZV9UeXBlID09IFNMSFBfUF9TTElDRUZSQU1FX1RZUEUpIHsKICAgICAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9OVU1fUkVGX0lEWF9BQ1RJVkUpOyAvLyBJbnNlcnQgdG9rZW4gdG8gdGVsbCBNVFggdG8gaW5zZXJ0IG92ZXJyaWRlIGZvciBudW1iZXIgb2YgYWN0aXZlIHJlZmVyZW5jZXMKICAgIH0gZWxzZSBpZiAocFNsSFBhcmFtcy0+U2xpY2VGcmFtZV9UeXBlID09IFNMSFBfQl9TTElDRUZSQU1FX1RZUEUpIHsKICAgICAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9SQVdEQVRBKTsKICAgICAgICB0bmdfX3dyaXRlX3VwdG84Yml0c19lbGVtZW50cyhwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDAsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbnVtX3JlZl9pZHhfYWN0aXZlX292ZXJyaWRlX2ZsYWcgKDEgYml0KSA9IDAKICAgIH0KCiAgICBpZiAocFNsSFBhcmFtcy0+U2xpY2VGcmFtZV9UeXBlICE9IFNMSFBfSV9TTElDRUZSQU1FX1RZUEUgJiYKICAgICAgICBwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUgIT0gU0xIUF9JRFJfU0xJQ0VGUkFNRV9UWVBFKSB7CiAgICAgICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfUkVPUkRFUl9MMCk7IC8vIEluc2VydCB0b2tlbiB0byB0ZWxsIE1UWCB0byBpbnNlcnQgcmVmZXJlbmNlIGxpc3QgMCByZW9yZGVyaW5nCiAgICAgICAgaWYgKHBTbEhQYXJhbXMtPlNsaWNlRnJhbWVfVHlwZSA9PSBTTEhQX0JfU0xJQ0VGUkFNRV9UWVBFKQogICAgICAgICAgICB0bmdfX2luc2VydF9lbGVtZW50X3Rva2VuKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgRUxFTUVOVF9SRU9SREVSX0wxKTsgLy8gSW5zZXJ0IHRva2VuIHRvIHRlbGwgTVRYIHRvIGluc2VydCByZWZlcmVuY2UgbGlzdCAxIHJlb3JkZXJpbmcKICAgIH0KCgogICAgLy8gV0VJR0hURUQgUFJFRElDVElPTgogICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfU0xJQ0VXRUlHSFRFRFBSRURJQ1RJT05TVFJVQ1QpOwogICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfUkFXREFUQSk7CgogICAgaWYgKHBTbEhQYXJhbXMtPmJSZWZlcmVuY2VQaWN0dXJlICYmIHBTbEhQYXJhbXMtPmJJc0xvbmdUZXJtUmVmKSB7CiAgICAgICAgdG5nX193cml0ZV91cHRvOGJpdHNfZWxlbWVudHMocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAxLCAxKTsgLy8gYWRhcHRpdmVfcmVmX3BpY19tYXJraW5nX21vZGVfZmxhZyAoMSBiaXQpID0gMAoKICAgICAgICAvLyBDbGVhciBhbnkgZXhpc3RpbmcgbG9uZy10ZXJtIHJlZmVyZW5jZQogICAgICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCA1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbgoKICAgICAgICAvLyBBbGxvdyBhIHNpbmdsZSBsb25nLXRlcm0gcmVmZXJlbmNlCiAgICAgICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uCiAgICAgICAgdG5nX19nZW5lcmF0ZV91ZShwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heF9sb25nX3Rlcm1fZnJhbWVfaWR4X3BsdXMxCgogICAgICAgIC8vIFNldCBjdXJyZW50IHBpY3R1cmUgYXMgdGhlIGxvbmctdGVybSByZWZlcmVuY2UKICAgICAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24KICAgICAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9uZ190ZXJtX2ZyYW1lX2lkeAoKICAgICAgICAvLyBFbmQKICAgICAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24KICAgIH0gZWxzZSB7CiAgICAgICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfQURBUFRJVkUpOyAvL01UWCBmaWxscyB0aGlzIHZhbHVlIGluCiAgICAgICAgdG5nX19pbnNlcnRfZWxlbWVudF90b2tlbihwTVRYX0hlYWRlciwgYXVpMzJFbGVtZW50UG9pbnRlcnMsIEVMRU1FTlRfUkFXREFUQSk7CiAgICB9CgogICAgaWYgKGJDYWJhY0VuYWJsZWQgJiYgKChTTEhQX1BfU0xJQ0VGUkFNRV9UWVBFID09IHBTbEhQYXJhbXMtPlNsaWNlRnJhbWVfVHlwZSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAoU0xIUF9CX1NMSUNFRlJBTUVfVFlQRSA9PSBwU2xIUGFyYW1zLT5TbGljZUZyYW1lX1R5cGUpKSkgewogICAgICAgIHRuZ19fZ2VuZXJhdGVfdWUocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCAwKTsgLy8gaGFyZCBjb2RlIGNhYmFjX2luaXRfaWRjIHZhbHVlIG9mIDAKICAgIH0KICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX1NRUCk7IC8vTVRYIGZpbGxzIHRoaXMgdmFsdWUgaW4KICAgIHRuZ19faW5zZXJ0X2VsZW1lbnRfdG9rZW4ocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBFTEVNRU5UX1JBV0RBVEEpOwoKICAgIC8vLyoqKiogR0VORVJBVEVTIEVMRU1FTlQgT0YgVEhFIEgyNjRfU0xJQ0VfSEVBREVSKCkgU1RSVUNUVVJFICoqKiovLy8KICAgIC8vLyoqKiogRUxFTUVOVCBCSVRDT1VOVDogMTEKICAgIC8vIE5leHQgZmllbGQgaXMgZ2VuZXJhdGVkIG9uIE1UWCB3aXRoIGEgc3BlY2lhbCBjb21tbmFkIChub3QgRUxFTUVOVF9SQVcpIC0gc28gbm90IGRlZmluZWQgaGVyZQogICAgLy9wdWNIUz10bmdfX2dlbmVyYXRlX3NlKHB1Y0hTLCBwdWlCaXRQb3MsIHBTbEhQYXJhbXMtPlNsaWNlX1FQX0RlbHRhKTsgLy9zbGljZV9xcF9kZWx0YSBzZSh2KSA9IFNsaWNlUVB5IC0gKHBpY19pbml0X3FwX21pbnVzMjYrMjYpCiAgICB0bmdfX2dlbmVyYXRlX3VlKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgcFNsSFBhcmFtcy0+RGlzYWJsZV9EZWJsb2NraW5nX0ZpbHRlcl9JZGMpOyAvL2Rpc2FibGVfZGVibG9ja2luZ19maWx0ZXJfaWRjIHVlKHYpID0gMj8KCiAgICBpZiAocFNsSFBhcmFtcy0+RGlzYWJsZV9EZWJsb2NraW5nX0ZpbHRlcl9JZGMgIT0gMSkgewogICAgICAgIHRuZ19fZ2VuZXJhdGVfc2UocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwU2xIUGFyYW1zLT5pRGViQWxwaGFPZmZzZXREaXYyKTsgLy9zbGljZV9hbHBoYV9jMF9vZmZzZXRfZGl2MiBzZSh2KSA9IDAgKDFiKSBpbiBUb3BhegogICAgICAgIHRuZ19fZ2VuZXJhdGVfc2UocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzLCBwU2xIUGFyYW1zLT5pRGViQmV0YU9mZnNldERpdjIpOyAvL3NsaWNlX2JldGFfb2Zmc2V0X2RpdjIgc2UodikgPSAwICgxYikgaW4gVG9wYXoKICAgIH0KICAgIC8vbnVtX3NsaWNlX2dyb3Vwc19taW51czEgPT0wIGluIFRvcGF6LCBzbyBubyBzbGljZV9ncm91cF9jaGFuZ2VfY3ljbGUgZmllbGQgaGVyZQogICAgLy8gbm8gYnl0ZSBhbGlnbm1lbnQgYXQgZW5kIG9mIHNsaWNlIGhlYWRlcnMKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQEZ1bmN0aW9uICAgICAgICAgICAgICBIMjY0X05PVEZPUlNJTVNfUHJlcGFyZVNsaWNlSGVhZGVyCiBAZGV0YWlscwogU2ltIGd1eXMsIERPIE5PVCBFVkVSIFVTRSBUSElTIEZVTkNUSU9OIQogUHJlcGFyZSBhbiBIMjY0IHNsaWNlIGhlYWRlciBpbiBhIGZvcm0gZm9yIHRoZSBNVFggdG8gZW5jb2RlIGludG8gYQogYml0c3RyZWFtLgogQHBhcmFtICAgIHBNVFhfSGVhZGVyICAgICAgICA6IHBvaW50ZXIgdG8gaGVhZGVyIHN0cnVjdHVyZSB0byBwb3B1bGF0ZQogQHBhcmFtICAgIGJJbnRyYVNsaWNlICAgICAgICA6IElNR19UUlVFIGlmIHRoaXMgaXMgYW4gSURSIG9yIEkgc2xpY2UKIEBwYXJhbSAgICBiSW50ZXJCU2xpY2UgICAgICAgIDogSU1HX1RSVUUgaWYgdGhpcyBpcyBhIEIgRnJhbWUgc2xpY2UKIEBwYXJhbSAgICB1aThEaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklEQyA6IHN5bnRheCBlbGVtZW50CiBAcGFyYW0gICAgdWkzMkZyYW1lTnVtSWQgICAgICA6IHN5bnRheCBlbGVtZW50ICh1c2VkIGZvciByZWZlcmVuY2VzKQogQHBhcmFtICAgIHVpRmlyc3RfTUJfQWRkcmVzcyA6IGZpcnN0X21iX2luX3NsaWNlIHN5bnRheCBlbGVtZW50CiBAcGFyYW0gICAgdWlNQlNraXBSdW4gICAgICAgIDogbnVtYmVyIG9mIE1CcyB0byBza2lwCiBAcGFyYW0gICAgYkNhYmFjRW5hYmxlZCAgICAgIDogSU1HX1RSVUUgdG8gdXNlIENBQkFDCiBAcGFyYW0gICAgYklzSW50ZXJsYWNlZCAgICAgIDogSU1HX1RSVUUgZm9yIGludGVybGFjZWQgc2xpY2VzCiBAcGFyYW0gICAgYklzSURSICAgICAgICAgICAgIDogSU1HX1RSVUUgaWYgdGhpcyBpcyBhbiBJRFIgc2xpY2UKIEBwYXJhbSAgICBiSXNMb25nVGVybVJlZiAgICAgOiBJTUdfVFJVRSBpZiB0aGUgZnJhbWUgaXMgdG8gYmUgdXNlZCBhcyBhIGxvbmctdGVybSByZWZlcmVuY2UKIEByZXR1cm4gICBOb25lCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnZvaWQgdG5nX19IMjY0RVNfbm90Zm9yc2ltc19wcmVwYXJlX3NsaWNlaGVhZGVyKAogICAgSU1HX1VJTlQ4ICAgICAgKnNsaWNlX21lbV9wLAogICAgSU1HX1VJTlQzMiAgICAgIHVpMzJTbGljZVR5cGUsCiAgICBJTUdfVUlOVDggICAgICAgdWk4RGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJREMsCiAgICBJTUdfVUlOVDMyICAgICAgdWlGaXJzdF9NQl9BZGRyZXNzLAogICAgSU1HX1VJTlQzMiAgICAgIF9fbWF5YmVfdW51c2VkIHVpTUJTa2lwUnVuLAogICAgSU1HX0JPT0wgICAgICAgIGJDYWJhY0VuYWJsZWQsCiAgICBJTUdfQk9PTCAgICAgICAgYklzSW50ZXJsYWNlZCwKICAgIElNR19VSU5UMTYgICAgICB1aTE2TXZjVmlld0lkeCwKICAgIElNR19CT09MICAgICAgICBiSXNMb25nVGVybVJlZgopCnsKICAgIFNMSUNFX1BBUkFNUyAqc2xpY2VfdGVtcF9wID0gKFNMSUNFX1BBUkFNUyopc2xpY2VfbWVtX3A7CiAgICBNVFhfSEVBREVSX1BBUkFNUyAqcE1UWF9IZWFkZXIgPSAoTVRYX0hFQURFUl9QQVJBTVMgKikgJihzbGljZV90ZW1wX3AtPnNTbGljZUhkclRtcGwpOwogICAgSDI2NF9TTElDRV9IRUFERVJfUEFSQU1TIFNsSFBhcmFtczsKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqVGhpc19FbGVtZW50OwogICAgTVRYX0hFQURFUl9FTEVNRU5UICphdWkzMkVsZW1lbnRQb2ludGVyc1tNQVhOVU1CRVJFTEVNRU5UU107CiAgICBJTUdfRlJBTUVfVEVNUExBVEVfVFlQRSBlU2xpY2VUeXBlID0gKElNR19GUkFNRV9URU1QTEFURV9UWVBFKXVpMzJTbGljZVR5cGU7CiAgICBJTUdfQk9PTCBiSW50cmFTbGljZSA9ICgoZVNsaWNlVHlwZSA9PSBJTUdfRlJBTUVfSURSKSB8fCAoZVNsaWNlVHlwZSA9PSBJTUdfRlJBTUVfSU5UUkEpKTsKICAgIElNR19CT09MIGJJbnRlckJTbGljZSA9IChlU2xpY2VUeXBlID09IElNR19GUkFNRV9JTlRFUl9CKTsKICAgIElNR19CT09MIGJJc0lEUiA9ICgoZVNsaWNlVHlwZSA9PSBJTUdfRlJBTUVfSURSKSB8fCAoZVNsaWNlVHlwZSA9PSBJTUdfRlJBTUVfSU5URVJfUF9JRFIpKTsKCiAgICBtZW1zZXQoJlNsSFBhcmFtcywgMCwgc2l6ZW9mKEgyNjRfU0xJQ0VfSEVBREVSX1BBUkFNUykpOwoKICAgIFNsSFBhcmFtcy51aThTdGFydF9Db2RlX1ByZWZpeF9TaXplX0J5dGVzID0gNDsKICAgIC8qIHBjYiAtICBJIHRoaW5rIHRoYXQgdGhpcyBpcyBtb3JlIGNvcnJlY3Qgbm93ICAtLSBUaGlzIHNob3VsZCBhbHNvIHdvcmsgZm9yIElEUi1QIGZyYW1lcyB3aGljaCB3aWxsIGJlIG1hcmtlZCBhcyBTTEhQX1BfU0xJQ0VGUkFNRV9UWVBFICovCiAgICBTbEhQYXJhbXMuU2xpY2VGcmFtZV9UeXBlID0gYkludHJhU2xpY2UgPyAoYklzSURSID8gU0xIUF9JRFJfU0xJQ0VGUkFNRV9UWVBFIDogU0xIUF9JX1NMSUNFRlJBTUVfVFlQRSkgOiAoYkludGVyQlNsaWNlID8gU0xIUF9CX1NMSUNFRlJBTUVfVFlQRSA6IFNMSFBfUF9TTElDRUZSQU1FX1RZUEUpOwoKICAgIFNsSFBhcmFtcy5GaXJzdF9NQl9BZGRyZXNzID0gdWlGaXJzdF9NQl9BZGRyZXNzOwogICAgU2xIUGFyYW1zLkRpc2FibGVfRGVibG9ja2luZ19GaWx0ZXJfSWRjID0gKElNR19VSU5UOCkgdWk4RGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJREM7CiAgICBTbEhQYXJhbXMuYlBpQ0ludGVybGFjZSA9IGJJc0ludGVybGFjZWQ7CiAgICBTbEhQYXJhbXMuaURlYkFscGhhT2Zmc2V0RGl2MiA9IDA7CiAgICBTbEhQYXJhbXMuaURlYkJldGFPZmZzZXREaXYyICA9IDA7CiAgICAvLyBzZXR1cCB0aGUgbmV3IGZsYWdzIHVzZWQgZm9yIEIgZnJhbWUgYXMgcmVmZXJlbmNlCiAgICBTbEhQYXJhbXMuYlJlZmVyZW5jZVBpY3R1cmUgPSBiSW50ZXJCU2xpY2UgPyAwIDogMTsKICAgIFNsSFBhcmFtcy51aTE2TXZjVmlld0lkeCA9IHVpMTZNdmNWaWV3SWR4OwogICAgU2xIUGFyYW1zLmJJc0xvbmdUZXJtUmVmID0gYklzTG9uZ1Rlcm1SZWY7CiAgICBTbEhQYXJhbXMubG9nMl9tYXhfcGljX29yZGVyX2NudCA9IDI7CiAgICBTbEhQYXJhbXMudUxvbmdUZXJtUmVmTnVtID0gMDsKICAgIFNsSFBhcmFtcy5iUmVmSXNMb25nVGVybVJlZlswXSA9IDA7CiAgICBTbEhQYXJhbXMudVJlZkxvbmdUZXJtUmVmTnVtWzBdID0gMDsKICAgIFNsSFBhcmFtcy5iUmVmSXNMb25nVGVybVJlZlsxXSA9IDA7CiAgICBTbEhQYXJhbXMudVJlZkxvbmdUZXJtUmVmTnVtWzFdID0gMDsKICAgIC8vIEJ1aWxkcyBhIHNpbmdsZSBzbGljZSBoZWFkZXIgZnJvbSB0aGUgZ2l2ZW4gcGFyYW1ldGVycyAobWlkIGZyYW1lKQogICAgLy8gRXNzZW50aWFsIHdlIGluaXRpYWxpc2Ugb3VyIGhlYWRlciBzdHJ1Y3R1cmVzIGJlZm9yZSBidWlsZGluZwovLyAgICBtZW1zZXQocE1UWF9IZWFkZXIsIDAsIDEyOCk7CiAgICBwTVRYX0hlYWRlci0+dWkzMkVsZW1lbnRzID0gRUxFTUVOVFNfRU1QVFk7CiAgICBUaGlzX0VsZW1lbnQgPSAoTVRYX0hFQURFUl9FTEVNRU5UICopIHBNVFhfSGVhZGVyLT5hc0VsZW1lbnRTdHJlYW07CiAgICBhdWkzMkVsZW1lbnRQb2ludGVyc1swXSA9IFRoaXNfRWxlbWVudDsKI2lmZGVmIF9UT1BBWkhQX1BEVU1QXwogICAgdG5nX3RyYWNlX3NsaWNlX2hlYWRlcl9wYXJhbXMoJlNsSFBhcmFtcyk7CiNlbmRpZgogICAgdG5nX19IMjY0RVNfbm90Zm9yc2ltc193cml0ZWJpdHNfc2xpY2VfaGVhZGVyKHBNVFhfSGVhZGVyLCBhdWkzMkVsZW1lbnRQb2ludGVycywgJlNsSFBhcmFtcywgYkNhYmFjRW5hYmxlZCwgYklzSURSKTsKICAgIHBNVFhfSGVhZGVyLT51aTMyRWxlbWVudHMrKzsgLy9IYXMgYmVlbiB1c2VkIGFzIGFuIGluZGV4LCBzbyBuZWVkIHRvIGFkZCAxIGZvciBhIHZhbGlkIGVsZW1lbnQgY291bnQKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogRnVuY3Rpb246ICAgICAgICAgICAgIEgyNjNfTk9URk9SU0lNU19QcmVwYXJlR09CU2xpY2VIZWFkZXIKKiBEZXNjcmlwdGlvbjogIEdlbmVyYXRlcyB0aGUgc2xpY2UgcGFyYW1zIHRlbXBsYXRlCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdm9pZCB0bmdfX0gyNjNFU19ub3Rmb3JzaW1zX3ByZXBhcmVfZ29ic2xpY2VoZWFkZXIoCiAgICBJTUdfVUlOVDggICAgICAgKnNsaWNlX21lbV9wKQp7CiAgICAvLyBFc3NlbnRpYWwgd2UgaW5pdGlhbGlzZSBvdXIgaGVhZGVyIHN0cnVjdHVyZXMgYmVmb3JlIGJ1aWxkaW5nCiAgICBTTElDRV9QQVJBTVMgKnNsaWNlX3RlbXBfcCA9IChTTElDRV9QQVJBTVMqKXNsaWNlX21lbV9wOwogICAgTVRYX0hFQURFUl9QQVJBTVMgKiAgICAgcE1UWF9IZWFkZXIgPSAoTVRYX0hFQURFUl9QQVJBTVMgKikgJiAoc2xpY2VfdGVtcF9wLT5zU2xpY2VIZHJUbXBsKTsKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqVGhpc19FbGVtZW50OwogICAgTVRYX0hFQURFUl9FTEVNRU5UICphdWkzMkVsZW1lbnRQb2ludGVyc1tNQVhOVU1CRVJFTEVNRU5UU107CiAgICBwTVRYX0hlYWRlci0+dWkzMkVsZW1lbnRzID0gRUxFTUVOVFNfRU1QVFk7CiAgICBUaGlzX0VsZW1lbnQgPSAoTVRYX0hFQURFUl9FTEVNRU5UICopIHBNVFhfSGVhZGVyLT5hc0VsZW1lbnRTdHJlYW07CiAgICBhdWkzMkVsZW1lbnRQb2ludGVyc1swXSA9IFRoaXNfRWxlbWVudDsKICAgIEgyNjNfTk9URk9SU0lNU19Xcml0ZUJpdHNfR09CU2xpY2VIZWFkZXIocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzKTsKICAgIHBNVFhfSGVhZGVyLT51aTMyRWxlbWVudHMrKzsgLy9IYXMgYmVlbiB1c2VkIGFzIGFuIGluZGV4LCBzbyBuZWVkIHRvIGFkZCAxIGZvciBhIHZhbGlkIGVsZW1lbnQgY291bnQKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogRnVuY3Rpb246ICAgICAgICAgICAgIE1QRUcyX1ByZXBhcmVTbGljZUhlYWRlcgoqIERlc2NyaXB0aW9uOiAgR2VuZXJhdGVzIHRoZSBzbGljZSBwYXJhbXMgdGVtcGxhdGUKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgdG5nX19NUEVHMl9wcmVwYXJlX3NsaWNlaGVhZGVyKAogICAgSU1HX1VJTlQ4ICAgICAgICAgICAgICAgKnNsaWNlX21lbV9wKQp7CiAgICAvLyBFc3NlbnRpYWwgd2UgaW5pdGlhbGlzZSBvdXIgaGVhZGVyIHN0cnVjdHVyZXMgYmVmb3JlIGJ1aWxkaW5nCiAgICBTTElDRV9QQVJBTVMgKnNsaWNlX3RlbXBfcCA9IChTTElDRV9QQVJBTVMqKXNsaWNlX21lbV9wOwogICAgTVRYX0hFQURFUl9QQVJBTVMgKiAgICAgcE1UWF9IZWFkZXIgPSAoTVRYX0hFQURFUl9QQVJBTVMgKikgJiAoc2xpY2VfdGVtcF9wLT5zU2xpY2VIZHJUbXBsKTsKICAgIE1UWF9IRUFERVJfRUxFTUVOVCAqVGhpc19FbGVtZW50OwogICAgTVRYX0hFQURFUl9FTEVNRU5UICphdWkzMkVsZW1lbnRQb2ludGVyc1tNQVhOVU1CRVJFTEVNRU5UU107CiAgICBwTVRYX0hlYWRlci0+dWkzMkVsZW1lbnRzID0gRUxFTUVOVFNfRU1QVFk7CiAgICBUaGlzX0VsZW1lbnQgPSAoTVRYX0hFQURFUl9FTEVNRU5UICopIHBNVFhfSGVhZGVyLT5hc0VsZW1lbnRTdHJlYW07CiAgICBhdWkzMkVsZW1lbnRQb2ludGVyc1swXSA9IFRoaXNfRWxlbWVudDsKLy8gICAgICBNUEVHMl9Xcml0ZUJpdHNfU2xpY2VIZWFkZXIocE1UWF9IZWFkZXIsIGF1aTMyRWxlbWVudFBvaW50ZXJzKTsKICAgIHBNVFhfSGVhZGVyLT51aTMyRWxlbWVudHMrKzsgLy9IYXMgYmVlbiB1c2VkIGFzIGFuIGluZGV4LCBzbyBuZWVkIHRvIGFkZCAxIGZvciBhIHZhbGlkIGVsZW1lbnQgY291bnQKfQoKCg==