ZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvS2NvbmZpZyBiL25ldC9ibHVldG9vdGgvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTI5NDkwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9LY29uZmlnCkBAIC0wLDAgKzEsNjMgQEAKKyMKKyMgQmx1ZXRvb3RoIHN1YnN5c3RlbSBjb25maWd1cmF0aW9uCisjCisKK21lbnVjb25maWcgQlQKKwlkZXBlbmRzIG9uIE5FVAorCXRyaXN0YXRlICJCbHVldG9vdGggc3Vic3lzdGVtIHN1cHBvcnQiCisJaGVscAorCSAgQmx1ZXRvb3RoIGlzIGxvdy1jb3N0LCBsb3ctcG93ZXIsIHNob3J0LXJhbmdlIHdpcmVsZXNzIHRlY2hub2xvZ3kuCisJICBJdCB3YXMgZGVzaWduZWQgYXMgYSByZXBsYWNlbWVudCBmb3IgY2FibGVzIGFuZCBvdGhlciBzaG9ydC1yYW5nZQorCSAgdGVjaG5vbG9naWVzIGxpa2UgSXJEQS4gIEJsdWV0b290aCBvcGVyYXRlcyBpbiBwZXJzb25hbCBhcmVhIHJhbmdlCisJICB0aGF0IHR5cGljYWxseSBleHRlbmRzIHVwIHRvIDEwIG1ldGVycy4gIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQKKwkgIEJsdWV0b290aCBjYW4gYmUgZm91bmQgYXQgPGh0dHA6Ly93d3cuYmx1ZXRvb3RoLmNvbS8+LgorCisJICBMaW51eCBCbHVldG9vdGggc3Vic3lzdGVtIGNvbnNpc3Qgb2Ygc2V2ZXJhbCBsYXllcnM6CisJICAgICBCbHVldG9vdGggQ29yZSAoSENJIGRldmljZSBhbmQgY29ubmVjdGlvbiBtYW5hZ2VyLCBzY2hlZHVsZXIpCisJICAgICBIQ0kgRGV2aWNlIGRyaXZlcnMgKEludGVyZmFjZSB0byB0aGUgaGFyZHdhcmUpCisJICAgICBTQ08gTW9kdWxlIChTQ08gYXVkaW8gbGlua3MpCisJICAgICBMMkNBUCBNb2R1bGUgKExvZ2ljYWwgTGluayBDb250cm9sIGFuZCBBZGFwdGF0aW9uIFByb3RvY29sKQorCSAgICAgUkZDT01NIE1vZHVsZSAoUkZDT01NIFByb3RvY29sKSAgCisJICAgICBCTkVQIE1vZHVsZSAoQmx1ZXRvb3RoIE5ldHdvcmsgRW5jYXBzdWxhdGlvbiBQcm90b2NvbCkKKwkgICAgIENNVFAgTW9kdWxlIChDQVBJIE1lc3NhZ2UgVHJhbnNwb3J0IFByb3RvY29sKQorCSAgICAgSElEUCBNb2R1bGUgKEh1bWFuIEludGVyZmFjZSBEZXZpY2UgUHJvdG9jb2wpCisKKwkgIFNheSBZIGhlcmUgdG8gY29tcGlsZSBCbHVldG9vdGggc3VwcG9ydCBpbnRvIHRoZSBrZXJuZWwgb3Igc2F5IE0gdG8KKwkgIGNvbXBpbGUgaXQgYXMgbW9kdWxlIChibHVldG9vdGgpLgorCisJICBUbyB1c2UgTGludXggQmx1ZXRvb3RoIHN1YnN5c3RlbSwgeW91IHdpbGwgbmVlZCBzZXZlcmFsIHVzZXItc3BhY2UKKwkgIHV0aWxpdGllcyBsaWtlIGhjaWNvbmZpZyBhbmQgaGNpZC4gIFRoZXNlIHV0aWxpdGllcyBhbmQgdXBkYXRlcyB0bworCSAgQmx1ZXRvb3RoIGtlcm5lbCBtb2R1bGVzIGFyZSBwcm92aWRlZCBpbiB0aGUgQmx1ZVogcGFja2FnZXMuCisJICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxodHRwOi8vd3d3LmJsdWV6Lm9yZy8+LgorCitjb25maWcgQlRfTDJDQVAKKwl0cmlzdGF0ZSAiTDJDQVAgcHJvdG9jb2wgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJUCisJaGVscAorCSAgTDJDQVAgKExvZ2ljYWwgTGluayBDb250cm9sIGFuZCBBZGFwdGF0aW9uIFByb3RvY29sKSBwcm92aWRlcworCSAgY29ubmVjdGlvbiBvcmllbnRlZCBhbmQgY29ubmVjdGlvbi1sZXNzIGRhdGEgdHJhbnNwb3J0LiAgTDJDQVAKKwkgIHN1cHBvcnQgaXMgcmVxdWlyZWQgZm9yIG1vc3QgQmx1ZXRvb3RoIGFwcGxpY2F0aW9ucy4KKworCSAgU2F5IFkgaGVyZSB0byBjb21waWxlIEwyQ0FQIHN1cHBvcnQgaW50byB0aGUga2VybmVsIG9yIHNheSBNIHRvCisJICBjb21waWxlIGl0IGFzIG1vZHVsZSAobDJjYXApLgorCitjb25maWcgQlRfU0NPCisJdHJpc3RhdGUgIlNDTyBsaW5rcyBzdXBwb3J0IgorCWRlcGVuZHMgb24gQlQKKwloZWxwCisJICBTQ08gbGluayBwcm92aWRlcyB2b2ljZSB0cmFuc3BvcnQgb3ZlciBCbHVldG9vdGguICBTQ08gc3VwcG9ydCBpcworCSAgcmVxdWlyZWQgZm9yIHZvaWNlIGFwcGxpY2F0aW9ucyBsaWtlIEhlYWRzZXQgYW5kIEF1ZGlvLgorCisJICBTYXkgWSBoZXJlIHRvIGNvbXBpbGUgU0NPIHN1cHBvcnQgaW50byB0aGUga2VybmVsIG9yIHNheSBNIHRvCisJICBjb21waWxlIGl0IGFzIG1vZHVsZSAoc2NvKS4KKworc291cmNlICJuZXQvYmx1ZXRvb3RoL3JmY29tbS9LY29uZmlnIgorCitzb3VyY2UgIm5ldC9ibHVldG9vdGgvYm5lcC9LY29uZmlnIgorCitzb3VyY2UgIm5ldC9ibHVldG9vdGgvY210cC9LY29uZmlnIgorCitzb3VyY2UgIm5ldC9ibHVldG9vdGgvaGlkcC9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvYmx1ZXRvb3RoL0tjb25maWciCisKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvTWFrZWZpbGUgYi9uZXQvYmx1ZXRvb3RoL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZTQzM2YKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYmx1ZXRvb3RoL01ha2VmaWxlCkBAIC0wLDAgKzEsMTMgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBCbHVldG9vdGggc3Vic3lzdGVtLgorIworCitvYmotJChDT05GSUdfQlQpCSs9IGJsdWV0b290aC5vCitvYmotJChDT05GSUdfQlRfTDJDQVApCSs9IGwyY2FwLm8KK29iai0kKENPTkZJR19CVF9TQ08pCSs9IHNjby5vCitvYmotJChDT05GSUdfQlRfUkZDT01NKQkrPSByZmNvbW0vCitvYmotJChDT05GSUdfQlRfQk5FUCkJKz0gYm5lcC8KK29iai0kKENPTkZJR19CVF9DTVRQKQkrPSBjbXRwLworb2JqLSQoQ09ORklHX0JUX0hJRFApCSs9IGhpZHAvCisKK2JsdWV0b290aC1vYmpzIDo9IGFmX2JsdWV0b290aC5vIGhjaV9jb3JlLm8gaGNpX2Nvbm4ubyBoY2lfZXZlbnQubyBoY2lfc29jay5vIGhjaV9zeXNmcy5vIGxpYi5vCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jIGIvbmV0L2JsdWV0b290aC9hZl9ibHVldG9vdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjUwYzZiCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9hZl9ibHVldG9vdGguYwpAQCAtMCwwICsxLDM1NSBAQAorLyogCisgICBCbHVlWiAtIEJsdWV0b290aCBwcm90b2NvbCBzdGFjayBmb3IgTGludXgKKyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAxIFF1YWxjb21tIEluY29ycG9yYXRlZAorCisgICBXcml0dGVuIDIwMDAsMjAwMSBieSBNYXhpbSBLcmFzbnlhbnNreSA8bWF4a0BxdWFsY29tbS5jb20+CisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQgT0YgVEhJUkQgUEFSVFkgUklHSFRTLgorICAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIoUykgQU5EIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWQorICAgQ0xBSU0sIE9SIEFOWSBTUEVDSUFMIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgT1IgQU5ZIERBTUFHRVMgCisgICBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gCisgICBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiAKKyAgIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKyAgIEFMTCBMSUFCSUxJVFksIElOQ0xVRElORyBMSUFCSUxJVFkgRk9SIElORlJJTkdFTUVOVCBPRiBBTlkgUEFURU5UUywgCisgICBDT1BZUklHSFRTLCBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUywgUkVMQVRJTkcgVE8gVVNFIE9GIFRISVMgCisgICBTT0ZUV0FSRSBJUyBESVNDTEFJTUVELgorKi8KKworLyogQmx1ZXRvb3RoIGFkZHJlc3MgZmFtaWx5IGFuZCBzb2NrZXRzLiAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworI2lmIGRlZmluZWQoQ09ORklHX0tNT0QpCisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgorCisjaWZuZGVmIENPTkZJR19CVF9TT0NLX0RFQlVHCisjdW5kZWYgIEJUX0RCRworI2RlZmluZSBCVF9EQkcoRC4uLikKKyNlbmRpZgorCisjZGVmaW5lIFZFUlNJT04gIjIuNyIKKworc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2J0OworRVhQT1JUX1NZTUJPTChwcm9jX2J0KTsKKworLyogQmx1ZXRvb3RoIHNvY2tldHMgKi8KKyNkZWZpbmUgQlRfTUFYX1BST1RPCTgKK3N0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSAqYnRfcHJvdG9bQlRfTUFYX1BST1RPXTsKKworaW50IGJ0X3NvY2tfcmVnaXN0ZXIoaW50IHByb3RvLCBzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSAqb3BzKQoreworCWlmIChwcm90byA8IDAgfHwgcHJvdG8gPj0gQlRfTUFYX1BST1RPKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChidF9wcm90b1twcm90b10pCisJCXJldHVybiAtRUVYSVNUOworCisJYnRfcHJvdG9bcHJvdG9dID0gb3BzOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChidF9zb2NrX3JlZ2lzdGVyKTsKKworaW50IGJ0X3NvY2tfdW5yZWdpc3RlcihpbnQgcHJvdG8pCit7CisJaWYgKHByb3RvIDwgMCB8fCBwcm90byA+PSBCVF9NQVhfUFJPVE8pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFidF9wcm90b1twcm90b10pCisJCXJldHVybiAtRU5PRU5UOworCisJYnRfcHJvdG9bcHJvdG9dID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYnRfc29ja191bnJlZ2lzdGVyKTsKKworc3RhdGljIGludCBidF9zb2NrX2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgcHJvdG8pCit7CisJaW50IGVyciA9IDA7CisKKwlpZiAocHJvdG8gPCAwIHx8IHByb3RvID49IEJUX01BWF9QUk9UTykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKyNpZiBkZWZpbmVkKENPTkZJR19LTU9EKQorCWlmICghYnRfcHJvdG9bcHJvdG9dKSB7CisJCXJlcXVlc3RfbW9kdWxlKCJidC1wcm90by0lZCIsIHByb3RvKTsKKwl9CisjZW5kaWYKKwllcnIgPSAtRVBST1RPTk9TVVBQT1JUOworCWlmIChidF9wcm90b1twcm90b10gJiYgdHJ5X21vZHVsZV9nZXQoYnRfcHJvdG9bcHJvdG9dLT5vd25lcikpIHsKKwkJZXJyID0gYnRfcHJvdG9bcHJvdG9dLT5jcmVhdGUoc29jaywgcHJvdG8pOworCQltb2R1bGVfcHV0KGJ0X3Byb3RvW3Byb3RvXS0+b3duZXIpOworCX0KKwlyZXR1cm4gZXJyOyAKK30KKwordm9pZCBidF9zb2NrX2xpbmsoc3RydWN0IGJ0X3NvY2tfbGlzdCAqbCwgc3RydWN0IHNvY2sgKnNrKQoreworCXdyaXRlX2xvY2tfYmgoJmwtPmxvY2spOworCXNrX2FkZF9ub2RlKHNrLCAmbC0+aGVhZCk7CisJd3JpdGVfdW5sb2NrX2JoKCZsLT5sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0woYnRfc29ja19saW5rKTsKKwordm9pZCBidF9zb2NrX3VubGluayhzdHJ1Y3QgYnRfc29ja19saXN0ICpsLCBzdHJ1Y3Qgc29jayAqc2spCit7CisJd3JpdGVfbG9ja19iaCgmbC0+bG9jayk7CisJc2tfZGVsX25vZGVfaW5pdChzayk7CisJd3JpdGVfdW5sb2NrX2JoKCZsLT5sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0woYnRfc29ja191bmxpbmspOworCit2b2lkIGJ0X2FjY2VwdF9lbnF1ZXVlKHN0cnVjdCBzb2NrICpwYXJlbnQsIHN0cnVjdCBzb2NrICpzaykKK3sKKwlCVF9EQkcoInBhcmVudCAlcCwgc2sgJXAiLCBwYXJlbnQsIHNrKTsKKworCXNvY2tfaG9sZChzayk7CisJbGlzdF9hZGRfdGFpbCgmYnRfc2soc2spLT5hY2NlcHRfcSwgJmJ0X3NrKHBhcmVudCktPmFjY2VwdF9xKTsKKwlidF9zayhzayktPnBhcmVudCA9IHBhcmVudDsKKwlwYXJlbnQtPnNrX2Fja19iYWNrbG9nKys7Cit9CitFWFBPUlRfU1lNQk9MKGJ0X2FjY2VwdF9lbnF1ZXVlKTsKKwordm9pZCBidF9hY2NlcHRfdW5saW5rKHN0cnVjdCBzb2NrICpzaykKK3sKKwlCVF9EQkcoInNrICVwIHN0YXRlICVkIiwgc2ssIHNrLT5za19zdGF0ZSk7CisKKwlsaXN0X2RlbF9pbml0KCZidF9zayhzayktPmFjY2VwdF9xKTsKKwlidF9zayhzayktPnBhcmVudC0+c2tfYWNrX2JhY2tsb2ctLTsKKwlidF9zayhzayktPnBhcmVudCA9IE5VTEw7CisJc29ja19wdXQoc2spOworfQorRVhQT1JUX1NZTUJPTChidF9hY2NlcHRfdW5saW5rKTsKKworc3RydWN0IHNvY2sgKmJ0X2FjY2VwdF9kZXF1ZXVlKHN0cnVjdCBzb2NrICpwYXJlbnQsIHN0cnVjdCBzb2NrZXQgKm5ld3NvY2spCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwgKm47CisJc3RydWN0IHNvY2sgKnNrOworCisJQlRfREJHKCJwYXJlbnQgJXAiLCBwYXJlbnQpOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZidF9zayhwYXJlbnQpLT5hY2NlcHRfcSkgeworCQlzayA9IChzdHJ1Y3Qgc29jayAqKSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBidF9zb2NrLCBhY2NlcHRfcSk7CisKKwkJbG9ja19zb2NrKHNrKTsKKworCQkvKiBGSVhNRTogSXMgdGhpcyBjaGVjayBzdGlsbCBuZWVkZWQgKi8KKwkJaWYgKHNrLT5za19zdGF0ZSA9PSBCVF9DTE9TRUQpIHsKKwkJCXJlbGVhc2Vfc29jayhzayk7CisJCQlidF9hY2NlcHRfdW5saW5rKHNrKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHNrLT5za19zdGF0ZSA9PSBCVF9DT05ORUNURUQgfHwgIW5ld3NvY2spIHsKKwkJCWJ0X2FjY2VwdF91bmxpbmsoc2spOworCQkJaWYgKG5ld3NvY2spCisJCQkJc29ja19ncmFmdChzaywgbmV3c29jayk7CisJCQlyZWxlYXNlX3NvY2soc2spOworCQkJcmV0dXJuIHNrOworCQl9CisKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGJ0X2FjY2VwdF9kZXF1ZXVlKTsKKworaW50IGJ0X3NvY2tfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLCBpbnQgZmxhZ3MpCit7CisJaW50IG5vYmxvY2sgPSBmbGFncyAmIE1TR19ET05UV0FJVDsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXNpemVfdCBjb3BpZWQ7CisJaW50IGVycjsKKworCUJUX0RCRygic29jayAlcCBzayAlcCBsZW4gJWQiLCBzb2NrLCBzaywgbGVuKTsKKworCWlmIChmbGFncyAmIChNU0dfT09CKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKCEoc2tiID0gc2tiX3JlY3ZfZGF0YWdyYW0oc2ssIGZsYWdzLCBub2Jsb2NrLCAmZXJyKSkpIHsKKwkJaWYgKHNrLT5za19zaHV0ZG93biAmIFJDVl9TSFVURE9XTikKKwkJCXJldHVybiAwOworCQlyZXR1cm4gZXJyOworCX0KKworCW1zZy0+bXNnX25hbWVsZW4gPSAwOworCisJY29waWVkID0gc2tiLT5sZW47CisJaWYgKGxlbiA8IGNvcGllZCkgeworCQltc2ctPm1zZ19mbGFncyB8PSBNU0dfVFJVTkM7CisJCWNvcGllZCA9IGxlbjsKKwl9CisKKwlza2ItPmgucmF3ID0gc2tiLT5kYXRhOworCWVyciA9IHNrYl9jb3B5X2RhdGFncmFtX2lvdmVjKHNrYiwgMCwgbXNnLT5tc2dfaW92LCBjb3BpZWQpOworCisJc2tiX2ZyZWVfZGF0YWdyYW0oc2ssIHNrYik7CisKKwlyZXR1cm4gZXJyID8gOiBjb3BpZWQ7Cit9CitFWFBPUlRfU1lNQk9MKGJ0X3NvY2tfcmVjdm1zZyk7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGJ0X2FjY2VwdF9wb2xsKHN0cnVjdCBzb2NrICpwYXJlbnQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwgKm47CisJc3RydWN0IHNvY2sgKnNrOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZidF9zayhwYXJlbnQpLT5hY2NlcHRfcSkgeworCQlzayA9IChzdHJ1Y3Qgc29jayAqKSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBidF9zb2NrLCBhY2NlcHRfcSk7CisJCWlmIChzay0+c2tfc3RhdGUgPT0gQlRfQ09OTkVDVEVEKQorCQkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGludCBidF9zb2NrX3BvbGwoc3RydWN0IGZpbGUgKiBmaWxlLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCUJUX0RCRygic29jayAlcCwgc2sgJXAiLCBzb2NrLCBzayk7CisKKwlwb2xsX3dhaXQoZmlsZSwgc2stPnNrX3NsZWVwLCB3YWl0KTsKKworCWlmIChzay0+c2tfc3RhdGUgPT0gQlRfTElTVEVOKQorCQlyZXR1cm4gYnRfYWNjZXB0X3BvbGwoc2spOworCisJaWYgKHNrLT5za19lcnIgfHwgIXNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX2Vycm9yX3F1ZXVlKSkKKwkJbWFzayB8PSBQT0xMRVJSOworCisJaWYgKHNrLT5za19zaHV0ZG93biA9PSBTSFVURE9XTl9NQVNLKQorCQltYXNrIHw9IFBPTExIVVA7CisKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3JlY2VpdmVfcXVldWUpIHx8IAorCQkJKHNrLT5za19zaHV0ZG93biAmIFJDVl9TSFVURE9XTikpCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKworCWlmIChzay0+c2tfc3RhdGUgPT0gQlRfQ0xPU0VEKQorCQltYXNrIHw9IFBPTExIVVA7CisKKwlpZiAoc2stPnNrX3N0YXRlID09IEJUX0NPTk5FQ1QgfHwKKwkJCXNrLT5za19zdGF0ZSA9PSBCVF9DT05ORUNUMiB8fAorCQkJc2stPnNrX3N0YXRlID09IEJUX0NPTkZJRykKKwkJcmV0dXJuIG1hc2s7CisKKwlpZiAoc29ja193cml0ZWFibGUoc2spKQorCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNIHwgUE9MTFdSQkFORDsKKwllbHNlCisJCXNldF9iaXQoU09DS19BU1lOQ19OT1NQQUNFLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOworCisJcmV0dXJuIG1hc2s7Cit9CitFWFBPUlRfU1lNQk9MKGJ0X3NvY2tfcG9sbCk7CisKK2ludCBidF9zb2NrX3dhaXRfc3RhdGUoc3RydWN0IHNvY2sgKnNrLCBpbnQgc3RhdGUsIHVuc2lnbmVkIGxvbmcgdGltZW8pCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJaW50IGVyciA9IDA7CisKKwlCVF9EQkcoInNrICVwIiwgc2spOworCisJYWRkX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJd2hpbGUgKHNrLT5za19zdGF0ZSAhPSBzdGF0ZSkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCisJCWlmICghdGltZW8pIHsKKwkJCWVyciA9IC1FQUdBSU47CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJZXJyID0gc29ja19pbnRyX2Vycm5vKHRpbWVvKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJdGltZW8gPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvKTsKKwkJbG9ja19zb2NrKHNrKTsKKworCQlpZiAoc2stPnNrX2VycikgeworCQkJZXJyID0gc29ja19lcnJvcihzayk7CisJCQlicmVhazsKKwkJfQorCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXQpOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGJ0X3NvY2tfd2FpdF9zdGF0ZSk7CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSBidF9zb2NrX2ZhbWlseV9vcHMgPSB7CisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmZhbWlseQk9IFBGX0JMVUVUT09USCwKKwkuY3JlYXRlCT0gYnRfc29ja19jcmVhdGUsCit9OworCitleHRlcm4gaW50IGhjaV9zb2NrX2luaXQodm9pZCk7CitleHRlcm4gaW50IGhjaV9zb2NrX2NsZWFudXAodm9pZCk7CisKK2V4dGVybiBpbnQgYnRfc3lzZnNfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgYnRfc3lzZnNfY2xlYW51cCh2b2lkKTsKKworc3RhdGljIGludCBfX2luaXQgYnRfaW5pdCh2b2lkKQoreworCUJUX0lORk8oIkNvcmUgdmVyICVzIiwgVkVSU0lPTik7CisKKwlwcm9jX2J0ID0gcHJvY19ta2RpcigiYmx1ZXRvb3RoIiwgTlVMTCk7CisJaWYgKHByb2NfYnQpCisJCXByb2NfYnQtPm93bmVyID0gVEhJU19NT0RVTEU7CisKKwlzb2NrX3JlZ2lzdGVyKCZidF9zb2NrX2ZhbWlseV9vcHMpOworCisJQlRfSU5GTygiSENJIGRldmljZSBhbmQgY29ubmVjdGlvbiBtYW5hZ2VyIGluaXRpYWxpemVkIik7CisKKwlidF9zeXNmc19pbml0KCk7CisKKwloY2lfc29ja19pbml0KCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGJ0X2V4aXQodm9pZCkKK3sKKwloY2lfc29ja19jbGVhbnVwKCk7CisKKwlidF9zeXNmc19jbGVhbnVwKCk7CisKKwlzb2NrX3VucmVnaXN0ZXIoUEZfQkxVRVRPT1RIKTsKKworCXJlbW92ZV9wcm9jX2VudHJ5KCJibHVldG9vdGgiLCBOVUxMKTsKK30KKworc3Vic3lzX2luaXRjYWxsKGJ0X2luaXQpOworbW9kdWxlX2V4aXQoYnRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1heGltIEtyYXNueWFuc2t5IDxtYXhrQHF1YWxjb21tLmNvbT4sIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQmx1ZXRvb3RoIENvcmUgdmVyICIgVkVSU0lPTik7CitNT0RVTEVfVkVSU0lPTihWRVJTSU9OKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19ORVRQUk9UTyhQRl9CTFVFVE9PVEgpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9ibmVwL0tjb25maWcgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTE1OGIwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9ibmVwL0tjb25maWcKQEAgLTAsMCArMSwyNCBAQAorY29uZmlnIEJUX0JORVAKKwl0cmlzdGF0ZSAiQk5FUCBwcm90b2NvbCBzdXBwb3J0IgorCWRlcGVuZHMgb24gQlQgJiYgQlRfTDJDQVAKKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBCTkVQIChCbHVldG9vdGggTmV0d29yayBFbmNhcHN1bGF0aW9uIFByb3RvY29sKSBpcyBFdGhlcm5ldAorCSAgZW11bGF0aW9uIGxheWVyIG9uIHRvcCBvZiBCbHVldG9vdGguICBCTkVQIGlzIHJlcXVpcmVkIGZvcgorCSAgQmx1ZXRvb3RoIFBBTiAoUGVyc29uYWwgQXJlYSBOZXR3b3JrKS4KKworCSAgU2F5IFkgaGVyZSB0byBjb21waWxlIEJORVAgc3VwcG9ydCBpbnRvIHRoZSBrZXJuZWwgb3Igc2F5IE0gdG8KKwkgIGNvbXBpbGUgaXQgYXMgbW9kdWxlIChibmVwKS4KKworY29uZmlnIEJUX0JORVBfTUNfRklMVEVSCisJYm9vbCAiTXVsdGljYXN0IGZpbHRlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gQlRfQk5FUAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIG11bHRpY2FzdCBmaWx0ZXIgc3VwcG9ydCBmb3IgQk5FUC4KKworY29uZmlnIEJUX0JORVBfUFJPVE9fRklMVEVSCisJYm9vbCAiUHJvdG9jb2wgZmlsdGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBCVF9CTkVQCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgcHJvdG9jb2wgZmlsdGVyIHN1cHBvcnQgZm9yIEJORVAuCisKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvYm5lcC9NYWtlZmlsZSBiL25ldC9ibHVldG9vdGgvYm5lcC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzgyMWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9ibmVwL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IEJsdWV0b290aCBCTkVQIGxheWVyLgorIworCitvYmotJChDT05GSUdfQlRfQk5FUCkgKz0gYm5lcC5vCisKK2JuZXAtb2JqcyA6PSBjb3JlLm8gc29jay5vIG5ldGRldi5vCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2JuZXAvYm5lcC5oIGIvbmV0L2JsdWV0b290aC9ibmVwL2JuZXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmIxZWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9ibmVwL2JuZXAuaApAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAgQk5FUCBwcm90b2NvbCBkZWZpbml0aW9uIGZvciBMaW51eCBCbHVldG9vdGggc3RhY2sgKEJsdWVaKS4KKyAgQ29weXJpZ2h0IChDKSAyMDAyIE1heGltIEtyYXNueWFuc2t5IDxtYXhrQHF1YWxjb21tLmNvbT4KKwkKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorKi8KKworLyoKKyAqICRJZDogYm5lcC5oLHYgMS41IDIwMDIvMDgvMDQgMjE6MjM6NTggbWF4ayBFeHAgJAorICovCisKKyNpZm5kZWYgX0JORVBfSAorI2RlZmluZSBfQk5FUF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KKworLy8gTGltaXRzCisjZGVmaW5lIEJORVBfTUFYX1BST1RPX0ZJTFRFUlMgICAgIDUKKyNkZWZpbmUgQk5FUF9NQVhfTVVMVElDQVNUX0ZJTFRFUlMgMjAKKworLy8gVVVJRHMKKyNkZWZpbmUgQk5FUF9CQVNFX1VVSUQgMHgwMDAwMDAwMDAwMDAxMDAwODAwMDAwODA1RjlCMzRGQgorI2RlZmluZSBCTkVQX1VVSUQxNiAgICAweDAyCisjZGVmaW5lIEJORVBfVVVJRDMyICAgIDB4MDQKKyNkZWZpbmUgQk5FUF9VVUlEMTI4ICAgMHgxNgorCisjZGVmaW5lIEJORVBfU1ZDX1BBTlUgIDB4MTExNQorI2RlZmluZSBCTkVQX1NWQ19OQVAgICAweDExMTYKKyNkZWZpbmUgQk5FUF9TVkNfR04gICAgMHgxMTE3CisKKy8vIFBhY2tldCB0eXBlcworI2RlZmluZSBCTkVQX0dFTkVSQUwgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEJORVBfQ09OVFJPTCAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQk5FUF9DT01QUkVTU0VEICAgICAgICAgICAgMHgwMgorI2RlZmluZSBCTkVQX0NPTVBSRVNTRURfU1JDX09OTFkgICAweDAzCisjZGVmaW5lIEJORVBfQ09NUFJFU1NFRF9EU1RfT05MWSAgIDB4MDQKKworLy8gQ29udHJvbCB0eXBlcworI2RlZmluZSBCTkVQX0NNRF9OT1RfVU5ERVJTVE9PRCAgICAweDAwCisjZGVmaW5lIEJORVBfU0VUVVBfQ09OTl9SRVEgICAgICAgIDB4MDEKKyNkZWZpbmUgQk5FUF9TRVRVUF9DT05OX1JTUCAgICAgICAgMHgwMgorI2RlZmluZSBCTkVQX0ZJTFRFUl9ORVRfVFlQRV9TRVQgICAweDAzCisjZGVmaW5lIEJORVBfRklMVEVSX05FVF9UWVBFX1JTUCAgIDB4MDQKKyNkZWZpbmUgQk5FUF9GSUxURVJfTVVMVElfQUREUl9TRVQgMHgwNQorI2RlZmluZSBCTkVQX0ZJTFRFUl9NVUxUSV9BRERSX1JTUCAweDA2CisKKy8vIEV4dGVuc2lvbiB0eXBlcworI2RlZmluZSBCTkVQX0VYVF9DT05UUk9MICAgICAgICAgICAweDAwCisKKy8vIFJlc3BvbnNlIG1lc3NhZ2VzIAorI2RlZmluZSBCTkVQX1NVQ0NFU1MgICAgICAgICAgICAgICAweDAwCisKKyNkZWZpbmUgQk5FUF9DT05OX0lOVkFMSURfRFNUICAgICAgMHgwMQorI2RlZmluZSBCTkVQX0NPTk5fSU5WQUxJRF9TUkMgICAgICAweDAyCisjZGVmaW5lIEJORVBfQ09OTl9JTlZBTElEX1NWQyAgICAgIDB4MDMKKyNkZWZpbmUgQk5FUF9DT05OX05PVF9BTExPV0VEICAgICAgMHgwNAorCisjZGVmaW5lIEJORVBfRklMVEVSX1VOU1VQUE9SVEVEX1JFUSAgICAweDAxCisjZGVmaW5lIEJORVBfRklMVEVSX0lOVkFMSURfUkFOR0UgICAgICAweDAyCisjZGVmaW5lIEJORVBfRklMVEVSX0lOVkFMSURfTUNBRERSICAgICAweDAyCisjZGVmaW5lIEJORVBfRklMVEVSX0xJTUlUX1JFQUNIRUQgICAgICAweDAzCisjZGVmaW5lIEJORVBfRklMVEVSX0RFTklFRF9TRUNVUklUWSAgICAweDA0CisKKy8vIEwyQ0FQIHNldHRpbmdzCisjZGVmaW5lIEJORVBfTVRVICAgICAgICAgMTY5MQorI2RlZmluZSBCTkVQX1BTTQkgMHgwZgorI2RlZmluZSBCTkVQX0ZMVVNIX1RPICAgIDB4ZmZmZgorI2RlZmluZSBCTkVQX0NPTk5FQ1RfVE8gIDE1CisjZGVmaW5lIEJORVBfRklMVEVSX1RPICAgMTUKKworLy8gSGVhZGVycyAKKyNkZWZpbmUgQk5FUF9UWVBFX01BU0sJIDB4N2YKKyNkZWZpbmUgQk5FUF9FWFRfSEVBREVSCSAweDgwCisKK3N0cnVjdCBibmVwX3NldHVwX2Nvbm5fcmVxIHsKKwlfX3U4ICB0eXBlOworCV9fdTggIGN0cmw7CisJX191OCAgdXVpZF9zaXplOworCV9fdTggIHNlcnZpY2VbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgYm5lcF9zZXRfZmlsdGVyX3JlcSB7CisJX191OCAgdHlwZTsKKwlfX3U4ICBjdHJsOworCV9fdTE2IGxlbjsKKwlfX3U4ICBsaXN0WzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGJuZXBfY29udHJvbF9yc3AgeworCV9fdTggIHR5cGU7CisJX191OCAgY3RybDsKKwlfX3UxNiByZXNwOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGJuZXBfZXh0X2hkciB7CisJX191OCAgdHlwZTsKKwlfX3U4ICBsZW47CisJX191OCAgZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIEJORVAgaW9jdGwgZGVmaW5lcyAqLworI2RlZmluZSBCTkVQQ09OTkFERAlfSU9XKCdCJywgMjAwLCBpbnQpCisjZGVmaW5lIEJORVBDT05OREVMCV9JT1coJ0InLCAyMDEsIGludCkKKyNkZWZpbmUgQk5FUEdFVENPTk5MSVNUCV9JT1IoJ0InLCAyMTAsIGludCkKKyNkZWZpbmUgQk5FUEdFVENPTk5JTkZPCV9JT1IoJ0InLCAyMTEsIGludCkKKworc3RydWN0IGJuZXBfY29ubmFkZF9yZXEgeworCWludCAgIHNvY2s7ICAgICAgIC8vIENvbm5lY3RlZCBzb2NrZXQKKwlfX3UzMiBmbGFnczsKKwlfX3UxNiByb2xlOworCWNoYXIgIGRldmljZVsxNl07IC8vIE5hbWUgb2YgdGhlIEV0aGVybmV0IGRldmljZQorfTsKKworc3RydWN0IGJuZXBfY29ubmRlbF9yZXEgeworCV9fdTMyIGZsYWdzOworCV9fdTggIGRzdFtFVEhfQUxFTl07Cit9OworCitzdHJ1Y3QgYm5lcF9jb25uaW5mbyB7CisJX191MzIgZmxhZ3M7CisJX191MTYgcm9sZTsKKwlfX3UxNiBzdGF0ZTsJCisJX191OCAgZHN0W0VUSF9BTEVOXTsKKwljaGFyICBkZXZpY2VbMTZdOworfTsKKworc3RydWN0IGJuZXBfY29ubmxpc3RfcmVxIHsKKwlfX3UzMiAgY251bTsKKwlzdHJ1Y3QgYm5lcF9jb25uaW5mbyBfX3VzZXIgKmNpOworfTsKKworc3RydWN0IGJuZXBfcHJvdG9fZmlsdGVyIHsKKwlfX3UxNiBzdGFydDsKKwlfX3UxNiBlbmQ7Cit9OworCitpbnQgYm5lcF9hZGRfY29ubmVjdGlvbihzdHJ1Y3QgYm5lcF9jb25uYWRkX3JlcSAqcmVxLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrKTsKK2ludCBibmVwX2RlbF9jb25uZWN0aW9uKHN0cnVjdCBibmVwX2Nvbm5kZWxfcmVxICpyZXEpOworaW50IGJuZXBfZ2V0X2Nvbm5saXN0KHN0cnVjdCBibmVwX2Nvbm5saXN0X3JlcSAqcmVxKTsKK2ludCBibmVwX2dldF9jb25uaW5mbyhzdHJ1Y3QgYm5lcF9jb25uaW5mbyAqY2kpOworCisvLyBCTkVQIHNlc3Npb25zCitzdHJ1Y3QgYm5lcF9zZXNzaW9uIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJCisJdW5zaWduZWQgaW50ICByb2xlOworICAgICAgICB1bnNpZ25lZCBsb25nIHN0YXRlOworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCWF0b21pY190ICAgICAga2lsbGVkOworCisJc3RydWN0IGV0aGhkciBlaDsKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKworCXN0cnVjdCBibmVwX3Byb3RvX2ZpbHRlciBwcm90b19maWx0ZXJbQk5FUF9NQVhfUFJPVE9fRklMVEVSU107CisJdTY0ICAgIG1jX2ZpbHRlcjsKKwkKKwlzdHJ1Y3Qgc29ja2V0ICAgICpzb2NrOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7Cit9OworCit2b2lkIGJuZXBfbmV0X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IGJuZXBfc29ja19pbml0KHZvaWQpOworaW50IGJuZXBfc29ja19jbGVhbnVwKHZvaWQpOworCitzdGF0aWMgaW5saW5lIGludCBibmVwX21jX2hhc2goX191OCAqYWRkcikKK3sKKyAgICAgICAgcmV0dXJuIChjcmMzMl9iZSh+MCwgYWRkciwgRVRIX0FMRU4pID4+IDI2KTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2JuZXAvY29yZS5jIGIvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODJiZjIwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYwpAQCAtMCwwICsxLDcxMyBAQAorLyogCisgICBCTkVQIGltcGxlbWVudGF0aW9uIGZvciBMaW51eCBCbHVldG9vdGggc3RhY2sgKEJsdWVaKS4KKyAgIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEludmVudGVsIFN5c3RlbWVzCisgICBXcml0dGVuIDIwMDEtMjAwMiBieQorCUNs6W1lbnQgTW9yZWF1IDxjbGVtZW50Lm1vcmVhdUBpbnZlbnRlbC5mcj4KKwlEYXZpZCBMaWJhdWx0ICA8ZGF2aWQubGliYXVsdEBpbnZlbnRlbC5mcj4KKworICAgQ29weXJpZ2h0IChDKSAyMDAyIE1heGltIEtyYXNueWFuc2t5IDxtYXhrQHF1YWxjb21tLmNvbT4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBBTkQgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZCisgICBDTEFJTSwgT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUyAKKyAgIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiAKKyAgIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIAorICAgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworICAgQUxMIExJQUJJTElUWSwgSU5DTFVESU5HIExJQUJJTElUWSBGT1IgSU5GUklOR0VNRU5UIE9GIEFOWSBQQVRFTlRTLCAKKyAgIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLCBSRUxBVElORyBUTyBVU0UgT0YgVEhJUyAKKyAgIFNPRlRXQVJFIElTIERJU0NMQUlNRUQuCisqLworCisvKgorICogJElkOiBjb3JlLmMsdiAxLjIwIDIwMDIvMDgvMDQgMjE6MjM6NTggbWF4ayBFeHAgJAorICovIAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2wyY2FwLmg+CisKKyNpbmNsdWRlICJibmVwLmgiCisKKyNpZm5kZWYgQ09ORklHX0JUX0JORVBfREVCVUcKKyN1bmRlZiAgQlRfREJHCisjZGVmaW5lIEJUX0RCRyhELi4uKQorI2VuZGlmCisKKyNkZWZpbmUgVkVSU0lPTiAiMS4yIgorCitzdGF0aWMgTElTVF9IRUFEKGJuZXBfc2Vzc2lvbl9saXN0KTsKK3N0YXRpYyBERUNMQVJFX1JXU0VNKGJuZXBfc2Vzc2lvbl9zZW0pOworCitzdGF0aWMgc3RydWN0IGJuZXBfc2Vzc2lvbiAqX19ibmVwX2dldF9zZXNzaW9uKHU4ICpkc3QpCit7CisJc3RydWN0IGJuZXBfc2Vzc2lvbiAqczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCisJQlRfREJHKCIiKTsKKworCWxpc3RfZm9yX2VhY2gocCwgJmJuZXBfc2Vzc2lvbl9saXN0KSB7CisJCXMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBibmVwX3Nlc3Npb24sIGxpc3QpOwkKKwkJaWYgKCFtZW1jbXAoZHN0LCBzLT5laC5oX3NvdXJjZSwgRVRIX0FMRU4pKQorCQkJcmV0dXJuIHM7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBfX2JuZXBfbGlua19zZXNzaW9uKHN0cnVjdCBibmVwX3Nlc3Npb24gKnMpCit7CisJLyogSXQncyBzYWZlIHRvIGNhbGwgX19tb2R1bGVfZ2V0KCkgaGVyZSBiZWNhdXNlIHNlc3Npb25zIGFyZSBhZGRlZAorCSAgIGJ5IHRoZSBzb2NrZXQgbGF5ZXIgd2hpY2ggaGFzIHRvIGhvbGQgdGhlIHJlZmZlcmVuY2UgdG8gdGhpcyBtb2R1bGUuCisJICovCisJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKwlsaXN0X2FkZCgmcy0+bGlzdCwgJmJuZXBfc2Vzc2lvbl9saXN0KTsJCit9CisKK3N0YXRpYyB2b2lkIF9fYm5lcF91bmxpbmtfc2Vzc2lvbihzdHJ1Y3QgYm5lcF9zZXNzaW9uICpzKQoreworCWxpc3RfZGVsKCZzLT5saXN0KTsKKwltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKK30KKworc3RhdGljIGludCBibmVwX3NlbmQoc3RydWN0IGJuZXBfc2Vzc2lvbiAqcywgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gcy0+c29jazsKKwlzdHJ1Y3Qga3ZlYyBpdiA9IHsgZGF0YSwgbGVuIH07CisKKwlyZXR1cm4ga2VybmVsX3NlbmRtc2coc29jaywgJnMtPm1zZywgJml2LCAxLCBsZW4pOworfQorCitzdGF0aWMgaW50IGJuZXBfc2VuZF9yc3Aoc3RydWN0IGJuZXBfc2Vzc2lvbiAqcywgdTggY3RybCwgdTE2IHJlc3ApCit7CisJc3RydWN0IGJuZXBfY29udHJvbF9yc3AgcnNwOworCXJzcC50eXBlID0gQk5FUF9DT05UUk9MOworCXJzcC5jdHJsID0gY3RybDsKKwlyc3AucmVzcCA9IGh0b25zKHJlc3ApOworCXJldHVybiBibmVwX3NlbmQocywgJnJzcCwgc2l6ZW9mKHJzcCkpOworfQorCisjaWZkZWYgQ09ORklHX0JUX0JORVBfUFJPVE9fRklMVEVSCitzdGF0aWMgaW5saW5lIHZvaWQgYm5lcF9zZXRfZGVmYXVsdF9wcm90b19maWx0ZXIoc3RydWN0IGJuZXBfc2Vzc2lvbiAqcykKK3sKKwkvKiAoSVB2NCwgQVJQKSAgKi8KKwlzLT5wcm90b19maWx0ZXJbMF0uc3RhcnQgPSBodG9ucygweDA4MDApOworCXMtPnByb3RvX2ZpbHRlclswXS5lbmQgICA9IGh0b25zKDB4MDgwNik7CisJLyogKFJBUlAsIEFwcGxlVGFsaykgKi8KKwlzLT5wcm90b19maWx0ZXJbMV0uc3RhcnQgPSBodG9ucygweDgwMzUpOworCXMtPnByb3RvX2ZpbHRlclsxXS5lbmQgICA9IGh0b25zKDB4ODBGMyk7CisJLyogKElQWCwgSVB2NikgKi8KKwlzLT5wcm90b19maWx0ZXJbMl0uc3RhcnQgPSBodG9ucygweDgxMzcpOworCXMtPnByb3RvX2ZpbHRlclsyXS5lbmQgICA9IGh0b25zKDB4ODZERCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBibmVwX2N0cmxfc2V0X25ldGZpbHRlcihzdHJ1Y3QgYm5lcF9zZXNzaW9uICpzLCB1MTYgKmRhdGEsIGludCBsZW4pCit7CisJaW50IG47CisKKwlpZiAobGVuIDwgMikKKwkJcmV0dXJuIC1FSUxTRVE7CisKKwluID0gbnRvaHMoZ2V0X3VuYWxpZ25lZChkYXRhKSk7CisJZGF0YSsrOyBsZW4gLT0gMjsKKworCWlmIChsZW4gPCBuKQorCQlyZXR1cm4gLUVJTFNFUTsKKworCUJUX0RCRygiZmlsdGVyIGxlbiAlZCIsIG4pOworCisjaWZkZWYgQ09ORklHX0JUX0JORVBfUFJPVE9fRklMVEVSCisJbiAvPSA0OworCWlmIChuIDw9IEJORVBfTUFYX1BST1RPX0ZJTFRFUlMpIHsKKwkJc3RydWN0IGJuZXBfcHJvdG9fZmlsdGVyICpmID0gcy0+cHJvdG9fZmlsdGVyOworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQlmW2ldLnN0YXJ0ID0gZ2V0X3VuYWxpZ25lZChkYXRhKyspOworCQkJZltpXS5lbmQgICA9IGdldF91bmFsaWduZWQoZGF0YSsrKTsKKworCQkJQlRfREJHKCJwcm90byBmaWx0ZXIgc3RhcnQgJWQgZW5kICVkIiwKKwkJCQlmW2ldLnN0YXJ0LCBmW2ldLmVuZCk7CisJCX0KKworCQlpZiAoaSA8IEJORVBfTUFYX1BST1RPX0ZJTFRFUlMpCisJCQltZW1zZXQoZiArIGksIDAsIHNpemVvZigqZikpOworCisJCWlmIChuID09IDApCisJCQlibmVwX3NldF9kZWZhdWx0X3Byb3RvX2ZpbHRlcihzKTsKKworCQlibmVwX3NlbmRfcnNwKHMsIEJORVBfRklMVEVSX05FVF9UWVBFX1JTUCwgQk5FUF9TVUNDRVNTKTsKKwl9IGVsc2UgeworCQlibmVwX3NlbmRfcnNwKHMsIEJORVBfRklMVEVSX05FVF9UWVBFX1JTUCwgQk5FUF9GSUxURVJfTElNSVRfUkVBQ0hFRCk7CisJfQorI2Vsc2UKKwlibmVwX3NlbmRfcnNwKHMsIEJORVBfRklMVEVSX05FVF9UWVBFX1JTUCwgQk5FUF9GSUxURVJfVU5TVVBQT1JURURfUkVRKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJuZXBfY3RybF9zZXRfbWNmaWx0ZXIoc3RydWN0IGJuZXBfc2Vzc2lvbiAqcywgdTggKmRhdGEsIGludCBsZW4pCit7CisJaW50IG47CisKKwlpZiAobGVuIDwgMikKKwkJcmV0dXJuIC1FSUxTRVE7CisKKwluID0gbnRvaHMoZ2V0X3VuYWxpZ25lZCgodTE2ICopIGRhdGEpKTsgCisJZGF0YSArPSAyOyBsZW4gLT0gMjsKKworCWlmIChsZW4gPCBuKQorCQlyZXR1cm4gLUVJTFNFUTsKKworCUJUX0RCRygiZmlsdGVyIGxlbiAlZCIsIG4pOworCisjaWZkZWYgQ09ORklHX0JUX0JORVBfTUNfRklMVEVSCisJbiAvPSAoRVRIX0FMRU4gKiAyKTsKKworCWlmIChuID4gMCkgeworCQlzLT5tY19maWx0ZXIgPSAwOworCisJCS8qIEFsd2F5cyBzZW5kIGJyb2FkY2FzdCAqLworCQlzZXRfYml0KGJuZXBfbWNfaGFzaChzLT5kZXYtPmJyb2FkY2FzdCksICh1bG9uZyAqKSAmcy0+bWNfZmlsdGVyKTsKKworCQkvKiBBZGQgYWRkcmVzcyByYW5nZXMgdG8gdGhlIG11bHRpY2FzdCBoYXNoICovCisJCWZvciAoOyBuID4gMDsgbi0tKSB7CisJCQl1OCBhMVs2XSwgKmEyOworCisJCQltZW1jcHkoYTEsIGRhdGEsIEVUSF9BTEVOKTsgZGF0YSArPSBFVEhfQUxFTjsKKwkJCWEyID0gZGF0YTsgZGF0YSArPSBFVEhfQUxFTjsKKwkKKwkJCUJUX0RCRygibWMgZmlsdGVyICVzIC0+ICVzIiwKKwkJCQliYXRvc3RyKCh2b2lkICopIGExKSwgYmF0b3N0cigodm9pZCAqKSBhMikpOworCisJCQkjZGVmaW5lIElOQ0EoYSkgeyBpbnQgaSA9IDU7IHdoaWxlIChpID49MCAmJiArK2FbaS0tXSA9PSAwKTsgfQorCisJCQkvKiBJdGVyYXRlIGZyb20gYTEgdG8gYTIgKi8KKwkJCXNldF9iaXQoYm5lcF9tY19oYXNoKGExKSwgKHVsb25nICopICZzLT5tY19maWx0ZXIpOworCQkJd2hpbGUgKG1lbWNtcChhMSwgYTIsIDYpIDwgMCAmJiBzLT5tY19maWx0ZXIgIT0gfjBMTCkgeworCQkJCUlOQ0EoYTEpOworCQkJCXNldF9iaXQoYm5lcF9tY19oYXNoKGExKSwgKHVsb25nICopICZzLT5tY19maWx0ZXIpOworCQkJfQorCQl9CisJfQorCisJQlRfREJHKCJtYyBmaWx0ZXIgaGFzaCAweCVsbHgiLCBzLT5tY19maWx0ZXIpOworCisJYm5lcF9zZW5kX3JzcChzLCBCTkVQX0ZJTFRFUl9NVUxUSV9BRERSX1JTUCwgQk5FUF9TVUNDRVNTKTsKKyNlbHNlCisJYm5lcF9zZW5kX3JzcChzLCBCTkVQX0ZJTFRFUl9NVUxUSV9BRERSX1JTUCwgQk5FUF9GSUxURVJfVU5TVVBQT1JURURfUkVRKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJuZXBfcnhfY29udHJvbChzdHJ1Y3QgYm5lcF9zZXNzaW9uICpzLCB2b2lkICpkYXRhLCBpbnQgbGVuKQoreworCXU4ICBjbWQgPSAqKHU4ICopZGF0YTsKKwlpbnQgZXJyID0gMDsKKworCWRhdGErKzsgbGVuLS07CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQk5FUF9DTURfTk9UX1VOREVSU1RPT0Q6CisJY2FzZSBCTkVQX1NFVFVQX0NPTk5fUkVROgorCWNhc2UgQk5FUF9TRVRVUF9DT05OX1JTUDoKKwljYXNlIEJORVBfRklMVEVSX05FVF9UWVBFX1JTUDoKKwljYXNlIEJORVBfRklMVEVSX01VTFRJX0FERFJfUlNQOgorCQkvKiBJZ25vcmUgdGhlc2UgZm9yIG5vdyAqLworCQlicmVhazsKKworCWNhc2UgQk5FUF9GSUxURVJfTkVUX1RZUEVfU0VUOgorCQllcnIgPSBibmVwX2N0cmxfc2V0X25ldGZpbHRlcihzLCBkYXRhLCBsZW4pOworCQlicmVhazsKKworCWNhc2UgQk5FUF9GSUxURVJfTVVMVElfQUREUl9TRVQ6CisJCWVyciA9IGJuZXBfY3RybF9zZXRfbWNmaWx0ZXIocywgZGF0YSwgbGVuKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OiB7CisJCQl1OCBwa3RbM107CisJCQlwa3RbMF0gPSBCTkVQX0NPTlRST0w7CisJCQlwa3RbMV0gPSBCTkVQX0NNRF9OT1RfVU5ERVJTVE9PRDsKKwkJCXBrdFsyXSA9IGNtZDsKKwkJCWJuZXBfc2VuZChzLCBwa3QsIHNpemVvZihwa3QpKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGJuZXBfcnhfZXh0ZW5zaW9uKHN0cnVjdCBibmVwX3Nlc3Npb24gKnMsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGJuZXBfZXh0X2hkciAqaDsKKwlpbnQgZXJyID0gMDsKKworCWRvIHsKKwkJaCA9ICh2b2lkICopIHNrYi0+ZGF0YTsKKwkJaWYgKCFza2JfcHVsbChza2IsIHNpemVvZigqaCkpKSB7CisJCQllcnIgPSAtRUlMU0VROworCQkJYnJlYWs7CisJCX0KKworCQlCVF9EQkcoInR5cGUgMHgleCBsZW4gJWQiLCBoLT50eXBlLCBoLT5sZW4pOworCQorCQlzd2l0Y2ggKGgtPnR5cGUgJiBCTkVQX1RZUEVfTUFTSykgeworCQljYXNlIEJORVBfRVhUX0NPTlRST0w6CisJCQlibmVwX3J4X2NvbnRyb2wocywgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJLyogVW5rbm93biBleHRlbnNpb24sIHNraXAgaXQuICovCisJCQlicmVhazsKKwkJfQorCisJCWlmICghc2tiX3B1bGwoc2tiLCBoLT5sZW4pKSB7CisJCQllcnIgPSAtRUlMU0VROworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICghZXJyICYmIChoLT50eXBlICYgQk5FUF9FWFRfSEVBREVSKSk7CisJCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHU4IF9fYm5lcF9yeF9obGVuW10gPSB7CisJRVRIX0hMRU4sICAgICAvKiBCTkVQX0dFTkVSQUwgKi8KKwkwLCAgICAgICAgICAgIC8qIEJORVBfQ09OVFJPTCAqLworCTIsICAgICAgICAgICAgLyogQk5FUF9DT01QUkVTU0VEICovCisJRVRIX0FMRU4gKyAyLCAvKiBCTkVQX0NPTVBSRVNTRURfU1JDX09OTFkgKi8KKwlFVEhfQUxFTiArIDIgIC8qIEJORVBfQ09NUFJFU1NFRF9EU1RfT05MWSAqLworfTsKKyNkZWZpbmUgQk5FUF9SWF9UWVBFUwkoc2l6ZW9mKF9fYm5lcF9yeF9obGVuKSAtIDEpCisKK3N0YXRpYyBpbmxpbmUgaW50IGJuZXBfcnhfZnJhbWUoc3RydWN0IGJuZXBfc2Vzc2lvbiAqcywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcy0+ZGV2OworCXN0cnVjdCBza19idWZmICpuc2tiOworCXU4IHR5cGU7CisKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCXMtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCisJdHlwZSA9ICoodTggKikgc2tiLT5kYXRhOyBza2JfcHVsbChza2IsIDEpOworCisJaWYgKCh0eXBlICYgQk5FUF9UWVBFX01BU0spID4gQk5FUF9SWF9UWVBFUykKKwkJZ290byBiYWRmcmFtZTsKKwkKKwlpZiAoKHR5cGUgJiBCTkVQX1RZUEVfTUFTSykgPT0gQk5FUF9DT05UUk9MKSB7CisJCWJuZXBfcnhfY29udHJvbChzLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KKworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKworCS8qIFZlcmlmeSBhbmQgcHVsbCBvdXQgaGVhZGVyICovCisJaWYgKCFza2JfcHVsbChza2IsIF9fYm5lcF9yeF9obGVuW3R5cGUgJiBCTkVQX1RZUEVfTUFTS10pKQorCQlnb3RvIGJhZGZyYW1lOworCisJcy0+ZWguaF9wcm90byA9IGdldF91bmFsaWduZWQoKHUxNiAqKSAoc2tiLT5kYXRhIC0gMikpOworCisJaWYgKHR5cGUgJiBCTkVQX0VYVF9IRUFERVIpIHsKKwkJaWYgKGJuZXBfcnhfZXh0ZW5zaW9uKHMsIHNrYikgPCAwKQorCQkJZ290byBiYWRmcmFtZTsKKwl9CisKKwkvKiBTdHJpcCA4MDIuMXAgaGVhZGVyICovCisJaWYgKG50b2hzKHMtPmVoLmhfcHJvdG8pID09IDB4ODEwMCkgeworCQlpZiAoIXNrYl9wdWxsKHNrYiwgNCkpCisJCQlnb3RvIGJhZGZyYW1lOworCQlzLT5laC5oX3Byb3RvID0gZ2V0X3VuYWxpZ25lZCgodTE2ICopIChza2ItPmRhdGEgLSAyKSk7CisJfQorCQorCS8qIFdlIGhhdmUgdG8gYWxsb2MgbmV3IHNrYiBhbmQgY29weSBkYXRhIGhlcmUgOiguIEJlY2F1c2Ugb3JpZ2luYWwgc2tiCisJICogbWF5IG5vdCBiZSBtb2RpZmllZCBhbmQgYmVjYXVzZSBvZiB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cy4gKi8KKwluc2tiID0gYWxsb2Nfc2tiKDIgKyBFVEhfSExFTiArIHNrYi0+bGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5za2IpIHsKKwkJcy0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXNrYl9yZXNlcnZlKG5za2IsIDIpOworCisJLyogRGVjb21wcmVzcyBoZWFkZXIgYW5kIGNvbnN0cnVjdCBldGhlciBmcmFtZSAqLworCXN3aXRjaCAodHlwZSAmIEJORVBfVFlQRV9NQVNLKSB7CisJY2FzZSBCTkVQX0NPTVBSRVNTRUQ6CisJCW1lbWNweShfX3NrYl9wdXQobnNrYiwgRVRIX0hMRU4pLCAmcy0+ZWgsIEVUSF9ITEVOKTsKKwkJYnJlYWs7CisJCisJY2FzZSBCTkVQX0NPTVBSRVNTRURfU1JDX09OTFk6CisJCW1lbWNweShfX3NrYl9wdXQobnNrYiwgRVRIX0FMRU4pLCBzLT5laC5oX2Rlc3QsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KF9fc2tiX3B1dChuc2tiLCBFVEhfQUxFTiksIHNrYi0+bWFjLnJhdywgRVRIX0FMRU4pOworCQlwdXRfdW5hbGlnbmVkKHMtPmVoLmhfcHJvdG8sICh1MTYgKikgX19za2JfcHV0KG5za2IsIDIpKTsKKwkJYnJlYWs7CisKKwljYXNlIEJORVBfQ09NUFJFU1NFRF9EU1RfT05MWToKKwkJbWVtY3B5KF9fc2tiX3B1dChuc2tiLCBFVEhfQUxFTiksIHNrYi0+bWFjLnJhdywgRVRIX0FMRU4pOworCQltZW1jcHkoX19za2JfcHV0KG5za2IsIEVUSF9BTEVOICsgMiksIHMtPmVoLmhfc291cmNlLCBFVEhfQUxFTiArIDIpOworCQlicmVhazsKKworCWNhc2UgQk5FUF9HRU5FUkFMOgorCQltZW1jcHkoX19za2JfcHV0KG5za2IsIEVUSF9BTEVOICogMiksIHNrYi0+bWFjLnJhdywgRVRIX0FMRU4gKiAyKTsKKwkJcHV0X3VuYWxpZ25lZChzLT5laC5oX3Byb3RvLCAodTE2ICopIF9fc2tiX3B1dChuc2tiLCAyKSk7CisJCWJyZWFrOworCX0KKworCW1lbWNweShfX3NrYl9wdXQobnNrYiwgc2tiLT5sZW4pLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlrZnJlZV9za2Ioc2tiKTsKKwkKKwlzLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJbnNrYi0+ZGV2ICAgICAgID0gZGV2OworCW5za2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJbnNrYi0+cHJvdG9jb2wgID0gZXRoX3R5cGVfdHJhbnMobnNrYiwgZGV2KTsKKwluZXRpZl9yeF9uaShuc2tiKTsKKwlyZXR1cm4gMDsKKworYmFkZnJhbWU6CisJcy0+c3RhdHMucnhfZXJyb3JzKys7CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1OCBfX2JuZXBfdHhfdHlwZXNbXSA9IHsKKwlCTkVQX0dFTkVSQUwsCisJQk5FUF9DT01QUkVTU0VEX1NSQ19PTkxZLAorCUJORVBfQ09NUFJFU1NFRF9EU1RfT05MWSwKKwlCTkVQX0NPTVBSRVNTRUQKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IGJuZXBfdHhfZnJhbWUoc3RydWN0IGJuZXBfc2Vzc2lvbiAqcywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgZXRoaGRyICplaCA9ICh2b2lkICopIHNrYi0+ZGF0YTsKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gcy0+c29jazsKKwlzdHJ1Y3Qga3ZlYyBpdlszXTsKKwlpbnQgbGVuID0gMCwgaWwgPSAwOworCXU4IHR5cGUgPSAwOworCisJQlRfREJHKCJza2IgJXAgZGV2ICVwIHR5cGUgJWQiLCBza2IsIHNrYi0+ZGV2LCBza2ItPnBrdF90eXBlKTsKKworCWlmICghc2tiLT5kZXYpIHsKKwkJLyogQ29udHJvbCBmcmFtZSBzZW50IGJ5IHVzICovCisJCWdvdG8gc2VuZDsKKwl9CisKKwlpdltpbCsrXSA9IChzdHJ1Y3Qga3ZlYykgeyAmdHlwZSwgMSB9OworCWxlbisrOworCisJaWYgKCFtZW1jbXAoZWgtPmhfZGVzdCwgcy0+ZWguaF9zb3VyY2UsIEVUSF9BTEVOKSkKKwkJdHlwZSB8PSAweDAxOworCisJaWYgKCFtZW1jbXAoZWgtPmhfc291cmNlLCBzLT5laC5oX2Rlc3QsIEVUSF9BTEVOKSkKKwkJdHlwZSB8PSAweDAyOworCisJaWYgKHR5cGUpCisJCXNrYl9wdWxsKHNrYiwgRVRIX0FMRU4gKiAyKTsKKworCXR5cGUgPSBfX2JuZXBfdHhfdHlwZXNbdHlwZV07CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBCTkVQX0NPTVBSRVNTRURfU1JDX09OTFk6CisJCWl2W2lsKytdID0gKHN0cnVjdCBrdmVjKSB7IGVoLT5oX3NvdXJjZSwgRVRIX0FMRU4gfTsKKwkJbGVuICs9IEVUSF9BTEVOOworCQlicmVhazsKKwkJCisJY2FzZSBCTkVQX0NPTVBSRVNTRURfRFNUX09OTFk6CisJCWl2W2lsKytdID0gKHN0cnVjdCBrdmVjKSB7IGVoLT5oX2Rlc3QsIEVUSF9BTEVOIH07CisJCWxlbiArPSBFVEhfQUxFTjsKKwkJYnJlYWs7CisJfQorCitzZW5kOgorCWl2W2lsKytdID0gKHN0cnVjdCBrdmVjKSB7IHNrYi0+ZGF0YSwgc2tiLT5sZW4gfTsKKwlsZW4gKz0gc2tiLT5sZW47CisJCisJLyogRklYTUU6IGxpbmVhcml6ZSBza2IgKi8KKwl7CisJCWxlbiA9IGtlcm5lbF9zZW5kbXNnKHNvY2ssICZzLT5tc2csIGl2LCBpbCwgbGVuKTsKKwl9CisJa2ZyZWVfc2tiKHNrYik7CisKKwlpZiAobGVuID4gMCkgeworCQlzLT5zdGF0cy50eF9ieXRlcyArPSBsZW47CisJCXMtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBibmVwX3Nlc3Npb24odm9pZCAqYXJnKQoreworCXN0cnVjdCBibmVwX3Nlc3Npb24gKnMgPSBhcmc7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHMtPmRldjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzLT5zb2NrLT5zazsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXdhaXRfcXVldWVfdCB3YWl0OworCisJQlRfREJHKCIiKTsKKworICAgICAgICBkYWVtb25pemUoImtibmVwZCAlcyIsIGRldi0+bmFtZSk7CisJc2V0X3VzZXJfbmljZShjdXJyZW50LCAtMTUpOworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOworCisJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOworCWFkZF93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXQpOworCXdoaWxlICghYXRvbWljX3JlYWQoJnMtPmtpbGxlZCkpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQkvLyBSWAorCQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpKSB7CisJCQlza2Jfb3JwaGFuKHNrYik7CisJCQlibmVwX3J4X2ZyYW1lKHMsIHNrYik7CisJCX0KKworCQlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0NPTk5FQ1RFRCkKKwkJCWJyZWFrOworCQorCQkvLyBUWAorCQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfd3JpdGVfcXVldWUpKSkKKwkJCWlmIChibmVwX3R4X2ZyYW1lKHMsIHNrYikpCisJCQkJYnJlYWs7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkKKwkJc2NoZWR1bGUoKTsKKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKKworCS8qIENsZWFudXAgc2Vzc2lvbiAqLworCWRvd25fd3JpdGUoJmJuZXBfc2Vzc2lvbl9zZW0pOworCisJLyogRGVsZXRlIG5ldHdvcmsgZGV2aWNlICovCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworCS8qIFJlbGVhc2UgdGhlIHNvY2tldCAqLworCWZwdXQocy0+c29jay0+ZmlsZSk7CisKKwlfX2JuZXBfdW5saW5rX3Nlc3Npb24ocyk7CisKKwl1cF93cml0ZSgmYm5lcF9zZXNzaW9uX3NlbSk7CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGJuZXBfYWRkX2Nvbm5lY3Rpb24oc3RydWN0IGJuZXBfY29ubmFkZF9yZXEgKnJlcSwgc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBibmVwX3Nlc3Npb24gKnMsICpzczsKKwl1OCBkc3RbRVRIX0FMRU5dLCBzcmNbRVRIX0FMRU5dOworCWludCBlcnI7CisKKwlCVF9EQkcoIiIpOworCisJYmFzd2FwKCh2b2lkICopIGRzdCwgJmJ0X3NrKHNvY2stPnNrKS0+ZHN0KTsKKwliYXN3YXAoKHZvaWQgKikgc3JjLCAmYnRfc2soc29jay0+c2spLT5zcmMpOworCisJLyogc2Vzc2lvbiBzdHJ1Y3QgYWxsb2NhdGVkIGFzIHByaXZhdGUgcGFydCBvZiBuZXRfZGV2aWNlICovCisJZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgYm5lcF9zZXNzaW9uKSwKKwkJCSAgICgqcmVxLT5kZXZpY2UpID8gcmVxLT5kZXZpY2UgOiAiYm5lcCVkIiwKKwkJCSAgIGJuZXBfbmV0X3NldHVwKTsKKwlpZiAoIWRldikgCisJCXJldHVybiBFTk9NRU07CisKKworCWRvd25fd3JpdGUoJmJuZXBfc2Vzc2lvbl9zZW0pOworCisJc3MgPSBfX2JuZXBfZ2V0X3Nlc3Npb24oZHN0KTsKKwlpZiAoc3MgJiYgc3MtPnN0YXRlID09IEJUX0NPTk5FQ1RFRCkgeworCQllcnIgPSAtRUVYSVNUOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlzID0gZGV2LT5wcml2OworCisJLyogVGhpcyBpcyByeCBoZWFkZXIgdGhlcmVmb3JlIGFkZHJlc3NlcyBhcmUgc3dhcHBlZC4KKwkgKiBpZSBlaC5oX2Rlc3QgaXMgb3VyIGxvY2FsIGFkZHJlc3MuICovCisJbWVtY3B5KHMtPmVoLmhfZGVzdCwgICAmc3JjLCBFVEhfQUxFTik7CisJbWVtY3B5KHMtPmVoLmhfc291cmNlLCAmZHN0LCBFVEhfQUxFTik7CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHMtPmVoLmhfZGVzdCwgRVRIX0FMRU4pOworCisJcy0+ZGV2ID0gZGV2OworCXMtPnNvY2sgID0gc29jazsKKwlzLT5yb2xlICA9IHJlcS0+cm9sZTsKKwlzLT5zdGF0ZSA9IEJUX0NPTk5FQ1RFRDsKKwkKKwlzLT5tc2cubXNnX2ZsYWdzID0gTVNHX05PU0lHTkFMOworCisjaWZkZWYgQ09ORklHX0JUX0JORVBfTUNfRklMVEVSCisJLyogU2V0IGRlZmF1bHQgbWMgZmlsdGVyICovCisJc2V0X2JpdChibmVwX21jX2hhc2goZGV2LT5icm9hZGNhc3QpLCAodWxvbmcgKikgJnMtPm1jX2ZpbHRlcik7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19CVF9CTkVQX1BST1RPX0ZJTFRFUgorCS8qIFNldCBkZWZhdWx0IHByb3RvY29sIGZpbHRlciAqLworCWJuZXBfc2V0X2RlZmF1bHRfcHJvdG9fZmlsdGVyKHMpOworI2VuZGlmCisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKSB7CisJCWdvdG8gZmFpbGVkOworCX0KKworCV9fYm5lcF9saW5rX3Nlc3Npb24ocyk7CisJCisJZXJyID0ga2VybmVsX3RocmVhZChibmVwX3Nlc3Npb24sIHMsIENMT05FX0tFUk5FTCk7CisJaWYgKGVyciA8IDApIHsKKwkJLyogU2Vzc2lvbiB0aHJlYWQgc3RhcnQgZmFpbGVkLCBnb3R0YSBjbGVhbnVwLiAqLworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQlfX2JuZXBfdW5saW5rX3Nlc3Npb24ocyk7CisJCWdvdG8gZmFpbGVkOworCX0KKworCXVwX3dyaXRlKCZibmVwX3Nlc3Npb25fc2VtKTsKKwlzdHJjcHkocmVxLT5kZXZpY2UsIGRldi0+bmFtZSk7CisJcmV0dXJuIDA7CisKK2ZhaWxlZDoKKwl1cF93cml0ZSgmYm5lcF9zZXNzaW9uX3NlbSk7CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgYm5lcF9kZWxfY29ubmVjdGlvbihzdHJ1Y3QgYm5lcF9jb25uZGVsX3JlcSAqcmVxKQoreworCXN0cnVjdCBibmVwX3Nlc3Npb24gKnM7CisJaW50ICBlcnIgPSAwOworCisJQlRfREJHKCIiKTsKKworCWRvd25fcmVhZCgmYm5lcF9zZXNzaW9uX3NlbSk7CisKKwlzID0gX19ibmVwX2dldF9zZXNzaW9uKHJlcS0+ZHN0KTsKKwlpZiAocykgeworCQkvKiBXYWtldXAgdXNlci1zcGFjZSB3aGljaCBpcyBwb2xsaW5nIGZvciBzb2NrZXQgZXJyb3JzLgorCQkgKiBUaGlzIGlzIHRlbXBvcmFyeSBoYWNrIHVudGlsbCB3ZSBoYXZlIHNodXRkb3duIGluIEwyQ0FQICovCisJCXMtPnNvY2stPnNrLT5za19lcnIgPSBFVU5BVENIOworCQkKKwkJLyogS2lsbCBzZXNzaW9uIHRocmVhZCAqLworCQlhdG9taWNfaW5jKCZzLT5raWxsZWQpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUocy0+c29jay0+c2stPnNrX3NsZWVwKTsKKwl9IGVsc2UKKwkJZXJyID0gLUVOT0VOVDsKKworCXVwX3JlYWQoJmJuZXBfc2Vzc2lvbl9zZW0pOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fYm5lcF9jb3B5X2NpKHN0cnVjdCBibmVwX2Nvbm5pbmZvICpjaSwgc3RydWN0IGJuZXBfc2Vzc2lvbiAqcykKK3sKKwltZW1jcHkoY2ktPmRzdCwgcy0+ZWguaF9zb3VyY2UsIEVUSF9BTEVOKTsKKwlzdHJjcHkoY2ktPmRldmljZSwgcy0+ZGV2LT5uYW1lKTsKKwljaS0+ZmxhZ3MgPSBzLT5mbGFnczsKKwljaS0+c3RhdGUgPSBzLT5zdGF0ZTsKKwljaS0+cm9sZSAgPSBzLT5yb2xlOworfQorCitpbnQgYm5lcF9nZXRfY29ubmxpc3Qoc3RydWN0IGJuZXBfY29ubmxpc3RfcmVxICpyZXEpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlpbnQgZXJyID0gMCwgbiA9IDA7CisKKwlkb3duX3JlYWQoJmJuZXBfc2Vzc2lvbl9zZW0pOworCisJbGlzdF9mb3JfZWFjaChwLCAmYm5lcF9zZXNzaW9uX2xpc3QpIHsKKwkJc3RydWN0IGJuZXBfc2Vzc2lvbiAqczsKKwkJc3RydWN0IGJuZXBfY29ubmluZm8gY2k7CisKKwkJcyA9IGxpc3RfZW50cnkocCwgc3RydWN0IGJuZXBfc2Vzc2lvbiwgbGlzdCk7CisKKwkJX19ibmVwX2NvcHlfY2koJmNpLCBzKTsKKwkJCisJCWlmIChjb3B5X3RvX3VzZXIocmVxLT5jaSwgJmNpLCBzaXplb2YoY2kpKSkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCsrbiA+PSByZXEtPmNudW0pCisJCQlicmVhazsKKworCQlyZXEtPmNpKys7CisJfQorCXJlcS0+Y251bSA9IG47CisKKwl1cF9yZWFkKCZibmVwX3Nlc3Npb25fc2VtKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgYm5lcF9nZXRfY29ubmluZm8oc3RydWN0IGJuZXBfY29ubmluZm8gKmNpKQoreworCXN0cnVjdCBibmVwX3Nlc3Npb24gKnM7CisJaW50IGVyciA9IDA7CisKKwlkb3duX3JlYWQoJmJuZXBfc2Vzc2lvbl9zZW0pOworCisJcyA9IF9fYm5lcF9nZXRfc2Vzc2lvbihjaS0+ZHN0KTsKKwlpZiAocykKKwkJX19ibmVwX2NvcHlfY2koY2ksIHMpOworCWVsc2UKKwkJZXJyID0gLUVOT0VOVDsKKworCXVwX3JlYWQoJmJuZXBfc2Vzc2lvbl9zZW0pOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGJuZXBfaW5pdCh2b2lkKQorewkKKwljaGFyIGZsdFs1MF0gPSAiIjsKKworCWwyY2FwX2xvYWQoKTsKKworI2lmZGVmIENPTkZJR19CVF9CTkVQX1BST1RPX0ZJTFRFUgorCXN0cmNhdChmbHQsICJwcm90b2NvbCAiKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0JUX0JORVBfTUNfRklMVEVSCisJc3RyY2F0KGZsdCwgIm11bHRpY2FzdCIpOworI2VuZGlmCisKKwlCVF9JTkZPKCJCTkVQIChFdGhlcm5ldCBFbXVsYXRpb24pIHZlciAlcyIsIFZFUlNJT04pOworCWlmIChmbHRbMF0pCisJCUJUX0lORk8oIkJORVAgZmlsdGVyczogJXMiLCBmbHQpOworCisJYm5lcF9zb2NrX2luaXQoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGJuZXBfZXhpdCh2b2lkKQoreworCWJuZXBfc29ja19jbGVhbnVwKCk7Cit9CisKK21vZHVsZV9pbml0KGJuZXBfaW5pdCk7Cittb2R1bGVfZXhpdChibmVwX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBMaWJhdWx0IDxkYXZpZC5saWJhdWx0QGludmVudGVsLmZyPiwgTWF4aW0gS3Jhc255YW5za3kgPG1heGtAcXVhbGNvbW0uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCbHVldG9vdGggQk5FUCB2ZXIgIiBWRVJTSU9OKTsKK01PRFVMRV9WRVJTSU9OKFZFUlNJT04pOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJidC1wcm90by00Iik7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2JuZXAvbmV0ZGV2LmMgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvbmV0ZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIxMjA0ZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9ibHVldG9vdGgvYm5lcC9uZXRkZXYuYwpAQCAtMCwwICsxLDI0NyBAQAorLyogCisgICBCTkVQIGltcGxlbWVudGF0aW9uIGZvciBMaW51eCBCbHVldG9vdGggc3RhY2sgKEJsdWVaKS4KKyAgIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEludmVudGVsIFN5c3RlbWVzCisgICBXcml0dGVuIDIwMDEtMjAwMiBieQorCUNs6W1lbnQgTW9yZWF1IDxjbGVtZW50Lm1vcmVhdUBpbnZlbnRlbC5mcj4KKwlEYXZpZCBMaWJhdWx0ICA8ZGF2aWQubGliYXVsdEBpbnZlbnRlbC5mcj4KKworICAgQ29weXJpZ2h0IChDKSAyMDAyIE1heGltIEtyYXNueWFuc2t5IDxtYXhrQHF1YWxjb21tLmNvbT4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBBTkQgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZCisgICBDTEFJTSwgT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUyAKKyAgIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiAKKyAgIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIAorICAgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworICAgQUxMIExJQUJJTElUWSwgSU5DTFVESU5HIExJQUJJTElUWSBGT1IgSU5GUklOR0VNRU5UIE9GIEFOWSBQQVRFTlRTLCAKKyAgIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLCBSRUxBVElORyBUTyBVU0UgT0YgVEhJUyAKKyAgIFNPRlRXQVJFIElTIERJU0NMQUlNRUQuCisqLworCisvKgorICogJElkOiBuZXRkZXYuYyx2IDEuOCAyMDAyLzA4LzA0IDIxOjIzOjU4IG1heGsgRXhwICQKKyAqLyAKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisKKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2wyY2FwLmg+CisKKyNpbmNsdWRlICJibmVwLmgiCisKKyNpZm5kZWYgQ09ORklHX0JUX0JORVBfREVCVUcKKyN1bmRlZiAgQlRfREJHCisjZGVmaW5lIEJUX0RCRyggQS4uLiApCisjZW5kaWYKKworI2RlZmluZSBCTkVQX1RYX1FVRVVFX0xFTiAyMAorCitzdGF0aWMgaW50IGJuZXBfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJuZXBfbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmJuZXBfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBibmVwX3Nlc3Npb24gKnMgPSBkZXYtPnByaXY7CisJcmV0dXJuICZzLT5zdGF0czsKK30KKworc3RhdGljIHZvaWQgYm5lcF9uZXRfc2V0X21jX2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyNpZmRlZiBDT05GSUdfQlRfQk5FUF9NQ19GSUxURVIKKwlzdHJ1Y3QgYm5lcF9zZXNzaW9uICpzID0gZGV2LT5wcml2OworCXN0cnVjdCBzb2NrICpzayA9IHMtPnNvY2stPnNrOworCXN0cnVjdCBibmVwX3NldF9maWx0ZXJfcmVxICpyOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHNpemU7CisKKwlCVF9EQkcoIiVzIG1jX2NvdW50ICVkIiwgZGV2LT5uYW1lLCBkZXYtPm1jX2NvdW50KTsKKworCXNpemUgPSBzaXplb2YoKnIpICsgKEJORVBfTUFYX01VTFRJQ0FTVF9GSUxURVJTICsgMSkgKiBFVEhfQUxFTiAqIDI7CisJc2tiICA9IGFsbG9jX3NrYihzaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikgeworCQlCVF9FUlIoIiVzIE11bHRpY2FzdCBsaXN0IGFsbG9jYXRpb24gZmFpbGVkIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCXIgPSAodm9pZCAqKSBza2ItPmRhdGE7CisJX19za2JfcHV0KHNrYiwgc2l6ZW9mKCpyKSk7CisKKwlyLT50eXBlID0gQk5FUF9DT05UUk9MOworCXItPmN0cmwgPSBCTkVQX0ZJTFRFUl9NVUxUSV9BRERSX1NFVDsKKworICAgICAgICBpZiAoZGV2LT5mbGFncyAmIChJRkZfUFJPTUlTQyB8IElGRl9BTExNVUxUSSkpIHsKKwkJdTggc3RhcnRbRVRIX0FMRU5dID0geyAweDAxIH07CisKKwkJLyogUmVxdWVzdCBhbGwgYWRkcmVzc2VzICovCisJCW1lbWNweShfX3NrYl9wdXQoc2tiLCBFVEhfQUxFTiksIHN0YXJ0LCBFVEhfQUxFTik7CisJCW1lbWNweShfX3NrYl9wdXQoc2tiLCBFVEhfQUxFTiksIGRldi0+YnJvYWRjYXN0LCBFVEhfQUxFTik7CisJCXItPmxlbiA9IGh0b25zKEVUSF9BTEVOICogMik7CisJfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSA9IGRldi0+bWNfbGlzdDsKKwkJaW50IGksIGxlbiA9IHNrYi0+bGVuOworCisJCWlmIChkZXYtPmZsYWdzICYgSUZGX0JST0FEQ0FTVCkgeworCQkJbWVtY3B5KF9fc2tiX3B1dChza2IsIEVUSF9BTEVOKSwgZGV2LT5icm9hZGNhc3QsIEVUSF9BTEVOKTsKKwkJCW1lbWNweShfX3NrYl9wdXQoc2tiLCBFVEhfQUxFTiksIGRldi0+YnJvYWRjYXN0LCBFVEhfQUxFTik7CisJCX0JCisJCQorCQkvKiBGSVhNRTogV2Ugc2hvdWxkIGdyb3VwIGFkZHJlc3NlcyBoZXJlLiAqLworCisJCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50ICYmIGkgPCBCTkVQX01BWF9NVUxUSUNBU1RfRklMVEVSUzsgaSsrKSB7CisJCQltZW1jcHkoX19za2JfcHV0KHNrYiwgRVRIX0FMRU4pLCBkbWktPmRtaV9hZGRyLCBFVEhfQUxFTik7CisJCQltZW1jcHkoX19za2JfcHV0KHNrYiwgRVRIX0FMRU4pLCBkbWktPmRtaV9hZGRyLCBFVEhfQUxFTik7CisJCQlkbWkgPSBkbWktPm5leHQ7CisJCX0KKwkJci0+bGVuID0gaHRvbnMoc2tiLT5sZW4gLSBsZW4pOworCX0KKworCXNrYl9xdWV1ZV90YWlsKCZzay0+c2tfd3JpdGVfcXVldWUsIHNrYik7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKHNrLT5za19zbGVlcCk7CisjZW5kaWYKK30KKworc3RhdGljIGludCBibmVwX25ldF9zZXRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYXJnKQoreworCUJUX0RCRygiJXMiLCBkZXYtPm5hbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBibmVwX25ldF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJQlRfREJHKCJuZXRfdGltZW91dCIpOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludCBibmVwX25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworI2lmZGVmIENPTkZJR19CVF9CTkVQX01DX0ZJTFRFUgorc3RhdGljIGlubGluZSBpbnQgYm5lcF9uZXRfbWNfZmlsdGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBibmVwX3Nlc3Npb24gKnMpCit7CisJc3RydWN0IGV0aGhkciAqZWggPSAodm9pZCAqKSBza2ItPmRhdGE7CisKKwlpZiAoKGVoLT5oX2Rlc3RbMF0gJiAxKSAmJiAhdGVzdF9iaXQoYm5lcF9tY19oYXNoKGVoLT5oX2Rlc3QpLCAodWxvbmcgKikgJnMtPm1jX2ZpbHRlcikpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQlRfQk5FUF9QUk9UT19GSUxURVIKKy8qIERldGVybWluZSBldGhlciBwcm90b2NvbC4gQmFzZWQgb24gZXRoX3R5cGVfdHJhbnMuICovCitzdGF0aWMgaW5saW5lIHUxNiBibmVwX25ldF9ldGhfcHJvdG8oc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgZXRoaGRyICplaCA9ICh2b2lkICopIHNrYi0+ZGF0YTsKKwkKKwlpZiAobnRvaHMoZWgtPmhfcHJvdG8pID49IDE1MzYpCisJCXJldHVybiBlaC0+aF9wcm90bzsKKwkJCisJaWYgKGdldF91bmFsaWduZWQoKHUxNiAqKSBza2ItPmRhdGEpID09IDB4RkZGRikKKwkJcmV0dXJuIGh0b25zKEVUSF9QXzgwMl8zKTsKKwkJCisJcmV0dXJuIGh0b25zKEVUSF9QXzgwMl8yKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYm5lcF9uZXRfcHJvdG9fZmlsdGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBibmVwX3Nlc3Npb24gKnMpCit7CisJdTE2IHByb3RvID0gYm5lcF9uZXRfZXRoX3Byb3RvKHNrYik7CisJc3RydWN0IGJuZXBfcHJvdG9fZmlsdGVyICpmID0gcy0+cHJvdG9fZmlsdGVyOworCWludCBpOworCQorCWZvciAoaSA9IDA7IGkgPCBCTkVQX01BWF9QUk9UT19GSUxURVJTICYmIGZbaV0uZW5kOyBpKyspIHsKKwkJaWYgKHByb3RvID49IGZbaV0uc3RhcnQgJiYgcHJvdG8gPD0gZltpXS5lbmQpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlCVF9EQkcoIkJORVA6IGZpbHRlcmVkIHNrYiAlcCwgcHJvdG8gMHglLjR4Iiwgc2tiLCBwcm90byk7CisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBibmVwX25ldF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJuZXBfc2Vzc2lvbiAqcyA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzLT5zb2NrLT5zazsKKworCUJUX0RCRygic2tiICVwLCBkZXYgJXAiLCBza2IsIGRldik7CisKKyNpZmRlZiBDT05GSUdfQlRfQk5FUF9NQ19GSUxURVIKKwlpZiAoYm5lcF9uZXRfbWNfZmlsdGVyKHNrYiwgcykpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCQorI2lmZGVmIENPTkZJR19CVF9CTkVQX1BST1RPX0ZJTFRFUgorCWlmIChibmVwX25ldF9wcm90b19maWx0ZXIoc2tiLCBzKSkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisJCisJLyoKKwkgKiBXZSBjYW5ub3Qgc2VuZCBMMkNBUCBwYWNrZXRzIGZyb20gaGVyZSBhcyB3ZSBhcmUgcG90ZW50aWFsbHkgaW4gYSBiaC4KKwkgKiBTbyB3ZSBoYXZlIHRvIHF1ZXVlIHRoZW0gYW5kIHdha2UgdXAgc2Vzc2lvbiB0aHJlYWQgd2hpY2ggaXMgc2xlZXBpbmcKKwkgKiBvbiB0aGUgc2stPnNrX3NsZWVwLgorCSAqLworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXNrYl9xdWV1ZV90YWlsKCZzay0+c2tfd3JpdGVfcXVldWUsIHNrYik7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKHNrLT5za19zbGVlcCk7CisKKwlpZiAoc2tiX3F1ZXVlX2xlbigmc2stPnNrX3dyaXRlX3F1ZXVlKSA+PSBCTkVQX1RYX1FVRVVFX0xFTikgeworCQlCVF9EQkcoInR4IHF1ZXVlIGlzIGZ1bGwiKTsKKworCQkvKiBTdG9wIHF1ZXVpbmcuCisJCSAqIFNlc3Npb24gdGhyZWFkIHdpbGwgZG8gbmV0aWZfd2FrZV9xdWV1ZSgpICovCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBibmVwX25ldF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJbWVtc2V0KGRldi0+YnJvYWRjYXN0LCAweGZmLCBFVEhfQUxFTik7CisJZGV2LT5hZGRyX2xlbiA9IEVUSF9BTEVOOworCisJZXRoZXJfc2V0dXAoZGV2KTsKKworCWRldi0+b3BlbiAgICAgICAgICAgID0gYm5lcF9uZXRfb3BlbjsKKwlkZXYtPnN0b3AgICAgICAgICAgICA9IGJuZXBfbmV0X2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gYm5lcF9uZXRfeG1pdDsKKwlkZXYtPmdldF9zdGF0cyAgICAgICA9IGJuZXBfbmV0X2dldF9zdGF0czsKKwlkZXYtPmRvX2lvY3RsICAgICAgICA9IGJuZXBfbmV0X2lvY3RsOworCWRldi0+c2V0X21hY19hZGRyZXNzID0gYm5lcF9uZXRfc2V0X21hY19hZGRyOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gYm5lcF9uZXRfc2V0X21jX2xpc3Q7CisKKwlkZXYtPndhdGNoZG9nX3RpbWVvICA9IEhaICogMjsKKwlkZXYtPnR4X3RpbWVvdXQgICAgICA9IGJuZXBfbmV0X3RpbWVvdXQ7Cit9CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2JuZXAvc29jay5jIGIvbmV0L2JsdWV0b290aC9ibmVwL3NvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YThkOTlhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9ibmVwL3NvY2suYwpAQCAtMCwwICsxLDIzNyBAQAorLyogCisgICBCTkVQIGltcGxlbWVudGF0aW9uIGZvciBMaW51eCBCbHVldG9vdGggc3RhY2sgKEJsdWVaKS4KKyAgIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEludmVudGVsIFN5c3RlbWVzCisgICBXcml0dGVuIDIwMDEtMjAwMiBieQorCURhdmlkIExpYmF1bHQgIDxkYXZpZC5saWJhdWx0QGludmVudGVsLmZyPgorCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgTWF4aW0gS3Jhc255YW5za3kgPG1heGtAcXVhbGNvbW0uY29tPgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICAgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIFRISVJEIFBBUlRZIFJJR0hUUy4KKyAgIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIEFORCBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkKKyAgIENMQUlNLCBPUiBBTlkgU1BFQ0lBTCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIE9SIEFOWSBEQU1BR0VTIAorICAgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIAorICAgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgCisgICBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisgICBBTEwgTElBQklMSVRZLCBJTkNMVURJTkcgTElBQklMSVRZIEZPUiBJTkZSSU5HRU1FTlQgT0YgQU5ZIFBBVEVOVFMsIAorICAgQ09QWVJJR0hUUywgVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMsIFJFTEFUSU5HIFRPIFVTRSBPRiBUSElTIAorICAgU09GVFdBUkUgSVMgRElTQ0xBSU1FRC4KKyovCisKKy8qCisgKiAkSWQ6IHNvY2suYyx2IDEuNCAyMDAyLzA4LzA0IDIxOjIzOjU4IG1heGsgRXhwICQKKyAqLyAKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgImJuZXAuaCIKKworI2lmbmRlZiBDT05GSUdfQlRfQk5FUF9ERUJVRworI3VuZGVmICBCVF9EQkcKKyNkZWZpbmUgQlRfREJHKCBBLi4uICkKKyNlbmRpZgorCitzdGF0aWMgaW50IGJuZXBfc29ja19yZWxlYXNlKHN0cnVjdCBzb2NrZXQgKnNvY2spCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisKKwlCVF9EQkcoInNvY2sgJXAgc2sgJXAiLCBzb2NrLCBzayk7CisKKwlpZiAoIXNrKQorCQlyZXR1cm4gMDsKKworCXNvY2tfb3JwaGFuKHNrKTsKKwlzb2NrX3B1dChzayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYm5lcF9zb2NrX2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBibmVwX2Nvbm5saXN0X3JlcSBjbDsKKwlzdHJ1Y3QgYm5lcF9jb25uYWRkX3JlcSAgY2E7CisJc3RydWN0IGJuZXBfY29ubmRlbF9yZXEgIGNkOworCXN0cnVjdCBibmVwX2Nvbm5pbmZvIGNpOworCXN0cnVjdCBzb2NrZXQgKm5zb2NrOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBlcnI7CisKKwlCVF9EQkcoImNtZCAleCBhcmcgJWx4IiwgY21kLCBhcmcpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEJORVBDT05OQUREOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmNhLCBhcmdwLCBzaXplb2YoY2EpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQorCQluc29jayA9IHNvY2tmZF9sb29rdXAoY2Euc29jaywgJmVycik7CisJCWlmICghbnNvY2spCisJCQlyZXR1cm4gZXJyOworCisJCWlmIChuc29jay0+c2stPnNrX3N0YXRlICE9IEJUX0NPTk5FQ1RFRCkgeworCQkJZnB1dChuc29jay0+ZmlsZSk7CisJCQlyZXR1cm4gLUVCQURGRDsKKwkJfQorCisJCWVyciA9IGJuZXBfYWRkX2Nvbm5lY3Rpb24oJmNhLCBuc29jayk7CisJCWlmICghZXJyKSB7CisgICAgCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2EsIHNpemVvZihjYSkpKQorCQkJCWVyciA9IC1FRkFVTFQ7CisJCX0gZWxzZQorCQkJZnB1dChuc29jay0+ZmlsZSk7CisKKwkJcmV0dXJuIGVycjsKKwkKKwljYXNlIEJORVBDT05OREVMOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmNkLCBhcmdwLCBzaXplb2YoY2QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQorCQlyZXR1cm4gYm5lcF9kZWxfY29ubmVjdGlvbigmY2QpOworCisJY2FzZSBCTkVQR0VUQ09OTkxJU1Q6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2wsIGFyZ3AsIHNpemVvZihjbCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGNsLmNudW0gPD0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQorCQllcnIgPSBibmVwX2dldF9jb25ubGlzdCgmY2wpOworCQlpZiAoIWVyciAmJiBjb3B5X3RvX3VzZXIoYXJncCwgJmNsLCBzaXplb2YoY2wpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiBlcnI7CisKKwljYXNlIEJORVBHRVRDT05OSU5GTzoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjaSwgYXJncCwgc2l6ZW9mKGNpKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQllcnIgPSBibmVwX2dldF9jb25uaW5mbygmY2kpOworCQlpZiAoIWVyciAmJiBjb3B5X3RvX3VzZXIoYXJncCwgJmNpLCBzaXplb2YoY2kpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiBlcnI7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgYm5lcF9zb2NrX29wcyA9IHsKKwkuZmFtaWx5ICAgICA9IFBGX0JMVUVUT09USCwKKwkub3duZXIgICAgICA9IFRISVNfTU9EVUxFLAorCS5yZWxlYXNlICAgID0gYm5lcF9zb2NrX3JlbGVhc2UsCisJLmlvY3RsICAgICAgPSBibmVwX3NvY2tfaW9jdGwsCisJLmJpbmQgICAgICAgPSBzb2NrX25vX2JpbmQsCisJLmdldG5hbWUgICAgPSBzb2NrX25vX2dldG5hbWUsCisJLnNlbmRtc2cgICAgPSBzb2NrX25vX3NlbmRtc2csCisJLnJlY3Ztc2cgICAgPSBzb2NrX25vX3JlY3Ztc2csCisJLnBvbGwgICAgICAgPSBzb2NrX25vX3BvbGwsCisJLmxpc3RlbiAgICAgPSBzb2NrX25vX2xpc3RlbiwKKwkuc2h1dGRvd24gICA9IHNvY2tfbm9fc2h1dGRvd24sCisJLnNldHNvY2tvcHQgPSBzb2NrX25vX3NldHNvY2tvcHQsCisJLmdldHNvY2tvcHQgPSBzb2NrX25vX2dldHNvY2tvcHQsCisJLmNvbm5lY3QgICAgPSBzb2NrX25vX2Nvbm5lY3QsCisJLnNvY2tldHBhaXIgPSBzb2NrX25vX3NvY2tldHBhaXIsCisJLmFjY2VwdCAgICAgPSBzb2NrX25vX2FjY2VwdCwKKwkubW1hcCAgICAgICA9IHNvY2tfbm9fbW1hcAorfTsKKworc3RhdGljIHN0cnVjdCBwcm90byBibmVwX3Byb3RvID0geworCS5uYW1lCQk9ICJCTkVQIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9ial9zaXplCT0gc2l6ZW9mKHN0cnVjdCBidF9zb2NrKQorfTsKKworc3RhdGljIGludCBibmVwX3NvY2tfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlCVF9EQkcoInNvY2sgJXAiLCBzb2NrKTsKKworCWlmIChzb2NrLT50eXBlICE9IFNPQ0tfUkFXKQorCQlyZXR1cm4gLUVTT0NLVE5PU1VQUE9SVDsKKworCXNrID0gc2tfYWxsb2MoUEZfQkxVRVRPT1RILCBHRlBfS0VSTkVMLCAmYm5lcF9wcm90bywgMSk7CisJaWYgKCFzaykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CisKKwlzb2NrLT5vcHMgPSAmYm5lcF9zb2NrX29wczsKKworCXNvY2stPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7CisKKwlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKworCXNrLT5za19wcm90b2NvbCA9IHByb3RvY29sOworCXNrLT5za19zdGF0ZQk9IEJUX09QRU47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5IGJuZXBfc29ja19mYW1pbHlfb3BzID0geworCS5mYW1pbHkgPSBQRl9CTFVFVE9PVEgsCisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmNyZWF0ZSA9IGJuZXBfc29ja19jcmVhdGUKK307CisKK2ludCBfX2luaXQgYm5lcF9zb2NrX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcHJvdG9fcmVnaXN0ZXIoJmJuZXBfcHJvdG8sIDApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gYnRfc29ja19yZWdpc3RlcihCVFBST1RPX0JORVAsICZibmVwX3NvY2tfZmFtaWx5X29wcyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJQlRfRVJSKCJDYW4ndCByZWdpc3RlciBCTkVQIHNvY2tldCIpOworCXByb3RvX3VucmVnaXN0ZXIoJmJuZXBfcHJvdG8pOworCXJldHVybiBlcnI7Cit9CisKK2ludCBfX2V4aXQgYm5lcF9zb2NrX2NsZWFudXAodm9pZCkKK3sKKwlpZiAoYnRfc29ja191bnJlZ2lzdGVyKEJUUFJPVE9fQk5FUCkgPCAwKQorCQlCVF9FUlIoIkNhbid0IHVucmVnaXN0ZXIgQk5FUCBzb2NrZXQiKTsKKworCXByb3RvX3VucmVnaXN0ZXIoJmJuZXBfcHJvdG8pOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2NtdHAvS2NvbmZpZyBiL25ldC9ibHVldG9vdGgvY210cC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YjAzODIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYmx1ZXRvb3RoL2NtdHAvS2NvbmZpZwpAQCAtMCwwICsxLDExIEBACitjb25maWcgQlRfQ01UUAorCXRyaXN0YXRlICJDTVRQIHByb3RvY29sIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBCVCAmJiBCVF9MMkNBUCAmJiBJU0ROX0NBUEkKKwloZWxwCisJICBDTVRQIChDQVBJIE1lc3NhZ2UgVHJhbnNwb3J0IFByb3RvY29sKSBpcyBhIHRyYW5zcG9ydCBsYXllcgorCSAgZm9yIENBUEkgbWVzc2FnZXMuICBDTVRQIGlzIHJlcXVpcmVkIGZvciB0aGUgQmx1ZXRvb3RoIENvbW1vbgorCSAgSVNETiBBY2Nlc3MgUHJvZmlsZS4KKworCSAgU2F5IFkgaGVyZSB0byBjb21waWxlIENNVFAgc3VwcG9ydCBpbnRvIHRoZSBrZXJuZWwgb3Igc2F5IE0gdG8KKwkgIGNvbXBpbGUgaXQgYXMgbW9kdWxlIChjbXRwKS4KKwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9jbXRwL01ha2VmaWxlIGIvbmV0L2JsdWV0b290aC9jbXRwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MGE5YTUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYmx1ZXRvb3RoL2NtdHAvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggQmx1ZXRvb3RoIENNVFAgbGF5ZXIKKyMKKworb2JqLSQoQ09ORklHX0JUX0NNVFApICs9IGNtdHAubworCitjbXRwLW9ianMgOj0gY29yZS5vIHNvY2subyBjYXBpLm8KZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvY210cC9jYXBpLmMgYi9uZXQvYmx1ZXRvb3RoL2NtdHAvY2FwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNWMwMzAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYmx1ZXRvb3RoL2NtdHAvY2FwaS5jCkBAIC0wLDAgKzEsNjAwIEBACisvKiAKKyAgIENNVFAgaW1wbGVtZW50YXRpb24gZm9yIExpbnV4IEJsdWV0b290aCBzdGFjayAoQmx1ZVopLgorICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgTWFyY2VsIEhvbHRtYW5uIDxtYXJjZWxAaG9sdG1hbm4ub3JnPgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICAgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIFRISVJEIFBBUlRZIFJJR0hUUy4KKyAgIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIEFORCBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkKKyAgIENMQUlNLCBPUiBBTlkgU1BFQ0lBTCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIE9SIEFOWSBEQU1BR0VTIAorICAgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIAorICAgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgCisgICBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisgICBBTEwgTElBQklMSVRZLCBJTkNMVURJTkcgTElBQklMSVRZIEZPUiBJTkZSSU5HRU1FTlQgT0YgQU5ZIFBBVEVOVFMsIAorICAgQ09QWVJJR0hUUywgVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMsIFJFTEFUSU5HIFRPIFVTRSBPRiBUSElTIAorICAgU09GVFdBUkUgSVMgRElTQ0xBSU1FRC4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCisjaW5jbHVkZSA8bGludXgvaXNkbi9jYXBpbGxpLmg+CisjaW5jbHVkZSA8bGludXgvaXNkbi9jYXBpY21kLmg+CisjaW5jbHVkZSA8bGludXgvaXNkbi9jYXBpdXRpbC5oPgorCisjaW5jbHVkZSAiY210cC5oIgorCisjaWZuZGVmIENPTkZJR19CVF9DTVRQX0RFQlVHCisjdW5kZWYgIEJUX0RCRworI2RlZmluZSBCVF9EQkcoRC4uLikKKyNlbmRpZgorCisjZGVmaW5lIENBUElfSU5URVJPUEVSQUJJTElUWQkJMHgyMAorCisjZGVmaW5lIENBUElfSU5URVJPUEVSQUJJTElUWV9SRVEJQ0FQSUNNRChDQVBJX0lOVEVST1BFUkFCSUxJVFksIENBUElfUkVRKQorI2RlZmluZSBDQVBJX0lOVEVST1BFUkFCSUxJVFlfQ09ORglDQVBJQ01EKENBUElfSU5URVJPUEVSQUJJTElUWSwgQ0FQSV9DT05GKQorI2RlZmluZSBDQVBJX0lOVEVST1BFUkFCSUxJVFlfSU5ECUNBUElDTUQoQ0FQSV9JTlRFUk9QRVJBQklMSVRZLCBDQVBJX0lORCkKKyNkZWZpbmUgQ0FQSV9JTlRFUk9QRVJBQklMSVRZX1JFU1AJQ0FQSUNNRChDQVBJX0lOVEVST1BFUkFCSUxJVFksIENBUElfUkVTUCkKKworI2RlZmluZSBDQVBJX0lOVEVST1BFUkFCSUxJVFlfUkVRX0xFTgkoQ0FQSV9NU0dfQkFTRUxFTiArIDIpCisjZGVmaW5lIENBUElfSU5URVJPUEVSQUJJTElUWV9DT05GX0xFTgkoQ0FQSV9NU0dfQkFTRUxFTiArIDQpCisjZGVmaW5lIENBUElfSU5URVJPUEVSQUJJTElUWV9JTkRfTEVOCShDQVBJX01TR19CQVNFTEVOICsgMikKKyNkZWZpbmUgQ0FQSV9JTlRFUk9QRVJBQklMSVRZX1JFU1BfTEVOCShDQVBJX01TR19CQVNFTEVOICsgMikKKworI2RlZmluZSBDQVBJX0ZVTkNUSU9OX1JFR0lTVEVSCQkwCisjZGVmaW5lIENBUElfRlVOQ1RJT05fUkVMRUFTRQkJMQorI2RlZmluZSBDQVBJX0ZVTkNUSU9OX0dFVF9QUk9GSUxFCTIKKyNkZWZpbmUgQ0FQSV9GVU5DVElPTl9HRVRfTUFOVUZBQ1RVUkVSCTMKKyNkZWZpbmUgQ0FQSV9GVU5DVElPTl9HRVRfVkVSU0lPTgk0CisjZGVmaW5lIENBUElfRlVOQ1RJT05fR0VUX1NFUklBTF9OVU1CRVIJNQorI2RlZmluZSBDQVBJX0ZVTkNUSU9OX01BTlVGQUNUVVJFUgk2CisjZGVmaW5lIENBUElfRlVOQ1RJT05fTE9PUEJBQ0sJCTcKKworCisjZGVmaW5lIENNVFBfTVNHTlVNCTEKKyNkZWZpbmUgQ01UUF9BUFBMSUQJMgorI2RlZmluZSBDTVRQX01BUFBJTkcJMworCitzdGF0aWMgc3RydWN0IGNtdHBfYXBwbGljYXRpb24gKmNtdHBfYXBwbGljYXRpb25fYWRkKHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24sIF9fdTE2IGFwcGwpCit7CisJc3RydWN0IGNtdHBfYXBwbGljYXRpb24gKmFwcCA9IGttYWxsb2Moc2l6ZW9mKCphcHApLCBHRlBfS0VSTkVMKTsKKworCUJUX0RCRygic2Vzc2lvbiAlcCBhcHBsaWNhdGlvbiAlcCBhcHBsICVkIiwgc2Vzc2lvbiwgYXBwLCBhcHBsKTsKKworCWlmICghYXBwKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbXNldChhcHAsIDAsIHNpemVvZigqYXBwKSk7CisKKwlhcHAtPnN0YXRlID0gQlRfT1BFTjsKKwlhcHAtPmFwcGwgPSBhcHBsOworCisJbGlzdF9hZGRfdGFpbCgmYXBwLT5saXN0LCAmc2Vzc2lvbi0+YXBwbGljYXRpb25zKTsKKworCXJldHVybiBhcHA7Cit9CisKK3N0YXRpYyB2b2lkIGNtdHBfYXBwbGljYXRpb25fZGVsKHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24sIHN0cnVjdCBjbXRwX2FwcGxpY2F0aW9uICphcHApCit7CisJQlRfREJHKCJzZXNzaW9uICVwIGFwcGxpY2F0aW9uICVwIiwgc2Vzc2lvbiwgYXBwKTsKKworCWlmIChhcHApIHsKKwkJbGlzdF9kZWwoJmFwcC0+bGlzdCk7CisJCWtmcmVlKGFwcCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGNtdHBfYXBwbGljYXRpb24gKmNtdHBfYXBwbGljYXRpb25fZ2V0KHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24sIGludCBwYXR0ZXJuLCBfX3UxNiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgY210cF9hcHBsaWNhdGlvbiAqYXBwOworCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZzZXNzaW9uLT5hcHBsaWNhdGlvbnMpIHsKKwkJYXBwID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgY210cF9hcHBsaWNhdGlvbiwgbGlzdCk7CisJCXN3aXRjaCAocGF0dGVybikgeworCQljYXNlIENNVFBfTVNHTlVNOgorCQkJaWYgKGFwcC0+bXNnbnVtID09IHZhbHVlKQorCQkJCXJldHVybiBhcHA7CisJCQlicmVhazsKKwkJY2FzZSBDTVRQX0FQUExJRDoKKwkJCWlmIChhcHAtPmFwcGwgPT0gdmFsdWUpCisJCQkJcmV0dXJuIGFwcDsKKwkJCWJyZWFrOworCQljYXNlIENNVFBfTUFQUElORzoKKwkJCWlmIChhcHAtPm1hcHBpbmcgPT0gdmFsdWUpCisJCQkJcmV0dXJuIGFwcDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgY210cF9tc2dudW1fZ2V0KHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24pCit7CisJc2Vzc2lvbi0+bXNnbnVtKys7CisKKwlpZiAoKHNlc3Npb24tPm1zZ251bSAmIDB4ZmYpID4gMjAwKQorCQlzZXNzaW9uLT5tc2dudW0gPSBDTVRQX0lOSVRJQUxfTVNHTlVNICsgMTsKKworCXJldHVybiBzZXNzaW9uLT5tc2dudW07Cit9CisKK3N0YXRpYyB2b2lkIGNtdHBfc2VuZF9jYXBpbXNnKHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGNtdHBfc2NiICpzY2IgPSAodm9pZCAqKSBza2ItPmNiOworCisJQlRfREJHKCJzZXNzaW9uICVwIHNrYiAlcCBsZW4gJWQiLCBzZXNzaW9uLCBza2IsIHNrYi0+bGVuKTsKKworCXNjYi0+aWQgPSAtMTsKKwlzY2ItPmRhdGEgPSAoQ0FQSU1TR19DT01NQU5EKHNrYi0+ZGF0YSkgPT0gQ0FQSV9EQVRBX0IzKTsKKworCXNrYl9xdWV1ZV90YWlsKCZzZXNzaW9uLT50cmFuc21pdCwgc2tiKTsKKworCWNtdHBfc2NoZWR1bGUoc2Vzc2lvbik7Cit9CisKK3N0YXRpYyB2b2lkIGNtdHBfc2VuZF9pbnRlcm9wbXNnKHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24sCisJCQkJCV9fdTggc3ViY21kLCBfX3UxNiBhcHBsLCBfX3UxNiBtc2dudW0sCisJCQkJCV9fdTE2IGZ1bmN0aW9uLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBjaGFyICpzOworCisJQlRfREJHKCJzZXNzaW9uICVwIHN1YmNtZCAweCUwMnggYXBwbCAlZCBtc2dudW0gJWQiLCBzZXNzaW9uLCBzdWJjbWQsIGFwcGwsIG1zZ251bSk7CisKKwlpZiAoIShza2IgPSBhbGxvY19za2IoQ0FQSV9NU0dfQkFTRUxFTiArIDYgKyBsZW4sIEdGUF9BVE9NSUMpKSkgeworCQlCVF9FUlIoIkNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgaW50ZXJvcGVyYWJpbGl0eSBwYWNrZXQiKTsKKwkJcmV0dXJuOworCX0KKworCXMgPSBza2JfcHV0KHNrYiwgQ0FQSV9NU0dfQkFTRUxFTiArIDYgKyBsZW4pOworCisJY2FwaW1zZ19zZXR1MTYocywgMCwgQ0FQSV9NU0dfQkFTRUxFTiArIDYgKyBsZW4pOworCWNhcGltc2dfc2V0dTE2KHMsIDIsIGFwcGwpOworCWNhcGltc2dfc2V0dTggKHMsIDQsIENBUElfSU5URVJPUEVSQUJJTElUWSk7CisJY2FwaW1zZ19zZXR1OCAocywgNSwgc3ViY21kKTsKKwljYXBpbXNnX3NldHUxNihzLCA2LCBtc2dudW0pOworCisJLyogSW50ZXJvcGVyYWJpbGl0eSBzZWxlY3RvciAoQmx1ZXRvb3RoIERldmljZSBNYW5hZ2VtZW50KSAqLworCWNhcGltc2dfc2V0dTE2KHMsIDgsIDB4MDAwMSk7CisKKwljYXBpbXNnX3NldHU4IChzLCAxMCwgMyArIGxlbik7CisJY2FwaW1zZ19zZXR1MTYocywgMTEsIGZ1bmN0aW9uKTsKKwljYXBpbXNnX3NldHU4IChzLCAxMywgbGVuKTsKKworCWlmIChsZW4gPiAwKQorCQltZW1jcHkocyArIDE0LCBidWYsIGxlbik7CisKKwljbXRwX3NlbmRfY2FwaW1zZyhzZXNzaW9uLCBza2IpOworfQorCitzdGF0aWMgdm9pZCBjbXRwX3JlY3ZfaW50ZXJvcG1zZyhzdHJ1Y3QgY210cF9zZXNzaW9uICpzZXNzaW9uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBjYXBpX2N0ciAqY3RybCA9ICZzZXNzaW9uLT5jdHJsOworCXN0cnVjdCBjbXRwX2FwcGxpY2F0aW9uICphcHBsaWNhdGlvbjsKKwlfX3UxNiBhcHBsLCBtc2dudW0sIGZ1bmMsIGluZm87CisJX191MzIgY29udHJvbGxlcjsKKworCUJUX0RCRygic2Vzc2lvbiAlcCBza2IgJXAgbGVuICVkIiwgc2Vzc2lvbiwgc2tiLCBza2ItPmxlbik7CisKKwlzd2l0Y2ggKENBUElNU0dfU1VCQ09NTUFORChza2ItPmRhdGEpKSB7CisJY2FzZSBDQVBJX0NPTkY6CisJCWZ1bmMgPSBDQVBJTVNHX1UxNihza2ItPmRhdGEsIENBUElfTVNHX0JBU0VMRU4gKyA1KTsKKwkJaW5mbyA9IENBUElNU0dfVTE2KHNrYi0+ZGF0YSwgQ0FQSV9NU0dfQkFTRUxFTiArIDgpOworCisJCXN3aXRjaCAoZnVuYykgeworCQljYXNlIENBUElfRlVOQ1RJT05fUkVHSVNURVI6CisJCQltc2dudW0gPSBDQVBJTVNHX01TR0lEKHNrYi0+ZGF0YSk7CisKKwkJCWFwcGxpY2F0aW9uID0gY210cF9hcHBsaWNhdGlvbl9nZXQoc2Vzc2lvbiwgQ01UUF9NU0dOVU0sIG1zZ251bSk7CisJCQlpZiAoYXBwbGljYXRpb24pIHsKKwkJCQlhcHBsaWNhdGlvbi0+c3RhdGUgPSBCVF9DT05ORUNURUQ7CisJCQkJYXBwbGljYXRpb24tPm1zZ251bSA9IDA7CisJCQkJYXBwbGljYXRpb24tPm1hcHBpbmcgPSBDQVBJTVNHX0FQUElEKHNrYi0+ZGF0YSk7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZXNzaW9uLT53YWl0KTsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBDQVBJX0ZVTkNUSU9OX1JFTEVBU0U6CisJCQlhcHBsID0gQ0FQSU1TR19BUFBJRChza2ItPmRhdGEpOworCisJCQlhcHBsaWNhdGlvbiA9IGNtdHBfYXBwbGljYXRpb25fZ2V0KHNlc3Npb24sIENNVFBfTUFQUElORywgYXBwbCk7CisJCQlpZiAoYXBwbGljYXRpb24pIHsKKwkJCQlhcHBsaWNhdGlvbi0+c3RhdGUgPSBCVF9DTE9TRUQ7CisJCQkJYXBwbGljYXRpb24tPm1zZ251bSA9IDA7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZXNzaW9uLT53YWl0KTsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBDQVBJX0ZVTkNUSU9OX0dFVF9QUk9GSUxFOgorCQkJY29udHJvbGxlciA9IENBUElNU0dfVTE2KHNrYi0+ZGF0YSwgQ0FQSV9NU0dfQkFTRUxFTiArIDExKTsKKwkJCW1zZ251bSA9IENBUElNU0dfTVNHSUQoc2tiLT5kYXRhKTsKKworCQkJaWYgKCFpbmZvICYmIChtc2dudW0gPT0gQ01UUF9JTklUSUFMX01TR05VTSkpIHsKKwkJCQlzZXNzaW9uLT5uY29udHJvbGxlciA9IGNvbnRyb2xsZXI7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZXNzaW9uLT53YWl0KTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKCFpbmZvICYmIGN0cmwpIHsKKwkJCQltZW1jcHkoJmN0cmwtPnByb2ZpbGUsCisJCQkJCXNrYi0+ZGF0YSArIENBUElfTVNHX0JBU0VMRU4gKyAxMSwKKwkJCQkJc2l6ZW9mKGNhcGlfcHJvZmlsZSkpOworCQkJCXNlc3Npb24tPnN0YXRlID0gQlRfQ09OTkVDVEVEOworCQkJCWNhcGlfY3RyX3JlYWR5KGN0cmwpOworCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIENBUElfRlVOQ1RJT05fR0VUX01BTlVGQUNUVVJFUjoKKwkJCWNvbnRyb2xsZXIgPSBDQVBJTVNHX1UzMihza2ItPmRhdGEsIENBUElfTVNHX0JBU0VMRU4gKyAxMCk7CisKKwkJCWlmICghaW5mbyAmJiBjdHJsKSB7CisJCQkJc3RybmNweShjdHJsLT5tYW51LAorCQkJCQlza2ItPmRhdGEgKyBDQVBJX01TR19CQVNFTEVOICsgMTUsCisJCQkJCXNrYi0+ZGF0YVtDQVBJX01TR19CQVNFTEVOICsgMTRdKTsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBDQVBJX0ZVTkNUSU9OX0dFVF9WRVJTSU9OOgorCQkJY29udHJvbGxlciA9IENBUElNU0dfVTMyKHNrYi0+ZGF0YSwgQ0FQSV9NU0dfQkFTRUxFTiArIDEyKTsKKworCQkJaWYgKCFpbmZvICYmIGN0cmwpIHsKKwkJCQljdHJsLT52ZXJzaW9uLm1ham9ydmVyc2lvbiA9IENBUElNU0dfVTMyKHNrYi0+ZGF0YSwgQ0FQSV9NU0dfQkFTRUxFTiArIDE2KTsKKwkJCQljdHJsLT52ZXJzaW9uLm1pbm9ydmVyc2lvbiA9IENBUElNU0dfVTMyKHNrYi0+ZGF0YSwgQ0FQSV9NU0dfQkFTRUxFTiArIDIwKTsKKwkJCQljdHJsLT52ZXJzaW9uLm1ham9ybWFudXZlcnNpb24gPSBDQVBJTVNHX1UzMihza2ItPmRhdGEsIENBUElfTVNHX0JBU0VMRU4gKyAyNCk7CisJCQkJY3RybC0+dmVyc2lvbi5taW5vcm1hbnV2ZXJzaW9uID0gQ0FQSU1TR19VMzIoc2tiLT5kYXRhLCBDQVBJX01TR19CQVNFTEVOICsgMjgpOworCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIENBUElfRlVOQ1RJT05fR0VUX1NFUklBTF9OVU1CRVI6CisJCQljb250cm9sbGVyID0gQ0FQSU1TR19VMzIoc2tiLT5kYXRhLCBDQVBJX01TR19CQVNFTEVOICsgMTIpOworCisJCQlpZiAoIWluZm8gJiYgY3RybCkgeworCQkJCW1lbXNldChjdHJsLT5zZXJpYWwsIDAsIENBUElfU0VSSUFMX0xFTik7CisJCQkJc3RybmNweShjdHJsLT5zZXJpYWwsCisJCQkJCXNrYi0+ZGF0YSArIENBUElfTVNHX0JBU0VMRU4gKyAxNywKKwkJCQkJc2tiLT5kYXRhW0NBUElfTVNHX0JBU0VMRU4gKyAxNl0pOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBDQVBJX0lORDoKKwkJZnVuYyA9IENBUElNU0dfVTE2KHNrYi0+ZGF0YSwgQ0FQSV9NU0dfQkFTRUxFTiArIDMpOworCisJCWlmIChmdW5jID09IENBUElfRlVOQ1RJT05fTE9PUEJBQ0spIHsKKwkJCWFwcGwgPSBDQVBJTVNHX0FQUElEKHNrYi0+ZGF0YSk7CisJCQltc2dudW0gPSBDQVBJTVNHX01TR0lEKHNrYi0+ZGF0YSk7CisJCQljbXRwX3NlbmRfaW50ZXJvcG1zZyhzZXNzaW9uLCBDQVBJX1JFU1AsIGFwcGwsIG1zZ251bSwgZnVuYywKKwkJCQkJCXNrYi0+ZGF0YSArIENBUElfTVNHX0JBU0VMRU4gKyA2LAorCQkJCQkJc2tiLT5kYXRhW0NBUElfTVNHX0JBU0VMRU4gKyA1XSk7CisJCX0KKworCQlicmVhazsKKwl9CisKKwlrZnJlZV9za2Ioc2tiKTsKK30KKwordm9pZCBjbXRwX3JlY3ZfY2FwaW1zZyhzdHJ1Y3QgY210cF9zZXNzaW9uICpzZXNzaW9uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBjYXBpX2N0ciAqY3RybCA9ICZzZXNzaW9uLT5jdHJsOworCXN0cnVjdCBjbXRwX2FwcGxpY2F0aW9uICphcHBsaWNhdGlvbjsKKwlfX3UxNiBjbWQsIGFwcGw7CisJX191MzIgY29udHI7CisKKwlCVF9EQkcoInNlc3Npb24gJXAgc2tiICVwIGxlbiAlZCIsIHNlc3Npb24sIHNrYiwgc2tiLT5sZW4pOworCisJaWYgKENBUElNU0dfQ09NTUFORChza2ItPmRhdGEpID09IENBUElfSU5URVJPUEVSQUJJTElUWSkgeworCQljbXRwX3JlY3ZfaW50ZXJvcG1zZyhzZXNzaW9uLCBza2IpOworCQlyZXR1cm47CisJfQorCisJaWYgKHNlc3Npb24tPmZsYWdzICYgKDEgPDwgQ01UUF9MT09QQkFDSykpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisKKwljbWQgPSBDQVBJQ01EKENBUElNU0dfQ09NTUFORChza2ItPmRhdGEpLCBDQVBJTVNHX1NVQkNPTU1BTkQoc2tiLT5kYXRhKSk7CisJYXBwbCA9IENBUElNU0dfQVBQSUQoc2tiLT5kYXRhKTsKKwljb250ciA9IENBUElNU0dfQ09OVFJPTChza2ItPmRhdGEpOworCisJYXBwbGljYXRpb24gPSBjbXRwX2FwcGxpY2F0aW9uX2dldChzZXNzaW9uLCBDTVRQX01BUFBJTkcsIGFwcGwpOworCWlmIChhcHBsaWNhdGlvbikgeworCQlhcHBsID0gYXBwbGljYXRpb24tPmFwcGw7CisJCUNBUElNU0dfU0VUQVBQSUQoc2tiLT5kYXRhLCBhcHBsKTsKKwl9IGVsc2UgeworCQlCVF9FUlIoIkNhbid0IGZpbmQgYXBwbGljYXRpb24gd2l0aCBpZCAlZCIsIGFwcGwpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgoY29udHIgJiAweDdmKSA9PSAweDAxKSB7CisJCWNvbnRyID0gKGNvbnRyICYgMHhmZmZmZmY4MCkgfCBzZXNzaW9uLT5udW07CisJCUNBUElNU0dfU0VUQ09OVFJPTChza2ItPmRhdGEsIGNvbnRyKTsKKwl9CisKKwlpZiAoIWN0cmwpIHsKKwkJQlRfRVJSKCJDYW4ndCBmaW5kIGNvbnRyb2xsZXIgJWQgZm9yIG1lc3NhZ2UiLCBzZXNzaW9uLT5udW0pOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKworCWNhcGlfY3RyX2hhbmRsZV9tZXNzYWdlKGN0cmwsIGFwcGwsIHNrYik7Cit9CisKK3N0YXRpYyBpbnQgY210cF9sb2FkX2Zpcm13YXJlKHN0cnVjdCBjYXBpX2N0ciAqY3RybCwgY2FwaWxvYWRkYXRhICpkYXRhKQoreworCUJUX0RCRygiY3RybCAlcCBkYXRhICVwIiwgY3RybCwgZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY210cF9yZXNldF9jdHIoc3RydWN0IGNhcGlfY3RyICpjdHJsKQoreworCXN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24gPSBjdHJsLT5kcml2ZXJkYXRhOworCisJQlRfREJHKCJjdHJsICVwIiwgY3RybCk7CisKKwljYXBpX2N0cl9yZXNldGVkKGN0cmwpOworCisJYXRvbWljX2luYygmc2Vzc2lvbi0+dGVybWluYXRlKTsKKwljbXRwX3NjaGVkdWxlKHNlc3Npb24pOworfQorCitzdGF0aWMgdm9pZCBjbXRwX3JlZ2lzdGVyX2FwcGwoc3RydWN0IGNhcGlfY3RyICpjdHJsLCBfX3UxNiBhcHBsLCBjYXBpX3JlZ2lzdGVyX3BhcmFtcyAqcnApCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3RydWN0IGNtdHBfc2Vzc2lvbiAqc2Vzc2lvbiA9IGN0cmwtPmRyaXZlcmRhdGE7CisJc3RydWN0IGNtdHBfYXBwbGljYXRpb24gKmFwcGxpY2F0aW9uOworCXVuc2lnbmVkIGxvbmcgdGltZW8gPSBDTVRQX0lOVEVST1BfVElNRU9VVDsKKwl1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKKwlpbnQgZXJyID0gMCwgbmNvbm4sIHdhbnQgPSBycC0+bGV2ZWwzY250OworCisJQlRfREJHKCJjdHJsICVwIGFwcGwgJWQgbGV2ZWwzY250ICVkIGRhdGFibGtjbnQgJWQgZGF0YWJsa2xlbiAlZCIsCisJCWN0cmwsIGFwcGwsIHJwLT5sZXZlbDNjbnQsIHJwLT5kYXRhYmxrY250LCBycC0+ZGF0YWJsa2xlbik7CisKKwlhcHBsaWNhdGlvbiA9IGNtdHBfYXBwbGljYXRpb25fYWRkKHNlc3Npb24sIGFwcGwpOworCWlmICghYXBwbGljYXRpb24pIHsKKwkJQlRfRVJSKCJDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIG5ldyBhcHBsaWNhdGlvbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKHdhbnQgPCAwKQorCQluY29ubiA9IGN0cmwtPnByb2ZpbGUubmJjaGFubmVsICogLXdhbnQ7CisJZWxzZQorCQluY29ubiA9IHdhbnQ7CisKKwlpZiAobmNvbm4gPT0gMCkKKwkJbmNvbm4gPSBjdHJsLT5wcm9maWxlLm5iY2hhbm5lbDsKKworCWNhcGltc2dfc2V0dTE2KGJ1ZiwgMCwgbmNvbm4pOworCWNhcGltc2dfc2V0dTE2KGJ1ZiwgMiwgcnAtPmRhdGFibGtjbnQpOworCWNhcGltc2dfc2V0dTE2KGJ1ZiwgNCwgcnAtPmRhdGFibGtsZW4pOworCisJYXBwbGljYXRpb24tPnN0YXRlID0gQlRfQ09ORklHOworCWFwcGxpY2F0aW9uLT5tc2dudW0gPSBjbXRwX21zZ251bV9nZXQoc2Vzc2lvbik7CisKKwljbXRwX3NlbmRfaW50ZXJvcG1zZyhzZXNzaW9uLCBDQVBJX1JFUSwgMHgwMDAwLCBhcHBsaWNhdGlvbi0+bXNnbnVtLAorCQkJCUNBUElfRlVOQ1RJT05fUkVHSVNURVIsIGJ1ZiwgNik7CisKKwlhZGRfd2FpdF9xdWV1ZSgmc2Vzc2lvbi0+d2FpdCwgJndhaXQpOworCXdoaWxlICgxKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJaWYgKCF0aW1lbykgeworCQkJZXJyID0gLUVBR0FJTjsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGFwcGxpY2F0aW9uLT5zdGF0ZSA9PSBCVF9DTE9TRUQpIHsKKwkJCWVyciA9IC1hcHBsaWNhdGlvbi0+ZXJyOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoYXBwbGljYXRpb24tPnN0YXRlID09IEJUX0NPTk5FQ1RFRCkKKwkJCWJyZWFrOworCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJZXJyID0gLUVJTlRSOworCQkJYnJlYWs7CisJCX0KKworCQl0aW1lbyA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW8pOworCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZzZXNzaW9uLT53YWl0LCAmd2FpdCk7CisKKwlpZiAoZXJyKSB7CisJCWNtdHBfYXBwbGljYXRpb25fZGVsKHNlc3Npb24sIGFwcGxpY2F0aW9uKTsKKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIHZvaWQgY210cF9yZWxlYXNlX2FwcGwoc3RydWN0IGNhcGlfY3RyICpjdHJsLCBfX3UxNiBhcHBsKQoreworCXN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24gPSBjdHJsLT5kcml2ZXJkYXRhOworCXN0cnVjdCBjbXRwX2FwcGxpY2F0aW9uICphcHBsaWNhdGlvbjsKKworCUJUX0RCRygiY3RybCAlcCBhcHBsICVkIiwgY3RybCwgYXBwbCk7CisKKwlhcHBsaWNhdGlvbiA9IGNtdHBfYXBwbGljYXRpb25fZ2V0KHNlc3Npb24sIENNVFBfQVBQTElELCBhcHBsKTsKKwlpZiAoIWFwcGxpY2F0aW9uKSB7CisJCUJUX0VSUigiQ2FuJ3QgZmluZCBhcHBsaWNhdGlvbiIpOworCQlyZXR1cm47CisJfQorCisJYXBwbGljYXRpb24tPm1zZ251bSA9IGNtdHBfbXNnbnVtX2dldChzZXNzaW9uKTsKKworCWNtdHBfc2VuZF9pbnRlcm9wbXNnKHNlc3Npb24sIENBUElfUkVRLCBhcHBsaWNhdGlvbi0+bWFwcGluZywgYXBwbGljYXRpb24tPm1zZ251bSwKKwkJCQlDQVBJX0ZVTkNUSU9OX1JFTEVBU0UsIE5VTEwsIDApOworCisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoc2Vzc2lvbi0+d2FpdCwKKwkJCShhcHBsaWNhdGlvbi0+c3RhdGUgPT0gQlRfQ0xPU0VEKSwgQ01UUF9JTlRFUk9QX1RJTUVPVVQpOworCisJY210cF9hcHBsaWNhdGlvbl9kZWwoc2Vzc2lvbiwgYXBwbGljYXRpb24pOworfQorCitzdGF0aWMgdTE2IGNtdHBfc2VuZF9tZXNzYWdlKHN0cnVjdCBjYXBpX2N0ciAqY3RybCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgY210cF9zZXNzaW9uICpzZXNzaW9uID0gY3RybC0+ZHJpdmVyZGF0YTsKKwlzdHJ1Y3QgY210cF9hcHBsaWNhdGlvbiAqYXBwbGljYXRpb247CisJX191MTYgYXBwbDsKKwlfX3UzMiBjb250cjsKKworCUJUX0RCRygiY3RybCAlcCBza2IgJXAiLCBjdHJsLCBza2IpOworCisJYXBwbCA9IENBUElNU0dfQVBQSUQoc2tiLT5kYXRhKTsKKwljb250ciA9IENBUElNU0dfQ09OVFJPTChza2ItPmRhdGEpOworCisJYXBwbGljYXRpb24gPSBjbXRwX2FwcGxpY2F0aW9uX2dldChzZXNzaW9uLCBDTVRQX0FQUExJRCwgYXBwbCk7CisJaWYgKCghYXBwbGljYXRpb24pIHx8IChhcHBsaWNhdGlvbi0+c3RhdGUgIT0gQlRfQ09OTkVDVEVEKSkgeworCQlCVF9FUlIoIkNhbid0IGZpbmQgYXBwbGljYXRpb24gd2l0aCBpZCAlZCIsIGFwcGwpOworCQlyZXR1cm4gQ0FQSV9JTExBUFBOUjsKKwl9CisKKwlDQVBJTVNHX1NFVEFQUElEKHNrYi0+ZGF0YSwgYXBwbGljYXRpb24tPm1hcHBpbmcpOworCisJaWYgKChjb250ciAmIDB4N2YpID09IHNlc3Npb24tPm51bSkgeworCQljb250ciA9IChjb250ciAmIDB4ZmZmZmZmODApIHwgMHgwMTsKKwkJQ0FQSU1TR19TRVRDT05UUk9MKHNrYi0+ZGF0YSwgY29udHIpOworCX0KKworCWNtdHBfc2VuZF9jYXBpbXNnKHNlc3Npb24sIHNrYik7CisKKwlyZXR1cm4gQ0FQSV9OT0VSUk9SOworfQorCitzdGF0aWMgY2hhciAqY210cF9wcm9jaW5mbyhzdHJ1Y3QgY2FwaV9jdHIgKmN0cmwpCit7CisJcmV0dXJuICJDQVBJIE1lc3NhZ2UgVHJhbnNwb3J0IFByb3RvY29sIjsKK30KKworc3RhdGljIGludCBjbXRwX2N0cl9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHN0cnVjdCBjYXBpX2N0ciAqY3RybCkKK3sKKwlzdHJ1Y3QgY210cF9zZXNzaW9uICpzZXNzaW9uID0gY3RybC0+ZHJpdmVyZGF0YTsKKwlzdHJ1Y3QgY210cF9hcHBsaWNhdGlvbiAqYXBwOworCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOworCWludCBsZW4gPSAwOworCisJbGVuICs9IHNwcmludGYocGFnZSArIGxlbiwgIiVzXG5cbiIsIGNtdHBfcHJvY2luZm8oY3RybCkpOworCWxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJhZGRyICVzXG4iLCBzZXNzaW9uLT5uYW1lKTsKKwlsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCAiY3RybCAlZFxuIiwgc2Vzc2lvbi0+bnVtKTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShwLCBuLCAmc2Vzc2lvbi0+YXBwbGljYXRpb25zKSB7CisJCWFwcCA9IGxpc3RfZW50cnkocCwgc3RydWN0IGNtdHBfYXBwbGljYXRpb24sIGxpc3QpOworCQlsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCAiYXBwbCAlZCAtPiAlZFxuIiwgYXBwLT5hcHBsLCBhcHAtPm1hcHBpbmcpOworCX0KKworCWlmIChvZmYgKyBjb3VudCA+PSBsZW4pCisJCSplb2YgPSAxOworCisJaWYgKGxlbiA8IG9mZikKKwkJcmV0dXJuIDA7CisKKwkqc3RhcnQgPSBwYWdlICsgb2ZmOworCisJcmV0dXJuICgoY291bnQgPCBsZW4gLSBvZmYpID8gY291bnQgOiBsZW4gLSBvZmYpOworfQorCisKK2ludCBjbXRwX2F0dGFjaF9kZXZpY2Uoc3RydWN0IGNtdHBfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKKwlsb25nIHJldDsKKworCUJUX0RCRygic2Vzc2lvbiAlcCIsIHNlc3Npb24pOworCisJY2FwaW1zZ19zZXR1MzIoYnVmLCAwLCAwKTsKKworCWNtdHBfc2VuZF9pbnRlcm9wbXNnKHNlc3Npb24sIENBUElfUkVRLCAweGZmZmYsIENNVFBfSU5JVElBTF9NU0dOVU0sCisJCQkJQ0FQSV9GVU5DVElPTl9HRVRfUFJPRklMRSwgYnVmLCA0KTsKKworCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHNlc3Npb24tPndhaXQsCisJCQlzZXNzaW9uLT5uY29udHJvbGxlciwgQ01UUF9JTlRFUk9QX1RJTUVPVVQpOworCQorCUJUX0lORk8oIkZvdW5kICVkIENBUEkgY29udHJvbGxlcihzKSBvbiBkZXZpY2UgJXMiLCBzZXNzaW9uLT5uY29udHJvbGxlciwgc2Vzc2lvbi0+bmFtZSk7CisKKwlpZiAoIXJldCkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwlpZiAoIXNlc3Npb24tPm5jb250cm9sbGVyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChzZXNzaW9uLT5uY29udHJvbGxlciA+IDEpCisJCUJUX0lORk8oIlNldHRpbmcgdXAgb25seSBDQVBJIGNvbnRyb2xsZXIgMSIpOworCisJc2Vzc2lvbi0+Y3RybC5vd25lciAgICAgID0gVEhJU19NT0RVTEU7CisJc2Vzc2lvbi0+Y3RybC5kcml2ZXJkYXRhID0gc2Vzc2lvbjsKKwlzdHJjcHkoc2Vzc2lvbi0+Y3RybC5uYW1lLCBzZXNzaW9uLT5uYW1lKTsKKworCXNlc3Npb24tPmN0cmwuZHJpdmVyX25hbWUgICA9ICJjbXRwIjsKKwlzZXNzaW9uLT5jdHJsLmxvYWRfZmlybXdhcmUgPSBjbXRwX2xvYWRfZmlybXdhcmU7CisJc2Vzc2lvbi0+Y3RybC5yZXNldF9jdHIgICAgID0gY210cF9yZXNldF9jdHI7CisJc2Vzc2lvbi0+Y3RybC5yZWdpc3Rlcl9hcHBsID0gY210cF9yZWdpc3Rlcl9hcHBsOworCXNlc3Npb24tPmN0cmwucmVsZWFzZV9hcHBsICA9IGNtdHBfcmVsZWFzZV9hcHBsOworCXNlc3Npb24tPmN0cmwuc2VuZF9tZXNzYWdlICA9IGNtdHBfc2VuZF9tZXNzYWdlOworCisJc2Vzc2lvbi0+Y3RybC5wcm9jaW5mbyAgICAgID0gY210cF9wcm9jaW5mbzsKKwlzZXNzaW9uLT5jdHJsLmN0cl9yZWFkX3Byb2MgPSBjbXRwX2N0cl9yZWFkX3Byb2M7CisKKwlpZiAoYXR0YWNoX2NhcGlfY3RyKCZzZXNzaW9uLT5jdHJsKSA8IDApIHsKKwkJQlRfRVJSKCJDYW4ndCBhdHRhY2ggbmV3IGNvbnRyb2xsZXIiKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlzZXNzaW9uLT5udW0gPSBzZXNzaW9uLT5jdHJsLmNucjsKKworCUJUX0RCRygic2Vzc2lvbiAlcCBudW0gJWQiLCBzZXNzaW9uLCBzZXNzaW9uLT5udW0pOworCisJY2FwaW1zZ19zZXR1MzIoYnVmLCAwLCAxKTsKKworCWNtdHBfc2VuZF9pbnRlcm9wbXNnKHNlc3Npb24sIENBUElfUkVRLCAweGZmZmYsIGNtdHBfbXNnbnVtX2dldChzZXNzaW9uKSwKKwkJCQlDQVBJX0ZVTkNUSU9OX0dFVF9NQU5VRkFDVFVSRVIsIGJ1ZiwgNCk7CisKKwljbXRwX3NlbmRfaW50ZXJvcG1zZyhzZXNzaW9uLCBDQVBJX1JFUSwgMHhmZmZmLCBjbXRwX21zZ251bV9nZXQoc2Vzc2lvbiksCisJCQkJQ0FQSV9GVU5DVElPTl9HRVRfVkVSU0lPTiwgYnVmLCA0KTsKKworCWNtdHBfc2VuZF9pbnRlcm9wbXNnKHNlc3Npb24sIENBUElfUkVRLCAweGZmZmYsIGNtdHBfbXNnbnVtX2dldChzZXNzaW9uKSwKKwkJCQlDQVBJX0ZVTkNUSU9OX0dFVF9TRVJJQUxfTlVNQkVSLCBidWYsIDQpOworCisJY210cF9zZW5kX2ludGVyb3Btc2coc2Vzc2lvbiwgQ0FQSV9SRVEsIDB4ZmZmZiwgY210cF9tc2dudW1fZ2V0KHNlc3Npb24pLAorCQkJCUNBUElfRlVOQ1RJT05fR0VUX1BST0ZJTEUsIGJ1ZiwgNCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjbXRwX2RldGFjaF9kZXZpY2Uoc3RydWN0IGNtdHBfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKwlCVF9EQkcoInNlc3Npb24gJXAiLCBzZXNzaW9uKTsKKworCWRldGFjaF9jYXBpX2N0cigmc2Vzc2lvbi0+Y3RybCk7Cit9CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2NtdHAvY210cC5oIGIvbmV0L2JsdWV0b290aC9jbXRwL2NtdHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGUzZGZlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9jbXRwL2NtdHAuaApAQCAtMCwwICsxLDEzNSBAQAorLyogCisgICBDTVRQIGltcGxlbWVudGF0aW9uIGZvciBMaW51eCBCbHVldG9vdGggc3RhY2sgKEJsdWVaKS4KKyAgIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBBTkQgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZCisgICBDTEFJTSwgT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUyAKKyAgIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiAKKyAgIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIAorICAgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworICAgQUxMIExJQUJJTElUWSwgSU5DTFVESU5HIExJQUJJTElUWSBGT1IgSU5GUklOR0VNRU5UIE9GIEFOWSBQQVRFTlRTLCAKKyAgIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLCBSRUxBVElORyBUTyBVU0UgT0YgVEhJUyAKKyAgIFNPRlRXQVJFIElTIERJU0NMQUlNRUQuCisqLworCisjaWZuZGVmIF9fQ01UUF9ICisjZGVmaW5lIF9fQ01UUF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CisKKyNkZWZpbmUgQlROQU1TSVogMTgKKworLyogQ01UUCBpb2N0bCBkZWZpbmVzICovCisjZGVmaW5lIENNVFBDT05OQURECV9JT1coJ0MnLCAyMDAsIGludCkKKyNkZWZpbmUgQ01UUENPTk5ERUwJX0lPVygnQycsIDIwMSwgaW50KQorI2RlZmluZSBDTVRQR0VUQ09OTkxJU1QJX0lPUignQycsIDIxMCwgaW50KQorI2RlZmluZSBDTVRQR0VUQ09OTklORk8JX0lPUignQycsIDIxMSwgaW50KQorCisjZGVmaW5lIENNVFBfTE9PUEJBQ0sJMAorCitzdHJ1Y3QgY210cF9jb25uYWRkX3JlcSB7CisJaW50ICAgc29jazsJLy8gQ29ubmVjdGVkIHNvY2tldAorCV9fdTMyIGZsYWdzOworfTsKKworc3RydWN0IGNtdHBfY29ubmRlbF9yZXEgeworCWJkYWRkcl90IGJkYWRkcjsKKwlfX3UzMiAgICBmbGFnczsKK307CisKK3N0cnVjdCBjbXRwX2Nvbm5pbmZvIHsKKwliZGFkZHJfdCBiZGFkZHI7CisJX191MzIgICAgZmxhZ3M7CisJX191MTYgICAgc3RhdGU7CisJaW50ICAgICAgbnVtOworfTsKKworc3RydWN0IGNtdHBfY29ubmxpc3RfcmVxIHsKKwlfX3UzMiAgY251bTsKKwlzdHJ1Y3QgY210cF9jb25uaW5mbyBfX3VzZXIgKmNpOworfTsKKworaW50IGNtdHBfYWRkX2Nvbm5lY3Rpb24oc3RydWN0IGNtdHBfY29ubmFkZF9yZXEgKnJlcSwgc3RydWN0IHNvY2tldCAqc29jayk7CitpbnQgY210cF9kZWxfY29ubmVjdGlvbihzdHJ1Y3QgY210cF9jb25uZGVsX3JlcSAqcmVxKTsKK2ludCBjbXRwX2dldF9jb25ubGlzdChzdHJ1Y3QgY210cF9jb25ubGlzdF9yZXEgKnJlcSk7CitpbnQgY210cF9nZXRfY29ubmluZm8oc3RydWN0IGNtdHBfY29ubmluZm8gKmNpKTsKKworLyogQ01UUCBzZXNzaW9uIGRlZmluZXMgKi8KKyNkZWZpbmUgQ01UUF9JTlRFUk9QX1RJTUVPVVQJKEhaICogNSkKKyNkZWZpbmUgQ01UUF9JTklUSUFMX01TR05VTQkweGZmMDAKKworc3RydWN0IGNtdHBfc2Vzc2lvbiB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJc3RydWN0IHNvY2tldCAqc29jazsKKworCWJkYWRkcl90IGJkYWRkcjsKKworCXVuc2lnbmVkIGxvbmcgc3RhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXVpbnQgbXR1OworCisJY2hhciBuYW1lW0JUTkFNU0laXTsKKworCWF0b21pY190IHRlcm1pbmF0ZTsKKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CisKKwlpbnQgbmNvbnRyb2xsZXI7CisJaW50IG51bTsKKwlzdHJ1Y3QgY2FwaV9jdHIgY3RybDsKKworCXN0cnVjdCBsaXN0X2hlYWQgYXBwbGljYXRpb25zOworCisJdW5zaWduZWQgbG9uZyBibG9ja2lkczsKKwlpbnQgbXNnbnVtOworCisJc3RydWN0IHNrX2J1ZmZfaGVhZCB0cmFuc21pdDsKKworCXN0cnVjdCBza19idWZmICpyZWFzc2VtYmx5WzE2XTsKK307CisKK3N0cnVjdCBjbXRwX2FwcGxpY2F0aW9uIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwl1bnNpZ25lZCBsb25nIHN0YXRlOworCWludCBlcnI7CisKKwlfX3UxNiBhcHBsOworCV9fdTE2IG1hcHBpbmc7CisKKwlfX3UxNiBtc2dudW07Cit9OworCitzdHJ1Y3QgY210cF9zY2IgeworCWludCBpZDsKKwlpbnQgZGF0YTsKK307CisKK2ludCAgY210cF9hdHRhY2hfZGV2aWNlKHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24pOwordm9pZCBjbXRwX2RldGFjaF9kZXZpY2Uoc3RydWN0IGNtdHBfc2Vzc2lvbiAqc2Vzc2lvbik7CisKK3ZvaWQgY210cF9yZWN2X2NhcGltc2coc3RydWN0IGNtdHBfc2Vzc2lvbiAqc2Vzc2lvbiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbXRwX3NjaGVkdWxlKHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc2Vzc2lvbi0+c29jay0+c2s7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoc2stPnNrX3NsZWVwKTsKK30KKworLyogQ01UUCBpbml0IGRlZmluZXMgKi8KK2ludCBjbXRwX2luaXRfc29ja2V0cyh2b2lkKTsKK3ZvaWQgY210cF9jbGVhbnVwX3NvY2tldHModm9pZCk7CisKKyNlbmRpZiAvKiBfX0NNVFBfSCAqLwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9jbXRwL2NvcmUuYyBiL25ldC9ibHVldG9vdGgvY210cC9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBjZTA0ZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9ibHVldG9vdGgvY210cC9jb3JlLmMKQEAgLTAsMCArMSw1MDQgQEAKKy8qIAorICAgQ01UUCBpbXBsZW1lbnRhdGlvbiBmb3IgTGludXggQmx1ZXRvb3RoIHN0YWNrIChCbHVlWikuCisgICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBNYXJjZWwgSG9sdG1hbm4gPG1hcmNlbEBob2x0bWFubi5vcmc+CisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQgT0YgVEhJUkQgUEFSVFkgUklHSFRTLgorICAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIoUykgQU5EIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWQorICAgQ0xBSU0sIE9SIEFOWSBTUEVDSUFMIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgT1IgQU5ZIERBTUFHRVMgCisgICBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gCisgICBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiAKKyAgIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKyAgIEFMTCBMSUFCSUxJVFksIElOQ0xVRElORyBMSUFCSUxJVFkgRk9SIElORlJJTkdFTUVOVCBPRiBBTlkgUEFURU5UUywgCisgICBDT1BZUklHSFRTLCBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUywgUkVMQVRJTkcgVE8gVVNFIE9GIFRISVMgCisgICBTT0ZUV0FSRSBJUyBESVNDTEFJTUVELgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pc2RuL2NhcGlsbGkuaD4KKworI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9sMmNhcC5oPgorCisjaW5jbHVkZSAiY210cC5oIgorCisjaWZuZGVmIENPTkZJR19CVF9DTVRQX0RFQlVHCisjdW5kZWYgIEJUX0RCRworI2RlZmluZSBCVF9EQkcoRC4uLikKKyNlbmRpZgorCisjZGVmaW5lIFZFUlNJT04gIjEuMCIKKworc3RhdGljIERFQ0xBUkVfUldTRU0oY210cF9zZXNzaW9uX3NlbSk7CitzdGF0aWMgTElTVF9IRUFEKGNtdHBfc2Vzc2lvbl9saXN0KTsKKworc3RhdGljIHN0cnVjdCBjbXRwX3Nlc3Npb24gKl9fY210cF9nZXRfc2Vzc2lvbihiZGFkZHJfdCAqYmRhZGRyKQoreworCXN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb247CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKworCUJUX0RCRygiIik7CisKKwlsaXN0X2Zvcl9lYWNoKHAsICZjbXRwX3Nlc3Npb25fbGlzdCkgeworCQlzZXNzaW9uID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgY210cF9zZXNzaW9uLCBsaXN0KTsKKwkJaWYgKCFiYWNtcChiZGFkZHIsICZzZXNzaW9uLT5iZGFkZHIpKQorCQkJcmV0dXJuIHNlc3Npb247CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBfX2NtdHBfbGlua19zZXNzaW9uKHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24pCit7CisJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKwlsaXN0X2FkZCgmc2Vzc2lvbi0+bGlzdCwgJmNtdHBfc2Vzc2lvbl9saXN0KTsKK30KKworc3RhdGljIHZvaWQgX19jbXRwX3VubGlua19zZXNzaW9uKHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24pCit7CisJbGlzdF9kZWwoJnNlc3Npb24tPmxpc3QpOworCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworfQorCitzdGF0aWMgdm9pZCBfX2NtdHBfY29weV9zZXNzaW9uKHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24sIHN0cnVjdCBjbXRwX2Nvbm5pbmZvICpjaSkKK3sKKwliYWNweSgmY2ktPmJkYWRkciwgJnNlc3Npb24tPmJkYWRkcik7CisKKwljaS0+ZmxhZ3MgPSBzZXNzaW9uLT5mbGFnczsKKwljaS0+c3RhdGUgPSBzZXNzaW9uLT5zdGF0ZTsKKworCWNpLT5udW0gPSBzZXNzaW9uLT5udW07Cit9CisKKworc3RhdGljIGlubGluZSBpbnQgY210cF9hbGxvY19ibG9ja19pZChzdHJ1Y3QgY210cF9zZXNzaW9uICpzZXNzaW9uKQoreworCWludCBpLCBpZCA9IC0xOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCWlmICghdGVzdF9hbmRfc2V0X2JpdChpLCAmc2Vzc2lvbi0+YmxvY2tpZHMpKSB7CisJCQlpZCA9IGk7CisJCQlicmVhazsKKwkJfQorCisJcmV0dXJuIGlkOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY210cF9mcmVlX2Jsb2NrX2lkKHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24sIGludCBpZCkKK3sKKwljbGVhcl9iaXQoaWQsICZzZXNzaW9uLT5ibG9ja2lkcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbXRwX2FkZF9tc2dwYXJ0KHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24sIGludCBpZCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNlc3Npb24tPnJlYXNzZW1ibHlbaWRdLCAqbnNrYjsKKwlpbnQgc2l6ZTsKKworCUJUX0RCRygic2Vzc2lvbiAlcCBidWYgJXAgY291bnQgJWQiLCBzZXNzaW9uLCBidWYsIGNvdW50KTsKKworCXNpemUgPSAoc2tiKSA/IHNrYi0+bGVuICsgY291bnQgOiBjb3VudDsKKworCWlmICghKG5za2IgPSBhbGxvY19za2Ioc2l6ZSwgR0ZQX0FUT01JQykpKSB7CisJCUJUX0VSUigiQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBDQVBJIG1lc3NhZ2UiKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChza2IgJiYgKHNrYi0+bGVuID4gMCkpCisJCW1lbWNweShza2JfcHV0KG5za2IsIHNrYi0+bGVuKSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisKKwltZW1jcHkoc2tiX3B1dChuc2tiLCBjb3VudCksIGJ1ZiwgY291bnQpOworCisJc2Vzc2lvbi0+cmVhc3NlbWJseVtpZF0gPSBuc2tiOworCisJaWYgKHNrYikKKwkJa2ZyZWVfc2tiKHNrYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNtdHBfcmVjdl9mcmFtZShzdHJ1Y3QgY210cF9zZXNzaW9uICpzZXNzaW9uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCV9fdTggaGRyLCBoZHJsZW4sIGlkOworCV9fdTE2IGxlbjsKKworCUJUX0RCRygic2Vzc2lvbiAlcCBza2IgJXAgbGVuICVkIiwgc2Vzc2lvbiwgc2tiLCBza2ItPmxlbik7CisKKwl3aGlsZSAoc2tiLT5sZW4gPiAwKSB7CisJCWhkciA9IHNrYi0+ZGF0YVswXTsKKworCQlzd2l0Y2ggKGhkciAmIDB4YzApIHsKKwkJY2FzZSAweDQwOgorCQkJaGRybGVuID0gMjsKKwkJCWxlbiA9IHNrYi0+ZGF0YVsxXTsKKwkJCWJyZWFrOworCQljYXNlIDB4ODA6CisJCQloZHJsZW4gPSAzOworCQkJbGVuID0gc2tiLT5kYXRhWzFdIHwgKHNrYi0+ZGF0YVsyXSA8PCA4KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaGRybGVuID0gMTsKKwkJCWxlbiA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCWlkID0gKGhkciAmIDB4M2MpID4+IDI7CisKKwkJQlRfREJHKCJoZHIgMHglMDJ4IGhkcmxlbiAlZCBsZW4gJWQgaWQgJWQiLCBoZHIsIGhkcmxlbiwgbGVuLCBpZCk7CisKKwkJaWYgKGhkcmxlbiArIGxlbiA+IHNrYi0+bGVuKSB7CisJCQlCVF9FUlIoIldyb25nIHNpemUgb3IgaGVhZGVyIGluZm9ybWF0aW9uIGluIENNVFAgZnJhbWUiKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGxlbiA9PSAwKSB7CisJCQlza2JfcHVsbChza2IsIGhkcmxlbik7CisJCQljb250aW51ZTsKKwkJfQorCisJCXN3aXRjaCAoaGRyICYgMHgwMykgeworCQljYXNlIDB4MDA6CisJCQljbXRwX2FkZF9tc2dwYXJ0KHNlc3Npb24sIGlkLCBza2ItPmRhdGEgKyBoZHJsZW4sIGxlbik7CisJCQljbXRwX3JlY3ZfY2FwaW1zZyhzZXNzaW9uLCBzZXNzaW9uLT5yZWFzc2VtYmx5W2lkXSk7CisJCQlzZXNzaW9uLT5yZWFzc2VtYmx5W2lkXSA9IE5VTEw7CisJCQlicmVhazsKKwkJY2FzZSAweDAxOgorCQkJY210cF9hZGRfbXNncGFydChzZXNzaW9uLCBpZCwgc2tiLT5kYXRhICsgaGRybGVuLCBsZW4pOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAoc2Vzc2lvbi0+cmVhc3NlbWJseVtpZF0gIT0gTlVMTCkKKwkJCQlrZnJlZV9za2Ioc2Vzc2lvbi0+cmVhc3NlbWJseVtpZF0pOworCQkJc2Vzc2lvbi0+cmVhc3NlbWJseVtpZF0gPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKworCQlza2JfcHVsbChza2IsIGhkcmxlbiArIGxlbik7CisJfQorCisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY210cF9zZW5kX2ZyYW1lKHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24sIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IHNvY2tldCAqc29jayA9IHNlc3Npb24tPnNvY2s7CisJc3RydWN0IGt2ZWMgaXYgPSB7IGRhdGEsIGxlbiB9OworCXN0cnVjdCBtc2doZHIgbXNnOworCisJQlRfREJHKCJzZXNzaW9uICVwIGRhdGEgJXAgbGVuICVkIiwgc2Vzc2lvbiwgZGF0YSwgbGVuKTsKKworCWlmICghbGVuKQorCQlyZXR1cm4gMDsKKworCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CisKKwlyZXR1cm4ga2VybmVsX3NlbmRtc2coc29jaywgJm1zZywgJml2LCAxLCBsZW4pOworfQorCitzdGF0aWMgaW50IGNtdHBfcHJvY2Vzc190cmFuc21pdChzdHJ1Y3QgY210cF9zZXNzaW9uICpzZXNzaW9uKQoreworCXN0cnVjdCBza19idWZmICpza2IsICpuc2tiOworCXVuc2lnbmVkIGNoYXIgKmhkcjsKKwl1bnNpZ25lZCBpbnQgc2l6ZSwgdGFpbDsKKworCUJUX0RCRygic2Vzc2lvbiAlcCIsIHNlc3Npb24pOworCisJaWYgKCEobnNrYiA9IGFsbG9jX3NrYihzZXNzaW9uLT5tdHUsIEdGUF9BVE9NSUMpKSkgeworCQlCVF9FUlIoIkNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgbmV3IGZyYW1lIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJnNlc3Npb24tPnRyYW5zbWl0KSkpIHsKKwkJc3RydWN0IGNtdHBfc2NiICpzY2IgPSAodm9pZCAqKSBza2ItPmNiOworCisJCWlmICgodGFpbCA9IChzZXNzaW9uLT5tdHUgLSBuc2tiLT5sZW4pKSA8IDUpIHsKKwkJCWNtdHBfc2VuZF9mcmFtZShzZXNzaW9uLCBuc2tiLT5kYXRhLCBuc2tiLT5sZW4pOworCQkJc2tiX3RyaW0obnNrYiwgMCk7CisJCQl0YWlsID0gc2Vzc2lvbi0+bXR1OworCQl9CisKKwkJc2l6ZSA9IG1pbl90KHVpbnQsICgodGFpbCA8IDI1OCkgPyAodGFpbCAtIDIpIDogKHRhaWwgLSAzKSksIHNrYi0+bGVuKTsKKworCQlpZiAoKHNjYi0+aWQgPCAwKSAmJiAoKHNjYi0+aWQgPSBjbXRwX2FsbG9jX2Jsb2NrX2lkKHNlc3Npb24pKSA8IDApKSB7CisJCQlza2JfcXVldWVfaGVhZCgmc2Vzc2lvbi0+dHJhbnNtaXQsIHNrYik7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzaXplIDwgMjU2KSB7CisJCQloZHIgPSBza2JfcHV0KG5za2IsIDIpOworCQkJaGRyWzBdID0gMHg0MAorCQkJCXwgKChzY2ItPmlkIDw8IDIpICYgMHgzYykKKwkJCQl8ICgoc2tiLT5sZW4gPT0gc2l6ZSkgPyAweDAwIDogMHgwMSk7CisJCQloZHJbMV0gPSBzaXplOworCQl9IGVsc2UgeworCQkJaGRyID0gc2tiX3B1dChuc2tiLCAzKTsKKwkJCWhkclswXSA9IDB4ODAKKwkJCQl8ICgoc2NiLT5pZCA8PCAyKSAmIDB4M2MpCisJCQkJfCAoKHNrYi0+bGVuID09IHNpemUpID8gMHgwMCA6IDB4MDEpOworCQkJaGRyWzFdID0gc2l6ZSAmIDB4ZmY7CisJCQloZHJbMl0gPSBzaXplID4+IDg7CisJCX0KKworCQltZW1jcHkoc2tiX3B1dChuc2tiLCBzaXplKSwgc2tiLT5kYXRhLCBzaXplKTsKKwkJc2tiX3B1bGwoc2tiLCBzaXplKTsKKworCQlpZiAoc2tiLT5sZW4gPiAwKSB7CisJCQlza2JfcXVldWVfaGVhZCgmc2Vzc2lvbi0+dHJhbnNtaXQsIHNrYik7CisJCX0gZWxzZSB7CisJCQljbXRwX2ZyZWVfYmxvY2tfaWQoc2Vzc2lvbiwgc2NiLT5pZCk7CisJCQlpZiAoc2NiLT5kYXRhKSB7CisJCQkJY210cF9zZW5kX2ZyYW1lKHNlc3Npb24sIG5za2ItPmRhdGEsIG5za2ItPmxlbik7CisJCQkJc2tiX3RyaW0obnNrYiwgMCk7CisJCQl9CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJfQorCX0KKworCWNtdHBfc2VuZF9mcmFtZShzZXNzaW9uLCBuc2tiLT5kYXRhLCBuc2tiLT5sZW4pOworCisJa2ZyZWVfc2tiKG5za2IpOworCisJcmV0dXJuIHNrYl9xdWV1ZV9sZW4oJnNlc3Npb24tPnRyYW5zbWl0KTsKK30KKworc3RhdGljIGludCBjbXRwX3Nlc3Npb24odm9pZCAqYXJnKQoreworCXN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24gPSBhcmc7CisJc3RydWN0IHNvY2sgKnNrID0gc2Vzc2lvbi0+c29jay0+c2s7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl3YWl0X3F1ZXVlX3Qgd2FpdDsKKworCUJUX0RCRygic2Vzc2lvbiAlcCIsIHNlc3Npb24pOworCisJZGFlbW9uaXplKCJrY210cGRfY3RyXyVkIiwgc2Vzc2lvbi0+bnVtKTsKKwlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC0xNSk7CisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CisKKwlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CisJYWRkX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJd2hpbGUgKCFhdG9taWNfcmVhZCgmc2Vzc2lvbi0+dGVybWluYXRlKSkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCisJCWlmIChzay0+c2tfc3RhdGUgIT0gQlRfQ09OTkVDVEVEKQorCQkJYnJlYWs7CisKKwkJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpKSkgeworCQkJc2tiX29ycGhhbihza2IpOworCQkJY210cF9yZWN2X2ZyYW1lKHNlc3Npb24sIHNrYik7CisJCX0KKworCQljbXRwX3Byb2Nlc3NfdHJhbnNtaXQoc2Vzc2lvbik7CisKKwkJc2NoZWR1bGUoKTsKKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKKworCWRvd25fd3JpdGUoJmNtdHBfc2Vzc2lvbl9zZW0pOworCisJaWYgKCEoc2Vzc2lvbi0+ZmxhZ3MgJiAoMSA8PCBDTVRQX0xPT1BCQUNLKSkpCisJCWNtdHBfZGV0YWNoX2RldmljZShzZXNzaW9uKTsKKworCWZwdXQoc2Vzc2lvbi0+c29jay0+ZmlsZSk7CisKKwlfX2NtdHBfdW5saW5rX3Nlc3Npb24oc2Vzc2lvbik7CisKKwl1cF93cml0ZSgmY210cF9zZXNzaW9uX3NlbSk7CisKKwlrZnJlZShzZXNzaW9uKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGNtdHBfYWRkX2Nvbm5lY3Rpb24oc3RydWN0IGNtdHBfY29ubmFkZF9yZXEgKnJlcSwgc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlzdHJ1Y3QgY210cF9zZXNzaW9uICpzZXNzaW9uLCAqczsKKwliZGFkZHJfdCBzcmMsIGRzdDsKKwlpbnQgaSwgZXJyOworCisJQlRfREJHKCIiKTsKKworCWJhc3dhcCgmc3JjLCAmYnRfc2soc29jay0+c2spLT5zcmMpOworCWJhc3dhcCgmZHN0LCAmYnRfc2soc29jay0+c2spLT5kc3QpOworCisJc2Vzc2lvbiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbXRwX3Nlc3Npb24pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNlc3Npb24pIAorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoc2Vzc2lvbiwgMCwgc2l6ZW9mKHN0cnVjdCBjbXRwX3Nlc3Npb24pKTsKKworCWRvd25fd3JpdGUoJmNtdHBfc2Vzc2lvbl9zZW0pOworCisJcyA9IF9fY210cF9nZXRfc2Vzc2lvbigmYnRfc2soc29jay0+c2spLT5kc3QpOworCWlmIChzICYmIHMtPnN0YXRlID09IEJUX0NPTk5FQ1RFRCkgeworCQllcnIgPSAtRUVYSVNUOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwliYWNweSgmc2Vzc2lvbi0+YmRhZGRyLCAmYnRfc2soc29jay0+c2spLT5kc3QpOworCisJc2Vzc2lvbi0+bXR1ID0gbWluX3QodWludCwgbDJjYXBfcGkoc29jay0+c2spLT5vbXR1LCBsMmNhcF9waShzb2NrLT5zayktPmltdHUpOworCisJQlRfREJHKCJtdHUgJWQiLCBzZXNzaW9uLT5tdHUpOworCisJc3ByaW50ZihzZXNzaW9uLT5uYW1lLCAiJXMiLCBiYXRvc3RyKCZkc3QpKTsKKworCXNlc3Npb24tPnNvY2sgID0gc29jazsKKwlzZXNzaW9uLT5zdGF0ZSA9IEJUX0NPTkZJRzsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNlc3Npb24tPndhaXQpOworCisJc2Vzc2lvbi0+bXNnbnVtID0gQ01UUF9JTklUSUFMX01TR05VTTsKKworCUlOSVRfTElTVF9IRUFEKCZzZXNzaW9uLT5hcHBsaWNhdGlvbnMpOworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2Vzc2lvbi0+dHJhbnNtaXQpOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCXNlc3Npb24tPnJlYXNzZW1ibHlbaV0gPSBOVUxMOworCisJc2Vzc2lvbi0+ZmxhZ3MgPSByZXEtPmZsYWdzOworCisJX19jbXRwX2xpbmtfc2Vzc2lvbihzZXNzaW9uKTsKKworCWVyciA9IGtlcm5lbF90aHJlYWQoY210cF9zZXNzaW9uLCBzZXNzaW9uLCBDTE9ORV9LRVJORUwpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIHVubGluazsKKworCWlmICghKHNlc3Npb24tPmZsYWdzICYgKDEgPDwgQ01UUF9MT09QQkFDSykpKSB7CisJCWVyciA9IGNtdHBfYXR0YWNoX2RldmljZShzZXNzaW9uKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGRldGFjaDsKKwl9CisKKwl1cF93cml0ZSgmY210cF9zZXNzaW9uX3NlbSk7CisJcmV0dXJuIDA7CisKK2RldGFjaDoKKwljbXRwX2RldGFjaF9kZXZpY2Uoc2Vzc2lvbik7CisKK3VubGluazoKKwlfX2NtdHBfdW5saW5rX3Nlc3Npb24oc2Vzc2lvbik7CisKK2ZhaWxlZDoKKwl1cF93cml0ZSgmY210cF9zZXNzaW9uX3NlbSk7CisJa2ZyZWUoc2Vzc2lvbik7CisJcmV0dXJuIGVycjsKK30KKworaW50IGNtdHBfZGVsX2Nvbm5lY3Rpb24oc3RydWN0IGNtdHBfY29ubmRlbF9yZXEgKnJlcSkKK3sKKwlzdHJ1Y3QgY210cF9zZXNzaW9uICpzZXNzaW9uOworCWludCBlcnIgPSAwOworCisJQlRfREJHKCIiKTsKKworCWRvd25fcmVhZCgmY210cF9zZXNzaW9uX3NlbSk7CisKKwlzZXNzaW9uID0gX19jbXRwX2dldF9zZXNzaW9uKCZyZXEtPmJkYWRkcik7CisJaWYgKHNlc3Npb24pIHsKKwkJLyogRmx1c2ggdGhlIHRyYW5zbWl0IHF1ZXVlICovCisJCXNrYl9xdWV1ZV9wdXJnZSgmc2Vzc2lvbi0+dHJhbnNtaXQpOworCisJCS8qIEtpbGwgc2Vzc2lvbiB0aHJlYWQgKi8KKwkJYXRvbWljX2luYygmc2Vzc2lvbi0+dGVybWluYXRlKTsKKwkJY210cF9zY2hlZHVsZShzZXNzaW9uKTsKKwl9IGVsc2UKKwkJZXJyID0gLUVOT0VOVDsKKworCXVwX3JlYWQoJmNtdHBfc2Vzc2lvbl9zZW0pOworCXJldHVybiBlcnI7Cit9CisKK2ludCBjbXRwX2dldF9jb25ubGlzdChzdHJ1Y3QgY210cF9jb25ubGlzdF9yZXEgKnJlcSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCWludCBlcnIgPSAwLCBuID0gMDsKKworCUJUX0RCRygiIik7CisKKwlkb3duX3JlYWQoJmNtdHBfc2Vzc2lvbl9zZW0pOworCisJbGlzdF9mb3JfZWFjaChwLCAmY210cF9zZXNzaW9uX2xpc3QpIHsKKwkJc3RydWN0IGNtdHBfc2Vzc2lvbiAqc2Vzc2lvbjsKKwkJc3RydWN0IGNtdHBfY29ubmluZm8gY2k7CisKKwkJc2Vzc2lvbiA9IGxpc3RfZW50cnkocCwgc3RydWN0IGNtdHBfc2Vzc2lvbiwgbGlzdCk7CisKKwkJX19jbXRwX2NvcHlfc2Vzc2lvbihzZXNzaW9uLCAmY2kpOworCisJCWlmIChjb3B5X3RvX3VzZXIocmVxLT5jaSwgJmNpLCBzaXplb2YoY2kpKSkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCsrbiA+PSByZXEtPmNudW0pCisJCQlicmVhazsKKworCQlyZXEtPmNpKys7CisJfQorCXJlcS0+Y251bSA9IG47CisKKwl1cF9yZWFkKCZjbXRwX3Nlc3Npb25fc2VtKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgY210cF9nZXRfY29ubmluZm8oc3RydWN0IGNtdHBfY29ubmluZm8gKmNpKQoreworCXN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb247CisJaW50IGVyciA9IDA7CisKKwlkb3duX3JlYWQoJmNtdHBfc2Vzc2lvbl9zZW0pOworCisJc2Vzc2lvbiA9IF9fY210cF9nZXRfc2Vzc2lvbigmY2ktPmJkYWRkcik7CisJaWYgKHNlc3Npb24pCisJCV9fY210cF9jb3B5X3Nlc3Npb24oc2Vzc2lvbiwgY2kpOworCWVsc2UKKwkJZXJyID0gLUVOT0VOVDsKKworCXVwX3JlYWQoJmNtdHBfc2Vzc2lvbl9zZW0pOworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCBfX2luaXQgY210cF9pbml0KHZvaWQpCit7CisJbDJjYXBfbG9hZCgpOworCisJQlRfSU5GTygiQ01UUCAoQ0FQSSBFbXVsYXRpb24pIHZlciAlcyIsIFZFUlNJT04pOworCisJY210cF9pbml0X3NvY2tldHMoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY210cF9leGl0KHZvaWQpCit7CisJY210cF9jbGVhbnVwX3NvY2tldHMoKTsKK30KKworbW9kdWxlX2luaXQoY210cF9pbml0KTsKK21vZHVsZV9leGl0KGNtdHBfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQmx1ZXRvb3RoIENNVFAgdmVyICIgVkVSU0lPTik7CitNT0RVTEVfVkVSU0lPTihWRVJTSU9OKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiYnQtcHJvdG8tNSIpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9jbXRwL3NvY2suYyBiL25ldC9ibHVldG9vdGgvY210cC9zb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM3ZjllMgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9ibHVldG9vdGgvY210cC9zb2NrLmMKQEAgLTAsMCArMSwyMjYgQEAKKy8qIAorICAgQ01UUCBpbXBsZW1lbnRhdGlvbiBmb3IgTGludXggQmx1ZXRvb3RoIHN0YWNrIChCbHVlWikuCisgICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBNYXJjZWwgSG9sdG1hbm4gPG1hcmNlbEBob2x0bWFubi5vcmc+CisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQgT0YgVEhJUkQgUEFSVFkgUklHSFRTLgorICAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIoUykgQU5EIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWQorICAgQ0xBSU0sIE9SIEFOWSBTUEVDSUFMIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgT1IgQU5ZIERBTUFHRVMgCisgICBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gCisgICBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiAKKyAgIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKyAgIEFMTCBMSUFCSUxJVFksIElOQ0xVRElORyBMSUFCSUxJVFkgRk9SIElORlJJTkdFTUVOVCBPRiBBTlkgUEFURU5UUywgCisgICBDT1BZUklHSFRTLCBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUywgUkVMQVRJTkcgVE8gVVNFIE9GIFRISVMgCisgICBTT0ZUV0FSRSBJUyBESVNDTEFJTUVELgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworI2luY2x1ZGUgPGxpbnV4L2lzZG4vY2FwaWxsaS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJjbXRwLmgiCisKKyNpZm5kZWYgQ09ORklHX0JUX0NNVFBfREVCVUcKKyN1bmRlZiAgQlRfREJHCisjZGVmaW5lIEJUX0RCRyhELi4uKQorI2VuZGlmCisKK3N0YXRpYyBpbnQgY210cF9zb2NrX3JlbGVhc2Uoc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKworCUJUX0RCRygic29jayAlcCBzayAlcCIsIHNvY2ssIHNrKTsKKworCWlmICghc2spCisJCXJldHVybiAwOworCisJc29ja19vcnBoYW4oc2spOworCXNvY2tfcHV0KHNrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNtdHBfc29ja19pb2N0bChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgY210cF9jb25uYWRkX3JlcSBjYTsKKwlzdHJ1Y3QgY210cF9jb25uZGVsX3JlcSBjZDsKKwlzdHJ1Y3QgY210cF9jb25ubGlzdF9yZXEgY2w7CisJc3RydWN0IGNtdHBfY29ubmluZm8gY2k7CisJc3RydWN0IHNvY2tldCAqbnNvY2s7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IGVycjsKKworCUJUX0RCRygiY21kICV4IGFyZyAlbHgiLCBjbWQsIGFyZyk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQ01UUENPTk5BREQ6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2EsIGFyZ3AsIHNpemVvZihjYSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJbnNvY2sgPSBzb2NrZmRfbG9va3VwKGNhLnNvY2ssICZlcnIpOworCQlpZiAoIW5zb2NrKQorCQkJcmV0dXJuIGVycjsKKworCQlpZiAobnNvY2stPnNrLT5za19zdGF0ZSAhPSBCVF9DT05ORUNURUQpIHsKKwkJCWZwdXQobnNvY2stPmZpbGUpOworCQkJcmV0dXJuIC1FQkFERkQ7CisJCX0KKworCQllcnIgPSBjbXRwX2FkZF9jb25uZWN0aW9uKCZjYSwgbnNvY2spOworCQlpZiAoIWVycikgeworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2EsIHNpemVvZihjYSkpKQorCQkJCWVyciA9IC1FRkFVTFQ7CisJCX0gZWxzZQorCQkJZnB1dChuc29jay0+ZmlsZSk7CisKKwkJcmV0dXJuIGVycjsKKworCWNhc2UgQ01UUENPTk5ERUw6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2QsIGFyZ3AsIHNpemVvZihjZCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dXJuIGNtdHBfZGVsX2Nvbm5lY3Rpb24oJmNkKTsKKworCWNhc2UgQ01UUEdFVENPTk5MSVNUOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJmNsLCBhcmdwLCBzaXplb2YoY2wpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChjbC5jbnVtIDw9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQllcnIgPSBjbXRwX2dldF9jb25ubGlzdCgmY2wpOworCQlpZiAoIWVyciAmJiBjb3B5X3RvX3VzZXIoYXJncCwgJmNsLCBzaXplb2YoY2wpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiBlcnI7CisKKwljYXNlIENNVFBHRVRDT05OSU5GTzoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjaSwgYXJncCwgc2l6ZW9mKGNpKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQllcnIgPSBjbXRwX2dldF9jb25uaW5mbygmY2kpOworCQlpZiAoIWVyciAmJiBjb3B5X3RvX3VzZXIoYXJncCwgJmNpLCBzaXplb2YoY2kpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIGNtdHBfc29ja19vcHMgPSB7CisJLmZhbWlseQkJPSBQRl9CTFVFVE9PVEgsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWxlYXNlCT0gY210cF9zb2NrX3JlbGVhc2UsCisJLmlvY3RsCQk9IGNtdHBfc29ja19pb2N0bCwKKwkuYmluZAkJPSBzb2NrX25vX2JpbmQsCisJLmdldG5hbWUJPSBzb2NrX25vX2dldG5hbWUsCisJLnNlbmRtc2cJPSBzb2NrX25vX3NlbmRtc2csCisJLnJlY3Ztc2cJPSBzb2NrX25vX3JlY3Ztc2csCisJLnBvbGwJCT0gc29ja19ub19wb2xsLAorCS5saXN0ZW4JCT0gc29ja19ub19saXN0ZW4sCisJLnNodXRkb3duCT0gc29ja19ub19zaHV0ZG93biwKKwkuc2V0c29ja29wdAk9IHNvY2tfbm9fc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdAk9IHNvY2tfbm9fZ2V0c29ja29wdCwKKwkuY29ubmVjdAk9IHNvY2tfbm9fY29ubmVjdCwKKwkuc29ja2V0cGFpcgk9IHNvY2tfbm9fc29ja2V0cGFpciwKKwkuYWNjZXB0CQk9IHNvY2tfbm9fYWNjZXB0LAorCS5tbWFwCQk9IHNvY2tfbm9fbW1hcAorfTsKKworc3RhdGljIHN0cnVjdCBwcm90byBjbXRwX3Byb3RvID0geworCS5uYW1lCQk9ICJDTVRQIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9ial9zaXplCT0gc2l6ZW9mKHN0cnVjdCBidF9zb2NrKQorfTsKKworc3RhdGljIGludCBjbXRwX3NvY2tfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlCVF9EQkcoInNvY2sgJXAiLCBzb2NrKTsKKworCWlmIChzb2NrLT50eXBlICE9IFNPQ0tfUkFXKQorCQlyZXR1cm4gLUVTT0NLVE5PU1VQUE9SVDsKKworCXNrID0gc2tfYWxsb2MoUEZfQkxVRVRPT1RILCBHRlBfS0VSTkVMLCAmY210cF9wcm90bywgMSk7CisJaWYgKCFzaykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CisKKwlzb2NrLT5vcHMgPSAmY210cF9zb2NrX29wczsKKworCXNvY2stPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7CisKKwlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKworCXNrLT5za19wcm90b2NvbCA9IHByb3RvY29sOworCXNrLT5za19zdGF0ZSAgICA9IEJUX09QRU47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5IGNtdHBfc29ja19mYW1pbHlfb3BzID0geworCS5mYW1pbHkJPSBQRl9CTFVFVE9PVEgsCisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmNyZWF0ZQk9IGNtdHBfc29ja19jcmVhdGUKK307CisKK2ludCBjbXRwX2luaXRfc29ja2V0cyh2b2lkKQoreworCWludCBlcnI7CisKKwllcnIgPSBwcm90b19yZWdpc3RlcigmY210cF9wcm90bywgMCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBidF9zb2NrX3JlZ2lzdGVyKEJUUFJPVE9fQ01UUCwgJmNtdHBfc29ja19mYW1pbHlfb3BzKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlCVF9FUlIoIkNhbid0IHJlZ2lzdGVyIENNVFAgc29ja2V0Iik7CisJcHJvdG9fdW5yZWdpc3RlcigmY210cF9wcm90byk7CisJcmV0dXJuIGVycjsKK30KKwordm9pZCBjbXRwX2NsZWFudXBfc29ja2V0cyh2b2lkKQoreworCWlmIChidF9zb2NrX3VucmVnaXN0ZXIoQlRQUk9UT19DTVRQKSA8IDApCisJCUJUX0VSUigiQ2FuJ3QgdW5yZWdpc3RlciBDTVRQIHNvY2tldCIpOworCisJcHJvdG9fdW5yZWdpc3RlcigmY210cF9wcm90byk7Cit9CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9jb25uLmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9jb25uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3NjJkNwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX2Nvbm4uYwpAQCAtMCwwICsxLDQ3MSBAQAorLyogCisgICBCbHVlWiAtIEJsdWV0b290aCBwcm90b2NvbCBzdGFjayBmb3IgTGludXgKKyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAxIFF1YWxjb21tIEluY29ycG9yYXRlZAorCisgICBXcml0dGVuIDIwMDAsMjAwMSBieSBNYXhpbSBLcmFzbnlhbnNreSA8bWF4a0BxdWFsY29tbS5jb20+CisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQgT0YgVEhJUkQgUEFSVFkgUklHSFRTLgorICAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIoUykgQU5EIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWQorICAgQ0xBSU0sIE9SIEFOWSBTUEVDSUFMIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgT1IgQU5ZIERBTUFHRVMgCisgICBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gCisgICBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiAKKyAgIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKyAgIEFMTCBMSUFCSUxJVFksIElOQ0xVRElORyBMSUFCSUxJVFkgRk9SIElORlJJTkdFTUVOVCBPRiBBTlkgUEFURU5UUywgCisgICBDT1BZUklHSFRTLCBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUywgUkVMQVRJTkcgVE8gVVNFIE9GIFRISVMgCisgICBTT0ZUV0FSRSBJUyBESVNDTEFJTUVELgorKi8KKworLyogQmx1ZXRvb3RoIEhDSSBjb25uZWN0aW9uIGhhbmRsaW5nLiAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmg+CisKKyNpZm5kZWYgQ09ORklHX0JUX0hDSV9DT1JFX0RFQlVHCisjdW5kZWYgIEJUX0RCRworI2RlZmluZSBCVF9EQkcoRC4uLikKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBoY2lfYWNsX2Nvbm5lY3Qoc3RydWN0IGhjaV9jb25uICpjb25uKQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gY29ubi0+aGRldjsKKwlzdHJ1Y3QgaW5xdWlyeV9lbnRyeSAqaWU7CisJc3RydWN0IGhjaV9jcF9jcmVhdGVfY29ubiBjcDsKKworCUJUX0RCRygiJXAiLCBjb25uKTsKKworCWNvbm4tPnN0YXRlID0gQlRfQ09OTkVDVDsKKwljb25uLT5vdXQgICA9IDE7CisJY29ubi0+bGlua19tb2RlID0gSENJX0xNX01BU1RFUjsKKworCW1lbXNldCgmY3AsIDAsIHNpemVvZihjcCkpOworCWJhY3B5KCZjcC5iZGFkZHIsICZjb25uLT5kc3QpOworCWNwLnBzY2FuX3JlcF9tb2RlID0gMHgwMjsKKworCWlmICgoaWUgPSBoY2lfaW5xdWlyeV9jYWNoZV9sb29rdXAoaGRldiwgJmNvbm4tPmRzdCkpICYmCisJCQlpbnF1aXJ5X2VudHJ5X2FnZShpZSkgPD0gSU5RVUlSWV9FTlRSWV9BR0VfTUFYKSB7CisJCWNwLnBzY2FuX3JlcF9tb2RlID0gaWUtPmRhdGEucHNjYW5fcmVwX21vZGU7CisJCWNwLnBzY2FuX21vZGUgICAgID0gaWUtPmRhdGEucHNjYW5fbW9kZTsKKwkJY3AuY2xvY2tfb2Zmc2V0ICAgPSBpZS0+ZGF0YS5jbG9ja19vZmZzZXQgfCBfX2NwdV90b19sZTE2KDB4ODAwMCk7CisJCW1lbWNweShjb25uLT5kZXZfY2xhc3MsIGllLT5kYXRhLmRldl9jbGFzcywgMyk7CisJfQorCisJY3AucGt0X3R5cGUgPSBfX2NwdV90b19sZTE2KGhkZXYtPnBrdF90eXBlICYgQUNMX1BUWVBFX01BU0spOworCWlmIChsbXBfcnN3aXRjaF9jYXBhYmxlKGhkZXYpICYmICEoaGRldi0+bGlua19tb2RlICYgSENJX0xNX01BU1RFUikpCisJCWNwLnJvbGVfc3dpdGNoCT0gMHgwMTsKKwllbHNlCisJCWNwLnJvbGVfc3dpdGNoCT0gMHgwMDsKKwkJCisJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9MSU5LX0NUTCwgT0NGX0NSRUFURV9DT05OLCBzaXplb2YoY3ApLCAmY3ApOworfQorCit2b2lkIGhjaV9hY2xfZGlzY29ubihzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIF9fdTggcmVhc29uKQoreworCXN0cnVjdCBoY2lfY3BfZGlzY29ubmVjdCBjcDsKKworCUJUX0RCRygiJXAiLCBjb25uKTsKKworCWNvbm4tPnN0YXRlID0gQlRfRElTQ09OTjsKKworCWNwLmhhbmRsZSA9IF9fY3B1X3RvX2xlMTYoY29ubi0+aGFuZGxlKTsKKwljcC5yZWFzb24gPSByZWFzb247CisJaGNpX3NlbmRfY21kKGNvbm4tPmhkZXYsIE9HRl9MSU5LX0NUTCwgT0NGX0RJU0NPTk5FQ1QsIHNpemVvZihjcCksICZjcCk7Cit9CisKK3ZvaWQgaGNpX2FkZF9zY28oc3RydWN0IGhjaV9jb25uICpjb25uLCBfX3UxNiBoYW5kbGUpCit7CisJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBjb25uLT5oZGV2OworCXN0cnVjdCBoY2lfY3BfYWRkX3NjbyBjcDsKKworCUJUX0RCRygiJXAiLCBjb25uKTsKKworCWNvbm4tPnN0YXRlID0gQlRfQ09OTkVDVDsKKwljb25uLT5vdXQgPSAxOworCisJY3AucGt0X3R5cGUgPSBfX2NwdV90b19sZTE2KGhkZXYtPnBrdF90eXBlICYgU0NPX1BUWVBFX01BU0spOworCWNwLmhhbmRsZSAgID0gX19jcHVfdG9fbGUxNihoYW5kbGUpOworCisJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9MSU5LX0NUTCwgT0NGX0FERF9TQ08sIHNpemVvZihjcCksICZjcCk7Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9jb25uX3RpbWVvdXQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGhjaV9jb25uICpjb25uID0gKHZvaWQgKilhcmc7CisJc3RydWN0IGhjaV9kZXYgICpoZGV2ID0gY29ubi0+aGRldjsKKworCUJUX0RCRygiY29ubiAlcCBzdGF0ZSAlZCIsIGNvbm4sIGNvbm4tPnN0YXRlKTsKKworCWlmIChhdG9taWNfcmVhZCgmY29ubi0+cmVmY250KSkKKwkJcmV0dXJuOworCisJaGNpX2Rldl9sb2NrKGhkZXYpOworIAlpZiAoY29ubi0+c3RhdGUgPT0gQlRfQ09OTkVDVEVEKQorCQloY2lfYWNsX2Rpc2Nvbm4oY29ubiwgMHgxMyk7CisJZWxzZQorCQljb25uLT5zdGF0ZSA9IEJUX0NMT1NFRDsKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9jb25uX2luaXRfdGltZXIoc3RydWN0IGhjaV9jb25uICpjb25uKQoreworCWluaXRfdGltZXIoJmNvbm4tPnRpbWVyKTsKKwljb25uLT50aW1lci5mdW5jdGlvbiA9IGhjaV9jb25uX3RpbWVvdXQ7CisJY29ubi0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWNvbm47Cit9CisKK3N0cnVjdCBoY2lfY29ubiAqaGNpX2Nvbm5fYWRkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBpbnQgdHlwZSwgYmRhZGRyX3QgKmRzdCkKK3sKKwlzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm47CisKKwlCVF9EQkcoIiVzIGRzdCAlcyIsIGhkZXYtPm5hbWUsIGJhdG9zdHIoZHN0KSk7CisKKwlpZiAoIShjb25uID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGhjaV9jb25uKSwgR0ZQX0FUT01JQykpKQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQoY29ubiwgMCwgc2l6ZW9mKHN0cnVjdCBoY2lfY29ubikpOworCisJYmFjcHkoJmNvbm4tPmRzdCwgZHN0KTsKKwljb25uLT50eXBlICAgPSB0eXBlOworCWNvbm4tPmhkZXYgICA9IGhkZXY7CisJY29ubi0+c3RhdGUgID0gQlRfT1BFTjsKKworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNvbm4tPmRhdGFfcSk7CisJaGNpX2Nvbm5faW5pdF90aW1lcihjb25uKTsKKworCWF0b21pY19zZXQoJmNvbm4tPnJlZmNudCwgMCk7CisKKwloY2lfZGV2X2hvbGQoaGRldik7CisKKwl0YXNrbGV0X2Rpc2FibGUoJmhkZXYtPnR4X3Rhc2spOworCisJaGNpX2Nvbm5faGFzaF9hZGQoaGRldiwgY29ubik7CisJaWYgKGhkZXYtPm5vdGlmeSkKKwkJaGRldi0+bm90aWZ5KGhkZXYsIEhDSV9OT1RJRllfQ09OTl9BREQpOworCisJdGFza2xldF9lbmFibGUoJmhkZXYtPnR4X3Rhc2spOworCisJcmV0dXJuIGNvbm47Cit9CisKK2ludCBoY2lfY29ubl9kZWwoc3RydWN0IGhjaV9jb25uICpjb25uKQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gY29ubi0+aGRldjsKKworCUJUX0RCRygiJXMgY29ubiAlcCBoYW5kbGUgJWQiLCBoZGV2LT5uYW1lLCBjb25uLCBjb25uLT5oYW5kbGUpOworCisJaGNpX2Nvbm5fZGVsX3RpbWVyKGNvbm4pOworCisJaWYgKGNvbm4tPnR5cGUgPT0gU0NPX0xJTkspIHsKKwkJc3RydWN0IGhjaV9jb25uICphY2wgPSBjb25uLT5saW5rOworCQlpZiAoYWNsKSB7CisJCQlhY2wtPmxpbmsgPSBOVUxMOworCQkJaGNpX2Nvbm5fcHV0KGFjbCk7CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1Y3QgaGNpX2Nvbm4gKnNjbyA9IGNvbm4tPmxpbms7CisJCWlmIChzY28pCisJCQlzY28tPmxpbmsgPSBOVUxMOworCisJCS8qIFVuYWNrZWQgZnJhbWVzICovCisJCWhkZXYtPmFjbF9jbnQgKz0gY29ubi0+c2VudDsKKwl9CisKKwl0YXNrbGV0X2Rpc2FibGUoJmhkZXYtPnR4X3Rhc2spOworCisJaGNpX2Nvbm5faGFzaF9kZWwoaGRldiwgY29ubik7CisJaWYgKGhkZXYtPm5vdGlmeSkKKwkJaGRldi0+bm90aWZ5KGhkZXYsIEhDSV9OT1RJRllfQ09OTl9ERUwpOworCisJdGFza2xldF9lbmFibGUoJmhkZXYtPnR4X3Rhc2spOworCisJc2tiX3F1ZXVlX3B1cmdlKCZjb25uLT5kYXRhX3EpOworCisJaGNpX2Rldl9wdXQoaGRldik7CisKKwlrZnJlZShjb25uKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGhjaV9kZXYgKmhjaV9nZXRfcm91dGUoYmRhZGRyX3QgKmRzdCwgYmRhZGRyX3QgKnNyYykKK3sKKwlpbnQgdXNlX3NyYyA9IGJhY21wKHNyYywgQkRBRERSX0FOWSk7CisJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisKKwlCVF9EQkcoIiVzIC0+ICVzIiwgYmF0b3N0cihzcmMpLCBiYXRvc3RyKGRzdCkpOworCisJcmVhZF9sb2NrX2JoKCZoY2lfZGV2X2xpc3RfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoKHAsICZoY2lfZGV2X2xpc3QpIHsKKwkJc3RydWN0IGhjaV9kZXYgKmQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBoY2lfZGV2LCBsaXN0KTsKKworCQlpZiAoIXRlc3RfYml0KEhDSV9VUCwgJmQtPmZsYWdzKSB8fCB0ZXN0X2JpdChIQ0lfUkFXLCAmZC0+ZmxhZ3MpKQorCQkJY29udGludWU7CisKKwkJLyogU2ltcGxlIHJvdXRpbmc6IAorCQkgKiAgIE5vIHNvdXJjZSBhZGRyZXNzIC0gZmluZCBpbnRlcmZhY2Ugd2l0aCBiZGFkZHIgIT0gZHN0CisJCSAqICAgU291cmNlIGFkZHJlc3MgICAgLSBmaW5kIGludGVyZmFjZSB3aXRoIGJkYWRkciA9PSBzcmMKKwkJICovCisKKwkJaWYgKHVzZV9zcmMpIHsKKwkJCWlmICghYmFjbXAoJmQtPmJkYWRkciwgc3JjKSkgeworCQkJCWhkZXYgPSBkOyBicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChiYWNtcCgmZC0+YmRhZGRyLCBkc3QpKSB7CisJCQkJaGRldiA9IGQ7IGJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKGhkZXYpCisJCWhkZXYgPSBoY2lfZGV2X2hvbGQoaGRldik7CisKKwlyZWFkX3VubG9ja19iaCgmaGNpX2Rldl9saXN0X2xvY2spOworCXJldHVybiBoZGV2OworfQorRVhQT1JUX1NZTUJPTChoY2lfZ2V0X3JvdXRlKTsKKworLyogQ3JlYXRlIFNDTyBvciBBQ0wgY29ubmVjdGlvbi4KKyAqIERldmljZSBfbXVzdF8gYmUgbG9ja2VkICovCitzdHJ1Y3QgaGNpX2Nvbm4gKiBoY2lfY29ubmVjdChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgaW50IHR5cGUsIGJkYWRkcl90ICpkc3QpCit7CisJc3RydWN0IGhjaV9jb25uICphY2w7CisKKwlCVF9EQkcoIiVzIGRzdCAlcyIsIGhkZXYtPm5hbWUsIGJhdG9zdHIoZHN0KSk7CisKKwlpZiAoIShhY2wgPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9iYShoZGV2LCBBQ0xfTElOSywgZHN0KSkpIHsKKwkJaWYgKCEoYWNsID0gaGNpX2Nvbm5fYWRkKGhkZXYsIEFDTF9MSU5LLCBkc3QpKSkKKwkJCXJldHVybiBOVUxMOworCX0KKworCWhjaV9jb25uX2hvbGQoYWNsKTsKKworCWlmIChhY2wtPnN0YXRlID09IEJUX09QRU4gfHwgYWNsLT5zdGF0ZSA9PSBCVF9DTE9TRUQpCisJCWhjaV9hY2xfY29ubmVjdChhY2wpOworCisJaWYgKHR5cGUgPT0gU0NPX0xJTkspIHsKKwkJc3RydWN0IGhjaV9jb25uICpzY287CisKKwkJaWYgKCEoc2NvID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfYmEoaGRldiwgU0NPX0xJTkssIGRzdCkpKSB7CisJCQlpZiAoIShzY28gPSBoY2lfY29ubl9hZGQoaGRldiwgU0NPX0xJTkssIGRzdCkpKSB7CisJCQkJaGNpX2Nvbm5fcHV0KGFjbCk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwkJYWNsLT5saW5rID0gc2NvOworCQlzY28tPmxpbmsgPSBhY2w7CisKKwkJaGNpX2Nvbm5faG9sZChzY28pOworCisJCWlmIChhY2wtPnN0YXRlID09IEJUX0NPTk5FQ1RFRCAmJiAKKwkJCQkoc2NvLT5zdGF0ZSA9PSBCVF9PUEVOIHx8IHNjby0+c3RhdGUgPT0gQlRfQ0xPU0VEKSkKKwkJCWhjaV9hZGRfc2NvKHNjbywgYWNsLT5oYW5kbGUpOworCisJCXJldHVybiBzY287CisJfSBlbHNlIHsKKwkJcmV0dXJuIGFjbDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGhjaV9jb25uZWN0KTsKKworLyogQXV0aGVudGljYXRlIHJlbW90ZSBkZXZpY2UgKi8KK2ludCBoY2lfY29ubl9hdXRoKHN0cnVjdCBoY2lfY29ubiAqY29ubikKK3sKKwlCVF9EQkcoImNvbm4gJXAiLCBjb25uKTsKKworCWlmIChjb25uLT5saW5rX21vZGUgJiBIQ0lfTE1fQVVUSCkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoSENJX0NPTk5fQVVUSF9QRU5ELCAmY29ubi0+cGVuZCkpIHsKKwkJc3RydWN0IGhjaV9jcF9hdXRoX3JlcXVlc3RlZCBjcDsKKwkJY3AuaGFuZGxlID0gX19jcHVfdG9fbGUxNihjb25uLT5oYW5kbGUpOworCQloY2lfc2VuZF9jbWQoY29ubi0+aGRldiwgT0dGX0xJTktfQ1RMLCBPQ0ZfQVVUSF9SRVFVRVNURUQsIHNpemVvZihjcCksICZjcCk7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChoY2lfY29ubl9hdXRoKTsKKworLyogRW5hYmxlIGVuY3J5cHRpb24gKi8KK2ludCBoY2lfY29ubl9lbmNyeXB0KHN0cnVjdCBoY2lfY29ubiAqY29ubikKK3sKKwlCVF9EQkcoImNvbm4gJXAiLCBjb25uKTsKKworCWlmIChjb25uLT5saW5rX21vZGUgJiBIQ0lfTE1fRU5DUllQVCkKKwkJcmV0dXJuIDE7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChIQ0lfQ09OTl9FTkNSWVBUX1BFTkQsICZjb25uLT5wZW5kKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoaGNpX2Nvbm5fYXV0aChjb25uKSkgeworCQlzdHJ1Y3QgaGNpX2NwX3NldF9jb25uX2VuY3J5cHQgY3A7CisJCWNwLmhhbmRsZSAgPSBfX2NwdV90b19sZTE2KGNvbm4tPmhhbmRsZSk7CisJCWNwLmVuY3J5cHQgPSAxOyAKKwkJaGNpX3NlbmRfY21kKGNvbm4tPmhkZXYsIE9HRl9MSU5LX0NUTCwgT0NGX1NFVF9DT05OX0VOQ1JZUFQsIHNpemVvZihjcCksICZjcCk7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChoY2lfY29ubl9lbmNyeXB0KTsKKworLyogQ2hhbmdlIGxpbmsga2V5ICovCitpbnQgaGNpX2Nvbm5fY2hhbmdlX2xpbmtfa2V5KHN0cnVjdCBoY2lfY29ubiAqY29ubikKK3sKKwlCVF9EQkcoImNvbm4gJXAiLCBjb25uKTsKKworCWlmICghdGVzdF9hbmRfc2V0X2JpdChIQ0lfQ09OTl9BVVRIX1BFTkQsICZjb25uLT5wZW5kKSkgeworCQlzdHJ1Y3QgaGNpX2NwX2NoYW5nZV9jb25uX2xpbmtfa2V5IGNwOworCQljcC5oYW5kbGUgPSBfX2NwdV90b19sZTE2KGNvbm4tPmhhbmRsZSk7CisJCWhjaV9zZW5kX2NtZChjb25uLT5oZGV2LCBPR0ZfTElOS19DVEwsIE9DRl9DSEFOR0VfQ09OTl9MSU5LX0tFWSwgc2l6ZW9mKGNwKSwgJmNwKTsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGhjaV9jb25uX2NoYW5nZV9saW5rX2tleSk7CisKKy8qIFN3aXRjaCByb2xlICovCitpbnQgaGNpX2Nvbm5fc3dpdGNoX3JvbGUoc3RydWN0IGhjaV9jb25uICpjb25uLCB1aW50OF90IHJvbGUpCit7CisJQlRfREJHKCJjb25uICVwIiwgY29ubik7CisKKwlpZiAoIXJvbGUgJiYgY29ubi0+bGlua19tb2RlICYgSENJX0xNX01BU1RFUikKKwkJcmV0dXJuIDE7CisKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoSENJX0NPTk5fUlNXSVRDSF9QRU5ELCAmY29ubi0+cGVuZCkpIHsKKwkJc3RydWN0IGhjaV9jcF9zd2l0Y2hfcm9sZSBjcDsKKwkJYmFjcHkoJmNwLmJkYWRkciwgJmNvbm4tPmRzdCk7CisJCWNwLnJvbGUgPSByb2xlOworCQloY2lfc2VuZF9jbWQoY29ubi0+aGRldiwgT0dGX0xJTktfUE9MSUNZLCBPQ0ZfU1dJVENIX1JPTEUsIHNpemVvZihjcCksICZjcCk7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChoY2lfY29ubl9zd2l0Y2hfcm9sZSk7CisKKy8qIERyb3AgYWxsIGNvbm5lY3Rpb24gb24gdGhlIGRldmljZSAqLwordm9pZCBoY2lfY29ubl9oYXNoX2ZsdXNoKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXN0cnVjdCBoY2lfY29ubl9oYXNoICpoID0gJmhkZXYtPmNvbm5faGFzaDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCisJQlRfREJHKCJoZGV2ICVzIiwgaGRldi0+bmFtZSk7CisKKwlwID0gaC0+bGlzdC5uZXh0OworCXdoaWxlIChwICE9ICZoLT5saXN0KSB7CisJCXN0cnVjdCBoY2lfY29ubiAqYzsKKworCQljID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGNpX2Nvbm4sIGxpc3QpOworCQlwID0gcC0+bmV4dDsKKworCQljLT5zdGF0ZSA9IEJUX0NMT1NFRDsKKworCQloY2lfcHJvdG9fZGlzY29ubl9pbmQoYywgMHgxNik7CisJCWhjaV9jb25uX2RlbChjKTsKKwl9Cit9CisKK2ludCBoY2lfZ2V0X2Nvbm5fbGlzdCh2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBoY2lfY29ubl9saXN0X3JlcSByZXEsICpjbDsKKwlzdHJ1Y3QgaGNpX2Nvbm5faW5mbyAqY2k7CisJc3RydWN0IGhjaV9kZXYgKmhkZXY7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlpbnQgbiA9IDAsIHNpemUsIGVycjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxLCBhcmcsIHNpemVvZihyZXEpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoIXJlcS5jb25uX251bSB8fCByZXEuY29ubl9udW0gPiAoUEFHRV9TSVpFICogMikgLyBzaXplb2YoKmNpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzaXplID0gc2l6ZW9mKHJlcSkgKyByZXEuY29ubl9udW0gKiBzaXplb2YoKmNpKTsKKworCWlmICghKGNsID0gKHZvaWQgKikga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKSkpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKCEoaGRldiA9IGhjaV9kZXZfZ2V0KHJlcS5kZXZfaWQpKSkgeworCQlrZnJlZShjbCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWNpID0gY2wtPmNvbm5faW5mbzsKKworCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKKwlsaXN0X2Zvcl9lYWNoKHAsICZoZGV2LT5jb25uX2hhc2gubGlzdCkgeworCQlyZWdpc3RlciBzdHJ1Y3QgaGNpX2Nvbm4gKmM7CisJCWMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBoY2lfY29ubiwgbGlzdCk7CisKKwkJYmFjcHkoJihjaSArIG4pLT5iZGFkZHIsICZjLT5kc3QpOworCQkoY2kgKyBuKS0+aGFuZGxlID0gYy0+aGFuZGxlOworCQkoY2kgKyBuKS0+dHlwZSAgPSBjLT50eXBlOworCQkoY2kgKyBuKS0+b3V0ICAgPSBjLT5vdXQ7CisJCShjaSArIG4pLT5zdGF0ZSA9IGMtPnN0YXRlOworCQkoY2kgKyBuKS0+bGlua19tb2RlID0gYy0+bGlua19tb2RlOworCQlpZiAoKytuID49IHJlcS5jb25uX251bSkKKwkJCWJyZWFrOworCX0KKwloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKKworCWNsLT5kZXZfaWQgPSBoZGV2LT5pZDsKKwljbC0+Y29ubl9udW0gPSBuOworCXNpemUgPSBzaXplb2YocmVxKSArIG4gKiBzaXplb2YoKmNpKTsKKworCWhjaV9kZXZfcHV0KGhkZXYpOworCisJZXJyID0gY29weV90b191c2VyKGFyZywgY2wsIHNpemUpOworCWtmcmVlKGNsKTsKKworCXJldHVybiBlcnIgPyAtRUZBVUxUIDogMDsKK30KKworaW50IGhjaV9nZXRfY29ubl9pbmZvKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBoY2lfY29ubl9pbmZvX3JlcSByZXE7CisJc3RydWN0IGhjaV9jb25uX2luZm8gY2k7CisJc3RydWN0IGhjaV9jb25uICpjb25uOworCWNoYXIgX191c2VyICpwdHIgPSBhcmcgKyBzaXplb2YocmVxKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxLCBhcmcsIHNpemVvZihyZXEpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwloY2lfZGV2X2xvY2tfYmgoaGRldik7CisJY29ubiA9IGhjaV9jb25uX2hhc2hfbG9va3VwX2JhKGhkZXYsIHJlcS50eXBlLCAmcmVxLmJkYWRkcik7CisJaWYgKGNvbm4pIHsKKwkJYmFjcHkoJmNpLmJkYWRkciwgJmNvbm4tPmRzdCk7CisJCWNpLmhhbmRsZSA9IGNvbm4tPmhhbmRsZTsKKwkJY2kudHlwZSAgPSBjb25uLT50eXBlOworCQljaS5vdXQgICA9IGNvbm4tPm91dDsKKwkJY2kuc3RhdGUgPSBjb25uLT5zdGF0ZTsKKwkJY2kubGlua19tb2RlID0gY29ubi0+bGlua19tb2RlOworCX0KKwloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKKworCWlmICghY29ubikKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlyZXR1cm4gY29weV90b191c2VyKHB0ciwgJmNpLCBzaXplb2YoY2kpKSA/IC1FRkFVTFQgOiAwOworfQpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfY29yZS5jIGIvbmV0L2JsdWV0b290aC9oY2lfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MGRiYTcKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmMKQEAgLTAsMCArMSwxNDM0IEBACisvKiAKKyAgIEJsdWVaIC0gQmx1ZXRvb3RoIHByb3RvY29sIHN0YWNrIGZvciBMaW51eAorICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEgUXVhbGNvbW0gSW5jb3Jwb3JhdGVkCisKKyAgIFdyaXR0ZW4gMjAwMCwyMDAxIGJ5IE1heGltIEtyYXNueWFuc2t5IDxtYXhrQHF1YWxjb21tLmNvbT4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBBTkQgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZCisgICBDTEFJTSwgT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUyAKKyAgIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiAKKyAgIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIAorICAgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworICAgQUxMIExJQUJJTElUWSwgSU5DTFVESU5HIExJQUJJTElUWSBGT1IgSU5GUklOR0VNRU5UIE9GIEFOWSBQQVRFTlRTLCAKKyAgIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLCBSRUxBVElORyBUTyBVU0UgT0YgVEhJUyAKKyAgIFNPRlRXQVJFIElTIERJU0NMQUlNRUQuCisqLworCisvKiBCbHVldG9vdGggSENJIGNvcmUuICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmg+CisKKyNpZm5kZWYgQ09ORklHX0JUX0hDSV9DT1JFX0RFQlVHCisjdW5kZWYgIEJUX0RCRworI2RlZmluZSBCVF9EQkcoRC4uLikKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBoY2lfY21kX3Rhc2sodW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHZvaWQgaGNpX3J4X3Rhc2sodW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHZvaWQgaGNpX3R4X3Rhc2sodW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHZvaWQgaGNpX25vdGlmeShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgaW50IGV2ZW50KTsKKworc3RhdGljIERFRklORV9SV0xPQ0soaGNpX3Rhc2tfbG9jayk7CisKKy8qIEhDSSBkZXZpY2UgbGlzdCAqLworTElTVF9IRUFEKGhjaV9kZXZfbGlzdCk7CitERUZJTkVfUldMT0NLKGhjaV9kZXZfbGlzdF9sb2NrKTsKKworLyogSENJIGNhbGxiYWNrIGxpc3QgKi8KK0xJU1RfSEVBRChoY2lfY2JfbGlzdCk7CitERUZJTkVfUldMT0NLKGhjaV9jYl9saXN0X2xvY2spOworCisvKiBIQ0kgcHJvdG9jb2xzICovCisjZGVmaW5lIEhDSV9NQVhfUFJPVE8JMgorc3RydWN0IGhjaV9wcm90byAqaGNpX3Byb3RvW0hDSV9NQVhfUFJPVE9dOworCisvKiBIQ0kgbm90aWZpZXJzIGxpc3QgKi8KK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKmhjaV9ub3RpZmllcjsKKworLyogLS0tLSBIQ0kgbm90aWZpY2F0aW9ucyAtLS0tICovCisKK2ludCBoY2lfcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJmhjaV9ub3RpZmllciwgbmIpOworfQorCitpbnQgaGNpX3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmaGNpX25vdGlmaWVyLCBuYik7Cit9CisKK3ZvaWQgaGNpX25vdGlmeShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgaW50IGV2ZW50KQoreworCW5vdGlmaWVyX2NhbGxfY2hhaW4oJmhjaV9ub3RpZmllciwgZXZlbnQsIGhkZXYpOworfQorCisvKiAtLS0tIEhDSSByZXF1ZXN0cyAtLS0tICovCisKK3ZvaWQgaGNpX3JlcV9jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgaW50IHJlc3VsdCkKK3sKKwlCVF9EQkcoIiVzIHJlc3VsdCAweCUyLjJ4IiwgaGRldi0+bmFtZSwgcmVzdWx0KTsKKworCWlmIChoZGV2LT5yZXFfc3RhdHVzID09IEhDSV9SRVFfUEVORCkgeworCQloZGV2LT5yZXFfcmVzdWx0ID0gcmVzdWx0OworCQloZGV2LT5yZXFfc3RhdHVzID0gSENJX1JFUV9ET05FOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmhkZXYtPnJlcV93YWl0X3EpOworCX0KK30KKworc3RhdGljIHZvaWQgaGNpX3JlcV9jYW5jZWwoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGludCBlcnIpCit7CisJQlRfREJHKCIlcyBlcnIgMHglMi4yeCIsIGhkZXYtPm5hbWUsIGVycik7CisKKwlpZiAoaGRldi0+cmVxX3N0YXR1cyA9PSBIQ0lfUkVRX1BFTkQpIHsKKwkJaGRldi0+cmVxX3Jlc3VsdCA9IGVycjsKKwkJaGRldi0+cmVxX3N0YXR1cyA9IEhDSV9SRVFfQ0FOQ0VMRUQ7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaGRldi0+cmVxX3dhaXRfcSk7CisJfQorfQorCisvKiBFeGVjdXRlIHJlcXVlc3QgYW5kIHdhaXQgZm9yIGNvbXBsZXRpb24uICovCitzdGF0aWMgaW50IF9faGNpX3JlcXVlc3Qoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHZvaWQgKCpyZXEpKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1bnNpZ25lZCBsb25nIG9wdCksIAorCQkJCXVuc2lnbmVkIGxvbmcgb3B0LCBfX3UzMiB0aW1lb3V0KQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCWludCBlcnIgPSAwOworCisJQlRfREJHKCIlcyBzdGFydCIsIGhkZXYtPm5hbWUpOworCisJaGRldi0+cmVxX3N0YXR1cyA9IEhDSV9SRVFfUEVORDsKKworCWFkZF93YWl0X3F1ZXVlKCZoZGV2LT5yZXFfd2FpdF9xLCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCXJlcShoZGV2LCBvcHQpOworCXNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7CisKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmaGRldi0+cmVxX3dhaXRfcSwgJndhaXQpOworCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXR1cm4gLUVJTlRSOworCisJc3dpdGNoIChoZGV2LT5yZXFfc3RhdHVzKSB7CisJY2FzZSBIQ0lfUkVRX0RPTkU6CisJCWVyciA9IC1idF9lcnIoaGRldi0+cmVxX3Jlc3VsdCk7CisJCWJyZWFrOworCisJY2FzZSBIQ0lfUkVRX0NBTkNFTEVEOgorCQllcnIgPSAtaGRldi0+cmVxX3Jlc3VsdDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSAtRVRJTUVET1VUOworCQlicmVhazsKKwl9OworCisJaGRldi0+cmVxX3N0YXR1cyA9IGhkZXYtPnJlcV9yZXN1bHQgPSAwOworCisJQlRfREJHKCIlcyBlbmQ6IGVyciAlZCIsIGhkZXYtPm5hbWUsIGVycik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW5saW5lIGludCBoY2lfcmVxdWVzdChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdm9pZCAoKnJlcSkoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHVuc2lnbmVkIGxvbmcgb3B0KSwKKwkJCQl1bnNpZ25lZCBsb25nIG9wdCwgX191MzIgdGltZW91dCkKK3sKKwlpbnQgcmV0OworCisJLyogU2VyaWFsaXplIGFsbCByZXF1ZXN0cyAqLworCWhjaV9yZXFfbG9jayhoZGV2KTsKKwlyZXQgPSBfX2hjaV9yZXF1ZXN0KGhkZXYsIHJlcSwgb3B0LCB0aW1lb3V0KTsKKwloY2lfcmVxX3VubG9jayhoZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9yZXNldF9yZXEoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHVuc2lnbmVkIGxvbmcgb3B0KQoreworCUJUX0RCRygiJXMgJWxkIiwgaGRldi0+bmFtZSwgb3B0KTsKKworCS8qIFJlc2V0IGRldmljZSAqLworCWhjaV9zZW5kX2NtZChoZGV2LCBPR0ZfSE9TVF9DVEwsIE9DRl9SRVNFVCwgMCwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9pbml0X3JlcShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdW5zaWduZWQgbG9uZyBvcHQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlfX3UxNiBwYXJhbTsKKworCUJUX0RCRygiJXMgJWxkIiwgaGRldi0+bmFtZSwgb3B0KTsKKworCS8qIERyaXZlciBpbml0aWFsaXphdGlvbiAqLworCisJLyogU3BlY2lhbCBjb21tYW5kcyAqLworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmhkZXYtPmRyaXZlcl9pbml0KSkpIHsKKwkJc2tiLT5wa3RfdHlwZSA9IEhDSV9DT01NQU5EX1BLVDsKKwkJc2tiLT5kZXYgPSAodm9pZCAqKSBoZGV2OworCQlza2JfcXVldWVfdGFpbCgmaGRldi0+Y21kX3EsIHNrYik7CisJCWhjaV9zY2hlZF9jbWQoaGRldik7CisJfQorCXNrYl9xdWV1ZV9wdXJnZSgmaGRldi0+ZHJpdmVyX2luaXQpOworCisJLyogTWFuZGF0b3J5IGluaXRpYWxpemF0aW9uICovCisKKwkvKiBSZXNldCAqLworCWlmICh0ZXN0X2JpdChIQ0lfUVVJUktfUkVTRVRfT05fSU5JVCwgJmhkZXYtPnF1aXJrcykpCisJCQloY2lfc2VuZF9jbWQoaGRldiwgT0dGX0hPU1RfQ1RMLCBPQ0ZfUkVTRVQsIDAsIE5VTEwpOworCisJLyogUmVhZCBMb2NhbCBTdXBwb3J0ZWQgRmVhdHVyZXMgKi8KKwloY2lfc2VuZF9jbWQoaGRldiwgT0dGX0lORk9fUEFSQU0sIE9DRl9SRUFEX0xPQ0FMX0ZFQVRVUkVTLCAwLCBOVUxMKTsKKworCS8qIFJlYWQgQnVmZmVyIFNpemUgKEFDTCBtdHUsIG1heCBwa3QsIGV0Yy4pICovCisJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9JTkZPX1BBUkFNLCBPQ0ZfUkVBRF9CVUZGRVJfU0laRSwgMCwgTlVMTCk7CisKKyNpZiAwCisJLyogSG9zdCBidWZmZXIgc2l6ZSAqLworCXsKKwkJc3RydWN0IGhjaV9jcF9ob3N0X2J1ZmZlcl9zaXplIGNwOworCQljcC5hY2xfbXR1ID0gX19jcHVfdG9fbGUxNihIQ0lfTUFYX0FDTF9TSVpFKTsKKwkJY3Auc2NvX210dSA9IEhDSV9NQVhfU0NPX1NJWkU7CisJCWNwLmFjbF9tYXhfcGt0ID0gX19jcHVfdG9fbGUxNigweGZmZmYpOworCQljcC5zY29fbWF4X3BrdCA9IF9fY3B1X3RvX2xlMTYoMHhmZmZmKTsKKwkJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9IT1NUX0NUTCwgT0NGX0hPU1RfQlVGRkVSX1NJWkUsIHNpemVvZihjcCksICZjcCk7CisJfQorI2VuZGlmCisKKwkvKiBSZWFkIEJEIEFkZHJlc3MgKi8KKwloY2lfc2VuZF9jbWQoaGRldiwgT0dGX0lORk9fUEFSQU0sIE9DRl9SRUFEX0JEX0FERFIsIDAsIE5VTEwpOworCisJLyogUmVhZCBWb2ljZSBTZXR0aW5nICovCisJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9IT1NUX0NUTCwgT0NGX1JFQURfVk9JQ0VfU0VUVElORywgMCwgTlVMTCk7CisKKwkvKiBPcHRpb25hbCBpbml0aWFsaXphdGlvbiAqLworCisJLyogQ2xlYXIgRXZlbnQgRmlsdGVycyAqLworCXsKKwkJc3RydWN0IGhjaV9jcF9zZXRfZXZlbnRfZmx0IGNwOworCQljcC5mbHRfdHlwZSAgPSBIQ0lfRkxUX0NMRUFSX0FMTDsKKwkJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9IT1NUX0NUTCwgT0NGX1NFVF9FVkVOVF9GTFQsIHNpemVvZihjcCksICZjcCk7CisJfQorCisJLyogUGFnZSB0aW1lb3V0IH4yMCBzZWNzICovCisJcGFyYW0gPSBfX2NwdV90b19sZTE2KDB4ODAwMCk7CisJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9IT1NUX0NUTCwgT0NGX1dSSVRFX1BHX1RJTUVPVVQsIDIsICZwYXJhbSk7CisKKwkvKiBDb25uZWN0aW9uIGFjY2VwdCB0aW1lb3V0IH4yMCBzZWNzICovCisJcGFyYW0gPSBfX2NwdV90b19sZTE2KDB4N2QwMCk7CisJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9IT1NUX0NUTCwgT0NGX1dSSVRFX0NBX1RJTUVPVVQsIDIsICZwYXJhbSk7Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9zY2FuX3JlcShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdW5zaWduZWQgbG9uZyBvcHQpCit7CisJX191OCBzY2FuID0gb3B0OworCisJQlRfREJHKCIlcyAleCIsIGhkZXYtPm5hbWUsIHNjYW4pOworCisJLyogSW5xdWlyeSBhbmQgUGFnZSBzY2FucyAqLworCWhjaV9zZW5kX2NtZChoZGV2LCBPR0ZfSE9TVF9DVEwsIE9DRl9XUklURV9TQ0FOX0VOQUJMRSwgMSwgJnNjYW4pOworfQorCitzdGF0aWMgdm9pZCBoY2lfYXV0aF9yZXEoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHVuc2lnbmVkIGxvbmcgb3B0KQoreworCV9fdTggYXV0aCA9IG9wdDsKKworCUJUX0RCRygiJXMgJXgiLCBoZGV2LT5uYW1lLCBhdXRoKTsKKworCS8qIEF1dGhlbnRpY2F0aW9uICovCisJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9IT1NUX0NUTCwgT0NGX1dSSVRFX0FVVEhfRU5BQkxFLCAxLCAmYXV0aCk7Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9lbmNyeXB0X3JlcShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdW5zaWduZWQgbG9uZyBvcHQpCit7CisJX191OCBlbmNyeXB0ID0gb3B0OworCisJQlRfREJHKCIlcyAleCIsIGhkZXYtPm5hbWUsIGVuY3J5cHQpOworCisJLyogQXV0aGVudGljYXRpb24gKi8KKwloY2lfc2VuZF9jbWQoaGRldiwgT0dGX0hPU1RfQ1RMLCBPQ0ZfV1JJVEVfRU5DUllQVF9NT0RFLCAxLCAmZW5jcnlwdCk7Cit9CisKKy8qIEdldCBIQ0kgZGV2aWNlIGJ5IGluZGV4LiAKKyAqIERldmljZSBpcyBoZWxkIG9uIHJldHVybi4gKi8KK3N0cnVjdCBoY2lfZGV2ICpoY2lfZGV2X2dldChpbnQgaW5kZXgpCit7CisJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisKKwlCVF9EQkcoIiVkIiwgaW5kZXgpOworCisJaWYgKGluZGV4IDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZWFkX2xvY2soJmhjaV9kZXZfbGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoKHAsICZoY2lfZGV2X2xpc3QpIHsKKwkJc3RydWN0IGhjaV9kZXYgKmQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBoY2lfZGV2LCBsaXN0KTsKKwkJaWYgKGQtPmlkID09IGluZGV4KSB7CisJCQloZGV2ID0gaGNpX2Rldl9ob2xkKGQpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmVhZF91bmxvY2soJmhjaV9kZXZfbGlzdF9sb2NrKTsKKwlyZXR1cm4gaGRldjsKK30KK0VYUE9SVF9TWU1CT0woaGNpX2Rldl9nZXQpOworCisvKiAtLS0tIElucXVpcnkgc3VwcG9ydCAtLS0tICovCitzdGF0aWMgdm9pZCBpbnF1aXJ5X2NhY2hlX2ZsdXNoKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXN0cnVjdCBpbnF1aXJ5X2NhY2hlICpjYWNoZSA9ICZoZGV2LT5pbnFfY2FjaGU7CisJc3RydWN0IGlucXVpcnlfZW50cnkgKm5leHQgID0gY2FjaGUtPmxpc3QsICplOworCisJQlRfREJHKCJjYWNoZSAlcCIsIGNhY2hlKTsKKworCWNhY2hlLT5saXN0ID0gTlVMTDsKKwl3aGlsZSAoKGUgPSBuZXh0KSkgeworCQluZXh0ID0gZS0+bmV4dDsKKwkJa2ZyZWUoZSk7CisJfQorfQorCitzdHJ1Y3QgaW5xdWlyeV9lbnRyeSAqaGNpX2lucXVpcnlfY2FjaGVfbG9va3VwKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyKQoreworCXN0cnVjdCBpbnF1aXJ5X2NhY2hlICpjYWNoZSA9ICZoZGV2LT5pbnFfY2FjaGU7CisJc3RydWN0IGlucXVpcnlfZW50cnkgKmU7CisKKwlCVF9EQkcoImNhY2hlICVwLCAlcyIsIGNhY2hlLCBiYXRvc3RyKGJkYWRkcikpOworCisJZm9yIChlID0gY2FjaGUtPmxpc3Q7IGU7IGUgPSBlLT5uZXh0KQorCQlpZiAoIWJhY21wKCZlLT5kYXRhLmJkYWRkciwgYmRhZGRyKSkKKwkJCWJyZWFrOworCXJldHVybiBlOworfQorCit2b2lkIGhjaV9pbnF1aXJ5X2NhY2hlX3VwZGF0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IGlucXVpcnlfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgaW5xdWlyeV9jYWNoZSAqY2FjaGUgPSAmaGRldi0+aW5xX2NhY2hlOworCXN0cnVjdCBpbnF1aXJ5X2VudHJ5ICplOworCisJQlRfREJHKCJjYWNoZSAlcCwgJXMiLCBjYWNoZSwgYmF0b3N0cigmZGF0YS0+YmRhZGRyKSk7CisKKwlpZiAoIShlID0gaGNpX2lucXVpcnlfY2FjaGVfbG9va3VwKGhkZXYsICZkYXRhLT5iZGFkZHIpKSkgeworCQkvKiBFbnRyeSBub3QgaW4gdGhlIGNhY2hlLiBBZGQgbmV3IG9uZS4gKi8KKwkJaWYgKCEoZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpbnF1aXJ5X2VudHJ5KSwgR0ZQX0FUT01JQykpKQorCQkJcmV0dXJuOworCQltZW1zZXQoZSwgMCwgc2l6ZW9mKHN0cnVjdCBpbnF1aXJ5X2VudHJ5KSk7CisJCWUtPm5leHQgICAgID0gY2FjaGUtPmxpc3Q7CisJCWNhY2hlLT5saXN0ID0gZTsKKwl9CisKKwltZW1jcHkoJmUtPmRhdGEsIGRhdGEsIHNpemVvZigqZGF0YSkpOworCWUtPnRpbWVzdGFtcCA9IGppZmZpZXM7CisJY2FjaGUtPnRpbWVzdGFtcCA9IGppZmZpZXM7Cit9CisKK3N0YXRpYyBpbnQgaW5xdWlyeV9jYWNoZV9kdW1wKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBpbnQgbnVtLCBfX3U4ICpidWYpCit7CisJc3RydWN0IGlucXVpcnlfY2FjaGUgKmNhY2hlID0gJmhkZXYtPmlucV9jYWNoZTsKKwlzdHJ1Y3QgaW5xdWlyeV9pbmZvICppbmZvID0gKHN0cnVjdCBpbnF1aXJ5X2luZm8gKikgYnVmOworCXN0cnVjdCBpbnF1aXJ5X2VudHJ5ICplOworCWludCBjb3BpZWQgPSAwOworCisJZm9yIChlID0gY2FjaGUtPmxpc3Q7IGUgJiYgY29waWVkIDwgbnVtOyBlID0gZS0+bmV4dCwgY29waWVkKyspIHsKKwkJc3RydWN0IGlucXVpcnlfZGF0YSAqZGF0YSA9ICZlLT5kYXRhOworCQliYWNweSgmaW5mby0+YmRhZGRyLCAmZGF0YS0+YmRhZGRyKTsKKwkJaW5mby0+cHNjYW5fcmVwX21vZGUJPSBkYXRhLT5wc2Nhbl9yZXBfbW9kZTsKKwkJaW5mby0+cHNjYW5fcGVyaW9kX21vZGUJPSBkYXRhLT5wc2Nhbl9wZXJpb2RfbW9kZTsKKwkJaW5mby0+cHNjYW5fbW9kZQk9IGRhdGEtPnBzY2FuX21vZGU7CisJCW1lbWNweShpbmZvLT5kZXZfY2xhc3MsIGRhdGEtPmRldl9jbGFzcywgMyk7CisJCWluZm8tPmNsb2NrX29mZnNldAk9IGRhdGEtPmNsb2NrX29mZnNldDsKKwkJaW5mbysrOworCX0KKworCUJUX0RCRygiY2FjaGUgJXAsIGNvcGllZCAlZCIsIGNhY2hlLCBjb3BpZWQpOworCXJldHVybiBjb3BpZWQ7Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9pbnFfcmVxKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1bnNpZ25lZCBsb25nIG9wdCkKK3sKKwlzdHJ1Y3QgaGNpX2lucXVpcnlfcmVxICppciA9IChzdHJ1Y3QgaGNpX2lucXVpcnlfcmVxICopIG9wdDsKKwlzdHJ1Y3QgaGNpX2NwX2lucXVpcnkgY3A7CisKKwlCVF9EQkcoIiVzIiwgaGRldi0+bmFtZSk7CisKKwlpZiAodGVzdF9iaXQoSENJX0lOUVVJUlksICZoZGV2LT5mbGFncykpCisJCXJldHVybjsKKworCS8qIFN0YXJ0IElucXVpcnkgKi8KKwltZW1jcHkoJmNwLmxhcCwgJmlyLT5sYXAsIDMpOworCWNwLmxlbmd0aCAgPSBpci0+bGVuZ3RoOworCWNwLm51bV9yc3AgPSBpci0+bnVtX3JzcDsKKwloY2lfc2VuZF9jbWQoaGRldiwgT0dGX0xJTktfQ1RMLCBPQ0ZfSU5RVUlSWSwgc2l6ZW9mKGNwKSwgJmNwKTsKK30KKworaW50IGhjaV9pbnF1aXJ5KHZvaWQgX191c2VyICphcmcpCit7CisJX191OCBfX3VzZXIgKnB0ciA9IGFyZzsKKwlzdHJ1Y3QgaGNpX2lucXVpcnlfcmVxIGlyOworCXN0cnVjdCBoY2lfZGV2ICpoZGV2OworCWludCBlcnIgPSAwLCBkb19pbnF1aXJ5ID0gMCwgbWF4X3JzcDsKKwlsb25nIHRpbWVvOworCV9fdTggKmJ1ZjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmaXIsIHB0ciwgc2l6ZW9mKGlyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKCEoaGRldiA9IGhjaV9kZXZfZ2V0KGlyLmRldl9pZCkpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKKwlpZiAoaW5xdWlyeV9jYWNoZV9hZ2UoaGRldikgPiBJTlFVSVJZX0NBQ0hFX0FHRV9NQVggfHwgCisJCQkJCWlucXVpcnlfY2FjaGVfZW1wdHkoaGRldikgfHwKKwkJCQkJaXIuZmxhZ3MgJiBJUkVRX0NBQ0hFX0ZMVVNIKSB7CisJCWlucXVpcnlfY2FjaGVfZmx1c2goaGRldik7CisJCWRvX2lucXVpcnkgPSAxOworCX0KKwloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKKworCXRpbWVvID0gaXIubGVuZ3RoICogMiAqIEhaOworCWlmIChkb19pbnF1aXJ5ICYmIChlcnIgPSBoY2lfcmVxdWVzdChoZGV2LCBoY2lfaW5xX3JlcSwgKHVuc2lnbmVkIGxvbmcpJmlyLCB0aW1lbykpIDwgMCkKKwkJZ290byBkb25lOworCisJLyogZm9yIHVubGltaXRlZCBudW1iZXIgb2YgcmVzcG9uc2VzIHdlIHdpbGwgdXNlIGJ1ZmZlciB3aXRoIDI1NSBlbnRyaWVzICovCisJbWF4X3JzcCA9IChpci5udW1fcnNwID09IDApID8gMjU1IDogaXIubnVtX3JzcDsKKworCS8qIGNhY2hlX2R1bXAgY2FuJ3Qgc2xlZXAuIFRoZXJlZm9yZSB3ZSBhbGxvY2F0ZSB0ZW1wIGJ1ZmZlciBhbmQgdGhlbgorCSAqIGNvcHkgaXQgdG8gdGhlIHVzZXIgc3BhY2UuCisJICovCisJaWYgKCEoYnVmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlucXVpcnlfaW5mbykgKiBtYXhfcnNwLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBkb25lOworCX0KKworCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKKwlpci5udW1fcnNwID0gaW5xdWlyeV9jYWNoZV9kdW1wKGhkZXYsIG1heF9yc3AsIGJ1Zik7CisJaGNpX2Rldl91bmxvY2tfYmgoaGRldik7CisKKwlCVF9EQkcoIm51bV9yc3AgJWQiLCBpci5udW1fcnNwKTsKKworCWlmICghY29weV90b191c2VyKHB0ciwgJmlyLCBzaXplb2YoaXIpKSkgeworCQlwdHIgKz0gc2l6ZW9mKGlyKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihwdHIsIGJ1Ziwgc2l6ZW9mKHN0cnVjdCBpbnF1aXJ5X2luZm8pICoKKwkJCQkJaXIubnVtX3JzcCkpCisJCQllcnIgPSAtRUZBVUxUOworCX0gZWxzZSAKKwkJZXJyID0gLUVGQVVMVDsKKworCWtmcmVlKGJ1Zik7CisKK2RvbmU6CisJaGNpX2Rldl9wdXQoaGRldik7CisJcmV0dXJuIGVycjsKK30KKworLyogLS0tLSBIQ0kgaW9jdGwgaGVscGVycyAtLS0tICovCisKK2ludCBoY2lfZGV2X29wZW4oX191MTYgZGV2KQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2OworCWludCByZXQgPSAwOworCisJaWYgKCEoaGRldiA9IGhjaV9kZXZfZ2V0KGRldikpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCUJUX0RCRygiJXMgJXAiLCBoZGV2LT5uYW1lLCBoZGV2KTsKKworCWhjaV9yZXFfbG9jayhoZGV2KTsKKworCWlmICh0ZXN0X2JpdChIQ0lfVVAsICZoZGV2LT5mbGFncykpIHsKKwkJcmV0ID0gLUVBTFJFQURZOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHRlc3RfYml0KEhDSV9RVUlSS19SQVdfREVWSUNFLCAmaGRldi0+cXVpcmtzKSkKKwkJc2V0X2JpdChIQ0lfUkFXLCAmaGRldi0+ZmxhZ3MpOworCisJaWYgKGhkZXYtPm9wZW4oaGRldikpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBkb25lOworCX0KKworCWlmICghdGVzdF9iaXQoSENJX1JBVywgJmhkZXYtPmZsYWdzKSkgeworCQlhdG9taWNfc2V0KCZoZGV2LT5jbWRfY250LCAxKTsKKwkJc2V0X2JpdChIQ0lfSU5JVCwgJmhkZXYtPmZsYWdzKTsKKworCQkvL19faGNpX3JlcXVlc3QoaGRldiwgaGNpX3Jlc2V0X3JlcSwgMCwgSFopOworCQlyZXQgPSBfX2hjaV9yZXF1ZXN0KGhkZXYsIGhjaV9pbml0X3JlcSwgMCwgSENJX0lOSVRfVElNRU9VVCk7CisKKwkJY2xlYXJfYml0KEhDSV9JTklULCAmaGRldi0+ZmxhZ3MpOworCX0KKworCWlmICghcmV0KSB7CisJCWhjaV9kZXZfaG9sZChoZGV2KTsKKwkJc2V0X2JpdChIQ0lfVVAsICZoZGV2LT5mbGFncyk7CisJCWhjaV9ub3RpZnkoaGRldiwgSENJX0RFVl9VUCk7CisJfSBlbHNlIHsJCisJCS8qIEluaXQgZmFpbGVkLCBjbGVhbnVwICovCisJCXRhc2tsZXRfa2lsbCgmaGRldi0+cnhfdGFzayk7CisJCXRhc2tsZXRfa2lsbCgmaGRldi0+dHhfdGFzayk7CisJCXRhc2tsZXRfa2lsbCgmaGRldi0+Y21kX3Rhc2spOworCisJCXNrYl9xdWV1ZV9wdXJnZSgmaGRldi0+Y21kX3EpOworCQlza2JfcXVldWVfcHVyZ2UoJmhkZXYtPnJ4X3EpOworCisJCWlmIChoZGV2LT5mbHVzaCkKKwkJCWhkZXYtPmZsdXNoKGhkZXYpOworCisJCWlmIChoZGV2LT5zZW50X2NtZCkgeworCQkJa2ZyZWVfc2tiKGhkZXYtPnNlbnRfY21kKTsKKwkJCWhkZXYtPnNlbnRfY21kID0gTlVMTDsKKwkJfQorCisJCWhkZXYtPmNsb3NlKGhkZXYpOworCQloZGV2LT5mbGFncyA9IDA7CisJfQorCitkb25lOgorCWhjaV9yZXFfdW5sb2NrKGhkZXYpOworCWhjaV9kZXZfcHV0KGhkZXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaGNpX2Rldl9kb19jbG9zZShzdHJ1Y3QgaGNpX2RldiAqaGRldikKK3sKKwlCVF9EQkcoIiVzICVwIiwgaGRldi0+bmFtZSwgaGRldik7CisKKwloY2lfcmVxX2NhbmNlbChoZGV2LCBFTk9ERVYpOworCWhjaV9yZXFfbG9jayhoZGV2KTsKKworCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KEhDSV9VUCwgJmhkZXYtPmZsYWdzKSkgeworCQloY2lfcmVxX3VubG9jayhoZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogS2lsbCBSWCBhbmQgVFggdGFza3MgKi8KKwl0YXNrbGV0X2tpbGwoJmhkZXYtPnJ4X3Rhc2spOworCXRhc2tsZXRfa2lsbCgmaGRldi0+dHhfdGFzayk7CisKKwloY2lfZGV2X2xvY2tfYmgoaGRldik7CisJaW5xdWlyeV9jYWNoZV9mbHVzaChoZGV2KTsKKwloY2lfY29ubl9oYXNoX2ZsdXNoKGhkZXYpOworCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOworCisJaGNpX25vdGlmeShoZGV2LCBIQ0lfREVWX0RPV04pOworCisJaWYgKGhkZXYtPmZsdXNoKQorCQloZGV2LT5mbHVzaChoZGV2KTsKKworCS8qIFJlc2V0IGRldmljZSAqLworCXNrYl9xdWV1ZV9wdXJnZSgmaGRldi0+Y21kX3EpOworCWF0b21pY19zZXQoJmhkZXYtPmNtZF9jbnQsIDEpOworCWlmICghdGVzdF9iaXQoSENJX1JBVywgJmhkZXYtPmZsYWdzKSkgeworCQlzZXRfYml0KEhDSV9JTklULCAmaGRldi0+ZmxhZ3MpOworCQlfX2hjaV9yZXF1ZXN0KGhkZXYsIGhjaV9yZXNldF9yZXEsIDAsIEhaLzQpOworCQljbGVhcl9iaXQoSENJX0lOSVQsICZoZGV2LT5mbGFncyk7CisJfQorCisJLyogS2lsbCBjbWQgdGFzayAqLworCXRhc2tsZXRfa2lsbCgmaGRldi0+Y21kX3Rhc2spOworCisJLyogRHJvcCBxdWV1ZXMgKi8KKwlza2JfcXVldWVfcHVyZ2UoJmhkZXYtPnJ4X3EpOworCXNrYl9xdWV1ZV9wdXJnZSgmaGRldi0+Y21kX3EpOworCXNrYl9xdWV1ZV9wdXJnZSgmaGRldi0+cmF3X3EpOworCisJLyogRHJvcCBsYXN0IHNlbnQgY29tbWFuZCAqLworCWlmIChoZGV2LT5zZW50X2NtZCkgeworCQlrZnJlZV9za2IoaGRldi0+c2VudF9jbWQpOworCQloZGV2LT5zZW50X2NtZCA9IE5VTEw7CisJfQorCisJLyogQWZ0ZXIgdGhpcyBwb2ludCBvdXIgcXVldWVzIGFyZSBlbXB0eQorCSAqIGFuZCBubyB0YXNrcyBhcmUgc2NoZWR1bGVkLiAqLworCWhkZXYtPmNsb3NlKGhkZXYpOworCisJLyogQ2xlYXIgZmxhZ3MgKi8KKwloZGV2LT5mbGFncyA9IDA7CisKKwloY2lfcmVxX3VubG9jayhoZGV2KTsKKworCWhjaV9kZXZfcHV0KGhkZXYpOworCXJldHVybiAwOworfQorCitpbnQgaGNpX2Rldl9jbG9zZShfX3UxNiBkZXYpCit7CisJc3RydWN0IGhjaV9kZXYgKmhkZXY7CisJaW50IGVycjsKKworCWlmICghKGhkZXYgPSBoY2lfZGV2X2dldChkZXYpKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJZXJyID0gaGNpX2Rldl9kb19jbG9zZShoZGV2KTsKKwloY2lfZGV2X3B1dChoZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgaGNpX2Rldl9yZXNldChfX3UxNiBkZXYpCit7CisJc3RydWN0IGhjaV9kZXYgKmhkZXY7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIShoZGV2ID0gaGNpX2Rldl9nZXQoZGV2KSkpCisJCXJldHVybiAtRU5PREVWOworCisJaGNpX3JlcV9sb2NrKGhkZXYpOworCXRhc2tsZXRfZGlzYWJsZSgmaGRldi0+dHhfdGFzayk7CisKKwlpZiAoIXRlc3RfYml0KEhDSV9VUCwgJmhkZXYtPmZsYWdzKSkKKwkJZ290byBkb25lOworCisJLyogRHJvcCBxdWV1ZXMgKi8KKwlza2JfcXVldWVfcHVyZ2UoJmhkZXYtPnJ4X3EpOworCXNrYl9xdWV1ZV9wdXJnZSgmaGRldi0+Y21kX3EpOworCisJaGNpX2Rldl9sb2NrX2JoKGhkZXYpOworCWlucXVpcnlfY2FjaGVfZmx1c2goaGRldik7CisJaGNpX2Nvbm5faGFzaF9mbHVzaChoZGV2KTsKKwloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKKworCWlmIChoZGV2LT5mbHVzaCkKKwkJaGRldi0+Zmx1c2goaGRldik7CisKKwlhdG9taWNfc2V0KCZoZGV2LT5jbWRfY250LCAxKTsgCisJaGRldi0+YWNsX2NudCA9IDA7IGhkZXYtPnNjb19jbnQgPSAwOworCisJaWYgKCF0ZXN0X2JpdChIQ0lfUkFXLCAmaGRldi0+ZmxhZ3MpKQorCQlyZXQgPSBfX2hjaV9yZXF1ZXN0KGhkZXYsIGhjaV9yZXNldF9yZXEsIDAsIEhDSV9JTklUX1RJTUVPVVQpOworCitkb25lOgorCXRhc2tsZXRfZW5hYmxlKCZoZGV2LT50eF90YXNrKTsKKwloY2lfcmVxX3VubG9jayhoZGV2KTsKKwloY2lfZGV2X3B1dChoZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgaGNpX2Rldl9yZXNldF9zdGF0KF9fdTE2IGRldikKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghKGhkZXYgPSBoY2lfZGV2X2dldChkZXYpKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltZW1zZXQoJmhkZXYtPnN0YXQsIDAsIHNpemVvZihzdHJ1Y3QgaGNpX2Rldl9zdGF0cykpOworCisJaGNpX2Rldl9wdXQoaGRldik7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgaGNpX2Rldl9jbWQodW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKKwlzdHJ1Y3QgaGNpX2Rldl9yZXEgZHI7CisJaW50IGVyciA9IDA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmRyLCBhcmcsIHNpemVvZihkcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICghKGhkZXYgPSBoY2lfZGV2X2dldChkci5kZXZfaWQpKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSENJU0VUQVVUSDoKKwkJZXJyID0gaGNpX3JlcXVlc3QoaGRldiwgaGNpX2F1dGhfcmVxLCBkci5kZXZfb3B0LCBIQ0lfSU5JVF9USU1FT1VUKTsKKwkJYnJlYWs7CisKKwljYXNlIEhDSVNFVEVOQ1JZUFQ6CisJCWlmICghbG1wX2VuY3J5cHRfY2FwYWJsZShoZGV2KSkgeworCQkJZXJyID0gLUVPUE5PVFNVUFA7CisJCQlicmVhazsKKwkJfQorCisJCWlmICghdGVzdF9iaXQoSENJX0FVVEgsICZoZGV2LT5mbGFncykpIHsKKwkJCS8qIEF1dGggbXVzdCBiZSBlbmFibGVkIGZpcnN0ICovCisJCQllcnIgPSBoY2lfcmVxdWVzdChoZGV2LCBoY2lfYXV0aF9yZXEsCisJCQkJCWRyLmRldl9vcHQsIEhDSV9JTklUX1RJTUVPVVQpOworCQkJaWYgKGVycikKKwkJCQlicmVhazsKKwkJfQorCisJCWVyciA9IGhjaV9yZXF1ZXN0KGhkZXYsIGhjaV9lbmNyeXB0X3JlcSwKKwkJCQkJZHIuZGV2X29wdCwgSENJX0lOSVRfVElNRU9VVCk7CisJCWJyZWFrOworCisJY2FzZSBIQ0lTRVRTQ0FOOgorCQllcnIgPSBoY2lfcmVxdWVzdChoZGV2LCBoY2lfc2Nhbl9yZXEsIGRyLmRldl9vcHQsIEhDSV9JTklUX1RJTUVPVVQpOworCQlicmVhazsKKworCWNhc2UgSENJU0VUUFRZUEU6CisJCWhkZXYtPnBrdF90eXBlID0gKF9fdTE2KSBkci5kZXZfb3B0OworCQlicmVhazsKKworCWNhc2UgSENJU0VUTElOS1BPTDoKKwkJaGRldi0+bGlua19wb2xpY3kgPSAoX191MTYpIGRyLmRldl9vcHQ7CisJCWJyZWFrOworCisJY2FzZSBIQ0lTRVRMSU5LTU9ERToKKwkJaGRldi0+bGlua19tb2RlID0gKChfX3UxNikgZHIuZGV2X29wdCkgJiAoSENJX0xNX01BU1RFUiB8IEhDSV9MTV9BQ0NFUFQpOworCQlicmVhazsKKworCWNhc2UgSENJU0VUQUNMTVRVOgorCQloZGV2LT5hY2xfbXR1ICA9ICooKF9fdTE2ICopJmRyLmRldl9vcHQgKyAxKTsKKwkJaGRldi0+YWNsX3BrdHMgPSAqKChfX3UxNiAqKSZkci5kZXZfb3B0ICsgMCk7CisJCWJyZWFrOworCisJY2FzZSBIQ0lTRVRTQ09NVFU6CisJCWhkZXYtPnNjb19tdHUgID0gKigoX191MTYgKikmZHIuZGV2X29wdCArIDEpOworCQloZGV2LT5zY29fcGt0cyA9ICooKF9fdTE2ICopJmRyLmRldl9vcHQgKyAwKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJaGNpX2Rldl9wdXQoaGRldik7CisJcmV0dXJuIGVycjsKK30KKworaW50IGhjaV9nZXRfZGV2X2xpc3Qodm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgaGNpX2Rldl9saXN0X3JlcSAqZGw7CisJc3RydWN0IGhjaV9kZXZfcmVxICpkcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCWludCBuID0gMCwgc2l6ZSwgZXJyOworCV9fdTE2IGRldl9udW07CisKKwlpZiAoZ2V0X3VzZXIoZGV2X251bSwgKF9fdTE2IF9fdXNlciAqKSBhcmcpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICghZGV2X251bSB8fCBkZXZfbnVtID4gKFBBR0VfU0laRSAqIDIpIC8gc2l6ZW9mKCpkcikpCisJCXJldHVybiAtRUlOVkFMOworCisJc2l6ZSA9IHNpemVvZigqZGwpICsgZGV2X251bSAqIHNpemVvZigqZHIpOworCisJaWYgKCEoZGwgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkciA9IGRsLT5kZXZfcmVxOworCisJcmVhZF9sb2NrX2JoKCZoY2lfZGV2X2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaChwLCAmaGNpX2Rldl9saXN0KSB7CisJCXN0cnVjdCBoY2lfZGV2ICpoZGV2OworCQloZGV2ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGNpX2RldiwgbGlzdCk7CisJCShkciArIG4pLT5kZXZfaWQgID0gaGRldi0+aWQ7CisJCShkciArIG4pLT5kZXZfb3B0ID0gaGRldi0+ZmxhZ3M7CisJCWlmICgrK24gPj0gZGV2X251bSkKKwkJCWJyZWFrOworCX0KKwlyZWFkX3VubG9ja19iaCgmaGNpX2Rldl9saXN0X2xvY2spOworCisJZGwtPmRldl9udW0gPSBuOworCXNpemUgPSBzaXplb2YoKmRsKSArIG4gKiBzaXplb2YoKmRyKTsKKworCWVyciA9IGNvcHlfdG9fdXNlcihhcmcsIGRsLCBzaXplKTsKKwlrZnJlZShkbCk7CisKKwlyZXR1cm4gZXJyID8gLUVGQVVMVCA6IDA7Cit9CisKK2ludCBoY2lfZ2V0X2Rldl9pbmZvKHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGhjaV9kZXYgKmhkZXY7CisJc3RydWN0IGhjaV9kZXZfaW5mbyBkaTsKKwlpbnQgZXJyID0gMDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZGksIGFyZywgc2l6ZW9mKGRpKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKCEoaGRldiA9IGhjaV9kZXZfZ2V0KGRpLmRldl9pZCkpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXN0cmNweShkaS5uYW1lLCBoZGV2LT5uYW1lKTsKKwlkaS5iZGFkZHIgICA9IGhkZXYtPmJkYWRkcjsKKwlkaS50eXBlICAgICA9IGhkZXYtPnR5cGU7CisJZGkuZmxhZ3MgICAgPSBoZGV2LT5mbGFnczsKKwlkaS5wa3RfdHlwZSA9IGhkZXYtPnBrdF90eXBlOworCWRpLmFjbF9tdHUgID0gaGRldi0+YWNsX210dTsKKwlkaS5hY2xfcGt0cyA9IGhkZXYtPmFjbF9wa3RzOworCWRpLnNjb19tdHUgID0gaGRldi0+c2NvX210dTsKKwlkaS5zY29fcGt0cyA9IGhkZXYtPnNjb19wa3RzOworCWRpLmxpbmtfcG9saWN5ID0gaGRldi0+bGlua19wb2xpY3k7CisJZGkubGlua19tb2RlICAgPSBoZGV2LT5saW5rX21vZGU7CisKKwltZW1jcHkoJmRpLnN0YXQsICZoZGV2LT5zdGF0LCBzaXplb2YoZGkuc3RhdCkpOworCW1lbWNweSgmZGkuZmVhdHVyZXMsICZoZGV2LT5mZWF0dXJlcywgc2l6ZW9mKGRpLmZlYXR1cmVzKSk7CisKKwlpZiAoY29weV90b191c2VyKGFyZywgJmRpLCBzaXplb2YoZGkpKSkKKwkJZXJyID0gLUVGQVVMVDsKKworCWhjaV9kZXZfcHV0KGhkZXYpOworCisJcmV0dXJuIGVycjsKK30KKworLyogLS0tLSBJbnRlcmZhY2UgdG8gSENJIGRyaXZlcnMgLS0tLSAqLworCisvKiBBbGxvYyBIQ0kgZGV2aWNlICovCitzdHJ1Y3QgaGNpX2RldiAqaGNpX2FsbG9jX2Rldih2b2lkKQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2OworCisJaGRldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBoY2lfZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoZGV2KQorCQlyZXR1cm4gTlVMTDsKKworCW1lbXNldChoZGV2LCAwLCBzaXplb2Yoc3RydWN0IGhjaV9kZXYpKTsKKworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmhkZXYtPmRyaXZlcl9pbml0KTsKKworCXJldHVybiBoZGV2OworfQorRVhQT1JUX1NZTUJPTChoY2lfYWxsb2NfZGV2KTsKKworLyogRnJlZSBIQ0kgZGV2aWNlICovCit2b2lkIGhjaV9mcmVlX2RldihzdHJ1Y3QgaGNpX2RldiAqaGRldikKK3sKKwlza2JfcXVldWVfcHVyZ2UoJmhkZXYtPmRyaXZlcl9pbml0KTsKKworCS8qIHdpbGwgZnJlZSB2aWEgY2xhc3MgcmVsZWFzZSAqLworCWNsYXNzX2RldmljZV9wdXQoJmhkZXYtPmNsYXNzX2Rldik7Cit9CitFWFBPUlRfU1lNQk9MKGhjaV9mcmVlX2Rldik7CisKKy8qIFJlZ2lzdGVyIEhDSSBkZXZpY2UgKi8KK2ludCBoY2lfcmVnaXN0ZXJfZGV2KHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmaGNpX2Rldl9saXN0LCAqcDsKKwlpbnQgaWQgPSAwOworCisJQlRfREJHKCIlcCBuYW1lICVzIHR5cGUgJWQgb3duZXIgJXAiLCBoZGV2LCBoZGV2LT5uYW1lLCBoZGV2LT50eXBlLCBoZGV2LT5vd25lcik7CisKKwlpZiAoIWhkZXYtPm9wZW4gfHwgIWhkZXYtPmNsb3NlIHx8ICFoZGV2LT5kZXN0cnVjdCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3cml0ZV9sb2NrX2JoKCZoY2lfZGV2X2xpc3RfbG9jayk7CisKKwkvKiBGaW5kIGZpcnN0IGF2YWlsYWJsZSBkZXZpY2UgaWQgKi8KKwlsaXN0X2Zvcl9lYWNoKHAsICZoY2lfZGV2X2xpc3QpIHsKKwkJaWYgKGxpc3RfZW50cnkocCwgc3RydWN0IGhjaV9kZXYsIGxpc3QpLT5pZCAhPSBpZCkKKwkJCWJyZWFrOworCQloZWFkID0gcDsgaWQrKzsKKwl9CisJCisJc3ByaW50ZihoZGV2LT5uYW1lLCAiaGNpJWQiLCBpZCk7CisJaGRldi0+aWQgPSBpZDsKKwlsaXN0X2FkZCgmaGRldi0+bGlzdCwgaGVhZCk7CisKKwlhdG9taWNfc2V0KCZoZGV2LT5yZWZjbnQsIDEpOworCXNwaW5fbG9ja19pbml0KCZoZGV2LT5sb2NrKTsKKworCWhkZXYtPmZsYWdzID0gMDsKKwloZGV2LT5wa3RfdHlwZSAgPSAoSENJX0RNMSB8IEhDSV9ESDEgfCBIQ0lfSFYxKTsKKwloZGV2LT5saW5rX21vZGUgPSAoSENJX0xNX0FDQ0VQVCk7CisKKwl0YXNrbGV0X2luaXQoJmhkZXYtPmNtZF90YXNrLCBoY2lfY21kX3Rhc2ssKHVuc2lnbmVkIGxvbmcpIGhkZXYpOworCXRhc2tsZXRfaW5pdCgmaGRldi0+cnhfdGFzaywgaGNpX3J4X3Rhc2ssICh1bnNpZ25lZCBsb25nKSBoZGV2KTsKKwl0YXNrbGV0X2luaXQoJmhkZXYtPnR4X3Rhc2ssIGhjaV90eF90YXNrLCAodW5zaWduZWQgbG9uZykgaGRldik7CisKKwlza2JfcXVldWVfaGVhZF9pbml0KCZoZGV2LT5yeF9xKTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZoZGV2LT5jbWRfcSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmaGRldi0+cmF3X3EpOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmaGRldi0+cmVxX3dhaXRfcSk7CisJaW5pdF9NVVRFWCgmaGRldi0+cmVxX2xvY2spOworCisJaW5xdWlyeV9jYWNoZV9pbml0KGhkZXYpOworCisJaGNpX2Nvbm5faGFzaF9pbml0KGhkZXYpOworCisJbWVtc2V0KCZoZGV2LT5zdGF0LCAwLCBzaXplb2Yoc3RydWN0IGhjaV9kZXZfc3RhdHMpKTsKKworCWF0b21pY19zZXQoJmhkZXYtPnByb21pc2MsIDApOworCisJd3JpdGVfdW5sb2NrX2JoKCZoY2lfZGV2X2xpc3RfbG9jayk7CisKKwloY2lfcmVnaXN0ZXJfc3lzZnMoaGRldik7CisKKwloY2lfbm90aWZ5KGhkZXYsIEhDSV9ERVZfUkVHKTsKKworCXJldHVybiBpZDsKK30KK0VYUE9SVF9TWU1CT0woaGNpX3JlZ2lzdGVyX2Rldik7CisKKy8qIFVucmVnaXN0ZXIgSENJIGRldmljZSAqLworaW50IGhjaV91bnJlZ2lzdGVyX2RldihzdHJ1Y3QgaGNpX2RldiAqaGRldikKK3sKKwlCVF9EQkcoIiVwIG5hbWUgJXMgdHlwZSAlZCIsIGhkZXYsIGhkZXYtPm5hbWUsIGhkZXYtPnR5cGUpOworCisJaGNpX3VucmVnaXN0ZXJfc3lzZnMoaGRldik7CisKKwl3cml0ZV9sb2NrX2JoKCZoY2lfZGV2X2xpc3RfbG9jayk7CisJbGlzdF9kZWwoJmhkZXYtPmxpc3QpOworCXdyaXRlX3VubG9ja19iaCgmaGNpX2Rldl9saXN0X2xvY2spOworCisJaGNpX2Rldl9kb19jbG9zZShoZGV2KTsKKworCWhjaV9ub3RpZnkoaGRldiwgSENJX0RFVl9VTlJFRyk7CisKKwlfX2hjaV9kZXZfcHV0KGhkZXYpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChoY2lfdW5yZWdpc3Rlcl9kZXYpOworCisvKiBTdXNwZW5kIEhDSSBkZXZpY2UgKi8KK2ludCBoY2lfc3VzcGVuZF9kZXYoc3RydWN0IGhjaV9kZXYgKmhkZXYpCit7CisJaGNpX25vdGlmeShoZGV2LCBIQ0lfREVWX1NVU1BFTkQpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChoY2lfc3VzcGVuZF9kZXYpOworCisvKiBSZXN1bWUgSENJIGRldmljZSAqLworaW50IGhjaV9yZXN1bWVfZGV2KHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCWhjaV9ub3RpZnkoaGRldiwgSENJX0RFVl9SRVNVTUUpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChoY2lfcmVzdW1lX2Rldik7CisKKy8qIC0tLS0gSW50ZXJmYWNlIHRvIHVwcGVyIHByb3RvY29scyAtLS0tICovCisKKy8qIFJlZ2lzdGVyL1VucmVnaXN0ZXIgcHJvdG9jb2xzLgorICogaGNpX3Rhc2tfbG9jayBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IG5vIHRhc2tzIGFyZSBydW5uaW5nLiAqLworaW50IGhjaV9yZWdpc3Rlcl9wcm90byhzdHJ1Y3QgaGNpX3Byb3RvICpocCkKK3sKKwlpbnQgZXJyID0gMDsKKworCUJUX0RCRygiJXAgbmFtZSAlcyBpZCAlZCIsIGhwLCBocC0+bmFtZSwgaHAtPmlkKTsKKworCWlmIChocC0+aWQgPj0gSENJX01BWF9QUk9UTykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3cml0ZV9sb2NrX2JoKCZoY2lfdGFza19sb2NrKTsKKworCWlmICghaGNpX3Byb3RvW2hwLT5pZF0pCisJCWhjaV9wcm90b1tocC0+aWRdID0gaHA7CisJZWxzZQorCQllcnIgPSAtRUVYSVNUOworCisJd3JpdGVfdW5sb2NrX2JoKCZoY2lfdGFza19sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGhjaV9yZWdpc3Rlcl9wcm90byk7CisKK2ludCBoY2lfdW5yZWdpc3Rlcl9wcm90byhzdHJ1Y3QgaGNpX3Byb3RvICpocCkKK3sKKwlpbnQgZXJyID0gMDsKKworCUJUX0RCRygiJXAgbmFtZSAlcyBpZCAlZCIsIGhwLCBocC0+bmFtZSwgaHAtPmlkKTsKKworCWlmIChocC0+aWQgPj0gSENJX01BWF9QUk9UTykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3cml0ZV9sb2NrX2JoKCZoY2lfdGFza19sb2NrKTsKKworCWlmIChoY2lfcHJvdG9baHAtPmlkXSkKKwkJaGNpX3Byb3RvW2hwLT5pZF0gPSBOVUxMOworCWVsc2UKKwkJZXJyID0gLUVOT0VOVDsKKworCXdyaXRlX3VubG9ja19iaCgmaGNpX3Rhc2tfbG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChoY2lfdW5yZWdpc3Rlcl9wcm90byk7CisKK2ludCBoY2lfcmVnaXN0ZXJfY2Ioc3RydWN0IGhjaV9jYiAqY2IpCit7CisJQlRfREJHKCIlcCBuYW1lICVzIiwgY2IsIGNiLT5uYW1lKTsKKworCXdyaXRlX2xvY2tfYmgoJmhjaV9jYl9saXN0X2xvY2spOworCWxpc3RfYWRkKCZjYi0+bGlzdCwgJmhjaV9jYl9saXN0KTsKKwl3cml0ZV91bmxvY2tfYmgoJmhjaV9jYl9saXN0X2xvY2spOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGhjaV9yZWdpc3Rlcl9jYik7CisKK2ludCBoY2lfdW5yZWdpc3Rlcl9jYihzdHJ1Y3QgaGNpX2NiICpjYikKK3sKKwlCVF9EQkcoIiVwIG5hbWUgJXMiLCBjYiwgY2ItPm5hbWUpOworCisJd3JpdGVfbG9ja19iaCgmaGNpX2NiX2xpc3RfbG9jayk7CisJbGlzdF9kZWwoJmNiLT5saXN0KTsKKwl3cml0ZV91bmxvY2tfYmgoJmhjaV9jYl9saXN0X2xvY2spOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGhjaV91bnJlZ2lzdGVyX2NiKTsKKworc3RhdGljIGludCBoY2lfc2VuZF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gKHN0cnVjdCBoY2lfZGV2ICopIHNrYi0+ZGV2OworCisJaWYgKCFoZGV2KSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlCVF9EQkcoIiVzIHR5cGUgJWQgbGVuICVkIiwgaGRldi0+bmFtZSwgc2tiLT5wa3RfdHlwZSwgc2tiLT5sZW4pOworCisJaWYgKGF0b21pY19yZWFkKCZoZGV2LT5wcm9taXNjKSkgeworCQkvKiBUaW1lIHN0YW1wICovCisJCWRvX2dldHRpbWVvZmRheSgmc2tiLT5zdGFtcCk7CisKKwkJaGNpX3NlbmRfdG9fc29jayhoZGV2LCBza2IpOworCX0KKworCS8qIEdldCByaWQgb2Ygc2tiIG93bmVyLCBwcmlvciB0byBzZW5kaW5nIHRvIHRoZSBkcml2ZXIuICovCisJc2tiX29ycGhhbihza2IpOworCisJcmV0dXJuIGhkZXYtPnNlbmQoc2tiKTsKK30KKworLyogU2VuZCBIQ0kgY29tbWFuZCAqLworaW50IGhjaV9zZW5kX2NtZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgX191MTYgb2dmLCBfX3UxNiBvY2YsIF9fdTMyIHBsZW4sIHZvaWQgKnBhcmFtKQoreworCWludCBsZW4gPSBIQ0lfQ09NTUFORF9IRFJfU0laRSArIHBsZW47CisJc3RydWN0IGhjaV9jb21tYW5kX2hkciAqaGRyOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlCVF9EQkcoIiVzIG9nZiAweCV4IG9jZiAweCV4IHBsZW4gJWQiLCBoZGV2LT5uYW1lLCBvZ2YsIG9jZiwgcGxlbik7CisKKwlza2IgPSBidF9za2JfYWxsb2MobGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikgeworCQlCVF9FUlIoIiVzIENhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgSENJIGNvbW1hbmQiLCBoZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaGRyID0gKHN0cnVjdCBoY2lfY29tbWFuZF9oZHIgKikgc2tiX3B1dChza2IsIEhDSV9DT01NQU5EX0hEUl9TSVpFKTsKKwloZHItPm9wY29kZSA9IF9fY3B1X3RvX2xlMTYoaGNpX29wY29kZV9wYWNrKG9nZiwgb2NmKSk7CisJaGRyLT5wbGVuICAgPSBwbGVuOworCisJaWYgKHBsZW4pCisJCW1lbWNweShza2JfcHV0KHNrYiwgcGxlbiksIHBhcmFtLCBwbGVuKTsKKworCUJUX0RCRygic2tiIGxlbiAlZCIsIHNrYi0+bGVuKTsKKworCXNrYi0+cGt0X3R5cGUgPSBIQ0lfQ09NTUFORF9QS1Q7CisJc2tiLT5kZXYgPSAodm9pZCAqKSBoZGV2OworCXNrYl9xdWV1ZV90YWlsKCZoZGV2LT5jbWRfcSwgc2tiKTsKKwloY2lfc2NoZWRfY21kKGhkZXYpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGhjaV9zZW5kX2NtZCk7CisKKy8qIEdldCBkYXRhIGZyb20gdGhlIHByZXZpb3VzbHkgc2VudCBjb21tYW5kICovCit2b2lkICpoY2lfc2VudF9jbWRfZGF0YShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgX191MTYgb2dmLCBfX3UxNiBvY2YpCit7CisJc3RydWN0IGhjaV9jb21tYW5kX2hkciAqaGRyOworCisJaWYgKCFoZGV2LT5zZW50X2NtZCkKKwkJcmV0dXJuIE5VTEw7CisKKwloZHIgPSAodm9pZCAqKSBoZGV2LT5zZW50X2NtZC0+ZGF0YTsKKworCWlmIChoZHItPm9wY29kZSAhPSBfX2NwdV90b19sZTE2KGhjaV9vcGNvZGVfcGFjayhvZ2YsIG9jZikpKQorCQlyZXR1cm4gTlVMTDsKKworCUJUX0RCRygiJXMgb2dmIDB4JXggb2NmIDB4JXgiLCBoZGV2LT5uYW1lLCBvZ2YsIG9jZik7CisKKwlyZXR1cm4gaGRldi0+c2VudF9jbWQtPmRhdGEgKyBIQ0lfQ09NTUFORF9IRFJfU0laRTsKK30KKworLyogU2VuZCBBQ0wgZGF0YSAqLworc3RhdGljIHZvaWQgaGNpX2FkZF9hY2xfaGRyKHN0cnVjdCBza19idWZmICpza2IsIF9fdTE2IGhhbmRsZSwgX191MTYgZmxhZ3MpCit7CisJc3RydWN0IGhjaV9hY2xfaGRyICpoZHI7CisJaW50IGxlbiA9IHNrYi0+bGVuOworCisJaGRyID0gKHN0cnVjdCBoY2lfYWNsX2hkciAqKSBza2JfcHVzaChza2IsIEhDSV9BQ0xfSERSX1NJWkUpOworCWhkci0+aGFuZGxlID0gX19jcHVfdG9fbGUxNihoY2lfaGFuZGxlX3BhY2soaGFuZGxlLCBmbGFncykpOworCWhkci0+ZGxlbiAgID0gX19jcHVfdG9fbGUxNihsZW4pOworCisJc2tiLT5oLnJhdyA9ICh2b2lkICopIGhkcjsKK30KKworaW50IGhjaV9zZW5kX2FjbChzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIHN0cnVjdCBza19idWZmICpza2IsIF9fdTE2IGZsYWdzKQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gY29ubi0+aGRldjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbGlzdDsKKworCUJUX0RCRygiJXMgY29ubiAlcCBmbGFncyAweCV4IiwgaGRldi0+bmFtZSwgY29ubiwgZmxhZ3MpOworCisJc2tiLT5kZXYgPSAodm9pZCAqKSBoZGV2OworCXNrYi0+cGt0X3R5cGUgPSBIQ0lfQUNMREFUQV9QS1Q7CisJaGNpX2FkZF9hY2xfaGRyKHNrYiwgY29ubi0+aGFuZGxlLCBmbGFncyB8IEFDTF9TVEFSVCk7CisKKwlpZiAoIShsaXN0ID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QpKSB7CisJCS8qIE5vbiBmcmFnbWVudGVkICovCisJCUJUX0RCRygiJXMgbm9uZnJhZyBza2IgJXAgbGVuICVkIiwgaGRldi0+bmFtZSwgc2tiLCBza2ItPmxlbik7CisKKwkJc2tiX3F1ZXVlX3RhaWwoJmNvbm4tPmRhdGFfcSwgc2tiKTsKKwl9IGVsc2UgeworCQkvKiBGcmFnbWVudGVkICovCisJCUJUX0RCRygiJXMgZnJhZyAlcCBsZW4gJWQiLCBoZGV2LT5uYW1lLCBza2IsIHNrYi0+bGVuKTsKKworCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCA9IE5VTEw7CisKKwkJLyogUXVldWUgYWxsIGZyYWdtZW50cyBhdG9taWNhbGx5ICovCisJCXNwaW5fbG9ja19iaCgmY29ubi0+ZGF0YV9xLmxvY2spOworCisJCV9fc2tiX3F1ZXVlX3RhaWwoJmNvbm4tPmRhdGFfcSwgc2tiKTsKKwkJZG8geworCQkJc2tiID0gbGlzdDsgbGlzdCA9IGxpc3QtPm5leHQ7CisJCQkKKwkJCXNrYi0+ZGV2ID0gKHZvaWQgKikgaGRldjsKKwkJCXNrYi0+cGt0X3R5cGUgPSBIQ0lfQUNMREFUQV9QS1Q7CisJCQloY2lfYWRkX2FjbF9oZHIoc2tiLCBjb25uLT5oYW5kbGUsIGZsYWdzIHwgQUNMX0NPTlQpOworCisJCQlCVF9EQkcoIiVzIGZyYWcgJXAgbGVuICVkIiwgaGRldi0+bmFtZSwgc2tiLCBza2ItPmxlbik7CisKKwkJCV9fc2tiX3F1ZXVlX3RhaWwoJmNvbm4tPmRhdGFfcSwgc2tiKTsKKwkJfSB3aGlsZSAobGlzdCk7CisKKwkJc3Bpbl91bmxvY2tfYmgoJmNvbm4tPmRhdGFfcS5sb2NrKTsKKwl9CisKKwloY2lfc2NoZWRfdHgoaGRldik7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGhjaV9zZW5kX2FjbCk7CisKKy8qIFNlbmQgU0NPIGRhdGEgKi8KK2ludCBoY2lfc2VuZF9zY28oc3RydWN0IGhjaV9jb25uICpjb25uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gY29ubi0+aGRldjsKKwlzdHJ1Y3QgaGNpX3Njb19oZHIgaGRyOworCisJQlRfREJHKCIlcyBsZW4gJWQiLCBoZGV2LT5uYW1lLCBza2ItPmxlbik7CisKKwlpZiAoc2tiLT5sZW4gPiBoZGV2LT5zY29fbXR1KSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwloZHIuaGFuZGxlID0gX19jcHVfdG9fbGUxNihjb25uLT5oYW5kbGUpOworCWhkci5kbGVuICAgPSBza2ItPmxlbjsKKworCXNrYi0+aC5yYXcgPSBza2JfcHVzaChza2IsIEhDSV9TQ09fSERSX1NJWkUpOworCW1lbWNweShza2ItPmgucmF3LCAmaGRyLCBIQ0lfU0NPX0hEUl9TSVpFKTsKKworCXNrYi0+ZGV2ID0gKHZvaWQgKikgaGRldjsKKwlza2ItPnBrdF90eXBlID0gSENJX1NDT0RBVEFfUEtUOworCXNrYl9xdWV1ZV90YWlsKCZjb25uLT5kYXRhX3EsIHNrYik7CisJaGNpX3NjaGVkX3R4KGhkZXYpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChoY2lfc2VuZF9zY28pOworCisvKiAtLS0tIEhDSSBUWCB0YXNrIChvdXRnb2luZyBkYXRhKSAtLS0tICovCisKKy8qIEhDSSBDb25uZWN0aW9uIHNjaGVkdWxlciAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaGNpX2Nvbm4gKmhjaV9sb3dfc2VudChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgX191OCB0eXBlLCBpbnQgKnF1b3RlKQoreworCXN0cnVjdCBoY2lfY29ubl9oYXNoICpoID0gJmhkZXYtPmNvbm5faGFzaDsKKwlzdHJ1Y3QgaGNpX2Nvbm4gICpjb25uID0gTlVMTDsKKwlpbnQgbnVtID0gMCwgbWluID0gfjA7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKworCS8qIFdlIGRvbid0IGhhdmUgdG8gbG9jayBkZXZpY2UgaGVyZS4gQ29ubmVjdGlvbnMgYXJlIGFsd2F5cyAKKwkgKiBhZGRlZCBhbmQgcmVtb3ZlZCB3aXRoIFRYIHRhc2sgZGlzYWJsZWQuICovCisJbGlzdF9mb3JfZWFjaChwLCAmaC0+bGlzdCkgeworCQlzdHJ1Y3QgaGNpX2Nvbm4gKmM7CisJCWMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBoY2lfY29ubiwgbGlzdCk7CisKKwkJaWYgKGMtPnR5cGUgIT0gdHlwZSB8fCBjLT5zdGF0ZSAhPSBCVF9DT05ORUNURUQKKwkJCQl8fCBza2JfcXVldWVfZW1wdHkoJmMtPmRhdGFfcSkpCisJCQljb250aW51ZTsKKwkJbnVtKys7CisKKwkJaWYgKGMtPnNlbnQgPCBtaW4pIHsKKwkJCW1pbiAgPSBjLT5zZW50OworCQkJY29ubiA9IGM7CisJCX0KKwl9CisKKwlpZiAoY29ubikgeworCQlpbnQgY250ID0gKHR5cGUgPT0gQUNMX0xJTksgPyBoZGV2LT5hY2xfY250IDogaGRldi0+c2NvX2NudCk7CisJCWludCBxID0gY250IC8gbnVtOworCQkqcXVvdGUgPSBxID8gcSA6IDE7CisJfSBlbHNlCisJCSpxdW90ZSA9IDA7CisKKwlCVF9EQkcoImNvbm4gJXAgcXVvdGUgJWQiLCBjb25uLCAqcXVvdGUpOworCXJldHVybiBjb25uOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2FjbF90eF90byhzdHJ1Y3QgaGNpX2RldiAqaGRldikKK3sKKwlzdHJ1Y3QgaGNpX2Nvbm5faGFzaCAqaCA9ICZoZGV2LT5jb25uX2hhc2g7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgaGNpX2Nvbm4gICpjOworCisJQlRfRVJSKCIlcyBBQ0wgdHggdGltZW91dCIsIGhkZXYtPm5hbWUpOworCisJLyogS2lsbCBzdGFsbGVkIGNvbm5lY3Rpb25zICovCisJbGlzdF9mb3JfZWFjaChwLCAmaC0+bGlzdCkgeworCQljID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGNpX2Nvbm4sIGxpc3QpOworCQlpZiAoYy0+dHlwZSA9PSBBQ0xfTElOSyAmJiBjLT5zZW50KSB7CisJCQlCVF9FUlIoIiVzIGtpbGxpbmcgc3RhbGxlZCBBQ0wgY29ubmVjdGlvbiAlcyIsCisJCQkJaGRldi0+bmFtZSwgYmF0b3N0cigmYy0+ZHN0KSk7CisJCQloY2lfYWNsX2Rpc2Nvbm4oYywgMHgxMyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfc2NoZWRfYWNsKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXN0cnVjdCBoY2lfY29ubiAqY29ubjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBxdW90ZTsKKworCUJUX0RCRygiJXMiLCBoZGV2LT5uYW1lKTsKKworCWlmICghdGVzdF9iaXQoSENJX1JBVywgJmhkZXYtPmZsYWdzKSkgeworCQkvKiBBQ0wgdHggdGltZW91dCBtdXN0IGJlIGxvbmdlciB0aGFuIG1heGltdW0KKwkJICogbGluayBzdXBlcnZpc2lvbiB0aW1lb3V0ICg0MC45IHNlY29uZHMpICovCisJCWlmICghaGRldi0+YWNsX2NudCAmJiAoamlmZmllcyAtIGhkZXYtPmFjbF9sYXN0X3R4KSA+IChIWiAqIDQ1KSkKKwkJCWhjaV9hY2xfdHhfdG8oaGRldik7CisJfQorCisJd2hpbGUgKGhkZXYtPmFjbF9jbnQgJiYgKGNvbm4gPSBoY2lfbG93X3NlbnQoaGRldiwgQUNMX0xJTkssICZxdW90ZSkpKSB7CisJCXdoaWxlIChxdW90ZS0tICYmIChza2IgPSBza2JfZGVxdWV1ZSgmY29ubi0+ZGF0YV9xKSkpIHsKKwkJCUJUX0RCRygic2tiICVwIGxlbiAlZCIsIHNrYiwgc2tiLT5sZW4pOworCQkJaGNpX3NlbmRfZnJhbWUoc2tiKTsKKwkJCWhkZXYtPmFjbF9sYXN0X3R4ID0gamlmZmllczsKKworCQkJaGRldi0+YWNsX2NudC0tOworCQkJY29ubi0+c2VudCsrOworCQl9CisJfQorfQorCisvKiBTY2hlZHVsZSBTQ08gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfc2NoZWRfc2NvKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXN0cnVjdCBoY2lfY29ubiAqY29ubjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBxdW90ZTsKKworCUJUX0RCRygiJXMiLCBoZGV2LT5uYW1lKTsKKworCXdoaWxlIChoZGV2LT5zY29fY250ICYmIChjb25uID0gaGNpX2xvd19zZW50KGhkZXYsIFNDT19MSU5LLCAmcXVvdGUpKSkgeworCQl3aGlsZSAocXVvdGUtLSAmJiAoc2tiID0gc2tiX2RlcXVldWUoJmNvbm4tPmRhdGFfcSkpKSB7CisJCQlCVF9EQkcoInNrYiAlcCBsZW4gJWQiLCBza2IsIHNrYi0+bGVuKTsKKwkJCWhjaV9zZW5kX2ZyYW1lKHNrYik7CisKKwkJCWNvbm4tPnNlbnQrKzsKKwkJCWlmIChjb25uLT5zZW50ID09IH4wKQorCQkJCWNvbm4tPnNlbnQgPSAwOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBoY2lfdHhfdGFzayh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IChzdHJ1Y3QgaGNpX2RldiAqKSBhcmc7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXJlYWRfbG9jaygmaGNpX3Rhc2tfbG9jayk7CisKKwlCVF9EQkcoIiVzIGFjbCAlZCBzY28gJWQiLCBoZGV2LT5uYW1lLCBoZGV2LT5hY2xfY250LCBoZGV2LT5zY29fY250KTsKKworCS8qIFNjaGVkdWxlIHF1ZXVlcyBhbmQgc2VuZCBzdHVmZiB0byBIQ0kgZHJpdmVyICovCisKKwloY2lfc2NoZWRfYWNsKGhkZXYpOworCisJaGNpX3NjaGVkX3NjbyhoZGV2KTsKKworCS8qIFNlbmQgbmV4dCBxdWV1ZWQgcmF3ICh1bmtub3duIHR5cGUpIHBhY2tldCAqLworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmhkZXYtPnJhd19xKSkpCisJCWhjaV9zZW5kX2ZyYW1lKHNrYik7CisKKwlyZWFkX3VubG9jaygmaGNpX3Rhc2tfbG9jayk7Cit9CisKKy8qIC0tLS0tIEhDSSBSWCB0YXNrIChpbmNvbWluZyBkYXRhIHByb2NjZXNzaW5nKSAtLS0tLSAqLworCisvKiBBQ0wgZGF0YSBwYWNrZXQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfYWNsZGF0YV9wYWNrZXQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGhjaV9hY2xfaGRyICpoZHIgPSAodm9pZCAqKSBza2ItPmRhdGE7CisJc3RydWN0IGhjaV9jb25uICpjb25uOworCV9fdTE2IGhhbmRsZSwgZmxhZ3M7CisKKwlza2JfcHVsbChza2IsIEhDSV9BQ0xfSERSX1NJWkUpOworCisJaGFuZGxlID0gX19sZTE2X3RvX2NwdShoZHItPmhhbmRsZSk7CisJZmxhZ3MgID0gaGNpX2ZsYWdzKGhhbmRsZSk7CisJaGFuZGxlID0gaGNpX2hhbmRsZShoYW5kbGUpOworCisJQlRfREJHKCIlcyBsZW4gJWQgaGFuZGxlIDB4JXggZmxhZ3MgMHgleCIsIGhkZXYtPm5hbWUsIHNrYi0+bGVuLCBoYW5kbGUsIGZsYWdzKTsKKworCWhkZXYtPnN0YXQuYWNsX3J4Kys7CisKKwloY2lfZGV2X2xvY2soaGRldik7CisJY29ubiA9IGhjaV9jb25uX2hhc2hfbG9va3VwX2hhbmRsZShoZGV2LCBoYW5kbGUpOworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworCQorCWlmIChjb25uKSB7CisJCXJlZ2lzdGVyIHN0cnVjdCBoY2lfcHJvdG8gKmhwOworCisJCS8qIFNlbmQgdG8gdXBwZXIgcHJvdG9jb2wgKi8KKwkJaWYgKChocCA9IGhjaV9wcm90b1tIQ0lfUFJPVE9fTDJDQVBdKSAmJiBocC0+cmVjdl9hY2xkYXRhKSB7CisJCQlocC0+cmVjdl9hY2xkYXRhKGNvbm4sIHNrYiwgZmxhZ3MpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIHsKKwkJQlRfRVJSKCIlcyBBQ0wgcGFja2V0IGZvciB1bmtub3duIGNvbm5lY3Rpb24gaGFuZGxlICVkIiwgCisJCQloZGV2LT5uYW1lLCBoYW5kbGUpOworCX0KKworCWtmcmVlX3NrYihza2IpOworfQorCisvKiBTQ08gZGF0YSBwYWNrZXQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfc2NvZGF0YV9wYWNrZXQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGhjaV9zY29faGRyICpoZHIgPSAodm9pZCAqKSBza2ItPmRhdGE7CisJc3RydWN0IGhjaV9jb25uICpjb25uOworCV9fdTE2IGhhbmRsZTsKKworCXNrYl9wdWxsKHNrYiwgSENJX1NDT19IRFJfU0laRSk7CisKKwloYW5kbGUgPSBfX2xlMTZfdG9fY3B1KGhkci0+aGFuZGxlKTsKKworCUJUX0RCRygiJXMgbGVuICVkIGhhbmRsZSAweCV4IiwgaGRldi0+bmFtZSwgc2tiLT5sZW4sIGhhbmRsZSk7CisKKwloZGV2LT5zdGF0LnNjb19yeCsrOworCisJaGNpX2Rldl9sb2NrKGhkZXYpOworCWNvbm4gPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9oYW5kbGUoaGRldiwgaGFuZGxlKTsKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKKworCWlmIChjb25uKSB7CisJCXJlZ2lzdGVyIHN0cnVjdCBoY2lfcHJvdG8gKmhwOworCisJCS8qIFNlbmQgdG8gdXBwZXIgcHJvdG9jb2wgKi8KKwkJaWYgKChocCA9IGhjaV9wcm90b1tIQ0lfUFJPVE9fU0NPXSkgJiYgaHAtPnJlY3Zfc2NvZGF0YSkgeworCQkJaHAtPnJlY3Zfc2NvZGF0YShjb25uLCBza2IpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIHsKKwkJQlRfRVJSKCIlcyBTQ08gcGFja2V0IGZvciB1bmtub3duIGNvbm5lY3Rpb24gaGFuZGxlICVkIiwgCisJCQloZGV2LT5uYW1lLCBoYW5kbGUpOworCX0KKworCWtmcmVlX3NrYihza2IpOworfQorCit2b2lkIGhjaV9yeF90YXNrKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gKHN0cnVjdCBoY2lfZGV2ICopIGFyZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJQlRfREJHKCIlcyIsIGhkZXYtPm5hbWUpOworCisJcmVhZF9sb2NrKCZoY2lfdGFza19sb2NrKTsKKworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmhkZXYtPnJ4X3EpKSkgeworCQlpZiAoYXRvbWljX3JlYWQoJmhkZXYtPnByb21pc2MpKSB7CisJCQkvKiBTZW5kIGNvcHkgdG8gdGhlIHNvY2tldHMgKi8KKwkJCWhjaV9zZW5kX3RvX3NvY2soaGRldiwgc2tiKTsKKwkJfQorCisJCWlmICh0ZXN0X2JpdChIQ0lfUkFXLCAmaGRldi0+ZmxhZ3MpKSB7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHRlc3RfYml0KEhDSV9JTklULCAmaGRldi0+ZmxhZ3MpKSB7CisJCQkvKiBEb24ndCBwcm9jZXNzIGRhdGEgcGFja2V0cyBpbiB0aGlzIHN0YXRlcy4gKi8KKwkJCXN3aXRjaCAoc2tiLT5wa3RfdHlwZSkgeworCQkJY2FzZSBIQ0lfQUNMREFUQV9QS1Q6CisJCQljYXNlIEhDSV9TQ09EQVRBX1BLVDoKKwkJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCQljb250aW51ZTsKKwkJCX07CisJCX0KKworCQkvKiBQcm9jZXNzIGZyYW1lICovCisJCXN3aXRjaCAoc2tiLT5wa3RfdHlwZSkgeworCQljYXNlIEhDSV9FVkVOVF9QS1Q6CisJCQloY2lfZXZlbnRfcGFja2V0KGhkZXYsIHNrYik7CisJCQlicmVhazsKKworCQljYXNlIEhDSV9BQ0xEQVRBX1BLVDoKKwkJCUJUX0RCRygiJXMgQUNMIGRhdGEgcGFja2V0IiwgaGRldi0+bmFtZSk7CisJCQloY2lfYWNsZGF0YV9wYWNrZXQoaGRldiwgc2tiKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSENJX1NDT0RBVEFfUEtUOgorCQkJQlRfREJHKCIlcyBTQ08gZGF0YSBwYWNrZXQiLCBoZGV2LT5uYW1lKTsKKwkJCWhjaV9zY29kYXRhX3BhY2tldChoZGV2LCBza2IpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWtmcmVlX3NrYihza2IpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZWFkX3VubG9jaygmaGNpX3Rhc2tfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9jbWRfdGFzayh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IChzdHJ1Y3QgaGNpX2RldiAqKSBhcmc7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCUJUX0RCRygiJXMgY21kICVkIiwgaGRldi0+bmFtZSwgYXRvbWljX3JlYWQoJmhkZXYtPmNtZF9jbnQpKTsKKworCWlmICghYXRvbWljX3JlYWQoJmhkZXYtPmNtZF9jbnQpICYmIChqaWZmaWVzIC0gaGRldi0+Y21kX2xhc3RfdHgpID4gSFopIHsKKwkJQlRfRVJSKCIlcyBjb21tYW5kIHR4IHRpbWVvdXQiLCBoZGV2LT5uYW1lKTsKKwkJYXRvbWljX3NldCgmaGRldi0+Y21kX2NudCwgMSk7CisJfQorCisJLyogU2VuZCBxdWV1ZWQgY29tbWFuZHMgKi8KKwlpZiAoYXRvbWljX3JlYWQoJmhkZXYtPmNtZF9jbnQpICYmIChza2IgPSBza2JfZGVxdWV1ZSgmaGRldi0+Y21kX3EpKSkgeworCQlpZiAoaGRldi0+c2VudF9jbWQpCisJCQlrZnJlZV9za2IoaGRldi0+c2VudF9jbWQpOworCisJCWlmICgoaGRldi0+c2VudF9jbWQgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKSkpIHsKKwkJCWF0b21pY19kZWMoJmhkZXYtPmNtZF9jbnQpOworCQkJaGNpX3NlbmRfZnJhbWUoc2tiKTsKKwkJCWhkZXYtPmNtZF9sYXN0X3R4ID0gamlmZmllczsKKwkJfSBlbHNlIHsKKwkJCXNrYl9xdWV1ZV9oZWFkKCZoZGV2LT5jbWRfcSwgc2tiKTsKKwkJCWhjaV9zY2hlZF9jbWQoaGRldik7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9ldmVudC5jIGIvbmV0L2JsdWV0b290aC9oY2lfZXZlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2NiYThlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfZXZlbnQuYwpAQCAtMCwwICsxLDEwNDQgQEAKKy8qIAorICAgQmx1ZVogLSBCbHVldG9vdGggcHJvdG9jb2wgc3RhY2sgZm9yIExpbnV4CisgICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSBRdWFsY29tbSBJbmNvcnBvcmF0ZWQKKworICAgV3JpdHRlbiAyMDAwLDIwMDEgYnkgTWF4aW0gS3Jhc255YW5za3kgPG1heGtAcXVhbGNvbW0uY29tPgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICAgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIFRISVJEIFBBUlRZIFJJR0hUUy4KKyAgIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIEFORCBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkKKyAgIENMQUlNLCBPUiBBTlkgU1BFQ0lBTCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIE9SIEFOWSBEQU1BR0VTIAorICAgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIAorICAgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgCisgICBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisgICBBTEwgTElBQklMSVRZLCBJTkNMVURJTkcgTElBQklMSVRZIEZPUiBJTkZSSU5HRU1FTlQgT0YgQU5ZIFBBVEVOVFMsIAorICAgQ09QWVJJR0hUUywgVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMsIFJFTEFUSU5HIFRPIFVTRSBPRiBUSElTIAorICAgU09GVFdBUkUgSVMgRElTQ0xBSU1FRC4KKyovCisKKy8qIEJsdWV0b290aCBIQ0kgZXZlbnQgaGFuZGxpbmcuICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KKworI2lmbmRlZiBDT05GSUdfQlRfSENJX0NPUkVfREVCVUcKKyN1bmRlZiAgQlRfREJHCisjZGVmaW5lIEJUX0RCRyhELi4uKQorI2VuZGlmCisKKy8qIEhhbmRsZSBIQ0kgRXZlbnQgcGFja2V0cyAqLworCisvKiBDb21tYW5kIENvbXBsZXRlIE9HRiBMSU5LX0NUTCAgKi8KK3N0YXRpYyB2b2lkIGhjaV9jY19saW5rX2N0bChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgX191MTYgb2NmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCV9fdTggc3RhdHVzOworCisJQlRfREJHKCIlcyBvY2YgMHgleCIsIGhkZXYtPm5hbWUsIG9jZik7CisKKwlzd2l0Y2ggKG9jZikgeworCWNhc2UgT0NGX0lOUVVJUllfQ0FOQ0VMOgorCQlzdGF0dXMgPSAqKChfX3U4ICopIHNrYi0+ZGF0YSk7CisKKwkJaWYgKHN0YXR1cykgeworCQkJQlRfREJHKCIlcyBJbnF1aXJ5IGNhbmNlbCBlcnJvcjogc3RhdHVzIDB4JXgiLCBoZGV2LT5uYW1lLCBzdGF0dXMpOworCQl9IGVsc2UgeworCQkJY2xlYXJfYml0KEhDSV9JTlFVSVJZLCAmaGRldi0+ZmxhZ3MpOworCQkJaGNpX3JlcV9jb21wbGV0ZShoZGV2LCBzdGF0dXMpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlRfREJHKCIlcyBDb21tYW5kIGNvbXBsZXRlOiBvZ2YgTElOS19DVEwgb2NmICV4IiwgaGRldi0+bmFtZSwgb2NmKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBDb21tYW5kIENvbXBsZXRlIE9HRiBMSU5LX1BPTElDWSAgKi8KK3N0YXRpYyB2b2lkIGhjaV9jY19saW5rX3BvbGljeShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgX191MTYgb2NmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoY2lfY29ubiAqY29ubjsKKwlzdHJ1Y3QgaGNpX3JwX3JvbGVfZGlzY292ZXJ5ICpyZDsKKworCUJUX0RCRygiJXMgb2NmIDB4JXgiLCBoZGV2LT5uYW1lLCBvY2YpOworCisJc3dpdGNoIChvY2YpIHsKKwljYXNlIE9DRl9ST0xFX0RJU0NPVkVSWTogCisJCXJkID0gKHZvaWQgKikgc2tiLT5kYXRhOworCisJCWlmIChyZC0+c3RhdHVzKQorCQkJYnJlYWs7CisKKwkJaGNpX2Rldl9sb2NrKGhkZXYpOworCisJCWNvbm4gPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9oYW5kbGUoaGRldiwgX19sZTE2X3RvX2NwdShyZC0+aGFuZGxlKSk7CisJCWlmIChjb25uKSB7CisJCQlpZiAocmQtPnJvbGUpCisJCQkJY29ubi0+bGlua19tb2RlICY9IH5IQ0lfTE1fTUFTVEVSOworCQkJZWxzZQorCQkJCWNvbm4tPmxpbmtfbW9kZSB8PSBIQ0lfTE1fTUFTVEVSOworCQl9CisKKwkJaGNpX2Rldl91bmxvY2soaGRldik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlRfREJHKCIlczogQ29tbWFuZCBjb21wbGV0ZTogb2dmIExJTktfUE9MSUNZIG9jZiAleCIsIAorCQkJCWhkZXYtPm5hbWUsIG9jZik7CisJCWJyZWFrOworCX0KK30KKworLyogQ29tbWFuZCBDb21wbGV0ZSBPR0YgSE9TVF9DVEwgICovCitzdGF0aWMgdm9pZCBoY2lfY2NfaG9zdF9jdGwoc3RydWN0IGhjaV9kZXYgKmhkZXYsIF9fdTE2IG9jZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlfX3U4IHN0YXR1cywgcGFyYW07CisJX191MTYgc2V0dGluZzsKKwlzdHJ1Y3QgaGNpX3JwX3JlYWRfdm9pY2Vfc2V0dGluZyAqdnM7CisJdm9pZCAqc2VudDsKKworCUJUX0RCRygiJXMgb2NmIDB4JXgiLCBoZGV2LT5uYW1lLCBvY2YpOworCisJc3dpdGNoIChvY2YpIHsKKwljYXNlIE9DRl9SRVNFVDoKKwkJc3RhdHVzID0gKigoX191OCAqKSBza2ItPmRhdGEpOworCQloY2lfcmVxX2NvbXBsZXRlKGhkZXYsIHN0YXR1cyk7CisJCWJyZWFrOworCisJY2FzZSBPQ0ZfU0VUX0VWRU5UX0ZMVDoKKwkJc3RhdHVzID0gKigoX191OCAqKSBza2ItPmRhdGEpOworCQlpZiAoc3RhdHVzKSB7CisJCQlCVF9EQkcoIiVzIFNFVF9FVkVOVF9GTFQgZmFpbGVkICVkIiwgaGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJfSBlbHNlIHsKKwkJCUJUX0RCRygiJXMgU0VUX0VWRU5UX0ZMVCBzdWNjZXNlZnVsIiwgaGRldi0+bmFtZSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE9DRl9XUklURV9BVVRIX0VOQUJMRToKKwkJc2VudCA9IGhjaV9zZW50X2NtZF9kYXRhKGhkZXYsIE9HRl9IT1NUX0NUTCwgT0NGX1dSSVRFX0FVVEhfRU5BQkxFKTsKKwkJaWYgKCFzZW50KQorCQkJYnJlYWs7CisKKwkJc3RhdHVzID0gKigoX191OCAqKSBza2ItPmRhdGEpOworCQlwYXJhbSAgPSAqKChfX3U4ICopIHNlbnQpOworCisJCWlmICghc3RhdHVzKSB7CisJCQlpZiAocGFyYW0gPT0gQVVUSF9FTkFCTEVEKQorCQkJCXNldF9iaXQoSENJX0FVVEgsICZoZGV2LT5mbGFncyk7CisJCQllbHNlCisJCQkJY2xlYXJfYml0KEhDSV9BVVRILCAmaGRldi0+ZmxhZ3MpOworCQl9CisJCWhjaV9yZXFfY29tcGxldGUoaGRldiwgc3RhdHVzKTsKKwkJYnJlYWs7CisKKwljYXNlIE9DRl9XUklURV9FTkNSWVBUX01PREU6CisJCXNlbnQgPSBoY2lfc2VudF9jbWRfZGF0YShoZGV2LCBPR0ZfSE9TVF9DVEwsIE9DRl9XUklURV9FTkNSWVBUX01PREUpOworCQlpZiAoIXNlbnQpCisJCQlicmVhazsKKworCQlzdGF0dXMgPSAqKChfX3U4ICopIHNrYi0+ZGF0YSk7CisJCXBhcmFtICA9ICooKF9fdTggKikgc2VudCk7CisKKwkJaWYgKCFzdGF0dXMpIHsKKwkJCWlmIChwYXJhbSkKKwkJCQlzZXRfYml0KEhDSV9FTkNSWVBULCAmaGRldi0+ZmxhZ3MpOworCQkJZWxzZQorCQkJCWNsZWFyX2JpdChIQ0lfRU5DUllQVCwgJmhkZXYtPmZsYWdzKTsKKwkJfQorCQloY2lfcmVxX2NvbXBsZXRlKGhkZXYsIHN0YXR1cyk7CisJCWJyZWFrOworCisJY2FzZSBPQ0ZfV1JJVEVfQ0FfVElNRU9VVDoKKwkJc3RhdHVzID0gKigoX191OCAqKSBza2ItPmRhdGEpOworCQlpZiAoc3RhdHVzKSB7CisJCQlCVF9EQkcoIiVzIE9DRl9XUklURV9DQV9USU1FT1VUIGZhaWxlZCAlZCIsIGhkZXYtPm5hbWUsIHN0YXR1cyk7CisJCX0gZWxzZSB7CisJCQlCVF9EQkcoIiVzIE9DRl9XUklURV9DQV9USU1FT1VUIHN1Y2Nlc2VmdWwiLCBoZGV2LT5uYW1lKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgT0NGX1dSSVRFX1BHX1RJTUVPVVQ6CisJCXN0YXR1cyA9ICooKF9fdTggKikgc2tiLT5kYXRhKTsKKwkJaWYgKHN0YXR1cykgeworCQkJQlRfREJHKCIlcyBPQ0ZfV1JJVEVfUEdfVElNRU9VVCBmYWlsZWQgJWQiLCBoZGV2LT5uYW1lLCBzdGF0dXMpOworCQl9IGVsc2UgeworCQkJQlRfREJHKCIlczogT0NGX1dSSVRFX1BHX1RJTUVPVVQgc3VjY2VzZWZ1bCIsIGhkZXYtPm5hbWUpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBPQ0ZfV1JJVEVfU0NBTl9FTkFCTEU6CisJCXNlbnQgPSBoY2lfc2VudF9jbWRfZGF0YShoZGV2LCBPR0ZfSE9TVF9DVEwsIE9DRl9XUklURV9TQ0FOX0VOQUJMRSk7CisJCWlmICghc2VudCkKKwkJCWJyZWFrOworCisJCXN0YXR1cyA9ICooKF9fdTggKikgc2tiLT5kYXRhKTsKKwkJcGFyYW0gID0gKigoX191OCAqKSBzZW50KTsKKworCQlCVF9EQkcoInBhcmFtIDB4JXgiLCBwYXJhbSk7CisKKwkJaWYgKCFzdGF0dXMpIHsKKwkJCWNsZWFyX2JpdChIQ0lfUFNDQU4sICZoZGV2LT5mbGFncyk7CisJCQljbGVhcl9iaXQoSENJX0lTQ0FOLCAmaGRldi0+ZmxhZ3MpOworCQkJaWYgKHBhcmFtICYgU0NBTl9JTlFVSVJZKSAKKwkJCQlzZXRfYml0KEhDSV9JU0NBTiwgJmhkZXYtPmZsYWdzKTsKKworCQkJaWYgKHBhcmFtICYgU0NBTl9QQUdFKSAKKwkJCQlzZXRfYml0KEhDSV9QU0NBTiwgJmhkZXYtPmZsYWdzKTsKKwkJfQorCQloY2lfcmVxX2NvbXBsZXRlKGhkZXYsIHN0YXR1cyk7CisJCWJyZWFrOworCisJY2FzZSBPQ0ZfUkVBRF9WT0lDRV9TRVRUSU5HOgorCQl2cyA9IChzdHJ1Y3QgaGNpX3JwX3JlYWRfdm9pY2Vfc2V0dGluZyAqKSBza2ItPmRhdGE7CisKKwkJaWYgKHZzLT5zdGF0dXMpIHsKKwkJCUJUX0RCRygiJXMgUkVBRF9WT0lDRV9TRVRUSU5HIGZhaWxlZCAlZCIsIGhkZXYtPm5hbWUsIHZzLT5zdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKworCQlzZXR0aW5nID0gX19sZTE2X3RvX2NwdSh2cy0+dm9pY2Vfc2V0dGluZyk7CisKKwkJaWYgKGhkZXYtPnZvaWNlX3NldHRpbmcgIT0gc2V0dGluZyApIHsKKwkJCWhkZXYtPnZvaWNlX3NldHRpbmcgPSBzZXR0aW5nOworCisJCQlCVF9EQkcoIiVzOiB2b2ljZSBzZXR0aW5nIDB4JTA0eCIsIGhkZXYtPm5hbWUsIHNldHRpbmcpOworCisJCQlpZiAoaGRldi0+bm90aWZ5KSB7CisJCQkJdGFza2xldF9kaXNhYmxlKCZoZGV2LT50eF90YXNrKTsKKwkJCQloZGV2LT5ub3RpZnkoaGRldiwgSENJX05PVElGWV9WT0lDRV9TRVRUSU5HKTsKKwkJCQl0YXNrbGV0X2VuYWJsZSgmaGRldi0+dHhfdGFzayk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE9DRl9XUklURV9WT0lDRV9TRVRUSU5HOgorCQlzZW50ID0gaGNpX3NlbnRfY21kX2RhdGEoaGRldiwgT0dGX0hPU1RfQ1RMLCBPQ0ZfV1JJVEVfVk9JQ0VfU0VUVElORyk7CisJCWlmICghc2VudCkKKwkJCWJyZWFrOworCisJCXN0YXR1cyA9ICooKF9fdTggKikgc2tiLT5kYXRhKTsKKwkJc2V0dGluZyA9IF9fbGUxNl90b19jcHUoZ2V0X3VuYWxpZ25lZCgoX191MTYgKikgc2VudCkpOworCisJCWlmICghc3RhdHVzICYmIGhkZXYtPnZvaWNlX3NldHRpbmcgIT0gc2V0dGluZykgeworCQkJaGRldi0+dm9pY2Vfc2V0dGluZyA9IHNldHRpbmc7CisKKwkJCUJUX0RCRygiJXM6IHZvaWNlIHNldHRpbmcgMHglMDR4IiwgaGRldi0+bmFtZSwgc2V0dGluZyk7CisKKwkJCWlmIChoZGV2LT5ub3RpZnkpIHsKKwkJCQl0YXNrbGV0X2Rpc2FibGUoJmhkZXYtPnR4X3Rhc2spOworCQkJCWhkZXYtPm5vdGlmeShoZGV2LCBIQ0lfTk9USUZZX1ZPSUNFX1NFVFRJTkcpOworCQkJCXRhc2tsZXRfZW5hYmxlKCZoZGV2LT50eF90YXNrKTsKKwkJCX0KKwkJfQorCQloY2lfcmVxX2NvbXBsZXRlKGhkZXYsIHN0YXR1cyk7CisJCWJyZWFrOworCisJY2FzZSBPQ0ZfSE9TVF9CVUZGRVJfU0laRToKKwkJc3RhdHVzID0gKigoX191OCAqKSBza2ItPmRhdGEpOworCQlpZiAoc3RhdHVzKSB7CisJCQlCVF9EQkcoIiVzIE9DRl9CVUZGRVJfU0laRSBmYWlsZWQgJWQiLCBoZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJaGNpX3JlcV9jb21wbGV0ZShoZGV2LCBzdGF0dXMpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlRfREJHKCIlcyBDb21tYW5kIGNvbXBsZXRlOiBvZ2YgSE9TVF9DVEwgb2NmICV4IiwgaGRldi0+bmFtZSwgb2NmKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBDb21tYW5kIENvbXBsZXRlIE9HRiBJTkZPX1BBUkFNICAqLworc3RhdGljIHZvaWQgaGNpX2NjX2luZm9fcGFyYW0oc3RydWN0IGhjaV9kZXYgKmhkZXYsIF9fdTE2IG9jZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaGNpX3JwX3JlYWRfbG9jX2ZlYXR1cmVzICpsZjsKKwlzdHJ1Y3QgaGNpX3JwX3JlYWRfYnVmZmVyX3NpemUgKmJzOworCXN0cnVjdCBoY2lfcnBfcmVhZF9iZF9hZGRyICpiYTsKKworCUJUX0RCRygiJXMgb2NmIDB4JXgiLCBoZGV2LT5uYW1lLCBvY2YpOworCisJc3dpdGNoIChvY2YpIHsKKwljYXNlIE9DRl9SRUFEX0xPQ0FMX0ZFQVRVUkVTOgorCQlsZiA9IChzdHJ1Y3QgaGNpX3JwX3JlYWRfbG9jX2ZlYXR1cmVzICopIHNrYi0+ZGF0YTsKKworCQlpZiAobGYtPnN0YXR1cykgeworCQkJQlRfREJHKCIlcyBSRUFEX0xPQ0FMX0ZFQVRVUkVTIGZhaWxlZCAlZCIsIGhkZXYtPm5hbWUsIGxmLT5zdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKworCQltZW1jcHkoaGRldi0+ZmVhdHVyZXMsIGxmLT5mZWF0dXJlcywgc2l6ZW9mKGhkZXYtPmZlYXR1cmVzKSk7CisKKwkJLyogQWRqdXN0IGRlZmF1bHQgc2V0dGluZ3MgYWNjb3JkaW5nIHRvIGZlYXR1cmVzIAorCQkgKiBzdXBwb3J0ZWQgYnkgZGV2aWNlLiAqLworCQlpZiAoaGRldi0+ZmVhdHVyZXNbMF0gJiBMTVBfM1NMT1QpCisJCQloZGV2LT5wa3RfdHlwZSB8PSAoSENJX0RNMyB8IEhDSV9ESDMpOworCisJCWlmIChoZGV2LT5mZWF0dXJlc1swXSAmIExNUF81U0xPVCkKKwkJCWhkZXYtPnBrdF90eXBlIHw9IChIQ0lfRE01IHwgSENJX0RINSk7CisKKwkJaWYgKGhkZXYtPmZlYXR1cmVzWzFdICYgTE1QX0hWMikKKwkJCWhkZXYtPnBrdF90eXBlIHw9IChIQ0lfSFYyKTsKKworCQlpZiAoaGRldi0+ZmVhdHVyZXNbMV0gJiBMTVBfSFYzKQorCQkJaGRldi0+cGt0X3R5cGUgfD0gKEhDSV9IVjMpOworCisJCUJUX0RCRygiJXM6IGZlYXR1cmVzIDB4JXggMHgleCAweCV4IiwgaGRldi0+bmFtZSwgbGYtPmZlYXR1cmVzWzBdLCBsZi0+ZmVhdHVyZXNbMV0sIGxmLT5mZWF0dXJlc1syXSk7CisKKwkJYnJlYWs7CisKKwljYXNlIE9DRl9SRUFEX0JVRkZFUl9TSVpFOgorCQlicyA9IChzdHJ1Y3QgaGNpX3JwX3JlYWRfYnVmZmVyX3NpemUgKikgc2tiLT5kYXRhOworCisJCWlmIChicy0+c3RhdHVzKSB7CisJCQlCVF9EQkcoIiVzIFJFQURfQlVGRkVSX1NJWkUgZmFpbGVkICVkIiwgaGRldi0+bmFtZSwgYnMtPnN0YXR1cyk7CisJCQloY2lfcmVxX2NvbXBsZXRlKGhkZXYsIGJzLT5zdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKworCQloZGV2LT5hY2xfbXR1ICA9IF9fbGUxNl90b19jcHUoYnMtPmFjbF9tdHUpOworCQloZGV2LT5zY29fbXR1ICA9IGJzLT5zY29fbXR1ID8gYnMtPnNjb19tdHUgOiA2NDsKKwkJaGRldi0+YWNsX3BrdHMgPSBoZGV2LT5hY2xfY250ID0gX19sZTE2X3RvX2NwdShicy0+YWNsX21heF9wa3QpOworCQloZGV2LT5zY29fcGt0cyA9IGhkZXYtPnNjb19jbnQgPSBfX2xlMTZfdG9fY3B1KGJzLT5zY29fbWF4X3BrdCk7CisKKwkJQlRfREJHKCIlcyBtdHU6IGFjbCAlZCwgc2NvICVkIG1heF9wa3Q6IGFjbCAlZCwgc2NvICVkIiwgaGRldi0+bmFtZSwKKwkJCWhkZXYtPmFjbF9tdHUsIGhkZXYtPnNjb19tdHUsIGhkZXYtPmFjbF9wa3RzLCBoZGV2LT5zY29fcGt0cyk7CisJCWJyZWFrOworCisJY2FzZSBPQ0ZfUkVBRF9CRF9BRERSOgorCQliYSA9IChzdHJ1Y3QgaGNpX3JwX3JlYWRfYmRfYWRkciAqKSBza2ItPmRhdGE7CisKKwkJaWYgKCFiYS0+c3RhdHVzKSB7CisJCQliYWNweSgmaGRldi0+YmRhZGRyLCAmYmEtPmJkYWRkcik7CisJCX0gZWxzZSB7CisJCQlCVF9EQkcoIiVzOiBSRUFEX0JEX0FERFIgZmFpbGVkICVkIiwgaGRldi0+bmFtZSwgYmEtPnN0YXR1cyk7CisJCX0KKworCQloY2lfcmVxX2NvbXBsZXRlKGhkZXYsIGJhLT5zdGF0dXMpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUJUX0RCRygiJXMgQ29tbWFuZCBjb21wbGV0ZTogb2dmIElORk9fUEFSQU0gb2NmICV4IiwgaGRldi0+bmFtZSwgb2NmKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBDb21tYW5kIFN0YXR1cyBPR0YgTElOS19DVEwgICovCitzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2NzX2NyZWF0ZV9jb25uKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBfX3U4IHN0YXR1cykKK3sKKwlzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm47CisJc3RydWN0IGhjaV9jcF9jcmVhdGVfY29ubiAqY3AgPSBoY2lfc2VudF9jbWRfZGF0YShoZGV2LCBPR0ZfTElOS19DVEwsIE9DRl9DUkVBVEVfQ09OTik7CisKKwlpZiAoIWNwKQorCQlyZXR1cm47CisKKwloY2lfZGV2X2xvY2soaGRldik7CisKKwljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfYmEoaGRldiwgQUNMX0xJTkssICZjcC0+YmRhZGRyKTsKKworCUJUX0RCRygiJXMgc3RhdHVzIDB4JXggYmRhZGRyICVzIGNvbm4gJXAiLCBoZGV2LT5uYW1lLAorCQkJc3RhdHVzLCBiYXRvc3RyKCZjcC0+YmRhZGRyKSwgY29ubik7CisKKwlpZiAoc3RhdHVzKSB7CisJCWlmIChjb25uICYmIGNvbm4tPnN0YXRlID09IEJUX0NPTk5FQ1QpIHsKKwkJCWNvbm4tPnN0YXRlID0gQlRfQ0xPU0VEOworCQkJaGNpX3Byb3RvX2Nvbm5lY3RfY2ZtKGNvbm4sIHN0YXR1cyk7CisJCQloY2lfY29ubl9kZWwoY29ubik7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIWNvbm4pIHsKKwkJCWNvbm4gPSBoY2lfY29ubl9hZGQoaGRldiwgQUNMX0xJTkssICZjcC0+YmRhZGRyKTsKKwkJCWlmIChjb25uKSB7CisJCQkJY29ubi0+b3V0ID0gMTsKKwkJCQljb25uLT5saW5rX21vZGUgfD0gSENJX0xNX01BU1RFUjsKKwkJCX0gZWxzZQorCQkJCUJUX0VSUigiTm8gbWVtbW9yeSBmb3IgbmV3IGNvbm5lY3Rpb24iKTsKKwkJfQorCX0KKworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworfQorCitzdGF0aWMgdm9pZCBoY2lfY3NfbGlua19jdGwoc3RydWN0IGhjaV9kZXYgKmhkZXYsIF9fdTE2IG9jZiwgX191OCBzdGF0dXMpCit7CisJQlRfREJHKCIlcyBvY2YgMHgleCIsIGhkZXYtPm5hbWUsIG9jZik7CisKKwlzd2l0Y2ggKG9jZikgeworCWNhc2UgT0NGX0NSRUFURV9DT05OOgorCQloY2lfY3NfY3JlYXRlX2Nvbm4oaGRldiwgc3RhdHVzKTsKKwkJYnJlYWs7CisKKwljYXNlIE9DRl9BRERfU0NPOgorCQlpZiAoc3RhdHVzKSB7CisJCQlzdHJ1Y3QgaGNpX2Nvbm4gKmFjbCwgKnNjbzsKKwkJCXN0cnVjdCBoY2lfY3BfYWRkX3NjbyAqY3AgPSBoY2lfc2VudF9jbWRfZGF0YShoZGV2LCBPR0ZfTElOS19DVEwsIE9DRl9BRERfU0NPKTsKKwkJCV9fdTE2IGhhbmRsZTsKKworCQkJaWYgKCFjcCkKKwkJCQlicmVhazsKKworCQkJaGFuZGxlID0gX19sZTE2X3RvX2NwdShjcC0+aGFuZGxlKTsKKworCQkJQlRfREJHKCIlcyBBZGQgU0NPIGVycm9yOiBoYW5kbGUgJWQgc3RhdHVzIDB4JXgiLCBoZGV2LT5uYW1lLCBoYW5kbGUsIHN0YXR1cyk7CisKKwkJCWhjaV9kZXZfbG9jayhoZGV2KTsKKworCQkJYWNsID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfaGFuZGxlKGhkZXYsIGhhbmRsZSk7CisJCQlpZiAoYWNsICYmIChzY28gPSBhY2wtPmxpbmspKSB7CisJCQkJc2NvLT5zdGF0ZSA9IEJUX0NMT1NFRDsKKworCQkJCWhjaV9wcm90b19jb25uZWN0X2NmbShzY28sIHN0YXR1cyk7CisJCQkJaGNpX2Nvbm5fZGVsKHNjbyk7CisJCQl9CisKKwkJCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBPQ0ZfSU5RVUlSWToKKwkJaWYgKHN0YXR1cykgeworCQkJQlRfREJHKCIlcyBJbnF1aXJ5IGVycm9yOiBzdGF0dXMgMHgleCIsIGhkZXYtPm5hbWUsIHN0YXR1cyk7CisJCQloY2lfcmVxX2NvbXBsZXRlKGhkZXYsIHN0YXR1cyk7CisJCX0gZWxzZSB7CisJCQlzZXRfYml0KEhDSV9JTlFVSVJZLCAmaGRldi0+ZmxhZ3MpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlRfREJHKCIlcyBDb21tYW5kIHN0YXR1czogb2dmIExJTktfQ1RMIG9jZiAleCBzdGF0dXMgJWQiLCAKKwkJCWhkZXYtPm5hbWUsIG9jZiwgc3RhdHVzKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBDb21tYW5kIFN0YXR1cyBPR0YgTElOS19QT0xJQ1kgKi8KK3N0YXRpYyB2b2lkIGhjaV9jc19saW5rX3BvbGljeShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgX191MTYgb2NmLCBfX3U4IHN0YXR1cykKK3sKKwlCVF9EQkcoIiVzIG9jZiAweCV4IiwgaGRldi0+bmFtZSwgb2NmKTsKKworCXN3aXRjaCAob2NmKSB7CisJZGVmYXVsdDoKKwkJQlRfREJHKCIlcyBDb21tYW5kIHN0YXR1czogb2dmIEhPU1RfUE9MSUNZIG9jZiAleCIsIGhkZXYtPm5hbWUsIG9jZik7CisJCWJyZWFrOworCX0KK30KKworLyogQ29tbWFuZCBTdGF0dXMgT0dGIEhPU1RfQ1RMICovCitzdGF0aWMgdm9pZCBoY2lfY3NfaG9zdF9jdGwoc3RydWN0IGhjaV9kZXYgKmhkZXYsIF9fdTE2IG9jZiwgX191OCBzdGF0dXMpCit7CisJQlRfREJHKCIlcyBvY2YgMHgleCIsIGhkZXYtPm5hbWUsIG9jZik7CisKKwlzd2l0Y2ggKG9jZikgeworCWRlZmF1bHQ6CisJCUJUX0RCRygiJXMgQ29tbWFuZCBzdGF0dXM6IG9nZiBIT1NUX0NUTCBvY2YgJXgiLCBoZGV2LT5uYW1lLCBvY2YpOworCQlicmVhazsKKwl9Cit9CisKKy8qIENvbW1hbmQgU3RhdHVzIE9HRiBJTkZPX1BBUkFNICAqLworc3RhdGljIHZvaWQgaGNpX2NzX2luZm9fcGFyYW0oc3RydWN0IGhjaV9kZXYgKmhkZXYsIF9fdTE2IG9jZiwgX191OCBzdGF0dXMpCit7CisJQlRfREJHKCIlczogaGNpX2NzX2luZm9fcGFyYW06IG9jZiAweCV4IiwgaGRldi0+bmFtZSwgb2NmKTsKKworCXN3aXRjaCAob2NmKSB7CisJZGVmYXVsdDoKKwkJQlRfREJHKCIlcyBDb21tYW5kIHN0YXR1czogb2dmIElORk9fUEFSQU0gb2NmICV4IiwgaGRldi0+bmFtZSwgb2NmKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBJbnF1aXJ5IENvbXBsZXRlICovCitzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2lucXVpcnlfY29tcGxldGVfZXZ0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCV9fdTggc3RhdHVzID0gKigoX191OCAqKSBza2ItPmRhdGEpOworCisJQlRfREJHKCIlcyBzdGF0dXMgJWQiLCBoZGV2LT5uYW1lLCBzdGF0dXMpOworCisJY2xlYXJfYml0KEhDSV9JTlFVSVJZLCAmaGRldi0+ZmxhZ3MpOworCWhjaV9yZXFfY29tcGxldGUoaGRldiwgc3RhdHVzKTsKK30KKworLyogSW5xdWlyeSBSZXN1bHQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfaW5xdWlyeV9yZXN1bHRfZXZ0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpbnF1aXJ5X2luZm8gKmluZm8gPSAoc3RydWN0IGlucXVpcnlfaW5mbyAqKSAoc2tiLT5kYXRhICsgMSk7CisJaW50IG51bV9yc3AgPSAqKChfX3U4ICopIHNrYi0+ZGF0YSk7CisKKwlCVF9EQkcoIiVzIG51bV9yc3AgJWQiLCBoZGV2LT5uYW1lLCBudW1fcnNwKTsKKworCWhjaV9kZXZfbG9jayhoZGV2KTsKKwlmb3IgKDsgbnVtX3JzcDsgbnVtX3JzcC0tKSB7CisJCXN0cnVjdCBpbnF1aXJ5X2RhdGEgZGF0YTsKKwkJYmFjcHkoJmRhdGEuYmRhZGRyLCAmaW5mby0+YmRhZGRyKTsKKwkJZGF0YS5wc2Nhbl9yZXBfbW9kZQk9IGluZm8tPnBzY2FuX3JlcF9tb2RlOworCQlkYXRhLnBzY2FuX3BlcmlvZF9tb2RlCT0gaW5mby0+cHNjYW5fcGVyaW9kX21vZGU7CisJCWRhdGEucHNjYW5fbW9kZQkJPSBpbmZvLT5wc2Nhbl9tb2RlOworCQltZW1jcHkoZGF0YS5kZXZfY2xhc3MsIGluZm8tPmRldl9jbGFzcywgMyk7CisJCWRhdGEuY2xvY2tfb2Zmc2V0CT0gaW5mby0+Y2xvY2tfb2Zmc2V0OworCQlkYXRhLnJzc2kJCT0gMHgwMDsKKwkJaW5mbysrOworCQloY2lfaW5xdWlyeV9jYWNoZV91cGRhdGUoaGRldiwgJmRhdGEpOworCX0KKwloY2lfZGV2X3VubG9jayhoZGV2KTsKK30KKworLyogSW5xdWlyeSBSZXN1bHQgV2l0aCBSU1NJICovCitzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2lucXVpcnlfcmVzdWx0X3dpdGhfcnNzaV9ldnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlucXVpcnlfaW5mb193aXRoX3Jzc2kgKmluZm8gPSAoc3RydWN0IGlucXVpcnlfaW5mb193aXRoX3Jzc2kgKikgKHNrYi0+ZGF0YSArIDEpOworCWludCBudW1fcnNwID0gKigoX191OCAqKSBza2ItPmRhdGEpOworCisJQlRfREJHKCIlcyBudW1fcnNwICVkIiwgaGRldi0+bmFtZSwgbnVtX3JzcCk7CisKKwloY2lfZGV2X2xvY2soaGRldik7CisJZm9yICg7IG51bV9yc3A7IG51bV9yc3AtLSkgeworCQlzdHJ1Y3QgaW5xdWlyeV9kYXRhIGRhdGE7CisJCWJhY3B5KCZkYXRhLmJkYWRkciwgJmluZm8tPmJkYWRkcik7CisJCWRhdGEucHNjYW5fcmVwX21vZGUJPSBpbmZvLT5wc2Nhbl9yZXBfbW9kZTsKKwkJZGF0YS5wc2Nhbl9wZXJpb2RfbW9kZQk9IGluZm8tPnBzY2FuX3BlcmlvZF9tb2RlOworCQlkYXRhLnBzY2FuX21vZGUJCT0gMHgwMDsKKwkJbWVtY3B5KGRhdGEuZGV2X2NsYXNzLCBpbmZvLT5kZXZfY2xhc3MsIDMpOworCQlkYXRhLmNsb2NrX29mZnNldAk9IGluZm8tPmNsb2NrX29mZnNldDsKKwkJZGF0YS5yc3NpCQk9IGluZm8tPnJzc2k7CisJCWluZm8rKzsKKwkJaGNpX2lucXVpcnlfY2FjaGVfdXBkYXRlKGhkZXYsICZkYXRhKTsKKwl9CisJaGNpX2Rldl91bmxvY2soaGRldik7Cit9CisKKy8qIENvbm5lY3QgUmVxdWVzdCAqLworc3RhdGljIGlubGluZSB2b2lkIGhjaV9jb25uX3JlcXVlc3RfZXZ0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoY2lfZXZfY29ubl9yZXF1ZXN0ICpldiA9IChzdHJ1Y3QgaGNpX2V2X2Nvbm5fcmVxdWVzdCAqKSBza2ItPmRhdGE7CisJaW50IG1hc2sgPSBoZGV2LT5saW5rX21vZGU7CisKKwlCVF9EQkcoIiVzIENvbm5lY3Rpb24gcmVxdWVzdDogJXMgdHlwZSAweCV4IiwgaGRldi0+bmFtZSwKKwkJCWJhdG9zdHIoJmV2LT5iZGFkZHIpLCBldi0+bGlua190eXBlKTsKKworCW1hc2sgfD0gaGNpX3Byb3RvX2Nvbm5lY3RfaW5kKGhkZXYsICZldi0+YmRhZGRyLCBldi0+bGlua190eXBlKTsKKworCWlmIChtYXNrICYgSENJX0xNX0FDQ0VQVCkgeworCQkvKiBDb25uZWN0aW9uIGFjY2VwdGVkICovCisJCXN0cnVjdCBoY2lfY29ubiAqY29ubjsKKwkJc3RydWN0IGhjaV9jcF9hY2NlcHRfY29ubl9yZXEgY3A7CisKKwkJaGNpX2Rldl9sb2NrKGhkZXYpOworCQljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfYmEoaGRldiwgZXYtPmxpbmtfdHlwZSwgJmV2LT5iZGFkZHIpOworCQlpZiAoIWNvbm4pIHsKKwkJCWlmICghKGNvbm4gPSBoY2lfY29ubl9hZGQoaGRldiwgZXYtPmxpbmtfdHlwZSwgJmV2LT5iZGFkZHIpKSkgeworCQkJCUJUX0VSUigiTm8gbWVtbW9yeSBmb3IgbmV3IGNvbm5lY3Rpb24iKTsKKwkJCQloY2lfZGV2X3VubG9jayhoZGV2KTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJbWVtY3B5KGNvbm4tPmRldl9jbGFzcywgZXYtPmRldl9jbGFzcywgMyk7CisJCWNvbm4tPnN0YXRlID0gQlRfQ09OTkVDVDsKKwkJaGNpX2Rldl91bmxvY2soaGRldik7CisKKwkJYmFjcHkoJmNwLmJkYWRkciwgJmV2LT5iZGFkZHIpOworCisJCWlmIChsbXBfcnN3aXRjaF9jYXBhYmxlKGhkZXYpICYmIChtYXNrICYgSENJX0xNX01BU1RFUikpCisJCQljcC5yb2xlID0gMHgwMDsgLyogQmVjb21lIG1hc3RlciAqLworCQllbHNlCisJCQljcC5yb2xlID0gMHgwMTsgLyogUmVtYWluIHNsYXZlICovCisKKwkJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9MSU5LX0NUTCwgT0NGX0FDQ0VQVF9DT05OX1JFUSwgc2l6ZW9mKGNwKSwgJmNwKTsKKwl9IGVsc2UgeworCQkvKiBDb25uZWN0aW9uIHJlamVjdGVkICovCisJCXN0cnVjdCBoY2lfY3BfcmVqZWN0X2Nvbm5fcmVxIGNwOworCisJCWJhY3B5KCZjcC5iZGFkZHIsICZldi0+YmRhZGRyKTsKKwkJY3AucmVhc29uID0gMHgwZjsKKwkJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9MSU5LX0NUTCwgT0NGX1JFSkVDVF9DT05OX1JFUSwgc2l6ZW9mKGNwKSwgJmNwKTsKKwl9Cit9CisKKy8qIENvbm5lY3QgQ29tcGxldGUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfY29ubl9jb21wbGV0ZV9ldnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGhjaV9ldl9jb25uX2NvbXBsZXRlICpldiA9IChzdHJ1Y3QgaGNpX2V2X2Nvbm5fY29tcGxldGUgKikgc2tiLT5kYXRhOworCXN0cnVjdCBoY2lfY29ubiAqY29ubiA9IE5VTEw7CisKKwlCVF9EQkcoIiVzIiwgaGRldi0+bmFtZSk7CisKKwloY2lfZGV2X2xvY2soaGRldik7CisKKwljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfYmEoaGRldiwgZXYtPmxpbmtfdHlwZSwgJmV2LT5iZGFkZHIpOworCWlmICghY29ubikgeworCQloY2lfZGV2X3VubG9jayhoZGV2KTsKKwkJcmV0dXJuOworCX0KKworCWlmICghZXYtPnN0YXR1cykgeworCQljb25uLT5oYW5kbGUgPSBfX2xlMTZfdG9fY3B1KGV2LT5oYW5kbGUpOworCQljb25uLT5zdGF0ZSAgPSBCVF9DT05ORUNURUQ7CisKKwkJaWYgKHRlc3RfYml0KEhDSV9BVVRILCAmaGRldi0+ZmxhZ3MpKQorCQkJY29ubi0+bGlua19tb2RlIHw9IEhDSV9MTV9BVVRIOworCisJCWlmICh0ZXN0X2JpdChIQ0lfRU5DUllQVCwgJmhkZXYtPmZsYWdzKSkKKwkJCWNvbm4tPmxpbmtfbW9kZSB8PSBIQ0lfTE1fRU5DUllQVDsKKworCQkvKiBTZXQgbGluayBwb2xpY3kgKi8KKwkJaWYgKGNvbm4tPnR5cGUgPT0gQUNMX0xJTksgJiYgaGRldi0+bGlua19wb2xpY3kpIHsKKwkJCXN0cnVjdCBoY2lfY3Bfd3JpdGVfbGlua19wb2xpY3kgY3A7CisJCQljcC5oYW5kbGUgPSBldi0+aGFuZGxlOworCQkJY3AucG9saWN5ID0gX19jcHVfdG9fbGUxNihoZGV2LT5saW5rX3BvbGljeSk7CisJCQloY2lfc2VuZF9jbWQoaGRldiwgT0dGX0xJTktfUE9MSUNZLCBPQ0ZfV1JJVEVfTElOS19QT0xJQ1ksIHNpemVvZihjcCksICZjcCk7CisJCX0KKworCQkvKiBTZXQgcGFja2V0IHR5cGUgZm9yIGluY29taW5nIGNvbm5lY3Rpb24gKi8KKwkJaWYgKCFjb25uLT5vdXQpIHsKKwkJCXN0cnVjdCBoY2lfY3BfY2hhbmdlX2Nvbm5fcHR5cGUgY3A7CisJCQljcC5oYW5kbGUgPSBldi0+aGFuZGxlOworCQkJY3AucGt0X3R5cGUgPSAoY29ubi0+dHlwZSA9PSBBQ0xfTElOSykgPyAKKwkJCQlfX2NwdV90b19sZTE2KGhkZXYtPnBrdF90eXBlICYgQUNMX1BUWVBFX01BU0spOgorCQkJCV9fY3B1X3RvX2xlMTYoaGRldi0+cGt0X3R5cGUgJiBTQ09fUFRZUEVfTUFTSyk7CisKKwkJCWhjaV9zZW5kX2NtZChoZGV2LCBPR0ZfTElOS19DVEwsIE9DRl9DSEFOR0VfQ09OTl9QVFlQRSwgc2l6ZW9mKGNwKSwgJmNwKTsKKwkJfQorCX0gZWxzZQorCQljb25uLT5zdGF0ZSA9IEJUX0NMT1NFRDsKKworCWlmIChjb25uLT50eXBlID09IEFDTF9MSU5LKSB7CisJCXN0cnVjdCBoY2lfY29ubiAqc2NvID0gY29ubi0+bGluazsKKwkJaWYgKHNjbykgeworCQkJaWYgKCFldi0+c3RhdHVzKQorCQkJCWhjaV9hZGRfc2NvKHNjbywgY29ubi0+aGFuZGxlKTsKKwkJCWVsc2UgeworCQkJCWhjaV9wcm90b19jb25uZWN0X2NmbShzY28sIGV2LT5zdGF0dXMpOworCQkJCWhjaV9jb25uX2RlbChzY28pOworCQkJfQorCQl9CisJfQorCisJaGNpX3Byb3RvX2Nvbm5lY3RfY2ZtKGNvbm4sIGV2LT5zdGF0dXMpOworCWlmIChldi0+c3RhdHVzKQorCQloY2lfY29ubl9kZWwoY29ubik7CisKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKK30KKworLyogRGlzY29ubmVjdCBDb21wbGV0ZSAqLworc3RhdGljIGlubGluZSB2b2lkIGhjaV9kaXNjb25uX2NvbXBsZXRlX2V2dChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaGNpX2V2X2Rpc2Nvbm5fY29tcGxldGUgKmV2ID0gKHN0cnVjdCBoY2lfZXZfZGlzY29ubl9jb21wbGV0ZSAqKSBza2ItPmRhdGE7CisJc3RydWN0IGhjaV9jb25uICpjb25uID0gTlVMTDsKKwlfX3UxNiBoYW5kbGUgPSBfX2xlMTZfdG9fY3B1KGV2LT5oYW5kbGUpOworCisJQlRfREJHKCIlcyBzdGF0dXMgJWQiLCBoZGV2LT5uYW1lLCBldi0+c3RhdHVzKTsKKworCWlmIChldi0+c3RhdHVzKQorCQlyZXR1cm47CisKKwloY2lfZGV2X2xvY2soaGRldik7CisKKwljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfaGFuZGxlKGhkZXYsIGhhbmRsZSk7CisJaWYgKGNvbm4pIHsKKwkJY29ubi0+c3RhdGUgPSBCVF9DTE9TRUQ7CisJCWhjaV9wcm90b19kaXNjb25uX2luZChjb25uLCBldi0+cmVhc29uKTsKKwkJaGNpX2Nvbm5fZGVsKGNvbm4pOworCX0KKworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworfQorCisvKiBOdW1iZXIgb2YgY29tcGxldGVkIHBhY2tldHMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfbnVtX2NvbXBfcGt0c19ldnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGhjaV9ldl9udW1fY29tcF9wa3RzICpldiA9IChzdHJ1Y3QgaGNpX2V2X251bV9jb21wX3BrdHMgKikgc2tiLT5kYXRhOworCV9fdTE2ICpwdHI7CisJaW50IGk7CisKKwlza2JfcHVsbChza2IsIHNpemVvZigqZXYpKTsKKworCUJUX0RCRygiJXMgbnVtX2huZGwgJWQiLCBoZGV2LT5uYW1lLCBldi0+bnVtX2huZGwpOworCisJaWYgKHNrYi0+bGVuIDwgZXYtPm51bV9obmRsICogNCkgeworCQlCVF9EQkcoIiVzIGJhZCBwYXJhbWV0ZXJzIiwgaGRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwl0YXNrbGV0X2Rpc2FibGUoJmhkZXYtPnR4X3Rhc2spOworCisJZm9yIChpID0gMCwgcHRyID0gKF9fdTE2ICopIHNrYi0+ZGF0YTsgaSA8IGV2LT5udW1faG5kbDsgaSsrKSB7CisJCXN0cnVjdCBoY2lfY29ubiAqY29ubjsKKwkJX191MTYgIGhhbmRsZSwgY291bnQ7CisKKwkJaGFuZGxlID0gX19sZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKHB0cisrKSk7CisJCWNvdW50ICA9IF9fbGUxNl90b19jcHUoZ2V0X3VuYWxpZ25lZChwdHIrKykpOworCisJCWNvbm4gPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9oYW5kbGUoaGRldiwgaGFuZGxlKTsKKwkJaWYgKGNvbm4pIHsKKwkJCWNvbm4tPnNlbnQgLT0gY291bnQ7CisKKwkJCWlmIChjb25uLT50eXBlID09IFNDT19MSU5LKSB7CisJCQkJaWYgKChoZGV2LT5zY29fY250ICs9IGNvdW50KSA+IGhkZXYtPnNjb19wa3RzKQorCQkJCQloZGV2LT5zY29fY250ID0gaGRldi0+c2NvX3BrdHM7CisJCQl9IGVsc2UgeworCQkJCWlmICgoaGRldi0+YWNsX2NudCArPSBjb3VudCkgPiBoZGV2LT5hY2xfcGt0cykKKwkJCQkJaGRldi0+YWNsX2NudCA9IGhkZXYtPmFjbF9wa3RzOworCQkJfQorCQl9CisJfQorCWhjaV9zY2hlZF90eChoZGV2KTsKKworCXRhc2tsZXRfZW5hYmxlKCZoZGV2LT50eF90YXNrKTsKK30KKworLyogUm9sZSBDaGFuZ2UgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfcm9sZV9jaGFuZ2VfZXZ0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoY2lfZXZfcm9sZV9jaGFuZ2UgKmV2ID0gKHN0cnVjdCBoY2lfZXZfcm9sZV9jaGFuZ2UgKikgc2tiLT5kYXRhOworCXN0cnVjdCBoY2lfY29ubiAqY29ubiA9IE5VTEw7CisKKwlCVF9EQkcoIiVzIHN0YXR1cyAlZCIsIGhkZXYtPm5hbWUsIGV2LT5zdGF0dXMpOworCisJaGNpX2Rldl9sb2NrKGhkZXYpOworCisJY29ubiA9IGhjaV9jb25uX2hhc2hfbG9va3VwX2JhKGhkZXYsIEFDTF9MSU5LLCAmZXYtPmJkYWRkcik7CisJaWYgKGNvbm4pIHsKKwkJaWYgKCFldi0+c3RhdHVzKSB7CisJCQlpZiAoZXYtPnJvbGUpCisJCQkJY29ubi0+bGlua19tb2RlICY9IH5IQ0lfTE1fTUFTVEVSOworCQkJZWxzZQorCQkJCWNvbm4tPmxpbmtfbW9kZSB8PSBIQ0lfTE1fTUFTVEVSOworCQl9CisKKwkJY2xlYXJfYml0KEhDSV9DT05OX1JTV0lUQ0hfUEVORCwgJmNvbm4tPnBlbmQpOworCisJCWhjaV9yb2xlX3N3aXRjaF9jZm0oY29ubiwgZXYtPnN0YXR1cywgZXYtPnJvbGUpOworCX0KKworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworfQorCisvKiBBdXRoZW50aWNhdGlvbiBDb21wbGV0ZSAqLworc3RhdGljIGlubGluZSB2b2lkIGhjaV9hdXRoX2NvbXBsZXRlX2V2dChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaGNpX2V2X2F1dGhfY29tcGxldGUgKmV2ID0gKHN0cnVjdCBoY2lfZXZfYXV0aF9jb21wbGV0ZSAqKSBza2ItPmRhdGE7CisJc3RydWN0IGhjaV9jb25uICpjb25uID0gTlVMTDsKKwlfX3UxNiBoYW5kbGUgPSBfX2xlMTZfdG9fY3B1KGV2LT5oYW5kbGUpOworCisJQlRfREJHKCIlcyBzdGF0dXMgJWQiLCBoZGV2LT5uYW1lLCBldi0+c3RhdHVzKTsKKworCWhjaV9kZXZfbG9jayhoZGV2KTsKKworCWNvbm4gPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9oYW5kbGUoaGRldiwgaGFuZGxlKTsKKwlpZiAoY29ubikgeworCQlpZiAoIWV2LT5zdGF0dXMpCisJCQljb25uLT5saW5rX21vZGUgfD0gSENJX0xNX0FVVEg7CisKKwkJY2xlYXJfYml0KEhDSV9DT05OX0FVVEhfUEVORCwgJmNvbm4tPnBlbmQpOworCisJCWhjaV9hdXRoX2NmbShjb25uLCBldi0+c3RhdHVzKTsKKworCQlpZiAodGVzdF9iaXQoSENJX0NPTk5fRU5DUllQVF9QRU5ELCAmY29ubi0+cGVuZCkpIHsKKwkJCWlmICghZXYtPnN0YXR1cykgeworCQkJCXN0cnVjdCBoY2lfY3Bfc2V0X2Nvbm5fZW5jcnlwdCBjcDsKKwkJCQljcC5oYW5kbGUgID0gX19jcHVfdG9fbGUxNihjb25uLT5oYW5kbGUpOworCQkJCWNwLmVuY3J5cHQgPSAxOworCQkJCWhjaV9zZW5kX2NtZChjb25uLT5oZGV2LCBPR0ZfTElOS19DVEwsCisJCQkJCQlPQ0ZfU0VUX0NPTk5fRU5DUllQVCwKKwkJCQkJCXNpemVvZihjcCksICZjcCk7CisJCQl9IGVsc2UgeworCQkJCWNsZWFyX2JpdChIQ0lfQ09OTl9FTkNSWVBUX1BFTkQsICZjb25uLT5wZW5kKTsKKwkJCQloY2lfZW5jcnlwdF9jZm0oY29ubiwgZXYtPnN0YXR1cywgMHgwMCk7CisJCQl9CisJCX0KKwl9CisKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKK30KKworLyogRW5jcnlwdGlvbiBDaGFuZ2UgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfZW5jcnlwdF9jaGFuZ2VfZXZ0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoY2lfZXZfZW5jcnlwdF9jaGFuZ2UgKmV2ID0gKHN0cnVjdCBoY2lfZXZfZW5jcnlwdF9jaGFuZ2UgKikgc2tiLT5kYXRhOworCXN0cnVjdCBoY2lfY29ubiAqY29ubiA9IE5VTEw7CisJX191MTYgaGFuZGxlID0gX19sZTE2X3RvX2NwdShldi0+aGFuZGxlKTsKKworCUJUX0RCRygiJXMgc3RhdHVzICVkIiwgaGRldi0+bmFtZSwgZXYtPnN0YXR1cyk7CisKKwloY2lfZGV2X2xvY2soaGRldik7CisKKwljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfaGFuZGxlKGhkZXYsIGhhbmRsZSk7CisJaWYgKGNvbm4pIHsKKwkJaWYgKCFldi0+c3RhdHVzKSB7CisJCQlpZiAoZXYtPmVuY3J5cHQpCisJCQkJY29ubi0+bGlua19tb2RlIHw9IEhDSV9MTV9FTkNSWVBUOworCQkJZWxzZQorCQkJCWNvbm4tPmxpbmtfbW9kZSAmPSB+SENJX0xNX0VOQ1JZUFQ7CisJCX0KKworCQljbGVhcl9iaXQoSENJX0NPTk5fRU5DUllQVF9QRU5ELCAmY29ubi0+cGVuZCk7CisKKwkJaGNpX2VuY3J5cHRfY2ZtKGNvbm4sIGV2LT5zdGF0dXMsIGV2LT5lbmNyeXB0KTsKKwl9CisKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKK30KKworLyogQ2hhbmdlIENvbm5lY3Rpb24gTGluayBLZXkgQ29tcGxldGUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfY2hhbmdlX2Nvbm5fbGlua19rZXlfY29tcGxldGVfZXZ0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoY2lfZXZfY2hhbmdlX2Nvbm5fbGlua19rZXlfY29tcGxldGUgKmV2ID0gKHN0cnVjdCBoY2lfZXZfY2hhbmdlX2Nvbm5fbGlua19rZXlfY29tcGxldGUgKikgc2tiLT5kYXRhOworCXN0cnVjdCBoY2lfY29ubiAqY29ubiA9IE5VTEw7CisJX191MTYgaGFuZGxlID0gX19sZTE2X3RvX2NwdShldi0+aGFuZGxlKTsKKworCUJUX0RCRygiJXMgc3RhdHVzICVkIiwgaGRldi0+bmFtZSwgZXYtPnN0YXR1cyk7CisKKwloY2lfZGV2X2xvY2soaGRldik7CisKKwljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfaGFuZGxlKGhkZXYsIGhhbmRsZSk7CisJaWYgKGNvbm4pIHsKKwkJaWYgKCFldi0+c3RhdHVzKQorCQkJY29ubi0+bGlua19tb2RlIHw9IEhDSV9MTV9TRUNVUkU7CisKKwkJY2xlYXJfYml0KEhDSV9DT05OX0FVVEhfUEVORCwgJmNvbm4tPnBlbmQpOworCisJCWhjaV9rZXlfY2hhbmdlX2NmbShjb25uLCBldi0+c3RhdHVzKTsKKwl9CisKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKK30KKworLyogUGluIENvZGUgUmVxdWVzdCovCitzdGF0aWMgaW5saW5lIHZvaWQgaGNpX3Bpbl9jb2RlX3JlcXVlc3RfZXZ0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworfQorCisvKiBMaW5rIEtleSBSZXF1ZXN0ICovCitzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2xpbmtfa2V5X3JlcXVlc3RfZXZ0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworfQorCisvKiBMaW5rIEtleSBOb3RpZmljYXRpb24gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfbGlua19rZXlfbm90aWZ5X2V2dChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKK30KKworLyogQ2xvY2sgT2Zmc2V0ICovCitzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2Nsb2NrX29mZnNldF9ldnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGhjaV9ldl9jbG9ja19vZmZzZXQgKmV2ID0gKHN0cnVjdCBoY2lfZXZfY2xvY2tfb2Zmc2V0ICopIHNrYi0+ZGF0YTsKKwlzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4gPSBOVUxMOworCV9fdTE2IGhhbmRsZSA9IF9fbGUxNl90b19jcHUoZXYtPmhhbmRsZSk7CisKKwlCVF9EQkcoIiVzIHN0YXR1cyAlZCIsIGhkZXYtPm5hbWUsIGV2LT5zdGF0dXMpOworCisJaGNpX2Rldl9sb2NrKGhkZXYpOworCisJY29ubiA9IGhjaV9jb25uX2hhc2hfbG9va3VwX2hhbmRsZShoZGV2LCBoYW5kbGUpOworCWlmIChjb25uICYmICFldi0+c3RhdHVzKSB7CisJCXN0cnVjdCBpbnF1aXJ5X2VudHJ5ICppZTsKKworCQlpZiAoKGllID0gaGNpX2lucXVpcnlfY2FjaGVfbG9va3VwKGhkZXYsICZjb25uLT5kc3QpKSkgeworCQkJaWUtPmRhdGEuY2xvY2tfb2Zmc2V0ID0gZXYtPmNsb2NrX29mZnNldDsKKwkJCWllLT50aW1lc3RhbXAgPSBqaWZmaWVzOworCQl9CisJfQorCisJaGNpX2Rldl91bmxvY2soaGRldik7Cit9CisKK3ZvaWQgaGNpX2V2ZW50X3BhY2tldChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaGNpX2V2ZW50X2hkciAqaGRyID0gKHN0cnVjdCBoY2lfZXZlbnRfaGRyICopIHNrYi0+ZGF0YTsKKwlzdHJ1Y3QgaGNpX2V2X2NtZF9jb21wbGV0ZSAqZWM7CisJc3RydWN0IGhjaV9ldl9jbWRfc3RhdHVzICpjczsKKwl1MTYgb3Bjb2RlLCBvY2YsIG9nZjsKKworCXNrYl9wdWxsKHNrYiwgSENJX0VWRU5UX0hEUl9TSVpFKTsKKworCUJUX0RCRygiJXMgZXZ0IDB4JXgiLCBoZGV2LT5uYW1lLCBoZHItPmV2dCk7CisKKwlzd2l0Y2ggKGhkci0+ZXZ0KSB7CisJY2FzZSBIQ0lfRVZfTlVNX0NPTVBfUEtUUzoKKwkJaGNpX251bV9jb21wX3BrdHNfZXZ0KGhkZXYsIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBIQ0lfRVZfSU5RVUlSWV9DT01QTEVURToKKwkJaGNpX2lucXVpcnlfY29tcGxldGVfZXZ0KGhkZXYsIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBIQ0lfRVZfSU5RVUlSWV9SRVNVTFQ6CisJCWhjaV9pbnF1aXJ5X3Jlc3VsdF9ldnQoaGRldiwgc2tiKTsKKwkJYnJlYWs7CisKKwljYXNlIEhDSV9FVl9JTlFVSVJZX1JFU1VMVF9XSVRIX1JTU0k6CisJCWhjaV9pbnF1aXJ5X3Jlc3VsdF93aXRoX3Jzc2lfZXZ0KGhkZXYsIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBIQ0lfRVZfQ09OTl9SRVFVRVNUOgorCQloY2lfY29ubl9yZXF1ZXN0X2V2dChoZGV2LCBza2IpOworCQlicmVhazsKKworCWNhc2UgSENJX0VWX0NPTk5fQ09NUExFVEU6CisJCWhjaV9jb25uX2NvbXBsZXRlX2V2dChoZGV2LCBza2IpOworCQlicmVhazsKKworCWNhc2UgSENJX0VWX0RJU0NPTk5fQ09NUExFVEU6CisJCWhjaV9kaXNjb25uX2NvbXBsZXRlX2V2dChoZGV2LCBza2IpOworCQlicmVhazsKKworCWNhc2UgSENJX0VWX1JPTEVfQ0hBTkdFOgorCQloY2lfcm9sZV9jaGFuZ2VfZXZ0KGhkZXYsIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBIQ0lfRVZfQVVUSF9DT01QTEVURToKKwkJaGNpX2F1dGhfY29tcGxldGVfZXZ0KGhkZXYsIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBIQ0lfRVZfRU5DUllQVF9DSEFOR0U6CisJCWhjaV9lbmNyeXB0X2NoYW5nZV9ldnQoaGRldiwgc2tiKTsKKwkJYnJlYWs7CisKKwljYXNlIEhDSV9FVl9DSEFOR0VfQ09OTl9MSU5LX0tFWV9DT01QTEVURToKKwkJaGNpX2NoYW5nZV9jb25uX2xpbmtfa2V5X2NvbXBsZXRlX2V2dChoZGV2LCBza2IpOworCQlicmVhazsKKworCWNhc2UgSENJX0VWX1BJTl9DT0RFX1JFUToKKwkJaGNpX3Bpbl9jb2RlX3JlcXVlc3RfZXZ0KGhkZXYsIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBIQ0lfRVZfTElOS19LRVlfUkVROgorCQloY2lfbGlua19rZXlfcmVxdWVzdF9ldnQoaGRldiwgc2tiKTsKKwkJYnJlYWs7CisKKwljYXNlIEhDSV9FVl9MSU5LX0tFWV9OT1RJRlk6CisJCWhjaV9saW5rX2tleV9ub3RpZnlfZXZ0KGhkZXYsIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBIQ0lfRVZfQ0xPQ0tfT0ZGU0VUOgorCQloY2lfY2xvY2tfb2Zmc2V0X2V2dChoZGV2LCBza2IpOworCQlicmVhazsKKworCWNhc2UgSENJX0VWX0NNRF9TVEFUVVM6CisJCWNzID0gKHN0cnVjdCBoY2lfZXZfY21kX3N0YXR1cyAqKSBza2ItPmRhdGE7CisJCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKGNzKSk7CisKKwkJb3Bjb2RlID0gX19sZTE2X3RvX2NwdShjcy0+b3Bjb2RlKTsKKwkJb2dmID0gaGNpX29wY29kZV9vZ2Yob3Bjb2RlKTsKKwkJb2NmID0gaGNpX29wY29kZV9vY2Yob3Bjb2RlKTsKKworCQlzd2l0Y2ggKG9nZikgeworCQljYXNlIE9HRl9JTkZPX1BBUkFNOgorCQkJaGNpX2NzX2luZm9fcGFyYW0oaGRldiwgb2NmLCBjcy0+c3RhdHVzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0dGX0hPU1RfQ1RMOgorCQkJaGNpX2NzX2hvc3RfY3RsKGhkZXYsIG9jZiwgY3MtPnN0YXR1cyk7CisJCQlicmVhazsKKworCQljYXNlIE9HRl9MSU5LX0NUTDoKKwkJCWhjaV9jc19saW5rX2N0bChoZGV2LCBvY2YsIGNzLT5zdGF0dXMpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPR0ZfTElOS19QT0xJQ1k6CisJCQloY2lfY3NfbGlua19wb2xpY3koaGRldiwgb2NmLCBjcy0+c3RhdHVzKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlCVF9EQkcoIiVzIENvbW1hbmQgU3RhdHVzIE9HRiAleCIsIGhkZXYtPm5hbWUsIG9nZik7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChjcy0+bmNtZCkgeworCQkJYXRvbWljX3NldCgmaGRldi0+Y21kX2NudCwgMSk7CisJCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmaGRldi0+Y21kX3EpKQorCQkJCWhjaV9zY2hlZF9jbWQoaGRldik7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEhDSV9FVl9DTURfQ09NUExFVEU6CisJCWVjID0gKHN0cnVjdCBoY2lfZXZfY21kX2NvbXBsZXRlICopIHNrYi0+ZGF0YTsKKwkJc2tiX3B1bGwoc2tiLCBzaXplb2YoKmVjKSk7CisKKwkJb3Bjb2RlID0gX19sZTE2X3RvX2NwdShlYy0+b3Bjb2RlKTsKKwkJb2dmID0gaGNpX29wY29kZV9vZ2Yob3Bjb2RlKTsKKwkJb2NmID0gaGNpX29wY29kZV9vY2Yob3Bjb2RlKTsKKworCQlzd2l0Y2ggKG9nZikgeworCQljYXNlIE9HRl9JTkZPX1BBUkFNOgorCQkJaGNpX2NjX2luZm9fcGFyYW0oaGRldiwgb2NmLCBza2IpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPR0ZfSE9TVF9DVEw6CisJCQloY2lfY2NfaG9zdF9jdGwoaGRldiwgb2NmLCBza2IpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPR0ZfTElOS19DVEw6CisJCQloY2lfY2NfbGlua19jdGwoaGRldiwgb2NmLCBza2IpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPR0ZfTElOS19QT0xJQ1k6CisJCQloY2lfY2NfbGlua19wb2xpY3koaGRldiwgb2NmLCBza2IpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCUJUX0RCRygiJXMgQ29tbWFuZCBDb21wbGV0ZWQgT0dGICV4IiwgaGRldi0+bmFtZSwgb2dmKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGVjLT5uY21kKSB7CisJCQlhdG9taWNfc2V0KCZoZGV2LT5jbWRfY250LCAxKTsKKwkJCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZoZGV2LT5jbWRfcSkpCisJCQkJaGNpX3NjaGVkX2NtZChoZGV2KTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlrZnJlZV9za2Ioc2tiKTsKKwloZGV2LT5zdGF0LmV2dF9yeCsrOworfQorCisvKiBHZW5lcmF0ZSBpbnRlcm5hbCBzdGFjayBldmVudCAqLwordm9pZCBoY2lfc2lfZXZlbnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGludCB0eXBlLCBpbnQgZGxlbiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaGNpX2V2ZW50X2hkciAqaGRyOworCXN0cnVjdCBoY2lfZXZfc3RhY2tfaW50ZXJuYWwgKmV2OworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBidF9za2JfYWxsb2MoSENJX0VWRU5UX0hEUl9TSVpFICsgc2l6ZW9mKCpldikgKyBkbGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuOworCisJaGRyID0gKHZvaWQgKikgc2tiX3B1dChza2IsIEhDSV9FVkVOVF9IRFJfU0laRSk7CisJaGRyLT5ldnQgID0gSENJX0VWX1NUQUNLX0lOVEVSTkFMOworCWhkci0+cGxlbiA9IHNpemVvZigqZXYpICsgZGxlbjsKKworCWV2ICA9ICh2b2lkICopIHNrYl9wdXQoc2tiLCBzaXplb2YoKmV2KSArIGRsZW4pOworCWV2LT50eXBlID0gdHlwZTsKKwltZW1jcHkoZXYtPmRhdGEsIGRhdGEsIGRsZW4pOworCisJc2tiLT5wa3RfdHlwZSA9IEhDSV9FVkVOVF9QS1Q7CisJc2tiLT5kZXYgPSAodm9pZCAqKSBoZGV2OworCWhjaV9zZW5kX3RvX3NvY2soaGRldiwgc2tiKTsKKwlrZnJlZV9za2Ioc2tiKTsKK30KK0VYUE9SVF9TWU1CT0woaGNpX3NpX2V2ZW50KTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX3NvY2suYyBiL25ldC9ibHVldG9vdGgvaGNpX3NvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTc5MmJhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfc29jay5jCkBAIC0wLDAgKzEsNzA3IEBACisvKiAKKyAgIEJsdWVaIC0gQmx1ZXRvb3RoIHByb3RvY29sIHN0YWNrIGZvciBMaW51eAorICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEgUXVhbGNvbW0gSW5jb3Jwb3JhdGVkCisKKyAgIFdyaXR0ZW4gMjAwMCwyMDAxIGJ5IE1heGltIEtyYXNueWFuc2t5IDxtYXhrQHF1YWxjb21tLmNvbT4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBBTkQgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZCisgICBDTEFJTSwgT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUyAKKyAgIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiAKKyAgIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIAorICAgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworICAgQUxMIExJQUJJTElUWSwgSU5DTFVESU5HIExJQUJJTElUWSBGT1IgSU5GUklOR0VNRU5UIE9GIEFOWSBQQVRFTlRTLCAKKyAgIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLCBSRUxBVElORyBUTyBVU0UgT0YgVEhJUyAKKyAgIFNPRlRXQVJFIElTIERJU0NMQUlNRUQuCisqLworCisvKiBCbHVldG9vdGggSENJIHNvY2tldHMuICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KKworI2lmbmRlZiBDT05GSUdfQlRfSENJX1NPQ0tfREVCVUcKKyN1bmRlZiAgQlRfREJHCisjZGVmaW5lIEJUX0RCRyhELi4uKQorI2VuZGlmCisKKy8qIC0tLS0tIEhDSSBzb2NrZXQgaW50ZXJmYWNlIC0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGhjaV90ZXN0X2JpdChpbnQgbnIsIHZvaWQgKmFkZHIpCit7CisJcmV0dXJuICooKF9fdTMyICopIGFkZHIgKyAobnIgPj4gNSkpICYgKChfX3UzMikgMSA8PCAobnIgJiAzMSkpOworfQorCisvKiBTZWN1cml0eSBmaWx0ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgaGNpX3NlY19maWx0ZXIgaGNpX3NlY19maWx0ZXIgPSB7CisJLyogUGFja2V0IHR5cGVzICovCisJMHgxMCwKKwkvKiBFdmVudHMgKi8KKwl7IDB4MTAwMGQ5ZmUsIDB4MDAwMDMwMGMgfSwKKwkvKiBDb21tYW5kcyAqLworCXsKKwkJeyAweDAgfSwKKwkJLyogT0dGX0xJTktfQ1RMICovCisJCXsgMHhiZTAwMDAwNiwgMHgwMDAwMDAwMSwgMHgwMDAwLCAweDAwIH0sCisJCS8qIE9HRl9MSU5LX1BPTElDWSAqLworCQl7IDB4MDAwMDUyMDAsIDB4MDAwMDAwMDAsIDB4MDAwMCwgMHgwMCB9LAorCQkvKiBPR0ZfSE9TVF9DVEwgKi8KKwkJeyAweGFhYjAwMjAwLCAweDJiNDAyYWFhLCAweDAxNTQsIDB4MDAgfSwKKwkJLyogT0dGX0lORk9fUEFSQU0gKi8KKwkJeyAweDAwMDAwMmJlLCAweDAwMDAwMDAwLCAweDAwMDAsIDB4MDAgfSwKKwkJLyogT0dGX1NUQVRVU19QQVJBTSAqLworCQl7IDB4MDAwMDAwZWEsIDB4MDAwMDAwMDAsIDB4MDAwMCwgMHgwMCB9CisJfQorfTsKKworc3RhdGljIHN0cnVjdCBidF9zb2NrX2xpc3QgaGNpX3NrX2xpc3QgPSB7CisJLmxvY2sgPSBSV19MT0NLX1VOTE9DS0VECit9OworCisvKiBTZW5kIGZyYW1lIHRvIFJBVyBzb2NrZXQgKi8KK3ZvaWQgaGNpX3NlbmRfdG9fc29jayhzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisKKwlCVF9EQkcoImhkZXYgJXAgbGVuICVkIiwgaGRldiwgc2tiLT5sZW4pOworCisJcmVhZF9sb2NrKCZoY2lfc2tfbGlzdC5sb2NrKTsKKwlza19mb3JfZWFjaChzaywgbm9kZSwgJmhjaV9za19saXN0LmhlYWQpIHsKKwkJc3RydWN0IGhjaV9maWx0ZXIgKmZsdDsKKwkJc3RydWN0IHNrX2J1ZmYgKm5za2I7CisKKwkJaWYgKHNrLT5za19zdGF0ZSAhPSBCVF9CT1VORCB8fCBoY2lfcGkoc2spLT5oZGV2ICE9IGhkZXYpCisJCQljb250aW51ZTsKKworCQkvKiBEb24ndCBzZW5kIGZyYW1lIHRvIHRoZSBzb2NrZXQgaXQgY2FtZSBmcm9tICovCisJCWlmIChza2ItPnNrID09IHNrKQorCQkJY29udGludWU7CisKKwkJLyogQXBwbHkgZmlsdGVyICovCisJCWZsdCA9ICZoY2lfcGkoc2spLT5maWx0ZXI7CisKKwkJaWYgKCF0ZXN0X2JpdCgoc2tiLT5wa3RfdHlwZSA9PSBIQ0lfVkVORE9SX1BLVCkgPworCQkJCTAgOiAoc2tiLT5wa3RfdHlwZSAmIEhDSV9GTFRfVFlQRV9CSVRTKSwgJmZsdC0+dHlwZV9tYXNrKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChza2ItPnBrdF90eXBlID09IEhDSV9FVkVOVF9QS1QpIHsKKwkJCXJlZ2lzdGVyIGludCBldnQgPSAoKihfX3U4ICopc2tiLT5kYXRhICYgSENJX0ZMVF9FVkVOVF9CSVRTKTsKKworCQkJaWYgKCFoY2lfdGVzdF9iaXQoZXZ0LCAmZmx0LT5ldmVudF9tYXNrKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGZsdC0+b3Bjb2RlICYmICgoZXZ0ID09IEhDSV9FVl9DTURfQ09NUExFVEUgJiYgCisJCQkJCWZsdC0+b3Bjb2RlICE9ICooX191MTYgKikoc2tiLT5kYXRhICsgMykpIHx8CisJCQkJCShldnQgPT0gSENJX0VWX0NNRF9TVEFUVVMgJiYgCisJCQkJCWZsdC0+b3Bjb2RlICE9ICooX191MTYgKikoc2tiLT5kYXRhICsgNCkpKSkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghKG5za2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKSkpCisJCQljb250aW51ZTsKKworCQkvKiBQdXQgdHlwZSBieXRlIGJlZm9yZSB0aGUgZGF0YSAqLworCQltZW1jcHkoc2tiX3B1c2gobnNrYiwgMSksICZuc2tiLT5wa3RfdHlwZSwgMSk7CisKKwkJaWYgKHNvY2tfcXVldWVfcmN2X3NrYihzaywgbnNrYikpCisJCQlrZnJlZV9za2IobnNrYik7CisJfQorCXJlYWRfdW5sb2NrKCZoY2lfc2tfbGlzdC5sb2NrKTsKK30KKworc3RhdGljIGludCBoY2lfc29ja19yZWxlYXNlKHN0cnVjdCBzb2NrZXQgKnNvY2spCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBoY2lfcGkoc2spLT5oZGV2OworCisJQlRfREJHKCJzb2NrICVwIHNrICVwIiwgc29jaywgc2spOworCisJaWYgKCFzaykKKwkJcmV0dXJuIDA7CisKKwlidF9zb2NrX3VubGluaygmaGNpX3NrX2xpc3QsIHNrKTsKKworCWlmIChoZGV2KSB7CisJCWF0b21pY19kZWMoJmhkZXYtPnByb21pc2MpOworCQloY2lfZGV2X3B1dChoZGV2KTsKKwl9CisKKwlzb2NrX29ycGhhbihzayk7CisKKwlza2JfcXVldWVfcHVyZ2UoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwlza2JfcXVldWVfcHVyZ2UoJnNrLT5za193cml0ZV9xdWV1ZSk7CisKKwlzb2NrX3B1dChzayk7CisJcmV0dXJuIDA7Cit9CisKKy8qIElvY3RscyB0aGF0IHJlcXVpcmUgYm91bmQgc29ja2V0ICovIAorc3RhdGljIGlubGluZSBpbnQgaGNpX3NvY2tfYm91bmRfaW9jdGwoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGhjaV9waShzayktPmhkZXY7CisKKwlpZiAoIWhkZXYpCisJCXJldHVybiAtRUJBREZEOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEhDSVNFVFJBVzoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FQUNDRVM7CisKKwkJaWYgKHRlc3RfYml0KEhDSV9RVUlSS19SQVdfREVWSUNFLCAmaGRldi0+cXVpcmtzKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYgKGFyZykKKwkJCXNldF9iaXQoSENJX1JBVywgJmhkZXYtPmZsYWdzKTsKKwkJZWxzZQorCQkJY2xlYXJfYml0KEhDSV9SQVcsICZoZGV2LT5mbGFncyk7CisKKwkJcmV0dXJuIDA7CisKKwljYXNlIEhDSVNFVFNFQ01HUjoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FQUNDRVM7CisKKwkJaWYgKGFyZykKKwkJCXNldF9iaXQoSENJX1NFQ01HUiwgJmhkZXYtPmZsYWdzKTsKKwkJZWxzZQorCQkJY2xlYXJfYml0KEhDSV9TRUNNR1IsICZoZGV2LT5mbGFncyk7CisKKwkJcmV0dXJuIDA7CisKKwljYXNlIEhDSUdFVENPTk5JTkZPOgorCQlyZXR1cm4gaGNpX2dldF9jb25uX2luZm8oaGRldiwgKHZvaWQgX191c2VyICopYXJnKTsKKworCWRlZmF1bHQ6CisJCWlmIChoZGV2LT5pb2N0bCkKKwkJCXJldHVybiBoZGV2LT5pb2N0bChoZGV2LCBjbWQsIGFyZyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludCBoY2lfc29ja19pb2N0bChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgZXJyOworCisJQlRfREJHKCJjbWQgJXggYXJnICVseCIsIGNtZCwgYXJnKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBIQ0lHRVRERVZMSVNUOgorCQlyZXR1cm4gaGNpX2dldF9kZXZfbGlzdChhcmdwKTsKKworCWNhc2UgSENJR0VUREVWSU5GTzoKKwkJcmV0dXJuIGhjaV9nZXRfZGV2X2luZm8oYXJncCk7CisKKwljYXNlIEhDSUdFVENPTk5MSVNUOgorCQlyZXR1cm4gaGNpX2dldF9jb25uX2xpc3QoYXJncCk7CisKKwljYXNlIEhDSURFVlVQOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJcmV0dXJuIGhjaV9kZXZfb3BlbihhcmcpOworCisJY2FzZSBIQ0lERVZET1dOOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJcmV0dXJuIGhjaV9kZXZfY2xvc2UoYXJnKTsKKworCWNhc2UgSENJREVWUkVTRVQ6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQlyZXR1cm4gaGNpX2Rldl9yZXNldChhcmcpOworCisJY2FzZSBIQ0lERVZSRVNUQVQ6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQlyZXR1cm4gaGNpX2Rldl9yZXNldF9zdGF0KGFyZyk7CisKKwljYXNlIEhDSVNFVFNDQU46CisJY2FzZSBIQ0lTRVRBVVRIOgorCWNhc2UgSENJU0VURU5DUllQVDoKKwljYXNlIEhDSVNFVFBUWVBFOgorCWNhc2UgSENJU0VUTElOS1BPTDoKKwljYXNlIEhDSVNFVExJTktNT0RFOgorCWNhc2UgSENJU0VUQUNMTVRVOgorCWNhc2UgSENJU0VUU0NPTVRVOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJcmV0dXJuIGhjaV9kZXZfY21kKGNtZCwgYXJncCk7CisKKwljYXNlIEhDSUlOUVVJUlk6CisJCXJldHVybiBoY2lfaW5xdWlyeShhcmdwKTsKKworCWRlZmF1bHQ6CisJCWxvY2tfc29jayhzayk7CisJCWVyciA9IGhjaV9zb2NrX2JvdW5kX2lvY3RsKHNrLCBjbWQsIGFyZyk7CisJCXJlbGVhc2Vfc29jayhzayk7CisJCXJldHVybiBlcnI7CisJfQorfQorCitzdGF0aWMgaW50IGhjaV9zb2NrX2JpbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgYWRkcl9sZW4pCit7CisJc3RydWN0IHNvY2thZGRyX2hjaSAqaGFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2hjaSAqKSBhZGRyOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gTlVMTDsKKwlpbnQgZXJyID0gMDsKKworCUJUX0RCRygic29jayAlcCBzayAlcCIsIHNvY2ssIHNrKTsKKworCWlmICghaGFkZHIgfHwgaGFkZHItPmhjaV9mYW1pbHkgIT0gQUZfQkxVRVRPT1RIKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxvY2tfc29jayhzayk7CisKKwlpZiAoaGNpX3BpKHNrKS0+aGRldikgeworCQllcnIgPSAtRUFMUkVBRFk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoaGFkZHItPmhjaV9kZXYgIT0gSENJX0RFVl9OT05FKSB7CisJCWlmICghKGhkZXYgPSBoY2lfZGV2X2dldChoYWRkci0+aGNpX2RldikpKSB7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBkb25lOworCQl9CisKKwkJYXRvbWljX2luYygmaGRldi0+cHJvbWlzYyk7CisJfQorCisJaGNpX3BpKHNrKS0+aGRldiA9IGhkZXY7CisJc2stPnNrX3N0YXRlID0gQlRfQk9VTkQ7CisKK2RvbmU6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGhjaV9zb2NrX2dldG5hbWUoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgKmFkZHJfbGVuLCBpbnQgcGVlcikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaGNpICpoYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaGNpICopIGFkZHI7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisKKwlCVF9EQkcoInNvY2sgJXAgc2sgJXAiLCBzb2NrLCBzayk7CisKKwlsb2NrX3NvY2soc2spOworCisJKmFkZHJfbGVuID0gc2l6ZW9mKCpoYWRkcik7CisJaGFkZHItPmhjaV9mYW1pbHkgPSBBRl9CTFVFVE9PVEg7CisJaGFkZHItPmhjaV9kZXYgICAgPSBoY2lfcGkoc2spLT5oZGV2LT5pZDsKKworCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfc29ja19jbXNnKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCV9fdTMyIG1hc2sgPSBoY2lfcGkoc2spLT5jbXNnX21hc2s7CisKKwlpZiAobWFzayAmIEhDSV9DTVNHX0RJUikKKwkJcHV0X2Ntc2cobXNnLCBTT0xfSENJLCBIQ0lfQ01TR19ESVIsIHNpemVvZihpbnQpLCAmYnRfY2Ioc2tiKS0+aW5jb21pbmcpOworCisJaWYgKG1hc2sgJiBIQ0lfQ01TR19UU1RBTVApCisJCXB1dF9jbXNnKG1zZywgU09MX0hDSSwgSENJX0NNU0dfVFNUQU1QLCBzaXplb2Yoc2tiLT5zdGFtcCksICZza2ItPnN0YW1wKTsKK30KKyAKK3N0YXRpYyBpbnQgaGNpX3NvY2tfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIAorCQkJCXN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwgaW50IGZsYWdzKQoreworCWludCBub2Jsb2NrID0gZmxhZ3MgJiBNU0dfRE9OVFdBSVQ7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgY29waWVkLCBlcnI7CisKKwlCVF9EQkcoInNvY2sgJXAsIHNrICVwIiwgc29jaywgc2spOworCisJaWYgKGZsYWdzICYgKE1TR19PT0IpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoc2stPnNrX3N0YXRlID09IEJUX0NMT1NFRCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIShza2IgPSBza2JfcmVjdl9kYXRhZ3JhbShzaywgZmxhZ3MsIG5vYmxvY2ssICZlcnIpKSkKKwkJcmV0dXJuIGVycjsKKworCW1zZy0+bXNnX25hbWVsZW4gPSAwOworCisJY29waWVkID0gc2tiLT5sZW47CisJaWYgKGxlbiA8IGNvcGllZCkgeworCQltc2ctPm1zZ19mbGFncyB8PSBNU0dfVFJVTkM7CisJCWNvcGllZCA9IGxlbjsKKwl9CisKKwlza2ItPmgucmF3ID0gc2tiLT5kYXRhOworCWVyciA9IHNrYl9jb3B5X2RhdGFncmFtX2lvdmVjKHNrYiwgMCwgbXNnLT5tc2dfaW92LCBjb3BpZWQpOworCisJaGNpX3NvY2tfY21zZyhzaywgbXNnLCBza2IpOworCisJc2tiX2ZyZWVfZGF0YWdyYW0oc2ssIHNrYik7CisKKwlyZXR1cm4gZXJyID8gOiBjb3BpZWQ7Cit9CisKK3N0YXRpYyBpbnQgaGNpX3NvY2tfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIAorCQkJICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBlcnI7CisKKwlCVF9EQkcoInNvY2sgJXAgc2sgJXAiLCBzb2NrLCBzayk7CisKKwlpZiAobXNnLT5tc2dfZmxhZ3MgJiBNU0dfT09CKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAobXNnLT5tc2dfZmxhZ3MgJiB+KE1TR19ET05UV0FJVHxNU0dfTk9TSUdOQUx8TVNHX0VSUlFVRVVFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobGVuIDwgNCB8fCBsZW4gPiBIQ0lfTUFYX0ZSQU1FX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJbG9ja19zb2NrKHNrKTsKKworCWlmICghKGhkZXYgPSBoY2lfcGkoc2spLT5oZGV2KSkgeworCQllcnIgPSAtRUJBREZEOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKCEoc2tiID0gYnRfc2tiX3NlbmRfYWxsb2Moc2ssIGxlbiwgbXNnLT5tc2dfZmxhZ3MgJiBNU0dfRE9OVFdBSVQsICZlcnIpKSkKKwkJZ290byBkb25lOworCisJaWYgKG1lbWNweV9mcm9taW92ZWMoc2tiX3B1dChza2IsIGxlbiksIG1zZy0+bXNnX2lvdiwgbGVuKSkgeworCQllcnIgPSAtRUZBVUxUOworCQlnb3RvIGRyb3A7CisJfQorCisJc2tiLT5wa3RfdHlwZSA9ICooKHVuc2lnbmVkIGNoYXIgKikgc2tiLT5kYXRhKTsKKwlza2JfcHVsbChza2IsIDEpOworCXNrYi0+ZGV2ID0gKHZvaWQgKikgaGRldjsKKworCWlmIChza2ItPnBrdF90eXBlID09IEhDSV9DT01NQU5EX1BLVCkgeworCQl1MTYgb3Bjb2RlID0gX19sZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKCh1MTYgKilza2ItPmRhdGEpKTsKKwkJdTE2IG9nZiA9IGhjaV9vcGNvZGVfb2dmKG9wY29kZSk7CisJCXUxNiBvY2YgPSBoY2lfb3Bjb2RlX29jZihvcGNvZGUpOworCisJCWlmICgoKG9nZiA+IEhDSV9TRkxUX01BWF9PR0YpIHx8CisJCQkJIWhjaV90ZXN0X2JpdChvY2YgJiBIQ0lfRkxUX09DRl9CSVRTLCAmaGNpX3NlY19maWx0ZXIub2NmX21hc2tbb2dmXSkpICYmCisJCQkJCSFjYXBhYmxlKENBUF9ORVRfUkFXKSkgeworCQkJZXJyID0gLUVQRVJNOworCQkJZ290byBkcm9wOworCQl9CisKKwkJaWYgKHRlc3RfYml0KEhDSV9SQVcsICZoZGV2LT5mbGFncykgfHwgKG9nZiA9PSBPR0ZfVkVORE9SX0NNRCkpIHsKKwkJCXNrYl9xdWV1ZV90YWlsKCZoZGV2LT5yYXdfcSwgc2tiKTsKKwkJCWhjaV9zY2hlZF90eChoZGV2KTsKKwkJfSBlbHNlIHsKKwkJCXNrYl9xdWV1ZV90YWlsKCZoZGV2LT5jbWRfcSwgc2tiKTsKKwkJCWhjaV9zY2hlZF9jbWQoaGRldik7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9SQVcpKSB7CisJCQllcnIgPSAtRVBFUk07CisJCQlnb3RvIGRyb3A7CisJCX0KKworCQlza2JfcXVldWVfdGFpbCgmaGRldi0+cmF3X3EsIHNrYik7CisJCWhjaV9zY2hlZF90eChoZGV2KTsKKwl9CisKKwllcnIgPSBsZW47CisKK2RvbmU6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworCitkcm9wOgorCWtmcmVlX3NrYihza2IpOworCWdvdG8gZG9uZTsKK30KKworc3RhdGljIGludCBoY2lfc29ja19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBsZW4pCit7CisJc3RydWN0IGhjaV91ZmlsdGVyIHVmID0geyAub3Bjb2RlID0gMCB9OworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCBlcnIgPSAwLCBvcHQgPSAwOworCisJQlRfREJHKCJzayAlcCwgb3B0ICVkIiwgc2ssIG9wdG5hbWUpOworCisJbG9ja19zb2NrKHNrKTsKKworCXN3aXRjaCAob3B0bmFtZSkgeworCWNhc2UgSENJX0RBVEFfRElSOgorCQlpZiAoZ2V0X3VzZXIob3B0LCAoaW50IF9fdXNlciAqKW9wdHZhbCkpIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChvcHQpCisJCQloY2lfcGkoc2spLT5jbXNnX21hc2sgfD0gSENJX0NNU0dfRElSOworCQllbHNlCisJCQloY2lfcGkoc2spLT5jbXNnX21hc2sgJj0gfkhDSV9DTVNHX0RJUjsKKwkJYnJlYWs7CisKKwljYXNlIEhDSV9USU1FX1NUQU1QOgorCQlpZiAoZ2V0X3VzZXIob3B0LCAoaW50IF9fdXNlciAqKW9wdHZhbCkpIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChvcHQpCisJCQloY2lfcGkoc2spLT5jbXNnX21hc2sgfD0gSENJX0NNU0dfVFNUQU1QOworCQllbHNlCisJCQloY2lfcGkoc2spLT5jbXNnX21hc2sgJj0gfkhDSV9DTVNHX1RTVEFNUDsKKwkJYnJlYWs7CisKKwljYXNlIEhDSV9GSUxURVI6CisJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuLCBzaXplb2YodWYpKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ1Ziwgb3B0dmFsLCBsZW4pKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9SQVcpKSB7CisJCQl1Zi50eXBlX21hc2sgJj0gaGNpX3NlY19maWx0ZXIudHlwZV9tYXNrOworCQkJdWYuZXZlbnRfbWFza1swXSAmPSAqKCh1MzIgKikgaGNpX3NlY19maWx0ZXIuZXZlbnRfbWFzayArIDApOworCQkJdWYuZXZlbnRfbWFza1sxXSAmPSAqKCh1MzIgKikgaGNpX3NlY19maWx0ZXIuZXZlbnRfbWFzayArIDEpOworCQl9CisKKwkJeworCQkJc3RydWN0IGhjaV9maWx0ZXIgKmYgPSAmaGNpX3BpKHNrKS0+ZmlsdGVyOworCisJCQlmLT50eXBlX21hc2sgPSB1Zi50eXBlX21hc2s7CisJCQlmLT5vcGNvZGUgICAgPSB1Zi5vcGNvZGU7CisJCQkqKCh1MzIgKikgZi0+ZXZlbnRfbWFzayArIDApID0gdWYuZXZlbnRfbWFza1swXTsKKwkJCSooKHUzMiAqKSBmLT5ldmVudF9tYXNrICsgMSkgPSB1Zi5ldmVudF9tYXNrWzFdOworCQl9CisJCWJyZWFrOyAKKworCWRlZmF1bHQ6CisJCWVyciA9IC1FTk9QUk9UT09QVDsKKwkJYnJlYWs7CisJfQorCisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGhjaV9zb2NrX2dldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQoreworCXN0cnVjdCBoY2lfdWZpbHRlciB1ZjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlpbnQgbGVuLCBvcHQ7IAorCisJaWYgKGdldF91c2VyKGxlbiwgb3B0bGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2ggKG9wdG5hbWUpIHsKKwljYXNlIEhDSV9EQVRBX0RJUjoKKwkJaWYgKGhjaV9waShzayktPmNtc2dfbWFzayAmIEhDSV9DTVNHX0RJUikKKwkJCW9wdCA9IDE7CisJCWVsc2UgCisJCQlvcHQgPSAwOworCisJCWlmIChwdXRfdXNlcihvcHQsIG9wdHZhbCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisKKwljYXNlIEhDSV9USU1FX1NUQU1QOgorCQlpZiAoaGNpX3BpKHNrKS0+Y21zZ19tYXNrICYgSENJX0NNU0dfVFNUQU1QKQorCQkJb3B0ID0gMTsKKwkJZWxzZSAKKwkJCW9wdCA9IDA7CisKKwkJaWYgKHB1dF91c2VyKG9wdCwgb3B0dmFsKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKworCWNhc2UgSENJX0ZJTFRFUjoKKwkJeworCQkJc3RydWN0IGhjaV9maWx0ZXIgKmYgPSAmaGNpX3BpKHNrKS0+ZmlsdGVyOworCisJCQl1Zi50eXBlX21hc2sgPSBmLT50eXBlX21hc2s7CisJCQl1Zi5vcGNvZGUgICAgPSBmLT5vcGNvZGU7CisJCQl1Zi5ldmVudF9tYXNrWzBdID0gKigodTMyICopIGYtPmV2ZW50X21hc2sgKyAwKTsKKwkJCXVmLmV2ZW50X21hc2tbMV0gPSAqKCh1MzIgKikgZi0+ZXZlbnRfbWFzayArIDEpOworCQl9CisKKwkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sIHNpemVvZih1ZikpOworCQlpZiAoY29weV90b191c2VyKG9wdHZhbCwgJnVmLCBsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9QUk9UT09QVDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIGhjaV9zb2NrX29wcyA9IHsKKwkuZmFtaWx5CQk9IFBGX0JMVUVUT09USCwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnJlbGVhc2UJPSBoY2lfc29ja19yZWxlYXNlLAorCS5iaW5kCQk9IGhjaV9zb2NrX2JpbmQsCisJLmdldG5hbWUJPSBoY2lfc29ja19nZXRuYW1lLAorCS5zZW5kbXNnCT0gaGNpX3NvY2tfc2VuZG1zZywKKwkucmVjdm1zZwk9IGhjaV9zb2NrX3JlY3Ztc2csCisJLmlvY3RsCQk9IGhjaV9zb2NrX2lvY3RsLAorCS5wb2xsCQk9IGRhdGFncmFtX3BvbGwsCisJLmxpc3RlbgkJPSBzb2NrX25vX2xpc3RlbiwKKwkuc2h1dGRvd24JPSBzb2NrX25vX3NodXRkb3duLAorCS5zZXRzb2Nrb3B0CT0gaGNpX3NvY2tfc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdAk9IGhjaV9zb2NrX2dldHNvY2tvcHQsCisJLmNvbm5lY3QJPSBzb2NrX25vX2Nvbm5lY3QsCisJLnNvY2tldHBhaXIJPSBzb2NrX25vX3NvY2tldHBhaXIsCisJLmFjY2VwdAkJPSBzb2NrX25vX2FjY2VwdCwKKwkubW1hcAkJPSBzb2NrX25vX21tYXAKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG8gaGNpX3NrX3Byb3RvID0geworCS5uYW1lCQk9ICJIQ0kiLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub2JqX3NpemUJPSBzaXplb2Yoc3RydWN0IGhjaV9waW5mbykKK307CisKK3N0YXRpYyBpbnQgaGNpX3NvY2tfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlCVF9EQkcoInNvY2sgJXAiLCBzb2NrKTsKKworCWlmIChzb2NrLT50eXBlICE9IFNPQ0tfUkFXKQorCQlyZXR1cm4gLUVTT0NLVE5PU1VQUE9SVDsKKworCXNvY2stPm9wcyA9ICZoY2lfc29ja19vcHM7CisKKwlzayA9IHNrX2FsbG9jKFBGX0JMVUVUT09USCwgR0ZQX0tFUk5FTCwgJmhjaV9za19wcm90bywgMSk7CisJaWYgKCFzaykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CisKKwlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKworCXNrLT5za19wcm90b2NvbCA9IHByb3RvY29sOworCisJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKKwlzay0+c2tfc3RhdGUgPSBCVF9PUEVOOworCisJYnRfc29ja19saW5rKCZoY2lfc2tfbGlzdCwgc2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhjaV9zb2NrX2Rldl9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IChzdHJ1Y3QgaGNpX2RldiAqKSBwdHI7CisJc3RydWN0IGhjaV9ldl9zaV9kZXZpY2UgZXY7CisKKwlCVF9EQkcoImhkZXYgJXMgZXZlbnQgJWxkIiwgaGRldi0+bmFtZSwgZXZlbnQpOworCisJLyogU2VuZCBldmVudCB0byBzb2NrZXRzICovCisJZXYuZXZlbnQgID0gZXZlbnQ7CisJZXYuZGV2X2lkID0gaGRldi0+aWQ7CisJaGNpX3NpX2V2ZW50KE5VTEwsIEhDSV9FVl9TSV9ERVZJQ0UsIHNpemVvZihldiksICZldik7CisKKwlpZiAoZXZlbnQgPT0gSENJX0RFVl9VTlJFRykgeworCQlzdHJ1Y3Qgc29jayAqc2s7CisJCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJCS8qIERldGFjaCBzb2NrZXRzIGZyb20gZGV2aWNlICovCisJCXJlYWRfbG9jaygmaGNpX3NrX2xpc3QubG9jayk7CisJCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmaGNpX3NrX2xpc3QuaGVhZCkgeworCQkJYmhfbG9ja19zb2NrKHNrKTsKKwkJCWlmIChoY2lfcGkoc2spLT5oZGV2ID09IGhkZXYpIHsKKwkJCQloY2lfcGkoc2spLT5oZGV2ID0gTlVMTDsKKwkJCQlzay0+c2tfZXJyID0gRVBJUEU7CisJCQkJc2stPnNrX3N0YXRlID0gQlRfT1BFTjsKKwkJCQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKKworCQkJCWhjaV9kZXZfcHV0KGhkZXYpOworCQkJfQorCQkJYmhfdW5sb2NrX3NvY2soc2spOworCQl9CisJCXJlYWRfdW5sb2NrKCZoY2lfc2tfbGlzdC5sb2NrKTsKKwl9CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSBoY2lfc29ja19mYW1pbHlfb3BzID0geworCS5mYW1pbHkJPSBQRl9CTFVFVE9PVEgsCisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmNyZWF0ZQk9IGhjaV9zb2NrX2NyZWF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaGNpX3NvY2tfbmJsb2NrID0geworCS5ub3RpZmllcl9jYWxsID0gaGNpX3NvY2tfZGV2X2V2ZW50Cit9OworCitpbnQgX19pbml0IGhjaV9zb2NrX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcHJvdG9fcmVnaXN0ZXIoJmhjaV9za19wcm90bywgMCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBidF9zb2NrX3JlZ2lzdGVyKEJUUFJPVE9fSENJLCAmaGNpX3NvY2tfZmFtaWx5X29wcyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CisKKwloY2lfcmVnaXN0ZXJfbm90aWZpZXIoJmhjaV9zb2NrX25ibG9jayk7CisKKwlCVF9JTkZPKCJIQ0kgc29ja2V0IGxheWVyIGluaXRpYWxpemVkIik7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJQlRfRVJSKCJIQ0kgc29ja2V0IHJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKKwlwcm90b191bnJlZ2lzdGVyKCZoY2lfc2tfcHJvdG8pOworCXJldHVybiBlcnI7Cit9CisKK2ludCBfX2V4aXQgaGNpX3NvY2tfY2xlYW51cCh2b2lkKQoreworCWlmIChidF9zb2NrX3VucmVnaXN0ZXIoQlRQUk9UT19IQ0kpIDwgMCkKKwkJQlRfRVJSKCJIQ0kgc29ja2V0IHVucmVnaXN0cmF0aW9uIGZhaWxlZCIpOworCisJaGNpX3VucmVnaXN0ZXJfbm90aWZpZXIoJmhjaV9zb2NrX25ibG9jayk7CisKKwlwcm90b191bnJlZ2lzdGVyKCZoY2lfc2tfcHJvdG8pOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9zeXNmcy5jIGIvbmV0L2JsdWV0b290aC9oY2lfc3lzZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODU2YmMyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfc3lzZnMuYwpAQCAtMCwwICsxLDE1MyBAQAorLyogQmx1ZXRvb3RoIEhDSSBkcml2ZXIgbW9kZWwgc3VwcG9ydC4gKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgorCisjaWZuZGVmIENPTkZJR19CVF9IQ0lfQ09SRV9ERUJVRworI3VuZGVmICBCVF9EQkcKKyNkZWZpbmUgQlRfREJHKEQuLi4pCisjZW5kaWYKKworc3RhdGljIHNzaXplX3Qgc2hvd19uYW1lKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGNsYXNzX2dldF9kZXZkYXRhKGNkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBoZGV2LT5uYW1lKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd190eXBlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGNsYXNzX2dldF9kZXZkYXRhKGNkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBoZGV2LT50eXBlKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19hZGRyZXNzKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGNsYXNzX2dldF9kZXZkYXRhKGNkZXYpOworCWJkYWRkcl90IGJkYWRkcjsKKwliYXN3YXAoJmJkYWRkciwgJmhkZXYtPmJkYWRkcik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGJhdG9zdHIoJmJkYWRkcikpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2ZsYWdzKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGNsYXNzX2dldF9kZXZkYXRhKGNkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JWx4XG4iLCBoZGV2LT5mbGFncyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW5xdWlyeV9jYWNoZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBjbGFzc19nZXRfZGV2ZGF0YShjZGV2KTsKKwlzdHJ1Y3QgaW5xdWlyeV9jYWNoZSAqY2FjaGUgPSAmaGRldi0+aW5xX2NhY2hlOworCXN0cnVjdCBpbnF1aXJ5X2VudHJ5ICplOworCWludCBuID0gMDsKKworCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKKworCWZvciAoZSA9IGNhY2hlLT5saXN0OyBlOyBlID0gZS0+bmV4dCkgeworCQlzdHJ1Y3QgaW5xdWlyeV9kYXRhICpkYXRhID0gJmUtPmRhdGE7CisJCWJkYWRkcl90IGJkYWRkcjsKKwkJYmFzd2FwKCZiZGFkZHIsICZkYXRhLT5iZGFkZHIpOworCQluICs9IHNwcmludGYoYnVmICsgbiwgIiVzICVkICVkICVkIDB4JS4yeCUuMnglLjJ4IDB4JS40eCAlZCAldVxuIiwKKwkJCQliYXRvc3RyKCZiZGFkZHIpLAorCQkJCWRhdGEtPnBzY2FuX3JlcF9tb2RlLCBkYXRhLT5wc2Nhbl9wZXJpb2RfbW9kZSwgZGF0YS0+cHNjYW5fbW9kZSwKKwkJCQlkYXRhLT5kZXZfY2xhc3NbMl0sIGRhdGEtPmRldl9jbGFzc1sxXSwgZGF0YS0+ZGV2X2NsYXNzWzBdLAorCQkJCV9fbGUxNl90b19jcHUoZGF0YS0+Y2xvY2tfb2Zmc2V0KSwgZGF0YS0+cnNzaSwgZS0+dGltZXN0YW1wKTsKKwl9CisKKwloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIHNob3dfbmFtZSwgTlVMTCk7CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIodHlwZSwgU19JUlVHTywgc2hvd190eXBlLCBOVUxMKTsKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihhZGRyZXNzLCBTX0lSVUdPLCBzaG93X2FkZHJlc3MsIE5VTEwpOworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGZsYWdzLCBTX0lSVUdPLCBzaG93X2ZsYWdzLCBOVUxMKTsKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihpbnF1aXJ5X2NhY2hlLCBTX0lSVUdPLCBzaG93X2lucXVpcnlfY2FjaGUsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKmJ0X2F0dHJzW10gPSB7CisJJmNsYXNzX2RldmljZV9hdHRyX25hbWUsCisJJmNsYXNzX2RldmljZV9hdHRyX3R5cGUsCisJJmNsYXNzX2RldmljZV9hdHRyX2FkZHJlc3MsCisJJmNsYXNzX2RldmljZV9hdHRyX2ZsYWdzLAorCSZjbGFzc19kZXZpY2VfYXR0cl9pbnF1aXJ5X2NhY2hlLAorCU5VTEwKK307CisKKyNpZmRlZiBDT05GSUdfSE9UUExVRworc3RhdGljIGludCBidF9ob3RwbHVnKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKiplbnZwLCBpbnQgbnVtX2VudnAsIGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBjbGFzc19nZXRfZGV2ZGF0YShjZGV2KTsKKwlpbnQgbiwgaSA9IDA7CisKKwllbnZwW2krK10gPSBidWY7CisJbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZSwgIklOVEVSRkFDRT0lcyIsIGhkZXYtPm5hbWUpICsgMTsKKwlidWYgKz0gbjsKKwlzaXplIC09IG47CisKKwlpZiAoKHNpemUgPD0gMCkgfHwgKGkgPj0gbnVtX2VudnApKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVudnBbaV0gPSBOVUxMOworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGJ0X3JlbGVhc2Uoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldikKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGNsYXNzX2dldF9kZXZkYXRhKGNkZXYpOworCisJa2ZyZWUoaGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgYnRfY2xhc3MgPSB7CisJLm5hbWUJCT0gImJsdWV0b290aCIsCisJLnJlbGVhc2UJPSBidF9yZWxlYXNlLAorI2lmZGVmIENPTkZJR19IT1RQTFVHCisJLmhvdHBsdWcJPSBidF9ob3RwbHVnLAorI2VuZGlmCit9OworCitpbnQgaGNpX3JlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYgPSAmaGRldi0+Y2xhc3NfZGV2OworCXVuc2lnbmVkIGludCBpOworCWludCBlcnI7CisKKwlCVF9EQkcoIiVwIG5hbWUgJXMgdHlwZSAlZCIsIGhkZXYsIGhkZXYtPm5hbWUsIGhkZXYtPnR5cGUpOworCisJY2Rldi0+Y2xhc3MgPSAmYnRfY2xhc3M7CisJY2xhc3Nfc2V0X2RldmRhdGEoY2RldiwgaGRldik7CisKKwlzdHJsY3B5KGNkZXYtPmNsYXNzX2lkLCBoZGV2LT5uYW1lLCBCVVNfSURfU0laRSk7CisJZXJyID0gY2xhc3NfZGV2aWNlX3JlZ2lzdGVyKGNkZXYpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZm9yIChpID0gMDsgYnRfYXR0cnNbaV07IGkrKykKKwkJY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGNkZXYsIGJ0X2F0dHJzW2ldKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGhjaV91bnJlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXN0cnVjdCBjbGFzc19kZXZpY2UgKiBjZGV2ID0gJmhkZXYtPmNsYXNzX2RldjsKKworCUJUX0RCRygiJXAgbmFtZSAlcyB0eXBlICVkIiwgaGRldiwgaGRldi0+bmFtZSwgaGRldi0+dHlwZSk7CisKKwljbGFzc19kZXZpY2VfZGVsKGNkZXYpOworfQorCitpbnQgX19pbml0IGJ0X3N5c2ZzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gY2xhc3NfcmVnaXN0ZXIoJmJ0X2NsYXNzKTsKK30KKwordm9pZCBfX2V4aXQgYnRfc3lzZnNfY2xlYW51cCh2b2lkKQoreworCWNsYXNzX3VucmVnaXN0ZXIoJmJ0X2NsYXNzKTsKK30KZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGlkcC9LY29uZmlnIGIvbmV0L2JsdWV0b290aC9oaWRwL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU5NThmNwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9ibHVldG9vdGgvaGlkcC9LY29uZmlnCkBAIC0wLDAgKzEsMTIgQEAKK2NvbmZpZyBCVF9ISURQCisJdHJpc3RhdGUgIkhJRFAgcHJvdG9jb2wgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJUICYmIEJUX0wyQ0FQCisJc2VsZWN0IElOUFVUCisJaGVscAorCSAgSElEUCAoSHVtYW4gSW50ZXJmYWNlIERldmljZSBQcm90b2NvbCkgaXMgYSB0cmFuc3BvcnQgbGF5ZXIKKwkgIGZvciBISUQgcmVwb3J0cy4gIEhJRFAgaXMgcmVxdWlyZWQgZm9yIHRoZSBCbHVldG9vdGggSHVtYW4KKwkgIEludGVyZmFjZSBEZXZpY2UgUHJvZmlsZS4KKworCSAgU2F5IFkgaGVyZSB0byBjb21waWxlIEhJRFAgc3VwcG9ydCBpbnRvIHRoZSBrZXJuZWwgb3Igc2F5IE0gdG8KKwkgIGNvbXBpbGUgaXQgYXMgbW9kdWxlIChoaWRwKS4KKwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oaWRwL01ha2VmaWxlIGIvbmV0L2JsdWV0b290aC9oaWRwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZWUxMTUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYmx1ZXRvb3RoL2hpZHAvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggQmx1ZXRvb3RoIEhJRFAgbGF5ZXIKKyMKKworb2JqLSQoQ09ORklHX0JUX0hJRFApICs9IGhpZHAubworCitoaWRwLW9ianMgOj0gY29yZS5vIHNvY2subwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oaWRwL2NvcmUuYyBiL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNmOThjZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMKQEAgLTAsMCArMSw3NzIgQEAKKy8qIAorICAgSElEUCBpbXBsZW1lbnRhdGlvbiBmb3IgTGludXggQmx1ZXRvb3RoIHN0YWNrIChCbHVlWikuCisgICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBNYXJjZWwgSG9sdG1hbm4gPG1hcmNlbEBob2x0bWFubi5vcmc+CisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQgT0YgVEhJUkQgUEFSVFkgUklHSFRTLgorICAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIoUykgQU5EIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWQorICAgQ0xBSU0sIE9SIEFOWSBTUEVDSUFMIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgT1IgQU5ZIERBTUFHRVMgCisgICBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gCisgICBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiAKKyAgIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKyAgIEFMTCBMSUFCSUxJVFksIElOQ0xVRElORyBMSUFCSUxJVFkgRk9SIElORlJJTkdFTUVOVCBPRiBBTlkgUEFURU5UUywgCisgICBDT1BZUklHSFRTLCBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUywgUkVMQVRJTkcgVE8gVVNFIE9GIFRISVMgCisgICBTT0ZUV0FSRSBJUyBESVNDTEFJTUVELgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKworI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9sMmNhcC5oPgorCisjaW5jbHVkZSAiaGlkcC5oIgorCisjaWZuZGVmIENPTkZJR19CVF9ISURQX0RFQlVHCisjdW5kZWYgIEJUX0RCRworI2RlZmluZSBCVF9EQkcoRC4uLikKKyNlbmRpZgorCisjZGVmaW5lIFZFUlNJT04gIjEuMSIKKworc3RhdGljIERFQ0xBUkVfUldTRU0oaGlkcF9zZXNzaW9uX3NlbSk7CitzdGF0aWMgTElTVF9IRUFEKGhpZHBfc2Vzc2lvbl9saXN0KTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgaGlkcF9rZXljb2RlWzI1Nl0gPSB7CisJICAwLCAgMCwgIDAsICAwLCAzMCwgNDgsIDQ2LCAzMiwgMTgsIDMzLCAzNCwgMzUsIDIzLCAzNiwgMzcsIDM4LAorCSA1MCwgNDksIDI0LCAyNSwgMTYsIDE5LCAzMSwgMjAsIDIyLCA0NywgMTcsIDQ1LCAyMSwgNDQsICAyLCAgMywKKwkgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAyOCwgIDEsIDE0LCAxNSwgNTcsIDEyLCAxMywgMjYsCisJIDI3LCA0MywgNDMsIDM5LCA0MCwgNDEsIDUxLCA1MiwgNTMsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0LAorCSA2NSwgNjYsIDY3LCA2OCwgODcsIDg4LCA5OSwgNzAsMTE5LDExMCwxMDIsMTA0LDExMSwxMDcsMTA5LDEwNiwKKwkxMDUsMTA4LDEwMywgNjksIDk4LCA1NSwgNzQsIDc4LCA5NiwgNzksIDgwLCA4MSwgNzUsIDc2LCA3NywgNzEsCisJIDcyLCA3MywgODIsIDgzLCA4NiwxMjcsMTE2LDExNywxODMsMTg0LDE4NSwxODYsMTg3LDE4OCwxODksMTkwLAorCTE5MSwxOTIsMTkzLDE5NCwxMzQsMTM4LDEzMCwxMzIsMTI4LDEyOSwxMzEsMTM3LDEzMywxMzUsMTM2LDExMywKKwkxMTUsMTE0LCAgMCwgIDAsICAwLDEyMSwgIDAsIDg5LCA5MywxMjQsIDkyLCA5NCwgOTUsICAwLCAgMCwgIDAsCisJMTIyLDEyMywgOTAsIDkxLCA4NSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorCSAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKwkgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisJICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorCSAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKwkgMjksIDQyLCA1NiwxMjUsIDk3LCA1NCwxMDAsMTI2LDE2NCwxNjYsMTY1LDE2MywxNjEsMTE1LDExNCwxMTMsCisJMTUwLDE1OCwxNTksMTI4LDEzNiwxNzcsMTc4LDE3NiwxNDIsMTUyLDE3MywxNDAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGhpZHBfbWtleXNwYXRbXSA9IHsgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSB9OworCitzdGF0aWMgc3RydWN0IGhpZHBfc2Vzc2lvbiAqX19oaWRwX2dldF9zZXNzaW9uKGJkYWRkcl90ICpiZGFkZHIpCit7CisJc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCisJQlRfREJHKCIiKTsKKworCWxpc3RfZm9yX2VhY2gocCwgJmhpZHBfc2Vzc2lvbl9saXN0KSB7CisJCXNlc3Npb24gPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBoaWRwX3Nlc3Npb24sIGxpc3QpOworCQlpZiAoIWJhY21wKGJkYWRkciwgJnNlc3Npb24tPmJkYWRkcikpCisJCQlyZXR1cm4gc2Vzc2lvbjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIF9faGlkcF9saW5rX3Nlc3Npb24oc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKwlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCWxpc3RfYWRkKCZzZXNzaW9uLT5saXN0LCAmaGlkcF9zZXNzaW9uX2xpc3QpOworfQorCitzdGF0aWMgdm9pZCBfX2hpZHBfdW5saW5rX3Nlc3Npb24oc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKwlsaXN0X2RlbCgmc2Vzc2lvbi0+bGlzdCk7CisJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faGlkcF9jb3B5X3Nlc3Npb24oc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbiwgc3RydWN0IGhpZHBfY29ubmluZm8gKmNpKQoreworCWJhY3B5KCZjaS0+YmRhZGRyLCAmc2Vzc2lvbi0+YmRhZGRyKTsKKworCWNpLT5mbGFncyA9IHNlc3Npb24tPmZsYWdzOworCWNpLT5zdGF0ZSA9IHNlc3Npb24tPnN0YXRlOworCisJY2ktPnZlbmRvciAgPSAweDAwMDA7CisJY2ktPnByb2R1Y3QgPSAweDAwMDA7CisJY2ktPnZlcnNpb24gPSAweDAwMDA7CisJbWVtc2V0KGNpLT5uYW1lLCAwLCAxMjgpOworCisJaWYgKHNlc3Npb24tPmlucHV0KSB7CisJCWNpLT52ZW5kb3IgID0gc2Vzc2lvbi0+aW5wdXQtPmlkLnZlbmRvcjsKKwkJY2ktPnByb2R1Y3QgPSBzZXNzaW9uLT5pbnB1dC0+aWQucHJvZHVjdDsKKwkJY2ktPnZlcnNpb24gPSBzZXNzaW9uLT5pbnB1dC0+aWQudmVyc2lvbjsKKwkJaWYgKHNlc3Npb24tPmlucHV0LT5uYW1lKQorCQkJc3RybmNweShjaS0+bmFtZSwgc2Vzc2lvbi0+aW5wdXQtPm5hbWUsIDEyOCk7CisJCWVsc2UKKwkJCXN0cm5jcHkoY2ktPm5hbWUsICJISUQgQm9vdCBEZXZpY2UiLCAxMjgpOworCX0KK30KKworc3RhdGljIGludCBoaWRwX2lucHV0X2V2ZW50KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbiA9IGRldi0+cHJpdmF0ZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGNoYXIgbmV3bGVkczsKKworCUJUX0RCRygiaW5wdXQgJXAgdHlwZSAlZCBjb2RlICVkIHZhbHVlICVkIiwgZGV2LCB0eXBlLCBjb2RlLCB2YWx1ZSk7CisKKwlpZiAodHlwZSAhPSBFVl9MRUQpCisJCXJldHVybiAtMTsKKworCW5ld2xlZHMgPSAoISF0ZXN0X2JpdChMRURfS0FOQSwgICAgZGV2LT5sZWQpIDw8IDMpIHwKKwkJICAoISF0ZXN0X2JpdChMRURfQ09NUE9TRSwgZGV2LT5sZWQpIDw8IDMpIHwKKwkJICAoISF0ZXN0X2JpdChMRURfU0NST0xMTCwgZGV2LT5sZWQpIDw8IDIpIHwKKwkJICAoISF0ZXN0X2JpdChMRURfQ0FQU0wsICAgZGV2LT5sZWQpIDw8IDEpIHwKKwkJICAoISF0ZXN0X2JpdChMRURfTlVNTCwgICAgZGV2LT5sZWQpKTsKKworCWlmIChzZXNzaW9uLT5sZWRzID09IG5ld2xlZHMpCisJCXJldHVybiAwOworCisJc2Vzc2lvbi0+bGVkcyA9IG5ld2xlZHM7CisKKwlpZiAoIShza2IgPSBhbGxvY19za2IoMywgR0ZQX0FUT01JQykpKSB7CisJCUJUX0VSUigiQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBuZXcgZnJhbWUiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJKnNrYl9wdXQoc2tiLCAxKSA9IEhJRFBfVFJBTlNfREFUQSB8IEhJRFBfREFUQV9SVFlQRV9PVVBVVDsKKwkqc2tiX3B1dChza2IsIDEpID0gMHgwMTsKKwkqc2tiX3B1dChza2IsIDEpID0gbmV3bGVkczsKKworCXNrYl9xdWV1ZV90YWlsKCZzZXNzaW9uLT5pbnRyX3RyYW5zbWl0LCBza2IpOworCisJaGlkcF9zY2hlZHVsZShzZXNzaW9uKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoaWRwX2lucHV0X3JlcG9ydChzdHJ1Y3QgaGlkcF9zZXNzaW9uICpzZXNzaW9uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IHNlc3Npb24tPmlucHV0OworCXVuc2lnbmVkIGNoYXIgKmtleXMgPSBzZXNzaW9uLT5rZXlzOworCXVuc2lnbmVkIGNoYXIgKnVkYXRhID0gc2tiLT5kYXRhICsgMTsKKwlzaWduZWQgY2hhciAqc2RhdGEgPSBza2ItPmRhdGEgKyAxOworCWludCBpLCBzaXplID0gc2tiLT5sZW4gLSAxOworCisJc3dpdGNoIChza2ItPmRhdGFbMF0pIHsKKwljYXNlIDB4MDE6CS8qIEtleWJvYXJkIHJlcG9ydCAqLworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIGhpZHBfa2V5Y29kZVtpICsgMjI0XSwgKHVkYXRhWzBdID4+IGkpICYgMSk7CisKKwkJLyogSWYgYWxsIHRoZSBrZXkgY29kZXMgaGF2ZSBiZWVuIHNldCB0byAweDAxLCBpdCBtZWFucworCQkgKiB0b28gbWFueSBrZXlzIHdlcmUgcHJlc3NlZCBhdCB0aGUgc2FtZSB0aW1lLiAqLworCQlpZiAoIW1lbWNtcCh1ZGF0YSArIDIsIGhpZHBfbWtleXNwYXQsIDYpKQorCQkJYnJlYWs7CisKKwkJZm9yIChpID0gMjsgaSA8IDg7IGkrKykgeworCQkJaWYgKGtleXNbaV0gPiAzICYmIG1lbXNjYW4odWRhdGEgKyAyLCBrZXlzW2ldLCA2KSA9PSB1ZGF0YSArIDgpIHsKKwkJCQlpZiAoaGlkcF9rZXljb2RlW2tleXNbaV1dKQorCQkJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgaGlkcF9rZXljb2RlW2tleXNbaV1dLCAwKTsKKwkJCQllbHNlCisJCQkJCUJUX0VSUigiVW5rbm93biBrZXkgKHNjYW5jb2RlICUjeCkgcmVsZWFzZWQuIiwga2V5c1tpXSk7CisJCQl9CisKKwkJCWlmICh1ZGF0YVtpXSA+IDMgJiYgbWVtc2NhbihrZXlzICsgMiwgdWRhdGFbaV0sIDYpID09IGtleXMgKyA4KSB7CisJCQkJaWYgKGhpZHBfa2V5Y29kZVt1ZGF0YVtpXV0pCisJCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBoaWRwX2tleWNvZGVbdWRhdGFbaV1dLCAxKTsKKwkJCQllbHNlCisJCQkJCUJUX0VSUigiVW5rbm93biBrZXkgKHNjYW5jb2RlICUjeCkgcHJlc3NlZC4iLCB1ZGF0YVtpXSk7CisJCQl9CisJCX0KKworCQltZW1jcHkoa2V5cywgdWRhdGEsIDgpOworCQlicmVhazsKKworCWNhc2UgMHgwMjoJLyogTW91c2UgcmVwb3J0ICovCisJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTEVGVCwgICBzZGF0YVswXSAmIDB4MDEpOworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1JJR0hULCAgc2RhdGFbMF0gJiAweDAyKTsKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9NSURETEUsIHNkYXRhWzBdICYgMHgwNCk7CisJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fU0lERSwgICBzZGF0YVswXSAmIDB4MDgpOworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0VYVFJBLCAgc2RhdGFbMF0gJiAweDEwKTsKKworCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1gsIHNkYXRhWzFdKTsKKwkJaW5wdXRfcmVwb3J0X3JlbChkZXYsIFJFTF9ZLCBzZGF0YVsyXSk7CisKKwkJaWYgKHNpemUgPiAzKQorCQkJaW5wdXRfcmVwb3J0X3JlbChkZXYsIFJFTF9XSEVFTCwgc2RhdGFbM10pOworCQlicmVhazsKKwl9CisKKwlpbnB1dF9zeW5jKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGhpZHBfaWRsZV90aW1lb3V0KHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24gPSAoc3RydWN0IGhpZHBfc2Vzc2lvbiAqKSBhcmc7CisKKwlhdG9taWNfaW5jKCZzZXNzaW9uLT50ZXJtaW5hdGUpOworCWhpZHBfc2NoZWR1bGUoc2Vzc2lvbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWRwX3NldF90aW1lcihzdHJ1Y3QgaGlkcF9zZXNzaW9uICpzZXNzaW9uKQoreworCWlmIChzZXNzaW9uLT5pZGxlX3RvID4gMCkKKwkJbW9kX3RpbWVyKCZzZXNzaW9uLT50aW1lciwgamlmZmllcyArIEhaICogc2Vzc2lvbi0+aWRsZV90byk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWRwX2RlbF90aW1lcihzdHJ1Y3QgaGlkcF9zZXNzaW9uICpzZXNzaW9uKQoreworCWlmIChzZXNzaW9uLT5pZGxlX3RvID4gMCkKKwkJZGVsX3RpbWVyKCZzZXNzaW9uLT50aW1lcik7Cit9CisKK3N0YXRpYyBpbnQgX19oaWRwX3NlbmRfY3RybF9tZXNzYWdlKHN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24sCisJCQl1bnNpZ25lZCBjaGFyIGhkciwgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IHNpemUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCUJUX0RCRygic2Vzc2lvbiAlcCBkYXRhICVwIHNpemUgJWQiLCBzZXNzaW9uLCBkYXRhLCBzaXplKTsKKworCWlmICghKHNrYiA9IGFsbG9jX3NrYihzaXplICsgMSwgR0ZQX0FUT01JQykpKSB7CisJCUJUX0VSUigiQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBuZXcgZnJhbWUiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJKnNrYl9wdXQoc2tiLCAxKSA9IGhkcjsKKwlpZiAoZGF0YSAmJiBzaXplID4gMCkKKwkJbWVtY3B5KHNrYl9wdXQoc2tiLCBzaXplKSwgZGF0YSwgc2l6ZSk7CisKKwlza2JfcXVldWVfdGFpbCgmc2Vzc2lvbi0+Y3RybF90cmFuc21pdCwgc2tiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlubGluZSBoaWRwX3NlbmRfY3RybF9tZXNzYWdlKHN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24sCisJCQl1bnNpZ25lZCBjaGFyIGhkciwgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IHNpemUpCit7CisJaW50IGVycjsKKworCWVyciA9IF9faGlkcF9zZW5kX2N0cmxfbWVzc2FnZShzZXNzaW9uLCBoZHIsIGRhdGEsIHNpemUpOworCisJaGlkcF9zY2hlZHVsZShzZXNzaW9uKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWRwX3Byb2Nlc3NfaGFuZHNoYWtlKHN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24sIHVuc2lnbmVkIGNoYXIgcGFyYW0pCit7CisJQlRfREJHKCJzZXNzaW9uICVwIHBhcmFtIDB4JTAyeCIsIHNlc3Npb24sIHBhcmFtKTsKKworCXN3aXRjaCAocGFyYW0pIHsKKwljYXNlIEhJRFBfSFNIS19TVUNDRVNTRlVMOgorCQkvKiBGSVhNRTogQ2FsbCBpbnRvIFNFVF8gR0VUXyBoYW5kbGVycyBoZXJlICovCisJCWJyZWFrOworCisJY2FzZSBISURQX0hTSEtfTk9UX1JFQURZOgorCWNhc2UgSElEUF9IU0hLX0VSUl9JTlZBTElEX1JFUE9SVF9JRDoKKwljYXNlIEhJRFBfSFNIS19FUlJfVU5TVVBQT1JURURfUkVRVUVTVDoKKwljYXNlIEhJRFBfSFNIS19FUlJfSU5WQUxJRF9QQVJBTUVURVI6CisJCS8qIEZJWE1FOiBDYWxsIGludG8gU0VUXyBHRVRfIGhhbmRsZXJzIGhlcmUgKi8KKwkJYnJlYWs7CisKKwljYXNlIEhJRFBfSFNIS19FUlJfVU5LTk9XTjoKKwkJYnJlYWs7CisKKwljYXNlIEhJRFBfSFNIS19FUlJfRkFUQUw6CisJCS8qIERldmljZSByZXF1ZXN0cyBhIHJlYm9vdCwgYXMgdGhpcyBpcyB0aGUgb25seSB3YXkgdGhpcyBlcnJvcgorIAkJICogY2FuIGJlIHJlY292ZXJlZC4gKi8KKwkJX19oaWRwX3NlbmRfY3RybF9tZXNzYWdlKHNlc3Npb24sCisJCQlISURQX1RSQU5TX0hJRF9DT05UUk9MIHwgSElEUF9DVFJMX1NPRlRfUkVTRVQsIE5VTEwsIDApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCV9faGlkcF9zZW5kX2N0cmxfbWVzc2FnZShzZXNzaW9uLAorCQkJSElEUF9UUkFOU19IQU5EU0hBS0UgfCBISURQX0hTSEtfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCBOVUxMLCAwKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGlkcF9wcm9jZXNzX2hpZF9jb250cm9sKHN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24sIHVuc2lnbmVkIGNoYXIgcGFyYW0pCit7CisJQlRfREJHKCJzZXNzaW9uICVwIHBhcmFtIDB4JTAyeCIsIHNlc3Npb24sIHBhcmFtKTsKKworCXN3aXRjaCAocGFyYW0pIHsKKwljYXNlIEhJRFBfQ1RSTF9OT1A6CisJCWJyZWFrOworCisJY2FzZSBISURQX0NUUkxfVklSVFVBTF9DQUJMRV9VTlBMVUc6CisJCS8qIEZsdXNoIHRoZSB0cmFuc21pdCBxdWV1ZXMgKi8KKwkJc2tiX3F1ZXVlX3B1cmdlKCZzZXNzaW9uLT5jdHJsX3RyYW5zbWl0KTsKKwkJc2tiX3F1ZXVlX3B1cmdlKCZzZXNzaW9uLT5pbnRyX3RyYW5zbWl0KTsKKworCQkvKiBLaWxsIHNlc3Npb24gdGhyZWFkICovCisJCWF0b21pY19pbmMoJnNlc3Npb24tPnRlcm1pbmF0ZSk7CisJCWJyZWFrOworCisJY2FzZSBISURQX0NUUkxfSEFSRF9SRVNFVDoKKwljYXNlIEhJRFBfQ1RSTF9TT0ZUX1JFU0VUOgorCWNhc2UgSElEUF9DVFJMX1NVU1BFTkQ6CisJY2FzZSBISURQX0NUUkxfRVhJVF9TVVNQRU5EOgorCQkvKiBGSVhNRTogV2UgaGF2ZSB0byBwYXJzZSB0aGVzZSBhbmQgcmV0dXJuIG5vIGVycm9yICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJX19oaWRwX3NlbmRfY3RybF9tZXNzYWdlKHNlc3Npb24sCisJCQlISURQX1RSQU5TX0hBTkRTSEFLRSB8IEhJRFBfSFNIS19FUlJfSU5WQUxJRF9QQVJBTUVURVIsIE5VTEwsIDApOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWRwX3Byb2Nlc3NfZGF0YShzdHJ1Y3QgaGlkcF9zZXNzaW9uICpzZXNzaW9uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBjaGFyIHBhcmFtKQoreworCUJUX0RCRygic2Vzc2lvbiAlcCBza2IgJXAgbGVuICVkIHBhcmFtIDB4JTAyeCIsIHNlc3Npb24sIHNrYiwgc2tiLT5sZW4sIHBhcmFtKTsKKworCXN3aXRjaCAocGFyYW0pIHsKKwljYXNlIEhJRFBfREFUQV9SVFlQRV9JTlBVVDoKKwkJaGlkcF9zZXRfdGltZXIoc2Vzc2lvbik7CisKKwkJaWYgKHNlc3Npb24tPmlucHV0KQorCQkJaGlkcF9pbnB1dF9yZXBvcnQoc2Vzc2lvbiwgc2tiKTsKKwkJYnJlYWs7CisKKwljYXNlIEhJRFBfREFUQV9SVFlQRV9PVEhFUjoKKwljYXNlIEhJRFBfREFUQV9SVFlQRV9PVVBVVDoKKwljYXNlIEhJRFBfREFUQV9SVFlQRV9GRUFUVVJFOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCV9faGlkcF9zZW5kX2N0cmxfbWVzc2FnZShzZXNzaW9uLAorCQkJSElEUF9UUkFOU19IQU5EU0hBS0UgfCBISURQX0hTSEtfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCBOVUxMLCAwKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoaWRwX3JlY3ZfY3RybF9mcmFtZShzdHJ1Y3QgaGlkcF9zZXNzaW9uICpzZXNzaW9uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXVuc2lnbmVkIGNoYXIgaGRyLCB0eXBlLCBwYXJhbTsKKworCUJUX0RCRygic2Vzc2lvbiAlcCBza2IgJXAgbGVuICVkIiwgc2Vzc2lvbiwgc2tiLCBza2ItPmxlbik7CisKKwloZHIgPSBza2ItPmRhdGFbMF07CisJc2tiX3B1bGwoc2tiLCAxKTsKKworCXR5cGUgPSBoZHIgJiBISURQX0hFQURFUl9UUkFOU19NQVNLOworCXBhcmFtID0gaGRyICYgSElEUF9IRUFERVJfUEFSQU1fTUFTSzsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgSElEUF9UUkFOU19IQU5EU0hBS0U6CisJCWhpZHBfcHJvY2Vzc19oYW5kc2hha2Uoc2Vzc2lvbiwgcGFyYW0pOworCQlicmVhazsKKworCWNhc2UgSElEUF9UUkFOU19ISURfQ09OVFJPTDoKKwkJaGlkcF9wcm9jZXNzX2hpZF9jb250cm9sKHNlc3Npb24sIHBhcmFtKTsKKwkJYnJlYWs7CisKKwljYXNlIEhJRFBfVFJBTlNfREFUQToKKwkJaGlkcF9wcm9jZXNzX2RhdGEoc2Vzc2lvbiwgc2tiLCBwYXJhbSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJX19oaWRwX3NlbmRfY3RybF9tZXNzYWdlKHNlc3Npb24sCisJCQlISURQX1RSQU5TX0hBTkRTSEFLRSB8IEhJRFBfSFNIS19FUlJfVU5TVVBQT1JURURfUkVRVUVTVCwgTlVMTCwgMCk7CisJCWJyZWFrOworCX0KKworCWtmcmVlX3NrYihza2IpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGlkcF9yZWN2X2ludHJfZnJhbWUoc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1bnNpZ25lZCBjaGFyIGhkcjsKKworCUJUX0RCRygic2Vzc2lvbiAlcCBza2IgJXAgbGVuICVkIiwgc2Vzc2lvbiwgc2tiLCBza2ItPmxlbik7CisKKwloZHIgPSBza2ItPmRhdGFbMF07CisJc2tiX3B1bGwoc2tiLCAxKTsKKworCWlmIChoZHIgPT0gKEhJRFBfVFJBTlNfREFUQSB8IEhJRFBfREFUQV9SVFlQRV9JTlBVVCkpIHsKKwkJaGlkcF9zZXRfdGltZXIoc2Vzc2lvbik7CisJCWlmIChzZXNzaW9uLT5pbnB1dCkKKwkJCWhpZHBfaW5wdXRfcmVwb3J0KHNlc3Npb24sIHNrYik7CisJfSBlbHNlIHsKKwkJQlRfREJHKCJVbnN1cHBvcnRlZCBwcm90b2NvbCBoZWFkZXIgMHglMDJ4IiwgaGRyKTsKKwl9CisKKwlrZnJlZV9za2Ioc2tiKTsKK30KKworc3RhdGljIGludCBoaWRwX3NlbmRfZnJhbWUoc3RydWN0IHNvY2tldCAqc29jaywgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qga3ZlYyBpdiA9IHsgZGF0YSwgbGVuIH07CisJc3RydWN0IG1zZ2hkciBtc2c7CisKKwlCVF9EQkcoInNvY2sgJXAgZGF0YSAlcCBsZW4gJWQiLCBzb2NrLCBkYXRhLCBsZW4pOworCisJaWYgKCFsZW4pCisJCXJldHVybiAwOworCisJbWVtc2V0KCZtc2csIDAsIHNpemVvZihtc2cpKTsKKworCXJldHVybiBrZXJuZWxfc2VuZG1zZyhzb2NrLCAmbXNnLCAmaXYsIDEsIGxlbik7Cit9CisKK3N0YXRpYyBpbnQgaGlkcF9wcm9jZXNzX3RyYW5zbWl0KHN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCUJUX0RCRygic2Vzc2lvbiAlcCIsIHNlc3Npb24pOworCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmc2Vzc2lvbi0+Y3RybF90cmFuc21pdCkpKSB7CisJCWlmIChoaWRwX3NlbmRfZnJhbWUoc2Vzc2lvbi0+Y3RybF9zb2NrLCBza2ItPmRhdGEsIHNrYi0+bGVuKSA8IDApIHsKKwkJCXNrYl9xdWV1ZV9oZWFkKCZzZXNzaW9uLT5jdHJsX3RyYW5zbWl0LCBza2IpOworCQkJYnJlYWs7CisJCX0KKworCQloaWRwX3NldF90aW1lcihzZXNzaW9uKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJfQorCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmc2Vzc2lvbi0+aW50cl90cmFuc21pdCkpKSB7CisJCWlmIChoaWRwX3NlbmRfZnJhbWUoc2Vzc2lvbi0+aW50cl9zb2NrLCBza2ItPmRhdGEsIHNrYi0+bGVuKSA8IDApIHsKKwkJCXNrYl9xdWV1ZV9oZWFkKCZzZXNzaW9uLT5pbnRyX3RyYW5zbWl0LCBza2IpOworCQkJYnJlYWs7CisJCX0KKworCQloaWRwX3NldF90aW1lcihzZXNzaW9uKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJfQorCisJcmV0dXJuIHNrYl9xdWV1ZV9sZW4oJnNlc3Npb24tPmN0cmxfdHJhbnNtaXQpICsKKwkJCQlza2JfcXVldWVfbGVuKCZzZXNzaW9uLT5pbnRyX3RyYW5zbWl0KTsKK30KKworc3RhdGljIGludCBoaWRwX3Nlc3Npb24odm9pZCAqYXJnKQoreworCXN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24gPSBhcmc7CisJc3RydWN0IHNvY2sgKmN0cmxfc2sgPSBzZXNzaW9uLT5jdHJsX3NvY2stPnNrOworCXN0cnVjdCBzb2NrICppbnRyX3NrID0gc2Vzc2lvbi0+aW50cl9zb2NrLT5zazsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCB2ZW5kb3IgPSAweDAwMDAsIHByb2R1Y3QgPSAweDAwMDA7CisJd2FpdF9xdWV1ZV90IGN0cmxfd2FpdCwgaW50cl93YWl0OworCisJQlRfREJHKCJzZXNzaW9uICVwIiwgc2Vzc2lvbik7CisKKwlpZiAoc2Vzc2lvbi0+aW5wdXQpIHsKKwkJdmVuZG9yICA9IHNlc3Npb24tPmlucHV0LT5pZC52ZW5kb3I7CisJCXByb2R1Y3QgPSBzZXNzaW9uLT5pbnB1dC0+aWQucHJvZHVjdDsKKwl9CisKKwlkYWVtb25pemUoImtoaWRwZF8lMDR4JTA0eCIsIHZlbmRvciwgcHJvZHVjdCk7CisJc2V0X3VzZXJfbmljZShjdXJyZW50LCAtMTUpOworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOworCisJaW5pdF93YWl0cXVldWVfZW50cnkoJmN0cmxfd2FpdCwgY3VycmVudCk7CisJaW5pdF93YWl0cXVldWVfZW50cnkoJmludHJfd2FpdCwgY3VycmVudCk7CisJYWRkX3dhaXRfcXVldWUoY3RybF9zay0+c2tfc2xlZXAsICZjdHJsX3dhaXQpOworCWFkZF93YWl0X3F1ZXVlKGludHJfc2stPnNrX3NsZWVwLCAmaW50cl93YWl0KTsKKwl3aGlsZSAoIWF0b21pY19yZWFkKCZzZXNzaW9uLT50ZXJtaW5hdGUpKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJaWYgKGN0cmxfc2stPnNrX3N0YXRlICE9IEJUX0NPTk5FQ1RFRCB8fCBpbnRyX3NrLT5za19zdGF0ZSAhPSBCVF9DT05ORUNURUQpCisJCQlicmVhazsKKworCQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZjdHJsX3NrLT5za19yZWNlaXZlX3F1ZXVlKSkpIHsKKwkJCXNrYl9vcnBoYW4oc2tiKTsKKwkJCWhpZHBfcmVjdl9jdHJsX2ZyYW1lKHNlc3Npb24sIHNrYik7CisJCX0KKworCQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZpbnRyX3NrLT5za19yZWNlaXZlX3F1ZXVlKSkpIHsKKwkJCXNrYl9vcnBoYW4oc2tiKTsKKwkJCWhpZHBfcmVjdl9pbnRyX2ZyYW1lKHNlc3Npb24sIHNrYik7CisJCX0KKworCQloaWRwX3Byb2Nlc3NfdHJhbnNtaXQoc2Vzc2lvbik7CisKKwkJc2NoZWR1bGUoKTsKKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZShpbnRyX3NrLT5za19zbGVlcCwgJmludHJfd2FpdCk7CisJcmVtb3ZlX3dhaXRfcXVldWUoY3RybF9zay0+c2tfc2xlZXAsICZjdHJsX3dhaXQpOworCisJZG93bl93cml0ZSgmaGlkcF9zZXNzaW9uX3NlbSk7CisKKwloaWRwX2RlbF90aW1lcihzZXNzaW9uKTsKKworCWlmIChpbnRyX3NrLT5za19zdGF0ZSAhPSBCVF9DT05ORUNURUQpCisJCXdhaXRfZXZlbnRfdGltZW91dCgqKGN0cmxfc2stPnNrX3NsZWVwKSwgKGN0cmxfc2stPnNrX3N0YXRlID09IEJUX0NMT1NFRCksIEhaKTsKKworCWZwdXQoc2Vzc2lvbi0+Y3RybF9zb2NrLT5maWxlKTsKKworCXdhaXRfZXZlbnRfdGltZW91dCgqKGludHJfc2stPnNrX3NsZWVwKSwgKGludHJfc2stPnNrX3N0YXRlID09IEJUX0NMT1NFRCksIEhaKTsKKworCWZwdXQoc2Vzc2lvbi0+aW50cl9zb2NrLT5maWxlKTsKKworCV9faGlkcF91bmxpbmtfc2Vzc2lvbihzZXNzaW9uKTsKKworCWlmIChzZXNzaW9uLT5pbnB1dCkgeworCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShzZXNzaW9uLT5pbnB1dCk7CisJCWtmcmVlKHNlc3Npb24tPmlucHV0KTsKKwl9CisKKwl1cF93cml0ZSgmaGlkcF9zZXNzaW9uX3NlbSk7CisKKwlrZnJlZShzZXNzaW9uKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGhpZHBfc2V0dXBfaW5wdXQoc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbiwgc3RydWN0IGhpZHBfY29ubmFkZF9yZXEgKnJlcSkKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCA9IHNlc3Npb24tPmlucHV0OworCWludCBpOworCisJaW5wdXQtPnByaXZhdGUgPSBzZXNzaW9uOworCisJaW5wdXQtPmlkLmJ1c3R5cGUgPSBCVVNfQkxVRVRPT1RIOworCWlucHV0LT5pZC52ZW5kb3IgID0gcmVxLT52ZW5kb3I7CisJaW5wdXQtPmlkLnByb2R1Y3QgPSByZXEtPnByb2R1Y3Q7CisJaW5wdXQtPmlkLnZlcnNpb24gPSByZXEtPnZlcnNpb247CisKKwlpZiAocmVxLT5zdWJjbGFzcyAmIDB4NDApIHsKKwkJc2V0X2JpdChFVl9LRVksIGlucHV0LT5ldmJpdCk7CisJCXNldF9iaXQoRVZfTEVELCBpbnB1dC0+ZXZiaXQpOworCQlzZXRfYml0KEVWX1JFUCwgaW5wdXQtPmV2Yml0KTsKKworCQlzZXRfYml0KExFRF9OVU1MLCAgICBpbnB1dC0+bGVkYml0KTsKKwkJc2V0X2JpdChMRURfQ0FQU0wsICAgaW5wdXQtPmxlZGJpdCk7CisJCXNldF9iaXQoTEVEX1NDUk9MTEwsIGlucHV0LT5sZWRiaXQpOworCQlzZXRfYml0KExFRF9DT01QT1NFLCBpbnB1dC0+bGVkYml0KTsKKwkJc2V0X2JpdChMRURfS0FOQSwgICAgaW5wdXQtPmxlZGJpdCk7CisKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZihoaWRwX2tleWNvZGUpOyBpKyspCisJCQlzZXRfYml0KGhpZHBfa2V5Y29kZVtpXSwgaW5wdXQtPmtleWJpdCk7CisJCWNsZWFyX2JpdCgwLCBpbnB1dC0+a2V5Yml0KTsKKwl9CisKKwlpZiAocmVxLT5zdWJjbGFzcyAmIDB4ODApIHsKKwkJaW5wdXQtPmV2Yml0WzBdID0gQklUKEVWX0tFWSkgfCBCSVQoRVZfUkVMKTsKKwkJaW5wdXQtPmtleWJpdFtMT05HKEJUTl9NT1VTRSldID0gQklUKEJUTl9MRUZUKSB8IEJJVChCVE5fUklHSFQpIHwgQklUKEJUTl9NSURETEUpOworCQlpbnB1dC0+cmVsYml0WzBdID0gQklUKFJFTF9YKSB8IEJJVChSRUxfWSk7CisJCWlucHV0LT5rZXliaXRbTE9ORyhCVE5fTU9VU0UpXSB8PSBCSVQoQlROX1NJREUpIHwgQklUKEJUTl9FWFRSQSk7CisJCWlucHV0LT5yZWxiaXRbMF0gfD0gQklUKFJFTF9XSEVFTCk7CisJfQorCisJaW5wdXQtPmV2ZW50ID0gaGlkcF9pbnB1dF9ldmVudDsKKworCWlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dCk7Cit9CisKK2ludCBoaWRwX2FkZF9jb25uZWN0aW9uKHN0cnVjdCBoaWRwX2Nvbm5hZGRfcmVxICpyZXEsIHN0cnVjdCBzb2NrZXQgKmN0cmxfc29jaywgc3RydWN0IHNvY2tldCAqaW50cl9zb2NrKQoreworCXN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24sICpzOworCWludCBlcnI7CisKKwlCVF9EQkcoIiIpOworCisJaWYgKGJhY21wKCZidF9zayhjdHJsX3NvY2stPnNrKS0+c3JjLCAmYnRfc2soaW50cl9zb2NrLT5zayktPnNyYykgfHwKKwkJCWJhY21wKCZidF9zayhjdHJsX3NvY2stPnNrKS0+ZHN0LCAmYnRfc2soaW50cl9zb2NrLT5zayktPmRzdCkpCisJCXJldHVybiAtRU5PVFVOSVE7CisKKwlzZXNzaW9uID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGhpZHBfc2Vzc2lvbiksIEdGUF9LRVJORUwpOworCWlmICghc2Vzc2lvbikgCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChzZXNzaW9uLCAwLCBzaXplb2Yoc3RydWN0IGhpZHBfc2Vzc2lvbikpOworCisJc2Vzc2lvbi0+aW5wdXQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaW5wdXRfZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZXNzaW9uLT5pbnB1dCkgeworCQlrZnJlZShzZXNzaW9uKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChzZXNzaW9uLT5pbnB1dCwgMCwgc2l6ZW9mKHN0cnVjdCBpbnB1dF9kZXYpKTsKKworCWRvd25fd3JpdGUoJmhpZHBfc2Vzc2lvbl9zZW0pOworCisJcyA9IF9faGlkcF9nZXRfc2Vzc2lvbigmYnRfc2soY3RybF9zb2NrLT5zayktPmRzdCk7CisJaWYgKHMgJiYgcy0+c3RhdGUgPT0gQlRfQ09OTkVDVEVEKSB7CisJCWVyciA9IC1FRVhJU1Q7CisJCWdvdG8gZmFpbGVkOworCX0KKworCWJhY3B5KCZzZXNzaW9uLT5iZGFkZHIsICZidF9zayhjdHJsX3NvY2stPnNrKS0+ZHN0KTsKKworCXNlc3Npb24tPmN0cmxfbXR1ID0gbWluX3QodWludCwgbDJjYXBfcGkoY3RybF9zb2NrLT5zayktPm9tdHUsIGwyY2FwX3BpKGN0cmxfc29jay0+c2spLT5pbXR1KTsKKwlzZXNzaW9uLT5pbnRyX210dSA9IG1pbl90KHVpbnQsIGwyY2FwX3BpKGludHJfc29jay0+c2spLT5vbXR1LCBsMmNhcF9waShpbnRyX3NvY2stPnNrKS0+aW10dSk7CisKKwlCVF9EQkcoImN0cmwgbXR1ICVkIGludHIgbXR1ICVkIiwgc2Vzc2lvbi0+Y3RybF9tdHUsIHNlc3Npb24tPmludHJfbXR1KTsKKworCXNlc3Npb24tPmN0cmxfc29jayA9IGN0cmxfc29jazsKKwlzZXNzaW9uLT5pbnRyX3NvY2sgPSBpbnRyX3NvY2s7CisJc2Vzc2lvbi0+c3RhdGUgICAgID0gQlRfQ09OTkVDVEVEOworCisJaW5pdF90aW1lcigmc2Vzc2lvbi0+dGltZXIpOworCisJc2Vzc2lvbi0+dGltZXIuZnVuY3Rpb24gPSBoaWRwX2lkbGVfdGltZW91dDsKKwlzZXNzaW9uLT50aW1lci5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKSBzZXNzaW9uOworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2Vzc2lvbi0+Y3RybF90cmFuc21pdCk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2Vzc2lvbi0+aW50cl90cmFuc21pdCk7CisKKwlzZXNzaW9uLT5mbGFncyAgID0gcmVxLT5mbGFncyAmICgxIDw8IEhJRFBfQkxVRVRPT1RIX1ZFTkRPUl9JRCk7CisJc2Vzc2lvbi0+aWRsZV90byA9IHJlcS0+aWRsZV90bzsKKworCWlmIChzZXNzaW9uLT5pbnB1dCkKKwkJaGlkcF9zZXR1cF9pbnB1dChzZXNzaW9uLCByZXEpOworCisJX19oaWRwX2xpbmtfc2Vzc2lvbihzZXNzaW9uKTsKKworCWhpZHBfc2V0X3RpbWVyKHNlc3Npb24pOworCisJZXJyID0ga2VybmVsX3RocmVhZChoaWRwX3Nlc3Npb24sIHNlc3Npb24sIENMT05FX0tFUk5FTCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gdW5saW5rOworCisJaWYgKHNlc3Npb24tPmlucHV0KSB7CisJCWhpZHBfc2VuZF9jdHJsX21lc3NhZ2Uoc2Vzc2lvbiwKKwkJCUhJRFBfVFJBTlNfU0VUX1BST1RPQ09MIHwgSElEUF9QUk9UT19CT09ULCBOVUxMLCAwKTsKKwkJc2Vzc2lvbi0+ZmxhZ3MgfD0gKDEgPDwgSElEUF9CT09UX1BST1RPQ09MX01PREUpOworCisJCXNlc3Npb24tPmxlZHMgPSAweGZmOworCQloaWRwX2lucHV0X2V2ZW50KHNlc3Npb24tPmlucHV0LCBFVl9MRUQsIDAsIDApOworCX0KKworCXVwX3dyaXRlKCZoaWRwX3Nlc3Npb25fc2VtKTsKKwlyZXR1cm4gMDsKKwordW5saW5rOgorCWhpZHBfZGVsX3RpbWVyKHNlc3Npb24pOworCisJX19oaWRwX3VubGlua19zZXNzaW9uKHNlc3Npb24pOworCisJaWYgKHNlc3Npb24tPmlucHV0KQorCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShzZXNzaW9uLT5pbnB1dCk7CisKK2ZhaWxlZDoKKwl1cF93cml0ZSgmaGlkcF9zZXNzaW9uX3NlbSk7CisKKwlpZiAoc2Vzc2lvbi0+aW5wdXQpCisJCWtmcmVlKHNlc3Npb24tPmlucHV0KTsKKworCWtmcmVlKHNlc3Npb24pOworCXJldHVybiBlcnI7Cit9CisKK2ludCBoaWRwX2RlbF9jb25uZWN0aW9uKHN0cnVjdCBoaWRwX2Nvbm5kZWxfcmVxICpyZXEpCit7CisJc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbjsKKwlpbnQgZXJyID0gMDsKKworCUJUX0RCRygiIik7CisKKwlkb3duX3JlYWQoJmhpZHBfc2Vzc2lvbl9zZW0pOworCisJc2Vzc2lvbiA9IF9faGlkcF9nZXRfc2Vzc2lvbigmcmVxLT5iZGFkZHIpOworCWlmIChzZXNzaW9uKSB7CisJCWlmIChyZXEtPmZsYWdzICYgKDEgPDwgSElEUF9WSVJUVUFMX0NBQkxFX1VOUExVRykpIHsKKwkJCWhpZHBfc2VuZF9jdHJsX21lc3NhZ2Uoc2Vzc2lvbiwKKwkJCQlISURQX1RSQU5TX0hJRF9DT05UUk9MIHwgSElEUF9DVFJMX1ZJUlRVQUxfQ0FCTEVfVU5QTFVHLCBOVUxMLCAwKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEZsdXNoIHRoZSB0cmFuc21pdCBxdWV1ZXMgKi8KKwkJCXNrYl9xdWV1ZV9wdXJnZSgmc2Vzc2lvbi0+Y3RybF90cmFuc21pdCk7CisJCQlza2JfcXVldWVfcHVyZ2UoJnNlc3Npb24tPmludHJfdHJhbnNtaXQpOworCisJCQkvKiBLaWxsIHNlc3Npb24gdGhyZWFkICovCisJCQlhdG9taWNfaW5jKCZzZXNzaW9uLT50ZXJtaW5hdGUpOworCQkJaGlkcF9zY2hlZHVsZShzZXNzaW9uKTsKKwkJfQorCX0gZWxzZQorCQllcnIgPSAtRU5PRU5UOworCisJdXBfcmVhZCgmaGlkcF9zZXNzaW9uX3NlbSk7CisJcmV0dXJuIGVycjsKK30KKworaW50IGhpZHBfZ2V0X2Nvbm5saXN0KHN0cnVjdCBoaWRwX2Nvbm5saXN0X3JlcSAqcmVxKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJaW50IGVyciA9IDAsIG4gPSAwOworCisJQlRfREJHKCIiKTsKKworCWRvd25fcmVhZCgmaGlkcF9zZXNzaW9uX3NlbSk7CisKKwlsaXN0X2Zvcl9lYWNoKHAsICZoaWRwX3Nlc3Npb25fbGlzdCkgeworCQlzdHJ1Y3QgaGlkcF9zZXNzaW9uICpzZXNzaW9uOworCQlzdHJ1Y3QgaGlkcF9jb25uaW5mbyBjaTsKKworCQlzZXNzaW9uID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGlkcF9zZXNzaW9uLCBsaXN0KTsKKworCQlfX2hpZHBfY29weV9zZXNzaW9uKHNlc3Npb24sICZjaSk7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihyZXEtPmNpLCAmY2ksIHNpemVvZihjaSkpKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKytuID49IHJlcS0+Y251bSkKKwkJCWJyZWFrOworCisJCXJlcS0+Y2krKzsKKwl9CisJcmVxLT5jbnVtID0gbjsKKworCXVwX3JlYWQoJmhpZHBfc2Vzc2lvbl9zZW0pOworCXJldHVybiBlcnI7Cit9CisKK2ludCBoaWRwX2dldF9jb25uaW5mbyhzdHJ1Y3QgaGlkcF9jb25uaW5mbyAqY2kpCit7CisJc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbjsKKwlpbnQgZXJyID0gMDsKKworCWRvd25fcmVhZCgmaGlkcF9zZXNzaW9uX3NlbSk7CisKKwlzZXNzaW9uID0gX19oaWRwX2dldF9zZXNzaW9uKCZjaS0+YmRhZGRyKTsKKwlpZiAoc2Vzc2lvbikKKwkJX19oaWRwX2NvcHlfc2Vzc2lvbihzZXNzaW9uLCBjaSk7CisJZWxzZQorCQllcnIgPSAtRU5PRU5UOworCisJdXBfcmVhZCgmaGlkcF9zZXNzaW9uX3NlbSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2luaXQgaGlkcF9pbml0KHZvaWQpCit7CisJbDJjYXBfbG9hZCgpOworCisJQlRfSU5GTygiSElEUCAoSHVtYW4gSW50ZXJmYWNlIEVtdWxhdGlvbikgdmVyICVzIiwgVkVSU0lPTik7CisKKwlyZXR1cm4gaGlkcF9pbml0X3NvY2tldHMoKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGhpZHBfZXhpdCh2b2lkKQoreworCWhpZHBfY2xlYW51cF9zb2NrZXRzKCk7Cit9CisKK21vZHVsZV9pbml0KGhpZHBfaW5pdCk7Cittb2R1bGVfZXhpdChoaWRwX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNYXJjZWwgSG9sdG1hbm4gPG1hcmNlbEBob2x0bWFubi5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJsdWV0b290aCBISURQIHZlciAiIFZFUlNJT04pOworTU9EVUxFX1ZFUlNJT04oVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImJ0LXByb3RvLTYiKTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGlkcC9oaWRwLmggYi9uZXQvYmx1ZXRvb3RoL2hpZHAvaGlkcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNzc1ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYmx1ZXRvb3RoL2hpZHAvaGlkcC5oCkBAIC0wLDAgKzEsMTY3IEBACisvKiAKKyAgIEhJRFAgaW1wbGVtZW50YXRpb24gZm9yIExpbnV4IEJsdWV0b290aCBzdGFjayAoQmx1ZVopLgorICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgTWFyY2VsIEhvbHRtYW5uIDxtYXJjZWxAaG9sdG1hbm4ub3JnPgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICAgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIFRISVJEIFBBUlRZIFJJR0hUUy4KKyAgIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIEFORCBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkKKyAgIENMQUlNLCBPUiBBTlkgU1BFQ0lBTCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIE9SIEFOWSBEQU1BR0VTIAorICAgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIAorICAgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgCisgICBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisgICBBTEwgTElBQklMSVRZLCBJTkNMVURJTkcgTElBQklMSVRZIEZPUiBJTkZSSU5HRU1FTlQgT0YgQU5ZIFBBVEVOVFMsIAorICAgQ09QWVJJR0hUUywgVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMsIFJFTEFUSU5HIFRPIFVTRSBPRiBUSElTIAorICAgU09GVFdBUkUgSVMgRElTQ0xBSU1FRC4KKyovCisKKyNpZm5kZWYgX19ISURQX0gKKyNkZWZpbmUgX19ISURQX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KKworLyogSElEUCBoZWFkZXIgbWFza3MgKi8KKyNkZWZpbmUgSElEUF9IRUFERVJfVFJBTlNfTUFTSwkJCTB4ZjAKKyNkZWZpbmUgSElEUF9IRUFERVJfUEFSQU1fTUFTSwkJCTB4MGYKKworLyogSElEUCB0cmFuc2FjdGlvbiB0eXBlcyAqLworI2RlZmluZSBISURQX1RSQU5TX0hBTkRTSEFLRQkJCTB4MDAKKyNkZWZpbmUgSElEUF9UUkFOU19ISURfQ09OVFJPTAkJCTB4MTAKKyNkZWZpbmUgSElEUF9UUkFOU19HRVRfUkVQT1JUCQkJMHg0MAorI2RlZmluZSBISURQX1RSQU5TX1NFVF9SRVBPUlQJCQkweDUwCisjZGVmaW5lIEhJRFBfVFJBTlNfR0VUX1BST1RPQ09MCQkJMHg2MAorI2RlZmluZSBISURQX1RSQU5TX1NFVF9QUk9UT0NPTAkJCTB4NzAKKyNkZWZpbmUgSElEUF9UUkFOU19HRVRfSURMRQkJCTB4ODAKKyNkZWZpbmUgSElEUF9UUkFOU19TRVRfSURMRQkJCTB4OTAKKyNkZWZpbmUgSElEUF9UUkFOU19EQVRBCQkJCTB4YTAKKyNkZWZpbmUgSElEUF9UUkFOU19EQVRDCQkJCTB4YjAKKworLyogSElEUCBoYW5kc2hha2UgcmVzdWx0cyAqLworI2RlZmluZSBISURQX0hTSEtfU1VDQ0VTU0ZVTAkJCTB4MDAKKyNkZWZpbmUgSElEUF9IU0hLX05PVF9SRUFEWQkJCTB4MDEKKyNkZWZpbmUgSElEUF9IU0hLX0VSUl9JTlZBTElEX1JFUE9SVF9JRAkJMHgwMgorI2RlZmluZSBISURQX0hTSEtfRVJSX1VOU1VQUE9SVEVEX1JFUVVFU1QJMHgwMworI2RlZmluZSBISURQX0hTSEtfRVJSX0lOVkFMSURfUEFSQU1FVEVSCQkweDA0CisjZGVmaW5lIEhJRFBfSFNIS19FUlJfVU5LTk9XTgkJCTB4MGUKKyNkZWZpbmUgSElEUF9IU0hLX0VSUl9GQVRBTAkJCTB4MGYKKworLyogSElEUCBjb250cm9sIG9wZXJhdGlvbiBwYXJhbWV0ZXJzICovCisjZGVmaW5lIEhJRFBfQ1RSTF9OT1AJCQkJMHgwMAorI2RlZmluZSBISURQX0NUUkxfSEFSRF9SRVNFVAkJCTB4MDEKKyNkZWZpbmUgSElEUF9DVFJMX1NPRlRfUkVTRVQJCQkweDAyCisjZGVmaW5lIEhJRFBfQ1RSTF9TVVNQRU5ECQkJMHgwMworI2RlZmluZSBISURQX0NUUkxfRVhJVF9TVVNQRU5ECQkJMHgwNAorI2RlZmluZSBISURQX0NUUkxfVklSVFVBTF9DQUJMRV9VTlBMVUcJCTB4MDUKKworLyogSElEUCBkYXRhIHRyYW5zYWN0aW9uIGhlYWRlcnMgKi8KKyNkZWZpbmUgSElEUF9EQVRBX1JUWVBFX01BU0sJCQkweDAzCisjZGVmaW5lIEhJRFBfREFUQV9SU1JWRF9NQVNLCQkJMHgwYworI2RlZmluZSBISURQX0RBVEFfUlRZUEVfT1RIRVIJCQkweDAwCisjZGVmaW5lIEhJRFBfREFUQV9SVFlQRV9JTlBVVAkJCTB4MDEKKyNkZWZpbmUgSElEUF9EQVRBX1JUWVBFX09VUFVUCQkJMHgwMgorI2RlZmluZSBISURQX0RBVEFfUlRZUEVfRkVBVFVSRQkJCTB4MDMKKworLyogSElEUCBwcm90b2NvbCBoZWFkZXIgcGFyYW1ldGVycyAqLworI2RlZmluZSBISURQX1BST1RPX0JPT1QJCQkJMHgwMAorI2RlZmluZSBISURQX1BST1RPX1JFUE9SVAkJCTB4MDEKKworLyogSElEUCBpb2N0bCBkZWZpbmVzICovCisjZGVmaW5lIEhJRFBDT05OQURECV9JT1coJ0gnLCAyMDAsIGludCkKKyNkZWZpbmUgSElEUENPTk5ERUwJX0lPVygnSCcsIDIwMSwgaW50KQorI2RlZmluZSBISURQR0VUQ09OTkxJU1QJX0lPUignSCcsIDIxMCwgaW50KQorI2RlZmluZSBISURQR0VUQ09OTklORk8JX0lPUignSCcsIDIxMSwgaW50KQorCisjZGVmaW5lIEhJRFBfVklSVFVBTF9DQUJMRV9VTlBMVUcJMAorI2RlZmluZSBISURQX0JPT1RfUFJPVE9DT0xfTU9ERQkJMQorI2RlZmluZSBISURQX0JMVUVUT09USF9WRU5ET1JfSUQJOQorCitzdHJ1Y3QgaGlkcF9jb25uYWRkX3JlcSB7CisJaW50ICAgY3RybF9zb2NrOwkvLyBDb25uZWN0ZWQgY29udHJvbCBzb2NrZXQKKwlpbnQgICBpbnRyX3NvY2s7CS8vIENvbm50ZXRlZCBpbnRlcnJ1cHQgc29ja2V0CisJX191MTYgcGFyc2VyOworCV9fdTE2IHJkX3NpemU7CisJX191OCAqcmRfZGF0YTsKKwlfX3U4ICBjb3VudHJ5OworCV9fdTggIHN1YmNsYXNzOworCV9fdTE2IHZlbmRvcjsKKwlfX3UxNiBwcm9kdWN0OworCV9fdTE2IHZlcnNpb247CisJX191MzIgZmxhZ3M7CisJX191MzIgaWRsZV90bzsKKwljaGFyICBuYW1lWzEyOF07Cit9OworCitzdHJ1Y3QgaGlkcF9jb25uZGVsX3JlcSB7CisJYmRhZGRyX3QgYmRhZGRyOworCV9fdTMyICAgIGZsYWdzOworfTsKKworc3RydWN0IGhpZHBfY29ubmluZm8geworCWJkYWRkcl90IGJkYWRkcjsKKwlfX3UzMiAgICBmbGFnczsKKwlfX3UxNiAgICBzdGF0ZTsKKwlfX3UxNiAgICB2ZW5kb3I7CisJX191MTYgICAgcHJvZHVjdDsKKwlfX3UxNiAgICB2ZXJzaW9uOworCWNoYXIgICAgIG5hbWVbMTI4XTsKK307CisKK3N0cnVjdCBoaWRwX2Nvbm5saXN0X3JlcSB7CisJX191MzIgIGNudW07CisJc3RydWN0IGhpZHBfY29ubmluZm8gX191c2VyICpjaTsKK307CisKK2ludCBoaWRwX2FkZF9jb25uZWN0aW9uKHN0cnVjdCBoaWRwX2Nvbm5hZGRfcmVxICpyZXEsIHN0cnVjdCBzb2NrZXQgKmN0cmxfc29jaywgc3RydWN0IHNvY2tldCAqaW50cl9zb2NrKTsKK2ludCBoaWRwX2RlbF9jb25uZWN0aW9uKHN0cnVjdCBoaWRwX2Nvbm5kZWxfcmVxICpyZXEpOworaW50IGhpZHBfZ2V0X2Nvbm5saXN0KHN0cnVjdCBoaWRwX2Nvbm5saXN0X3JlcSAqcmVxKTsKK2ludCBoaWRwX2dldF9jb25uaW5mbyhzdHJ1Y3QgaGlkcF9jb25uaW5mbyAqY2kpOworCisvKiBISURQIHNlc3Npb24gZGVmaW5lcyAqLworc3RydWN0IGhpZHBfc2Vzc2lvbiB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJc3RydWN0IHNvY2tldCAqY3RybF9zb2NrOworCXN0cnVjdCBzb2NrZXQgKmludHJfc29jazsKKworCWJkYWRkcl90IGJkYWRkcjsKKworCXVuc2lnbmVkIGxvbmcgc3RhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGlkbGVfdG87CisKKwl1aW50IGN0cmxfbXR1OworCXVpbnQgaW50cl9tdHU7CisKKwlhdG9taWNfdCB0ZXJtaW5hdGU7CisKKwl1bnNpZ25lZCBjaGFyIGtleXNbOF07CisJdW5zaWduZWQgY2hhciBsZWRzOworCisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKworCXN0cnVjdCBza19idWZmX2hlYWQgY3RybF90cmFuc21pdDsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGludHJfdHJhbnNtaXQ7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgaGlkcF9zY2hlZHVsZShzdHJ1Y3QgaGlkcF9zZXNzaW9uICpzZXNzaW9uKQoreworCXN0cnVjdCBzb2NrICpjdHJsX3NrID0gc2Vzc2lvbi0+Y3RybF9zb2NrLT5zazsKKwlzdHJ1Y3Qgc29jayAqaW50cl9zayA9IHNlc3Npb24tPmludHJfc29jay0+c2s7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoY3RybF9zay0+c2tfc2xlZXApOworCXdha2VfdXBfaW50ZXJydXB0aWJsZShpbnRyX3NrLT5za19zbGVlcCk7Cit9CisKKy8qIEhJRFAgaW5pdCBkZWZpbmVzICovCitleHRlcm4gaW50IF9faW5pdCBoaWRwX2luaXRfc29ja2V0cyh2b2lkKTsKK2V4dGVybiB2b2lkIF9fZXhpdCBoaWRwX2NsZWFudXBfc29ja2V0cyh2b2lkKTsKKworI2VuZGlmIC8qIF9fSElEUF9IICovCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hpZHAvc29jay5jIGIvbmV0L2JsdWV0b290aC9oaWRwL3NvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWJiMzZkCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9oaWRwL3NvY2suYwpAQCAtMCwwICsxLDIzMiBAQAorLyogCisgICBISURQIGltcGxlbWVudGF0aW9uIGZvciBMaW51eCBCbHVldG9vdGggc3RhY2sgKEJsdWVaKS4KKyAgIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBBTkQgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZCisgICBDTEFJTSwgT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUyAKKyAgIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiAKKyAgIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIAorICAgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworICAgQUxMIExJQUJJTElUWSwgSU5DTFVESU5HIExJQUJJTElUWSBGT1IgSU5GUklOR0VNRU5UIE9GIEFOWSBQQVRFTlRTLCAKKyAgIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLCBSRUxBVElORyBUTyBVU0UgT0YgVEhJUyAKKyAgIFNPRlRXQVJFIElTIERJU0NMQUlNRUQuCisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworI2luY2x1ZGUgImhpZHAuaCIKKworI2lmbmRlZiBDT05GSUdfQlRfSElEUF9ERUJVRworI3VuZGVmICBCVF9EQkcKKyNkZWZpbmUgQlRfREJHKEQuLi4pCisjZW5kaWYKKworc3RhdGljIGludCBoaWRwX3NvY2tfcmVsZWFzZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCisJQlRfREJHKCJzb2NrICVwIHNrICVwIiwgc29jaywgc2spOworCisJaWYgKCFzaykKKwkJcmV0dXJuIDA7CisKKwlzb2NrX29ycGhhbihzayk7CisJc29ja19wdXQoc2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGlkcF9zb2NrX2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopIGFyZzsKKwlzdHJ1Y3QgaGlkcF9jb25uYWRkX3JlcSBjYTsKKwlzdHJ1Y3QgaGlkcF9jb25uZGVsX3JlcSBjZDsKKwlzdHJ1Y3QgaGlkcF9jb25ubGlzdF9yZXEgY2w7CisJc3RydWN0IGhpZHBfY29ubmluZm8gY2k7CisJc3RydWN0IHNvY2tldCAqY3NvY2s7CisJc3RydWN0IHNvY2tldCAqaXNvY2s7CisJaW50IGVycjsKKworCUJUX0RCRygiY21kICV4IGFyZyAlbHgiLCBjbWQsIGFyZyk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSElEUENPTk5BREQ6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2EsIGFyZ3AsIHNpemVvZihjYSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJY3NvY2sgPSBzb2NrZmRfbG9va3VwKGNhLmN0cmxfc29jaywgJmVycik7CisJCWlmICghY3NvY2spCisJCQlyZXR1cm4gZXJyOworCisJCWlzb2NrID0gc29ja2ZkX2xvb2t1cChjYS5pbnRyX3NvY2ssICZlcnIpOworCQlpZiAoIWlzb2NrKSB7CisJCQlmcHV0KGNzb2NrLT5maWxlKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCQlpZiAoY3NvY2stPnNrLT5za19zdGF0ZSAhPSBCVF9DT05ORUNURUQgfHwgaXNvY2stPnNrLT5za19zdGF0ZSAhPSBCVF9DT05ORUNURUQpIHsKKwkJCWZwdXQoY3NvY2stPmZpbGUpOworCQkJZnB1dChpc29jay0+ZmlsZSk7CisJCQlyZXR1cm4gLUVCQURGRDsKKwkJfQorCisJCWVyciA9IGhpZHBfYWRkX2Nvbm5lY3Rpb24oJmNhLCBjc29jaywgaXNvY2spOworCQlpZiAoIWVycikgeworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2EsIHNpemVvZihjYSkpKQorCQkJCWVyciA9IC1FRkFVTFQ7CisJCX0gZWxzZSB7CisJCQlmcHV0KGNzb2NrLT5maWxlKTsKKwkJCWZwdXQoaXNvY2stPmZpbGUpOworCQl9CisKKwkJcmV0dXJuIGVycjsKKworCWNhc2UgSElEUENPTk5ERUw6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2QsIGFyZ3AsIHNpemVvZihjZCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dXJuIGhpZHBfZGVsX2Nvbm5lY3Rpb24oJmNkKTsKKworCWNhc2UgSElEUEdFVENPTk5MSVNUOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJmNsLCBhcmdwLCBzaXplb2YoY2wpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChjbC5jbnVtIDw9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQllcnIgPSBoaWRwX2dldF9jb25ubGlzdCgmY2wpOworCQlpZiAoIWVyciAmJiBjb3B5X3RvX3VzZXIoYXJncCwgJmNsLCBzaXplb2YoY2wpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiBlcnI7CisKKwljYXNlIEhJRFBHRVRDT05OSU5GTzoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjaSwgYXJncCwgc2l6ZW9mKGNpKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQllcnIgPSBoaWRwX2dldF9jb25uaW5mbygmY2kpOworCQlpZiAoIWVyciAmJiBjb3B5X3RvX3VzZXIoYXJncCwgJmNpLCBzaXplb2YoY2kpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIGhpZHBfc29ja19vcHMgPSB7CisJLmZhbWlseQkJPSBQRl9CTFVFVE9PVEgsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWxlYXNlCT0gaGlkcF9zb2NrX3JlbGVhc2UsCisJLmlvY3RsCQk9IGhpZHBfc29ja19pb2N0bCwKKwkuYmluZAkJPSBzb2NrX25vX2JpbmQsCisJLmdldG5hbWUJPSBzb2NrX25vX2dldG5hbWUsCisJLnNlbmRtc2cJPSBzb2NrX25vX3NlbmRtc2csCisJLnJlY3Ztc2cJPSBzb2NrX25vX3JlY3Ztc2csCisJLnBvbGwJCT0gc29ja19ub19wb2xsLAorCS5saXN0ZW4JCT0gc29ja19ub19saXN0ZW4sCisJLnNodXRkb3duCT0gc29ja19ub19zaHV0ZG93biwKKwkuc2V0c29ja29wdAk9IHNvY2tfbm9fc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdAk9IHNvY2tfbm9fZ2V0c29ja29wdCwKKwkuY29ubmVjdAk9IHNvY2tfbm9fY29ubmVjdCwKKwkuc29ja2V0cGFpcgk9IHNvY2tfbm9fc29ja2V0cGFpciwKKwkuYWNjZXB0CQk9IHNvY2tfbm9fYWNjZXB0LAorCS5tbWFwCQk9IHNvY2tfbm9fbW1hcAorfTsKKworc3RhdGljIHN0cnVjdCBwcm90byBoaWRwX3Byb3RvID0geworCS5uYW1lCQk9ICJISURQIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9ial9zaXplCT0gc2l6ZW9mKHN0cnVjdCBidF9zb2NrKQorfTsKKworc3RhdGljIGludCBoaWRwX3NvY2tfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlCVF9EQkcoInNvY2sgJXAiLCBzb2NrKTsKKworCWlmIChzb2NrLT50eXBlICE9IFNPQ0tfUkFXKQorCQlyZXR1cm4gLUVTT0NLVE5PU1VQUE9SVDsKKworCXNrID0gc2tfYWxsb2MoUEZfQkxVRVRPT1RILCBHRlBfS0VSTkVMLCAmaGlkcF9wcm90bywgMSk7CisJaWYgKCFzaykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CisKKwlzb2NrLT5vcHMgPSAmaGlkcF9zb2NrX29wczsKKworCXNvY2stPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7CisKKwlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKworCXNrLT5za19wcm90b2NvbCA9IHByb3RvY29sOworCXNrLT5za19zdGF0ZQk9IEJUX09QRU47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5IGhpZHBfc29ja19mYW1pbHlfb3BzID0geworCS5mYW1pbHkJPSBQRl9CTFVFVE9PVEgsCisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmNyZWF0ZQk9IGhpZHBfc29ja19jcmVhdGUKK307CisKK2ludCBfX2luaXQgaGlkcF9pbml0X3NvY2tldHModm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcHJvdG9fcmVnaXN0ZXIoJmhpZHBfcHJvdG8sIDApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gYnRfc29ja19yZWdpc3RlcihCVFBST1RPX0hJRFAsICZoaWRwX3NvY2tfZmFtaWx5X29wcyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJQlRfRVJSKCJDYW4ndCByZWdpc3RlciBISURQIHNvY2tldCIpOworCXByb3RvX3VucmVnaXN0ZXIoJmhpZHBfcHJvdG8pOworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgX19leGl0IGhpZHBfY2xlYW51cF9zb2NrZXRzKHZvaWQpCit7CisJaWYgKGJ0X3NvY2tfdW5yZWdpc3RlcihCVFBST1RPX0hJRFApIDwgMCkKKwkJQlRfRVJSKCJDYW4ndCB1bnJlZ2lzdGVyIEhJRFAgc29ja2V0Iik7CisKKwlwcm90b191bnJlZ2lzdGVyKCZoaWRwX3Byb3RvKTsKK30KZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvbDJjYXAuYyBiL25ldC9ibHVldG9vdGgvbDJjYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTJiYWJjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9sMmNhcC5jCkBAIC0wLDAgKzEsMjMyOSBAQAorLyogCisgICBCbHVlWiAtIEJsdWV0b290aCBwcm90b2NvbCBzdGFjayBmb3IgTGludXgKKyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAxIFF1YWxjb21tIEluY29ycG9yYXRlZAorCisgICBXcml0dGVuIDIwMDAsMjAwMSBieSBNYXhpbSBLcmFzbnlhbnNreSA8bWF4a0BxdWFsY29tbS5jb20+CisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQgT0YgVEhJUkQgUEFSVFkgUklHSFRTLgorICAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIoUykgQU5EIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWQorICAgQ0xBSU0sIE9SIEFOWSBTUEVDSUFMIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgT1IgQU5ZIERBTUFHRVMgCisgICBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gCisgICBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiAKKyAgIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKyAgIEFMTCBMSUFCSUxJVFksIElOQ0xVRElORyBMSUFCSUxJVFkgRk9SIElORlJJTkdFTUVOVCBPRiBBTlkgUEFURU5UUywgCisgICBDT1BZUklHSFRTLCBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUywgUkVMQVRJTkcgVE8gVVNFIE9GIFRISVMgCisgICBTT0ZUV0FSRSBJUyBESVNDTEFJTUVELgorKi8KKworLyogQmx1ZXRvb3RoIEwyQ0FQIGNvcmUgYW5kIHNvY2tldHMuICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvbDJjYXAuaD4KKworI2lmbmRlZiBDT05GSUdfQlRfTDJDQVBfREVCVUcKKyN1bmRlZiAgQlRfREJHCisjZGVmaW5lIEJUX0RCRyhELi4uKQorI2VuZGlmCisKKyNkZWZpbmUgVkVSU0lPTiAiMi43IgorCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBsMmNhcF9zb2NrX29wczsKKworc3RhdGljIHN0cnVjdCBidF9zb2NrX2xpc3QgbDJjYXBfc2tfbGlzdCA9IHsKKwkubG9jayA9IFJXX0xPQ0tfVU5MT0NLRUQKK307CisKK3N0YXRpYyBpbnQgbDJjYXBfY29ubl9kZWwoc3RydWN0IGhjaV9jb25uICpjb25uLCBpbnQgZXJyKTsKKworc3RhdGljIHZvaWQgX19sMmNhcF9jaGFuX2FkZChzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29jayAqcGFyZW50KTsKK3N0YXRpYyB2b2lkIGwyY2FwX2NoYW5fZGVsKHN0cnVjdCBzb2NrICpzaywgaW50IGVycik7CisKK3N0YXRpYyB2b2lkIF9fbDJjYXBfc29ja19jbG9zZShzdHJ1Y3Qgc29jayAqc2ssIGludCByZWFzb24pOworc3RhdGljIHZvaWQgbDJjYXBfc29ja19jbG9zZShzdHJ1Y3Qgc29jayAqc2spOworc3RhdGljIHZvaWQgbDJjYXBfc29ja19raWxsKHN0cnVjdCBzb2NrICpzayk7CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqbDJjYXBfYnVpbGRfY21kKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLAorCQkJCXU4IGNvZGUsIHU4IGlkZW50LCB1MTYgZGxlbiwgdm9pZCAqZGF0YSk7CisKKy8qIC0tLS0gTDJDQVAgdGltZXJzIC0tLS0gKi8KK3N0YXRpYyB2b2lkIGwyY2FwX3NvY2tfdGltZW91dCh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSAoc3RydWN0IHNvY2sgKikgYXJnOworCisJQlRfREJHKCJzb2NrICVwIHN0YXRlICVkIiwgc2ssIHNrLT5za19zdGF0ZSk7CisKKwliaF9sb2NrX3NvY2soc2spOworCV9fbDJjYXBfc29ja19jbG9zZShzaywgRVRJTUVET1VUKTsKKwliaF91bmxvY2tfc29jayhzayk7CisKKwlsMmNhcF9zb2NrX2tpbGwoc2spOworCXNvY2tfcHV0KHNrKTsKK30KKworc3RhdGljIHZvaWQgbDJjYXBfc29ja19zZXRfdGltZXIoc3RydWN0IHNvY2sgKnNrLCBsb25nIHRpbWVvdXQpCit7CisJQlRfREJHKCJzayAlcCBzdGF0ZSAlZCB0aW1lb3V0ICVsZCIsIHNrLCBzay0+c2tfc3RhdGUsIHRpbWVvdXQpOworCXNrX3Jlc2V0X3RpbWVyKHNrLCAmc2stPnNrX3RpbWVyLCBqaWZmaWVzICsgdGltZW91dCk7Cit9CisKK3N0YXRpYyB2b2lkIGwyY2FwX3NvY2tfY2xlYXJfdGltZXIoc3RydWN0IHNvY2sgKnNrKQoreworCUJUX0RCRygic29jayAlcCBzdGF0ZSAlZCIsIHNrLCBzay0+c2tfc3RhdGUpOworCXNrX3N0b3BfdGltZXIoc2ssICZzay0+c2tfdGltZXIpOworfQorCitzdGF0aWMgdm9pZCBsMmNhcF9zb2NrX2luaXRfdGltZXIoc3RydWN0IHNvY2sgKnNrKQoreworCWluaXRfdGltZXIoJnNrLT5za190aW1lcik7CisJc2stPnNrX3RpbWVyLmZ1bmN0aW9uID0gbDJjYXBfc29ja190aW1lb3V0OworCXNrLT5za190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpc2s7Cit9CisKKy8qIC0tLS0gTDJDQVAgY29ubmVjdGlvbnMgLS0tLSAqLworc3RhdGljIHN0cnVjdCBsMmNhcF9jb25uICpsMmNhcF9jb25uX2FkZChzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24sIHU4IHN0YXR1cykKK3sKKwlzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubjsKKworCWlmICgoY29ubiA9IGhjb24tPmwyY2FwX2RhdGEpKQorCQlyZXR1cm4gY29ubjsKKworCWlmIChzdGF0dXMpCisJCXJldHVybiBjb25uOworCisJaWYgKCEoY29ubiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsMmNhcF9jb25uKSwgR0ZQX0FUT01JQykpKQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQoY29ubiwgMCwgc2l6ZW9mKHN0cnVjdCBsMmNhcF9jb25uKSk7CisKKwloY29uLT5sMmNhcF9kYXRhID0gY29ubjsKKwljb25uLT5oY29uID0gaGNvbjsKKworCWNvbm4tPm10dSA9IGhjb24tPmhkZXYtPmFjbF9tdHU7CisJY29ubi0+c3JjID0gJmhjb24tPmhkZXYtPmJkYWRkcjsKKwljb25uLT5kc3QgPSAmaGNvbi0+ZHN0OworCisJc3Bpbl9sb2NrX2luaXQoJmNvbm4tPmxvY2spOworCXJ3bG9ja19pbml0KCZjb25uLT5jaGFuX2xpc3QubG9jayk7CisKKwlCVF9EQkcoImhjb24gJXAgY29ubiAlcCIsIGhjb24sIGNvbm4pOworCXJldHVybiBjb25uOworfQorCitzdGF0aWMgaW50IGwyY2FwX2Nvbm5fZGVsKHN0cnVjdCBoY2lfY29ubiAqaGNvbiwgaW50IGVycikKK3sKKwlzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubjsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlpZiAoIShjb25uID0gaGNvbi0+bDJjYXBfZGF0YSkpIAorCQlyZXR1cm4gMDsKKworCUJUX0RCRygiaGNvbiAlcCBjb25uICVwLCBlcnIgJWQiLCBoY29uLCBjb25uLCBlcnIpOworCisJaWYgKGNvbm4tPnJ4X3NrYikKKwkJa2ZyZWVfc2tiKGNvbm4tPnJ4X3NrYik7CisKKwkvKiBLaWxsIGNoYW5uZWxzICovCisJd2hpbGUgKChzayA9IGNvbm4tPmNoYW5fbGlzdC5oZWFkKSkgeworCQliaF9sb2NrX3NvY2soc2spOworCQlsMmNhcF9jaGFuX2RlbChzaywgZXJyKTsKKwkJYmhfdW5sb2NrX3NvY2soc2spOworCQlsMmNhcF9zb2NrX2tpbGwoc2spOworCX0KKworCWhjb24tPmwyY2FwX2RhdGEgPSBOVUxMOworCWtmcmVlKGNvbm4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbDJjYXBfY2hhbl9hZGQoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2sgKnBhcmVudCkKK3sKKwlzdHJ1Y3QgbDJjYXBfY2hhbl9saXN0ICpsID0gJmNvbm4tPmNoYW5fbGlzdDsKKwl3cml0ZV9sb2NrKCZsLT5sb2NrKTsKKwlfX2wyY2FwX2NoYW5fYWRkKGNvbm4sIHNrLCBwYXJlbnQpOworCXdyaXRlX3VubG9jaygmbC0+bG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggbDJjYXBfZ2V0X2lkZW50KHN0cnVjdCBsMmNhcF9jb25uICpjb25uKQoreworCXU4IGlkOworCisJLyogR2V0IG5leHQgYXZhaWxhYmxlIGlkZW50aWZpY2F0b3IuCisJICogICAgMSAtIDEyOCBhcmUgdXNlZCBieSBrZXJuZWwuCisJICogIDEyOSAtIDE5OSBhcmUgcmVzZXJ2ZWQuCisJICogIDIwMCAtIDI1NCBhcmUgdXNlZCBieSB1dGlsaXRpZXMgbGlrZSBsMnBpbmcsIGV0Yy4KKwkgKi8KKworCXNwaW5fbG9jaygmY29ubi0+bG9jayk7CisKKwlpZiAoKytjb25uLT50eF9pZGVudCA+IDEyOCkKKwkJY29ubi0+dHhfaWRlbnQgPSAxOworCisJaWQgPSBjb25uLT50eF9pZGVudDsKKworCXNwaW5fdW5sb2NrKCZjb25uLT5sb2NrKTsKKworCXJldHVybiBpZDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbDJjYXBfc2VuZF9jbWQoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHU4IGlkZW50LCB1OCBjb2RlLCB1MTYgbGVuLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBsMmNhcF9idWlsZF9jbWQoY29ubiwgY29kZSwgaWRlbnQsIGxlbiwgZGF0YSk7CisKKwlCVF9EQkcoImNvZGUgMHglMi4yeCIsIGNvZGUpOworCisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIGhjaV9zZW5kX2FjbChjb25uLT5oY29uLCBza2IsIDApOworfQorCisvKiAtLS0tIFNvY2tldCBpbnRlcmZhY2UgLS0tLSAqLworc3RhdGljIHN0cnVjdCBzb2NrICpfX2wyY2FwX2dldF9zb2NrX2J5X2FkZHIodTE2IHBzbSwgYmRhZGRyX3QgKnNyYykKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisJc2tfZm9yX2VhY2goc2ssIG5vZGUsICZsMmNhcF9za19saXN0LmhlYWQpCisJCWlmIChsMmNhcF9waShzayktPnNwb3J0ID09IHBzbSAmJiAhYmFjbXAoJmJ0X3NrKHNrKS0+c3JjLCBzcmMpKQorCQkJZ290byBmb3VuZDsKKwlzayA9IE5VTEw7Citmb3VuZDoKKwlyZXR1cm4gc2s7Cit9CisKKy8qIEZpbmQgc29ja2V0IHdpdGggcHNtIGFuZCBzb3VyY2UgYmRhZGRyLgorICogUmV0dXJucyBjbG9zZXN0IG1hdGNoLgorICovCitzdGF0aWMgc3RydWN0IHNvY2sgKl9fbDJjYXBfZ2V0X3NvY2tfYnlfcHNtKGludCBzdGF0ZSwgdTE2IHBzbSwgYmRhZGRyX3QgKnNyYykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBOVUxMLCAqc2sxID0gTlVMTDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKworCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmbDJjYXBfc2tfbGlzdC5oZWFkKSB7CisJCWlmIChzdGF0ZSAmJiBzay0+c2tfc3RhdGUgIT0gc3RhdGUpCisJCQljb250aW51ZTsKKworCQlpZiAobDJjYXBfcGkoc2spLT5wc20gPT0gcHNtKSB7CisJCQkvKiBFeGFjdCBtYXRjaC4gKi8KKwkJCWlmICghYmFjbXAoJmJ0X3NrKHNrKS0+c3JjLCBzcmMpKQorCQkJCWJyZWFrOworCisJCQkvKiBDbG9zZXN0IG1hdGNoICovCisJCQlpZiAoIWJhY21wKCZidF9zayhzayktPnNyYywgQkRBRERSX0FOWSkpCisJCQkJc2sxID0gc2s7CisJCX0KKwl9CisJcmV0dXJuIG5vZGUgPyBzayA6IHNrMTsKK30KKworLyogRmluZCBzb2NrZXQgd2l0aCBnaXZlbiBhZGRyZXNzIChwc20sIHNyYykuCisgKiBSZXR1cm5zIGxvY2tlZCBzb2NrZXQgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNvY2sgKmwyY2FwX2dldF9zb2NrX2J5X3BzbShpbnQgc3RhdGUsIHUxNiBwc20sIGJkYWRkcl90ICpzcmMpCit7CisJc3RydWN0IHNvY2sgKnM7CisJcmVhZF9sb2NrKCZsMmNhcF9za19saXN0LmxvY2spOworCXMgPSBfX2wyY2FwX2dldF9zb2NrX2J5X3BzbShzdGF0ZSwgcHNtLCBzcmMpOworCWlmIChzKSBiaF9sb2NrX3NvY2socyk7CisJcmVhZF91bmxvY2soJmwyY2FwX3NrX2xpc3QubG9jayk7CisJcmV0dXJuIHM7Cit9CisKK3N0YXRpYyB2b2lkIGwyY2FwX3NvY2tfZGVzdHJ1Y3Qoc3RydWN0IHNvY2sgKnNrKQoreworCUJUX0RCRygic2sgJXAiLCBzayk7CisKKwlza2JfcXVldWVfcHVyZ2UoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwlza2JfcXVldWVfcHVyZ2UoJnNrLT5za193cml0ZV9xdWV1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGwyY2FwX3NvY2tfY2xlYW51cF9saXN0ZW4oc3RydWN0IHNvY2sgKnBhcmVudCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlCVF9EQkcoInBhcmVudCAlcCIsIHBhcmVudCk7CisKKwkvKiBDbG9zZSBub3QgeWV0IGFjY2VwdGVkIGNoYW5uZWxzICovCisJd2hpbGUgKChzayA9IGJ0X2FjY2VwdF9kZXF1ZXVlKHBhcmVudCwgTlVMTCkpKQorCQlsMmNhcF9zb2NrX2Nsb3NlKHNrKTsKKworCXBhcmVudC0+c2tfc3RhdGUgID0gQlRfQ0xPU0VEOworCXNvY2tfc2V0X2ZsYWcocGFyZW50LCBTT0NLX1pBUFBFRCk7Cit9CisKKy8qIEtpbGwgc29ja2V0IChvbmx5IGlmIHphcHBlZCBhbmQgb3JwaGFuKQorICogTXVzdCBiZSBjYWxsZWQgb24gdW5sb2NrZWQgc29ja2V0LgorICovCitzdGF0aWMgdm9pZCBsMmNhcF9zb2NrX2tpbGwoc3RydWN0IHNvY2sgKnNrKQoreworCWlmICghc29ja19mbGFnKHNrLCBTT0NLX1pBUFBFRCkgfHwgc2stPnNrX3NvY2tldCkKKwkJcmV0dXJuOworCisJQlRfREJHKCJzayAlcCBzdGF0ZSAlZCIsIHNrLCBzay0+c2tfc3RhdGUpOworCisJLyogS2lsbCBwb29yIG9ycGhhbiAqLworCWJ0X3NvY2tfdW5saW5rKCZsMmNhcF9za19saXN0LCBzayk7CisJc29ja19zZXRfZmxhZyhzaywgU09DS19ERUFEKTsKKwlzb2NrX3B1dChzayk7Cit9CisKK3N0YXRpYyB2b2lkIF9fbDJjYXBfc29ja19jbG9zZShzdHJ1Y3Qgc29jayAqc2ssIGludCByZWFzb24pCit7CisJQlRfREJHKCJzayAlcCBzdGF0ZSAlZCBzb2NrZXQgJXAiLCBzaywgc2stPnNrX3N0YXRlLCBzay0+c2tfc29ja2V0KTsKKworCXN3aXRjaCAoc2stPnNrX3N0YXRlKSB7CisJY2FzZSBCVF9MSVNURU46CisJCWwyY2FwX3NvY2tfY2xlYW51cF9saXN0ZW4oc2spOworCQlicmVhazsKKworCWNhc2UgQlRfQ09OTkVDVEVEOgorCWNhc2UgQlRfQ09ORklHOgorCWNhc2UgQlRfQ09OTkVDVDI6CisJCWlmIChzay0+c2tfdHlwZSA9PSBTT0NLX1NFUVBBQ0tFVCkgeworCQkJc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4gPSBsMmNhcF9waShzayktPmNvbm47CisJCQlzdHJ1Y3QgbDJjYXBfZGlzY29ubl9yZXEgcmVxOworCisJCQlzay0+c2tfc3RhdGUgPSBCVF9ESVNDT05OOworCQkJbDJjYXBfc29ja19zZXRfdGltZXIoc2ssIHNrLT5za19zbmR0aW1lbyk7CisKKwkJCXJlcS5kY2lkID0gX19jcHVfdG9fbGUxNihsMmNhcF9waShzayktPmRjaWQpOworCQkJcmVxLnNjaWQgPSBfX2NwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+c2NpZCk7CisJCQlsMmNhcF9zZW5kX2NtZChjb25uLCBsMmNhcF9nZXRfaWRlbnQoY29ubiksCisJCQkJCUwyQ0FQX0RJU0NPTk5fUkVRLCBzaXplb2YocmVxKSwgJnJlcSk7CisJCX0gZWxzZSB7CisJCQlsMmNhcF9jaGFuX2RlbChzaywgcmVhc29uKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQlRfQ09OTkVDVDoKKwljYXNlIEJUX0RJU0NPTk46CisJCWwyY2FwX2NoYW5fZGVsKHNrLCByZWFzb24pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBNdXN0IGJlIGNhbGxlZCBvbiB1bmxvY2tlZCBzb2NrZXQuICovCitzdGF0aWMgdm9pZCBsMmNhcF9zb2NrX2Nsb3NlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlsMmNhcF9zb2NrX2NsZWFyX3RpbWVyKHNrKTsKKwlsb2NrX3NvY2soc2spOworCV9fbDJjYXBfc29ja19jbG9zZShzaywgRUNPTk5SRVNFVCk7CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlsMmNhcF9zb2NrX2tpbGwoc2spOworfQorCitzdGF0aWMgdm9pZCBsMmNhcF9zb2NrX2luaXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29jayAqcGFyZW50KQoreworCXN0cnVjdCBsMmNhcF9waW5mbyAqcGkgPSBsMmNhcF9waShzayk7CisKKwlCVF9EQkcoInNrICVwIiwgc2spOworCisJaWYgKHBhcmVudCkgeworCQlzay0+c2tfdHlwZSA9IHBhcmVudC0+c2tfdHlwZTsKKwkJcGktPmltdHUgPSBsMmNhcF9waShwYXJlbnQpLT5pbXR1OworCQlwaS0+b210dSA9IGwyY2FwX3BpKHBhcmVudCktPm9tdHU7CisJCXBpLT5saW5rX21vZGUgPSBsMmNhcF9waShwYXJlbnQpLT5saW5rX21vZGU7CisJfSBlbHNlIHsKKwkJcGktPmltdHUgPSBMMkNBUF9ERUZBVUxUX01UVTsKKwkJcGktPm9tdHUgPSAwOworCQlwaS0+bGlua19tb2RlID0gMDsKKwl9CisKKwkvKiBEZWZhdWx0IGNvbmZpZyBvcHRpb25zICovCisJcGktPmNvbmZfbXR1ID0gTDJDQVBfREVGQVVMVF9NVFU7CisJcGktPmZsdXNoX3RvID0gTDJDQVBfREVGQVVMVF9GTFVTSF9UTzsKK30KKworc3RhdGljIHN0cnVjdCBwcm90byBsMmNhcF9wcm90byA9IHsKKwkubmFtZQkJPSAiTDJDQVAiLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub2JqX3NpemUJPSBzaXplb2Yoc3RydWN0IGwyY2FwX3BpbmZvKQorfTsKKworc3RhdGljIHN0cnVjdCBzb2NrICpsMmNhcF9zb2NrX2FsbG9jKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90bywgaW50IHByaW8pCit7CisJc3RydWN0IHNvY2sgKnNrOworCisJc2sgPSBza19hbGxvYyhQRl9CTFVFVE9PVEgsIHByaW8sICZsMmNhcF9wcm90bywgMSk7CisJaWYgKCFzaykKKwkJcmV0dXJuIE5VTEw7CisKKwlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CisJSU5JVF9MSVNUX0hFQUQoJmJ0X3NrKHNrKS0+YWNjZXB0X3EpOworCisJc2stPnNrX2Rlc3RydWN0ID0gbDJjYXBfc29ja19kZXN0cnVjdDsKKwlzay0+c2tfc25kdGltZW8gPSBMMkNBUF9DT05OX1RJTUVPVVQ7CisKKwlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKworCXNrLT5za19wcm90b2NvbCA9IHByb3RvOworCXNrLT5za19zdGF0ZSAgICA9IEJUX09QRU47CisKKwlsMmNhcF9zb2NrX2luaXRfdGltZXIoc2spOworCisJYnRfc29ja19saW5rKCZsMmNhcF9za19saXN0LCBzayk7CisJcmV0dXJuIHNrOworfQorCitzdGF0aWMgaW50IGwyY2FwX3NvY2tfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlCVF9EQkcoInNvY2sgJXAiLCBzb2NrKTsKKworCXNvY2stPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7CisKKwlpZiAoc29jay0+dHlwZSAhPSBTT0NLX1NFUVBBQ0tFVCAmJgorCQkJc29jay0+dHlwZSAhPSBTT0NLX0RHUkFNICYmIHNvY2stPnR5cGUgIT0gU09DS19SQVcpCisJCXJldHVybiAtRVNPQ0tUTk9TVVBQT1JUOworCisJaWYgKHNvY2stPnR5cGUgPT0gU09DS19SQVcgJiYgIWNhcGFibGUoQ0FQX05FVF9SQVcpKQorCQlyZXR1cm4gLUVQRVJNOworCisJc29jay0+b3BzID0gJmwyY2FwX3NvY2tfb3BzOworCisJc2sgPSBsMmNhcF9zb2NrX2FsbG9jKHNvY2ssIHByb3RvY29sLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNrKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWwyY2FwX3NvY2tfaW5pdChzaywgTlVMTCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbDJjYXBfc29ja19iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50IGFkZHJfbGVuKQoreworCXN0cnVjdCBzb2NrYWRkcl9sMiAqbGEgPSAoc3RydWN0IHNvY2thZGRyX2wyICopIGFkZHI7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJaW50IGVyciA9IDA7CisKKwlCVF9EQkcoInNrICVwLCAlcyAlZCIsIHNrLCBiYXRvc3RyKCZsYS0+bDJfYmRhZGRyKSwgbGEtPmwyX3BzbSk7CisKKwlpZiAoIWFkZHIgfHwgYWRkci0+c2FfZmFtaWx5ICE9IEFGX0JMVUVUT09USCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsb2NrX3NvY2soc2spOworCisJaWYgKHNrLT5za19zdGF0ZSAhPSBCVF9PUEVOKSB7CisJCWVyciA9IC1FQkFERkQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl3cml0ZV9sb2NrX2JoKCZsMmNhcF9za19saXN0LmxvY2spOworCisJaWYgKGxhLT5sMl9wc20gJiYgX19sMmNhcF9nZXRfc29ja19ieV9hZGRyKGxhLT5sMl9wc20sICZsYS0+bDJfYmRhZGRyKSkgeworCQllcnIgPSAtRUFERFJJTlVTRTsKKwl9IGVsc2UgeworCQkvKiBTYXZlIHNvdXJjZSBhZGRyZXNzICovCisJCWJhY3B5KCZidF9zayhzayktPnNyYywgJmxhLT5sMl9iZGFkZHIpOworCQlsMmNhcF9waShzayktPnBzbSAgID0gbGEtPmwyX3BzbTsKKwkJbDJjYXBfcGkoc2spLT5zcG9ydCA9IGxhLT5sMl9wc207CisJCXNrLT5za19zdGF0ZSA9IEJUX0JPVU5EOworCX0KKworCXdyaXRlX3VubG9ja19iaCgmbDJjYXBfc2tfbGlzdC5sb2NrKTsKKworZG9uZToKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbDJjYXBfZG9fY29ubmVjdChzdHJ1Y3Qgc29jayAqc2spCit7CisJYmRhZGRyX3QgKnNyYyA9ICZidF9zayhzayktPnNyYzsKKwliZGFkZHJfdCAqZHN0ID0gJmJ0X3NrKHNrKS0+ZHN0OworCXN0cnVjdCBsMmNhcF9jb25uICpjb25uOworCXN0cnVjdCBoY2lfY29ubiAqaGNvbjsKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKKwlpbnQgZXJyID0gMDsKKworCUJUX0RCRygiJXMgLT4gJXMgcHNtIDB4JTIuMngiLCBiYXRvc3RyKHNyYyksIGJhdG9zdHIoZHN0KSwgbDJjYXBfcGkoc2spLT5wc20pOworCisJaWYgKCEoaGRldiA9IGhjaV9nZXRfcm91dGUoZHN0LCBzcmMpKSkKKwkJcmV0dXJuIC1FSE9TVFVOUkVBQ0g7CisKKwloY2lfZGV2X2xvY2tfYmgoaGRldik7CisKKwllcnIgPSAtRU5PTUVNOworCisJaGNvbiA9IGhjaV9jb25uZWN0KGhkZXYsIEFDTF9MSU5LLCBkc3QpOworCWlmICghaGNvbikKKwkJZ290byBkb25lOworCisJY29ubiA9IGwyY2FwX2Nvbm5fYWRkKGhjb24sIDApOworCWlmICghY29ubikgeworCQloY2lfY29ubl9wdXQoaGNvbik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwllcnIgPSAwOworCisJLyogVXBkYXRlIHNvdXJjZSBhZGRyIG9mIHRoZSBzb2NrZXQgKi8KKwliYWNweShzcmMsIGNvbm4tPnNyYyk7CisKKwlsMmNhcF9jaGFuX2FkZChjb25uLCBzaywgTlVMTCk7CisKKwlzay0+c2tfc3RhdGUgPSBCVF9DT05ORUNUOworCWwyY2FwX3NvY2tfc2V0X3RpbWVyKHNrLCBzay0+c2tfc25kdGltZW8pOworCisJaWYgKGhjb24tPnN0YXRlID09IEJUX0NPTk5FQ1RFRCkgeworCQlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19TRVFQQUNLRVQpIHsKKwkJCXN0cnVjdCBsMmNhcF9jb25uX3JlcSByZXE7CisJCQlsMmNhcF9waShzayktPmlkZW50ID0gbDJjYXBfZ2V0X2lkZW50KGNvbm4pOworCQkJcmVxLnNjaWQgPSBfX2NwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+c2NpZCk7CisJCQlyZXEucHNtICA9IGwyY2FwX3BpKHNrKS0+cHNtOworCQkJbDJjYXBfc2VuZF9jbWQoY29ubiwgbDJjYXBfcGkoc2spLT5pZGVudCwKKwkJCQkJTDJDQVBfQ09OTl9SRVEsIHNpemVvZihyZXEpLCAmcmVxKTsKKwkJfSBlbHNlIHsKKwkJCWwyY2FwX3NvY2tfY2xlYXJfdGltZXIoc2spOworCQkJc2stPnNrX3N0YXRlID0gQlRfQ09OTkVDVEVEOworCQl9CisJfQorCitkb25lOgorCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOworCWhjaV9kZXZfcHV0KGhkZXYpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbDJjYXBfc29ja19jb25uZWN0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50IGFsZW4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfbDIgKmxhID0gKHN0cnVjdCBzb2NrYWRkcl9sMiAqKSBhZGRyOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCBlcnIgPSAwOworCisJbG9ja19zb2NrKHNrKTsKKworCUJUX0RCRygic2sgJXAiLCBzayk7CisKKwlpZiAoYWRkci0+c2FfZmFtaWx5ICE9IEFGX0JMVUVUT09USCB8fCBhbGVuIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9sMikpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChzay0+c2tfdHlwZSA9PSBTT0NLX1NFUVBBQ0tFVCAmJiAhbGEtPmwyX3BzbSkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJc3dpdGNoKHNrLT5za19zdGF0ZSkgeworCWNhc2UgQlRfQ09OTkVDVDoKKwljYXNlIEJUX0NPTk5FQ1QyOgorCWNhc2UgQlRfQ09ORklHOgorCQkvKiBBbHJlYWR5IGNvbm5lY3RpbmcgKi8KKwkJZ290byB3YWl0OworCisJY2FzZSBCVF9DT05ORUNURUQ6CisJCS8qIEFscmVhZHkgY29ubmVjdGVkICovCisJCWdvdG8gZG9uZTsKKworCWNhc2UgQlRfT1BFTjoKKwljYXNlIEJUX0JPVU5EOgorCQkvKiBDYW4gY29ubmVjdCAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVyciA9IC1FQkFERkQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBTZXQgZGVzdGluYXRpb24gYWRkcmVzcyBhbmQgcHNtICovCisJYmFjcHkoJmJ0X3NrKHNrKS0+ZHN0LCAmbGEtPmwyX2JkYWRkcik7CisJbDJjYXBfcGkoc2spLT5wc20gPSBsYS0+bDJfcHNtOworCisJaWYgKChlcnIgPSBsMmNhcF9kb19jb25uZWN0KHNrKSkpCisJCWdvdG8gZG9uZTsKKword2FpdDoKKwllcnIgPSBidF9zb2NrX3dhaXRfc3RhdGUoc2ssIEJUX0NPTk5FQ1RFRCwKKwkJCXNvY2tfc25kdGltZW8oc2ssIGZsYWdzICYgT19OT05CTE9DSykpOworZG9uZToKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbDJjYXBfc29ja19saXN0ZW4oc3RydWN0IHNvY2tldCAqc29jaywgaW50IGJhY2tsb2cpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJaW50IGVyciA9IDA7CisKKwlCVF9EQkcoInNrICVwIGJhY2tsb2cgJWQiLCBzaywgYmFja2xvZyk7CisKKwlsb2NrX3NvY2soc2spOworCisJaWYgKHNrLT5za19zdGF0ZSAhPSBCVF9CT1VORCB8fCBzb2NrLT50eXBlICE9IFNPQ0tfU0VRUEFDS0VUKSB7CisJCWVyciA9IC1FQkFERkQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoIWwyY2FwX3BpKHNrKS0+cHNtKSB7CisJCWJkYWRkcl90ICpzcmMgPSAmYnRfc2soc2spLT5zcmM7CisJCXUxNiBwc207CisKKwkJZXJyID0gLUVJTlZBTDsKKworCQl3cml0ZV9sb2NrX2JoKCZsMmNhcF9za19saXN0LmxvY2spOworCisJCWZvciAocHNtID0gMHgxMDAxOyBwc20gPCAweDExMDA7IHBzbSArPSAyKQorCQkJaWYgKCFfX2wyY2FwX2dldF9zb2NrX2J5X2FkZHIocHNtLCBzcmMpKSB7CisJCQkJbDJjYXBfcGkoc2spLT5wc20gICA9IGh0b2JzKHBzbSk7CisJCQkJbDJjYXBfcGkoc2spLT5zcG9ydCA9IGh0b2JzKHBzbSk7CisJCQkJZXJyID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKworCQl3cml0ZV91bmxvY2tfYmgoJmwyY2FwX3NrX2xpc3QubG9jayk7CisKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGRvbmU7CisJfQorCisJc2stPnNrX21heF9hY2tfYmFja2xvZyA9IGJhY2tsb2c7CisJc2stPnNrX2Fja19iYWNrbG9nID0gMDsKKwlzay0+c2tfc3RhdGUgPSBCVF9MSVNURU47CisKK2RvbmU6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGwyY2FwX3NvY2tfYWNjZXB0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrZXQgKm5ld3NvY2ssIGludCBmbGFncykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zaywgKm5zazsKKwlsb25nIHRpbWVvOworCWludCBlcnIgPSAwOworCisJbG9ja19zb2NrKHNrKTsKKworCWlmIChzay0+c2tfc3RhdGUgIT0gQlRfTElTVEVOKSB7CisJCWVyciA9IC1FQkFERkQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl0aW1lbyA9IHNvY2tfcmN2dGltZW8oc2ssIGZsYWdzICYgT19OT05CTE9DSyk7CisKKwlCVF9EQkcoInNrICVwIHRpbWVvICVsZCIsIHNrLCB0aW1lbyk7CisKKwkvKiBXYWl0IGZvciBhbiBpbmNvbWluZyBjb25uZWN0aW9uLiAod2FrZS1vbmUpLiAqLworCWFkZF93YWl0X3F1ZXVlX2V4Y2x1c2l2ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwl3aGlsZSAoIShuc2sgPSBidF9hY2NlcHRfZGVxdWV1ZShzaywgbmV3c29jaykpKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmICghdGltZW8pIHsKKwkJCWVyciA9IC1FQUdBSU47CisJCQlicmVhazsKKwkJfQorCisJCXJlbGVhc2Vfc29jayhzayk7CisJCXRpbWVvID0gc2NoZWR1bGVfdGltZW91dCh0aW1lbyk7CisJCWxvY2tfc29jayhzayk7CisKKwkJaWYgKHNrLT5za19zdGF0ZSAhPSBCVF9MSVNURU4pIHsKKwkJCWVyciA9IC1FQkFERkQ7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJZXJyID0gc29ja19pbnRyX2Vycm5vKHRpbWVvKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisKKwlpZiAoZXJyKQorCQlnb3RvIGRvbmU7CisKKwluZXdzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKworCUJUX0RCRygibmV3IHNvY2tldCAlcCIsIG5zayk7CisKK2RvbmU6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGwyY2FwX3NvY2tfZ2V0bmFtZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCAqbGVuLCBpbnQgcGVlcikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfbDIgKmxhID0gKHN0cnVjdCBzb2NrYWRkcl9sMiAqKSBhZGRyOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCisJQlRfREJHKCJzb2NrICVwLCBzayAlcCIsIHNvY2ssIHNrKTsKKworCWFkZHItPnNhX2ZhbWlseSA9IEFGX0JMVUVUT09USDsKKwkqbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9sMik7CisKKwlpZiAocGVlcikKKwkJYmFjcHkoJmxhLT5sMl9iZGFkZHIsICZidF9zayhzayktPmRzdCk7CisJZWxzZQorCQliYWNweSgmbGEtPmwyX2JkYWRkciwgJmJ0X3NrKHNrKS0+c3JjKTsKKworCWxhLT5sMl9wc20gPSBsMmNhcF9waShzayktPnBzbTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbDJjYXBfZG9fc2VuZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgaW50IGxlbikKK3sKKwlzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiA9IGwyY2FwX3BpKHNrKS0+Y29ubjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqKmZyYWc7CisJaW50IGVyciwgaGxlbiwgY291bnQsIHNlbnQ9MDsKKwlzdHJ1Y3QgbDJjYXBfaGRyICpsaDsKKworCUJUX0RCRygic2sgJXAgbGVuICVkIiwgc2ssIGxlbik7CisKKwkvKiBGaXJzdCBmcmFnbWVudCAod2l0aCBMMkNBUCBoZWFkZXIpICovCisJaWYgKHNrLT5za190eXBlID09IFNPQ0tfREdSQU0pCisJCWhsZW4gPSBMMkNBUF9IRFJfU0laRSArIDI7CisJZWxzZQorCQlobGVuID0gTDJDQVBfSERSX1NJWkU7CisKKwljb3VudCA9IG1pbl90KHVuc2lnbmVkIGludCwgKGNvbm4tPm10dSAtIGhsZW4pLCBsZW4pOworCisJc2tiID0gYnRfc2tiX3NlbmRfYWxsb2Moc2ssIGhsZW4gKyBjb3VudCwKKwkJCW1zZy0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlULCAmZXJyKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIGVycjsKKworCS8qIENyZWF0ZSBMMkNBUCBoZWFkZXIgKi8KKwlsaCA9IChzdHJ1Y3QgbDJjYXBfaGRyICopIHNrYl9wdXQoc2tiLCBMMkNBUF9IRFJfU0laRSk7CisJbGgtPmNpZCA9IF9fY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5kY2lkKTsKKwlsaC0+bGVuID0gX19jcHVfdG9fbGUxNihsZW4gKyAoaGxlbiAtIEwyQ0FQX0hEUl9TSVpFKSk7CisKKwlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19ER1JBTSkKKwkJcHV0X3VuYWxpZ25lZChsMmNhcF9waShzayktPnBzbSwgKHUxNiAqKSBza2JfcHV0KHNrYiwgMikpOworCisJaWYgKG1lbWNweV9mcm9taW92ZWMoc2tiX3B1dChza2IsIGNvdW50KSwgbXNnLT5tc2dfaW92LCBjb3VudCkpIHsKKwkJZXJyID0gLUVGQVVMVDsKKwkJZ290byBmYWlsOworCX0KKworCXNlbnQgKz0gY291bnQ7CisJbGVuICAtPSBjb3VudDsKKworCS8qIENvbnRpbnVhdGlvbiBmcmFnbWVudHMgKG5vIEwyQ0FQIGhlYWRlcikgKi8KKwlmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0OworCXdoaWxlIChsZW4pIHsKKwkJY291bnQgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbm4tPm10dSwgbGVuKTsKKworCQkqZnJhZyA9IGJ0X3NrYl9zZW5kX2FsbG9jKHNrLCBjb3VudCwgbXNnLT5tc2dfZmxhZ3MgJiBNU0dfRE9OVFdBSVQsICZlcnIpOworCQlpZiAoISpmcmFnKQorCQkJZ290byBmYWlsOworCQkKKwkJaWYgKG1lbWNweV9mcm9taW92ZWMoc2tiX3B1dCgqZnJhZywgY291bnQpLCBtc2ctPm1zZ19pb3YsIGNvdW50KSkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCXNlbnQgKz0gY291bnQ7CisJCWxlbiAgLT0gY291bnQ7CisKKwkJZnJhZyA9ICYoKmZyYWcpLT5uZXh0OworCX0KKworCWlmICgoZXJyID0gaGNpX3NlbmRfYWNsKGNvbm4tPmhjb24sIHNrYiwgMCkpIDwgMCkKKwkJZ290byBmYWlsOworCisJcmV0dXJuIHNlbnQ7CisKK2ZhaWw6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBsMmNhcF9zb2NrX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJaW50IGVyciA9IDA7CisKKwlCVF9EQkcoInNvY2sgJXAsIHNrICVwIiwgc29jaywgc2spOworCisJaWYgKHNrLT5za19lcnIpCisJCXJldHVybiBzb2NrX2Vycm9yKHNrKTsKKworCWlmIChtc2ctPm1zZ19mbGFncyAmIE1TR19PT0IpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCS8qIENoZWNrIG91dGdvaW5nIE1UVSAqLworCWlmIChzay0+c2tfdHlwZSAhPSBTT0NLX1JBVyAmJiBsZW4gPiBsMmNhcF9waShzayktPm9tdHUpCisJCXJldHVybiAtRUlOVkFMOworCisJbG9ja19zb2NrKHNrKTsKKworCWlmIChzay0+c2tfc3RhdGUgPT0gQlRfQ09OTkVDVEVEKQorCQllcnIgPSBsMmNhcF9kb19zZW5kKHNrLCBtc2csIGxlbik7CisJZWxzZQorCQllcnIgPSAtRU5PVENPTk47CisKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbDJjYXBfc29ja19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGwyY2FwX29wdGlvbnMgb3B0czsKKwlpbnQgZXJyID0gMCwgbGVuOworCXUzMiBvcHQ7CisKKwlCVF9EQkcoInNrICVwIiwgc2spOworCisJbG9ja19zb2NrKHNrKTsKKworCXN3aXRjaCAob3B0bmFtZSkgeworCWNhc2UgTDJDQVBfT1BUSU9OUzoKKwkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBzaXplb2Yob3B0cyksIG9wdGxlbik7CisJCWlmIChjb3B5X2Zyb21fdXNlcigoY2hhciAqKSAmb3B0cywgb3B0dmFsLCBsZW4pKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJbDJjYXBfcGkoc2spLT5pbXR1ICA9IG9wdHMuaW10dTsKKwkJbDJjYXBfcGkoc2spLT5vbXR1ICA9IG9wdHMub210dTsKKwkJYnJlYWs7CisKKwljYXNlIEwyQ0FQX0xNOgorCQlpZiAoZ2V0X3VzZXIob3B0LCAodTMyIF9fdXNlciAqKSBvcHR2YWwpKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlsMmNhcF9waShzayktPmxpbmtfbW9kZSA9IG9wdDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSAtRU5PUFJPVE9PUFQ7CisJCWJyZWFrOworCX0KKworCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBsMmNhcF9zb2NrX2dldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBsMmNhcF9vcHRpb25zIG9wdHM7CisJc3RydWN0IGwyY2FwX2Nvbm5pbmZvIGNpbmZvOworCWludCBsZW4sIGVyciA9IDA7CisKKwlCVF9EQkcoInNrICVwIiwgc2spOworCisJaWYgKGdldF91c2VyKGxlbiwgb3B0bGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlsb2NrX3NvY2soc2spOworCisJc3dpdGNoIChvcHRuYW1lKSB7CisJY2FzZSBMMkNBUF9PUFRJT05TOgorCQlvcHRzLmltdHUgICAgID0gbDJjYXBfcGkoc2spLT5pbXR1OworCQlvcHRzLm9tdHUgICAgID0gbDJjYXBfcGkoc2spLT5vbXR1OworCQlvcHRzLmZsdXNoX3RvID0gbDJjYXBfcGkoc2spLT5mbHVzaF90bzsKKwkJb3B0cy5tb2RlICAgICA9IDB4MDA7CisKKwkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sIHNpemVvZihvcHRzKSk7CisJCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCAoY2hhciAqKSAmb3B0cywgbGVuKSkKKwkJCWVyciA9IC1FRkFVTFQ7CisKKwkJYnJlYWs7CisKKwljYXNlIEwyQ0FQX0xNOgorCQlpZiAocHV0X3VzZXIobDJjYXBfcGkoc2spLT5saW5rX21vZGUsICh1MzIgX191c2VyICopIG9wdHZhbCkpCisJCQllcnIgPSAtRUZBVUxUOworCQlicmVhazsKKworCWNhc2UgTDJDQVBfQ09OTklORk86CisJCWlmIChzay0+c2tfc3RhdGUgIT0gQlRfQ09OTkVDVEVEKSB7CisJCQllcnIgPSAtRU5PVENPTk47CisJCQlicmVhazsKKwkJfQorCisJCWNpbmZvLmhjaV9oYW5kbGUgPSBsMmNhcF9waShzayktPmNvbm4tPmhjb24tPmhhbmRsZTsKKwkJbWVtY3B5KGNpbmZvLmRldl9jbGFzcywgbDJjYXBfcGkoc2spLT5jb25uLT5oY29uLT5kZXZfY2xhc3MsIDMpOworCisJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuLCBzaXplb2YoY2luZm8pKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsIChjaGFyICopICZjaW5mbywgbGVuKSkKKwkJCWVyciA9IC1FRkFVTFQ7CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSAtRU5PUFJPVE9PUFQ7CisJCWJyZWFrOworCX0KKworCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBsMmNhcF9zb2NrX3NodXRkb3duKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBob3cpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJaW50IGVyciA9IDA7CisKKwlCVF9EQkcoInNvY2sgJXAsIHNrICVwIiwgc29jaywgc2spOworCisJaWYgKCFzaykKKwkJcmV0dXJuIDA7CisKKwlsb2NrX3NvY2soc2spOworCWlmICghc2stPnNrX3NodXRkb3duKSB7CisJCXNrLT5za19zaHV0ZG93biA9IFNIVVRET1dOX01BU0s7CisJCWwyY2FwX3NvY2tfY2xlYXJfdGltZXIoc2spOworCQlfX2wyY2FwX3NvY2tfY2xvc2Uoc2ssIDApOworCisJCWlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfTElOR0VSKSAmJiBzay0+c2tfbGluZ2VydGltZSkKKwkJCWVyciA9IGJ0X3NvY2tfd2FpdF9zdGF0ZShzaywgQlRfQ0xPU0VELCBzay0+c2tfbGluZ2VydGltZSk7CisJfQorCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBsMmNhcF9zb2NrX3JlbGVhc2Uoc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlpbnQgZXJyOworCisJQlRfREJHKCJzb2NrICVwLCBzayAlcCIsIHNvY2ssIHNrKTsKKworCWlmICghc2spCisJCXJldHVybiAwOworCisJZXJyID0gbDJjYXBfc29ja19zaHV0ZG93bihzb2NrLCAyKTsKKworCXNvY2tfb3JwaGFuKHNrKTsKKwlsMmNhcF9zb2NrX2tpbGwoc2spOworCXJldHVybiBlcnI7Cit9CisKKy8qIC0tLS0gTDJDQVAgY2hhbm5lbHMgLS0tLSAqLworc3RhdGljIHN0cnVjdCBzb2NrICpfX2wyY2FwX2dldF9jaGFuX2J5X2RjaWQoc3RydWN0IGwyY2FwX2NoYW5fbGlzdCAqbCwgdTE2IGNpZCkKK3sKKwlzdHJ1Y3Qgc29jayAqczsKKwlmb3IgKHMgPSBsLT5oZWFkOyBzOyBzID0gbDJjYXBfcGkocyktPm5leHRfYykgeworCQlpZiAobDJjYXBfcGkocyktPmRjaWQgPT0gY2lkKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBzOworfQorCitzdGF0aWMgc3RydWN0IHNvY2sgKl9fbDJjYXBfZ2V0X2NoYW5fYnlfc2NpZChzdHJ1Y3QgbDJjYXBfY2hhbl9saXN0ICpsLCB1MTYgY2lkKQoreworCXN0cnVjdCBzb2NrICpzOworCWZvciAocyA9IGwtPmhlYWQ7IHM7IHMgPSBsMmNhcF9waShzKS0+bmV4dF9jKSB7CisJCWlmIChsMmNhcF9waShzKS0+c2NpZCA9PSBjaWQpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIHM7Cit9CisKKy8qIEZpbmQgY2hhbm5lbCB3aXRoIGdpdmVuIFNDSUQuCisgKiBSZXR1cm5zIGxvY2tlZCBzb2NrZXQgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNvY2sgKmwyY2FwX2dldF9jaGFuX2J5X3NjaWQoc3RydWN0IGwyY2FwX2NoYW5fbGlzdCAqbCwgdTE2IGNpZCkKK3sKKwlzdHJ1Y3Qgc29jayAqczsKKwlyZWFkX2xvY2soJmwtPmxvY2spOworCXMgPSBfX2wyY2FwX2dldF9jaGFuX2J5X3NjaWQobCwgY2lkKTsKKwlpZiAocykgYmhfbG9ja19zb2NrKHMpOworCXJlYWRfdW5sb2NrKCZsLT5sb2NrKTsKKwlyZXR1cm4gczsKK30KKworc3RhdGljIHN0cnVjdCBzb2NrICpfX2wyY2FwX2dldF9jaGFuX2J5X2lkZW50KHN0cnVjdCBsMmNhcF9jaGFuX2xpc3QgKmwsIHU4IGlkZW50KQoreworCXN0cnVjdCBzb2NrICpzOworCWZvciAocyA9IGwtPmhlYWQ7IHM7IHMgPSBsMmNhcF9waShzKS0+bmV4dF9jKSB7CisJCWlmIChsMmNhcF9waShzKS0+aWRlbnQgPT0gaWRlbnQpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNvY2sgKmwyY2FwX2dldF9jaGFuX2J5X2lkZW50KHN0cnVjdCBsMmNhcF9jaGFuX2xpc3QgKmwsIHU4IGlkZW50KQoreworCXN0cnVjdCBzb2NrICpzOworCXJlYWRfbG9jaygmbC0+bG9jayk7CisJcyA9IF9fbDJjYXBfZ2V0X2NoYW5fYnlfaWRlbnQobCwgaWRlbnQpOworCWlmIChzKSBiaF9sb2NrX3NvY2socyk7CisJcmVhZF91bmxvY2soJmwtPmxvY2spOworCXJldHVybiBzOworfQorCitzdGF0aWMgdTE2IGwyY2FwX2FsbG9jX2NpZChzdHJ1Y3QgbDJjYXBfY2hhbl9saXN0ICpsKQoreworCXUxNiBjaWQgPSAweDAwNDA7CisKKwlmb3IgKDsgY2lkIDwgMHhmZmZmOyBjaWQrKykgeworCQlpZighX19sMmNhcF9nZXRfY2hhbl9ieV9zY2lkKGwsIGNpZCkpCisJCQlyZXR1cm4gY2lkOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19sMmNhcF9jaGFuX2xpbmsoc3RydWN0IGwyY2FwX2NoYW5fbGlzdCAqbCwgc3RydWN0IHNvY2sgKnNrKQoreworCXNvY2tfaG9sZChzayk7CisKKwlpZiAobC0+aGVhZCkKKwkJbDJjYXBfcGkobC0+aGVhZCktPnByZXZfYyA9IHNrOworCisJbDJjYXBfcGkoc2spLT5uZXh0X2MgPSBsLT5oZWFkOworCWwyY2FwX3BpKHNrKS0+cHJldl9jID0gTlVMTDsKKwlsLT5oZWFkID0gc2s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsMmNhcF9jaGFuX3VubGluayhzdHJ1Y3QgbDJjYXBfY2hhbl9saXN0ICpsLCBzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHNvY2sgKm5leHQgPSBsMmNhcF9waShzayktPm5leHRfYywgKnByZXYgPSBsMmNhcF9waShzayktPnByZXZfYzsKKworCXdyaXRlX2xvY2soJmwtPmxvY2spOworCWlmIChzayA9PSBsLT5oZWFkKQorCQlsLT5oZWFkID0gbmV4dDsKKworCWlmIChuZXh0KQorCQlsMmNhcF9waShuZXh0KS0+cHJldl9jID0gcHJldjsKKwlpZiAocHJldikKKwkJbDJjYXBfcGkocHJldiktPm5leHRfYyA9IG5leHQ7CisJd3JpdGVfdW5sb2NrKCZsLT5sb2NrKTsKKworCV9fc29ja19wdXQoc2spOworfQorCitzdGF0aWMgdm9pZCBfX2wyY2FwX2NoYW5fYWRkKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrICpwYXJlbnQpCit7CisJc3RydWN0IGwyY2FwX2NoYW5fbGlzdCAqbCA9ICZjb25uLT5jaGFuX2xpc3Q7CisKKwlCVF9EQkcoImNvbm4gJXAsIHBzbSAweCUyLjJ4LCBkY2lkIDB4JTQuNHgiLCBjb25uLCBsMmNhcF9waShzayktPnBzbSwgbDJjYXBfcGkoc2spLT5kY2lkKTsKKworCWwyY2FwX3BpKHNrKS0+Y29ubiA9IGNvbm47CisKKwlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19TRVFQQUNLRVQpIHsKKwkJLyogQWxsb2MgQ0lEIGZvciBjb25uZWN0aW9uLW9yaWVudGVkIHNvY2tldCAqLworCQlsMmNhcF9waShzayktPnNjaWQgPSBsMmNhcF9hbGxvY19jaWQobCk7CisJfSBlbHNlIGlmIChzay0+c2tfdHlwZSA9PSBTT0NLX0RHUkFNKSB7CisJCS8qIENvbm5lY3Rpb25sZXNzIHNvY2tldCAqLworCQlsMmNhcF9waShzayktPnNjaWQgPSAweDAwMDI7CisJCWwyY2FwX3BpKHNrKS0+ZGNpZCA9IDB4MDAwMjsKKwkJbDJjYXBfcGkoc2spLT5vbXR1ID0gTDJDQVBfREVGQVVMVF9NVFU7CisJfSBlbHNlIHsKKwkJLyogUmF3IHNvY2tldCBjYW4gc2VuZC9yZWN2IHNpZ25hbGxpbmcgbWVzc2FnZXMgb25seSAqLworCQlsMmNhcF9waShzayktPnNjaWQgPSAweDAwMDE7CisJCWwyY2FwX3BpKHNrKS0+ZGNpZCA9IDB4MDAwMTsKKwkJbDJjYXBfcGkoc2spLT5vbXR1ID0gTDJDQVBfREVGQVVMVF9NVFU7CisJfQorCisJX19sMmNhcF9jaGFuX2xpbmsobCwgc2spOworCisJaWYgKHBhcmVudCkKKwkJYnRfYWNjZXB0X2VucXVldWUocGFyZW50LCBzayk7Cit9CisKKy8qIERlbGV0ZSBjaGFubmVsLiAKKyAqIE11c3QgYmUgY2FsbGVkIG9uIHRoZSBsb2NrZWQgc29ja2V0LiAqLworc3RhdGljIHZvaWQgbDJjYXBfY2hhbl9kZWwoc3RydWN0IHNvY2sgKnNrLCBpbnQgZXJyKQoreworCXN0cnVjdCBsMmNhcF9jb25uICpjb25uID0gbDJjYXBfcGkoc2spLT5jb25uOworCXN0cnVjdCBzb2NrICpwYXJlbnQgPSBidF9zayhzayktPnBhcmVudDsKKworCWwyY2FwX3NvY2tfY2xlYXJfdGltZXIoc2spOworCisJQlRfREJHKCJzayAlcCwgY29ubiAlcCwgZXJyICVkIiwgc2ssIGNvbm4sIGVycik7CisKKwlpZiAoY29ubikgeyAKKwkJLyogVW5saW5rIGZyb20gY2hhbm5lbCBsaXN0ICovCisJCWwyY2FwX2NoYW5fdW5saW5rKCZjb25uLT5jaGFuX2xpc3QsIHNrKTsKKwkJbDJjYXBfcGkoc2spLT5jb25uID0gTlVMTDsKKwkJaGNpX2Nvbm5fcHV0KGNvbm4tPmhjb24pOworCX0KKworCXNrLT5za19zdGF0ZSAgPSBCVF9DTE9TRUQ7CisJc29ja19zZXRfZmxhZyhzaywgU09DS19aQVBQRUQpOworCisJaWYgKGVycikKKwkJc2stPnNrX2VyciA9IGVycjsKKworCWlmIChwYXJlbnQpIHsKKwkJYnRfYWNjZXB0X3VubGluayhzayk7CisJCXBhcmVudC0+c2tfZGF0YV9yZWFkeShwYXJlbnQsIDApOworCX0gZWxzZQorCQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKK30KKworc3RhdGljIHZvaWQgbDJjYXBfY29ubl9yZWFkeShzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubikKK3sKKwlzdHJ1Y3QgbDJjYXBfY2hhbl9saXN0ICpsID0gJmNvbm4tPmNoYW5fbGlzdDsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlCVF9EQkcoImNvbm4gJXAiLCBjb25uKTsKKworCXJlYWRfbG9jaygmbC0+bG9jayk7CisKKwlmb3IgKHNrID0gbC0+aGVhZDsgc2s7IHNrID0gbDJjYXBfcGkoc2spLT5uZXh0X2MpIHsKKwkJYmhfbG9ja19zb2NrKHNrKTsKKworCQlpZiAoc2stPnNrX3R5cGUgIT0gU09DS19TRVFQQUNLRVQpIHsKKwkJCWwyY2FwX3NvY2tfY2xlYXJfdGltZXIoc2spOworCQkJc2stPnNrX3N0YXRlID0gQlRfQ09OTkVDVEVEOworCQkJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CisJCX0gZWxzZSBpZiAoc2stPnNrX3N0YXRlID09IEJUX0NPTk5FQ1QpIHsKKwkJCXN0cnVjdCBsMmNhcF9jb25uX3JlcSByZXE7CisJCQlsMmNhcF9waShzayktPmlkZW50ID0gbDJjYXBfZ2V0X2lkZW50KGNvbm4pOworCQkJcmVxLnNjaWQgPSBfX2NwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+c2NpZCk7CisJCQlyZXEucHNtICA9IGwyY2FwX3BpKHNrKS0+cHNtOworCQkJbDJjYXBfc2VuZF9jbWQoY29ubiwgbDJjYXBfcGkoc2spLT5pZGVudCwgTDJDQVBfQ09OTl9SRVEsIHNpemVvZihyZXEpLCAmcmVxKTsKKwkJfQorCisJCWJoX3VubG9ja19zb2NrKHNrKTsKKwl9CisKKwlyZWFkX3VubG9jaygmbC0+bG9jayk7Cit9CisKKy8qIE5vdGlmeSBzb2NrZXRzIHRoYXQgd2UgY2Fubm90IGd1YXJhbnR5IHJlbGlhYmlsaXR5IGFueW1vcmUgKi8KK3N0YXRpYyB2b2lkIGwyY2FwX2Nvbm5fdW5yZWxpYWJsZShzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgaW50IGVycikKK3sKKwlzdHJ1Y3QgbDJjYXBfY2hhbl9saXN0ICpsID0gJmNvbm4tPmNoYW5fbGlzdDsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlCVF9EQkcoImNvbm4gJXAiLCBjb25uKTsKKworCXJlYWRfbG9jaygmbC0+bG9jayk7CisJZm9yIChzayA9IGwtPmhlYWQ7IHNrOyBzayA9IGwyY2FwX3BpKHNrKS0+bmV4dF9jKSB7CisJCWlmIChsMmNhcF9waShzayktPmxpbmtfbW9kZSAmIEwyQ0FQX0xNX1JFTElBQkxFKQorCQkJc2stPnNrX2VyciA9IGVycjsKKwl9CisJcmVhZF91bmxvY2soJmwtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBsMmNhcF9jaGFuX3JlYWR5KHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3Qgc29jayAqcGFyZW50ID0gYnRfc2soc2spLT5wYXJlbnQ7CisKKwlCVF9EQkcoInNrICVwLCBwYXJlbnQgJXAiLCBzaywgcGFyZW50KTsKKworCWwyY2FwX3BpKHNrKS0+Y29uZl9zdGF0ZSA9IDA7CisJbDJjYXBfc29ja19jbGVhcl90aW1lcihzayk7CisKKwlpZiAoIXBhcmVudCkgeworCQkvKiBPdXRnb2luZyBjaGFubmVsLgorCQkgKiBXYWtlIHVwIHNvY2tldCBzbGVlcGluZyBvbiBjb25uZWN0LgorCQkgKi8KKwkJc2stPnNrX3N0YXRlID0gQlRfQ09OTkVDVEVEOworCQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKKwl9IGVsc2UgeworCQkvKiBJbmNvbWluZyBjaGFubmVsLgorCQkgKiBXYWtlIHVwIHNvY2tldCBzbGVlcGluZyBvbiBhY2NlcHQuCisJCSAqLworCQlwYXJlbnQtPnNrX2RhdGFfcmVhZHkocGFyZW50LCAwKTsKKwl9Cit9CisKKy8qIENvcHkgZnJhbWUgdG8gYWxsIHJhdyBzb2NrZXRzIG9uIHRoYXQgY29ubmVjdGlvbiAqLworc3RhdGljIHZvaWQgbDJjYXBfcmF3X3JlY3Yoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGwyY2FwX2NoYW5fbGlzdCAqbCA9ICZjb25uLT5jaGFuX2xpc3Q7CisJc3RydWN0IHNrX2J1ZmYgKm5za2I7CisJc3RydWN0IHNvY2sgKiBzazsKKworCUJUX0RCRygiY29ubiAlcCIsIGNvbm4pOworCisJcmVhZF9sb2NrKCZsLT5sb2NrKTsKKwlmb3IgKHNrID0gbC0+aGVhZDsgc2s7IHNrID0gbDJjYXBfcGkoc2spLT5uZXh0X2MpIHsKKwkJaWYgKHNrLT5za190eXBlICE9IFNPQ0tfUkFXKQorCQkJY29udGludWU7CisKKwkJLyogRG9uJ3Qgc2VuZCBmcmFtZSB0byB0aGUgc29ja2V0IGl0IGNhbWUgZnJvbSAqLworCQlpZiAoc2tiLT5zayA9PSBzaykKKwkJCWNvbnRpbnVlOworCisJCWlmICghKG5za2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKSkpCisJCQljb250aW51ZTsKKworCQlpZiAoc29ja19xdWV1ZV9yY3Zfc2tiKHNrLCBuc2tiKSkKKwkJCWtmcmVlX3NrYihuc2tiKTsKKwl9CisJcmVhZF91bmxvY2soJmwtPmxvY2spOworfQorCisvKiAtLS0tIEwyQ0FQIHNpZ25hbGxpbmcgY29tbWFuZHMgLS0tLSAqLworc3RhdGljIHN0cnVjdCBza19idWZmICpsMmNhcF9idWlsZF9jbWQoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sCisJCQkJdTggY29kZSwgdTggaWRlbnQsIHUxNiBkbGVuLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBza19idWZmICpza2IsICoqZnJhZzsKKwlzdHJ1Y3QgbDJjYXBfY21kX2hkciAqY21kOworCXN0cnVjdCBsMmNhcF9oZHIgKmxoOworCWludCBsZW4sIGNvdW50OworCisJQlRfREJHKCJjb25uICVwLCBjb2RlIDB4JTIuMngsIGlkZW50IDB4JTIuMngsIGxlbiAlZCIsIGNvbm4sIGNvZGUsIGlkZW50LCBkbGVuKTsKKworCWxlbiA9IEwyQ0FQX0hEUl9TSVpFICsgTDJDQVBfQ01EX0hEUl9TSVpFICsgZGxlbjsKKwljb3VudCA9IG1pbl90KHVuc2lnbmVkIGludCwgY29ubi0+bXR1LCBsZW4pOworCisJc2tiID0gYnRfc2tiX2FsbG9jKGNvdW50LCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwlsaCA9IChzdHJ1Y3QgbDJjYXBfaGRyICopIHNrYl9wdXQoc2tiLCBMMkNBUF9IRFJfU0laRSk7CisJbGgtPmxlbiA9IF9fY3B1X3RvX2xlMTYoTDJDQVBfQ01EX0hEUl9TSVpFICsgZGxlbik7CisJbGgtPmNpZCA9IF9fY3B1X3RvX2xlMTYoMHgwMDAxKTsKKworCWNtZCA9IChzdHJ1Y3QgbDJjYXBfY21kX2hkciAqKSBza2JfcHV0KHNrYiwgTDJDQVBfQ01EX0hEUl9TSVpFKTsKKwljbWQtPmNvZGUgID0gY29kZTsKKwljbWQtPmlkZW50ID0gaWRlbnQ7CisJY21kLT5sZW4gICA9IF9fY3B1X3RvX2xlMTYoZGxlbik7CisKKwlpZiAoZGxlbikgeworCQljb3VudCAtPSBMMkNBUF9IRFJfU0laRSArIEwyQ0FQX0NNRF9IRFJfU0laRTsKKwkJbWVtY3B5KHNrYl9wdXQoc2tiLCBjb3VudCksIGRhdGEsIGNvdW50KTsKKwkJZGF0YSArPSBjb3VudDsKKwl9CisKKwlsZW4gLT0gc2tiLT5sZW47CisKKwkvKiBDb250aW51YXRpb24gZnJhZ21lbnRzIChubyBMMkNBUCBoZWFkZXIpICovCisJZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKKwl3aGlsZSAobGVuKSB7CisJCWNvdW50ID0gbWluX3QodW5zaWduZWQgaW50LCBjb25uLT5tdHUsIGxlbik7CisKKwkJKmZyYWcgPSBidF9za2JfYWxsb2MoY291bnQsIEdGUF9BVE9NSUMpOworCQlpZiAoISpmcmFnKQorCQkJZ290byBmYWlsOworCisJCW1lbWNweShza2JfcHV0KCpmcmFnLCBjb3VudCksIGRhdGEsIGNvdW50KTsKKworCQlsZW4gIC09IGNvdW50OworCQlkYXRhICs9IGNvdW50OworCisJCWZyYWcgPSAmKCpmcmFnKS0+bmV4dDsKKwl9CisKKwlyZXR1cm4gc2tiOworCitmYWlsOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIGludCBsMmNhcF9nZXRfY29uZl9vcHQodm9pZCAqKnB0ciwgaW50ICp0eXBlLCBpbnQgKm9sZW4sIHVuc2lnbmVkIGxvbmcgKnZhbCkKK3sKKwlzdHJ1Y3QgbDJjYXBfY29uZl9vcHQgKm9wdCA9ICpwdHI7CisJaW50IGxlbjsKKworCWxlbiA9IEwyQ0FQX0NPTkZfT1BUX1NJWkUgKyBvcHQtPmxlbjsKKwkqcHRyICs9IGxlbjsKKworCSp0eXBlID0gb3B0LT50eXBlOworCSpvbGVuID0gb3B0LT5sZW47CisKKwlzd2l0Y2ggKG9wdC0+bGVuKSB7CisJY2FzZSAxOgorCQkqdmFsID0gKigodTggKikgb3B0LT52YWwpOworCQlicmVhazsKKworCWNhc2UgMjoKKwkJKnZhbCA9IF9fbGUxNl90b19jcHUoKigodTE2ICopb3B0LT52YWwpKTsKKwkJYnJlYWs7CisKKwljYXNlIDQ6CisJCSp2YWwgPSBfX2xlMzJfdG9fY3B1KCooKHUzMiAqKW9wdC0+dmFsKSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJKnZhbCA9ICh1bnNpZ25lZCBsb25nKSBvcHQtPnZhbDsKKwkJYnJlYWs7CisJfQorCisJQlRfREJHKCJ0eXBlIDB4JTIuMnggbGVuICVkIHZhbCAweCVseCIsICp0eXBlLCBvcHQtPmxlbiwgKnZhbCk7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGwyY2FwX3BhcnNlX2NvbmZfcmVxKHN0cnVjdCBzb2NrICpzaywgdm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKwlpbnQgdHlwZSwgaGludCwgb2xlbjsgCisJdW5zaWduZWQgbG9uZyB2YWw7CisJdm9pZCAqcHRyID0gZGF0YTsKKworCUJUX0RCRygic2sgJXAgbGVuICVkIiwgc2ssIGxlbik7CisKKwl3aGlsZSAobGVuID49IEwyQ0FQX0NPTkZfT1BUX1NJWkUpIHsKKwkJbGVuIC09IGwyY2FwX2dldF9jb25mX29wdCgmcHRyLCAmdHlwZSwgJm9sZW4sICZ2YWwpOworCisJCWhpbnQgID0gdHlwZSAmIDB4ODA7CisJCXR5cGUgJj0gMHg3ZjsKKworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBMMkNBUF9DT05GX01UVToKKwkJCWwyY2FwX3BpKHNrKS0+Y29uZl9tdHUgPSB2YWw7CisJCQlicmVhazsKKworCQljYXNlIEwyQ0FQX0NPTkZfRkxVU0hfVE86CisJCQlsMmNhcF9waShzayktPmZsdXNoX3RvID0gdmFsOworCQkJYnJlYWs7CisKKwkJY2FzZSBMMkNBUF9DT05GX1FPUzoKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlpZiAoaGludCkKKwkJCQlicmVhazsKKworCQkJLyogRklYTUU6IFJlamVjdCB1bmtub3duIG9wdGlvbiAqLworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGwyY2FwX2FkZF9jb25mX29wdCh2b2lkICoqcHRyLCB1OCB0eXBlLCB1OCBsZW4sIHVuc2lnbmVkIGxvbmcgdmFsKQoreworCXN0cnVjdCBsMmNhcF9jb25mX29wdCAqb3B0ID0gKnB0cjsKKworCUJUX0RCRygidHlwZSAweCUyLjJ4IGxlbiAlZCB2YWwgMHglbHgiLCB0eXBlLCBsZW4sIHZhbCk7CisKKwlvcHQtPnR5cGUgPSB0eXBlOworCW9wdC0+bGVuICA9IGxlbjsKKworCXN3aXRjaCAobGVuKSB7CisJY2FzZSAxOgorCQkqKCh1OCAqKSBvcHQtPnZhbCkgID0gdmFsOworCQlicmVhazsKKworCWNhc2UgMjoKKwkJKigodTE2ICopIG9wdC0+dmFsKSA9IF9fY3B1X3RvX2xlMTYodmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIDQ6CisJCSooKHUzMiAqKSBvcHQtPnZhbCkgPSBfX2NwdV90b19sZTMyKHZhbCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJbWVtY3B5KG9wdC0+dmFsLCAodm9pZCAqKSB2YWwsIGxlbik7CisJCWJyZWFrOworCX0KKworCSpwdHIgKz0gTDJDQVBfQ09ORl9PUFRfU0laRSArIGxlbjsKK30KKworc3RhdGljIGludCBsMmNhcF9idWlsZF9jb25mX3JlcShzdHJ1Y3Qgc29jayAqc2ssIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGwyY2FwX3BpbmZvICpwaSA9IGwyY2FwX3BpKHNrKTsKKwlzdHJ1Y3QgbDJjYXBfY29uZl9yZXEgKnJlcSA9IGRhdGE7CisJdm9pZCAqcHRyID0gcmVxLT5kYXRhOworCisJQlRfREJHKCJzayAlcCIsIHNrKTsKKworCWlmIChwaS0+aW10dSAhPSBMMkNBUF9ERUZBVUxUX01UVSkKKwkJbDJjYXBfYWRkX2NvbmZfb3B0KCZwdHIsIEwyQ0FQX0NPTkZfTVRVLCAyLCBwaS0+aW10dSk7CisKKwkvKiBGSVhNRTogTmVlZCBhY3R1YWwgdmFsdWUgb2YgdGhlIGZsdXNoIHRpbWVvdXQgKi8KKwkvL2lmIChmbHVzaF90byAhPSBMMkNBUF9ERUZBVUxUX0ZMVVNIX1RPKQorCS8vICAgbDJjYXBfYWRkX2NvbmZfb3B0KCZwdHIsIEwyQ0FQX0NPTkZfRkxVU0hfVE8sIDIsIHBpLT5mbHVzaF90byk7CisKKwlyZXEtPmRjaWQgID0gX19jcHVfdG9fbGUxNihwaS0+ZGNpZCk7CisJcmVxLT5mbGFncyA9IF9fY3B1X3RvX2xlMTYoMCk7CisKKwlyZXR1cm4gcHRyIC0gZGF0YTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbDJjYXBfY29uZl9vdXRwdXQoc3RydWN0IHNvY2sgKnNrLCB2b2lkICoqcHRyKQoreworCXN0cnVjdCBsMmNhcF9waW5mbyAqcGkgPSBsMmNhcF9waShzayk7CisJaW50IHJlc3VsdCA9IDA7CisKKwkvKiBDb25maWd1cmUgb3V0cHV0IG9wdGlvbnMgYW5kIGxldCB0aGUgb3RoZXIgc2lkZSBrbm93CisJICogd2hpY2ggb25lcyB3ZSBkb24ndCBsaWtlLiAqLworCWlmIChwaS0+Y29uZl9tdHUgPCBwaS0+b210dSkgeworCQlsMmNhcF9hZGRfY29uZl9vcHQocHRyLCBMMkNBUF9DT05GX01UVSwgMiwgcGktPm9tdHUpOworCQlyZXN1bHQgPSBMMkNBUF9DT05GX1VOQUNDRVBUOworCX0gZWxzZSB7CisJCXBpLT5vbXR1ID0gcGktPmNvbmZfbXR1OworCX0KKworCUJUX0RCRygic2sgJXAgcmVzdWx0ICVkIiwgc2ssIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBsMmNhcF9idWlsZF9jb25mX3JzcChzdHJ1Y3Qgc29jayAqc2ssIHZvaWQgKmRhdGEsIGludCAqcmVzdWx0KQoreworCXN0cnVjdCBsMmNhcF9jb25mX3JzcCAqcnNwID0gZGF0YTsKKwl2b2lkICpwdHIgPSByc3AtPmRhdGE7CisJdTE2IGZsYWdzID0gMDsKKworCUJUX0RCRygic2sgJXAgY29tcGxldGUgJWQiLCBzaywgcmVzdWx0ID8gMSA6IDApOworCisJaWYgKHJlc3VsdCkKKwkJKnJlc3VsdCA9IGwyY2FwX2NvbmZfb3V0cHV0KHNrLCAmcHRyKTsKKwllbHNlCisJCWZsYWdzID0gMHgwMDAxOworCisJcnNwLT5zY2lkICAgPSBfX2NwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+ZGNpZCk7CisJcnNwLT5yZXN1bHQgPSBfX2NwdV90b19sZTE2KHJlc3VsdCA/ICpyZXN1bHQgOiAwKTsKKwlyc3AtPmZsYWdzICA9IF9fY3B1X3RvX2xlMTYoZmxhZ3MpOworCisJcmV0dXJuIHB0ciAtIGRhdGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGwyY2FwX2Nvbm5lY3RfcmVxKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLCBzdHJ1Y3QgbDJjYXBfY21kX2hkciAqY21kLCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbDJjYXBfY2hhbl9saXN0ICpsaXN0ID0gJmNvbm4tPmNoYW5fbGlzdDsKKwlzdHJ1Y3QgbDJjYXBfY29ubl9yZXEgKnJlcSA9IChzdHJ1Y3QgbDJjYXBfY29ubl9yZXEgKikgZGF0YTsKKwlzdHJ1Y3QgbDJjYXBfY29ubl9yc3AgcnNwOworCXN0cnVjdCBzb2NrICpzaywgKnBhcmVudDsKKwlpbnQgcmVzdWx0ID0gMCwgc3RhdHVzID0gMDsKKworCXUxNiBkY2lkID0gMCwgc2NpZCA9IF9fbGUxNl90b19jcHUocmVxLT5zY2lkKTsKKwl1MTYgcHNtICA9IHJlcS0+cHNtOworCisJQlRfREJHKCJwc20gMHglMi4yeCBzY2lkIDB4JTQuNHgiLCBwc20sIHNjaWQpOworCisJLyogQ2hlY2sgaWYgd2UgaGF2ZSBzb2NrZXQgbGlzdGVuaW5nIG9uIHBzbSAqLworCXBhcmVudCA9IGwyY2FwX2dldF9zb2NrX2J5X3BzbShCVF9MSVNURU4sIHBzbSwgY29ubi0+c3JjKTsKKwlpZiAoIXBhcmVudCkgeworCQlyZXN1bHQgPSBMMkNBUF9DUl9CQURfUFNNOworCQlnb3RvIHNlbmRyZXNwOworCX0KKworCXJlc3VsdCA9IEwyQ0FQX0NSX05PX01FTTsKKworCS8qIENoZWNrIGZvciBiYWNrbG9nIHNpemUgKi8KKwlpZiAoc2tfYWNjZXB0cV9pc19mdWxsKHBhcmVudCkpIHsKKwkJQlRfREJHKCJiYWNrbG9nIGZ1bGwgJWQiLCBwYXJlbnQtPnNrX2Fja19iYWNrbG9nKTsgCisJCWdvdG8gcmVzcG9uc2U7CisJfQorCisJc2sgPSBsMmNhcF9zb2NrX2FsbG9jKE5VTEwsIEJUUFJPVE9fTDJDQVAsIEdGUF9BVE9NSUMpOworCWlmICghc2spCisJCWdvdG8gcmVzcG9uc2U7CisKKwl3cml0ZV9sb2NrKCZsaXN0LT5sb2NrKTsKKworCS8qIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBjaGFubmVsIHdpdGggdGhhdCBkY2lkICovCisJaWYgKF9fbDJjYXBfZ2V0X2NoYW5fYnlfZGNpZChsaXN0LCBzY2lkKSkgeworCQl3cml0ZV91bmxvY2soJmxpc3QtPmxvY2spOworCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX1pBUFBFRCk7CisJCWwyY2FwX3NvY2tfa2lsbChzayk7CisJCWdvdG8gcmVzcG9uc2U7CisJfQorCisJaGNpX2Nvbm5faG9sZChjb25uLT5oY29uKTsKKworCWwyY2FwX3NvY2tfaW5pdChzaywgcGFyZW50KTsKKwliYWNweSgmYnRfc2soc2spLT5zcmMsIGNvbm4tPnNyYyk7CisJYmFjcHkoJmJ0X3NrKHNrKS0+ZHN0LCBjb25uLT5kc3QpOworCWwyY2FwX3BpKHNrKS0+cHNtICA9IHBzbTsKKwlsMmNhcF9waShzayktPmRjaWQgPSBzY2lkOworCisJX19sMmNhcF9jaGFuX2FkZChjb25uLCBzaywgcGFyZW50KTsKKwlkY2lkID0gbDJjYXBfcGkoc2spLT5zY2lkOworCisJbDJjYXBfc29ja19zZXRfdGltZXIoc2ssIHNrLT5za19zbmR0aW1lbyk7CisKKwkvKiBTZXJ2aWNlIGxldmVsIHNlY3VyaXR5ICovCisJcmVzdWx0ID0gTDJDQVBfQ1JfUEVORDsKKwlzdGF0dXMgPSBMMkNBUF9DU19BVVRIRU5fUEVORDsKKwlzay0+c2tfc3RhdGUgPSBCVF9DT05ORUNUMjsKKwlsMmNhcF9waShzayktPmlkZW50ID0gY21kLT5pZGVudDsKKworCWlmICgobDJjYXBfcGkoc2spLT5saW5rX21vZGUgJiBMMkNBUF9MTV9FTkNSWVBUKSB8fAorCQkJKGwyY2FwX3BpKHNrKS0+bGlua19tb2RlICYgTDJDQVBfTE1fU0VDVVJFKSkgeworCQlpZiAoIWhjaV9jb25uX2VuY3J5cHQoY29ubi0+aGNvbikpCisJCQlnb3RvIGRvbmU7CisJfSBlbHNlIGlmIChsMmNhcF9waShzayktPmxpbmtfbW9kZSAmIEwyQ0FQX0xNX0FVVEgpIHsKKwkJaWYgKCFoY2lfY29ubl9hdXRoKGNvbm4tPmhjb24pKQorCQkJZ290byBkb25lOworCX0KKworCXNrLT5za19zdGF0ZSA9IEJUX0NPTkZJRzsKKwlyZXN1bHQgPSBzdGF0dXMgPSAwOworCitkb25lOgorCXdyaXRlX3VubG9jaygmbGlzdC0+bG9jayk7CisKK3Jlc3BvbnNlOgorCWJoX3VubG9ja19zb2NrKHBhcmVudCk7CisKK3NlbmRyZXNwOgorCXJzcC5zY2lkICAgPSBfX2NwdV90b19sZTE2KHNjaWQpOworCXJzcC5kY2lkICAgPSBfX2NwdV90b19sZTE2KGRjaWQpOworCXJzcC5yZXN1bHQgPSBfX2NwdV90b19sZTE2KHJlc3VsdCk7CisJcnNwLnN0YXR1cyA9IF9fY3B1X3RvX2xlMTYoc3RhdHVzKTsKKwlsMmNhcF9zZW5kX2NtZChjb25uLCBjbWQtPmlkZW50LCBMMkNBUF9DT05OX1JTUCwgc2l6ZW9mKHJzcCksICZyc3ApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBsMmNhcF9jb25uZWN0X3JzcChzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgc3RydWN0IGwyY2FwX2NtZF9oZHIgKmNtZCwgdTggKmRhdGEpCit7CisJc3RydWN0IGwyY2FwX2Nvbm5fcnNwICpyc3AgPSAoc3RydWN0IGwyY2FwX2Nvbm5fcnNwICopIGRhdGE7CisJdTE2IHNjaWQsIGRjaWQsIHJlc3VsdCwgc3RhdHVzOworCXN0cnVjdCBzb2NrICpzazsKKwl1OCByZXFbMTI4XTsKKworCXNjaWQgICA9IF9fbGUxNl90b19jcHUocnNwLT5zY2lkKTsKKwlkY2lkICAgPSBfX2xlMTZfdG9fY3B1KHJzcC0+ZGNpZCk7CisJcmVzdWx0ID0gX19sZTE2X3RvX2NwdShyc3AtPnJlc3VsdCk7CisJc3RhdHVzID0gX19sZTE2X3RvX2NwdShyc3AtPnN0YXR1cyk7CisKKwlCVF9EQkcoImRjaWQgMHglNC40eCBzY2lkIDB4JTQuNHggcmVzdWx0IDB4JTIuMnggc3RhdHVzIDB4JTIuMngiLCBkY2lkLCBzY2lkLCByZXN1bHQsIHN0YXR1cyk7CisKKwlpZiAoc2NpZCkgeworCQlpZiAoIShzayA9IGwyY2FwX2dldF9jaGFuX2J5X3NjaWQoJmNvbm4tPmNoYW5fbGlzdCwgc2NpZCkpKQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJaWYgKCEoc2sgPSBsMmNhcF9nZXRfY2hhbl9ieV9pZGVudCgmY29ubi0+Y2hhbl9saXN0LCBjbWQtPmlkZW50KSkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKHJlc3VsdCkgeworCWNhc2UgTDJDQVBfQ1JfU1VDQ0VTUzoKKwkJc2stPnNrX3N0YXRlID0gQlRfQ09ORklHOworCQlsMmNhcF9waShzayktPmlkZW50ID0gMDsKKwkJbDJjYXBfcGkoc2spLT5kY2lkID0gZGNpZDsKKwkJbDJjYXBfcGkoc2spLT5jb25mX3N0YXRlIHw9IEwyQ0FQX0NPTkZfUkVRX1NFTlQ7CisKKwkJbDJjYXBfc2VuZF9jbWQoY29ubiwgbDJjYXBfZ2V0X2lkZW50KGNvbm4pLCBMMkNBUF9DT05GX1JFUSwKKwkJCQkJbDJjYXBfYnVpbGRfY29uZl9yZXEoc2ssIHJlcSksIHJlcSk7CisJCWJyZWFrOworCisJY2FzZSBMMkNBUF9DUl9QRU5EOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWwyY2FwX2NoYW5fZGVsKHNrLCBFQ09OTlJFRlVTRUQpOworCQlicmVhazsKKwl9CisKKwliaF91bmxvY2tfc29jayhzayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGwyY2FwX2NvbmZpZ19yZXEoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHN0cnVjdCBsMmNhcF9jbWRfaGRyICpjbWQsIHU4ICpkYXRhKQoreworCXN0cnVjdCBsMmNhcF9jb25mX3JlcSAqcmVxID0gKHN0cnVjdCBsMmNhcF9jb25mX3JlcSAqKSBkYXRhOworCXUxNiBkY2lkLCBmbGFnczsKKwl1OCByc3BbNjRdOworCXN0cnVjdCBzb2NrICpzazsKKwlpbnQgcmVzdWx0OworCisJZGNpZCAgPSBfX2xlMTZfdG9fY3B1KHJlcS0+ZGNpZCk7CisJZmxhZ3MgPSBfX2xlMTZfdG9fY3B1KHJlcS0+ZmxhZ3MpOworCisJQlRfREJHKCJkY2lkIDB4JTQuNHggZmxhZ3MgMHglMi4yeCIsIGRjaWQsIGZsYWdzKTsKKworCWlmICghKHNrID0gbDJjYXBfZ2V0X2NoYW5fYnlfc2NpZCgmY29ubi0+Y2hhbl9saXN0LCBkY2lkKSkpCisJCXJldHVybiAtRU5PRU5UOworCisJbDJjYXBfcGFyc2VfY29uZl9yZXEoc2ssIHJlcS0+ZGF0YSwgY21kLT5sZW4gLSBzaXplb2YoKnJlcSkpOworCisJaWYgKGZsYWdzICYgMHgwMDAxKSB7CisJCS8qIEluY29tcGxldGUgY29uZmlnLiBTZW5kIGVtcHR5IHJlc3BvbnNlLiAqLworCQlsMmNhcF9zZW5kX2NtZChjb25uLCBjbWQtPmlkZW50LCBMMkNBUF9DT05GX1JTUCwKKwkJCQlsMmNhcF9idWlsZF9jb25mX3JzcChzaywgcnNwLCBOVUxMKSwgcnNwKTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJLyogQ29tcGxldGUgY29uZmlnLiAqLworCWwyY2FwX3NlbmRfY21kKGNvbm4sIGNtZC0+aWRlbnQsIEwyQ0FQX0NPTkZfUlNQLAorCQkJbDJjYXBfYnVpbGRfY29uZl9yc3Aoc2ssIHJzcCwgJnJlc3VsdCksIHJzcCk7CisKKwlpZiAocmVzdWx0KQorCQlnb3RvIHVubG9jazsKKworCS8qIE91dHB1dCBjb25maWcgZG9uZSAqLworCWwyY2FwX3BpKHNrKS0+Y29uZl9zdGF0ZSB8PSBMMkNBUF9DT05GX09VVFBVVF9ET05FOworCisJaWYgKGwyY2FwX3BpKHNrKS0+Y29uZl9zdGF0ZSAmIEwyQ0FQX0NPTkZfSU5QVVRfRE9ORSkgeworCQlzay0+c2tfc3RhdGUgPSBCVF9DT05ORUNURUQ7CisJCWwyY2FwX2NoYW5fcmVhZHkoc2spOworCX0gZWxzZSBpZiAoIShsMmNhcF9waShzayktPmNvbmZfc3RhdGUgJiBMMkNBUF9DT05GX1JFUV9TRU5UKSkgeworCQl1OCByZXFbNjRdOworCQlsMmNhcF9zZW5kX2NtZChjb25uLCBsMmNhcF9nZXRfaWRlbnQoY29ubiksIEwyQ0FQX0NPTkZfUkVRLAorCQkJCQlsMmNhcF9idWlsZF9jb25mX3JlcShzaywgcmVxKSwgcmVxKTsKKwl9CisKK3VubG9jazoKKwliaF91bmxvY2tfc29jayhzayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGwyY2FwX2NvbmZpZ19yc3Aoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHN0cnVjdCBsMmNhcF9jbWRfaGRyICpjbWQsIHU4ICpkYXRhKQoreworCXN0cnVjdCBsMmNhcF9jb25mX3JzcCAqcnNwID0gKHN0cnVjdCBsMmNhcF9jb25mX3JzcCAqKWRhdGE7CisJdTE2IHNjaWQsIGZsYWdzLCByZXN1bHQ7CisJc3RydWN0IHNvY2sgKnNrOworCisJc2NpZCAgID0gX19sZTE2X3RvX2NwdShyc3AtPnNjaWQpOworCWZsYWdzICA9IF9fbGUxNl90b19jcHUocnNwLT5mbGFncyk7CisJcmVzdWx0ID0gX19sZTE2X3RvX2NwdShyc3AtPnJlc3VsdCk7CisKKwlCVF9EQkcoInNjaWQgMHglNC40eCBmbGFncyAweCUyLjJ4IHJlc3VsdCAweCUyLjJ4Iiwgc2NpZCwgZmxhZ3MsIHJlc3VsdCk7CisKKwlpZiAoIShzayA9IGwyY2FwX2dldF9jaGFuX2J5X3NjaWQoJmNvbm4tPmNoYW5fbGlzdCwgc2NpZCkpKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAocmVzdWx0KSB7CisJY2FzZSBMMkNBUF9DT05GX1NVQ0NFU1M6CisJCWJyZWFrOworCisJY2FzZSBMMkNBUF9DT05GX1VOQUNDRVBUOgorCQlpZiAoKytsMmNhcF9waShzayktPmNvbmZfcmV0cnkgPCBMMkNBUF9DT05GX01BWF9SRVRSSUVTKSB7CisJCQljaGFyIHJlcVsxMjhdOworCQkJLyogSXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBhZGp1c3QgTDJDQVAgcGFyYW1ldGVycworCQkJICogdGhhdCBhcmUgY3VycmVudGx5IGRlZmluZWQgaW4gdGhlIHNwZWMuIFdlIHNpbXBseQorCQkJICogcmVzZW5kIGNvbmZpZyByZXF1ZXN0IHRoYXQgd2Ugc2VudCBlYXJsaWVyLiBJdCBpcworCQkJICogc3R1cGlkLCBidXQgaXQgaGVscHMgcXVhbGlmaWNhdGlvbiB0ZXN0aW5nIHdoaWNoCisJCQkgKiBleHBlY3RzIGF0IGxlYXN0IHNvbWUgcmVzcG9uc2UgZnJvbSB1cy4gKi8KKwkJCWwyY2FwX3NlbmRfY21kKGNvbm4sIGwyY2FwX2dldF9pZGVudChjb25uKSwgTDJDQVBfQ09ORl9SRVEsCisJCQkJCQlsMmNhcF9idWlsZF9jb25mX3JlcShzaywgcmVxKSwgcmVxKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJZGVmYXVsdDogCisJCXNrLT5za19zdGF0ZSA9IEJUX0RJU0NPTk47CisJCXNrLT5za19lcnIgICA9IEVDT05OUkVTRVQ7CisJCWwyY2FwX3NvY2tfc2V0X3RpbWVyKHNrLCBIWiAqIDUpOworCQl7CisJCQlzdHJ1Y3QgbDJjYXBfZGlzY29ubl9yZXEgcmVxOworCQkJcmVxLmRjaWQgPSBfX2NwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+ZGNpZCk7CisJCQlyZXEuc2NpZCA9IF9fY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5zY2lkKTsKKwkJCWwyY2FwX3NlbmRfY21kKGNvbm4sIGwyY2FwX2dldF9pZGVudChjb25uKSwKKwkJCQkJTDJDQVBfRElTQ09OTl9SRVEsIHNpemVvZihyZXEpLCAmcmVxKTsKKwkJfQorCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGZsYWdzICYgMHgwMSkKKwkJZ290byBkb25lOworCisJLyogSW5wdXQgY29uZmlnIGRvbmUgKi8KKwlsMmNhcF9waShzayktPmNvbmZfc3RhdGUgfD0gTDJDQVBfQ09ORl9JTlBVVF9ET05FOworCisJaWYgKGwyY2FwX3BpKHNrKS0+Y29uZl9zdGF0ZSAmIEwyQ0FQX0NPTkZfT1VUUFVUX0RPTkUpIHsKKwkJc2stPnNrX3N0YXRlID0gQlRfQ09OTkVDVEVEOworCQlsMmNhcF9jaGFuX3JlYWR5KHNrKTsKKwl9CisKK2RvbmU6CisJYmhfdW5sb2NrX3NvY2soc2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBsMmNhcF9kaXNjb25uZWN0X3JlcShzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgc3RydWN0IGwyY2FwX2NtZF9oZHIgKmNtZCwgdTggKmRhdGEpCit7CisJc3RydWN0IGwyY2FwX2Rpc2Nvbm5fcmVxICpyZXEgPSAoc3RydWN0IGwyY2FwX2Rpc2Nvbm5fcmVxICopIGRhdGE7CisJc3RydWN0IGwyY2FwX2Rpc2Nvbm5fcnNwIHJzcDsKKwl1MTYgZGNpZCwgc2NpZDsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlzY2lkID0gX19sZTE2X3RvX2NwdShyZXEtPnNjaWQpOworCWRjaWQgPSBfX2xlMTZfdG9fY3B1KHJlcS0+ZGNpZCk7CisKKwlCVF9EQkcoInNjaWQgMHglNC40eCBkY2lkIDB4JTQuNHgiLCBzY2lkLCBkY2lkKTsKKworCWlmICghKHNrID0gbDJjYXBfZ2V0X2NoYW5fYnlfc2NpZCgmY29ubi0+Y2hhbl9saXN0LCBkY2lkKSkpCisJCXJldHVybiAwOworCisJcnNwLmRjaWQgPSBfX2NwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+c2NpZCk7CisJcnNwLnNjaWQgPSBfX2NwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+ZGNpZCk7CisJbDJjYXBfc2VuZF9jbWQoY29ubiwgY21kLT5pZGVudCwgTDJDQVBfRElTQ09OTl9SU1AsIHNpemVvZihyc3ApLCAmcnNwKTsKKworCXNrLT5za19zaHV0ZG93biA9IFNIVVRET1dOX01BU0s7CisKKwlsMmNhcF9jaGFuX2RlbChzaywgRUNPTk5SRVNFVCk7CisJYmhfdW5sb2NrX3NvY2soc2spOworCisJbDJjYXBfc29ja19raWxsKHNrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbDJjYXBfZGlzY29ubmVjdF9yc3Aoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHN0cnVjdCBsMmNhcF9jbWRfaGRyICpjbWQsIHU4ICpkYXRhKQoreworCXN0cnVjdCBsMmNhcF9kaXNjb25uX3JzcCAqcnNwID0gKHN0cnVjdCBsMmNhcF9kaXNjb25uX3JzcCAqKSBkYXRhOworCXUxNiBkY2lkLCBzY2lkOworCXN0cnVjdCBzb2NrICpzazsKKworCXNjaWQgPSBfX2xlMTZfdG9fY3B1KHJzcC0+c2NpZCk7CisJZGNpZCA9IF9fbGUxNl90b19jcHUocnNwLT5kY2lkKTsKKworCUJUX0RCRygiZGNpZCAweCU0LjR4IHNjaWQgMHglNC40eCIsIGRjaWQsIHNjaWQpOworCisJaWYgKCEoc2sgPSBsMmNhcF9nZXRfY2hhbl9ieV9zY2lkKCZjb25uLT5jaGFuX2xpc3QsIHNjaWQpKSkKKwkJcmV0dXJuIDA7CisKKwlsMmNhcF9jaGFuX2RlbChzaywgMCk7CisJYmhfdW5sb2NrX3NvY2soc2spOworCisJbDJjYXBfc29ja19raWxsKHNrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbDJjYXBfaW5mb3JtYXRpb25fcmVxKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLCBzdHJ1Y3QgbDJjYXBfY21kX2hkciAqY21kLCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbDJjYXBfaW5mb19yZXEgKnJlcSA9IChzdHJ1Y3QgbDJjYXBfaW5mb19yZXEgKikgZGF0YTsKKwlzdHJ1Y3QgbDJjYXBfaW5mb19yc3AgcnNwOworCXUxNiB0eXBlOworCisJdHlwZSA9IF9fbGUxNl90b19jcHUocmVxLT50eXBlKTsKKworCUJUX0RCRygidHlwZSAweCU0LjR4IiwgdHlwZSk7CisKKwlyc3AudHlwZSAgID0gX19jcHVfdG9fbGUxNih0eXBlKTsKKwlyc3AucmVzdWx0ID0gX19jcHVfdG9fbGUxNihMMkNBUF9JUl9OT1RTVVBQKTsKKwlsMmNhcF9zZW5kX2NtZChjb25uLCBjbWQtPmlkZW50LCBMMkNBUF9JTkZPX1JTUCwgc2l6ZW9mKHJzcCksICZyc3ApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGwyY2FwX2luZm9ybWF0aW9uX3JzcChzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgc3RydWN0IGwyY2FwX2NtZF9oZHIgKmNtZCwgdTggKmRhdGEpCit7CisJc3RydWN0IGwyY2FwX2luZm9fcnNwICpyc3AgPSAoc3RydWN0IGwyY2FwX2luZm9fcnNwICopIGRhdGE7CisJdTE2IHR5cGUsIHJlc3VsdDsKKworCXR5cGUgICA9IF9fbGUxNl90b19jcHUocnNwLT50eXBlKTsKKwlyZXN1bHQgPSBfX2xlMTZfdG9fY3B1KHJzcC0+cmVzdWx0KTsKKworCUJUX0RCRygidHlwZSAweCU0LjR4IHJlc3VsdCAweCUyLjJ4IiwgdHlwZSwgcmVzdWx0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbDJjYXBfc2lnX2NoYW5uZWwoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTggKmRhdGEgPSBza2ItPmRhdGE7CisJaW50IGxlbiA9IHNrYi0+bGVuOworCXN0cnVjdCBsMmNhcF9jbWRfaGRyIGNtZDsKKwlpbnQgZXJyID0gMDsKKworCWwyY2FwX3Jhd19yZWN2KGNvbm4sIHNrYik7CisKKwl3aGlsZSAobGVuID49IEwyQ0FQX0NNRF9IRFJfU0laRSkgeworCQltZW1jcHkoJmNtZCwgZGF0YSwgTDJDQVBfQ01EX0hEUl9TSVpFKTsKKwkJZGF0YSArPSBMMkNBUF9DTURfSERSX1NJWkU7CisJCWxlbiAgLT0gTDJDQVBfQ01EX0hEUl9TSVpFOworCisJCWNtZC5sZW4gPSBfX2xlMTZfdG9fY3B1KGNtZC5sZW4pOworCisJCUJUX0RCRygiY29kZSAweCUyLjJ4IGxlbiAlZCBpZCAweCUyLjJ4IiwgY21kLmNvZGUsIGNtZC5sZW4sIGNtZC5pZGVudCk7CisKKwkJaWYgKGNtZC5sZW4gPiBsZW4gfHwgIWNtZC5pZGVudCkgeworCQkJQlRfREJHKCJjb3JydXB0ZWQgY29tbWFuZCIpOworCQkJYnJlYWs7CisJCX0KKworCQlzd2l0Y2ggKGNtZC5jb2RlKSB7CisJCWNhc2UgTDJDQVBfQ09NTUFORF9SRUo6CisJCQkvKiBGSVhNRTogV2Ugc2hvdWxkIHByb2Nlc3MgdGhpcyAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBMMkNBUF9DT05OX1JFUToKKwkJCWVyciA9IGwyY2FwX2Nvbm5lY3RfcmVxKGNvbm4sICZjbWQsIGRhdGEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBMMkNBUF9DT05OX1JTUDoKKwkJCWVyciA9IGwyY2FwX2Nvbm5lY3RfcnNwKGNvbm4sICZjbWQsIGRhdGEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBMMkNBUF9DT05GX1JFUToKKwkJCWVyciA9IGwyY2FwX2NvbmZpZ19yZXEoY29ubiwgJmNtZCwgZGF0YSk7CisJCQlicmVhazsKKworCQljYXNlIEwyQ0FQX0NPTkZfUlNQOgorCQkJZXJyID0gbDJjYXBfY29uZmlnX3JzcChjb25uLCAmY21kLCBkYXRhKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTDJDQVBfRElTQ09OTl9SRVE6CisJCQllcnIgPSBsMmNhcF9kaXNjb25uZWN0X3JlcShjb25uLCAmY21kLCBkYXRhKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTDJDQVBfRElTQ09OTl9SU1A6CisJCQllcnIgPSBsMmNhcF9kaXNjb25uZWN0X3JzcChjb25uLCAmY21kLCBkYXRhKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTDJDQVBfRUNIT19SRVE6CisJCQlsMmNhcF9zZW5kX2NtZChjb25uLCBjbWQuaWRlbnQsIEwyQ0FQX0VDSE9fUlNQLCBjbWQubGVuLCBkYXRhKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTDJDQVBfRUNIT19SU1A6CisJCQlicmVhazsKKworCQljYXNlIEwyQ0FQX0lORk9fUkVROgorCQkJZXJyID0gbDJjYXBfaW5mb3JtYXRpb25fcmVxKGNvbm4sICZjbWQsIGRhdGEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBMMkNBUF9JTkZPX1JTUDoKKwkJCWVyciA9IGwyY2FwX2luZm9ybWF0aW9uX3JzcChjb25uLCAmY21kLCBkYXRhKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlCVF9FUlIoIlVua25vd24gc2lnbmFsaW5nIGNvbW1hbmQgMHglMi4yeCIsIGNtZC5jb2RlKTsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChlcnIpIHsKKwkJCXN0cnVjdCBsMmNhcF9jbWRfcmVqIHJlajsKKwkJCUJUX0RCRygiZXJyb3IgJWQiLCBlcnIpOworCisJCQkvKiBGSVhNRTogTWFwIGVyciB0byBhIHZhbGlkIHJlYXNvbiAqLworCQkJcmVqLnJlYXNvbiA9IF9fY3B1X3RvX2xlMTYoMCk7CisJCQlsMmNhcF9zZW5kX2NtZChjb25uLCBjbWQuaWRlbnQsIEwyQ0FQX0NPTU1BTkRfUkVKLCBzaXplb2YocmVqKSwgJnJlaik7CisJCX0KKworCQlkYXRhICs9IGNtZC5sZW47CisJCWxlbiAgLT0gY21kLmxlbjsKKwl9CisKKwlrZnJlZV9za2Ioc2tiKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbDJjYXBfZGF0YV9jaGFubmVsKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLCB1MTYgY2lkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBzb2NrICpzazsKKworCXNrID0gbDJjYXBfZ2V0X2NoYW5fYnlfc2NpZCgmY29ubi0+Y2hhbl9saXN0LCBjaWQpOworCWlmICghc2spIHsKKwkJQlRfREJHKCJ1bmtub3duIGNpZCAweCU0LjR4IiwgY2lkKTsKKwkJZ290byBkcm9wOworCX0KKworCUJUX0RCRygic2sgJXAsIGxlbiAlZCIsIHNrLCBza2ItPmxlbik7CisKKwlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0NPTk5FQ1RFRCkKKwkJZ290byBkcm9wOworCisJaWYgKGwyY2FwX3BpKHNrKS0+aW10dSA8IHNrYi0+bGVuKQorCQlnb3RvIGRyb3A7CisKKwkvKiBJZiBzb2NrZXQgcmVjdiBidWZmZXJzIG92ZXJmbG93cyB3ZSBkcm9wIGRhdGEgaGVyZQorCSAqIHdoaWNoIGlzICpiYWQqIGJlY2F1c2UgTDJDQVAgaGFzIHRvIGJlIHJlbGlhYmxlLgorCSAqIEJ1dCB3ZSBkb24ndCBoYXZlIGFueSBvdGhlciBjaG9pY2UuIEwyQ0FQIGRvZXNuJ3QKKwkgKiBwcm92aWRlIGZsb3cgY29udHJvbCBtZWNoYW5pc20uICovCisKKwlpZiAoIXNvY2tfcXVldWVfcmN2X3NrYihzaywgc2tiKSkKKwkJZ290byBkb25lOworCitkcm9wOgorCWtmcmVlX3NrYihza2IpOworCitkb25lOgorCWlmIChzaykgYmhfdW5sb2NrX3NvY2soc2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBsMmNhcF9jb25sZXNzX2NoYW5uZWwoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHUxNiBwc20sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNvY2sgKnNrOworCisJc2sgPSBsMmNhcF9nZXRfc29ja19ieV9wc20oMCwgcHNtLCBjb25uLT5zcmMpOworCWlmICghc2spCisJCWdvdG8gZHJvcDsKKworCUJUX0RCRygic2sgJXAsIGxlbiAlZCIsIHNrLCBza2ItPmxlbik7CisKKwlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0JPVU5EICYmIHNrLT5za19zdGF0ZSAhPSBCVF9DT05ORUNURUQpCisJCWdvdG8gZHJvcDsKKworCWlmIChsMmNhcF9waShzayktPmltdHUgPCBza2ItPmxlbikKKwkJZ290byBkcm9wOworCisJaWYgKCFzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYikpCisJCWdvdG8gZG9uZTsKKworZHJvcDoKKwlrZnJlZV9za2Ioc2tiKTsKKworZG9uZToKKwlpZiAoc2spIGJoX3VubG9ja19zb2NrKHNrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbDJjYXBfcmVjdl9mcmFtZShzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbDJjYXBfaGRyICpsaCA9ICh2b2lkICopIHNrYi0+ZGF0YTsKKwl1MTYgY2lkLCBwc20sIGxlbjsKKworCXNrYl9wdWxsKHNrYiwgTDJDQVBfSERSX1NJWkUpOworCWNpZCA9IF9fbGUxNl90b19jcHUobGgtPmNpZCk7CisJbGVuID0gX19sZTE2X3RvX2NwdShsaC0+bGVuKTsKKworCUJUX0RCRygibGVuICVkLCBjaWQgMHglNC40eCIsIGxlbiwgY2lkKTsKKworCXN3aXRjaCAoY2lkKSB7CisJY2FzZSAweDAwMDE6CisJCWwyY2FwX3NpZ19jaGFubmVsKGNvbm4sIHNrYik7CisJCWJyZWFrOworCisJY2FzZSAweDAwMDI6CisJCXBzbSA9IGdldF91bmFsaWduZWQoKHUxNiAqKSBza2ItPmRhdGEpOworCQlza2JfcHVsbChza2IsIDIpOworCQlsMmNhcF9jb25sZXNzX2NoYW5uZWwoY29ubiwgcHNtLCBza2IpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWwyY2FwX2RhdGFfY2hhbm5lbChjb25uLCBjaWQsIHNrYik7CisJCWJyZWFrOworCX0KK30KKworLyogLS0tLSBMMkNBUCBpbnRlcmZhY2Ugd2l0aCBsb3dlciBsYXllciAoSENJKSAtLS0tICovCisKK3N0YXRpYyBpbnQgbDJjYXBfY29ubmVjdF9pbmQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIsIHU4IHR5cGUpCit7CisJaW50IGV4YWN0ID0gMCwgbG0xID0gMCwgbG0yID0gMDsKKwlyZWdpc3RlciBzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisKKwlpZiAodHlwZSAhPSBBQ0xfTElOSykKKwkJcmV0dXJuIDA7CisKKwlCVF9EQkcoImhkZXYgJXMsIGJkYWRkciAlcyIsIGhkZXYtPm5hbWUsIGJhdG9zdHIoYmRhZGRyKSk7CisKKwkvKiBGaW5kIGxpc3RlbmluZyBzb2NrZXRzIGFuZCBjaGVjayB0aGVpciBsaW5rX21vZGUgKi8KKwlyZWFkX2xvY2soJmwyY2FwX3NrX2xpc3QubG9jayk7CisJc2tfZm9yX2VhY2goc2ssIG5vZGUsICZsMmNhcF9za19saXN0LmhlYWQpIHsKKwkJaWYgKHNrLT5za19zdGF0ZSAhPSBCVF9MSVNURU4pCisJCQljb250aW51ZTsKKworCQlpZiAoIWJhY21wKCZidF9zayhzayktPnNyYywgJmhkZXYtPmJkYWRkcikpIHsKKwkJCWxtMSB8PSAoSENJX0xNX0FDQ0VQVCB8IGwyY2FwX3BpKHNrKS0+bGlua19tb2RlKTsKKwkJCWV4YWN0Kys7CisJCX0gZWxzZSBpZiAoIWJhY21wKCZidF9zayhzayktPnNyYywgQkRBRERSX0FOWSkpCisJCQlsbTIgfD0gKEhDSV9MTV9BQ0NFUFQgfCBsMmNhcF9waShzayktPmxpbmtfbW9kZSk7CisJfQorCXJlYWRfdW5sb2NrKCZsMmNhcF9za19saXN0LmxvY2spOworCisJcmV0dXJuIGV4YWN0ID8gbG0xIDogbG0yOworfQorCitzdGF0aWMgaW50IGwyY2FwX2Nvbm5lY3RfY2ZtKHN0cnVjdCBoY2lfY29ubiAqaGNvbiwgdTggc3RhdHVzKQoreworCUJUX0RCRygiaGNvbiAlcCBiZGFkZHIgJXMgc3RhdHVzICVkIiwgaGNvbiwgYmF0b3N0cigmaGNvbi0+ZHN0KSwgc3RhdHVzKTsKKworCWlmIChoY29uLT50eXBlICE9IEFDTF9MSU5LKQorCQlyZXR1cm4gMDsKKworCWlmICghc3RhdHVzKSB7CisJCXN0cnVjdCBsMmNhcF9jb25uICpjb25uOworCisJCWNvbm4gPSBsMmNhcF9jb25uX2FkZChoY29uLCBzdGF0dXMpOworCQlpZiAoY29ubikKKwkJCWwyY2FwX2Nvbm5fcmVhZHkoY29ubik7CisJfSBlbHNlIAorCQlsMmNhcF9jb25uX2RlbChoY29uLCBidF9lcnIoc3RhdHVzKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsMmNhcF9kaXNjb25uX2luZChzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24sIHU4IHJlYXNvbikKK3sKKwlCVF9EQkcoImhjb24gJXAgcmVhc29uICVkIiwgaGNvbiwgcmVhc29uKTsKKworCWlmIChoY29uLT50eXBlICE9IEFDTF9MSU5LKQorCQlyZXR1cm4gMDsKKworCWwyY2FwX2Nvbm5fZGVsKGhjb24sIGJ0X2VycihyZWFzb24pKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsMmNhcF9hdXRoX2NmbShzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24sIHU4IHN0YXR1cykKK3sKKwlzdHJ1Y3QgbDJjYXBfY2hhbl9saXN0ICpsOworCXN0cnVjdCBsMmNhcF9jb25uICpjb25uOworCXN0cnVjdCBsMmNhcF9jb25uX3JzcCByc3A7CisJc3RydWN0IHNvY2sgKnNrOworCWludCByZXN1bHQ7CisKKwlpZiAoIShjb25uID0gaGNvbi0+bDJjYXBfZGF0YSkpCisJCXJldHVybiAwOworCWwgPSAmY29ubi0+Y2hhbl9saXN0OworCisJQlRfREJHKCJjb25uICVwIiwgY29ubik7CisKKwlyZWFkX2xvY2soJmwtPmxvY2spOworCisJZm9yIChzayA9IGwtPmhlYWQ7IHNrOyBzayA9IGwyY2FwX3BpKHNrKS0+bmV4dF9jKSB7CisJCWJoX2xvY2tfc29jayhzayk7CisKKwkJaWYgKHNrLT5za19zdGF0ZSAhPSBCVF9DT05ORUNUMiB8fAorCQkJCShsMmNhcF9waShzayktPmxpbmtfbW9kZSAmIEwyQ0FQX0xNX0VOQ1JZUFQpIHx8CisJCQkJKGwyY2FwX3BpKHNrKS0+bGlua19tb2RlICYgTDJDQVBfTE1fU0VDVVJFKSkgeworCQkJYmhfdW5sb2NrX3NvY2soc2spOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIXN0YXR1cykgeworCQkJc2stPnNrX3N0YXRlID0gQlRfQ09ORklHOworCQkJcmVzdWx0ID0gMDsKKwkJfSBlbHNlIHsKKwkJCXNrLT5za19zdGF0ZSA9IEJUX0RJU0NPTk47CisJCQlsMmNhcF9zb2NrX3NldF90aW1lcihzaywgSFovMTApOworCQkJcmVzdWx0ID0gTDJDQVBfQ1JfU0VDX0JMT0NLOworCQl9CisKKwkJcnNwLnNjaWQgICA9IF9fY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5kY2lkKTsKKwkJcnNwLmRjaWQgICA9IF9fY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5zY2lkKTsKKwkJcnNwLnJlc3VsdCA9IF9fY3B1X3RvX2xlMTYocmVzdWx0KTsKKwkJcnNwLnN0YXR1cyA9IF9fY3B1X3RvX2xlMTYoMCk7CisJCWwyY2FwX3NlbmRfY21kKGNvbm4sIGwyY2FwX3BpKHNrKS0+aWRlbnQsCisJCQkJTDJDQVBfQ09OTl9SU1AsIHNpemVvZihyc3ApLCAmcnNwKTsKKworCQliaF91bmxvY2tfc29jayhzayk7CisJfQorCisJcmVhZF91bmxvY2soJmwtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGwyY2FwX2VuY3J5cHRfY2ZtKHN0cnVjdCBoY2lfY29ubiAqaGNvbiwgdTggc3RhdHVzKQoreworCXN0cnVjdCBsMmNhcF9jaGFuX2xpc3QgKmw7CisJc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm47CisJc3RydWN0IGwyY2FwX2Nvbm5fcnNwIHJzcDsKKwlzdHJ1Y3Qgc29jayAqc2s7CisJaW50IHJlc3VsdDsKKworCWlmICghKGNvbm4gPSBoY29uLT5sMmNhcF9kYXRhKSkKKwkJcmV0dXJuIDA7CisJbCA9ICZjb25uLT5jaGFuX2xpc3Q7CisKKwlCVF9EQkcoImNvbm4gJXAiLCBjb25uKTsKKworCXJlYWRfbG9jaygmbC0+bG9jayk7CisKKwlmb3IgKHNrID0gbC0+aGVhZDsgc2s7IHNrID0gbDJjYXBfcGkoc2spLT5uZXh0X2MpIHsKKwkJYmhfbG9ja19zb2NrKHNrKTsKKworCQlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0NPTk5FQ1QyKSB7CisJCQliaF91bmxvY2tfc29jayhzayk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghc3RhdHVzKSB7CisJCQlzay0+c2tfc3RhdGUgPSBCVF9DT05GSUc7CisJCQlyZXN1bHQgPSAwOworCQl9IGVsc2UgeworCQkJc2stPnNrX3N0YXRlID0gQlRfRElTQ09OTjsKKwkJCWwyY2FwX3NvY2tfc2V0X3RpbWVyKHNrLCBIWi8xMCk7CisJCQlyZXN1bHQgPSBMMkNBUF9DUl9TRUNfQkxPQ0s7CisJCX0KKworCQlyc3Auc2NpZCAgID0gX19jcHVfdG9fbGUxNihsMmNhcF9waShzayktPmRjaWQpOworCQlyc3AuZGNpZCAgID0gX19jcHVfdG9fbGUxNihsMmNhcF9waShzayktPnNjaWQpOworCQlyc3AucmVzdWx0ID0gX19jcHVfdG9fbGUxNihyZXN1bHQpOworCQlyc3Auc3RhdHVzID0gX19jcHVfdG9fbGUxNigwKTsKKwkJbDJjYXBfc2VuZF9jbWQoY29ubiwgbDJjYXBfcGkoc2spLT5pZGVudCwKKwkJCQlMMkNBUF9DT05OX1JTUCwgc2l6ZW9mKHJzcCksICZyc3ApOworCisJCWlmIChsMmNhcF9waShzayktPmxpbmtfbW9kZSAmIEwyQ0FQX0xNX1NFQ1VSRSkKKwkJCWhjaV9jb25uX2NoYW5nZV9saW5rX2tleShoY29uKTsKKworCQliaF91bmxvY2tfc29jayhzayk7CisJfQorCisJcmVhZF91bmxvY2soJmwtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGwyY2FwX3JlY3ZfYWNsZGF0YShzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24sIHN0cnVjdCBza19idWZmICpza2IsIHUxNiBmbGFncykKK3sKKwlzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiA9IGhjb24tPmwyY2FwX2RhdGE7CisKKwlpZiAoIWNvbm4gJiYgIShjb25uID0gbDJjYXBfY29ubl9hZGQoaGNvbiwgMCkpKQorCQlnb3RvIGRyb3A7CisKKwlCVF9EQkcoImNvbm4gJXAgbGVuICVkIGZsYWdzIDB4JXgiLCBjb25uLCBza2ItPmxlbiwgZmxhZ3MpOworCisJaWYgKGZsYWdzICYgQUNMX1NUQVJUKSB7CisJCXN0cnVjdCBsMmNhcF9oZHIgKmhkcjsKKwkJaW50IGxlbjsKKworCQlpZiAoY29ubi0+cnhfbGVuKSB7CisJCQlCVF9FUlIoIlVuZXhwZWN0ZWQgc3RhcnQgZnJhbWUgKGxlbiAlZCkiLCBza2ItPmxlbik7CisJCQlrZnJlZV9za2IoY29ubi0+cnhfc2tiKTsKKwkJCWNvbm4tPnJ4X3NrYiA9IE5VTEw7CisJCQljb25uLT5yeF9sZW4gPSAwOworCQkJbDJjYXBfY29ubl91bnJlbGlhYmxlKGNvbm4sIEVDT01NKTsKKwkJfQorCisJCWlmIChza2ItPmxlbiA8IDIpIHsKKwkJCUJUX0VSUigiRnJhbWUgaXMgdG9vIHNob3J0IChsZW4gJWQpIiwgc2tiLT5sZW4pOworCQkJbDJjYXBfY29ubl91bnJlbGlhYmxlKGNvbm4sIEVDT01NKTsKKwkJCWdvdG8gZHJvcDsKKwkJfQorCisJCWhkciA9IChzdHJ1Y3QgbDJjYXBfaGRyICopIHNrYi0+ZGF0YTsKKwkJbGVuID0gX19sZTE2X3RvX2NwdShoZHItPmxlbikgKyBMMkNBUF9IRFJfU0laRTsKKworCQlpZiAobGVuID09IHNrYi0+bGVuKSB7CisJCQkvKiBDb21wbGV0ZSBmcmFtZSByZWNlaXZlZCAqLworCQkJbDJjYXBfcmVjdl9mcmFtZShjb25uLCBza2IpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlCVF9EQkcoIlN0YXJ0OiB0b3RhbCBsZW4gJWQsIGZyYWcgbGVuICVkIiwgbGVuLCBza2ItPmxlbik7CisKKwkJaWYgKHNrYi0+bGVuID4gbGVuKSB7CisJCQlCVF9FUlIoIkZyYW1lIGlzIHRvbyBsb25nIChsZW4gJWQsIGV4cGVjdGVkIGxlbiAlZCkiLAorCQkJCXNrYi0+bGVuLCBsZW4pOworCQkJbDJjYXBfY29ubl91bnJlbGlhYmxlKGNvbm4sIEVDT01NKTsKKwkJCWdvdG8gZHJvcDsKKwkJfQorCisJCS8qIEFsbG9jYXRlIHNrYiBmb3IgdGhlIGNvbXBsZXRlIGZyYW1lICh3aXRoIGhlYWRlcikgKi8KKwkJaWYgKCEoY29ubi0+cnhfc2tiID0gYnRfc2tiX2FsbG9jKGxlbiwgR0ZQX0FUT01JQykpKQorCQkJZ290byBkcm9wOworCisJCW1lbWNweShza2JfcHV0KGNvbm4tPnJ4X3NrYiwgc2tiLT5sZW4pLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJY29ubi0+cnhfbGVuID0gbGVuIC0gc2tiLT5sZW47CisJfSBlbHNlIHsKKwkJQlRfREJHKCJDb250OiBmcmFnIGxlbiAlZCAoZXhwZWN0aW5nICVkKSIsIHNrYi0+bGVuLCBjb25uLT5yeF9sZW4pOworCisJCWlmICghY29ubi0+cnhfbGVuKSB7CisJCQlCVF9FUlIoIlVuZXhwZWN0ZWQgY29udGludWF0aW9uIGZyYW1lIChsZW4gJWQpIiwgc2tiLT5sZW4pOworCQkJbDJjYXBfY29ubl91bnJlbGlhYmxlKGNvbm4sIEVDT01NKTsKKwkJCWdvdG8gZHJvcDsKKwkJfQorCisJCWlmIChza2ItPmxlbiA+IGNvbm4tPnJ4X2xlbikgeworCQkJQlRfRVJSKCJGcmFnbWVudCBpcyB0b28gbG9uZyAobGVuICVkLCBleHBlY3RlZCAlZCkiLAorCQkJCQlza2ItPmxlbiwgY29ubi0+cnhfbGVuKTsKKwkJCWtmcmVlX3NrYihjb25uLT5yeF9za2IpOworCQkJY29ubi0+cnhfc2tiID0gTlVMTDsKKwkJCWNvbm4tPnJ4X2xlbiA9IDA7CisJCQlsMmNhcF9jb25uX3VucmVsaWFibGUoY29ubiwgRUNPTU0pOworCQkJZ290byBkcm9wOworCQl9CisKKwkJbWVtY3B5KHNrYl9wdXQoY29ubi0+cnhfc2tiLCBza2ItPmxlbiksIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQljb25uLT5yeF9sZW4gLT0gc2tiLT5sZW47CisKKwkJaWYgKCFjb25uLT5yeF9sZW4pIHsKKwkJCS8qIENvbXBsZXRlIGZyYW1lIHJlY2VpdmVkICovCisJCQlsMmNhcF9yZWN2X2ZyYW1lKGNvbm4sIGNvbm4tPnJ4X3NrYik7CisJCQljb25uLT5yeF9za2IgPSBOVUxMOworCQl9CisJfQorCitkcm9wOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCisvKiAtLS0tIFByb2MgZnMgc3VwcG9ydCAtLS0tICovCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyB2b2lkICpsMmNhcF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBzb2NrICpzazsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlsb2ZmX3QgbCA9ICpwb3M7CisKKwlyZWFkX2xvY2tfYmgoJmwyY2FwX3NrX2xpc3QubG9jayk7CisKKwlza19mb3JfZWFjaChzaywgbm9kZSwgJmwyY2FwX3NrX2xpc3QuaGVhZCkKKwkJaWYgKCFsLS0pCisJCQlnb3RvIGZvdW5kOworCXNrID0gTlVMTDsKK2ZvdW5kOgorCXJldHVybiBzazsKK30KKworc3RhdGljIHZvaWQgKmwyY2FwX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICplLCBsb2ZmX3QgKnBvcykKK3sKKwkoKnBvcykrKzsKKwlyZXR1cm4gc2tfbmV4dChlKTsKK30KKworc3RhdGljIHZvaWQgbDJjYXBfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKmUpCit7CisJcmVhZF91bmxvY2tfYmgoJmwyY2FwX3NrX2xpc3QubG9jayk7Cit9CisKK3N0YXRpYyBpbnQgIGwyY2FwX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICplKQoreworCXN0cnVjdCBzb2NrICpzayA9IGU7CisJc3RydWN0IGwyY2FwX3BpbmZvICpwaSA9IGwyY2FwX3BpKHNrKTsKKworCXNlcV9wcmludGYoc2VxLCAiJXMgJXMgJWQgJWQgMHglNC40eCAweCU0LjR4ICVkICVkIDB4JXhcbiIsCisJCQliYXRvc3RyKCZidF9zayhzayktPnNyYyksIGJhdG9zdHIoJmJ0X3NrKHNrKS0+ZHN0KSwgCisJCQlzay0+c2tfc3RhdGUsIHBpLT5wc20sIHBpLT5zY2lkLCBwaS0+ZGNpZCwgcGktPmltdHUsCisJCQlwaS0+b210dSwgcGktPmxpbmtfbW9kZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbDJjYXBfc2VxX29wcyA9IHsKKwkuc3RhcnQJPSBsMmNhcF9zZXFfc3RhcnQsCisJLm5leHQJPSBsMmNhcF9zZXFfbmV4dCwKKwkuc3RvcAk9IGwyY2FwX3NlcV9zdG9wLAorCS5zaG93CT0gbDJjYXBfc2VxX3Nob3cgCit9OworCitzdGF0aWMgaW50IGwyY2FwX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmbDJjYXBfc2VxX29wcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGwyY2FwX3NlcV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBsMmNhcF9zZXFfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbDJjYXBfcHJvY19pbml0KHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwID0gY3JlYXRlX3Byb2NfZW50cnkoImwyY2FwIiwgU19JUlVHTywgcHJvY19idCk7CisJaWYgKCFwKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwLT5vd25lciAgICAgPSBUSElTX01PRFVMRTsKKwlwLT5wcm9jX2ZvcHMgPSAmbDJjYXBfc2VxX2ZvcHM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBsMmNhcF9wcm9jX2NsZWFudXAodm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeSgibDJjYXAiLCBwcm9jX2J0KTsKK30KKworI2Vsc2UgLyogQ09ORklHX1BST0NfRlMgKi8KKworc3RhdGljIGludCBfX2luaXQgbDJjYXBfcHJvY19pbml0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBsMmNhcF9wcm9jX2NsZWFudXAodm9pZCkKK3sKKwlyZXR1cm47Cit9CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgbDJjYXBfc29ja19vcHMgPSB7CisJLmZhbWlseQkJPSBQRl9CTFVFVE9PVEgsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWxlYXNlCT0gbDJjYXBfc29ja19yZWxlYXNlLAorCS5iaW5kCQk9IGwyY2FwX3NvY2tfYmluZCwKKwkuY29ubmVjdAk9IGwyY2FwX3NvY2tfY29ubmVjdCwKKwkubGlzdGVuCQk9IGwyY2FwX3NvY2tfbGlzdGVuLAorCS5hY2NlcHQJCT0gbDJjYXBfc29ja19hY2NlcHQsCisJLmdldG5hbWUJPSBsMmNhcF9zb2NrX2dldG5hbWUsCisJLnNlbmRtc2cJPSBsMmNhcF9zb2NrX3NlbmRtc2csCisJLnJlY3Ztc2cJPSBidF9zb2NrX3JlY3Ztc2csCisJLnBvbGwJCT0gYnRfc29ja19wb2xsLAorCS5tbWFwCQk9IHNvY2tfbm9fbW1hcCwKKwkuc29ja2V0cGFpcgk9IHNvY2tfbm9fc29ja2V0cGFpciwKKwkuaW9jdGwJCT0gc29ja19ub19pb2N0bCwKKwkuc2h1dGRvd24JPSBsMmNhcF9zb2NrX3NodXRkb3duLAorCS5zZXRzb2Nrb3B0CT0gbDJjYXBfc29ja19zZXRzb2Nrb3B0LAorCS5nZXRzb2Nrb3B0CT0gbDJjYXBfc29ja19nZXRzb2Nrb3B0Cit9OworCitzdGF0aWMgc3RydWN0IG5ldF9wcm90b19mYW1pbHkgbDJjYXBfc29ja19mYW1pbHlfb3BzID0geworCS5mYW1pbHkJPSBQRl9CTFVFVE9PVEgsCisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmNyZWF0ZQk9IGwyY2FwX3NvY2tfY3JlYXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBoY2lfcHJvdG8gbDJjYXBfaGNpX3Byb3RvID0geworCS5uYW1lCQk9ICJMMkNBUCIsCisJLmlkCQk9IEhDSV9QUk9UT19MMkNBUCwKKwkuY29ubmVjdF9pbmQJPSBsMmNhcF9jb25uZWN0X2luZCwKKwkuY29ubmVjdF9jZm0JPSBsMmNhcF9jb25uZWN0X2NmbSwKKwkuZGlzY29ubl9pbmQJPSBsMmNhcF9kaXNjb25uX2luZCwKKwkuYXV0aF9jZm0JPSBsMmNhcF9hdXRoX2NmbSwKKwkuZW5jcnlwdF9jZm0JPSBsMmNhcF9lbmNyeXB0X2NmbSwKKwkucmVjdl9hY2xkYXRhCT0gbDJjYXBfcmVjdl9hY2xkYXRhCit9OworCitzdGF0aWMgaW50IF9faW5pdCBsMmNhcF9pbml0KHZvaWQpCit7CisJaW50IGVycjsKKwkKKwllcnIgPSBwcm90b19yZWdpc3RlcigmbDJjYXBfcHJvdG8sIDApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gYnRfc29ja19yZWdpc3RlcihCVFBST1RPX0wyQ0FQLCAmbDJjYXBfc29ja19mYW1pbHlfb3BzKTsKKwlpZiAoZXJyIDwgMCkgeworCQlCVF9FUlIoIkwyQ0FQIHNvY2tldCByZWdpc3RyYXRpb24gZmFpbGVkIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZXJyID0gaGNpX3JlZ2lzdGVyX3Byb3RvKCZsMmNhcF9oY2lfcHJvdG8pOworCWlmIChlcnIgPCAwKSB7CisJCUJUX0VSUigiTDJDQVAgcHJvdG9jb2wgcmVnaXN0cmF0aW9uIGZhaWxlZCIpOworCQlidF9zb2NrX3VucmVnaXN0ZXIoQlRQUk9UT19MMkNBUCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJbDJjYXBfcHJvY19pbml0KCk7CisKKwlCVF9JTkZPKCJMMkNBUCB2ZXIgJXMiLCBWRVJTSU9OKTsKKwlCVF9JTkZPKCJMMkNBUCBzb2NrZXQgbGF5ZXIgaW5pdGlhbGl6ZWQiKTsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlwcm90b191bnJlZ2lzdGVyKCZsMmNhcF9wcm90byk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGwyY2FwX2V4aXQodm9pZCkKK3sKKwlsMmNhcF9wcm9jX2NsZWFudXAoKTsKKworCWlmIChidF9zb2NrX3VucmVnaXN0ZXIoQlRQUk9UT19MMkNBUCkgPCAwKQorCQlCVF9FUlIoIkwyQ0FQIHNvY2tldCB1bnJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKKworCWlmIChoY2lfdW5yZWdpc3Rlcl9wcm90bygmbDJjYXBfaGNpX3Byb3RvKSA8IDApCisJCUJUX0VSUigiTDJDQVAgcHJvdG9jb2wgdW5yZWdpc3RyYXRpb24gZmFpbGVkIik7CisKKwlwcm90b191bnJlZ2lzdGVyKCZsMmNhcF9wcm90byk7Cit9CisKK3ZvaWQgbDJjYXBfbG9hZCh2b2lkKQoreworCS8qIER1bW15IGZ1bmN0aW9uIHRvIHRyaWdnZXIgYXV0b21hdGljIEwyQ0FQIG1vZHVsZSBsb2FkaW5nIGJ5CisJICogb3RoZXIgbW9kdWxlcyB0aGF0IHVzZSBMMkNBUCBzb2NrZXRzIGJ1dCBkb24ndCB1c2UgYW55IG90aGVyCisJICogc3ltYm9scyBmcm9tIGl0LiAqLworCXJldHVybjsKK30KK0VYUE9SVF9TWU1CT0wobDJjYXBfbG9hZCk7CisKK21vZHVsZV9pbml0KGwyY2FwX2luaXQpOworbW9kdWxlX2V4aXQobDJjYXBfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1heGltIEtyYXNueWFuc2t5IDxtYXhrQHF1YWxjb21tLmNvbT4sIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQmx1ZXRvb3RoIEwyQ0FQIHZlciAiIFZFUlNJT04pOworTU9EVUxFX1ZFUlNJT04oVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImJ0LXByb3RvLTAiKTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvbGliLmMgYi9uZXQvYmx1ZXRvb3RoL2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZmIwYTAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYmx1ZXRvb3RoL2xpYi5jCkBAIC0wLDAgKzEsMTc4IEBACisvKiAKKyAgIEJsdWVaIC0gQmx1ZXRvb3RoIHByb3RvY29sIHN0YWNrIGZvciBMaW51eAorICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEgUXVhbGNvbW0gSW5jb3Jwb3JhdGVkCisKKyAgIFdyaXR0ZW4gMjAwMCwyMDAxIGJ5IE1heGltIEtyYXNueWFuc2t5IDxtYXhrQHF1YWxjb21tLmNvbT4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBBTkQgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZCisgICBDTEFJTSwgT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUyAKKyAgIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiAKKyAgIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIAorICAgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworICAgQUxMIExJQUJJTElUWSwgSU5DTFVESU5HIExJQUJJTElUWSBGT1IgSU5GUklOR0VNRU5UIE9GIEFOWSBQQVRFTlRTLCAKKyAgIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLCBSRUxBVElORyBUTyBVU0UgT0YgVEhJUyAKKyAgIFNPRlRXQVJFIElTIERJU0NMQUlNRUQuCisqLworCisvKiBCbHVldG9vdGgga2VybmVsIGxpYnJhcnkuICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorCisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KKwordm9pZCBidF9kdW1wKGNoYXIgKnByZWYsIF9fdTggKmJ1ZiwgaW50IGNvdW50KQoreworCWNoYXIgKnB0cjsKKwljaGFyIGxpbmVbMTAwXTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBkdW1wLCBsZW4gJWRcbiIsIHByZWYsIGNvdW50KTsKKworCXB0ciA9IGxpbmU7CisJKnB0ciA9IDA7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJcHRyICs9IHNwcmludGYocHRyLCAiICUyLjJYIiwgYnVmW2ldKTsKKworCQlpZiAoaSAmJiAhKChpICsgMSkgJSAyMCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiVzXG4iLCBwcmVmLCBsaW5lKTsKKwkJCXB0ciA9IGxpbmU7CisJCQkqcHRyID0gMDsKKwkJfQorCX0KKworCWlmIChsaW5lWzBdKQorCQlwcmludGsoS0VSTl9JTkZPICIlczolc1xuIiwgcHJlZiwgbGluZSk7Cit9CitFWFBPUlRfU1lNQk9MKGJ0X2R1bXApOworCit2b2lkIGJhc3dhcChiZGFkZHJfdCAqZHN0LCBiZGFkZHJfdCAqc3JjKQoreworCXVuc2lnbmVkIGNoYXIgKmQgPSAodW5zaWduZWQgY2hhciAqKSBkc3Q7CisJdW5zaWduZWQgY2hhciAqcyA9ICh1bnNpZ25lZCBjaGFyICopIHNyYzsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWRbaV0gPSBzWzUgLSBpXTsKK30KK0VYUE9SVF9TWU1CT0woYmFzd2FwKTsKKworY2hhciAqYmF0b3N0cihiZGFkZHJfdCAqYmEpCit7CisJc3RhdGljIGNoYXIgc3RyWzJdWzE4XTsKKwlzdGF0aWMgaW50IGkgPSAxOworCisJaSBePSAxOworCXNwcmludGYoc3RyW2ldLCAiJTIuMlg6JTIuMlg6JTIuMlg6JTIuMlg6JTIuMlg6JTIuMlgiLAorCQliYS0+YlswXSwgYmEtPmJbMV0sIGJhLT5iWzJdLAorCQliYS0+YlszXSwgYmEtPmJbNF0sIGJhLT5iWzVdKTsKKworCXJldHVybiBzdHJbaV07Cit9CitFWFBPUlRfU1lNQk9MKGJhdG9zdHIpOworCisvKiBCbHVldG9vdGggZXJyb3IgY29kZXMgdG8gVW5peCBlcnJubyBtYXBwaW5nICovCitpbnQgYnRfZXJyKF9fdTE2IGNvZGUpCit7CisJc3dpdGNoIChjb2RlKSB7CisJY2FzZSAwOgorCQlyZXR1cm4gMDsKKworCWNhc2UgMHgwMToKKwkJcmV0dXJuIEVCQURSUUM7CisKKwljYXNlIDB4MDI6CisJCXJldHVybiBFTk9UQ09OTjsKKworCWNhc2UgMHgwMzoKKwkJcmV0dXJuIEVJTzsKKworCWNhc2UgMHgwNDoKKwkJcmV0dXJuIEVIT1NURE9XTjsKKworCWNhc2UgMHgwNToKKwkJcmV0dXJuIEVBQ0NFUzsKKworCWNhc2UgMHgwNjoKKwkJcmV0dXJuIEVCQURFOworCisJY2FzZSAweDA3OgorCQlyZXR1cm4gRU5PTUVNOworCisJY2FzZSAweDA4OgorCQlyZXR1cm4gRVRJTUVET1VUOworCisJY2FzZSAweDA5OgorCQlyZXR1cm4gRU1MSU5LOworCisJY2FzZSAweDBhOgorCQlyZXR1cm4gRU1MSU5LOworCisJY2FzZSAweDBiOgorCQlyZXR1cm4gRUFMUkVBRFk7CisKKwljYXNlIDB4MGM6CisJCXJldHVybiBFQlVTWTsKKworCWNhc2UgMHgwZDoKKwljYXNlIDB4MGU6CisJY2FzZSAweDBmOgorCQlyZXR1cm4gRUNPTk5SRUZVU0VEOworCisJY2FzZSAweDEwOgorCQlyZXR1cm4gRVRJTUVET1VUOworCisJY2FzZSAweDExOgorCWNhc2UgMHgyNzoKKwljYXNlIDB4Mjk6CisJY2FzZSAweDIwOgorCQlyZXR1cm4gRU9QTk9UU1VQUDsKKworCWNhc2UgMHgxMjoKKwkJcmV0dXJuIEVJTlZBTDsKKworCWNhc2UgMHgxMzoKKwljYXNlIDB4MTQ6CisJY2FzZSAweDE1OgorCQlyZXR1cm4gRUNPTk5SRVNFVDsKKworCWNhc2UgMHgxNjoKKwkJcmV0dXJuIEVDT05OQUJPUlRFRDsKKworCWNhc2UgMHgxNzoKKwkJcmV0dXJuIEVMT09QOworCisJY2FzZSAweDE4OgorCQlyZXR1cm4gRUFDQ0VTOworCisJY2FzZSAweDFhOgorCQlyZXR1cm4gRVBST1RPTk9TVVBQT1JUOworCisJY2FzZSAweDFiOgorCQlyZXR1cm4gRUNPTk5SRUZVU0VEOworCisJY2FzZSAweDE5OgorCWNhc2UgMHgxZToKKwljYXNlIDB4MjM6CisJY2FzZSAweDI0OgorCWNhc2UgMHgyNToKKwkJcmV0dXJuIEVQUk9UTzsKKworCWRlZmF1bHQ6CisJCXJldHVybiBFTk9TWVM7CisJfQorfQorRVhQT1JUX1NZTUJPTChidF9lcnIpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9yZmNvbW0vS2NvbmZpZyBiL25ldC9ibHVldG9vdGgvcmZjb21tL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA1YTBlNgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9ibHVldG9vdGgvcmZjb21tL0tjb25maWcKQEAgLTAsMCArMSwxNyBAQAorY29uZmlnIEJUX1JGQ09NTQorCXRyaXN0YXRlICJSRkNPTU0gcHJvdG9jb2wgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJUICYmIEJUX0wyQ0FQCisJaGVscAorCSAgUkZDT01NIHByb3ZpZGVzIGNvbm5lY3Rpb24gb3JpZW50ZWQgc3RyZWFtIHRyYW5zcG9ydC4gIFJGQ09NTQorCSAgc3VwcG9ydCBpcyByZXF1aXJlZCBmb3IgRGlhbHVwIE5ldHdvcmtpbmcsIE9CRVggYW5kIG90aGVyIEJsdWV0b290aAorCSAgYXBwbGljYXRpb25zLgorCisJICBTYXkgWSBoZXJlIHRvIGNvbXBpbGUgUkZDT01NIHN1cHBvcnQgaW50byB0aGUga2VybmVsIG9yIHNheSBNIHRvCisJICBjb21waWxlIGl0IGFzIG1vZHVsZSAocmZjb21tKS4KKworY29uZmlnIEJUX1JGQ09NTV9UVFkKKwlib29sICJSRkNPTU0gVFRZIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBCVF9SRkNPTU0KKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIFRUWSBlbXVsYXRpb24gc3VwcG9ydCBmb3IgUkZDT01NIGNoYW5uZWxzLgorCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS9NYWtlZmlsZSBiL25ldC9ibHVldG9vdGgvcmZjb21tL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlY2VjNDUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBCbHVldG9vdGggUkZDT01NIGxheWVyLgorIworCitvYmotJChDT05GSUdfQlRfUkZDT01NKSArPSByZmNvbW0ubworCityZmNvbW0teQkJCTo9IGNvcmUubyBzb2NrLm8gY3JjLm8KK3JmY29tbS0kKENPTkZJR19CVF9SRkNPTU1fVFRZKQkrPSB0dHkubwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9yZmNvbW0vY29yZS5jIGIvbmV0L2JsdWV0b290aC9yZmNvbW0vY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZTZmZGEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9jb3JlLmMKQEAgLTAsMCArMSwyMTI3IEBACisvKiAKKyAgIFJGQ09NTSBpbXBsZW1lbnRhdGlvbiBmb3IgTGludXggQmx1ZXRvb3RoIHN0YWNrIChCbHVlWikuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgTWF4aW0gS3Jhc255YW5za3kgPG1heGtAcXVhbGNvbW0uY29tPgorICAgQ29weXJpZ2h0IChDKSAyMDAyIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBBTkQgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZCisgICBDTEFJTSwgT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUyAKKyAgIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiAKKyAgIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIAorICAgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworICAgQUxMIExJQUJJTElUWSwgSU5DTFVESU5HIExJQUJJTElUWSBGT1IgSU5GUklOR0VNRU5UIE9GIEFOWSBQQVRFTlRTLCAKKyAgIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLCBSRUxBVElORyBUTyBVU0UgT0YgVEhJUyAKKyAgIFNPRlRXQVJFIElTIERJU0NMQUlNRUQuCisqLworCisvKiAKKyAgIFJQTiBzdXBwb3J0ICAgIC0gICAgRGlyayBIdXNlbWFubiA8aHVkQHp1cmljaC5pYm0uY29tPgorKi8KKworLyoKKyAqIEJsdWV0b290aCBSRkNPTU0gY29yZS4KKyAqCisgKiAkSWQ6IGNvcmUuYyx2IDEuNDIgMjAwMi8xMC8wMSAyMzoyNjoyNSBtYXhrIEV4cCAkCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2wyY2FwLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9yZmNvbW0uaD4KKworI2RlZmluZSBWRVJTSU9OICIxLjUiCisKKyNpZm5kZWYgQ09ORklHX0JUX1JGQ09NTV9ERUJVRworI3VuZGVmICBCVF9EQkcKKyNkZWZpbmUgQlRfREJHKEQuLi4pCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfYnRfcmZjb21tOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnJmY29tbV90aHJlYWQ7CisKK3N0YXRpYyBERUNMQVJFX01VVEVYKHJmY29tbV9zZW0pOworI2RlZmluZSByZmNvbW1fbG9jaygpCWRvd24oJnJmY29tbV9zZW0pOworI2RlZmluZSByZmNvbW1fdW5sb2NrKCkJdXAoJnJmY29tbV9zZW0pOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyByZmNvbW1fZXZlbnQ7CisKK3N0YXRpYyBMSVNUX0hFQUQoc2Vzc2lvbl9saXN0KTsKK3N0YXRpYyBhdG9taWNfdCB0ZXJtaW5hdGUsIHJ1bm5pbmc7CisKK3N0YXRpYyBpbnQgcmZjb21tX3NlbmRfZnJhbWUoc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCB1OCAqZGF0YSwgaW50IGxlbik7CitzdGF0aWMgaW50IHJmY29tbV9zZW5kX3NhYm0oc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCB1OCBkbGNpKTsKK3N0YXRpYyBpbnQgcmZjb21tX3NlbmRfZGlzYyhzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIHU4IGRsY2kpOworc3RhdGljIGludCByZmNvbW1fcXVldWVfZGlzYyhzdHJ1Y3QgcmZjb21tX2RsYyAqZCk7CitzdGF0aWMgaW50IHJmY29tbV9zZW5kX25zYyhzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIGludCBjciwgdTggdHlwZSk7CitzdGF0aWMgaW50IHJmY29tbV9zZW5kX3BuKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgaW50IGNyLCBzdHJ1Y3QgcmZjb21tX2RsYyAqZCk7CitzdGF0aWMgaW50IHJmY29tbV9zZW5kX21zYyhzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIGludCBjciwgdTggZGxjaSwgdTggdjI0X3NpZyk7CitzdGF0aWMgaW50IHJmY29tbV9zZW5kX3Rlc3Qoc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCBpbnQgY3IsIHU4ICpwYXR0ZXJuLCBpbnQgbGVuKTsKK3N0YXRpYyBpbnQgcmZjb21tX3NlbmRfY3JlZGl0cyhzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIHU4IGFkZHIsIHU4IGNyZWRpdHMpOworc3RhdGljIHZvaWQgcmZjb21tX21ha2VfdWloKHN0cnVjdCBza19idWZmICpza2IsIHU4IGFkZHIpOworCitzdGF0aWMgdm9pZCByZmNvbW1fcHJvY2Vzc19jb25uZWN0KHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnJmY29tbV9zZXNzaW9uX2NyZWF0ZShiZGFkZHJfdCAqc3JjLCBiZGFkZHJfdCAqZHN0LCBpbnQgKmVycik7CitzdGF0aWMgc3RydWN0IHJmY29tbV9zZXNzaW9uICpyZmNvbW1fc2Vzc2lvbl9nZXQoYmRhZGRyX3QgKnNyYywgYmRhZGRyX3QgKmRzdCk7CitzdGF0aWMgdm9pZCByZmNvbW1fc2Vzc2lvbl9kZWwoc3RydWN0IHJmY29tbV9zZXNzaW9uICpzKTsKKworLyogLS0tLSBSRkNPTU0gZnJhbWUgcGFyc2luZyBtYWNyb3MgLS0tLSAqLworI2RlZmluZSBfX2dldF9kbGNpKGIpICAgICAoKGIgJiAweGZjKSA+PiAyKQorI2RlZmluZSBfX2dldF9jaGFubmVsKGIpICAoKGIgJiAweGY4KSA+PiAzKQorI2RlZmluZSBfX2dldF9kaXIoYikgICAgICAoKGIgJiAweDA0KSA+PiAyKQorI2RlZmluZSBfX2dldF90eXBlKGIpICAgICAoKGIgJiAweGVmKSkKKworI2RlZmluZSBfX3Rlc3RfZWEoYikgICAgICAoKGIgJiAweDAxKSkKKyNkZWZpbmUgX190ZXN0X2NyKGIpICAgICAgKChiICYgMHgwMikpCisjZGVmaW5lIF9fdGVzdF9wZihiKSAgICAgICgoYiAmIDB4MTApKQorCisjZGVmaW5lIF9fYWRkcihjciwgZGxjaSkgICAgICAgKCgoZGxjaSAmIDB4M2YpIDw8IDIpIHwgKGNyIDw8IDEpIHwgMHgwMSkKKyNkZWZpbmUgX19jdHJsKHR5cGUsIHBmKSAgICAgICAoKCh0eXBlICYgMHhlZikgfCAocGYgPDwgNCkpKQorI2RlZmluZSBfX2RsY2koZGlyLCBjaG4pICAgICAgICgoKGNobiAmIDB4MWYpIDw8IDEpIHwgZGlyKQorI2RlZmluZSBfX3Nydl9jaGFubmVsKGRsY2kpICAgIChkbGNpID4+IDEpCisjZGVmaW5lIF9fZGlyKGRsY2kpICAgICAgICAgICAgKGRsY2kgJiAweDAxKQorCisjZGVmaW5lIF9fbGVuOChsZW4pICAgICAgICgoKGxlbikgPDwgMSkgfCAxKQorI2RlZmluZSBfX2xlbjE2KGxlbikgICAgICAoKGxlbikgPDwgMSkKKworLyogTUNDIG1hY3JvcyAqLworI2RlZmluZSBfX21jY190eXBlKGNyLCB0eXBlKSAgICgoKHR5cGUgPDwgMikgfCAoY3IgPDwgMSkgfCAweDAxKSkKKyNkZWZpbmUgX19nZXRfbWNjX3R5cGUoYikgKChiICYgMHhmYykgPj4gMikKKyNkZWZpbmUgX19nZXRfbWNjX2xlbihiKSAgKChiICYgMHhmZSkgPj4gMSkKKworLyogUlBOIG1hY3JvcyAqLworI2RlZmluZSBfX3Jwbl9saW5lX3NldHRpbmdzKGRhdGEsIHN0b3AsIHBhcml0eSkgICgoZGF0YSAmIDB4MykgfCAoKHN0b3AgJiAweDEpIDw8IDIpIHwgKChwYXJpdHkgJiAweDMpIDw8IDMpKQorI2RlZmluZSBfX2dldF9ycG5fZGF0YV9iaXRzKGxpbmUpICgobGluZSkgJiAweDMpCisjZGVmaW5lIF9fZ2V0X3Jwbl9zdG9wX2JpdHMobGluZSkgKCgobGluZSkgPj4gMikgJiAweDEpCisjZGVmaW5lIF9fZ2V0X3Jwbl9wYXJpdHkobGluZSkgICAgKCgobGluZSkgPj4gMykgJiAweDMpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZmNvbW1fc2NoZWR1bGUodWludCBldmVudCkKK3sKKwlpZiAoIXJmY29tbV90aHJlYWQpCisJCXJldHVybjsKKwkvL3NldF9iaXQoZXZlbnQsICZyZmNvbW1fZXZlbnQpOworCXNldF9iaXQoUkZDT01NX1NDSEVEX1dBS0VVUCwgJnJmY29tbV9ldmVudCk7CisJd2FrZV91cF9wcm9jZXNzKHJmY29tbV90aHJlYWQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmZjb21tX3Nlc3Npb25fcHV0KHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcykKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcy0+cmVmY250KSkKKwkJcmZjb21tX3Nlc3Npb25fZGVsKHMpOworfQorCisvKiAtLS0tIFJGQ09NTSBGQ1MgY29tcHV0YXRpb24gLS0tLSAqLworCisvKiBDUkMgb24gMiBieXRlcyAqLworI2RlZmluZSBfX2NyYyhkYXRhKSAocmZjb21tX2NyY190YWJsZVtyZmNvbW1fY3JjX3RhYmxlWzB4ZmYgXiBkYXRhWzBdXSBeIGRhdGFbMV1dKQorCisvKiBGQ1Mgb24gMiBieXRlcyAqLyAKK3N0YXRpYyBpbmxpbmUgdTggX19mY3ModTggKmRhdGEpCit7CisJcmV0dXJuICgweGZmIC0gX19jcmMoZGF0YSkpOworfQorCisvKiBGQ1Mgb24gMyBieXRlcyAqLyAKK3N0YXRpYyBpbmxpbmUgdTggX19mY3MyKHU4ICpkYXRhKQoreworCXJldHVybiAoMHhmZiAtIHJmY29tbV9jcmNfdGFibGVbX19jcmMoZGF0YSkgXiBkYXRhWzJdXSk7Cit9CisKKy8qIENoZWNrIEZDUyAqLworc3RhdGljIGlubGluZSBpbnQgX19jaGVja19mY3ModTggKmRhdGEsIGludCB0eXBlLCB1OCBmY3MpCit7CisJdTggZiA9IF9fY3JjKGRhdGEpOworCisJaWYgKHR5cGUgIT0gUkZDT01NX1VJSCkKKwkJZiA9IHJmY29tbV9jcmNfdGFibGVbZiBeIGRhdGFbMl1dOworCisJcmV0dXJuIHJmY29tbV9jcmNfdGFibGVbZiBeIGZjc10gIT0gMHhjZjsKK30KKworLyogLS0tLSBMMkNBUCBjYWxsYmFja3MgLS0tLSAqLworc3RhdGljIHZvaWQgcmZjb21tX2wyc3RhdGVfY2hhbmdlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlCVF9EQkcoIiVwIHN0YXRlICVkIiwgc2ssIHNrLT5za19zdGF0ZSk7CisJcmZjb21tX3NjaGVkdWxlKFJGQ09NTV9TQ0hFRF9TVEFURSk7Cit9CisKK3N0YXRpYyB2b2lkIHJmY29tbV9sMmRhdGFfcmVhZHkoc3RydWN0IHNvY2sgKnNrLCBpbnQgYnl0ZXMpCit7CisJQlRfREJHKCIlcCBieXRlcyAlZCIsIHNrLCBieXRlcyk7CisJcmZjb21tX3NjaGVkdWxlKFJGQ09NTV9TQ0hFRF9SWCk7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX2wyc29ja19jcmVhdGUoc3RydWN0IHNvY2tldCAqKnNvY2spCit7CisJaW50IGVycjsKKworCUJUX0RCRygiIik7CisKKwllcnIgPSBzb2NrX2NyZWF0ZV9rZXJuKFBGX0JMVUVUT09USCwgU09DS19TRVFQQUNLRVQsIEJUUFJPVE9fTDJDQVAsIHNvY2spOworCWlmICghZXJyKSB7CisJCXN0cnVjdCBzb2NrICpzayA9ICgqc29jayktPnNrOworCQlzay0+c2tfZGF0YV9yZWFkeSAgID0gcmZjb21tX2wyZGF0YV9yZWFkeTsKKwkJc2stPnNrX3N0YXRlX2NoYW5nZSA9IHJmY29tbV9sMnN0YXRlX2NoYW5nZTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyogLS0tLSBSRkNPTU0gRExDcyAtLS0tICovCitzdGF0aWMgdm9pZCByZmNvbW1fZGxjX3RpbWVvdXQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHJmY29tbV9kbGMgKmQgPSAodm9pZCAqKSBhcmc7CisKKwlCVF9EQkcoImRsYyAlcCBzdGF0ZSAlbGQiLCBkLCBkLT5zdGF0ZSk7CisKKwlzZXRfYml0KFJGQ09NTV9USU1FRF9PVVQsICZkLT5mbGFncyk7CisJcmZjb21tX2RsY19wdXQoZCk7CisJcmZjb21tX3NjaGVkdWxlKFJGQ09NTV9TQ0hFRF9USU1FTyk7Cit9CisKK3N0YXRpYyB2b2lkIHJmY29tbV9kbGNfc2V0X3RpbWVyKHN0cnVjdCByZmNvbW1fZGxjICpkLCBsb25nIHRpbWVvdXQpCit7CisJQlRfREJHKCJkbGMgJXAgc3RhdGUgJWxkIHRpbWVvdXQgJWxkIiwgZCwgZC0+c3RhdGUsIHRpbWVvdXQpOworCisJaWYgKCFtb2RfdGltZXIoJmQtPnRpbWVyLCBqaWZmaWVzICsgdGltZW91dCkpCisJCXJmY29tbV9kbGNfaG9sZChkKTsKK30KKworc3RhdGljIHZvaWQgcmZjb21tX2RsY19jbGVhcl90aW1lcihzdHJ1Y3QgcmZjb21tX2RsYyAqZCkKK3sKKwlCVF9EQkcoImRsYyAlcCBzdGF0ZSAlbGQiLCBkLCBkLT5zdGF0ZSk7CisKKwlpZiAodGltZXJfcGVuZGluZygmZC0+dGltZXIpICYmIGRlbF90aW1lcigmZC0+dGltZXIpKQorCQlyZmNvbW1fZGxjX3B1dChkKTsKK30KKworc3RhdGljIHZvaWQgcmZjb21tX2RsY19jbGVhcl9zdGF0ZShzdHJ1Y3QgcmZjb21tX2RsYyAqZCkKK3sKKwlCVF9EQkcoIiVwIiwgZCk7CisKKwlkLT5zdGF0ZSAgICAgID0gQlRfT1BFTjsKKwlkLT5mbGFncyAgICAgID0gMDsKKwlkLT5tc2NleCAgICAgID0gMDsKKwlkLT5tdHUgICAgICAgID0gUkZDT01NX0RFRkFVTFRfTVRVOworCWQtPnYyNF9zaWcgICAgPSBSRkNPTU1fVjI0X1JUQyB8IFJGQ09NTV9WMjRfUlRSIHwgUkZDT01NX1YyNF9EVjsKKworCWQtPmNmYyAgICAgICAgPSBSRkNPTU1fQ0ZDX0RJU0FCTEVEOworCWQtPnJ4X2NyZWRpdHMgPSBSRkNPTU1fREVGQVVMVF9DUkVESVRTOworfQorCitzdHJ1Y3QgcmZjb21tX2RsYyAqcmZjb21tX2RsY19hbGxvYyhpbnQgcHJpbykKK3sKKwlzdHJ1Y3QgcmZjb21tX2RsYyAqZCA9IGttYWxsb2Moc2l6ZW9mKCpkKSwgcHJpbyk7CisJaWYgKCFkKQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQoZCwgMCwgc2l6ZW9mKCpkKSk7CisKKwlpbml0X3RpbWVyKCZkLT50aW1lcik7CisJZC0+dGltZXIuZnVuY3Rpb24gPSByZmNvbW1fZGxjX3RpbWVvdXQ7CisJZC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkOworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmZC0+dHhfcXVldWUpOworCXNwaW5fbG9ja19pbml0KCZkLT5sb2NrKTsKKwlhdG9taWNfc2V0KCZkLT5yZWZjbnQsIDEpOworCisJcmZjb21tX2RsY19jbGVhcl9zdGF0ZShkKTsKKwkKKwlCVF9EQkcoIiVwIiwgZCk7CisJcmV0dXJuIGQ7Cit9CisKK3ZvaWQgcmZjb21tX2RsY19mcmVlKHN0cnVjdCByZmNvbW1fZGxjICpkKQoreworCUJUX0RCRygiJXAiLCBkKTsKKworCXNrYl9xdWV1ZV9wdXJnZSgmZC0+dHhfcXVldWUpOworCWtmcmVlKGQpOworfQorCitzdGF0aWMgdm9pZCByZmNvbW1fZGxjX2xpbmsoc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCBzdHJ1Y3QgcmZjb21tX2RsYyAqZCkKK3sKKwlCVF9EQkcoImRsYyAlcCBzZXNzaW9uICVwIiwgZCwgcyk7CisKKwlyZmNvbW1fc2Vzc2lvbl9ob2xkKHMpOworCisJcmZjb21tX2RsY19ob2xkKGQpOworCWxpc3RfYWRkKCZkLT5saXN0LCAmcy0+ZGxjcyk7CisJZC0+c2Vzc2lvbiA9IHM7Cit9CisKK3N0YXRpYyB2b2lkIHJmY29tbV9kbGNfdW5saW5rKHN0cnVjdCByZmNvbW1fZGxjICpkKQoreworCXN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcyA9IGQtPnNlc3Npb247CisKKwlCVF9EQkcoImRsYyAlcCByZWZjbnQgJWQgc2Vzc2lvbiAlcCIsIGQsIGF0b21pY19yZWFkKCZkLT5yZWZjbnQpLCBzKTsKKworCWxpc3RfZGVsKCZkLT5saXN0KTsKKwlkLT5zZXNzaW9uID0gTlVMTDsKKwlyZmNvbW1fZGxjX3B1dChkKTsKKworCXJmY29tbV9zZXNzaW9uX3B1dChzKTsKK30KKworc3RhdGljIHN0cnVjdCByZmNvbW1fZGxjICpyZmNvbW1fZGxjX2dldChzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIHU4IGRsY2kpCit7CisJc3RydWN0IHJmY29tbV9kbGMgKmQ7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKworCWxpc3RfZm9yX2VhY2gocCwgJnMtPmRsY3MpIHsKKwkJZCA9IGxpc3RfZW50cnkocCwgc3RydWN0IHJmY29tbV9kbGMsIGxpc3QpOworCQlpZiAoZC0+ZGxjaSA9PSBkbGNpKQorCQkJcmV0dXJuIGQ7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IF9fcmZjb21tX2RsY19vcGVuKHN0cnVjdCByZmNvbW1fZGxjICpkLCBiZGFkZHJfdCAqc3JjLCBiZGFkZHJfdCAqZHN0LCB1OCBjaGFubmVsKQoreworCXN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqczsKKwlpbnQgZXJyID0gMDsKKwl1OCBkbGNpOworCisJQlRfREJHKCJkbGMgJXAgc3RhdGUgJWxkICVzICVzIGNoYW5uZWwgJWQiLCAKKwkJCWQsIGQtPnN0YXRlLCBiYXRvc3RyKHNyYyksIGJhdG9zdHIoZHN0KSwgY2hhbm5lbCk7CisKKwlpZiAoY2hhbm5lbCA8IDEgfHwgY2hhbm5lbCA+IDMwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChkLT5zdGF0ZSAhPSBCVF9PUEVOICYmIGQtPnN0YXRlICE9IEJUX0NMT1NFRCkKKwkJcmV0dXJuIDA7CisKKwlzID0gcmZjb21tX3Nlc3Npb25fZ2V0KHNyYywgZHN0KTsKKwlpZiAoIXMpIHsKKwkJcyA9IHJmY29tbV9zZXNzaW9uX2NyZWF0ZShzcmMsIGRzdCwgJmVycik7CisJCWlmICghcykKKwkJCXJldHVybiBlcnI7CisJfQorCisJZGxjaSA9IF9fZGxjaSghcy0+aW5pdGlhdG9yLCBjaGFubmVsKTsKKworCS8qIENoZWNrIGlmIERMQ0kgYWxyZWFkeSBleGlzdHMgKi8KKwlpZiAocmZjb21tX2RsY19nZXQocywgZGxjaSkpCisJCXJldHVybiAtRUJVU1k7CisKKwlyZmNvbW1fZGxjX2NsZWFyX3N0YXRlKGQpOworCisJZC0+ZGxjaSAgICAgPSBkbGNpOworCWQtPmFkZHIgICAgID0gX19hZGRyKHMtPmluaXRpYXRvciwgZGxjaSk7CisJZC0+cHJpb3JpdHkgPSA3OworCisJZC0+c3RhdGUgICAgPSBCVF9DT05GSUc7CisJcmZjb21tX2RsY19saW5rKHMsIGQpOworCisJZC0+bXR1ID0gcy0+bXR1OworCWQtPmNmYyA9IChzLT5jZmMgPT0gUkZDT01NX0NGQ19VTktOT1dOKSA/IDAgOiBzLT5jZmM7CisKKwlpZiAocy0+c3RhdGUgPT0gQlRfQ09OTkVDVEVEKQorCQlyZmNvbW1fc2VuZF9wbihzLCAxLCBkKTsKKwlyZmNvbW1fZGxjX3NldF90aW1lcihkLCBSRkNPTU1fQ09OTl9USU1FT1VUKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJmY29tbV9kbGNfb3BlbihzdHJ1Y3QgcmZjb21tX2RsYyAqZCwgYmRhZGRyX3QgKnNyYywgYmRhZGRyX3QgKmRzdCwgdTggY2hhbm5lbCkKK3sKKwlpbnQgcjsKKworCXJmY29tbV9sb2NrKCk7CisKKwlyID0gX19yZmNvbW1fZGxjX29wZW4oZCwgc3JjLCBkc3QsIGNoYW5uZWwpOworCisJcmZjb21tX3VubG9jaygpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9fcmZjb21tX2RsY19jbG9zZShzdHJ1Y3QgcmZjb21tX2RsYyAqZCwgaW50IGVycikKK3sKKwlzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMgPSBkLT5zZXNzaW9uOworCWlmICghcykKKwkJcmV0dXJuIDA7CisKKwlCVF9EQkcoImRsYyAlcCBzdGF0ZSAlbGQgZGxjaSAlZCBlcnIgJWQgc2Vzc2lvbiAlcCIsCisJCQlkLCBkLT5zdGF0ZSwgZC0+ZGxjaSwgZXJyLCBzKTsKKworCXN3aXRjaCAoZC0+c3RhdGUpIHsKKwljYXNlIEJUX0NPTk5FQ1RFRDoKKwljYXNlIEJUX0NPTkZJRzoKKwljYXNlIEJUX0NPTk5FQ1Q6CisJCWQtPnN0YXRlID0gQlRfRElTQ09OTjsKKwkJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmZC0+dHhfcXVldWUpKSB7CisJCQlyZmNvbW1fc2VuZF9kaXNjKHMsIGQtPmRsY2kpOworCQkJcmZjb21tX2RsY19zZXRfdGltZXIoZCwgUkZDT01NX0RJU0NfVElNRU9VVCk7CisJCX0gZWxzZSB7CisJCQlyZmNvbW1fcXVldWVfZGlzYyhkKTsKKwkJCXJmY29tbV9kbGNfc2V0X3RpbWVyKGQsIFJGQ09NTV9ESVNDX1RJTUVPVVQgKiAyKTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJmY29tbV9kbGNfY2xlYXJfdGltZXIoZCk7CisKKwkJcmZjb21tX2RsY19sb2NrKGQpOworCQlkLT5zdGF0ZSA9IEJUX0NMT1NFRDsKKwkJZC0+c3RhdGVfY2hhbmdlKGQsIGVycik7CisJCXJmY29tbV9kbGNfdW5sb2NrKGQpOworCisJCXNrYl9xdWV1ZV9wdXJnZSgmZC0+dHhfcXVldWUpOworCQlyZmNvbW1fc2Vzc2lvbl9wdXQocyk7CisKKwkJcmZjb21tX2RsY191bmxpbmsoZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCByZmNvbW1fZGxjX2Nsb3NlKHN0cnVjdCByZmNvbW1fZGxjICpkLCBpbnQgZXJyKQoreworCWludCByOworCisJcmZjb21tX2xvY2soKTsKKworCXIgPSBfX3JmY29tbV9kbGNfY2xvc2UoZCwgZXJyKTsKKworCXJmY29tbV91bmxvY2soKTsKKwlyZXR1cm4gcjsKK30KKworaW50IHJmY29tbV9kbGNfc2VuZChzdHJ1Y3QgcmZjb21tX2RsYyAqZCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgbGVuID0gc2tiLT5sZW47CisKKwlpZiAoZC0+c3RhdGUgIT0gQlRfQ09OTkVDVEVEKQorCQlyZXR1cm4gLUVOT1RDT05OOworCisJQlRfREJHKCJkbGMgJXAgbXR1ICVkIGxlbiAlZCIsIGQsIGQtPm10dSwgbGVuKTsKKworCWlmIChsZW4gPiBkLT5tdHUpCisJCXJldHVybiAtRUlOVkFMOworCisJcmZjb21tX21ha2VfdWloKHNrYiwgZC0+YWRkcik7CisJc2tiX3F1ZXVlX3RhaWwoJmQtPnR4X3F1ZXVlLCBza2IpOworCisJaWYgKCF0ZXN0X2JpdChSRkNPTU1fVFhfVEhST1RUTEVELCAmZC0+ZmxhZ3MpKQorCQlyZmNvbW1fc2NoZWR1bGUoUkZDT01NX1NDSEVEX1RYKTsKKwlyZXR1cm4gbGVuOworfQorCit2b2lkIGZhc3RjYWxsIF9fcmZjb21tX2RsY190aHJvdHRsZShzdHJ1Y3QgcmZjb21tX2RsYyAqZCkKK3sKKwlCVF9EQkcoImRsYyAlcCBzdGF0ZSAlbGQiLCBkLCBkLT5zdGF0ZSk7CisKKwlpZiAoIWQtPmNmYykgeworCQlkLT52MjRfc2lnIHw9IFJGQ09NTV9WMjRfRkM7CisJCXNldF9iaXQoUkZDT01NX01TQ19QRU5ESU5HLCAmZC0+ZmxhZ3MpOworCX0KKwlyZmNvbW1fc2NoZWR1bGUoUkZDT01NX1NDSEVEX1RYKTsKK30KKwordm9pZCBmYXN0Y2FsbCBfX3JmY29tbV9kbGNfdW50aHJvdHRsZShzdHJ1Y3QgcmZjb21tX2RsYyAqZCkKK3sKKwlCVF9EQkcoImRsYyAlcCBzdGF0ZSAlbGQiLCBkLCBkLT5zdGF0ZSk7CisKKwlpZiAoIWQtPmNmYykgeworCQlkLT52MjRfc2lnICY9IH5SRkNPTU1fVjI0X0ZDOworCQlzZXRfYml0KFJGQ09NTV9NU0NfUEVORElORywgJmQtPmZsYWdzKTsKKwl9CisJcmZjb21tX3NjaGVkdWxlKFJGQ09NTV9TQ0hFRF9UWCk7Cit9CisKKy8qIAorICAgU2V0L2dldCBtb2RlbSBzdGF0dXMgZnVuY3Rpb25zIHVzZSBfbG9jYWxfIHN0YXR1cyBpLmUuIHdoYXQgd2UgcmVwb3J0CisgICB0byB0aGUgb3RoZXIgc2lkZS4KKyAgIFJlbW90ZSBzdGF0dXMgaXMgcHJvdmlkZWQgYnkgZGxjLT5tb2RlbV9zdGF0dXMoKSBjYWxsYmFjay4KKyAqLworaW50IHJmY29tbV9kbGNfc2V0X21vZGVtX3N0YXR1cyhzdHJ1Y3QgcmZjb21tX2RsYyAqZCwgdTggdjI0X3NpZykKK3sKKwlCVF9EQkcoImRsYyAlcCBzdGF0ZSAlbGQgdjI0X3NpZyAweCV4IiwgCisJCQlkLCBkLT5zdGF0ZSwgdjI0X3NpZyk7CisKKwlpZiAodGVzdF9iaXQoUkZDT01NX1JYX1RIUk9UVExFRCwgJmQtPmZsYWdzKSkKKwkJdjI0X3NpZyB8PSBSRkNPTU1fVjI0X0ZDOworCWVsc2UKKwkJdjI0X3NpZyAmPSB+UkZDT01NX1YyNF9GQzsKKwkKKwlkLT52MjRfc2lnID0gdjI0X3NpZzsKKworCWlmICghdGVzdF9hbmRfc2V0X2JpdChSRkNPTU1fTVNDX1BFTkRJTkcsICZkLT5mbGFncykpCisJCXJmY29tbV9zY2hlZHVsZShSRkNPTU1fU0NIRURfVFgpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCByZmNvbW1fZGxjX2dldF9tb2RlbV9zdGF0dXMoc3RydWN0IHJmY29tbV9kbGMgKmQsIHU4ICp2MjRfc2lnKQoreworCUJUX0RCRygiZGxjICVwIHN0YXRlICVsZCB2MjRfc2lnIDB4JXgiLCAKKwkJCWQsIGQtPnN0YXRlLCBkLT52MjRfc2lnKTsKKworCSp2MjRfc2lnID0gZC0+djI0X3NpZzsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLSBSRkNPTU0gc2Vzc2lvbnMgLS0tLSAqLworc3RhdGljIHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcmZjb21tX3Nlc3Npb25fYWRkKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMgPSBrbWFsbG9jKHNpemVvZigqcyksIEdGUF9LRVJORUwpOworCWlmICghcykKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KHMsIDAsIHNpemVvZigqcykpOworCisJQlRfREJHKCJzZXNzaW9uICVwIHNvY2sgJXAiLCBzLCBzb2NrKTsKKworCUlOSVRfTElTVF9IRUFEKCZzLT5kbGNzKTsKKwlzLT5zdGF0ZSA9IHN0YXRlOworCXMtPnNvY2sgID0gc29jazsKKworCXMtPm10dSA9IFJGQ09NTV9ERUZBVUxUX01UVTsKKwlzLT5jZmMgPSBSRkNPTU1fQ0ZDX1VOS05PV047CisKKwkvKiBEbyBub3QgaW5jcmVtZW50IG1vZHVsZSB1c2FnZSBjb3VudCBmb3IgbGlzdGVuaW5nIHNlc3Npb25zLgorCSAqIE90aGVyd2lzZSB3ZSB3b24ndCBiZSBhYmxlIHRvIHVubG9hZCB0aGUgbW9kdWxlLiAqLworCWlmIChzdGF0ZSAhPSBCVF9MSVNURU4pCisJCWlmICghdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpKSB7CisJCQlrZnJlZShzKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwlsaXN0X2FkZCgmcy0+bGlzdCwgJnNlc3Npb25fbGlzdCk7CisKKwlyZXR1cm4gczsKK30KKworc3RhdGljIHZvaWQgcmZjb21tX3Nlc3Npb25fZGVsKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcykKK3sKKwlpbnQgc3RhdGUgPSBzLT5zdGF0ZTsKKworCUJUX0RCRygic2Vzc2lvbiAlcCBzdGF0ZSAlbGQiLCBzLCBzLT5zdGF0ZSk7CisKKwlsaXN0X2RlbCgmcy0+bGlzdCk7CisKKwlpZiAoc3RhdGUgPT0gQlRfQ09OTkVDVEVEKQorCQlyZmNvbW1fc2VuZF9kaXNjKHMsIDApOworCisJc29ja19yZWxlYXNlKHMtPnNvY2spOworCWtmcmVlKHMpOworCisJaWYgKHN0YXRlICE9IEJUX0xJU1RFTikKKwkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnJmY29tbV9zZXNzaW9uX2dldChiZGFkZHJfdCAqc3JjLCBiZGFkZHJfdCAqZHN0KQoreworCXN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqbjsKKwlzdHJ1Y3QgYnRfc29jayAqc2s7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZzZXNzaW9uX2xpc3QpIHsKKwkJcyA9IGxpc3RfZW50cnkocCwgc3RydWN0IHJmY29tbV9zZXNzaW9uLCBsaXN0KTsKKwkJc2sgPSBidF9zayhzLT5zb2NrLT5zayk7IAorCisJCWlmICgoIWJhY21wKHNyYywgQkRBRERSX0FOWSkgfHwgIWJhY21wKCZzay0+c3JjLCBzcmMpKSAmJgorCQkJCSFiYWNtcCgmc2stPmRzdCwgZHN0KSkKKwkJCXJldHVybiBzOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgcmZjb21tX3Nlc3Npb25fY2xvc2Uoc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCBpbnQgZXJyKQoreworCXN0cnVjdCByZmNvbW1fZGxjICpkOworCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOworCisJQlRfREJHKCJzZXNzaW9uICVwIHN0YXRlICVsZCBlcnIgJWQiLCBzLCBzLT5zdGF0ZSwgZXJyKTsKKworCXJmY29tbV9zZXNzaW9uX2hvbGQocyk7CisKKwlzLT5zdGF0ZSA9IEJUX0NMT1NFRDsKKworCS8qIENsb3NlIGFsbCBkbGNzICovCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZzLT5kbGNzKSB7CisJCWQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCByZmNvbW1fZGxjLCBsaXN0KTsKKwkJZC0+c3RhdGUgPSBCVF9DTE9TRUQ7CisJCV9fcmZjb21tX2RsY19jbG9zZShkLCBlcnIpOworCX0KKworCXJmY29tbV9zZXNzaW9uX3B1dChzKTsKK30KKworc3RhdGljIHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcmZjb21tX3Nlc3Npb25fY3JlYXRlKGJkYWRkcl90ICpzcmMsIGJkYWRkcl90ICpkc3QsIGludCAqZXJyKQoreworCXN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcyA9IE5VTEw7CisJc3RydWN0IHNvY2thZGRyX2wyIGFkZHI7CisJc3RydWN0IHNvY2tldCAqc29jazsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlCVF9EQkcoIiVzICVzIiwgYmF0b3N0cihzcmMpLCBiYXRvc3RyKGRzdCkpOworCisJKmVyciA9IHJmY29tbV9sMnNvY2tfY3JlYXRlKCZzb2NrKTsKKwlpZiAoKmVyciA8IDApCisJCXJldHVybiBOVUxMOworCisJYmFjcHkoJmFkZHIubDJfYmRhZGRyLCBzcmMpOworCWFkZHIubDJfZmFtaWx5ID0gQUZfQkxVRVRPT1RIOworCWFkZHIubDJfcHNtICAgID0gMDsKKwkqZXJyID0gc29jay0+b3BzLT5iaW5kKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSk7CisJaWYgKCplcnIgPCAwKQorCQlnb3RvIGZhaWxlZDsKKworCS8qIFNldCBMMkNBUCBvcHRpb25zICovCisJc2sgPSBzb2NrLT5zazsKKwlsb2NrX3NvY2soc2spOworCWwyY2FwX3BpKHNrKS0+aW10dSA9IFJGQ09NTV9NQVhfTDJDQVBfTVRVOworCXJlbGVhc2Vfc29jayhzayk7CisKKwlzID0gcmZjb21tX3Nlc3Npb25fYWRkKHNvY2ssIEJUX0JPVU5EKTsKKwlpZiAoIXMpIHsKKwkJKmVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbGVkOworCX0KKworCXJmY29tbV9zZXNzaW9uX2hvbGQocyk7CisKKwlzLT5pbml0aWF0b3IgPSAxOworCisJYmFjcHkoJmFkZHIubDJfYmRhZGRyLCBkc3QpOworCWFkZHIubDJfZmFtaWx5ID0gQUZfQkxVRVRPT1RIOworCWFkZHIubDJfcHNtICAgID0gaHRvYnMoUkZDT01NX1BTTSk7CisJKmVyciA9IHNvY2stPm9wcy0+Y29ubmVjdChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkciksIE9fTk9OQkxPQ0spOworCWlmICgqZXJyID09IDAgfHwgKmVyciA9PSAtRUFHQUlOKQorCQlyZXR1cm4gczsKKworCXJmY29tbV9zZXNzaW9uX2RlbChzKTsKKwlyZXR1cm4gTlVMTDsKKworZmFpbGVkOgorCXNvY2tfcmVsZWFzZShzb2NrKTsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCByZmNvbW1fc2Vzc2lvbl9nZXRhZGRyKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgYmRhZGRyX3QgKnNyYywgYmRhZGRyX3QgKmRzdCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzLT5zb2NrLT5zazsKKwlpZiAoc3JjKQorCQliYWNweShzcmMsICZidF9zayhzayktPnNyYyk7CisJaWYgKGRzdCkKKwkJYmFjcHkoZHN0LCAmYnRfc2soc2spLT5kc3QpOworfQorCisvKiAtLS0tIFJGQ09NTSBmcmFtZSBzZW5kaW5nIC0tLS0gKi8KK3N0YXRpYyBpbnQgcmZjb21tX3NlbmRfZnJhbWUoc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCB1OCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gcy0+c29jazsKKwlzdHJ1Y3Qga3ZlYyBpdiA9IHsgZGF0YSwgbGVuIH07CisJc3RydWN0IG1zZ2hkciBtc2c7CisKKwlCVF9EQkcoInNlc3Npb24gJXAgbGVuICVkIiwgcywgbGVuKTsKKworCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CisKKwlyZXR1cm4ga2VybmVsX3NlbmRtc2coc29jaywgJm1zZywgJml2LCAxLCBsZW4pOworfQorCitzdGF0aWMgaW50IHJmY29tbV9zZW5kX3NhYm0oc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCB1OCBkbGNpKQoreworCXN0cnVjdCByZmNvbW1fY21kIGNtZDsKKworCUJUX0RCRygiJXAgZGxjaSAlZCIsIHMsIGRsY2kpOworCisJY21kLmFkZHIgPSBfX2FkZHIocy0+aW5pdGlhdG9yLCBkbGNpKTsKKwljbWQuY3RybCA9IF9fY3RybChSRkNPTU1fU0FCTSwgMSk7CisJY21kLmxlbiAgPSBfX2xlbjgoMCk7CisJY21kLmZjcyAgPSBfX2ZjczIoKHU4ICopICZjbWQpOworCisJcmV0dXJuIHJmY29tbV9zZW5kX2ZyYW1lKHMsICh2b2lkICopICZjbWQsIHNpemVvZihjbWQpKTsKK30KKworc3RhdGljIGludCByZmNvbW1fc2VuZF91YShzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIHU4IGRsY2kpCit7CisJc3RydWN0IHJmY29tbV9jbWQgY21kOworCisJQlRfREJHKCIlcCBkbGNpICVkIiwgcywgZGxjaSk7CisKKwljbWQuYWRkciA9IF9fYWRkcighcy0+aW5pdGlhdG9yLCBkbGNpKTsKKwljbWQuY3RybCA9IF9fY3RybChSRkNPTU1fVUEsIDEpOworCWNtZC5sZW4gID0gX19sZW44KDApOworCWNtZC5mY3MgID0gX19mY3MyKCh1OCAqKSAmY21kKTsKKworCXJldHVybiByZmNvbW1fc2VuZF9mcmFtZShzLCAodm9pZCAqKSAmY21kLCBzaXplb2YoY21kKSk7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3NlbmRfZGlzYyhzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIHU4IGRsY2kpCit7CisJc3RydWN0IHJmY29tbV9jbWQgY21kOworCisJQlRfREJHKCIlcCBkbGNpICVkIiwgcywgZGxjaSk7CisKKwljbWQuYWRkciA9IF9fYWRkcihzLT5pbml0aWF0b3IsIGRsY2kpOworCWNtZC5jdHJsID0gX19jdHJsKFJGQ09NTV9ESVNDLCAxKTsKKwljbWQubGVuICA9IF9fbGVuOCgwKTsKKwljbWQuZmNzICA9IF9fZmNzMigodTggKikgJmNtZCk7CisKKwlyZXR1cm4gcmZjb21tX3NlbmRfZnJhbWUocywgKHZvaWQgKikgJmNtZCwgc2l6ZW9mKGNtZCkpOworfQorCitzdGF0aWMgaW50IHJmY29tbV9xdWV1ZV9kaXNjKHN0cnVjdCByZmNvbW1fZGxjICpkKQoreworCXN0cnVjdCByZmNvbW1fY21kICpjbWQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCUJUX0RCRygiZGxjICVwIGRsY2kgJWQiLCBkLCBkLT5kbGNpKTsKKworCXNrYiA9IGFsbG9jX3NrYihzaXplb2YoKmNtZCksIEdGUF9LRVJORUwpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNtZCA9ICh2b2lkICopIF9fc2tiX3B1dChza2IsIHNpemVvZigqY21kKSk7CisJY21kLT5hZGRyID0gZC0+YWRkcjsKKwljbWQtPmN0cmwgPSBfX2N0cmwoUkZDT01NX0RJU0MsIDEpOworCWNtZC0+bGVuICA9IF9fbGVuOCgwKTsKKwljbWQtPmZjcyAgPSBfX2ZjczIoKHU4ICopIGNtZCk7CisKKwlza2JfcXVldWVfdGFpbCgmZC0+dHhfcXVldWUsIHNrYik7CisJcmZjb21tX3NjaGVkdWxlKFJGQ09NTV9TQ0hFRF9UWCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3NlbmRfZG0oc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCB1OCBkbGNpKQoreworCXN0cnVjdCByZmNvbW1fY21kIGNtZDsKKworCUJUX0RCRygiJXAgZGxjaSAlZCIsIHMsIGRsY2kpOworCisJY21kLmFkZHIgPSBfX2FkZHIoIXMtPmluaXRpYXRvciwgZGxjaSk7CisJY21kLmN0cmwgPSBfX2N0cmwoUkZDT01NX0RNLCAxKTsKKwljbWQubGVuICA9IF9fbGVuOCgwKTsKKwljbWQuZmNzICA9IF9fZmNzMigodTggKikgJmNtZCk7CisKKwlyZXR1cm4gcmZjb21tX3NlbmRfZnJhbWUocywgKHZvaWQgKikgJmNtZCwgc2l6ZW9mKGNtZCkpOworfQorCitzdGF0aWMgaW50IHJmY29tbV9zZW5kX25zYyhzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIGludCBjciwgdTggdHlwZSkKK3sKKwlzdHJ1Y3QgcmZjb21tX2hkciAqaGRyOworCXN0cnVjdCByZmNvbW1fbWNjICptY2M7CisJdTggYnVmWzE2XSwgKnB0ciA9IGJ1ZjsKKworCUJUX0RCRygiJXAgY3IgJWQgdHlwZSAlZCIsIHMsIGNyLCB0eXBlKTsKKworCWhkciA9ICh2b2lkICopIHB0cjsgcHRyICs9IHNpemVvZigqaGRyKTsKKwloZHItPmFkZHIgPSBfX2FkZHIocy0+aW5pdGlhdG9yLCAwKTsKKwloZHItPmN0cmwgPSBfX2N0cmwoUkZDT01NX1VJSCwgMCk7CisJaGRyLT5sZW4gID0gX19sZW44KHNpemVvZigqbWNjKSArIDEpOworCisJbWNjID0gKHZvaWQgKikgcHRyOyBwdHIgKz0gc2l6ZW9mKCptY2MpOworCW1jYy0+dHlwZSA9IF9fbWNjX3R5cGUoY3IsIFJGQ09NTV9OU0MpOworCW1jYy0+bGVuICA9IF9fbGVuOCgxKTsKKworCS8qIFR5cGUgdGhhdCB3ZSBkaWRuJ3QgbGlrZSAqLworCSpwdHIgPSBfX21jY190eXBlKGNyLCB0eXBlKTsgcHRyKys7CisKKwkqcHRyID0gX19mY3MoYnVmKTsgcHRyKys7CisKKwlyZXR1cm4gcmZjb21tX3NlbmRfZnJhbWUocywgYnVmLCBwdHIgLSBidWYpOworfQorCitzdGF0aWMgaW50IHJmY29tbV9zZW5kX3BuKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgaW50IGNyLCBzdHJ1Y3QgcmZjb21tX2RsYyAqZCkKK3sKKwlzdHJ1Y3QgcmZjb21tX2hkciAqaGRyOworCXN0cnVjdCByZmNvbW1fbWNjICptY2M7CisJc3RydWN0IHJmY29tbV9wbiAgKnBuOworCXU4IGJ1ZlsxNl0sICpwdHIgPSBidWY7CisKKwlCVF9EQkcoIiVwIGNyICVkIGRsY2kgJWQgbXR1ICVkIiwgcywgY3IsIGQtPmRsY2ksIGQtPm10dSk7CisKKwloZHIgPSAodm9pZCAqKSBwdHI7IHB0ciArPSBzaXplb2YoKmhkcik7CisJaGRyLT5hZGRyID0gX19hZGRyKHMtPmluaXRpYXRvciwgMCk7CisJaGRyLT5jdHJsID0gX19jdHJsKFJGQ09NTV9VSUgsIDApOworCWhkci0+bGVuICA9IF9fbGVuOChzaXplb2YoKm1jYykgKyBzaXplb2YoKnBuKSk7CisKKwltY2MgPSAodm9pZCAqKSBwdHI7IHB0ciArPSBzaXplb2YoKm1jYyk7CisJbWNjLT50eXBlID0gX19tY2NfdHlwZShjciwgUkZDT01NX1BOKTsKKwltY2MtPmxlbiAgPSBfX2xlbjgoc2l6ZW9mKCpwbikpOworCisJcG4gPSAodm9pZCAqKSBwdHI7IHB0ciArPSBzaXplb2YoKnBuKTsKKwlwbi0+ZGxjaSAgICAgICAgPSBkLT5kbGNpOworCXBuLT5wcmlvcml0eSAgICA9IGQtPnByaW9yaXR5OworCXBuLT5hY2tfdGltZXIgICA9IDA7CisJcG4tPm1heF9yZXRyYW5zID0gMDsKKworCWlmIChzLT5jZmMpIHsKKwkJcG4tPmZsb3dfY3RybCA9IGNyID8gMHhmMCA6IDB4ZTA7CisJCXBuLT5jcmVkaXRzID0gUkZDT01NX0RFRkFVTFRfQ1JFRElUUzsKKwl9IGVsc2UgeworCQlwbi0+Zmxvd19jdHJsID0gMDsKKwkJcG4tPmNyZWRpdHMgICA9IDA7CisJfQorCisJcG4tPm10dSA9IGh0b2JzKGQtPm10dSk7CisKKwkqcHRyID0gX19mY3MoYnVmKTsgcHRyKys7CisKKwlyZXR1cm4gcmZjb21tX3NlbmRfZnJhbWUocywgYnVmLCBwdHIgLSBidWYpOworfQorCitzdGF0aWMgaW50IHJmY29tbV9zZW5kX3JwbihzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIGludCBjciwgdTggZGxjaSwKKwkJCSAgIHU4IGJpdF9yYXRlLCB1OCBkYXRhX2JpdHMsIHU4IHN0b3BfYml0cywKKwkJCSAgIHU4IHBhcml0eSwgdTggZmxvd19jdHJsX3NldHRpbmdzLCAKKwkJCSAgIHU4IHhvbl9jaGFyLCB1OCB4b2ZmX2NoYXIsIHUxNiBwYXJhbV9tYXNrKQoreworCXN0cnVjdCByZmNvbW1faGRyICpoZHI7CisJc3RydWN0IHJmY29tbV9tY2MgKm1jYzsKKwlzdHJ1Y3QgcmZjb21tX3JwbiAqcnBuOworCXU4IGJ1ZlsxNl0sICpwdHIgPSBidWY7CisKKwlCVF9EQkcoIiVwIGNyICVkIGRsY2kgJWQgYml0X3IgMHgleCBkYXRhX2IgMHgleCBzdG9wX2IgMHgleCBwYXJpdHkgMHgleCIKKwkgICAgICAgImZsd2NfcyAweCV4IHhvbl9jIDB4JXggeG9mZl9jIDB4JXggcF9tYXNrIDB4JXgiLCAKKwkJCXMsIGNyLCBkbGNpLCBiaXRfcmF0ZSwgZGF0YV9iaXRzLCBzdG9wX2JpdHMsIHBhcml0eSwgCisJCQlmbG93X2N0cmxfc2V0dGluZ3MsIHhvbl9jaGFyLCB4b2ZmX2NoYXIsIHBhcmFtX21hc2spOworCisJaGRyID0gKHZvaWQgKikgcHRyOyBwdHIgKz0gc2l6ZW9mKCpoZHIpOworCWhkci0+YWRkciA9IF9fYWRkcihzLT5pbml0aWF0b3IsIDApOworCWhkci0+Y3RybCA9IF9fY3RybChSRkNPTU1fVUlILCAwKTsKKwloZHItPmxlbiAgPSBfX2xlbjgoc2l6ZW9mKCptY2MpICsgc2l6ZW9mKCpycG4pKTsKKworCW1jYyA9ICh2b2lkICopIHB0cjsgcHRyICs9IHNpemVvZigqbWNjKTsKKwltY2MtPnR5cGUgPSBfX21jY190eXBlKGNyLCBSRkNPTU1fUlBOKTsKKwltY2MtPmxlbiAgPSBfX2xlbjgoc2l6ZW9mKCpycG4pKTsKKworCXJwbiA9ICh2b2lkICopIHB0cjsgcHRyICs9IHNpemVvZigqcnBuKTsKKwlycG4tPmRsY2kgICAgICAgICAgPSBfX2FkZHIoMSwgZGxjaSk7CisJcnBuLT5iaXRfcmF0ZSAgICAgID0gYml0X3JhdGU7CisJcnBuLT5saW5lX3NldHRpbmdzID0gX19ycG5fbGluZV9zZXR0aW5ncyhkYXRhX2JpdHMsIHN0b3BfYml0cywgcGFyaXR5KTsKKwlycG4tPmZsb3dfY3RybCAgICAgPSBmbG93X2N0cmxfc2V0dGluZ3M7CisJcnBuLT54b25fY2hhciAgICAgID0geG9uX2NoYXI7CisJcnBuLT54b2ZmX2NoYXIgICAgID0geG9mZl9jaGFyOworCXJwbi0+cGFyYW1fbWFzayAgICA9IHBhcmFtX21hc2s7CisKKwkqcHRyID0gX19mY3MoYnVmKTsgcHRyKys7CisKKwlyZXR1cm4gcmZjb21tX3NlbmRfZnJhbWUocywgYnVmLCBwdHIgLSBidWYpOworfQorCitzdGF0aWMgaW50IHJmY29tbV9zZW5kX3JscyhzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIGludCBjciwgdTggZGxjaSwgdTggc3RhdHVzKQoreworCXN0cnVjdCByZmNvbW1faGRyICpoZHI7CisJc3RydWN0IHJmY29tbV9tY2MgKm1jYzsKKwlzdHJ1Y3QgcmZjb21tX3JscyAqcmxzOworCXU4IGJ1ZlsxNl0sICpwdHIgPSBidWY7CisKKwlCVF9EQkcoIiVwIGNyICVkIHN0YXR1cyAweCV4IiwgcywgY3IsIHN0YXR1cyk7CisKKwloZHIgPSAodm9pZCAqKSBwdHI7IHB0ciArPSBzaXplb2YoKmhkcik7CisJaGRyLT5hZGRyID0gX19hZGRyKHMtPmluaXRpYXRvciwgMCk7CisJaGRyLT5jdHJsID0gX19jdHJsKFJGQ09NTV9VSUgsIDApOworCWhkci0+bGVuICA9IF9fbGVuOChzaXplb2YoKm1jYykgKyBzaXplb2YoKnJscykpOworCisJbWNjID0gKHZvaWQgKikgcHRyOyBwdHIgKz0gc2l6ZW9mKCptY2MpOworCW1jYy0+dHlwZSA9IF9fbWNjX3R5cGUoY3IsIFJGQ09NTV9STFMpOworCW1jYy0+bGVuICA9IF9fbGVuOChzaXplb2YoKnJscykpOworCisJcmxzID0gKHZvaWQgKikgcHRyOyBwdHIgKz0gc2l6ZW9mKCpybHMpOworCXJscy0+ZGxjaSAgID0gX19hZGRyKDEsIGRsY2kpOworCXJscy0+c3RhdHVzID0gc3RhdHVzOworCisJKnB0ciA9IF9fZmNzKGJ1Zik7IHB0cisrOworCisJcmV0dXJuIHJmY29tbV9zZW5kX2ZyYW1lKHMsIGJ1ZiwgcHRyIC0gYnVmKTsKK30KKworc3RhdGljIGludCByZmNvbW1fc2VuZF9tc2Moc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCBpbnQgY3IsIHU4IGRsY2ksIHU4IHYyNF9zaWcpCit7CisJc3RydWN0IHJmY29tbV9oZHIgKmhkcjsKKwlzdHJ1Y3QgcmZjb21tX21jYyAqbWNjOworCXN0cnVjdCByZmNvbW1fbXNjICptc2M7CisJdTggYnVmWzE2XSwgKnB0ciA9IGJ1ZjsKKworCUJUX0RCRygiJXAgY3IgJWQgdjI0IDB4JXgiLCBzLCBjciwgdjI0X3NpZyk7CisKKwloZHIgPSAodm9pZCAqKSBwdHI7IHB0ciArPSBzaXplb2YoKmhkcik7CisJaGRyLT5hZGRyID0gX19hZGRyKHMtPmluaXRpYXRvciwgMCk7CisJaGRyLT5jdHJsID0gX19jdHJsKFJGQ09NTV9VSUgsIDApOworCWhkci0+bGVuICA9IF9fbGVuOChzaXplb2YoKm1jYykgKyBzaXplb2YoKm1zYykpOworCisJbWNjID0gKHZvaWQgKikgcHRyOyBwdHIgKz0gc2l6ZW9mKCptY2MpOworCW1jYy0+dHlwZSA9IF9fbWNjX3R5cGUoY3IsIFJGQ09NTV9NU0MpOworCW1jYy0+bGVuICA9IF9fbGVuOChzaXplb2YoKm1zYykpOworCisJbXNjID0gKHZvaWQgKikgcHRyOyBwdHIgKz0gc2l6ZW9mKCptc2MpOworCW1zYy0+ZGxjaSAgICA9IF9fYWRkcigxLCBkbGNpKTsKKwltc2MtPnYyNF9zaWcgPSB2MjRfc2lnIHwgMHgwMTsKKworCSpwdHIgPSBfX2ZjcyhidWYpOyBwdHIrKzsKKworCXJldHVybiByZmNvbW1fc2VuZF9mcmFtZShzLCBidWYsIHB0ciAtIGJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3NlbmRfZmNvZmYoc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCBpbnQgY3IpCit7CisJc3RydWN0IHJmY29tbV9oZHIgKmhkcjsKKwlzdHJ1Y3QgcmZjb21tX21jYyAqbWNjOworCXU4IGJ1ZlsxNl0sICpwdHIgPSBidWY7CisKKwlCVF9EQkcoIiVwIGNyICVkIiwgcywgY3IpOworCisJaGRyID0gKHZvaWQgKikgcHRyOyBwdHIgKz0gc2l6ZW9mKCpoZHIpOworCWhkci0+YWRkciA9IF9fYWRkcihzLT5pbml0aWF0b3IsIDApOworCWhkci0+Y3RybCA9IF9fY3RybChSRkNPTU1fVUlILCAwKTsKKwloZHItPmxlbiAgPSBfX2xlbjgoc2l6ZW9mKCptY2MpKTsKKworCW1jYyA9ICh2b2lkICopIHB0cjsgcHRyICs9IHNpemVvZigqbWNjKTsKKwltY2MtPnR5cGUgPSBfX21jY190eXBlKGNyLCBSRkNPTU1fRkNPRkYpOworCW1jYy0+bGVuICA9IF9fbGVuOCgwKTsKKworCSpwdHIgPSBfX2ZjcyhidWYpOyBwdHIrKzsKKworCXJldHVybiByZmNvbW1fc2VuZF9mcmFtZShzLCBidWYsIHB0ciAtIGJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3NlbmRfZmNvbihzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIGludCBjcikKK3sKKwlzdHJ1Y3QgcmZjb21tX2hkciAqaGRyOworCXN0cnVjdCByZmNvbW1fbWNjICptY2M7CisJdTggYnVmWzE2XSwgKnB0ciA9IGJ1ZjsKKworCUJUX0RCRygiJXAgY3IgJWQiLCBzLCBjcik7CisKKwloZHIgPSAodm9pZCAqKSBwdHI7IHB0ciArPSBzaXplb2YoKmhkcik7CisJaGRyLT5hZGRyID0gX19hZGRyKHMtPmluaXRpYXRvciwgMCk7CisJaGRyLT5jdHJsID0gX19jdHJsKFJGQ09NTV9VSUgsIDApOworCWhkci0+bGVuICA9IF9fbGVuOChzaXplb2YoKm1jYykpOworCisJbWNjID0gKHZvaWQgKikgcHRyOyBwdHIgKz0gc2l6ZW9mKCptY2MpOworCW1jYy0+dHlwZSA9IF9fbWNjX3R5cGUoY3IsIFJGQ09NTV9GQ09OKTsKKwltY2MtPmxlbiAgPSBfX2xlbjgoMCk7CisKKwkqcHRyID0gX19mY3MoYnVmKTsgcHRyKys7CisKKwlyZXR1cm4gcmZjb21tX3NlbmRfZnJhbWUocywgYnVmLCBwdHIgLSBidWYpOworfQorCitzdGF0aWMgaW50IHJmY29tbV9zZW5kX3Rlc3Qoc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCBpbnQgY3IsIHU4ICpwYXR0ZXJuLCBpbnQgbGVuKQoreworCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBzLT5zb2NrOworCXN0cnVjdCBrdmVjIGl2WzNdOworCXN0cnVjdCBtc2doZHIgbXNnOworCXVuc2lnbmVkIGNoYXIgaGRyWzVdLCBjcmNbMV07CisKKwlpZiAobGVuID4gMTI1KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCUJUX0RCRygiJXAgY3IgJWQiLCBzLCBjcik7CisKKwloZHJbMF0gPSBfX2FkZHIocy0+aW5pdGlhdG9yLCAwKTsKKwloZHJbMV0gPSBfX2N0cmwoUkZDT01NX1VJSCwgMCk7CisJaGRyWzJdID0gMHgwMSB8ICgobGVuICsgMikgPDwgMSk7CisJaGRyWzNdID0gMHgwMSB8ICgoY3IgJiAweDAxKSA8PCAxKSB8IChSRkNPTU1fVEVTVCA8PCAyKTsKKwloZHJbNF0gPSAweDAxIHwgKGxlbiA8PCAxKTsKKworCWNyY1swXSA9IF9fZmNzKGhkcik7CisKKwlpdlswXS5pb3ZfYmFzZSA9IGhkcjsKKwlpdlswXS5pb3ZfbGVuICA9IDU7CisJaXZbMV0uaW92X2Jhc2UgPSBwYXR0ZXJuOworCWl2WzFdLmlvdl9sZW4gID0gbGVuOworCWl2WzJdLmlvdl9iYXNlID0gY3JjOworCWl2WzJdLmlvdl9sZW4gID0gMTsKKworCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CisKKwlyZXR1cm4ga2VybmVsX3NlbmRtc2coc29jaywgJm1zZywgaXYsIDMsIDYgKyBsZW4pOworfQorCitzdGF0aWMgaW50IHJmY29tbV9zZW5kX2NyZWRpdHMoc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCB1OCBhZGRyLCB1OCBjcmVkaXRzKQoreworCXN0cnVjdCByZmNvbW1faGRyICpoZHI7CisJdTggYnVmWzE2XSwgKnB0ciA9IGJ1ZjsKKworCUJUX0RCRygiJXAgYWRkciAlZCBjcmVkaXRzICVkIiwgcywgYWRkciwgY3JlZGl0cyk7CisKKwloZHIgPSAodm9pZCAqKSBwdHI7IHB0ciArPSBzaXplb2YoKmhkcik7CisJaGRyLT5hZGRyID0gYWRkcjsKKwloZHItPmN0cmwgPSBfX2N0cmwoUkZDT01NX1VJSCwgMSk7CisJaGRyLT5sZW4gID0gX19sZW44KDApOworCisJKnB0ciA9IGNyZWRpdHM7IHB0cisrOworCisJKnB0ciA9IF9fZmNzKGJ1Zik7IHB0cisrOworCisJcmV0dXJuIHJmY29tbV9zZW5kX2ZyYW1lKHMsIGJ1ZiwgcHRyIC0gYnVmKTsKK30KKworc3RhdGljIHZvaWQgcmZjb21tX21ha2VfdWloKHN0cnVjdCBza19idWZmICpza2IsIHU4IGFkZHIpCit7CisJc3RydWN0IHJmY29tbV9oZHIgKmhkcjsKKwlpbnQgbGVuID0gc2tiLT5sZW47CisJdTggKmNyYzsKKworCWlmIChsZW4gPiAxMjcpIHsKKwkJaGRyID0gKHZvaWQgKikgc2tiX3B1c2goc2tiLCA0KTsKKwkJcHV0X3VuYWxpZ25lZChodG9icyhfX2xlbjE2KGxlbikpLCAodTE2ICopICZoZHItPmxlbik7CisJfSBlbHNlIHsKKwkJaGRyID0gKHZvaWQgKikgc2tiX3B1c2goc2tiLCAzKTsKKwkJaGRyLT5sZW4gPSBfX2xlbjgobGVuKTsKKwl9CisJaGRyLT5hZGRyID0gYWRkcjsKKwloZHItPmN0cmwgPSBfX2N0cmwoUkZDT01NX1VJSCwgMCk7CisKKwljcmMgPSBza2JfcHV0KHNrYiwgMSk7CisJKmNyYyA9IF9fZmNzKCh2b2lkICopIGhkcik7Cit9CisKKy8qIC0tLS0gUkZDT01NIGZyYW1lIHJlY2VwdGlvbiAtLS0tICovCitzdGF0aWMgaW50IHJmY29tbV9yZWN2X3VhKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgdTggZGxjaSkKK3sKKwlCVF9EQkcoInNlc3Npb24gJXAgc3RhdGUgJWxkIGRsY2kgJWQiLCBzLCBzLT5zdGF0ZSwgZGxjaSk7CisKKwlpZiAoZGxjaSkgeworCQkvKiBEYXRhIGNoYW5uZWwgKi8KKwkJc3RydWN0IHJmY29tbV9kbGMgKmQgPSByZmNvbW1fZGxjX2dldChzLCBkbGNpKTsKKwkJaWYgKCFkKSB7CisJCQlyZmNvbW1fc2VuZF9kbShzLCBkbGNpKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJc3dpdGNoIChkLT5zdGF0ZSkgeworCQljYXNlIEJUX0NPTk5FQ1Q6CisJCQlyZmNvbW1fZGxjX2NsZWFyX3RpbWVyKGQpOworCisJCQlyZmNvbW1fZGxjX2xvY2soZCk7CisJCQlkLT5zdGF0ZSA9IEJUX0NPTk5FQ1RFRDsKKwkJCWQtPnN0YXRlX2NoYW5nZShkLCAwKTsKKwkJCXJmY29tbV9kbGNfdW5sb2NrKGQpOworCisJCQlyZmNvbW1fc2VuZF9tc2MocywgMSwgZGxjaSwgZC0+djI0X3NpZyk7CisJCQlicmVhazsKKworCQljYXNlIEJUX0RJU0NPTk46CisJCQlkLT5zdGF0ZSA9IEJUX0NMT1NFRDsKKwkJCV9fcmZjb21tX2RsY19jbG9zZShkLCAwKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJLyogQ29udHJvbCBjaGFubmVsICovCisJCXN3aXRjaCAocy0+c3RhdGUpIHsKKwkJY2FzZSBCVF9DT05ORUNUOgorCQkJcy0+c3RhdGUgPSBCVF9DT05ORUNURUQ7CisJCQlyZmNvbW1fcHJvY2Vzc19jb25uZWN0KHMpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3JlY3ZfZG0oc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCB1OCBkbGNpKQoreworCWludCBlcnIgPSAwOworCisJQlRfREJHKCJzZXNzaW9uICVwIHN0YXRlICVsZCBkbGNpICVkIiwgcywgcy0+c3RhdGUsIGRsY2kpOworCisJaWYgKGRsY2kpIHsKKwkJLyogRGF0YSBETEMgKi8KKwkJc3RydWN0IHJmY29tbV9kbGMgKmQgPSByZmNvbW1fZGxjX2dldChzLCBkbGNpKTsKKwkJaWYgKGQpIHsKKwkJCWlmIChkLT5zdGF0ZSA9PSBCVF9DT05ORUNUIHx8IGQtPnN0YXRlID09IEJUX0NPTkZJRykKKwkJCQllcnIgPSBFQ09OTlJFRlVTRUQ7CisJCQllbHNlCisJCQkJZXJyID0gRUNPTk5SRVNFVDsKKworCQkJZC0+c3RhdGUgPSBCVF9DTE9TRUQ7CisJCQlfX3JmY29tbV9kbGNfY2xvc2UoZCwgZXJyKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChzLT5zdGF0ZSA9PSBCVF9DT05ORUNUKQorCQkJZXJyID0gRUNPTk5SRUZVU0VEOworCQllbHNlCisJCQllcnIgPSBFQ09OTlJFU0VUOworCisJCXMtPnN0YXRlID0gQlRfQ0xPU0VEOworCQlyZmNvbW1fc2Vzc2lvbl9jbG9zZShzLCBlcnIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZmNvbW1fcmVjdl9kaXNjKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgdTggZGxjaSkKK3sKKwlpbnQgZXJyID0gMDsKKworCUJUX0RCRygic2Vzc2lvbiAlcCBzdGF0ZSAlbGQgZGxjaSAlZCIsIHMsIHMtPnN0YXRlLCBkbGNpKTsKKworCWlmIChkbGNpKSB7CisJCXN0cnVjdCByZmNvbW1fZGxjICpkID0gcmZjb21tX2RsY19nZXQocywgZGxjaSk7CisJCWlmIChkKSB7CisJCQlyZmNvbW1fc2VuZF91YShzLCBkbGNpKTsKKworCQkJaWYgKGQtPnN0YXRlID09IEJUX0NPTk5FQ1QgfHwgZC0+c3RhdGUgPT0gQlRfQ09ORklHKQorCQkJCWVyciA9IEVDT05OUkVGVVNFRDsKKwkJCWVsc2UKKwkJCQllcnIgPSBFQ09OTlJFU0VUOworCisJCQlkLT5zdGF0ZSA9IEJUX0NMT1NFRDsKKwkJCV9fcmZjb21tX2RsY19jbG9zZShkLCBlcnIpOworCQl9IGVsc2UgCisJCQlyZmNvbW1fc2VuZF9kbShzLCBkbGNpKTsKKwkJCQorCX0gZWxzZSB7CisJCXJmY29tbV9zZW5kX3VhKHMsIDApOworCisJCWlmIChzLT5zdGF0ZSA9PSBCVF9DT05ORUNUKQorCQkJZXJyID0gRUNPTk5SRUZVU0VEOworCQllbHNlCisJCQllcnIgPSBFQ09OTlJFU0VUOworCisJCXMtPnN0YXRlID0gQlRfQ0xPU0VEOworCQlyZmNvbW1fc2Vzc2lvbl9jbG9zZShzLCBlcnIpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCByZmNvbW1fY2hlY2tfbGlua19tb2RlKHN0cnVjdCByZmNvbW1fZGxjICpkKQoreworCXN0cnVjdCBzb2NrICpzayA9IGQtPnNlc3Npb24tPnNvY2stPnNrOworCisJaWYgKGQtPmxpbmtfbW9kZSAmIChSRkNPTU1fTE1fRU5DUllQVCB8IFJGQ09NTV9MTV9TRUNVUkUpKSB7CisJCWlmICghaGNpX2Nvbm5fZW5jcnlwdChsMmNhcF9waShzayktPmNvbm4tPmhjb24pKQorCQkJcmV0dXJuIDE7CisJfSBlbHNlIGlmIChkLT5saW5rX21vZGUgJiBSRkNPTU1fTE1fQVVUSCkgeworCQlpZiAoIWhjaV9jb25uX2F1dGgobDJjYXBfcGkoc2spLT5jb25uLT5oY29uKSkKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByZmNvbW1fZGxjX2FjY2VwdChzdHJ1Y3QgcmZjb21tX2RsYyAqZCkKK3sKKwlCVF9EQkcoImRsYyAlcCIsIGQpOworCisJcmZjb21tX3NlbmRfdWEoZC0+c2Vzc2lvbiwgZC0+ZGxjaSk7CisKKwlyZmNvbW1fZGxjX2xvY2soZCk7CisJZC0+c3RhdGUgPSBCVF9DT05ORUNURUQ7CisJZC0+c3RhdGVfY2hhbmdlKGQsIDApOworCXJmY29tbV9kbGNfdW5sb2NrKGQpOworCisJcmZjb21tX3NlbmRfbXNjKGQtPnNlc3Npb24sIDEsIGQtPmRsY2ksIGQtPnYyNF9zaWcpOworfQorCitzdGF0aWMgaW50IHJmY29tbV9yZWN2X3NhYm0oc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCB1OCBkbGNpKQoreworCXN0cnVjdCByZmNvbW1fZGxjICpkOworCXU4IGNoYW5uZWw7CisKKwlCVF9EQkcoInNlc3Npb24gJXAgc3RhdGUgJWxkIGRsY2kgJWQiLCBzLCBzLT5zdGF0ZSwgZGxjaSk7CisKKwlpZiAoIWRsY2kpIHsKKwkJcmZjb21tX3NlbmRfdWEocywgMCk7CisKKwkJaWYgKHMtPnN0YXRlID09IEJUX09QRU4pIHsKKwkJCXMtPnN0YXRlID0gQlRfQ09OTkVDVEVEOworCQkJcmZjb21tX3Byb2Nlc3NfY29ubmVjdChzKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDaGVjayBpZiBETEMgZXhpc3RzICovCisJZCA9IHJmY29tbV9kbGNfZ2V0KHMsIGRsY2kpOworCWlmIChkKSB7CisJCWlmIChkLT5zdGF0ZSA9PSBCVF9PUEVOKSB7CisJCQkvKiBETEMgd2FzIHByZXZpb3VzbHkgb3BlbmVkIGJ5IFBOIHJlcXVlc3QgKi8KKwkJCWlmIChyZmNvbW1fY2hlY2tfbGlua19tb2RlKGQpKSB7CisJCQkJc2V0X2JpdChSRkNPTU1fQVVUSF9QRU5ESU5HLCAmZC0+ZmxhZ3MpOworCQkJCXJmY29tbV9kbGNfc2V0X3RpbWVyKGQsIFJGQ09NTV9BVVRIX1RJTUVPVVQpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlyZmNvbW1fZGxjX2FjY2VwdChkKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBOb3RpZnkgc29ja2V0IGxheWVyIGFib3V0IGluY29taW5nIGNvbm5lY3Rpb24gKi8KKwljaGFubmVsID0gX19zcnZfY2hhbm5lbChkbGNpKTsKKwlpZiAocmZjb21tX2Nvbm5lY3RfaW5kKHMsIGNoYW5uZWwsICZkKSkgeworCQlkLT5kbGNpID0gZGxjaTsKKwkJZC0+YWRkciA9IF9fYWRkcihzLT5pbml0aWF0b3IsIGRsY2kpOworCQlyZmNvbW1fZGxjX2xpbmsocywgZCk7CisKKwkJaWYgKHJmY29tbV9jaGVja19saW5rX21vZGUoZCkpIHsKKwkJCXNldF9iaXQoUkZDT01NX0FVVEhfUEVORElORywgJmQtPmZsYWdzKTsKKwkJCXJmY29tbV9kbGNfc2V0X3RpbWVyKGQsIFJGQ09NTV9BVVRIX1RJTUVPVVQpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlyZmNvbW1fZGxjX2FjY2VwdChkKTsKKwl9IGVsc2UgeworCQlyZmNvbW1fc2VuZF9kbShzLCBkbGNpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZmNvbW1fYXBwbHlfcG4oc3RydWN0IHJmY29tbV9kbGMgKmQsIGludCBjciwgc3RydWN0IHJmY29tbV9wbiAqcG4pCit7CisJc3RydWN0IHJmY29tbV9zZXNzaW9uICpzID0gZC0+c2Vzc2lvbjsKKworCUJUX0RCRygiZGxjICVwIHN0YXRlICVsZCBkbGNpICVkIG10dSAlZCBmYyAweCV4IGNyZWRpdHMgJWQiLCAKKwkJCWQsIGQtPnN0YXRlLCBkLT5kbGNpLCBwbi0+bXR1LCBwbi0+Zmxvd19jdHJsLCBwbi0+Y3JlZGl0cyk7CisKKwlpZiAocG4tPmZsb3dfY3RybCA9PSAweGYwIHx8IHBuLT5mbG93X2N0cmwgPT0gMHhlMCkgeworCQlkLT5jZmMgPSBzLT5jZmMgPSBSRkNPTU1fQ0ZDX0VOQUJMRUQ7CisJCWQtPnR4X2NyZWRpdHMgPSBwbi0+Y3JlZGl0czsKKwl9IGVsc2UgeworCQlkLT5jZmMgPSBzLT5jZmMgPSBSRkNPTU1fQ0ZDX0RJU0FCTEVEOworCQlzZXRfYml0KFJGQ09NTV9UWF9USFJPVFRMRUQsICZkLT5mbGFncyk7CisJfQorCisJZC0+cHJpb3JpdHkgPSBwbi0+cHJpb3JpdHk7CisKKwlkLT5tdHUgPSBzLT5tdHUgPSBidG9ocyhwbi0+bXR1KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJmY29tbV9yZWN2X3BuKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgaW50IGNyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByZmNvbW1fcG4gKnBuID0gKHZvaWQgKikgc2tiLT5kYXRhOworCXN0cnVjdCByZmNvbW1fZGxjICpkOworCXU4IGRsY2kgPSBwbi0+ZGxjaTsKKworCUJUX0RCRygic2Vzc2lvbiAlcCBzdGF0ZSAlbGQgZGxjaSAlZCIsIHMsIHMtPnN0YXRlLCBkbGNpKTsKKworCWlmICghZGxjaSkKKwkJcmV0dXJuIDA7CisKKwlkID0gcmZjb21tX2RsY19nZXQocywgZGxjaSk7CisJaWYgKGQpIHsKKwkJaWYgKGNyKSB7CisJCQkvKiBQTiByZXF1ZXN0ICovCisJCQlyZmNvbW1fYXBwbHlfcG4oZCwgY3IsIHBuKTsKKwkJCXJmY29tbV9zZW5kX3BuKHMsIDAsIGQpOworCQl9IGVsc2UgeworCQkJLyogUE4gcmVzcG9uc2UgKi8KKwkJCXN3aXRjaCAoZC0+c3RhdGUpIHsKKwkJCWNhc2UgQlRfQ09ORklHOgorCQkJCXJmY29tbV9hcHBseV9wbihkLCBjciwgcG4pOworCisJCQkJZC0+c3RhdGUgPSBCVF9DT05ORUNUOworCQkJCXJmY29tbV9zZW5kX3NhYm0ocywgZC0+ZGxjaSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQl1OCBjaGFubmVsID0gX19zcnZfY2hhbm5lbChkbGNpKTsKKworCQlpZiAoIWNyKQorCQkJcmV0dXJuIDA7CisKKwkJLyogUE4gcmVxdWVzdCBmb3Igbm9uIGV4aXN0aW5nIERMQy4KKwkJICogQXNzdW1lIGluY29taW5nIGNvbm5lY3Rpb24uICovCisJCWlmIChyZmNvbW1fY29ubmVjdF9pbmQocywgY2hhbm5lbCwgJmQpKSB7CisJCQlkLT5kbGNpID0gZGxjaTsKKwkJCWQtPmFkZHIgPSBfX2FkZHIocy0+aW5pdGlhdG9yLCBkbGNpKTsKKwkJCXJmY29tbV9kbGNfbGluayhzLCBkKTsKKworCQkJcmZjb21tX2FwcGx5X3BuKGQsIGNyLCBwbik7CisKKwkJCWQtPnN0YXRlID0gQlRfT1BFTjsKKwkJCXJmY29tbV9zZW5kX3BuKHMsIDAsIGQpOworCQl9IGVsc2UgeworCQkJcmZjb21tX3NlbmRfZG0ocywgZGxjaSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3JlY3ZfcnBuKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgaW50IGNyLCBpbnQgbGVuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByZmNvbW1fcnBuICpycG4gPSAodm9pZCAqKSBza2ItPmRhdGE7CisJdTggZGxjaSA9IF9fZ2V0X2RsY2kocnBuLT5kbGNpKTsKKworCXU4IGJpdF9yYXRlICA9IDA7CisJdTggZGF0YV9iaXRzID0gMDsKKwl1OCBzdG9wX2JpdHMgPSAwOworCXU4IHBhcml0eSAgICA9IDA7CisJdTggZmxvd19jdHJsID0gMDsKKwl1OCB4b25fY2hhciAgPSAwOworCXU4IHhvZmZfY2hhciA9IDA7CisJdTE2IHJwbl9tYXNrID0gUkZDT01NX1JQTl9QTV9BTEw7CisJCisJQlRfREJHKCJkbGNpICVkIGNyICVkIGxlbiAweCV4IGJpdHIgMHgleCBsaW5lIDB4JXggZmxvdyAweCV4IHhvbmMgMHgleCB4b2ZmYyAweCV4IHBtIDB4JXgiLCAKKwkgICAgICAgZGxjaSwgY3IsIGxlbiwgcnBuLT5iaXRfcmF0ZSwgcnBuLT5saW5lX3NldHRpbmdzLCBycG4tPmZsb3dfY3RybCwKKwkgICAgICAgcnBuLT54b25fY2hhciwgcnBuLT54b2ZmX2NoYXIsIHJwbi0+cGFyYW1fbWFzayk7CisJCisJaWYgKCFjcikgCisJCXJldHVybiAwOworCQorCWlmIChsZW4gPT0gMSkgeworCQkvKiByZXF1ZXN0OiByZXR1cm4gZGVmYXVsdCBzZXR0aW5nICovCisJCWJpdF9yYXRlICA9IFJGQ09NTV9SUE5fQlJfMTE1MjAwOworCQlkYXRhX2JpdHMgPSBSRkNPTU1fUlBOX0RBVEFfODsKKwkJc3RvcF9iaXRzID0gUkZDT01NX1JQTl9TVE9QXzE7CisJCXBhcml0eSAgICA9IFJGQ09NTV9SUE5fUEFSSVRZX05PTkU7CisJCWZsb3dfY3RybCA9IFJGQ09NTV9SUE5fRkxPV19OT05FOworCQl4b25fY2hhciAgPSBSRkNPTU1fUlBOX1hPTl9DSEFSOworCQl4b2ZmX2NoYXIgPSBSRkNPTU1fUlBOX1hPRkZfQ0hBUjsKKworCQlnb3RvIHJwbl9vdXQ7CisJfQorCS8qIGNoZWNrIGZvciBzYW5lIHZhbHVlczogaWdub3JlL2FjY2VwdCBiaXRfcmF0ZSwgOCBiaXRzLCAxIHN0b3AgYml0LCBubyBwYXJpdHksCisJICAgICAgICAgICAgICAgICAgICAgICAgICBubyBmbG93IGNvbnRyb2wgbGluZXMsIG5vcm1hbCBYT04vWE9GRiBjaGFycyAqLworCWlmIChycG4tPnBhcmFtX21hc2sgJiBSRkNPTU1fUlBOX1BNX0JJVFJBVEUpIHsKKwkJYml0X3JhdGUgPSBycG4tPmJpdF9yYXRlOworCQlpZiAoYml0X3JhdGUgIT0gUkZDT01NX1JQTl9CUl8xMTUyMDApIHsKKwkJCUJUX0RCRygiUlBOIGJpdCByYXRlIG1pc21hdGNoIDB4JXgiLCBiaXRfcmF0ZSk7CisJCQliaXRfcmF0ZSA9IFJGQ09NTV9SUE5fQlJfMTE1MjAwOworCQkJcnBuX21hc2sgXj0gUkZDT01NX1JQTl9QTV9CSVRSQVRFOworCQl9CisJfQorCWlmIChycG4tPnBhcmFtX21hc2sgJiBSRkNPTU1fUlBOX1BNX0RBVEEpIHsKKwkJZGF0YV9iaXRzID0gX19nZXRfcnBuX2RhdGFfYml0cyhycG4tPmxpbmVfc2V0dGluZ3MpOworCQlpZiAoZGF0YV9iaXRzICE9IFJGQ09NTV9SUE5fREFUQV84KSB7CisJCQlCVF9EQkcoIlJQTiBkYXRhIGJpdHMgbWlzbWF0Y2ggMHgleCIsIGRhdGFfYml0cyk7CisJCQlkYXRhX2JpdHMgPSBSRkNPTU1fUlBOX0RBVEFfODsKKwkJCXJwbl9tYXNrIF49IFJGQ09NTV9SUE5fUE1fREFUQTsKKwkJfQorCX0KKwlpZiAocnBuLT5wYXJhbV9tYXNrICYgUkZDT01NX1JQTl9QTV9TVE9QKSB7CisJCXN0b3BfYml0cyA9IF9fZ2V0X3Jwbl9zdG9wX2JpdHMocnBuLT5saW5lX3NldHRpbmdzKTsKKwkJaWYgKHN0b3BfYml0cyAhPSBSRkNPTU1fUlBOX1NUT1BfMSkgeworCQkJQlRfREJHKCJSUE4gc3RvcCBiaXRzIG1pc21hdGNoIDB4JXgiLCBzdG9wX2JpdHMpOworCQkJc3RvcF9iaXRzID0gUkZDT01NX1JQTl9TVE9QXzE7CisJCQlycG5fbWFzayBePSBSRkNPTU1fUlBOX1BNX1NUT1A7CisJCX0KKwl9CisJaWYgKHJwbi0+cGFyYW1fbWFzayAmIFJGQ09NTV9SUE5fUE1fUEFSSVRZKSB7CisJCXBhcml0eSA9IF9fZ2V0X3Jwbl9wYXJpdHkocnBuLT5saW5lX3NldHRpbmdzKTsKKwkJaWYgKHBhcml0eSAhPSBSRkNPTU1fUlBOX1BBUklUWV9OT05FKSB7CisJCQlCVF9EQkcoIlJQTiBwYXJpdHkgbWlzbWF0Y2ggMHgleCIsIHBhcml0eSk7CisJCQlwYXJpdHkgPSBSRkNPTU1fUlBOX1BBUklUWV9OT05FOworCQkJcnBuX21hc2sgXj0gUkZDT01NX1JQTl9QTV9QQVJJVFk7CisJCX0KKwl9CisJaWYgKHJwbi0+cGFyYW1fbWFzayAmIFJGQ09NTV9SUE5fUE1fRkxPVykgeworCQlmbG93X2N0cmwgPSBycG4tPmZsb3dfY3RybDsKKwkJaWYgKGZsb3dfY3RybCAhPSBSRkNPTU1fUlBOX0ZMT1dfTk9ORSkgeworCQkJQlRfREJHKCJSUE4gZmxvdyBjdHJsIG1pc21hdGNoIDB4JXgiLCBmbG93X2N0cmwpOworCQkJZmxvd19jdHJsID0gUkZDT01NX1JQTl9GTE9XX05PTkU7CisJCQlycG5fbWFzayBePSBSRkNPTU1fUlBOX1BNX0ZMT1c7CisJCX0KKwl9CisJaWYgKHJwbi0+cGFyYW1fbWFzayAmIFJGQ09NTV9SUE5fUE1fWE9OKSB7CisJCXhvbl9jaGFyID0gcnBuLT54b25fY2hhcjsKKwkJaWYgKHhvbl9jaGFyICE9IFJGQ09NTV9SUE5fWE9OX0NIQVIpIHsKKwkJCUJUX0RCRygiUlBOIFhPTiBjaGFyIG1pc21hdGNoIDB4JXgiLCB4b25fY2hhcik7CisJCQl4b25fY2hhciA9IFJGQ09NTV9SUE5fWE9OX0NIQVI7CisJCQlycG5fbWFzayBePSBSRkNPTU1fUlBOX1BNX1hPTjsKKwkJfQorCX0KKwlpZiAocnBuLT5wYXJhbV9tYXNrICYgUkZDT01NX1JQTl9QTV9YT0ZGKSB7CisJCXhvZmZfY2hhciA9IHJwbi0+eG9mZl9jaGFyOworCQlpZiAoeG9mZl9jaGFyICE9IFJGQ09NTV9SUE5fWE9GRl9DSEFSKSB7CisJCQlCVF9EQkcoIlJQTiBYT0ZGIGNoYXIgbWlzbWF0Y2ggMHgleCIsIHhvZmZfY2hhcik7CisJCQl4b2ZmX2NoYXIgPSBSRkNPTU1fUlBOX1hPRkZfQ0hBUjsKKwkJCXJwbl9tYXNrIF49IFJGQ09NTV9SUE5fUE1fWE9GRjsKKwkJfQorCX0KKworcnBuX291dDoKKwlyZmNvbW1fc2VuZF9ycG4ocywgMCwgZGxjaSwgCisJCQliaXRfcmF0ZSwgZGF0YV9iaXRzLCBzdG9wX2JpdHMsIHBhcml0eSwgZmxvd19jdHJsLAorCQkJeG9uX2NoYXIsIHhvZmZfY2hhciwgcnBuX21hc2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3JlY3ZfcmxzKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgaW50IGNyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByZmNvbW1fcmxzICpybHMgPSAodm9pZCAqKSBza2ItPmRhdGE7CisJdTggZGxjaSA9IF9fZ2V0X2RsY2kocmxzLT5kbGNpKTsKKworCUJUX0RCRygiZGxjaSAlZCBjciAlZCBzdGF0dXMgMHgleCIsIGRsY2ksIGNyLCBybHMtPnN0YXR1cyk7CisJCisJaWYgKCFjcikKKwkJcmV0dXJuIDA7CisKKwkvKiBGSVhNRTogV2Ugc2hvdWxkIHByb2JhYmx5IGRvIHNvbWV0aGluZyB3aXRoIHRoaXMKKwkgICBpbmZvcm1hdGlvbiBoZXJlLiBCdXQgZm9yIG5vdyBpdCdzIHN1ZmZpY2llbnQganVzdAorCSAgIHRvIHJlcGx5IC0tIEJsdWV0b290aCAxLjEgc2F5cyBpdCdzIG1hbmRhdG9yeSB0byAKKwkgICByZWNvZ25pc2UgYW5kIHJlc3BvbmQgdG8gUkxTICovCisKKwlyZmNvbW1fc2VuZF9ybHMocywgMCwgZGxjaSwgcmxzLT5zdGF0dXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3JlY3ZfbXNjKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgaW50IGNyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByZmNvbW1fbXNjICptc2MgPSAodm9pZCAqKSBza2ItPmRhdGE7CisJc3RydWN0IHJmY29tbV9kbGMgKmQ7CisJdTggZGxjaSA9IF9fZ2V0X2RsY2kobXNjLT5kbGNpKTsKKworCUJUX0RCRygiZGxjaSAlZCBjciAlZCB2MjQgMHgleCIsIGRsY2ksIGNyLCBtc2MtPnYyNF9zaWcpOworCisJZCA9IHJmY29tbV9kbGNfZ2V0KHMsIGRsY2kpOworCWlmICghZCkgCisJCXJldHVybiAwOworCisJaWYgKGNyKSB7CisJCWlmIChtc2MtPnYyNF9zaWcgJiBSRkNPTU1fVjI0X0ZDICYmICFkLT5jZmMpCisJCQlzZXRfYml0KFJGQ09NTV9UWF9USFJPVFRMRUQsICZkLT5mbGFncyk7CisJCWVsc2UKKwkJCWNsZWFyX2JpdChSRkNPTU1fVFhfVEhST1RUTEVELCAmZC0+ZmxhZ3MpOworCQkKKwkJcmZjb21tX2RsY19sb2NrKGQpOworCQlpZiAoZC0+bW9kZW1fc3RhdHVzKQorCQkJZC0+bW9kZW1fc3RhdHVzKGQsIG1zYy0+djI0X3NpZyk7CisJCXJmY29tbV9kbGNfdW5sb2NrKGQpOworCQkKKwkJcmZjb21tX3NlbmRfbXNjKHMsIDAsIGRsY2ksIG1zYy0+djI0X3NpZyk7CisKKwkJZC0+bXNjZXggfD0gUkZDT01NX01TQ0VYX1JYOworCX0gZWxzZSAKKwkJZC0+bXNjZXggfD0gUkZDT01NX01TQ0VYX1RYOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3JlY3ZfbWNjKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcmZjb21tX21jYyAqbWNjID0gKHZvaWQgKikgc2tiLT5kYXRhOworCXU4IHR5cGUsIGNyLCBsZW47CisKKwljciAgID0gX190ZXN0X2NyKG1jYy0+dHlwZSk7CisJdHlwZSA9IF9fZ2V0X21jY190eXBlKG1jYy0+dHlwZSk7CisJbGVuICA9IF9fZ2V0X21jY19sZW4obWNjLT5sZW4pOworCisJQlRfREJHKCIlcCB0eXBlIDB4JXggY3IgJWQiLCBzLCB0eXBlLCBjcik7CisKKwlza2JfcHVsbChza2IsIDIpOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBSRkNPTU1fUE46CisJCXJmY29tbV9yZWN2X3BuKHMsIGNyLCBza2IpOworCQlicmVhazsKKworCWNhc2UgUkZDT01NX1JQTjoKKwkJcmZjb21tX3JlY3ZfcnBuKHMsIGNyLCBsZW4sIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBSRkNPTU1fUkxTOgorCQlyZmNvbW1fcmVjdl9ybHMocywgY3IsIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBSRkNPTU1fTVNDOgorCQlyZmNvbW1fcmVjdl9tc2MocywgY3IsIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBSRkNPTU1fRkNPRkY6CisJCWlmIChjcikgeworCQkJc2V0X2JpdChSRkNPTU1fVFhfVEhST1RUTEVELCAmcy0+ZmxhZ3MpOworCQkJcmZjb21tX3NlbmRfZmNvZmYocywgMCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFJGQ09NTV9GQ09OOgorCQlpZiAoY3IpIHsKKwkJCWNsZWFyX2JpdChSRkNPTU1fVFhfVEhST1RUTEVELCAmcy0+ZmxhZ3MpOworCQkJcmZjb21tX3NlbmRfZmNvbihzLCAwKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUkZDT01NX1RFU1Q6CisJCWlmIChjcikKKwkJCXJmY29tbV9zZW5kX3Rlc3QocywgMCwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCWJyZWFrOworCisJY2FzZSBSRkNPTU1fTlNDOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUJUX0VSUigiVW5rbm93biBjb250cm9sIHR5cGUgMHglMDJ4IiwgdHlwZSk7CisJCXJmY29tbV9zZW5kX25zYyhzLCBjciwgdHlwZSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZmNvbW1fcmVjdl9kYXRhKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgdTggZGxjaSwgaW50IHBmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByZmNvbW1fZGxjICpkOworCisJQlRfREJHKCJzZXNzaW9uICVwIHN0YXRlICVsZCBkbGNpICVkIHBmICVkIiwgcywgcy0+c3RhdGUsIGRsY2ksIHBmKTsKKworCWQgPSByZmNvbW1fZGxjX2dldChzLCBkbGNpKTsKKwlpZiAoIWQpIHsKKwkJcmZjb21tX3NlbmRfZG0ocywgZGxjaSk7CisJCWdvdG8gZHJvcDsKKwl9CisKKwlpZiAocGYgJiYgZC0+Y2ZjKSB7CisJCXU4IGNyZWRpdHMgPSAqKHU4ICopIHNrYi0+ZGF0YTsgc2tiX3B1bGwoc2tiLCAxKTsKKworCQlkLT50eF9jcmVkaXRzICs9IGNyZWRpdHM7CisJCWlmIChkLT50eF9jcmVkaXRzKQorCQkJY2xlYXJfYml0KFJGQ09NTV9UWF9USFJPVFRMRUQsICZkLT5mbGFncyk7CisJfQorCisJaWYgKHNrYi0+bGVuICYmIGQtPnN0YXRlID09IEJUX0NPTk5FQ1RFRCkgeworCQlyZmNvbW1fZGxjX2xvY2soZCk7CisJCWQtPnJ4X2NyZWRpdHMtLTsKKwkJZC0+ZGF0YV9yZWFkeShkLCBza2IpOworCQlyZmNvbW1fZGxjX3VubG9jayhkKTsKKwkJcmV0dXJuIDA7CisJfQorCitkcm9wOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJmY29tbV9yZWN2X2ZyYW1lKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcmZjb21tX2hkciAqaGRyID0gKHZvaWQgKikgc2tiLT5kYXRhOworCXU4IHR5cGUsIGRsY2ksIGZjczsKKworCWRsY2kgPSBfX2dldF9kbGNpKGhkci0+YWRkcik7CisJdHlwZSA9IF9fZ2V0X3R5cGUoaGRyLT5jdHJsKTsKKworCS8qIFRyaW0gRkNTICovCisJc2tiLT5sZW4tLTsgc2tiLT50YWlsLS07CisJZmNzID0gKih1OCAqKSBza2ItPnRhaWw7CisKKwlpZiAoX19jaGVja19mY3Moc2tiLT5kYXRhLCB0eXBlLCBmY3MpKSB7CisJCUJUX0VSUigiYmFkIGNoZWNrc3VtIGluIHBhY2tldCIpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC1FSUxTRVE7CisJfQorCisJaWYgKF9fdGVzdF9lYShoZHItPmxlbikpCisJCXNrYl9wdWxsKHNrYiwgMyk7CisJZWxzZQorCQlza2JfcHVsbChza2IsIDQpOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBSRkNPTU1fU0FCTToKKwkJaWYgKF9fdGVzdF9wZihoZHItPmN0cmwpKQorCQkJcmZjb21tX3JlY3Zfc2FibShzLCBkbGNpKTsKKwkJYnJlYWs7CisKKwljYXNlIFJGQ09NTV9ESVNDOgorCQlpZiAoX190ZXN0X3BmKGhkci0+Y3RybCkpCisJCQlyZmNvbW1fcmVjdl9kaXNjKHMsIGRsY2kpOworCQlicmVhazsKKworCWNhc2UgUkZDT01NX1VBOgorCQlpZiAoX190ZXN0X3BmKGhkci0+Y3RybCkpCisJCQlyZmNvbW1fcmVjdl91YShzLCBkbGNpKTsKKwkJYnJlYWs7CisKKwljYXNlIFJGQ09NTV9ETToKKwkJcmZjb21tX3JlY3ZfZG0ocywgZGxjaSk7CisJCWJyZWFrOworCisJY2FzZSBSRkNPTU1fVUlIOgorCQlpZiAoZGxjaSkKKwkJCXJldHVybiByZmNvbW1fcmVjdl9kYXRhKHMsIGRsY2ksIF9fdGVzdF9wZihoZHItPmN0cmwpLCBza2IpOworCisJCXJmY29tbV9yZWN2X21jYyhzLCBza2IpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUJUX0VSUigiVW5rbm93biBwYWNrZXQgdHlwZSAweCUwMnhcbiIsIHR5cGUpOworCQlicmVhazsKKwl9CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0gQ29ubmVjdGlvbiBhbmQgZGF0YSBwcm9jZXNzaW5nIC0tLS0gKi8KKworc3RhdGljIHZvaWQgcmZjb21tX3Byb2Nlc3NfY29ubmVjdChzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMpCit7CisJc3RydWN0IHJmY29tbV9kbGMgKmQ7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwgKm47CisKKwlCVF9EQkcoInNlc3Npb24gJXAgc3RhdGUgJWxkIiwgcywgcy0+c3RhdGUpOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZzLT5kbGNzKSB7CisJCWQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCByZmNvbW1fZGxjLCBsaXN0KTsKKwkJaWYgKGQtPnN0YXRlID09IEJUX0NPTkZJRykgeworCQkJZC0+bXR1ID0gcy0+bXR1OworCQkJcmZjb21tX3NlbmRfcG4ocywgMSwgZCk7CisJCX0KKwl9Cit9CisKKy8qIFNlbmQgZGF0YSBxdWV1ZWQgZm9yIHRoZSBETEMuCisgKiBSZXR1cm4gbnVtYmVyIG9mIGZyYW1lcyBsZWZ0IGluIHRoZSBxdWV1ZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcmZjb21tX3Byb2Nlc3NfdHgoc3RydWN0IHJmY29tbV9kbGMgKmQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgZXJyOworCisJQlRfREJHKCJkbGMgJXAgc3RhdGUgJWxkIGNmYyAlZCByeF9jcmVkaXRzICVkIHR4X2NyZWRpdHMgJWQiLCAKKwkJCWQsIGQtPnN0YXRlLCBkLT5jZmMsIGQtPnJ4X2NyZWRpdHMsIGQtPnR4X2NyZWRpdHMpOworCisJLyogU2VuZCBwZW5kaW5nIE1TQyAqLworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUkZDT01NX01TQ19QRU5ESU5HLCAmZC0+ZmxhZ3MpKQorCQlyZmNvbW1fc2VuZF9tc2MoZC0+c2Vzc2lvbiwgMSwgZC0+ZGxjaSwgZC0+djI0X3NpZyk7IAorCisJaWYgKGQtPmNmYykgeworCQkvKiBDRkMgZW5hYmxlZC4gCisJCSAqIEdpdmUgdGhlbSBzb21lIGNyZWRpdHMgKi8KKwkJaWYgKCF0ZXN0X2JpdChSRkNPTU1fUlhfVEhST1RUTEVELCAmZC0+ZmxhZ3MpICYmCisJCQkgICAgICAgCWQtPnJ4X2NyZWRpdHMgPD0gKGQtPmNmYyA+PiAyKSkgeworCQkJcmZjb21tX3NlbmRfY3JlZGl0cyhkLT5zZXNzaW9uLCBkLT5hZGRyLCBkLT5jZmMgLSBkLT5yeF9jcmVkaXRzKTsKKwkJCWQtPnJ4X2NyZWRpdHMgPSBkLT5jZmM7CisJCX0KKwl9IGVsc2UgeworCQkvKiBDRkMgZGlzYWJsZWQuCisJCSAqIEdpdmUgb3Vyc2VsdmVzIHNvbWUgY3JlZGl0cyAqLworCQlkLT50eF9jcmVkaXRzID0gNTsKKwl9CisKKwlpZiAodGVzdF9iaXQoUkZDT01NX1RYX1RIUk9UVExFRCwgJmQtPmZsYWdzKSkKKwkJcmV0dXJuIHNrYl9xdWV1ZV9sZW4oJmQtPnR4X3F1ZXVlKTsKKworCXdoaWxlIChkLT50eF9jcmVkaXRzICYmIChza2IgPSBza2JfZGVxdWV1ZSgmZC0+dHhfcXVldWUpKSkgeworCQllcnIgPSByZmNvbW1fc2VuZF9mcmFtZShkLT5zZXNzaW9uLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCXNrYl9xdWV1ZV9oZWFkKCZkLT50eF9xdWV1ZSwgc2tiKTsKKwkJCWJyZWFrOworCQl9CisJCWtmcmVlX3NrYihza2IpOworCQlkLT50eF9jcmVkaXRzLS07CisJfQorCisJaWYgKGQtPmNmYyAmJiAhZC0+dHhfY3JlZGl0cykgeworCQkvKiBXZSdyZSBvdXQgb2YgVFggY3JlZGl0cy4KKwkJICogU2V0IFRYX1RIUk9UVExFRCBmbGFnIHRvIGF2b2lkIHVubmVzYXJ5IHdha2V1cHMgYnkgZGxjX3NlbmQuICovCisJCXNldF9iaXQoUkZDT01NX1RYX1RIUk9UVExFRCwgJmQtPmZsYWdzKTsKKwl9CisKKwlyZXR1cm4gc2tiX3F1ZXVlX2xlbigmZC0+dHhfcXVldWUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmZjb21tX3Byb2Nlc3NfZGxjcyhzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMpCit7CisJc3RydWN0IHJmY29tbV9kbGMgKmQ7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwgKm47CisKKwlCVF9EQkcoInNlc3Npb24gJXAgc3RhdGUgJWxkIiwgcywgcy0+c3RhdGUpOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZzLT5kbGNzKSB7CisJCWQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCByZmNvbW1fZGxjLCBsaXN0KTsKKworCQlpZiAodGVzdF9iaXQoUkZDT01NX1RJTUVEX09VVCwgJmQtPmZsYWdzKSkgeworCQkJX19yZmNvbW1fZGxjX2Nsb3NlKGQsIEVUSU1FRE9VVCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUkZDT01NX0FVVEhfQUNDRVBULCAmZC0+ZmxhZ3MpKSB7CisJCQlyZmNvbW1fZGxjX2NsZWFyX3RpbWVyKGQpOworCQkJcmZjb21tX2RsY19hY2NlcHQoZCk7CisJCQlpZiAoZC0+bGlua19tb2RlICYgUkZDT01NX0xNX1NFQ1VSRSkgeworCQkJCXN0cnVjdCBzb2NrICpzayA9IHMtPnNvY2stPnNrOworCQkJCWhjaV9jb25uX2NoYW5nZV9saW5rX2tleShsMmNhcF9waShzayktPmNvbm4tPmhjb24pOworCQkJfQorCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJGQ09NTV9BVVRIX1JFSkVDVCwgJmQtPmZsYWdzKSkgeworCQkJcmZjb21tX2RsY19jbGVhcl90aW1lcihkKTsKKwkJCXJmY29tbV9zZW5kX2RtKHMsIGQtPmRsY2kpOworCQkJX19yZmNvbW1fZGxjX2Nsb3NlKGQsIEVDT05OUkVGVVNFRCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICh0ZXN0X2JpdChSRkNPTU1fVFhfVEhST1RUTEVELCAmcy0+ZmxhZ3MpKQorCQkJY29udGludWU7CisKKwkJaWYgKChkLT5zdGF0ZSA9PSBCVF9DT05ORUNURUQgfHwgZC0+c3RhdGUgPT0gQlRfRElTQ09OTikgJiYKKwkJCQlkLT5tc2NleCA9PSBSRkNPTU1fTVNDRVhfT0spCisJCQlyZmNvbW1fcHJvY2Vzc190eChkKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZmNvbW1fcHJvY2Vzc19yeChzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMpCit7CisJc3RydWN0IHNvY2tldCAqc29jayA9IHMtPnNvY2s7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCUJUX0RCRygic2Vzc2lvbiAlcCBzdGF0ZSAlbGQgcWxlbiAlZCIsIHMsIHMtPnN0YXRlLCBza2JfcXVldWVfbGVuKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpOworCisJLyogR2V0IGRhdGEgZGlyZWN0bHkgZnJvbSBzb2NrZXQgcmVjZWl2ZSBxdWV1ZSB3aXRob3V0IGNvcHlpbmcgaXQuICovCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpKSkgeworCQlza2Jfb3JwaGFuKHNrYik7CisJCXJmY29tbV9yZWN2X2ZyYW1lKHMsIHNrYik7CisJfQorCisJaWYgKHNrLT5za19zdGF0ZSA9PSBCVF9DTE9TRUQpIHsKKwkJaWYgKCFzLT5pbml0aWF0b3IpCisJCQlyZmNvbW1fc2Vzc2lvbl9wdXQocyk7CisKKwkJcmZjb21tX3Nlc3Npb25fY2xvc2Uocywgc2stPnNrX2Vycik7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmZjb21tX2FjY2VwdF9jb25uZWN0aW9uKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcykKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gcy0+c29jaywgKm5zb2NrOworCWludCBlcnI7CisKKwkvKiBGYXN0IGNoZWNrIGZvciBhIG5ldyBjb25uZWN0aW9uLgorCSAqIEF2b2lkcyB1bm5lc2VzYXJ5IHNvY2tldCBhbGxvY2F0aW9ucy4gKi8KKwlpZiAobGlzdF9lbXB0eSgmYnRfc2soc29jay0+c2spLT5hY2NlcHRfcSkpCisJCXJldHVybjsKKworCUJUX0RCRygic2Vzc2lvbiAlcCIsIHMpOworCisJaWYgKHNvY2tfY3JlYXRlX2xpdGUoUEZfQkxVRVRPT1RILCBzb2NrLT50eXBlLCBCVFBST1RPX0wyQ0FQLCAmbnNvY2spKQorCQlyZXR1cm47CisKKwluc29jay0+b3BzICA9IHNvY2stPm9wczsKKworCV9fbW9kdWxlX2dldChuc29jay0+b3BzLT5vd25lcik7CisKKwllcnIgPSBzb2NrLT5vcHMtPmFjY2VwdChzb2NrLCBuc29jaywgT19OT05CTE9DSyk7CisJaWYgKGVyciA8IDApIHsKKwkJc29ja19yZWxlYXNlKG5zb2NrKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFNldCBvdXIgY2FsbGJhY2tzICovCisJbnNvY2stPnNrLT5za19kYXRhX3JlYWR5ICAgPSByZmNvbW1fbDJkYXRhX3JlYWR5OworCW5zb2NrLT5zay0+c2tfc3RhdGVfY2hhbmdlID0gcmZjb21tX2wyc3RhdGVfY2hhbmdlOworCisJcyA9IHJmY29tbV9zZXNzaW9uX2FkZChuc29jaywgQlRfT1BFTik7CisJaWYgKHMpIHsKKwkJcmZjb21tX3Nlc3Npb25faG9sZChzKTsKKwkJcmZjb21tX3NjaGVkdWxlKFJGQ09NTV9TQ0hFRF9SWCk7CisJfSBlbHNlCisJCXNvY2tfcmVsZWFzZShuc29jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZmNvbW1fY2hlY2tfY29ubmVjdGlvbihzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMpCit7CisJc3RydWN0IHNvY2sgKnNrID0gcy0+c29jay0+c2s7CisKKwlCVF9EQkcoIiVwIHN0YXRlICVsZCIsIHMsIHMtPnN0YXRlKTsKKworCXN3aXRjaChzay0+c2tfc3RhdGUpIHsKKwljYXNlIEJUX0NPTk5FQ1RFRDoKKwkJcy0+c3RhdGUgPSBCVF9DT05ORUNUOworCisJCS8qIFdlIGNhbiBhZGp1c3QgTVRVIG9uIG91dGdvaW5nIHNlc3Npb25zLgorCQkgKiBMMkNBUCBNVFUgbWludXMgVUlIIGhlYWRlciBhbmQgRkNTLiAqLworCQlzLT5tdHUgPSBtaW4obDJjYXBfcGkoc2spLT5vbXR1LCBsMmNhcF9waShzayktPmltdHUpIC0gNTsKKworCQlyZmNvbW1fc2VuZF9zYWJtKHMsIDApOworCQlicmVhazsKKworCWNhc2UgQlRfQ0xPU0VEOgorCQlzLT5zdGF0ZSA9IEJUX0NMT1NFRDsKKwkJcmZjb21tX3Nlc3Npb25fY2xvc2Uocywgc2stPnNrX2Vycik7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHJmY29tbV9wcm9jZXNzX3Nlc3Npb25zKHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwgKm47CisKKwlyZmNvbW1fbG9jaygpOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZzZXNzaW9uX2xpc3QpIHsKKwkJc3RydWN0IHJmY29tbV9zZXNzaW9uICpzOworCQlzID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgcmZjb21tX3Nlc3Npb24sIGxpc3QpOworCisJCWlmIChzLT5zdGF0ZSA9PSBCVF9MSVNURU4pIHsKKwkJCXJmY29tbV9hY2NlcHRfY29ubmVjdGlvbihzKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmZjb21tX3Nlc3Npb25faG9sZChzKTsKKworCQlzd2l0Y2ggKHMtPnN0YXRlKSB7CisJCWNhc2UgQlRfQk9VTkQ6CisJCQlyZmNvbW1fY2hlY2tfY29ubmVjdGlvbihzKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZmNvbW1fcHJvY2Vzc19yeChzKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmZjb21tX3Byb2Nlc3NfZGxjcyhzKTsKKworCQlyZmNvbW1fc2Vzc2lvbl9wdXQocyk7CisJfQorCisJcmZjb21tX3VubG9jaygpOworfQorCitzdGF0aWMgdm9pZCByZmNvbW1fd29ya2VyKHZvaWQpCit7CisJQlRfREJHKCIiKTsKKworCXdoaWxlICghYXRvbWljX3JlYWQoJnRlcm1pbmF0ZSkpIHsKKwkJaWYgKCF0ZXN0X2JpdChSRkNPTU1fU0NIRURfV0FLRVVQLCAmcmZjb21tX2V2ZW50KSkgeworCQkJLyogTm8gcGVuZGluZyBldmVudHMuIExldCdzIHNsZWVwLgorCQkJICogSW5jb21pbmcgY29ubmVjdGlvbnMgYW5kIGRhdGEgd2lsbCB3YWtlIHVzIHVwLiAqLworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlKCk7CisJCX0KKworCQkvKiBQcm9jZXNzIHN0dWZmICovCisJCWNsZWFyX2JpdChSRkNPTU1fU0NIRURfV0FLRVVQLCAmcmZjb21tX2V2ZW50KTsKKwkJcmZjb21tX3Byb2Nlc3Nfc2Vzc2lvbnMoKTsKKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX2FkZF9saXN0ZW5lcihiZGFkZHJfdCAqYmEpCit7CisJc3RydWN0IHNvY2thZGRyX2wyIGFkZHI7CisJc3RydWN0IHNvY2tldCAqc29jazsKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IHJmY29tbV9zZXNzaW9uICpzOworCWludCAgICBlcnIgPSAwOworCisJLyogQ3JlYXRlIHNvY2tldCAqLworCWVyciA9IHJmY29tbV9sMnNvY2tfY3JlYXRlKCZzb2NrKTsKKwlpZiAoZXJyIDwgMCkgeyAKKwkJQlRfRVJSKCJDcmVhdGUgc29ja2V0IGZhaWxlZCAlZCIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogQmluZCBzb2NrZXQgKi8KKwliYWNweSgmYWRkci5sMl9iZGFkZHIsIGJhKTsKKwlhZGRyLmwyX2ZhbWlseSA9IEFGX0JMVUVUT09USDsKKwlhZGRyLmwyX3BzbSAgICA9IGh0b2JzKFJGQ09NTV9QU00pOworCWVyciA9IHNvY2stPm9wcy0+YmluZChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpOworCWlmIChlcnIgPCAwKSB7CisJCUJUX0VSUigiQmluZCBmYWlsZWQgJWQiLCBlcnIpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwkvKiBTZXQgTDJDQVAgb3B0aW9ucyAqLworCXNrID0gc29jay0+c2s7CisJbG9ja19zb2NrKHNrKTsKKwlsMmNhcF9waShzayktPmltdHUgPSBSRkNPTU1fTUFYX0wyQ0FQX01UVTsKKwlyZWxlYXNlX3NvY2soc2spOworCisJLyogU3RhcnQgbGlzdGVuaW5nIG9uIHRoZSBzb2NrZXQgKi8KKwllcnIgPSBzb2NrLT5vcHMtPmxpc3Rlbihzb2NrLCAxMCk7CisJaWYgKGVycikgeworCQlCVF9FUlIoIkxpc3RlbiBmYWlsZWQgJWQiLCBlcnIpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwkvKiBBZGQgbGlzdGVuaW5nIHNlc3Npb24gKi8KKwlzID0gcmZjb21tX3Nlc3Npb25fYWRkKHNvY2ssIEJUX0xJU1RFTik7CisJaWYgKCFzKQorCQlnb3RvIGZhaWxlZDsKKworCXJmY29tbV9zZXNzaW9uX2hvbGQocyk7CisJcmV0dXJuIDA7CitmYWlsZWQ6CisJc29ja19yZWxlYXNlKHNvY2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHJmY29tbV9raWxsX2xpc3RlbmVyKHZvaWQpCit7CisJc3RydWN0IHJmY29tbV9zZXNzaW9uICpzOworCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOworCisJQlRfREJHKCIiKTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShwLCBuLCAmc2Vzc2lvbl9saXN0KSB7CisJCXMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCByZmNvbW1fc2Vzc2lvbiwgbGlzdCk7CisJCXJmY29tbV9zZXNzaW9uX2RlbChzKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3J1bih2b2lkICp1bnVzZWQpCit7CisJcmZjb21tX3RocmVhZCA9IGN1cnJlbnQ7CisKKwlhdG9taWNfaW5jKCZydW5uaW5nKTsKKworCWRhZW1vbml6ZSgia3JmY29tbWQiKTsKKwlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC0xMCk7CisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CisKKwlCVF9EQkcoIiIpOworCisJcmZjb21tX2FkZF9saXN0ZW5lcihCREFERFJfQU5ZKTsKKworCXJmY29tbV93b3JrZXIoKTsKKworCXJmY29tbV9raWxsX2xpc3RlbmVyKCk7CisKKwlhdG9taWNfZGVjKCZydW5uaW5nKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmZjb21tX2F1dGhfY2ZtKHN0cnVjdCBoY2lfY29ubiAqY29ubiwgdTggc3RhdHVzKQoreworCXN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqczsKKwlzdHJ1Y3QgcmZjb21tX2RsYyAqZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqbjsKKworCUJUX0RCRygiY29ubiAlcCBzdGF0dXMgMHglMDJ4IiwgY29ubiwgc3RhdHVzKTsKKworCXMgPSByZmNvbW1fc2Vzc2lvbl9nZXQoJmNvbm4tPmhkZXYtPmJkYWRkciwgJmNvbm4tPmRzdCk7CisJaWYgKCFzKQorCQlyZXR1cm47CisKKwlyZmNvbW1fc2Vzc2lvbl9ob2xkKHMpOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZzLT5kbGNzKSB7CisJCWQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCByZmNvbW1fZGxjLCBsaXN0KTsKKworCQlpZiAoZC0+bGlua19tb2RlICYgKFJGQ09NTV9MTV9FTkNSWVBUIHwgUkZDT01NX0xNX1NFQ1VSRSkpCisJCQljb250aW51ZTsKKworCQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChSRkNPTU1fQVVUSF9QRU5ESU5HLCAmZC0+ZmxhZ3MpKQorCQkJY29udGludWU7CisKKwkJaWYgKCFzdGF0dXMpCisJCQlzZXRfYml0KFJGQ09NTV9BVVRIX0FDQ0VQVCwgJmQtPmZsYWdzKTsKKwkJZWxzZQorCQkJc2V0X2JpdChSRkNPTU1fQVVUSF9SRUpFQ1QsICZkLT5mbGFncyk7CisJfQorCisJcmZjb21tX3Nlc3Npb25fcHV0KHMpOworCisJcmZjb21tX3NjaGVkdWxlKFJGQ09NTV9TQ0hFRF9BVVRIKTsKK30KKworc3RhdGljIHZvaWQgcmZjb21tX2VuY3J5cHRfY2ZtKHN0cnVjdCBoY2lfY29ubiAqY29ubiwgdTggc3RhdHVzLCB1OCBlbmNyeXB0KQoreworCXN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqczsKKwlzdHJ1Y3QgcmZjb21tX2RsYyAqZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqbjsKKworCUJUX0RCRygiY29ubiAlcCBzdGF0dXMgMHglMDJ4IGVuY3J5cHQgMHglMDJ4IiwgY29ubiwgc3RhdHVzLCBlbmNyeXB0KTsKKworCXMgPSByZmNvbW1fc2Vzc2lvbl9nZXQoJmNvbm4tPmhkZXYtPmJkYWRkciwgJmNvbm4tPmRzdCk7CisJaWYgKCFzKQorCQlyZXR1cm47CisKKwlyZmNvbW1fc2Vzc2lvbl9ob2xkKHMpOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZzLT5kbGNzKSB7CisJCWQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCByZmNvbW1fZGxjLCBsaXN0KTsKKworCQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChSRkNPTU1fQVVUSF9QRU5ESU5HLCAmZC0+ZmxhZ3MpKQorCQkJY29udGludWU7CisKKwkJaWYgKCFzdGF0dXMgJiYgZW5jcnlwdCkKKwkJCXNldF9iaXQoUkZDT01NX0FVVEhfQUNDRVBULCAmZC0+ZmxhZ3MpOworCQllbHNlCisJCQlzZXRfYml0KFJGQ09NTV9BVVRIX1JFSkVDVCwgJmQtPmZsYWdzKTsKKwl9CisKKwlyZmNvbW1fc2Vzc2lvbl9wdXQocyk7CisKKwlyZmNvbW1fc2NoZWR1bGUoUkZDT01NX1NDSEVEX0FVVEgpOworfQorCitzdGF0aWMgc3RydWN0IGhjaV9jYiByZmNvbW1fY2IgPSB7CisJLm5hbWUJCT0gIlJGQ09NTSIsCisJLmF1dGhfY2ZtCT0gcmZjb21tX2F1dGhfY2ZtLAorCS5lbmNyeXB0X2NmbQk9IHJmY29tbV9lbmNyeXB0X2NmbQorfTsKKworLyogLS0tLSBQcm9jIGZzIHN1cHBvcnQgLS0tLSAqLworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgdm9pZCAqcmZjb21tX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHJmY29tbV9zZXNzaW9uICpzOworCXN0cnVjdCBsaXN0X2hlYWQgKnBwLCAqcDsKKwlsb2ZmX3QgbCA9ICpwb3M7CisKKwlyZmNvbW1fbG9jaygpOworCisJbGlzdF9mb3JfZWFjaChwLCAmc2Vzc2lvbl9saXN0KSB7CisJCXMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCByZmNvbW1fc2Vzc2lvbiwgbGlzdCk7CisJCWxpc3RfZm9yX2VhY2gocHAsICZzLT5kbGNzKQorCQkJaWYgKCFsLS0pIHsKKwkJCQlzZXEtPnByaXZhdGUgPSBzOworCQkJCXJldHVybiBwcDsKKwkJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICpyZmNvbW1fc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKmUsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcyA9IHNlcS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwcCwgKnAgPSBlOworCSgqcG9zKSsrOworCisJaWYgKHAtPm5leHQgIT0gJnMtPmRsY3MpCisJCXJldHVybiBwLT5uZXh0OworCisJbGlzdF9mb3JfZWFjaChwLCAmc2Vzc2lvbl9saXN0KSB7CisJCXMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCByZmNvbW1fc2Vzc2lvbiwgbGlzdCk7CisJCV9fbGlzdF9mb3JfZWFjaChwcCwgJnMtPmRsY3MpIHsKKwkJCXNlcS0+cHJpdmF0ZSA9IHM7CisJCQlyZXR1cm4gcHA7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHJmY29tbV9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqZSkKK3sKKwlyZmNvbW1fdW5sb2NrKCk7Cit9CisKK3N0YXRpYyBpbnQgIHJmY29tbV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqZSkKK3sKKwlzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMgPSBzZXEtPnByaXZhdGU7CisJc3RydWN0IHNvY2sgKnNrID0gcy0+c29jay0+c2s7CisJc3RydWN0IHJmY29tbV9kbGMgKmQgPSBsaXN0X2VudHJ5KGUsIHN0cnVjdCByZmNvbW1fZGxjLCBsaXN0KTsKKworCXNlcV9wcmludGYoc2VxLCAiJXMgJXMgJWxkICVkICVkICVkICVkXG4iLAorCQkJYmF0b3N0cigmYnRfc2soc2spLT5zcmMpLCBiYXRvc3RyKCZidF9zayhzayktPmRzdCksCisJCQlkLT5zdGF0ZSwgZC0+ZGxjaSwgZC0+bXR1LCBkLT5yeF9jcmVkaXRzLCBkLT50eF9jcmVkaXRzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyByZmNvbW1fc2VxX29wcyA9IHsKKwkuc3RhcnQgID0gcmZjb21tX3NlcV9zdGFydCwKKwkubmV4dCAgID0gcmZjb21tX3NlcV9uZXh0LAorCS5zdG9wICAgPSByZmNvbW1fc2VxX3N0b3AsCisJLnNob3cgICA9IHJmY29tbV9zZXFfc2hvdyAKK307CisKK3N0YXRpYyBpbnQgcmZjb21tX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmcmZjb21tX3NlcV9vcHMpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByZmNvbW1fc2VxX2ZvcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gcmZjb21tX3NlcV9vcGVuLAorCS5yZWFkICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgIF9faW5pdCByZmNvbW1fcHJvY19pbml0KHZvaWQpCit7CisgICAgICAgIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcDsKKworCXByb2NfYnRfcmZjb21tID0gcHJvY19ta2RpcigicmZjb21tIiwgcHJvY19idCk7CisJaWYgKHByb2NfYnRfcmZjb21tKSB7CisJCXByb2NfYnRfcmZjb21tLT5vd25lciA9IFRISVNfTU9EVUxFOworCisgICAgICAgIAlwID0gY3JlYXRlX3Byb2NfZW50cnkoImRsYyIsIFNfSVJVR08sIHByb2NfYnRfcmZjb21tKTsKKwkJaWYgKHApCisgICAgICAgIAkJcC0+cHJvY19mb3BzID0gJnJmY29tbV9zZXFfZm9wczsKKwl9CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcmZjb21tX3Byb2NfY2xlYW51cCh2b2lkKQoreworICAgICAgICByZW1vdmVfcHJvY19lbnRyeSgiZGxjIiwgcHJvY19idF9yZmNvbW0pOworCisJcmVtb3ZlX3Byb2NfZW50cnkoInJmY29tbSIsIHByb2NfYnQpOworfQorCisjZWxzZSAvKiBDT05GSUdfUFJPQ19GUyAqLworCitzdGF0aWMgaW50ICBfX2luaXQgcmZjb21tX3Byb2NfaW5pdCh2b2lkKQoreworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHJmY29tbV9wcm9jX2NsZWFudXAodm9pZCkKK3sKKyAgICAgICAgcmV0dXJuOworfQorI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKKy8qIC0tLS0gSW5pdGlhbGl6YXRpb24gLS0tLSAqLworc3RhdGljIGludCBfX2luaXQgcmZjb21tX2luaXQodm9pZCkKK3sKKwlsMmNhcF9sb2FkKCk7CisKKwloY2lfcmVnaXN0ZXJfY2IoJnJmY29tbV9jYik7CisKKwlrZXJuZWxfdGhyZWFkKHJmY29tbV9ydW4sIE5VTEwsIENMT05FX0tFUk5FTCk7CisKKwlCVF9JTkZPKCJSRkNPTU0gdmVyICVzIiwgVkVSU0lPTik7CisKKwlyZmNvbW1fcHJvY19pbml0KCk7CisKKwlyZmNvbW1faW5pdF9zb2NrZXRzKCk7CisKKyNpZmRlZiBDT05GSUdfQlRfUkZDT01NX1RUWQorCXJmY29tbV9pbml0X3R0eXMoKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCByZmNvbW1fZXhpdCh2b2lkKQoreworCWhjaV91bnJlZ2lzdGVyX2NiKCZyZmNvbW1fY2IpOworCisJLyogVGVybWluYXRlIHdvcmtpbmcgdGhyZWFkLgorCSAqIGllLiBTZXQgdGVybWluYXRlIGZsYWcgYW5kIHdha2UgaXQgdXAgKi8KKwlhdG9taWNfaW5jKCZ0ZXJtaW5hdGUpOworCXJmY29tbV9zY2hlZHVsZShSRkNPTU1fU0NIRURfU1RBVEUpOworCisJLyogV2FpdCB1bnRpbCB0aHJlYWQgaXMgcnVubmluZyAqLworCXdoaWxlIChhdG9taWNfcmVhZCgmcnVubmluZykpCisJCXNjaGVkdWxlKCk7CisKKyNpZmRlZiBDT05GSUdfQlRfUkZDT01NX1RUWQorCXJmY29tbV9jbGVhbnVwX3R0eXMoKTsKKyNlbmRpZgorCisJcmZjb21tX2NsZWFudXBfc29ja2V0cygpOworCisJcmZjb21tX3Byb2NfY2xlYW51cCgpOworfQorCittb2R1bGVfaW5pdChyZmNvbW1faW5pdCk7Cittb2R1bGVfZXhpdChyZmNvbW1fZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1heGltIEtyYXNueWFuc2t5IDxtYXhrQHF1YWxjb21tLmNvbT4sIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQmx1ZXRvb3RoIFJGQ09NTSB2ZXIgIiBWRVJTSU9OKTsKK01PRFVMRV9WRVJTSU9OKFZFUlNJT04pOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJidC1wcm90by0zIik7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS9jcmMuYyBiL25ldC9ibHVldG9vdGgvcmZjb21tL2NyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMTFiYzQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9jcmMuYwpAQCAtMCwwICsxLDcxIEBACisvKiAKKyAgIFJGQ09NTSBpbXBsZW1lbnRhdGlvbiBmb3IgTGludXggQmx1ZXRvb3RoIHN0YWNrIChCbHVlWikuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgTWF4aW0gS3Jhc255YW5za3kgPG1heGtAcXVhbGNvbW0uY29tPgorICAgQ29weXJpZ2h0IChDKSAyMDAyIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBBTkQgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZCisgICBDTEFJTSwgT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUyAKKyAgIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiAKKyAgIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIAorICAgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworICAgQUxMIExJQUJJTElUWSwgSU5DTFVESU5HIExJQUJJTElUWSBGT1IgSU5GUklOR0VNRU5UIE9GIEFOWSBQQVRFTlRTLCAKKyAgIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLCBSRUxBVElORyBUTyBVU0UgT0YgVEhJUyAKKyAgIFNPRlRXQVJFIElTIERJU0NMQUlNRUQuCisqLworCisvKgorICogUkZDT01NIEZDUyBjYWxjdWxhdGlvbi4KKyAqCisgKiAkSWQ6IGNyYy5jLHYgMS4yIDIwMDIvMDkvMjEgMDk6NTQ6MzIgaG9sdG1hbm4gRXhwICQKKyAqLworCisvKiByZXZlcnNlZCwgOC1iaXQsIHBvbHk9MHgwNyAqLwordW5zaWduZWQgY2hhciByZmNvbW1fY3JjX3RhYmxlWzI1Nl0gPSB7IAorCTB4MDAsIDB4OTEsIDB4ZTMsIDB4NzIsIDB4MDcsIDB4OTYsIDB4ZTQsIDB4NzUsCisJMHgwZSwgMHg5ZiwgMHhlZCwgMHg3YywgMHgwOSwgMHg5OCwgMHhlYSwgMHg3YiwKKwkweDFjLCAweDhkLCAweGZmLCAweDZlLCAweDFiLCAweDhhLCAweGY4LCAweDY5LAorCTB4MTIsIDB4ODMsIDB4ZjEsIDB4NjAsIDB4MTUsIDB4ODQsIDB4ZjYsIDB4NjcsCisKKwkweDM4LCAweGE5LCAweGRiLCAweDRhLCAweDNmLCAweGFlLCAweGRjLCAweDRkLAorCTB4MzYsIDB4YTcsIDB4ZDUsIDB4NDQsIDB4MzEsIDB4YTAsIDB4ZDIsIDB4NDMsCisJMHgyNCwgMHhiNSwgMHhjNywgMHg1NiwgMHgyMywgMHhiMiwgMHhjMCwgMHg1MSwKKwkweDJhLCAweGJiLCAweGM5LCAweDU4LCAweDJkLCAweGJjLCAweGNlLCAweDVmLAorCisJMHg3MCwgMHhlMSwgMHg5MywgMHgwMiwgMHg3NywgMHhlNiwgMHg5NCwgMHgwNSwKKwkweDdlLCAweGVmLCAweDlkLCAweDBjLCAweDc5LCAweGU4LCAweDlhLCAweDBiLAorCTB4NmMsIDB4ZmQsIDB4OGYsIDB4MWUsIDB4NmIsIDB4ZmEsIDB4ODgsIDB4MTksCisJMHg2MiwgMHhmMywgMHg4MSwgMHgxMCwgMHg2NSwgMHhmNCwgMHg4NiwgMHgxNywKKworCTB4NDgsIDB4ZDksIDB4YWIsIDB4M2EsIDB4NGYsIDB4ZGUsIDB4YWMsIDB4M2QsCisJMHg0NiwgMHhkNywgMHhhNSwgMHgzNCwgMHg0MSwgMHhkMCwgMHhhMiwgMHgzMywKKwkweDU0LCAweGM1LCAweGI3LCAweDI2LCAweDUzLCAweGMyLCAweGIwLCAweDIxLAorCTB4NWEsIDB4Y2IsIDB4YjksIDB4MjgsIDB4NWQsIDB4Y2MsIDB4YmUsIDB4MmYsCisKKwkweGUwLCAweDcxLCAweDAzLCAweDkyLCAweGU3LCAweDc2LCAweDA0LCAweDk1LAorCTB4ZWUsIDB4N2YsIDB4MGQsIDB4OWMsIDB4ZTksIDB4NzgsIDB4MGEsIDB4OWIsCisJMHhmYywgMHg2ZCwgMHgxZiwgMHg4ZSwgMHhmYiwgMHg2YSwgMHgxOCwgMHg4OSwKKwkweGYyLCAweDYzLCAweDExLCAweDgwLCAweGY1LCAweDY0LCAweDE2LCAweDg3LAorCisJMHhkOCwgMHg0OSwgMHgzYiwgMHhhYSwgMHhkZiwgMHg0ZSwgMHgzYywgMHhhZCwKKwkweGQ2LCAweDQ3LCAweDM1LCAweGE0LCAweGQxLCAweDQwLCAweDMyLCAweGEzLAorCTB4YzQsIDB4NTUsIDB4MjcsIDB4YjYsIDB4YzMsIDB4NTIsIDB4MjAsIDB4YjEsCisJMHhjYSwgMHg1YiwgMHgyOSwgMHhiOCwgMHhjZCwgMHg1YywgMHgyZSwgMHhiZiwKKworCTB4OTAsIDB4MDEsIDB4NzMsIDB4ZTIsIDB4OTcsIDB4MDYsIDB4NzQsIDB4ZTUsCisJMHg5ZSwgMHgwZiwgMHg3ZCwgMHhlYywgMHg5OSwgMHgwOCwgMHg3YSwgMHhlYiwKKwkweDhjLCAweDFkLCAweDZmLCAweGZlLCAweDhiLCAweDFhLCAweDY4LCAweGY5LAorCTB4ODIsIDB4MTMsIDB4NjEsIDB4ZjAsIDB4ODUsIDB4MTQsIDB4NjYsIDB4ZjcsCisKKwkweGE4LCAweDM5LCAweDRiLCAweGRhLCAweGFmLCAweDNlLCAweDRjLCAweGRkLAorCTB4YTYsIDB4MzcsIDB4NDUsIDB4ZDQsIDB4YTEsIDB4MzAsIDB4NDIsIDB4ZDMsCisJMHhiNCwgMHgyNSwgMHg1NywgMHhjNiwgMHhiMywgMHgyMiwgMHg1MCwgMHhjMSwKKwkweGJhLCAweDJiLCAweDU5LCAweGM4LCAweGJkLCAweDJjLCAweDVlLCAweGNmCit9OwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9yZmNvbW0vc29jay5jIGIvbmV0L2JsdWV0b290aC9yZmNvbW0vc29jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MDAyOGEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9zb2NrLmMKQEAgLTAsMCArMSwxMDEwIEBACisvKiAKKyAgIFJGQ09NTSBpbXBsZW1lbnRhdGlvbiBmb3IgTGludXggQmx1ZXRvb3RoIHN0YWNrIChCbHVlWikuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgTWF4aW0gS3Jhc255YW5za3kgPG1heGtAcXVhbGNvbW0uY29tPgorICAgQ29weXJpZ2h0IChDKSAyMDAyIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBBTkQgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZCisgICBDTEFJTSwgT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUyAKKyAgIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiAKKyAgIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIAorICAgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworICAgQUxMIExJQUJJTElUWSwgSU5DTFVESU5HIExJQUJJTElUWSBGT1IgSU5GUklOR0VNRU5UIE9GIEFOWSBQQVRFTlRTLCAKKyAgIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLCBSRUxBVElORyBUTyBVU0UgT0YgVEhJUyAKKyAgIFNPRlRXQVJFIElTIERJU0NMQUlNRUQuCisqLworCisvKgorICogUkZDT01NIHNvY2tldHMuCisgKgorICogJElkOiBzb2NrLmMsdiAxLjI0IDIwMDIvMTAvMDMgMDE6MDA6MzQgbWF4ayBFeHAgJAorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9sMmNhcC5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvcmZjb21tLmg+CisKKyNpZm5kZWYgQ09ORklHX0JUX1JGQ09NTV9ERUJVRworI3VuZGVmICBCVF9EQkcKKyNkZWZpbmUgQlRfREJHKEQuLi4pCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgcmZjb21tX3NvY2tfb3BzOworCitzdGF0aWMgc3RydWN0IGJ0X3NvY2tfbGlzdCByZmNvbW1fc2tfbGlzdCA9IHsKKwkubG9jayA9IFJXX0xPQ0tfVU5MT0NLRUQKK307CisKK3N0YXRpYyB2b2lkIHJmY29tbV9zb2NrX2Nsb3NlKHN0cnVjdCBzb2NrICpzayk7CitzdGF0aWMgdm9pZCByZmNvbW1fc29ja19raWxsKHN0cnVjdCBzb2NrICpzayk7CisKKy8qIC0tLS0gRExDIGNhbGxiYWNrcyAtLS0tCisgKgorICogY2FsbGVkIHVuZGVyIHJmY29tbV9kbGNfbG9jaygpCisgKi8KK3N0YXRpYyB2b2lkIHJmY29tbV9za19kYXRhX3JlYWR5KHN0cnVjdCByZmNvbW1fZGxjICpkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBzb2NrICpzayA9IGQtPm93bmVyOworCWlmICghc2spCisJCXJldHVybjsKKworCWF0b21pY19hZGQoc2tiLT5sZW4sICZzay0+c2tfcm1lbV9hbGxvYyk7CisJc2tiX3F1ZXVlX3RhaWwoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IpOworCXNrLT5za19kYXRhX3JlYWR5KHNrLCBza2ItPmxlbik7CisKKwlpZiAoYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSA+PSBzay0+c2tfcmN2YnVmKQorCQlyZmNvbW1fZGxjX3Rocm90dGxlKGQpOworfQorCitzdGF0aWMgdm9pZCByZmNvbW1fc2tfc3RhdGVfY2hhbmdlKHN0cnVjdCByZmNvbW1fZGxjICpkLCBpbnQgZXJyKQoreworCXN0cnVjdCBzb2NrICpzayA9IGQtPm93bmVyLCAqcGFyZW50OworCWlmICghc2spCisJCXJldHVybjsKKworCUJUX0RCRygiZGxjICVwIHN0YXRlICVsZCBlcnIgJWQiLCBkLCBkLT5zdGF0ZSwgZXJyKTsKKworCWJoX2xvY2tfc29jayhzayk7CisKKwlpZiAoZXJyKQorCQlzay0+c2tfZXJyID0gZXJyOworCisJc2stPnNrX3N0YXRlID0gZC0+c3RhdGU7CisKKwlwYXJlbnQgPSBidF9zayhzayktPnBhcmVudDsKKwlpZiAocGFyZW50KSB7CisJCWlmIChkLT5zdGF0ZSA9PSBCVF9DTE9TRUQpIHsKKwkJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKwkJCWJ0X2FjY2VwdF91bmxpbmsoc2spOworCQl9CisJCXBhcmVudC0+c2tfZGF0YV9yZWFkeShwYXJlbnQsIDApOworCX0gZWxzZSB7CisJCWlmIChkLT5zdGF0ZSA9PSBCVF9DT05ORUNURUQpCisJCQlyZmNvbW1fc2Vzc2lvbl9nZXRhZGRyKGQtPnNlc3Npb24sICZidF9zayhzayktPnNyYywgTlVMTCk7CisJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCX0KKworCWJoX3VubG9ja19zb2NrKHNrKTsKKworCWlmIChwYXJlbnQgJiYgc29ja19mbGFnKHNrLCBTT0NLX1pBUFBFRCkpIHsKKwkJLyogV2UgaGF2ZSB0byBkcm9wIERMQyBsb2NrIGhlcmUsIG90aGVyd2lzZQorCQkgKiByZmNvbW1fc29ja19kZXN0cnVjdCgpIHdpbGwgZGVhZCBsb2NrLiAqLworCQlyZmNvbW1fZGxjX3VubG9jayhkKTsKKwkJcmZjb21tX3NvY2tfa2lsbChzayk7CisJCXJmY29tbV9kbGNfbG9jayhkKTsKKwl9Cit9CisKKy8qIC0tLS0gU29ja2V0IGZ1bmN0aW9ucyAtLS0tICovCitzdGF0aWMgc3RydWN0IHNvY2sgKl9fcmZjb21tX2dldF9zb2NrX2J5X2FkZHIodTggY2hhbm5lbCwgYmRhZGRyX3QgKnNyYykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBOVUxMOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJc2tfZm9yX2VhY2goc2ssIG5vZGUsICZyZmNvbW1fc2tfbGlzdC5oZWFkKSB7CisJCWlmIChyZmNvbW1fcGkoc2spLT5jaGFubmVsID09IGNoYW5uZWwgJiYgCisJCQkJIWJhY21wKCZidF9zayhzayktPnNyYywgc3JjKSkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBub2RlID8gc2sgOiBOVUxMOworfQorCisvKiBGaW5kIHNvY2tldCB3aXRoIGNoYW5uZWwgYW5kIHNvdXJjZSBiZGFkZHIuCisgKiBSZXR1cm5zIGNsb3Nlc3QgbWF0Y2guCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29jayAqX19yZmNvbW1fZ2V0X3NvY2tfYnlfY2hhbm5lbChpbnQgc3RhdGUsIHU4IGNoYW5uZWwsIGJkYWRkcl90ICpzcmMpCit7CisJc3RydWN0IHNvY2sgKnNrID0gTlVMTCwgKnNrMSA9IE5VTEw7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisKKwlza19mb3JfZWFjaChzaywgbm9kZSwgJnJmY29tbV9za19saXN0LmhlYWQpIHsKKwkJaWYgKHN0YXRlICYmIHNrLT5za19zdGF0ZSAhPSBzdGF0ZSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChyZmNvbW1fcGkoc2spLT5jaGFubmVsID09IGNoYW5uZWwpIHsKKwkJCS8qIEV4YWN0IG1hdGNoLiAqLworCQkJaWYgKCFiYWNtcCgmYnRfc2soc2spLT5zcmMsIHNyYykpCisJCQkJYnJlYWs7CisKKwkJCS8qIENsb3Nlc3QgbWF0Y2ggKi8KKwkJCWlmICghYmFjbXAoJmJ0X3NrKHNrKS0+c3JjLCBCREFERFJfQU5ZKSkKKwkJCQlzazEgPSBzazsKKwkJfQorCX0KKwlyZXR1cm4gbm9kZSA/IHNrIDogc2sxOworfQorCisvKiBGaW5kIHNvY2tldCB3aXRoIGdpdmVuIGFkZHJlc3MgKGNoYW5uZWwsIHNyYykuCisgKiBSZXR1cm5zIGxvY2tlZCBzb2NrZXQgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNvY2sgKnJmY29tbV9nZXRfc29ja19ieV9jaGFubmVsKGludCBzdGF0ZSwgdTggY2hhbm5lbCwgYmRhZGRyX3QgKnNyYykKK3sKKwlzdHJ1Y3Qgc29jayAqczsKKwlyZWFkX2xvY2soJnJmY29tbV9za19saXN0LmxvY2spOworCXMgPSBfX3JmY29tbV9nZXRfc29ja19ieV9jaGFubmVsKHN0YXRlLCBjaGFubmVsLCBzcmMpOworCWlmIChzKSBiaF9sb2NrX3NvY2socyk7CisJcmVhZF91bmxvY2soJnJmY29tbV9za19saXN0LmxvY2spOworCXJldHVybiBzOworfQorCitzdGF0aWMgdm9pZCByZmNvbW1fc29ja19kZXN0cnVjdChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHJmY29tbV9kbGMgKmQgPSByZmNvbW1fcGkoc2spLT5kbGM7CisKKwlCVF9EQkcoInNrICVwIGRsYyAlcCIsIHNrLCBkKTsKKworCXNrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCXNrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX3dyaXRlX3F1ZXVlKTsKKworCXJmY29tbV9kbGNfbG9jayhkKTsKKwlyZmNvbW1fcGkoc2spLT5kbGMgPSBOVUxMOworCisJLyogRGV0YWNoIERMQyBpZiBpdCdzIG93bmVkIGJ5IHRoaXMgc29ja2V0ICovCisJaWYgKGQtPm93bmVyID09IHNrKQorCQlkLT5vd25lciA9IE5VTEw7CisJcmZjb21tX2RsY191bmxvY2soZCk7CisKKwlyZmNvbW1fZGxjX3B1dChkKTsKK30KKworc3RhdGljIHZvaWQgcmZjb21tX3NvY2tfY2xlYW51cF9saXN0ZW4oc3RydWN0IHNvY2sgKnBhcmVudCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlCVF9EQkcoInBhcmVudCAlcCIsIHBhcmVudCk7CisKKwkvKiBDbG9zZSBub3QgeWV0IGFjY2VwdGVkIGRsY3MgKi8KKwl3aGlsZSAoKHNrID0gYnRfYWNjZXB0X2RlcXVldWUocGFyZW50LCBOVUxMKSkpIHsKKwkJcmZjb21tX3NvY2tfY2xvc2Uoc2spOworCQlyZmNvbW1fc29ja19raWxsKHNrKTsKKwl9CisKKwlwYXJlbnQtPnNrX3N0YXRlICA9IEJUX0NMT1NFRDsKKwlzb2NrX3NldF9mbGFnKHBhcmVudCwgU09DS19aQVBQRUQpOworfQorCisvKiBLaWxsIHNvY2tldCAob25seSBpZiB6YXBwZWQgYW5kIG9ycGhhbikKKyAqIE11c3QgYmUgY2FsbGVkIG9uIHVubG9ja2VkIHNvY2tldC4KKyAqLworc3RhdGljIHZvaWQgcmZjb21tX3NvY2tfa2lsbChzdHJ1Y3Qgc29jayAqc2spCit7CisJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKSB8fCBzay0+c2tfc29ja2V0KQorCQlyZXR1cm47CisKKwlCVF9EQkcoInNrICVwIHN0YXRlICVkIHJlZmNudCAlZCIsIHNrLCBzay0+c2tfc3RhdGUsIGF0b21pY19yZWFkKCZzay0+c2tfcmVmY250KSk7CisKKwkvKiBLaWxsIHBvb3Igb3JwaGFuICovCisJYnRfc29ja191bmxpbmsoJnJmY29tbV9za19saXN0LCBzayk7CisJc29ja19zZXRfZmxhZyhzaywgU09DS19ERUFEKTsKKwlzb2NrX3B1dChzayk7Cit9CisKK3N0YXRpYyB2b2lkIF9fcmZjb21tX3NvY2tfY2xvc2Uoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCByZmNvbW1fZGxjICpkID0gcmZjb21tX3BpKHNrKS0+ZGxjOworCisJQlRfREJHKCJzayAlcCBzdGF0ZSAlZCBzb2NrZXQgJXAiLCBzaywgc2stPnNrX3N0YXRlLCBzay0+c2tfc29ja2V0KTsKKworCXN3aXRjaCAoc2stPnNrX3N0YXRlKSB7CisJY2FzZSBCVF9MSVNURU46CisJCXJmY29tbV9zb2NrX2NsZWFudXBfbGlzdGVuKHNrKTsKKwkJYnJlYWs7CisKKwljYXNlIEJUX0NPTk5FQ1Q6CisJY2FzZSBCVF9DT05ORUNUMjoKKwljYXNlIEJUX0NPTkZJRzoKKwljYXNlIEJUX0NPTk5FQ1RFRDoKKwkJcmZjb21tX2RsY19jbG9zZShkLCAwKTsKKworCWRlZmF1bHQ6CisJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBDbG9zZSBzb2NrZXQuCisgKiBNdXN0IGJlIGNhbGxlZCBvbiB1bmxvY2tlZCBzb2NrZXQuCisgKi8KK3N0YXRpYyB2b2lkIHJmY29tbV9zb2NrX2Nsb3NlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlsb2NrX3NvY2soc2spOworCV9fcmZjb21tX3NvY2tfY2xvc2Uoc2spOworCXJlbGVhc2Vfc29jayhzayk7Cit9CisKK3N0YXRpYyB2b2lkIHJmY29tbV9zb2NrX2luaXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29jayAqcGFyZW50KQoreworCXN0cnVjdCByZmNvbW1fcGluZm8gKnBpID0gcmZjb21tX3BpKHNrKTsKKworCUJUX0RCRygic2sgJXAiLCBzayk7CisKKwlpZiAocGFyZW50KSB7CisJCXNrLT5za190eXBlID0gcGFyZW50LT5za190eXBlOworCQlwaS0+bGlua19tb2RlID0gcmZjb21tX3BpKHBhcmVudCktPmxpbmtfbW9kZTsKKwl9IGVsc2UgeworCQlwaS0+bGlua19tb2RlID0gMDsKKwl9CisKKwlwaS0+ZGxjLT5saW5rX21vZGUgPSBwaS0+bGlua19tb2RlOworfQorCitzdGF0aWMgc3RydWN0IHByb3RvIHJmY29tbV9wcm90byA9IHsKKwkubmFtZQkJPSAiUkZDT01NIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9ial9zaXplCT0gc2l6ZW9mKHN0cnVjdCByZmNvbW1fcGluZm8pCit9OworCitzdGF0aWMgc3RydWN0IHNvY2sgKnJmY29tbV9zb2NrX2FsbG9jKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90bywgaW50IHByaW8pCit7CisJc3RydWN0IHJmY29tbV9kbGMgKmQ7CisJc3RydWN0IHNvY2sgKnNrOworCisJc2sgPSBza19hbGxvYyhQRl9CTFVFVE9PVEgsIHByaW8sICZyZmNvbW1fcHJvdG8sIDEpOworCWlmICghc2spCisJCXJldHVybiBOVUxMOworCisJc29ja19pbml0X2RhdGEoc29jaywgc2spOworCUlOSVRfTElTVF9IRUFEKCZidF9zayhzayktPmFjY2VwdF9xKTsKKworCWQgPSByZmNvbW1fZGxjX2FsbG9jKHByaW8pOworCWlmICghZCkgeworCQlza19mcmVlKHNrKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZC0+ZGF0YV9yZWFkeSAgID0gcmZjb21tX3NrX2RhdGFfcmVhZHk7CisJZC0+c3RhdGVfY2hhbmdlID0gcmZjb21tX3NrX3N0YXRlX2NoYW5nZTsKKworCXJmY29tbV9waShzayktPmRsYyA9IGQ7CisJZC0+b3duZXIgPSBzazsKKworCXNrLT5za19kZXN0cnVjdCA9IHJmY29tbV9zb2NrX2Rlc3RydWN0OworCXNrLT5za19zbmR0aW1lbyA9IFJGQ09NTV9DT05OX1RJTUVPVVQ7CisKKwlzay0+c2tfc25kYnVmICAgPSBSRkNPTU1fTUFYX0NSRURJVFMgKiBSRkNPTU1fREVGQVVMVF9NVFUgKiAxMDsKKwlzay0+c2tfcmN2YnVmICAgPSBSRkNPTU1fTUFYX0NSRURJVFMgKiBSRkNPTU1fREVGQVVMVF9NVFUgKiAxMDsKKworCXNvY2tfcmVzZXRfZmxhZyhzaywgU09DS19aQVBQRUQpOworCisJc2stPnNrX3Byb3RvY29sID0gcHJvdG87CisJc2stPnNrX3N0YXRlCT0gQlRfT1BFTjsKKworCWJ0X3NvY2tfbGluaygmcmZjb21tX3NrX2xpc3QsIHNrKTsKKworCUJUX0RCRygic2sgJXAiLCBzayk7CisJcmV0dXJuIHNrOworfQorCitzdGF0aWMgaW50IHJmY29tbV9zb2NrX2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgcHJvdG9jb2wpCit7CisJc3RydWN0IHNvY2sgKnNrOworCisJQlRfREJHKCJzb2NrICVwIiwgc29jayk7CisKKwlzb2NrLT5zdGF0ZSA9IFNTX1VOQ09OTkVDVEVEOworCisJaWYgKHNvY2stPnR5cGUgIT0gU09DS19TVFJFQU0gJiYgc29jay0+dHlwZSAhPSBTT0NLX1JBVykKKwkJcmV0dXJuIC1FU09DS1ROT1NVUFBPUlQ7CisKKwlzb2NrLT5vcHMgPSAmcmZjb21tX3NvY2tfb3BzOworCisJaWYgKCEoc2sgPSByZmNvbW1fc29ja19hbGxvYyhzb2NrLCBwcm90b2NvbCwgR0ZQX0tFUk5FTCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJmY29tbV9zb2NrX2luaXQoc2ssIE5VTEwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJmY29tbV9zb2NrX2JpbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgYWRkcl9sZW4pCit7CisJc3RydWN0IHNvY2thZGRyX3JjICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHJfcmMgKikgYWRkcjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlpbnQgZXJyID0gMDsKKworCUJUX0RCRygic2sgJXAgJXMiLCBzaywgYmF0b3N0cigmc2EtPnJjX2JkYWRkcikpOworCisJaWYgKCFhZGRyIHx8IGFkZHItPnNhX2ZhbWlseSAhPSBBRl9CTFVFVE9PVEgpCisJCXJldHVybiAtRUlOVkFMOworCisJbG9ja19zb2NrKHNrKTsKKworCWlmIChzay0+c2tfc3RhdGUgIT0gQlRfT1BFTikgeworCQllcnIgPSAtRUJBREZEOworCQlnb3RvIGRvbmU7CisJfQorCisJd3JpdGVfbG9ja19iaCgmcmZjb21tX3NrX2xpc3QubG9jayk7CisKKwlpZiAoc2EtPnJjX2NoYW5uZWwgJiYgX19yZmNvbW1fZ2V0X3NvY2tfYnlfYWRkcihzYS0+cmNfY2hhbm5lbCwgJnNhLT5yY19iZGFkZHIpKSB7CisJCWVyciA9IC1FQUREUklOVVNFOworCX0gZWxzZSB7CisJCS8qIFNhdmUgc291cmNlIGFkZHJlc3MgKi8KKwkJYmFjcHkoJmJ0X3NrKHNrKS0+c3JjLCAmc2EtPnJjX2JkYWRkcik7CisJCXJmY29tbV9waShzayktPmNoYW5uZWwgPSBzYS0+cmNfY2hhbm5lbDsKKwkJc2stPnNrX3N0YXRlID0gQlRfQk9VTkQ7CisJfQorCisJd3JpdGVfdW5sb2NrX2JoKCZyZmNvbW1fc2tfbGlzdC5sb2NrKTsKKworZG9uZToKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3NvY2tfY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCBhbGVuLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNvY2thZGRyX3JjICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHJfcmMgKikgYWRkcjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgcmZjb21tX2RsYyAqZCA9IHJmY29tbV9waShzayktPmRsYzsKKwlpbnQgZXJyID0gMDsKKworCUJUX0RCRygic2sgJXAiLCBzayk7CisKKwlpZiAoYWRkci0+c2FfZmFtaWx5ICE9IEFGX0JMVUVUT09USCB8fCBhbGVuIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9yYykpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHNrLT5za19zdGF0ZSAhPSBCVF9PUEVOICYmIHNrLT5za19zdGF0ZSAhPSBCVF9CT1VORCkKKwkJcmV0dXJuIC1FQkFERkQ7CisKKwlpZiAoc2stPnNrX3R5cGUgIT0gU09DS19TVFJFQU0pCisJCXJldHVybiAtRUlOVkFMOworCisJbG9ja19zb2NrKHNrKTsKKworCXNrLT5za19zdGF0ZSA9IEJUX0NPTk5FQ1Q7CisJYmFjcHkoJmJ0X3NrKHNrKS0+ZHN0LCAmc2EtPnJjX2JkYWRkcik7CisJcmZjb21tX3BpKHNrKS0+Y2hhbm5lbCA9IHNhLT5yY19jaGFubmVsOworCisJZXJyID0gcmZjb21tX2RsY19vcGVuKGQsICZidF9zayhzayktPnNyYywgJnNhLT5yY19iZGFkZHIsIHNhLT5yY19jaGFubmVsKTsKKwlpZiAoIWVycikKKwkJZXJyID0gYnRfc29ja193YWl0X3N0YXRlKHNrLCBCVF9DT05ORUNURUQsCisJCQkJc29ja19zbmR0aW1lbyhzaywgZmxhZ3MgJiBPX05PTkJMT0NLKSk7CisKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3NvY2tfbGlzdGVuKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBiYWNrbG9nKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCBlcnIgPSAwOworCisJQlRfREJHKCJzayAlcCBiYWNrbG9nICVkIiwgc2ssIGJhY2tsb2cpOworCisJbG9ja19zb2NrKHNrKTsKKworCWlmIChzay0+c2tfc3RhdGUgIT0gQlRfQk9VTkQpIHsKKwkJZXJyID0gLUVCQURGRDsKKwkJZ290byBkb25lOworCX0KKworCWlmICghcmZjb21tX3BpKHNrKS0+Y2hhbm5lbCkgeworCQliZGFkZHJfdCAqc3JjID0gJmJ0X3NrKHNrKS0+c3JjOworCQl1OCBjaGFubmVsOworCisJCWVyciA9IC1FSU5WQUw7CisKKwkJd3JpdGVfbG9ja19iaCgmcmZjb21tX3NrX2xpc3QubG9jayk7CisKKwkJZm9yIChjaGFubmVsID0gMTsgY2hhbm5lbCA8IDMxOyBjaGFubmVsKyspCisJCQlpZiAoIV9fcmZjb21tX2dldF9zb2NrX2J5X2FkZHIoY2hhbm5lbCwgc3JjKSkgeworCQkJCXJmY29tbV9waShzayktPmNoYW5uZWwgPSBjaGFubmVsOworCQkJCWVyciA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJd3JpdGVfdW5sb2NrX2JoKCZyZmNvbW1fc2tfbGlzdC5sb2NrKTsKKworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZG9uZTsKKwl9CisKKwlzay0+c2tfbWF4X2Fja19iYWNrbG9nID0gYmFja2xvZzsKKwlzay0+c2tfYWNrX2JhY2tsb2cgPSAwOworCXNrLT5za19zdGF0ZSA9IEJUX0xJU1RFTjsKKworZG9uZToKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3NvY2tfYWNjZXB0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrZXQgKm5ld3NvY2ssIGludCBmbGFncykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zaywgKm5zazsKKwlsb25nIHRpbWVvOworCWludCBlcnIgPSAwOworCisJbG9ja19zb2NrKHNrKTsKKworCWlmIChzay0+c2tfc3RhdGUgIT0gQlRfTElTVEVOKSB7CisJCWVyciA9IC1FQkFERkQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl0aW1lbyA9IHNvY2tfcmN2dGltZW8oc2ssIGZsYWdzICYgT19OT05CTE9DSyk7CisKKwlCVF9EQkcoInNrICVwIHRpbWVvICVsZCIsIHNrLCB0aW1lbyk7CisKKwkvKiBXYWl0IGZvciBhbiBpbmNvbWluZyBjb25uZWN0aW9uLiAod2FrZS1vbmUpLiAqLworCWFkZF93YWl0X3F1ZXVlX2V4Y2x1c2l2ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwl3aGlsZSAoIShuc2sgPSBidF9hY2NlcHRfZGVxdWV1ZShzaywgbmV3c29jaykpKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmICghdGltZW8pIHsKKwkJCWVyciA9IC1FQUdBSU47CisJCQlicmVhazsKKwkJfQorCisJCXJlbGVhc2Vfc29jayhzayk7CisJCXRpbWVvID0gc2NoZWR1bGVfdGltZW91dCh0aW1lbyk7CisJCWxvY2tfc29jayhzayk7CisKKwkJaWYgKHNrLT5za19zdGF0ZSAhPSBCVF9MSVNURU4pIHsKKwkJCWVyciA9IC1FQkFERkQ7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJZXJyID0gc29ja19pbnRyX2Vycm5vKHRpbWVvKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisKKwlpZiAoZXJyKQorCQlnb3RvIGRvbmU7CisKKwluZXdzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKworCUJUX0RCRygibmV3IHNvY2tldCAlcCIsIG5zayk7CisKK2RvbmU6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHJmY29tbV9zb2NrX2dldG5hbWUoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgKmxlbiwgaW50IHBlZXIpCit7CisJc3RydWN0IHNvY2thZGRyX3JjICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHJfcmMgKikgYWRkcjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKworCUJUX0RCRygic29jayAlcCwgc2sgJXAiLCBzb2NrLCBzayk7CisKKwlzYS0+cmNfZmFtaWx5ICA9IEFGX0JMVUVUT09USDsKKwlzYS0+cmNfY2hhbm5lbCA9IHJmY29tbV9waShzayktPmNoYW5uZWw7CisJaWYgKHBlZXIpCisJCWJhY3B5KCZzYS0+cmNfYmRhZGRyLCAmYnRfc2soc2spLT5kc3QpOworCWVsc2UKKwkJYmFjcHkoJnNhLT5yY19iZGFkZHIsICZidF9zayhzayktPnNyYyk7CisKKwkqbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9yYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3NvY2tfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgICAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCByZmNvbW1fZGxjICpkID0gcmZjb21tX3BpKHNrKS0+ZGxjOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGVycjsKKwlpbnQgc2VudCA9IDA7CisKKwlpZiAobXNnLT5tc2dfZmxhZ3MgJiBNU0dfT09CKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoc2stPnNrX3NodXRkb3duICYgU0VORF9TSFVURE9XTikKKwkJcmV0dXJuIC1FUElQRTsKKworCUJUX0RCRygic29jayAlcCwgc2sgJXAiLCBzb2NrLCBzayk7CisKKwlsb2NrX3NvY2soc2spOworCisJd2hpbGUgKGxlbikgeworCQlzaXplX3Qgc2l6ZSA9IG1pbl90KHNpemVfdCwgbGVuLCBkLT5tdHUpOworCQkKKwkJc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywgc2l6ZSArIFJGQ09NTV9TS0JfUkVTRVJWRSwKKwkJCQltc2ctPm1zZ19mbGFncyAmIE1TR19ET05UV0FJVCwgJmVycik7CisJCWlmICghc2tiKQorCQkJYnJlYWs7CisJCXNrYl9yZXNlcnZlKHNrYiwgUkZDT01NX1NLQl9IRUFEX1JFU0VSVkUpOworCisJCWVyciA9IG1lbWNweV9mcm9taW92ZWMoc2tiX3B1dChza2IsIHNpemUpLCBtc2ctPm1zZ19pb3YsIHNpemUpOworCQlpZiAoZXJyKSB7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXNlbnQgPSBlcnI7CisJCQlicmVhazsKKwkJfQorCisJCWVyciA9IHJmY29tbV9kbGNfc2VuZChkLCBza2IpOworCQlpZiAoZXJyIDwgMCkgeworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlicmVhazsKKwkJfQorCisJCXNlbnQgKz0gc2l6ZTsKKwkJbGVuICAtPSBzaXplOworCX0KKworCXJlbGVhc2Vfc29jayhzayk7CisKKwlyZXR1cm4gc2VudCA/IHNlbnQgOiBlcnI7Cit9CisKK3N0YXRpYyBsb25nIHJmY29tbV9zb2NrX2RhdGFfd2FpdChzdHJ1Y3Qgc29jayAqc2ssIGxvbmcgdGltZW8pCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlhZGRfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwlmb3IgKDs7KSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJaWYgKHNrYl9xdWV1ZV9sZW4oJnNrLT5za19yZWNlaXZlX3F1ZXVlKSB8fCBzay0+c2tfZXJyIHx8IChzay0+c2tfc2h1dGRvd24gJiBSQ1ZfU0hVVERPV04pIHx8CisJCQkJc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgfHwgIXRpbWVvKQorCQkJYnJlYWs7CisKKwkJc2V0X2JpdChTT0NLX0FTWU5DX1dBSVREQVRBLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOworCQlyZWxlYXNlX3NvY2soc2spOworCQl0aW1lbyA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW8pOworCQlsb2NrX3NvY2soc2spOworCQljbGVhcl9iaXQoU09DS19BU1lOQ19XQUlUREFUQSwgJnNrLT5za19zb2NrZXQtPmZsYWdzKTsKKwl9CisKKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJcmV0dXJuIHRpbWVvOworfQorCitzdGF0aWMgaW50IHJmY29tbV9zb2NrX3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJICAgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlpbnQgZXJyID0gMDsKKwlzaXplX3QgdGFyZ2V0LCBjb3BpZWQgPSAwOworCWxvbmcgdGltZW87CisKKwlpZiAoZmxhZ3MgJiBNU0dfT09CKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwltc2ctPm1zZ19uYW1lbGVuID0gMDsKKworCUJUX0RCRygic2sgJXAgc2l6ZSAlZCIsIHNrLCBzaXplKTsKKworCWxvY2tfc29jayhzayk7CisKKwl0YXJnZXQgPSBzb2NrX3Jjdmxvd2F0KHNrLCBmbGFncyAmIE1TR19XQUlUQUxMLCBzaXplKTsKKwl0aW1lbyAgPSBzb2NrX3JjdnRpbWVvKHNrLCBmbGFncyAmIE1TR19ET05UV0FJVCk7CisKKwlkbyB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCWludCBjaHVuazsKKworCQlza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCQlpZiAoIXNrYikgeworCQkJaWYgKGNvcGllZCA+PSB0YXJnZXQpCisJCQkJYnJlYWs7CisKKwkJCWlmICgoZXJyID0gc29ja19lcnJvcihzaykpICE9IDApCisJCQkJYnJlYWs7CisJCQlpZiAoc2stPnNrX3NodXRkb3duICYgUkNWX1NIVVRET1dOKQorCQkJCWJyZWFrOworCisJCQllcnIgPSAtRUFHQUlOOworCQkJaWYgKCF0aW1lbykKKwkJCQlicmVhazsKKworCQkJdGltZW8gPSByZmNvbW1fc29ja19kYXRhX3dhaXQoc2ssIHRpbWVvKTsKKworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJZXJyID0gc29ja19pbnRyX2Vycm5vKHRpbWVvKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJY2h1bmsgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHNrYi0+bGVuLCBzaXplKTsKKwkJaWYgKG1lbWNweV90b2lvdmVjKG1zZy0+bXNnX2lvdiwgc2tiLT5kYXRhLCBjaHVuaykpIHsKKwkJCXNrYl9xdWV1ZV9oZWFkKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKKwkJCWlmICghY29waWVkKQorCQkJCWNvcGllZCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQljb3BpZWQgKz0gY2h1bms7CisJCXNpemUgICAtPSBjaHVuazsKKworCQlpZiAoIShmbGFncyAmIE1TR19QRUVLKSkgeworCQkJYXRvbWljX3N1YihjaHVuaywgJnNrLT5za19ybWVtX2FsbG9jKTsKKworCQkJc2tiX3B1bGwoc2tiLCBjaHVuayk7CisJCQlpZiAoc2tiLT5sZW4pIHsKKwkJCQlza2JfcXVldWVfaGVhZCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlrZnJlZV9za2Ioc2tiKTsKKworCQl9IGVsc2UgeworCQkJLyogcHV0IG1lc3NhZ2UgYmFjayBhbmQgcmV0dXJuICovCisJCQlza2JfcXVldWVfaGVhZCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKHNpemUpOworCitvdXQ6CisJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgPD0gKHNrLT5za19yY3ZidWYgPj4gMikpCisJCXJmY29tbV9kbGNfdW50aHJvdHRsZShyZmNvbW1fcGkoc2spLT5kbGMpOworCisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gY29waWVkID8gOiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3NvY2tfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCBlcnIgPSAwOworCXUzMiBvcHQ7CisKKwlCVF9EQkcoInNrICVwIiwgc2spOworCisJbG9ja19zb2NrKHNrKTsKKworCXN3aXRjaCAob3B0bmFtZSkgeworCWNhc2UgUkZDT01NX0xNOgorCQlpZiAoZ2V0X3VzZXIob3B0LCAodTMyIF9fdXNlciAqKSBvcHR2YWwpKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlyZmNvbW1fcGkoc2spLT5saW5rX21vZGUgPSBvcHQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT1BST1RPT1BUOworCQlicmVhazsKKwl9CisKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3NvY2tfZ2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHNvY2sgKmwyY2FwX3NrOworCXN0cnVjdCByZmNvbW1fY29ubmluZm8gY2luZm87CisJaW50IGxlbiwgZXJyID0gMDsKKworCUJUX0RCRygic2sgJXAiLCBzayk7CisKKwlpZiAoZ2V0X3VzZXIobGVuLCBvcHRsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWxvY2tfc29jayhzayk7CisKKwlzd2l0Y2ggKG9wdG5hbWUpIHsKKwljYXNlIFJGQ09NTV9MTToKKwkJaWYgKHB1dF91c2VyKHJmY29tbV9waShzayktPmxpbmtfbW9kZSwgKHUzMiBfX3VzZXIgKikgb3B0dmFsKSkKKwkJCWVyciA9IC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBSRkNPTU1fQ09OTklORk86CisJCWlmIChzay0+c2tfc3RhdGUgIT0gQlRfQ09OTkVDVEVEKSB7CisJCQllcnIgPSAtRU5PVENPTk47CisJCQlicmVhazsKKwkJfQorCisJCWwyY2FwX3NrID0gcmZjb21tX3BpKHNrKS0+ZGxjLT5zZXNzaW9uLT5zb2NrLT5zazsKKworCQljaW5mby5oY2lfaGFuZGxlID0gbDJjYXBfcGkobDJjYXBfc2spLT5jb25uLT5oY29uLT5oYW5kbGU7CisJCW1lbWNweShjaW5mby5kZXZfY2xhc3MsIGwyY2FwX3BpKGwyY2FwX3NrKS0+Y29ubi0+aGNvbi0+ZGV2X2NsYXNzLCAzKTsKKworCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwgc2l6ZW9mKGNpbmZvKSk7CisJCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCAoY2hhciAqKSAmY2luZm8sIGxlbikpCisJCQllcnIgPSAtRUZBVUxUOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT1BST1RPT1BUOworCQlicmVhazsKKwl9CisKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3NvY2tfaW9jdGwoc3RydWN0IHNvY2tldCAqc29jaywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJaW50IGVycjsKKworCWxvY2tfc29jayhzayk7CisKKyNpZmRlZiBDT05GSUdfQlRfUkZDT01NX1RUWQorCWVyciA9IHJmY29tbV9kZXZfaW9jdGwoc2ssIGNtZCwgKHZvaWQgX191c2VyICopYXJnKTsKKyNlbHNlCisJZXJyID0gLUVPUE5PVFNVUFA7CisjZW5kaWYKKworCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCByZmNvbW1fc29ja19zaHV0ZG93bihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgaG93KQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCBlcnIgPSAwOworCisJQlRfREJHKCJzb2NrICVwLCBzayAlcCIsIHNvY2ssIHNrKTsKKworCWlmICghc2spIHJldHVybiAwOworCisJbG9ja19zb2NrKHNrKTsKKwlpZiAoIXNrLT5za19zaHV0ZG93bikgeworCQlzay0+c2tfc2h1dGRvd24gPSBTSFVURE9XTl9NQVNLOworCQlfX3JmY29tbV9zb2NrX2Nsb3NlKHNrKTsKKworCQlpZiAoc29ja19mbGFnKHNrLCBTT0NLX0xJTkdFUikgJiYgc2stPnNrX2xpbmdlcnRpbWUpCisJCQllcnIgPSBidF9zb2NrX3dhaXRfc3RhdGUoc2ssIEJUX0NMT1NFRCwgc2stPnNrX2xpbmdlcnRpbWUpOworCX0KKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3NvY2tfcmVsZWFzZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCBlcnI7CisKKwlCVF9EQkcoInNvY2sgJXAsIHNrICVwIiwgc29jaywgc2spOworCisJaWYgKCFzaykKKwkJcmV0dXJuIDA7CisKKwllcnIgPSByZmNvbW1fc29ja19zaHV0ZG93bihzb2NrLCAyKTsKKworCXNvY2tfb3JwaGFuKHNrKTsKKwlyZmNvbW1fc29ja19raWxsKHNrKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiAtLS0tIFJGQ09NTSBjb3JlIGxheWVyIGNhbGxiYWNrcyAtLS0tIAorICoKKyAqIGNhbGxlZCB1bmRlciByZmNvbW1fbG9jaygpCisgKi8KK2ludCByZmNvbW1fY29ubmVjdF9pbmQoc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCB1OCBjaGFubmVsLCBzdHJ1Y3QgcmZjb21tX2RsYyAqKmQpCit7CisJc3RydWN0IHNvY2sgKnNrLCAqcGFyZW50OworCWJkYWRkcl90IHNyYywgZHN0OworCWludCByZXN1bHQgPSAwOworCisJQlRfREJHKCJzZXNzaW9uICVwIGNoYW5uZWwgJWQiLCBzLCBjaGFubmVsKTsKKworCXJmY29tbV9zZXNzaW9uX2dldGFkZHIocywgJnNyYywgJmRzdCk7CisKKwkvKiBDaGVjayBpZiB3ZSBoYXZlIHNvY2tldCBsaXN0ZW5pbmcgb24gY2hhbm5lbCAqLworCXBhcmVudCA9IHJmY29tbV9nZXRfc29ja19ieV9jaGFubmVsKEJUX0xJU1RFTiwgY2hhbm5lbCwgJnNyYyk7CisJaWYgKCFwYXJlbnQpCisJCXJldHVybiAwOworCisJLyogQ2hlY2sgZm9yIGJhY2tsb2cgc2l6ZSAqLworCWlmIChza19hY2NlcHRxX2lzX2Z1bGwocGFyZW50KSkgeworCQlCVF9EQkcoImJhY2tsb2cgZnVsbCAlZCIsIHBhcmVudC0+c2tfYWNrX2JhY2tsb2cpOyAKKwkJZ290byBkb25lOworCX0KKworCXNrID0gcmZjb21tX3NvY2tfYWxsb2MoTlVMTCwgQlRQUk9UT19SRkNPTU0sIEdGUF9BVE9NSUMpOworCWlmICghc2spCisJCWdvdG8gZG9uZTsKKworCXJmY29tbV9zb2NrX2luaXQoc2ssIHBhcmVudCk7CisJYmFjcHkoJmJ0X3NrKHNrKS0+c3JjLCAmc3JjKTsKKwliYWNweSgmYnRfc2soc2spLT5kc3QsICZkc3QpOworCXJmY29tbV9waShzayktPmNoYW5uZWwgPSBjaGFubmVsOworCisJc2stPnNrX3N0YXRlID0gQlRfQ09ORklHOworCWJ0X2FjY2VwdF9lbnF1ZXVlKHBhcmVudCwgc2spOworCisJLyogQWNjZXB0IGNvbm5lY3Rpb24gYW5kIHJldHVybiBzb2NrZXQgRExDICovCisJKmQgPSByZmNvbW1fcGkoc2spLT5kbGM7CisJcmVzdWx0ID0gMTsKKworZG9uZToKKwliaF91bmxvY2tfc29jayhwYXJlbnQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIC0tLS0gUHJvYyBmcyBzdXBwb3J0IC0tLS0gKi8KKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIHZvaWQgKnJmY29tbV9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBzb2NrICpzazsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlsb2ZmX3QgbCA9ICpwb3M7CisKKwlyZWFkX2xvY2tfYmgoJnJmY29tbV9za19saXN0LmxvY2spOworCisJc2tfZm9yX2VhY2goc2ssIG5vZGUsICZyZmNvbW1fc2tfbGlzdC5oZWFkKQorCQlpZiAoIWwtLSkKKwkJCXJldHVybiBzazsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKnJmY29tbV9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqZSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHNvY2sgKnNrID0gZTsKKwkoKnBvcykrKzsKKwlyZXR1cm4gc2tfbmV4dChzayk7Cit9CisKK3N0YXRpYyB2b2lkIHJmY29tbV9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqZSkKK3sKKwlyZWFkX3VubG9ja19iaCgmcmZjb21tX3NrX2xpc3QubG9jayk7Cit9CisKK3N0YXRpYyBpbnQgIHJmY29tbV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqZSkKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBlOworCXNlcV9wcmludGYoc2VxLCAiJXMgJXMgJWQgJWRcbiIsCisJCQliYXRvc3RyKCZidF9zayhzayktPnNyYyksIGJhdG9zdHIoJmJ0X3NrKHNrKS0+ZHN0KSwKKwkJCXNrLT5za19zdGF0ZSwgcmZjb21tX3BpKHNrKS0+Y2hhbm5lbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcmZjb21tX3NlcV9vcHMgPSB7CisJLnN0YXJ0ICA9IHJmY29tbV9zZXFfc3RhcnQsCisJLm5leHQgICA9IHJmY29tbV9zZXFfbmV4dCwKKwkuc3RvcCAgID0gcmZjb21tX3NlcV9zdG9wLAorCS5zaG93ICAgPSByZmNvbW1fc2VxX3Nob3cgCit9OworCitzdGF0aWMgaW50IHJmY29tbV9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJnJmY29tbV9zZXFfb3BzKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmZjb21tX3NlcV9mb3BzID0geworCS5vd25lcgkgPSBUSElTX01PRFVMRSwKKwkub3BlbiAgICA9IHJmY29tbV9zZXFfb3BlbiwKKwkucmVhZCAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50ICBfX2luaXQgcmZjb21tX3NvY2tfcHJvY19pbml0KHZvaWQpCit7CisgICAgICAgIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJzb2NrIiwgU19JUlVHTywgcHJvY19idF9yZmNvbW0pOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgIHAtPnByb2NfZm9wcyA9ICZyZmNvbW1fc2VxX2ZvcHM7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcmZjb21tX3NvY2tfcHJvY19jbGVhbnVwKHZvaWQpCit7CisgICAgICAgIHJlbW92ZV9wcm9jX2VudHJ5KCJzb2NrIiwgcHJvY19idF9yZmNvbW0pOworfQorCisjZWxzZSAvKiBDT05GSUdfUFJPQ19GUyAqLworCitzdGF0aWMgaW50ICBfX2luaXQgcmZjb21tX3NvY2tfcHJvY19pbml0KHZvaWQpCit7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcmZjb21tX3NvY2tfcHJvY19jbGVhbnVwKHZvaWQpCit7CisgICAgICAgIHJldHVybjsKK30KKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyByZmNvbW1fc29ja19vcHMgPSB7CisJLmZhbWlseQkJPSBQRl9CTFVFVE9PVEgsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWxlYXNlCT0gcmZjb21tX3NvY2tfcmVsZWFzZSwKKwkuYmluZAkJPSByZmNvbW1fc29ja19iaW5kLAorCS5jb25uZWN0CT0gcmZjb21tX3NvY2tfY29ubmVjdCwKKwkubGlzdGVuCQk9IHJmY29tbV9zb2NrX2xpc3RlbiwKKwkuYWNjZXB0CQk9IHJmY29tbV9zb2NrX2FjY2VwdCwKKwkuZ2V0bmFtZQk9IHJmY29tbV9zb2NrX2dldG5hbWUsCisJLnNlbmRtc2cJPSByZmNvbW1fc29ja19zZW5kbXNnLAorCS5yZWN2bXNnCT0gcmZjb21tX3NvY2tfcmVjdm1zZywKKwkuc2h1dGRvd24JPSByZmNvbW1fc29ja19zaHV0ZG93biwKKwkuc2V0c29ja29wdAk9IHJmY29tbV9zb2NrX3NldHNvY2tvcHQsCisJLmdldHNvY2tvcHQJPSByZmNvbW1fc29ja19nZXRzb2Nrb3B0LAorCS5pb2N0bAkJPSByZmNvbW1fc29ja19pb2N0bCwKKwkucG9sbAkJPSBidF9zb2NrX3BvbGwsCisJLnNvY2tldHBhaXIJPSBzb2NrX25vX3NvY2tldHBhaXIsCisJLm1tYXAJCT0gc29ja19ub19tbWFwCit9OworCitzdGF0aWMgc3RydWN0IG5ldF9wcm90b19mYW1pbHkgcmZjb21tX3NvY2tfZmFtaWx5X29wcyA9IHsKKwkuZmFtaWx5CQk9IFBGX0JMVUVUT09USCwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmNyZWF0ZQkJPSByZmNvbW1fc29ja19jcmVhdGUKK307CisKK2ludCAgX19pbml0IHJmY29tbV9pbml0X3NvY2tldHModm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcHJvdG9fcmVnaXN0ZXIoJnJmY29tbV9wcm90bywgMCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBidF9zb2NrX3JlZ2lzdGVyKEJUUFJPVE9fUkZDT01NLCAmcmZjb21tX3NvY2tfZmFtaWx5X29wcyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlyZmNvbW1fc29ja19wcm9jX2luaXQoKTsKKworCUJUX0lORk8oIlJGQ09NTSBzb2NrZXQgbGF5ZXIgaW5pdGlhbGl6ZWQiKTsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlCVF9FUlIoIlJGQ09NTSBzb2NrZXQgbGF5ZXIgcmVnaXN0cmF0aW9uIGZhaWxlZCIpOworCXByb3RvX3VucmVnaXN0ZXIoJnJmY29tbV9wcm90byk7CisJcmV0dXJuIGVycjsKK30KKwordm9pZCBfX2V4aXQgcmZjb21tX2NsZWFudXBfc29ja2V0cyh2b2lkKQoreworCXJmY29tbV9zb2NrX3Byb2NfY2xlYW51cCgpOworCisJaWYgKGJ0X3NvY2tfdW5yZWdpc3RlcihCVFBST1RPX1JGQ09NTSkgPCAwKQorCQlCVF9FUlIoIlJGQ09NTSBzb2NrZXQgbGF5ZXIgdW5yZWdpc3RyYXRpb24gZmFpbGVkIik7CisKKwlwcm90b191bnJlZ2lzdGVyKCZyZmNvbW1fcHJvdG8pOworfQpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9yZmNvbW0vdHR5LmMgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS90dHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDY4OTIwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9yZmNvbW0vdHR5LmMKQEAgLTAsMCArMSw5MzAgQEAKKy8qIAorICAgUkZDT01NIGltcGxlbWVudGF0aW9uIGZvciBMaW51eCBCbHVldG9vdGggc3RhY2sgKEJsdWVaKS4KKyAgIENvcHlyaWdodCAoQykgMjAwMiBNYXhpbSBLcmFzbnlhbnNreSA8bWF4a0BxdWFsY29tbS5jb20+CisgICBDb3B5cmlnaHQgKEMpIDIwMDIgTWFyY2VsIEhvbHRtYW5uIDxtYXJjZWxAaG9sdG1hbm4ub3JnPgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICAgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIFRISVJEIFBBUlRZIFJJR0hUUy4KKyAgIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIEFORCBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkKKyAgIENMQUlNLCBPUiBBTlkgU1BFQ0lBTCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIE9SIEFOWSBEQU1BR0VTIAorICAgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIAorICAgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgCisgICBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisgICBBTEwgTElBQklMSVRZLCBJTkNMVURJTkcgTElBQklMSVRZIEZPUiBJTkZSSU5HRU1FTlQgT0YgQU5ZIFBBVEVOVFMsIAorICAgQ09QWVJJR0hUUywgVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMsIFJFTEFUSU5HIFRPIFVTRSBPRiBUSElTIAorICAgU09GVFdBUkUgSVMgRElTQ0xBSU1FRC4KKyovCisKKy8qCisgKiBSRkNPTU0gVFRZLgorICoKKyAqICRJZDogdHR5LmMsdiAxLjI0IDIwMDIvMTAvMDMgMDE6NTQ6MzggaG9sdG1hbm4gRXhwICQKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9yZmNvbW0uaD4KKworI2lmbmRlZiBDT05GSUdfQlRfUkZDT01NX0RFQlVHCisjdW5kZWYgIEJUX0RCRworI2RlZmluZSBCVF9EQkcoRC4uLikKKyNlbmRpZgorCisjZGVmaW5lIFJGQ09NTV9UVFlfTUFHSUMgMHg2ZDAyCQkvKiBtYWdpYyBudW1iZXIgZm9yIHJmY29tbSBzdHJ1Y3QgKi8KKyNkZWZpbmUgUkZDT01NX1RUWV9QT1JUUyBSRkNPTU1fTUFYX0RFVgkvKiB3aG9sZSBsb3R0YSByZmNvbW0gZGV2aWNlcyAqLworI2RlZmluZSBSRkNPTU1fVFRZX01BSk9SIDIxNgkJLyogZGV2aWNlIG5vZGUgbWFqb3IgaWQgb2YgdGhlIHVzYi9ibHVldG9vdGguYyBkcml2ZXIgKi8KKyNkZWZpbmUgUkZDT01NX1RUWV9NSU5PUiAwCisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqcmZjb21tX3R0eV9kcml2ZXI7CisKK3N0cnVjdCByZmNvbW1fZGV2IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJYXRvbWljX3QJCXJlZmNudDsKKworCWNoYXIJCQluYW1lWzEyXTsKKwlpbnQJCQlpZDsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwlpbnQJCQlvcGVuZWQ7CisJaW50CQkJZXJyOworCisJYmRhZGRyX3QJCXNyYzsKKwliZGFkZHJfdAkJZHN0OworCXU4IAkJCWNoYW5uZWw7CisKKwl1aW50IAkJCW1vZGVtX3N0YXR1czsKKworCXN0cnVjdCByZmNvbW1fZGxjCSpkbGM7CisJc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAgICAgICB3YWl0OworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAgIHdha2V1cF90YXNrOworCisJYXRvbWljX3QgCQl3bWVtX2FsbG9jOworfTsKKworc3RhdGljIExJU1RfSEVBRChyZmNvbW1fZGV2X2xpc3QpOworc3RhdGljIERFRklORV9SV0xPQ0socmZjb21tX2Rldl9sb2NrKTsKKworc3RhdGljIHZvaWQgcmZjb21tX2Rldl9kYXRhX3JlYWR5KHN0cnVjdCByZmNvbW1fZGxjICpkbGMsIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQgcmZjb21tX2Rldl9zdGF0ZV9jaGFuZ2Uoc3RydWN0IHJmY29tbV9kbGMgKmRsYywgaW50IGVycik7CitzdGF0aWMgdm9pZCByZmNvbW1fZGV2X21vZGVtX3N0YXR1cyhzdHJ1Y3QgcmZjb21tX2RsYyAqZGxjLCB1OCB2MjRfc2lnKTsKKworc3RhdGljIHZvaWQgcmZjb21tX3R0eV93YWtldXAodW5zaWduZWQgbG9uZyBhcmcpOworCisvKiAtLS0tIERldmljZSBmdW5jdGlvbnMgLS0tLSAqLworc3RhdGljIHZvaWQgcmZjb21tX2Rldl9kZXN0cnVjdChzdHJ1Y3QgcmZjb21tX2RldiAqZGV2KQoreworCXN0cnVjdCByZmNvbW1fZGxjICpkbGMgPSBkZXYtPmRsYzsKKworCUJUX0RCRygiZGV2ICVwIGRsYyAlcCIsIGRldiwgZGxjKTsKKworCXJmY29tbV9kbGNfbG9jayhkbGMpOworCS8qIERldGFjaCBETEMgaWYgaXQncyBvd25lZCBieSB0aGlzIGRldiAqLworCWlmIChkbGMtPm93bmVyID09IGRldikKKwkJZGxjLT5vd25lciA9IE5VTEw7CisJcmZjb21tX2RsY191bmxvY2soZGxjKTsKKworCXJmY29tbV9kbGNfcHV0KGRsYyk7CisKKwl0dHlfdW5yZWdpc3Rlcl9kZXZpY2UocmZjb21tX3R0eV9kcml2ZXIsIGRldi0+aWQpOworCisJLyogUmVmY291bnQgc2hvdWxkIG9ubHkgaGl0IHplcm8gd2hlbiBjYWxsZWQgZnJvbSByZmNvbW1fZGV2X2RlbCgpCisJICAgd2hpY2ggd2lsbCBoYXZlIHRha2VuIHVzIG9mZiB0aGUgbGlzdC4gRXZlcnl0aGluZyBlbHNlIGFyZQorCSAgIHJlZmNvdW50aW5nIGJ1Z3MuICovCisJQlVHX09OKCFsaXN0X2VtcHR5KCZkZXYtPmxpc3QpKTsKKworCWtmcmVlKGRldik7CisKKwkvKiBJdCdzIHNhZmUgdG8gY2FsbCBtb2R1bGVfcHV0KCkgaGVyZSBiZWNhdXNlIHNvY2tldCBzdGlsbCAKKwkgICBob2xkcyByZWZlcmVuY2UgdG8gdGhpcyBtb2R1bGUuICovCisJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZmNvbW1fZGV2X2hvbGQoc3RydWN0IHJmY29tbV9kZXYgKmRldikKK3sKKwlhdG9taWNfaW5jKCZkZXYtPnJlZmNudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZmNvbW1fZGV2X3B1dChzdHJ1Y3QgcmZjb21tX2RldiAqZGV2KQoreworCS8qIFRoZSByZWFzb24gdGhpcyBpc24ndCBhY3R1YWxseSBhIHJhY2UsIGFzIHlvdSBubworCSAgIGRvdWJ0IGhhdmUgYSBsaXR0bGUgdm9pY2Ugc2NyZWFtaW5nIGF0IHlvdSBpbiB5b3VyCisJICAgaGVhZCwgaXMgdGhhdCB0aGUgcmVmY291bnQgc2hvdWxkIG5ldmVyIGFjdHVhbGx5CisJICAgcmVhY2ggemVybyB1bmxlc3MgdGhlIGRldmljZSBoYXMgYWxyZWFkeSBiZWVuIHRha2VuCisJICAgb2ZmIHRoZSBsaXN0LCBpbiByZmNvbW1fZGV2X2RlbCgpLiBBbmQgaWYgdGhhdCdzIG5vdAorCSAgIHRydWUsIHdlJ2xsIGhpdCB0aGUgQlVHKCkgaW4gcmZjb21tX2Rldl9kZXN0cnVjdCgpCisJICAgYW55d2F5LiAqLworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZkZXYtPnJlZmNudCkpCisJCXJmY29tbV9kZXZfZGVzdHJ1Y3QoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCByZmNvbW1fZGV2ICpfX3JmY29tbV9kZXZfZ2V0KGludCBpZCkKK3sKKwlzdHJ1Y3QgcmZjb21tX2RldiAqZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgICpwOworCisJbGlzdF9mb3JfZWFjaChwLCAmcmZjb21tX2Rldl9saXN0KSB7CisJCWRldiA9IGxpc3RfZW50cnkocCwgc3RydWN0IHJmY29tbV9kZXYsIGxpc3QpOworCQlpZiAoZGV2LT5pZCA9PSBpZCkKKwkJCXJldHVybiBkZXY7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJmY29tbV9kZXYgKnJmY29tbV9kZXZfZ2V0KGludCBpZCkKK3sKKwlzdHJ1Y3QgcmZjb21tX2RldiAqZGV2OworCisJcmVhZF9sb2NrKCZyZmNvbW1fZGV2X2xvY2spOworCisJZGV2ID0gX19yZmNvbW1fZGV2X2dldChpZCk7CisJaWYgKGRldikKKwkJcmZjb21tX2Rldl9ob2xkKGRldik7CisKKwlyZWFkX3VubG9jaygmcmZjb21tX2Rldl9sb2NrKTsKKworCXJldHVybiBkZXY7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX2Rldl9hZGQoc3RydWN0IHJmY29tbV9kZXZfcmVxICpyZXEsIHN0cnVjdCByZmNvbW1fZGxjICpkbGMpCit7CisJc3RydWN0IHJmY29tbV9kZXYgKmRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJnJmY29tbV9kZXZfbGlzdCwgKnA7CisJaW50IGVyciA9IDA7CisKKwlCVF9EQkcoImlkICVkIGNoYW5uZWwgJWQiLCByZXEtPmRldl9pZCwgcmVxLT5jaGFubmVsKTsKKwkKKwlkZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmZjb21tX2RldiksIEdGUF9LRVJORUwpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoZGV2LCAwLCBzaXplb2Yoc3RydWN0IHJmY29tbV9kZXYpKTsKKworCXdyaXRlX2xvY2tfYmgoJnJmY29tbV9kZXZfbG9jayk7CisKKwlpZiAocmVxLT5kZXZfaWQgPCAwKSB7CisJCWRldi0+aWQgPSAwOworCisJCWxpc3RfZm9yX2VhY2gocCwgJnJmY29tbV9kZXZfbGlzdCkgeworCQkJaWYgKGxpc3RfZW50cnkocCwgc3RydWN0IHJmY29tbV9kZXYsIGxpc3QpLT5pZCAhPSBkZXYtPmlkKQorCQkJCWJyZWFrOworCisJCQlkZXYtPmlkKys7CisJCQloZWFkID0gcDsKKwkJfQorCX0gZWxzZSB7CisJCWRldi0+aWQgPSByZXEtPmRldl9pZDsKKworCQlsaXN0X2Zvcl9lYWNoKHAsICZyZmNvbW1fZGV2X2xpc3QpIHsKKwkJCXN0cnVjdCByZmNvbW1fZGV2ICplbnRyeSA9IGxpc3RfZW50cnkocCwgc3RydWN0IHJmY29tbV9kZXYsIGxpc3QpOworCisJCQlpZiAoZW50cnktPmlkID09IGRldi0+aWQpIHsKKwkJCQllcnIgPSAtRUFERFJJTlVTRTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJaWYgKGVudHJ5LT5pZCA+IGRldi0+aWQgLSAxKQorCQkJCWJyZWFrOworCisJCQloZWFkID0gcDsKKwkJfQorCX0KKworCWlmICgoZGV2LT5pZCA8IDApIHx8IChkZXYtPmlkID4gUkZDT01NX01BWF9ERVYgLSAxKSkgeworCQllcnIgPSAtRU5GSUxFOworCQlnb3RvIG91dDsKKwl9CisKKwlzcHJpbnRmKGRldi0+bmFtZSwgInJmY29tbSVkIiwgZGV2LT5pZCk7CisKKwlsaXN0X2FkZCgmZGV2LT5saXN0LCBoZWFkKTsKKwlhdG9taWNfc2V0KCZkZXYtPnJlZmNudCwgMSk7CisKKwliYWNweSgmZGV2LT5zcmMsICZyZXEtPnNyYyk7CisJYmFjcHkoJmRldi0+ZHN0LCAmcmVxLT5kc3QpOworCWRldi0+Y2hhbm5lbCA9IHJlcS0+Y2hhbm5lbDsKKworCWRldi0+ZmxhZ3MgPSByZXEtPmZsYWdzICYgCisJCSgoMSA8PCBSRkNPTU1fUkVMRUFTRV9PTkhVUCkgfCAoMSA8PCBSRkNPTU1fUkVVU0VfRExDKSk7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPndhaXQpOworCXRhc2tsZXRfaW5pdCgmZGV2LT53YWtldXBfdGFzaywgcmZjb21tX3R0eV93YWtldXAsICh1bnNpZ25lZCBsb25nKSBkZXYpOworCisJcmZjb21tX2RsY19sb2NrKGRsYyk7CisJZGxjLT5kYXRhX3JlYWR5ICAgPSByZmNvbW1fZGV2X2RhdGFfcmVhZHk7CisJZGxjLT5zdGF0ZV9jaGFuZ2UgPSByZmNvbW1fZGV2X3N0YXRlX2NoYW5nZTsKKwlkbGMtPm1vZGVtX3N0YXR1cyA9IHJmY29tbV9kZXZfbW9kZW1fc3RhdHVzOworCisJZGxjLT5vd25lciA9IGRldjsKKwlkZXYtPmRsYyAgID0gZGxjOworCXJmY29tbV9kbGNfdW5sb2NrKGRsYyk7CisKKwkvKiBJdCdzIHNhZmUgdG8gY2FsbCBfX21vZHVsZV9nZXQoKSBoZXJlIGJlY2F1c2Ugc29ja2V0IGFscmVhZHkgCisJICAgaG9sZHMgcmVmZXJlbmNlIHRvIHRoaXMgbW9kdWxlLiAqLworCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisKK291dDoKKwl3cml0ZV91bmxvY2tfYmgoJnJmY29tbV9kZXZfbG9jayk7CisKKwlpZiAoZXJyKSB7CisJCWtmcmVlKGRldik7CisJCXJldHVybiBlcnI7CisJfQorCisJdHR5X3JlZ2lzdGVyX2RldmljZShyZmNvbW1fdHR5X2RyaXZlciwgZGV2LT5pZCwgTlVMTCk7CisKKwlyZXR1cm4gZGV2LT5pZDsKK30KKworc3RhdGljIHZvaWQgcmZjb21tX2Rldl9kZWwoc3RydWN0IHJmY29tbV9kZXYgKmRldikKK3sKKwlCVF9EQkcoImRldiAlcCIsIGRldik7CisKKwl3cml0ZV9sb2NrX2JoKCZyZmNvbW1fZGV2X2xvY2spOworCWxpc3RfZGVsX2luaXQoJmRldi0+bGlzdCk7CisJd3JpdGVfdW5sb2NrX2JoKCZyZmNvbW1fZGV2X2xvY2spOworCisJcmZjb21tX2Rldl9wdXQoZGV2KTsKK30KKworLyogLS0tLSBTZW5kIGJ1ZmZlciAtLS0tICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCByZmNvbW1fcm9vbShzdHJ1Y3QgcmZjb21tX2RsYyAqZGxjKQoreworCS8qIFdlIGNhbid0IGxldCBpdCBiZSB6ZXJvLCBiZWNhdXNlIHdlIGRvbid0IGdldCBhIGNhbGxiYWNrCisJICAgd2hlbiB0eF9jcmVkaXRzIGJlY29tZXMgbm9uemVybywgaGVuY2Ugd2UnZCBuZXZlciB3YWtlIHVwICovCisJcmV0dXJuIGRsYy0+bXR1ICogKGRsYy0+dHhfY3JlZGl0cz86MSk7Cit9CisKK3N0YXRpYyB2b2lkIHJmY29tbV93ZnJlZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByZmNvbW1fZGV2ICpkZXYgPSAodm9pZCAqKSBza2ItPnNrOworCWF0b21pY19zdWIoc2tiLT50cnVlc2l6ZSwgJmRldi0+d21lbV9hbGxvYyk7CisJaWYgKHRlc3RfYml0KFJGQ09NTV9UVFlfQVRUQUNIRUQsICZkZXYtPmZsYWdzKSkKKwkJdGFza2xldF9zY2hlZHVsZSgmZGV2LT53YWtldXBfdGFzayk7CisJcmZjb21tX2Rldl9wdXQoZGV2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJmY29tbV9zZXRfb3duZXJfdyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgcmZjb21tX2RldiAqZGV2KQoreworCXJmY29tbV9kZXZfaG9sZChkZXYpOworCWF0b21pY19hZGQoc2tiLT50cnVlc2l6ZSwgJmRldi0+d21lbV9hbGxvYyk7CisJc2tiLT5zayA9ICh2b2lkICopIGRldjsKKwlza2ItPmRlc3RydWN0b3IgPSByZmNvbW1fd2ZyZWU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqcmZjb21tX3dtYWxsb2Moc3RydWN0IHJmY29tbV9kZXYgKmRldiwgdW5zaWduZWQgbG9uZyBzaXplLCBpbnQgcHJpb3JpdHkpCit7CisJaWYgKGF0b21pY19yZWFkKCZkZXYtPndtZW1fYWxsb2MpIDwgcmZjb21tX3Jvb20oZGV2LT5kbGMpKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBhbGxvY19za2Ioc2l6ZSwgcHJpb3JpdHkpOworCQlpZiAoc2tiKSB7CisJCQlyZmNvbW1fc2V0X293bmVyX3coc2tiLCBkZXYpOworCQkJcmV0dXJuIHNrYjsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogLS0tLSBEZXZpY2UgSU9DVExzIC0tLS0gKi8KKworI2RlZmluZSBOT0NBUF9GTEFHUyAoKDEgPDwgUkZDT01NX1JFVVNFX0RMQykgfCAoMSA8PCBSRkNPTU1fUkVMRUFTRV9PTkhVUCkpCisKK3N0YXRpYyBpbnQgcmZjb21tX2NyZWF0ZV9kZXYoc3RydWN0IHNvY2sgKnNrLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCByZmNvbW1fZGV2X3JlcSByZXE7CisJc3RydWN0IHJmY29tbV9kbGMgKmRsYzsKKwlpbnQgaWQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlcSwgYXJnLCBzaXplb2YocmVxKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJQlRfREJHKCJzayAlcCBkZXZfaWQgJWlkIGZsYWdzIDB4JXgiLCBzaywgcmVxLmRldl9pZCwgcmVxLmZsYWdzKTsKKworCWlmIChyZXEuZmxhZ3MgIT0gTk9DQVBfRkxBR1MgJiYgIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAocmVxLmZsYWdzICYgKDEgPDwgUkZDT01NX1JFVVNFX0RMQykpIHsKKwkJLyogU29ja2V0IG11c3QgYmUgY29ubmVjdGVkICovCisJCWlmIChzay0+c2tfc3RhdGUgIT0gQlRfQ09OTkVDVEVEKQorCQkJcmV0dXJuIC1FQkFERkQ7CisKKwkJZGxjID0gcmZjb21tX3BpKHNrKS0+ZGxjOworCQlyZmNvbW1fZGxjX2hvbGQoZGxjKTsKKwl9IGVsc2UgeworCQlkbGMgPSByZmNvbW1fZGxjX2FsbG9jKEdGUF9LRVJORUwpOworCQlpZiAoIWRsYykKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlkID0gcmZjb21tX2Rldl9hZGQoJnJlcSwgZGxjKTsKKwlpZiAoaWQgPCAwKSB7CisJCXJmY29tbV9kbGNfcHV0KGRsYyk7CisJCXJldHVybiBpZDsKKwl9CisKKwlpZiAocmVxLmZsYWdzICYgKDEgPDwgUkZDT01NX1JFVVNFX0RMQykpIHsKKwkJLyogRExDIGlzIG5vdyB1c2VkIGJ5IGRldmljZS4KKwkJICogU29ja2V0IG11c3QgYmUgZGlzY29ubmVjdGVkICovCisJCXNrLT5za19zdGF0ZSA9IEJUX0NMT1NFRDsKKwl9CisKKwlyZXR1cm4gaWQ7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3JlbGVhc2VfZGV2KHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IHJmY29tbV9kZXZfcmVxIHJlcTsKKwlzdHJ1Y3QgcmZjb21tX2RldiAqZGV2OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXEsIGFyZywgc2l6ZW9mKHJlcSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCUJUX0RCRygiZGV2X2lkICVpZCBmbGFncyAweCV4IiwgcmVxLmRldl9pZCwgcmVxLmZsYWdzKTsKKworCWlmICghKGRldiA9IHJmY29tbV9kZXZfZ2V0KHJlcS5kZXZfaWQpKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoZGV2LT5mbGFncyAhPSBOT0NBUF9GTEFHUyAmJiAhY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQlyZmNvbW1fZGV2X3B1dChkZXYpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCWlmIChyZXEuZmxhZ3MgJiAoMSA8PCBSRkNPTU1fSEFOR1VQX05PVykpCisJCXJmY29tbV9kbGNfY2xvc2UoZGV2LT5kbGMsIDApOworCisJcmZjb21tX2Rldl9kZWwoZGV2KTsKKwlyZmNvbW1fZGV2X3B1dChkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJmY29tbV9nZXRfZGV2X2xpc3Qodm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgcmZjb21tX2Rldl9saXN0X3JlcSAqZGw7CisJc3RydWN0IHJmY29tbV9kZXZfaW5mbyAqZGk7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlpbnQgbiA9IDAsIHNpemUsIGVycjsKKwl1MTYgZGV2X251bTsKKworCUJUX0RCRygiIik7CisKKwlpZiAoZ2V0X3VzZXIoZGV2X251bSwgKHUxNiBfX3VzZXIgKikgYXJnKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoIWRldl9udW0gfHwgZGV2X251bSA+IChQQUdFX1NJWkUgKiA0KSAvIHNpemVvZigqZGkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNpemUgPSBzaXplb2YoKmRsKSArIGRldl9udW0gKiBzaXplb2YoKmRpKTsKKworCWlmICghKGRsID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKSkpCisJCXJldHVybiAtRU5PTUVNOworCisJZGkgPSBkbC0+ZGV2X2luZm87CisKKwlyZWFkX2xvY2tfYmgoJnJmY29tbV9kZXZfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoKHAsICZyZmNvbW1fZGV2X2xpc3QpIHsKKwkJc3RydWN0IHJmY29tbV9kZXYgKmRldiA9IGxpc3RfZW50cnkocCwgc3RydWN0IHJmY29tbV9kZXYsIGxpc3QpOworCQkoZGkgKyBuKS0+aWQgICAgICA9IGRldi0+aWQ7CisJCShkaSArIG4pLT5mbGFncyAgID0gZGV2LT5mbGFnczsKKwkJKGRpICsgbiktPnN0YXRlICAgPSBkZXYtPmRsYy0+c3RhdGU7CisJCShkaSArIG4pLT5jaGFubmVsID0gZGV2LT5jaGFubmVsOworCQliYWNweSgmKGRpICsgbiktPnNyYywgJmRldi0+c3JjKTsKKwkJYmFjcHkoJihkaSArIG4pLT5kc3QsICZkZXYtPmRzdCk7CisJCWlmICgrK24gPj0gZGV2X251bSkKKwkJCWJyZWFrOworCX0KKworCXJlYWRfdW5sb2NrX2JoKCZyZmNvbW1fZGV2X2xvY2spOworCisJZGwtPmRldl9udW0gPSBuOworCXNpemUgPSBzaXplb2YoKmRsKSArIG4gKiBzaXplb2YoKmRpKTsKKworCWVyciA9IGNvcHlfdG9fdXNlcihhcmcsIGRsLCBzaXplKTsKKwlrZnJlZShkbCk7CisKKwlyZXR1cm4gZXJyID8gLUVGQVVMVCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX2dldF9kZXZfaW5mbyh2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCByZmNvbW1fZGV2ICpkZXY7CisJc3RydWN0IHJmY29tbV9kZXZfaW5mbyBkaTsKKwlpbnQgZXJyID0gMDsKKworCUJUX0RCRygiIik7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmRpLCBhcmcsIHNpemVvZihkaSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICghKGRldiA9IHJmY29tbV9kZXZfZ2V0KGRpLmlkKSkpCisJCXJldHVybiAtRU5PREVWOworCisJZGkuZmxhZ3MgICA9IGRldi0+ZmxhZ3M7CisJZGkuY2hhbm5lbCA9IGRldi0+Y2hhbm5lbDsKKwlkaS5zdGF0ZSAgID0gZGV2LT5kbGMtPnN0YXRlOworCWJhY3B5KCZkaS5zcmMsICZkZXYtPnNyYyk7CisJYmFjcHkoJmRpLmRzdCwgJmRldi0+ZHN0KTsKKworCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmZGksIHNpemVvZihkaSkpKQorCQllcnIgPSAtRUZBVUxUOworCisJcmZjb21tX2Rldl9wdXQoZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgcmZjb21tX2Rldl9pb2N0bChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJQlRfREJHKCJjbWQgJWQgYXJnICVwIiwgY21kLCBhcmcpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFJGQ09NTUNSRUFURURFVjoKKwkJcmV0dXJuIHJmY29tbV9jcmVhdGVfZGV2KHNrLCBhcmcpOworCisJY2FzZSBSRkNPTU1SRUxFQVNFREVWOgorCQlyZXR1cm4gcmZjb21tX3JlbGVhc2VfZGV2KGFyZyk7CisKKwljYXNlIFJGQ09NTUdFVERFVkxJU1Q6CisJCXJldHVybiByZmNvbW1fZ2V0X2Rldl9saXN0KGFyZyk7CisKKwljYXNlIFJGQ09NTUdFVERFVklORk86CisJCXJldHVybiByZmNvbW1fZ2V0X2Rldl9pbmZvKGFyZyk7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qIC0tLS0gRExDIGNhbGxiYWNrcyAtLS0tICovCitzdGF0aWMgdm9pZCByZmNvbW1fZGV2X2RhdGFfcmVhZHkoc3RydWN0IHJmY29tbV9kbGMgKmRsYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcmZjb21tX2RldiAqZGV2ID0gZGxjLT5vd25lcjsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworICAgICAgIAorCWlmICghZGV2IHx8ICEodHR5ID0gZGV2LT50dHkpKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm47CisJfQorCisJQlRfREJHKCJkbGMgJXAgdHR5ICVwIGxlbiAlZCIsIGRsYywgdHR5LCBza2ItPmxlbik7CisKKwlpZiAodGVzdF9iaXQoVFRZX0RPTlRfRkxJUCwgJnR0eS0+ZmxhZ3MpKSB7CisJCXJlZ2lzdGVyIGludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgc2tiLT5sZW47IGkrKykgeworCQkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKQorCQkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CisKKwkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgc2tiLT5kYXRhW2ldLCAwKTsKKwkJfQorCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOworCX0gZWxzZQorCQl0dHktPmxkaXNjLnJlY2VpdmVfYnVmKHR0eSwgc2tiLT5kYXRhLCBOVUxMLCBza2ItPmxlbik7CisKKwlrZnJlZV9za2Ioc2tiKTsKK30KKworc3RhdGljIHZvaWQgcmZjb21tX2Rldl9zdGF0ZV9jaGFuZ2Uoc3RydWN0IHJmY29tbV9kbGMgKmRsYywgaW50IGVycikKK3sKKwlzdHJ1Y3QgcmZjb21tX2RldiAqZGV2ID0gZGxjLT5vd25lcjsKKwlpZiAoIWRldikKKwkJcmV0dXJuOworCQorCUJUX0RCRygiZGxjICVwIGRldiAlcCBlcnIgJWQiLCBkbGMsIGRldiwgZXJyKTsKKworCWRldi0+ZXJyID0gZXJyOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT53YWl0KTsKKworCWlmIChkbGMtPnN0YXRlID09IEJUX0NMT1NFRCkgeworCQlpZiAoIWRldi0+dHR5KSB7CisJCQlpZiAodGVzdF9iaXQoUkZDT01NX1JFTEVBU0VfT05IVVAsICZkZXYtPmZsYWdzKSkgeworCQkJCXJmY29tbV9kZXZfaG9sZChkZXYpOworCQkJCXJmY29tbV9kZXZfZGVsKGRldik7CisKKwkJCQkvKiBXZSBoYXZlIHRvIGRyb3AgRExDIGxvY2sgaGVyZSwgb3RoZXJ3aXNlCisJCQkJICAgcmZjb21tX2Rldl9wdXQoKSB3aWxsIGRlYWQgbG9jayBpZiBpdCdzCisJCQkJICAgdGhlIGxhc3QgcmVmZXJlbmNlLiAqLworCQkJCXJmY29tbV9kbGNfdW5sb2NrKGRsYyk7CisJCQkJcmZjb21tX2Rldl9wdXQoZGV2KTsKKwkJCQlyZmNvbW1fZGxjX2xvY2soZGxjKTsKKwkJCX0KKwkJfSBlbHNlIAorCQkJdHR5X2hhbmd1cChkZXYtPnR0eSk7CisJfQorfQorCitzdGF0aWMgdm9pZCByZmNvbW1fZGV2X21vZGVtX3N0YXR1cyhzdHJ1Y3QgcmZjb21tX2RsYyAqZGxjLCB1OCB2MjRfc2lnKQoreworCXN0cnVjdCByZmNvbW1fZGV2ICpkZXYgPSBkbGMtPm93bmVyOworCWlmICghZGV2KQorCQlyZXR1cm47CisJCisJQlRfREJHKCJkbGMgJXAgZGV2ICVwIHYyNF9zaWcgMHglMDJ4IiwgZGxjLCBkZXYsIHYyNF9zaWcpOworCisJZGV2LT5tb2RlbV9zdGF0dXMgPSAKKwkJKCh2MjRfc2lnICYgUkZDT01NX1YyNF9SVEMpID8gKFRJT0NNX0RTUiB8IFRJT0NNX0RUUikgOiAwKSB8CisJCSgodjI0X3NpZyAmIFJGQ09NTV9WMjRfUlRSKSA/IChUSU9DTV9SVFMgfCBUSU9DTV9DVFMpIDogMCkgfAorCQkoKHYyNF9zaWcgJiBSRkNPTU1fVjI0X0lDKSAgPyBUSU9DTV9SSSA6IDApIHwKKwkJKCh2MjRfc2lnICYgUkZDT01NX1YyNF9EVikgID8gVElPQ01fQ0QgOiAwKTsKK30KKworLyogLS0tLSBUVFkgZnVuY3Rpb25zIC0tLS0gKi8KK3N0YXRpYyB2b2lkIHJmY29tbV90dHlfd2FrZXVwKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCByZmNvbW1fZGV2ICpkZXYgPSAodm9pZCAqKSBhcmc7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGRldi0+dHR5OworCWlmICghdHR5KQorCQlyZXR1cm47CisKKwlCVF9EQkcoImRldiAlcCB0dHkgJXAiLCBkZXYsIHR0eSk7CisKKwlpZiAodGVzdF9iaXQoVFRZX0RPX1dSSVRFX1dBS0VVUCwgJnR0eS0+ZmxhZ3MpICYmIHR0eS0+bGRpc2Mud3JpdGVfd2FrZXVwKQorICAgICAgICAgICAgICAgICh0dHktPmxkaXNjLndyaXRlX3dha2V1cCkodHR5KTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKKyNpZmRlZiBTRVJJQUxfSEFWRV9QT0xMX1dBSVQKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+cG9sbF93YWl0KTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IHJmY29tbV90dHlfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzdHJ1Y3QgcmZjb21tX2RldiAqZGV2OworCXN0cnVjdCByZmNvbW1fZGxjICpkbGM7CisJaW50IGVyciwgaWQ7CisKKyAgICAgICAgaWQgPSB0dHktPmluZGV4OworCisJQlRfREJHKCJ0dHkgJXAgaWQgJWQiLCB0dHksIGlkKTsKKworCS8qIFdlIGRvbid0IGxlYWsgdGhpcyByZWZjb3VudC4gRm9yIHJlYXNvbnMgd2hpY2ggYXJlIG5vdCBlbnRpcmVseQorCSAgIGNsZWFyLCB0aGUgVFRZIGxheWVyIHdpbGwgY2FsbCBvdXIgLT5jbG9zZSgpIG1ldGhvZCBldmVuIGlmIHRoZQorCSAgIG9wZW4gZmFpbHMuIFdlIGRlY3JlYXNlIHRoZSByZWZjb3VudCB0aGVyZSwgYW5kIGRlY3JlYXNpbmcgaXQKKwkgICBoZXJlIHRvbyB3b3VsZCBjYXVzZSBicmVha2FnZS4gKi8KKwlkZXYgPSByZmNvbW1fZGV2X2dldChpZCk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJQlRfREJHKCJkZXYgJXAgZHN0ICVzIGNoYW5uZWwgJWQgb3BlbmVkICVkIiwgZGV2LCBiYXRvc3RyKCZkZXYtPmRzdCksIGRldi0+Y2hhbm5lbCwgZGV2LT5vcGVuZWQpOworCisJaWYgKGRldi0+b3BlbmVkKysgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwlkbGMgPSBkZXYtPmRsYzsKKworCS8qIEF0dGFjaCBUVFkgYW5kIG9wZW4gRExDICovCisKKwlyZmNvbW1fZGxjX2xvY2soZGxjKTsKKwl0dHktPmRyaXZlcl9kYXRhID0gZGV2OworCWRldi0+dHR5ID0gdHR5OworCXJmY29tbV9kbGNfdW5sb2NrKGRsYyk7CisJc2V0X2JpdChSRkNPTU1fVFRZX0FUVEFDSEVELCAmZGV2LT5mbGFncyk7CisKKwllcnIgPSByZmNvbW1fZGxjX29wZW4oZGxjLCAmZGV2LT5zcmMsICZkZXYtPmRzdCwgZGV2LT5jaGFubmVsKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCS8qIFdhaXQgZm9yIERMQyB0byBjb25uZWN0ICovCisJYWRkX3dhaXRfcXVldWUoJmRldi0+d2FpdCwgJndhaXQpOworCXdoaWxlICgxKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJaWYgKGRsYy0+c3RhdGUgPT0gQlRfQ0xPU0VEKSB7CisJCQllcnIgPSAtZGV2LT5lcnI7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChkbGMtPnN0YXRlID09IEJUX0NPTk5FQ1RFRCkKKwkJCWJyZWFrOworCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJZXJyID0gLUVJTlRSOworCQkJYnJlYWs7CisJCX0KKworCQlzY2hlZHVsZSgpOworCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZkZXYtPndhaXQsICZ3YWl0KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHJmY29tbV90dHlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IHJmY29tbV9kZXYgKmRldiA9IChzdHJ1Y3QgcmZjb21tX2RldiAqKSB0dHktPmRyaXZlcl9kYXRhOworCWlmICghZGV2KQorCQlyZXR1cm47CisKKwlCVF9EQkcoInR0eSAlcCBkZXYgJXAgZGxjICVwIG9wZW5lZCAlZCIsIHR0eSwgZGV2LCBkZXYtPmRsYywgZGV2LT5vcGVuZWQpOworCisJaWYgKC0tZGV2LT5vcGVuZWQgPT0gMCkgeworCQkvKiBDbG9zZSBETEMgYW5kIGRldHRhY2ggVFRZICovCisJCXJmY29tbV9kbGNfY2xvc2UoZGV2LT5kbGMsIDApOworCisJCWNsZWFyX2JpdChSRkNPTU1fVFRZX0FUVEFDSEVELCAmZGV2LT5mbGFncyk7CisJCXRhc2tsZXRfa2lsbCgmZGV2LT53YWtldXBfdGFzayk7CisKKwkJcmZjb21tX2RsY19sb2NrKGRldi0+ZGxjKTsKKwkJdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7CisJCWRldi0+dHR5ID0gTlVMTDsKKwkJcmZjb21tX2RsY191bmxvY2soZGV2LT5kbGMpOworCX0KKworCXJmY29tbV9kZXZfcHV0KGRldik7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3R0eV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgcmZjb21tX2RldiAqZGV2ID0gKHN0cnVjdCByZmNvbW1fZGV2ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHJmY29tbV9kbGMgKmRsYyA9IGRldi0+ZGxjOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGVyciA9IDAsIHNlbnQgPSAwLCBzaXplOworCisJQlRfREJHKCJ0dHkgJXAgY291bnQgJWQiLCB0dHksIGNvdW50KTsKKworCXdoaWxlIChjb3VudCkgeworCQlzaXplID0gbWluX3QodWludCwgY291bnQsIGRsYy0+bXR1KTsKKworCQlza2IgPSByZmNvbW1fd21hbGxvYyhkZXYsIHNpemUgKyBSRkNPTU1fU0tCX1JFU0VSVkUsIEdGUF9BVE9NSUMpOworCQkKKwkJaWYgKCFza2IpCisJCQlicmVhazsKKworCQlza2JfcmVzZXJ2ZShza2IsIFJGQ09NTV9TS0JfSEVBRF9SRVNFUlZFKTsKKworCQltZW1jcHkoc2tiX3B1dChza2IsIHNpemUpLCBidWYgKyBzZW50LCBzaXplKTsKKworCQlpZiAoKGVyciA9IHJmY29tbV9kbGNfc2VuZChkbGMsIHNrYikpIDwgMCkgeworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlicmVhazsKKwkJfQorCisJCXNlbnQgICs9IHNpemU7CisJCWNvdW50IC09IHNpemU7CisJfQorCisJcmV0dXJuIHNlbnQgPyBzZW50IDogZXJyOworfQorCitzdGF0aWMgaW50IHJmY29tbV90dHlfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCByZmNvbW1fZGV2ICpkZXYgPSAoc3RydWN0IHJmY29tbV9kZXYgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgcm9vbTsKKworCUJUX0RCRygidHR5ICVwIiwgdHR5KTsKKworCXJvb20gPSByZmNvbW1fcm9vbShkZXYtPmRsYykgLSBhdG9taWNfcmVhZCgmZGV2LT53bWVtX2FsbG9jKTsKKwlpZiAocm9vbSA8IDApCisJCXJvb20gPSAwOworCXJldHVybiByb29tOworfQorCitzdGF0aWMgaW50IHJmY29tbV90dHlfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCUJUX0RCRygidHR5ICVwIGNtZCAweCUwMngiLCB0dHksIGNtZCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVENHRVRTOgorCQlCVF9EQkcoIlRDR0VUUyBpcyBub3Qgc3VwcG9ydGVkIik7CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisKKwljYXNlIFRDU0VUUzoKKwkJQlRfREJHKCJUQ1NFVFMgaXMgbm90IHN1cHBvcnRlZCIpOworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJY2FzZSBUSU9DTUlXQUlUOgorCQlCVF9EQkcoIlRJT0NNSVdBSVQiKTsKKwkJYnJlYWs7CisKKwljYXNlIFRJT0NHSUNPVU5UOgorCQlCVF9EQkcoIlRJT0NHSUNPVU5UIik7CisJCWJyZWFrOworCisJY2FzZSBUSU9DR1NFUklBTDoKKwkJQlRfRVJSKCJUSU9DR1NFUklBTCBpcyBub3Qgc3VwcG9ydGVkIik7CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisKKwljYXNlIFRJT0NTU0VSSUFMOgorCQlCVF9FUlIoIlRJT0NTU0VSSUFMIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKworCWNhc2UgVElPQ1NFUkdTVFJVQ1Q6CisJCUJUX0VSUigiVElPQ1NFUkdTVFJVQ1QgaXMgbm90IHN1cHBvcnRlZCIpOworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJY2FzZSBUSU9DU0VSR0VUTFNSOgorCQlCVF9FUlIoIlRJT0NTRVJHRVRMU1IgaXMgbm90IHN1cHBvcnRlZCIpOworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJY2FzZSBUSU9DU0VSQ09ORklHOgorCQlCVF9FUlIoIlRJT0NTRVJDT05GSUcgaXMgbm90IHN1cHBvcnRlZCIpOworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsJLyogaW9jdGxzIHdoaWNoIHdlIG11c3QgaWdub3JlICovCisKKwl9CisKKwlyZXR1cm4gLUVOT0lPQ1RMQ01EOworfQorCisjZGVmaW5lIFJFTEVWQU5UX0lGTEFHKGlmbGFnKSAoaWZsYWcgJiAoSUdOQlJLfEJSS0lOVHxJR05QQVJ8UEFSTVJLfElOUENLKSkKKworc3RhdGljIHZvaWQgcmZjb21tX3R0eV9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqb2xkKQoreworCUJUX0RCRygidHR5ICVwIiwgdHR5KTsKKworCWlmICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnID09IG9sZC0+Y19jZmxhZykgJiYKKwkJKFJFTEVWQU5UX0lGTEFHKHR0eS0+dGVybWlvcy0+Y19pZmxhZykgPT0gUkVMRVZBTlRfSUZMQUcob2xkLT5jX2lmbGFnKSkpCisJCXJldHVybjsKKworCS8qIGhhbmRsZSB0dXJuaW5nIG9mZiBDUlRTQ1RTICovCisJaWYgKChvbGQtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJiAhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpKSB7CisJCUJUX0RCRygidHVybmluZyBvZmYgQ1JUU0NUUyIpOworCX0KK30KKworc3RhdGljIHZvaWQgcmZjb21tX3R0eV90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCByZmNvbW1fZGV2ICpkZXYgPSAoc3RydWN0IHJmY29tbV9kZXYgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCUJUX0RCRygidHR5ICVwIGRldiAlcCIsIHR0eSwgZGV2KTsKKwkKKwlyZmNvbW1fZGxjX3Rocm90dGxlKGRldi0+ZGxjKTsKK30KKworc3RhdGljIHZvaWQgcmZjb21tX3R0eV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHJmY29tbV9kZXYgKmRldiA9IChzdHJ1Y3QgcmZjb21tX2RldiAqKSB0dHktPmRyaXZlcl9kYXRhOworCisJQlRfREJHKCJ0dHkgJXAgZGV2ICVwIiwgdHR5LCBkZXYpOworCQorCXJmY29tbV9kbGNfdW50aHJvdHRsZShkZXYtPmRsYyk7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3R0eV9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgcmZjb21tX2RldiAqZGV2ID0gKHN0cnVjdCByZmNvbW1fZGV2ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHJmY29tbV9kbGMgKmRsYyA9IGRldi0+ZGxjOworCisJQlRfREJHKCJ0dHkgJXAgZGV2ICVwIiwgdHR5LCBkZXYpOworCisJaWYgKHNrYl9xdWV1ZV9sZW4oJmRsYy0+dHhfcXVldWUpKQorCQlyZXR1cm4gZGxjLT5tdHU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmZjb21tX3R0eV9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgcmZjb21tX2RldiAqZGV2ID0gKHN0cnVjdCByZmNvbW1fZGV2ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCFkZXYpCisJCXJldHVybjsKKworCUJUX0RCRygidHR5ICVwIGRldiAlcCIsIHR0eSwgZGV2KTsKKworCXNrYl9xdWV1ZV9wdXJnZSgmZGV2LT5kbGMtPnR4X3F1ZXVlKTsKKworCWlmICh0ZXN0X2JpdChUVFlfRE9fV1JJVEVfV0FLRVVQLCAmdHR5LT5mbGFncykgJiYgdHR5LT5sZGlzYy53cml0ZV93YWtldXApCisJCXR0eS0+bGRpc2Mud3JpdGVfd2FrZXVwKHR0eSk7Cit9CisKK3N0YXRpYyB2b2lkIHJmY29tbV90dHlfc2VuZF94Y2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjaGFyIGNoKQoreworCUJUX0RCRygidHR5ICVwIGNoICVjIiwgdHR5LCBjaCk7Cit9CisKK3N0YXRpYyB2b2lkIHJmY29tbV90dHlfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQoreworCUJUX0RCRygidHR5ICVwIHRpbWVvdXQgJWQiLCB0dHksIHRpbWVvdXQpOworfQorCitzdGF0aWMgdm9pZCByZmNvbW1fdHR5X2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCByZmNvbW1fZGV2ICpkZXYgPSAoc3RydWN0IHJmY29tbV9kZXYgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIWRldikKKwkJcmV0dXJuOworCisJQlRfREJHKCJ0dHkgJXAgZGV2ICVwIiwgdHR5LCBkZXYpOworCisJcmZjb21tX3R0eV9mbHVzaF9idWZmZXIodHR5KTsKKworCWlmICh0ZXN0X2JpdChSRkNPTU1fUkVMRUFTRV9PTkhVUCwgJmRldi0+ZmxhZ3MpKQorCQlyZmNvbW1fZGV2X2RlbChkZXYpOworfQorCitzdGF0aWMgaW50IHJmY29tbV90dHlfcmVhZF9wcm9jKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW4sIGludCAqZW9mLCB2b2lkICp1bnVzZWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3R0eV90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKyAJc3RydWN0IHJmY29tbV9kZXYgKmRldiA9IChzdHJ1Y3QgcmZjb21tX2RldiAqKSB0dHktPmRyaXZlcl9kYXRhOworCisJQlRfREJHKCJ0dHkgJXAgZGV2ICVwIiwgdHR5LCBkZXYpOworCisgCXJldHVybiBkZXYtPm1vZGVtX3N0YXR1czsKK30KKworc3RhdGljIGludCByZmNvbW1fdHR5X3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCit7CisgCXN0cnVjdCByZmNvbW1fZGV2ICpkZXYgPSAoc3RydWN0IHJmY29tbV9kZXYgKikgdHR5LT5kcml2ZXJfZGF0YTsKKyAJc3RydWN0IHJmY29tbV9kbGMgKmRsYyA9IGRldi0+ZGxjOworIAl1OCB2MjRfc2lnOworCisJQlRfREJHKCJ0dHkgJXAgZGV2ICVwIHNldCAweCUwMnggY2xlYXIgMHglMDJ4IiwgdHR5LCBkZXYsIHNldCwgY2xlYXIpOworCisgCXJmY29tbV9kbGNfZ2V0X21vZGVtX3N0YXR1cyhkbGMsICZ2MjRfc2lnKTsKKworIAlpZiAoc2V0ICYgVElPQ01fRFNSIHx8IHNldCAmIFRJT0NNX0RUUikKKyAJCXYyNF9zaWcgfD0gUkZDT01NX1YyNF9SVEM7CisgCWlmIChzZXQgJiBUSU9DTV9SVFMgfHwgc2V0ICYgVElPQ01fQ1RTKQorIAkJdjI0X3NpZyB8PSBSRkNPTU1fVjI0X1JUUjsKKyAJaWYgKHNldCAmIFRJT0NNX1JJKQorIAkJdjI0X3NpZyB8PSBSRkNPTU1fVjI0X0lDOworIAlpZiAoc2V0ICYgVElPQ01fQ0QpCisgCQl2MjRfc2lnIHw9IFJGQ09NTV9WMjRfRFY7CisKKyAJaWYgKGNsZWFyICYgVElPQ01fRFNSIHx8IGNsZWFyICYgVElPQ01fRFRSKQorIAkJdjI0X3NpZyAmPSB+UkZDT01NX1YyNF9SVEM7CisgCWlmIChjbGVhciAmIFRJT0NNX1JUUyB8fCBjbGVhciAmIFRJT0NNX0NUUykKKyAJCXYyNF9zaWcgJj0gflJGQ09NTV9WMjRfUlRSOworIAlpZiAoY2xlYXIgJiBUSU9DTV9SSSkKKyAJCXYyNF9zaWcgJj0gflJGQ09NTV9WMjRfSUM7CisgCWlmIChjbGVhciAmIFRJT0NNX0NEKQorIAkJdjI0X3NpZyAmPSB+UkZDT01NX1YyNF9EVjsKKworIAlyZmNvbW1fZGxjX3NldF9tb2RlbV9zdGF0dXMoZGxjLCB2MjRfc2lnKTsKKworIAlyZXR1cm4gMDsKK30KKworLyogLS0tLSBUVFkgc3RydWN0dXJlIC0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyByZmNvbW1fb3BzID0geworCS5vcGVuCQkJPSByZmNvbW1fdHR5X29wZW4sCisJLmNsb3NlCQkJPSByZmNvbW1fdHR5X2Nsb3NlLAorCS53cml0ZQkJCT0gcmZjb21tX3R0eV93cml0ZSwKKwkud3JpdGVfcm9vbQkJPSByZmNvbW1fdHR5X3dyaXRlX3Jvb20sCisJLmNoYXJzX2luX2J1ZmZlcgk9IHJmY29tbV90dHlfY2hhcnNfaW5fYnVmZmVyLAorCS5mbHVzaF9idWZmZXIJCT0gcmZjb21tX3R0eV9mbHVzaF9idWZmZXIsCisJLmlvY3RsCQkJPSByZmNvbW1fdHR5X2lvY3RsLAorCS50aHJvdHRsZQkJPSByZmNvbW1fdHR5X3Rocm90dGxlLAorCS51bnRocm90dGxlCQk9IHJmY29tbV90dHlfdW50aHJvdHRsZSwKKwkuc2V0X3Rlcm1pb3MJCT0gcmZjb21tX3R0eV9zZXRfdGVybWlvcywKKwkuc2VuZF94Y2hhcgkJPSByZmNvbW1fdHR5X3NlbmRfeGNoYXIsCisJLmhhbmd1cAkJCT0gcmZjb21tX3R0eV9oYW5ndXAsCisJLndhaXRfdW50aWxfc2VudAk9IHJmY29tbV90dHlfd2FpdF91bnRpbF9zZW50LAorCS5yZWFkX3Byb2MJCT0gcmZjb21tX3R0eV9yZWFkX3Byb2MsCisJLnRpb2NtZ2V0CQk9IHJmY29tbV90dHlfdGlvY21nZXQsCisJLnRpb2Ntc2V0CQk9IHJmY29tbV90dHlfdGlvY21zZXQsCit9OworCitpbnQgcmZjb21tX2luaXRfdHR5cyh2b2lkKQoreworCXJmY29tbV90dHlfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihSRkNPTU1fVFRZX1BPUlRTKTsKKwlpZiAoIXJmY29tbV90dHlfZHJpdmVyKQorCQlyZXR1cm4gLTE7CisKKwlyZmNvbW1fdHR5X2RyaXZlci0+b3duZXIJPSBUSElTX01PRFVMRTsKKwlyZmNvbW1fdHR5X2RyaXZlci0+ZHJpdmVyX25hbWUJPSAicmZjb21tIjsKKwlyZmNvbW1fdHR5X2RyaXZlci0+ZGV2ZnNfbmFtZQk9ICJibHVldG9vdGgvcmZjb21tLyI7CisJcmZjb21tX3R0eV9kcml2ZXItPm5hbWUJCT0gInJmY29tbSI7CisJcmZjb21tX3R0eV9kcml2ZXItPm1ham9yCT0gUkZDT01NX1RUWV9NQUpPUjsKKwlyZmNvbW1fdHR5X2RyaXZlci0+bWlub3Jfc3RhcnQJPSBSRkNPTU1fVFRZX01JTk9SOworCXJmY29tbV90dHlfZHJpdmVyLT50eXBlCQk9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CisJcmZjb21tX3R0eV9kcml2ZXItPnN1YnR5cGUJPSBTRVJJQUxfVFlQRV9OT1JNQUw7CisJcmZjb21tX3R0eV9kcml2ZXItPmZsYWdzCT0gVFRZX0RSSVZFUl9SRUFMX1JBVyB8IFRUWV9EUklWRVJfTk9fREVWRlM7CisJcmZjb21tX3R0eV9kcml2ZXItPmluaXRfdGVybWlvcwk9IHR0eV9zdGRfdGVybWlvczsKKwlyZmNvbW1fdHR5X2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcJPSBCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7CisJdHR5X3NldF9vcGVyYXRpb25zKHJmY29tbV90dHlfZHJpdmVyLCAmcmZjb21tX29wcyk7CisKKwlpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcihyZmNvbW1fdHR5X2RyaXZlcikpIHsKKwkJQlRfRVJSKCJDYW4ndCByZWdpc3RlciBSRkNPTU0gVFRZIGRyaXZlciIpOworCQlwdXRfdHR5X2RyaXZlcihyZmNvbW1fdHR5X2RyaXZlcik7CisJCXJldHVybiAtMTsKKwl9CisKKwlCVF9JTkZPKCJSRkNPTU0gVFRZIGxheWVyIGluaXRpYWxpemVkIik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCByZmNvbW1fY2xlYW51cF90dHlzKHZvaWQpCit7CisJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHJmY29tbV90dHlfZHJpdmVyKTsKKwlwdXRfdHR5X2RyaXZlcihyZmNvbW1fdHR5X2RyaXZlcik7Cit9CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL3Njby5jIGIvbmV0L2JsdWV0b290aC9zY28uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTc1MGVmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JsdWV0b290aC9zY28uYwpAQCAtMCwwICsxLDEwNzEgQEAKKy8qIAorICAgQmx1ZVogLSBCbHVldG9vdGggcHJvdG9jb2wgc3RhY2sgZm9yIExpbnV4CisgICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSBRdWFsY29tbSBJbmNvcnBvcmF0ZWQKKworICAgV3JpdHRlbiAyMDAwLDIwMDEgYnkgTWF4aW0gS3Jhc255YW5za3kgPG1heGtAcXVhbGNvbW0uY29tPgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICAgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIFRISVJEIFBBUlRZIFJJR0hUUy4KKyAgIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIEFORCBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkKKyAgIENMQUlNLCBPUiBBTlkgU1BFQ0lBTCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIE9SIEFOWSBEQU1BR0VTIAorICAgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIAorICAgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgCisgICBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisgICBBTEwgTElBQklMSVRZLCBJTkNMVURJTkcgTElBQklMSVRZIEZPUiBJTkZSSU5HRU1FTlQgT0YgQU5ZIFBBVEVOVFMsIAorICAgQ09QWVJJR0hUUywgVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMsIFJFTEFUSU5HIFRPIFVTRSBPRiBUSElTIAorICAgU09GVFdBUkUgSVMgRElTQ0xBSU1FRC4KKyovCisKKy8qIEJsdWV0b290aCBTQ08gc29ja2V0cy4gKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL3Njby5oPgorCisjaWZuZGVmIENPTkZJR19CVF9TQ09fREVCVUcKKyN1bmRlZiAgQlRfREJHCisjZGVmaW5lIEJUX0RCRyhELi4uKQorI2VuZGlmCisKKyNkZWZpbmUgVkVSU0lPTiAiMC40IgorCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBzY29fc29ja19vcHM7CisKK3N0YXRpYyBzdHJ1Y3QgYnRfc29ja19saXN0IHNjb19za19saXN0ID0geworCS5sb2NrID0gUldfTE9DS19VTkxPQ0tFRAorfTsKKworc3RhdGljIHZvaWQgX19zY29fY2hhbl9hZGQoc3RydWN0IHNjb19jb25uICpjb25uLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrICpwYXJlbnQpOworc3RhdGljIHZvaWQgc2NvX2NoYW5fZGVsKHN0cnVjdCBzb2NrICpzaywgaW50IGVycik7CisKK3N0YXRpYyBpbnQgIHNjb19jb25uX2RlbChzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIGludCBlcnIpOworCitzdGF0aWMgdm9pZCBzY29fc29ja19jbG9zZShzdHJ1Y3Qgc29jayAqc2spOworc3RhdGljIHZvaWQgc2NvX3NvY2tfa2lsbChzdHJ1Y3Qgc29jayAqc2spOworCisvKiAtLS0tIFNDTyB0aW1lcnMgLS0tLSAqLworc3RhdGljIHZvaWQgc2NvX3NvY2tfdGltZW91dCh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSAoc3RydWN0IHNvY2sgKikgYXJnOworCisJQlRfREJHKCJzb2NrICVwIHN0YXRlICVkIiwgc2ssIHNrLT5za19zdGF0ZSk7CisKKwliaF9sb2NrX3NvY2soc2spOworCXNrLT5za19lcnIgPSBFVElNRURPVVQ7CisJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CisJYmhfdW5sb2NrX3NvY2soc2spOworCisJc2NvX3NvY2tfa2lsbChzayk7CisJc29ja19wdXQoc2spOworfQorCitzdGF0aWMgdm9pZCBzY29fc29ja19zZXRfdGltZXIoc3RydWN0IHNvY2sgKnNrLCBsb25nIHRpbWVvdXQpCit7CisJQlRfREJHKCJzb2NrICVwIHN0YXRlICVkIHRpbWVvdXQgJWxkIiwgc2ssIHNrLT5za19zdGF0ZSwgdGltZW91dCk7CisJc2tfcmVzZXRfdGltZXIoc2ssICZzay0+c2tfdGltZXIsIGppZmZpZXMgKyB0aW1lb3V0KTsKK30KKworc3RhdGljIHZvaWQgc2NvX3NvY2tfY2xlYXJfdGltZXIoc3RydWN0IHNvY2sgKnNrKQoreworCUJUX0RCRygic29jayAlcCBzdGF0ZSAlZCIsIHNrLCBzay0+c2tfc3RhdGUpOworCXNrX3N0b3BfdGltZXIoc2ssICZzay0+c2tfdGltZXIpOworfQorCitzdGF0aWMgdm9pZCBzY29fc29ja19pbml0X3RpbWVyKHN0cnVjdCBzb2NrICpzaykKK3sKKwlpbml0X3RpbWVyKCZzay0+c2tfdGltZXIpOworCXNrLT5za190aW1lci5mdW5jdGlvbiA9IHNjb19zb2NrX3RpbWVvdXQ7CisJc2stPnNrX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylzazsKK30KKworLyogLS0tLSBTQ08gY29ubmVjdGlvbnMgLS0tLSAqLworc3RhdGljIHN0cnVjdCBzY29fY29ubiAqc2NvX2Nvbm5fYWRkKHN0cnVjdCBoY2lfY29ubiAqaGNvbiwgX191OCBzdGF0dXMpCit7CisJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBoY29uLT5oZGV2OworCXN0cnVjdCBzY29fY29ubiAqY29ubjsKKworCWlmICgoY29ubiA9IGhjb24tPnNjb19kYXRhKSkKKwkJcmV0dXJuIGNvbm47CisKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gY29ubjsKKworCWlmICghKGNvbm4gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NvX2Nvbm4pLCBHRlBfQVRPTUlDKSkpCisJCXJldHVybiBOVUxMOworCW1lbXNldChjb25uLCAwLCBzaXplb2Yoc3RydWN0IHNjb19jb25uKSk7CisKKwlzcGluX2xvY2tfaW5pdCgmY29ubi0+bG9jayk7CisKKwloY29uLT5zY29fZGF0YSA9IGNvbm47CisJY29ubi0+aGNvbiA9IGhjb247CisKKwljb25uLT5zcmMgPSAmaGRldi0+YmRhZGRyOworCWNvbm4tPmRzdCA9ICZoY29uLT5kc3Q7CisKKwlpZiAoaGRldi0+c2NvX210dSA+IDApCisJCWNvbm4tPm10dSA9IGhkZXYtPnNjb19tdHU7CisJZWxzZQorCQljb25uLT5tdHUgPSA2MDsKKworCUJUX0RCRygiaGNvbiAlcCBjb25uICVwIiwgaGNvbiwgY29ubik7CisJcmV0dXJuIGNvbm47Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNvY2sgKnNjb19jaGFuX2dldChzdHJ1Y3Qgc2NvX2Nvbm4gKmNvbm4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gTlVMTDsKKwlzY29fY29ubl9sb2NrKGNvbm4pOworCXNrID0gY29ubi0+c2s7CisJc2NvX2Nvbm5fdW5sb2NrKGNvbm4pOworCXJldHVybiBzazsKK30KKworc3RhdGljIGludCBzY29fY29ubl9kZWwoc3RydWN0IGhjaV9jb25uICpoY29uLCBpbnQgZXJyKQoreworCXN0cnVjdCBzY29fY29ubiAqY29ubjsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlpZiAoIShjb25uID0gaGNvbi0+c2NvX2RhdGEpKSAKKwkJcmV0dXJuIDA7CisKKwlCVF9EQkcoImhjb24gJXAgY29ubiAlcCwgZXJyICVkIiwgaGNvbiwgY29ubiwgZXJyKTsKKworCS8qIEtpbGwgc29ja2V0ICovCisJaWYgKChzayA9IHNjb19jaGFuX2dldChjb25uKSkpIHsKKwkJYmhfbG9ja19zb2NrKHNrKTsKKwkJc2NvX3NvY2tfY2xlYXJfdGltZXIoc2spOworCQlzY29fY2hhbl9kZWwoc2ssIGVycik7CisJCWJoX3VubG9ja19zb2NrKHNrKTsKKwkJc2NvX3NvY2tfa2lsbChzayk7CisJfQorCisJaGNvbi0+c2NvX2RhdGEgPSBOVUxMOworCWtmcmVlKGNvbm4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzY29fY2hhbl9hZGQoc3RydWN0IHNjb19jb25uICpjb25uLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrICpwYXJlbnQpCit7CisJaW50IGVyciA9IDA7CisKKwlzY29fY29ubl9sb2NrKGNvbm4pOworCWlmIChjb25uLT5zaykgeworCQllcnIgPSAtRUJVU1k7CisJfSBlbHNlIHsKKwkJX19zY29fY2hhbl9hZGQoY29ubiwgc2ssIHBhcmVudCk7CisJfQorCXNjb19jb25uX3VubG9jayhjb25uKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNjb19jb25uZWN0KHN0cnVjdCBzb2NrICpzaykKK3sKKwliZGFkZHJfdCAqc3JjID0gJmJ0X3NrKHNrKS0+c3JjOworCWJkYWRkcl90ICpkc3QgPSAmYnRfc2soc2spLT5kc3Q7CisJc3RydWN0IHNjb19jb25uICpjb25uOworCXN0cnVjdCBoY2lfY29ubiAqaGNvbjsKKwlzdHJ1Y3QgaGNpX2RldiAgKmhkZXY7CisJaW50IGVyciA9IDA7CisKKwlCVF9EQkcoIiVzIC0+ICVzIiwgYmF0b3N0cihzcmMpLCBiYXRvc3RyKGRzdCkpOworCisJaWYgKCEoaGRldiA9IGhjaV9nZXRfcm91dGUoZHN0LCBzcmMpKSkKKwkJcmV0dXJuIC1FSE9TVFVOUkVBQ0g7CisKKwloY2lfZGV2X2xvY2tfYmgoaGRldik7CisKKwllcnIgPSAtRU5PTUVNOworCisJaGNvbiA9IGhjaV9jb25uZWN0KGhkZXYsIFNDT19MSU5LLCBkc3QpOworCWlmICghaGNvbikKKwkJZ290byBkb25lOworCisJY29ubiA9IHNjb19jb25uX2FkZChoY29uLCAwKTsKKwlpZiAoIWNvbm4pIHsKKwkJaGNpX2Nvbm5fcHV0KGhjb24pOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogVXBkYXRlIHNvdXJjZSBhZGRyIG9mIHRoZSBzb2NrZXQgKi8KKwliYWNweShzcmMsIGNvbm4tPnNyYyk7CisKKwllcnIgPSBzY29fY2hhbl9hZGQoY29ubiwgc2ssIE5VTEwpOworCWlmIChlcnIpCisJCWdvdG8gZG9uZTsKKworCWlmIChoY29uLT5zdGF0ZSA9PSBCVF9DT05ORUNURUQpIHsKKwkJc2NvX3NvY2tfY2xlYXJfdGltZXIoc2spOworCQlzay0+c2tfc3RhdGUgPSBCVF9DT05ORUNURUQ7CisJfSBlbHNlIHsKKwkJc2stPnNrX3N0YXRlID0gQlRfQ09OTkVDVDsKKwkJc2NvX3NvY2tfc2V0X3RpbWVyKHNrLCBzay0+c2tfc25kdGltZW8pOworCX0KK2RvbmU6CisJaGNpX2Rldl91bmxvY2tfYmgoaGRldik7CisJaGNpX2Rldl9wdXQoaGRldik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2NvX3NlbmRfZnJhbWUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIGludCBsZW4pCit7CisJc3RydWN0IHNjb19jb25uICpjb25uID0gc2NvX3BpKHNrKS0+Y29ubjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBlcnIsIGNvdW50OworCisJLyogQ2hlY2sgb3V0Z29pbmcgTVRVICovCisJaWYgKGxlbiA+IGNvbm4tPm10dSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlCVF9EQkcoInNrICVwIGxlbiAlZCIsIHNrLCBsZW4pOworCisJY291bnQgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbm4tPm10dSwgbGVuKTsKKwlpZiAoIShza2IgPSBidF9za2Jfc2VuZF9hbGxvYyhzaywgY291bnQsIG1zZy0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlULCAmZXJyKSkpCisJCXJldHVybiBlcnI7CisKKwlpZiAobWVtY3B5X2Zyb21pb3ZlYyhza2JfcHV0KHNrYiwgY291bnQpLCBtc2ctPm1zZ19pb3YsIGNvdW50KSkgeworCQllcnIgPSAtRUZBVUxUOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKChlcnIgPSBoY2lfc2VuZF9zY28oY29ubi0+aGNvbiwgc2tiKSkgPCAwKQorCQlnb3RvIGZhaWw7CisKKwlyZXR1cm4gY291bnQ7CisKK2ZhaWw6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNjb19yZWN2X2ZyYW1lKHN0cnVjdCBzY29fY29ubiAqY29ubiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzY29fY2hhbl9nZXQoY29ubik7CisKKwlpZiAoIXNrKQorCQlnb3RvIGRyb3A7CisKKwlCVF9EQkcoInNrICVwIGxlbiAlZCIsIHNrLCBza2ItPmxlbik7CisKKwlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0NPTk5FQ1RFRCkKKwkJZ290byBkcm9wOworCisJaWYgKCFzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYikpCisJCXJldHVybjsKKworZHJvcDoKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm47Cit9CisKKy8qIC0tLS0tLS0tIFNvY2tldCBpbnRlcmZhY2UgLS0tLS0tLS0tLSAqLworc3RhdGljIHN0cnVjdCBzb2NrICpfX3Njb19nZXRfc29ja19ieV9hZGRyKGJkYWRkcl90ICpiYSkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisKKwlza19mb3JfZWFjaChzaywgbm9kZSwgJnNjb19za19saXN0LmhlYWQpCisJCWlmICghYmFjbXAoJmJ0X3NrKHNrKS0+c3JjLCBiYSkpCisJCQlnb3RvIGZvdW5kOworCXNrID0gTlVMTDsKK2ZvdW5kOgorCXJldHVybiBzazsKK30KKworLyogRmluZCBzb2NrZXQgbGlzdGVuaW5nIG9uIHNvdXJjZSBiZGFkZHIuCisgKiBSZXR1cm5zIGNsb3Nlc3QgbWF0Y2guCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29jayAqc2NvX2dldF9zb2NrX2xpc3RlbihiZGFkZHJfdCAqc3JjKQoreworCXN0cnVjdCBzb2NrICpzayA9IE5VTEwsICpzazEgPSBOVUxMOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJcmVhZF9sb2NrKCZzY29fc2tfbGlzdC5sb2NrKTsKKworCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmc2NvX3NrX2xpc3QuaGVhZCkgeworCQlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0xJU1RFTikKKwkJCWNvbnRpbnVlOworCisJCS8qIEV4YWN0IG1hdGNoLiAqLworCQlpZiAoIWJhY21wKCZidF9zayhzayktPnNyYywgc3JjKSkKKwkJCWJyZWFrOworCisJCS8qIENsb3Nlc3QgbWF0Y2ggKi8KKwkJaWYgKCFiYWNtcCgmYnRfc2soc2spLT5zcmMsIEJEQUREUl9BTlkpKQorCQkJc2sxID0gc2s7CisJfQorCisJcmVhZF91bmxvY2soJnNjb19za19saXN0LmxvY2spOworCisJcmV0dXJuIG5vZGUgPyBzayA6IHNrMTsKK30KKworc3RhdGljIHZvaWQgc2NvX3NvY2tfZGVzdHJ1Y3Qoc3RydWN0IHNvY2sgKnNrKQoreworCUJUX0RCRygic2sgJXAiLCBzayk7CisKKwlza2JfcXVldWVfcHVyZ2UoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwlza2JfcXVldWVfcHVyZ2UoJnNrLT5za193cml0ZV9xdWV1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNjb19zb2NrX2NsZWFudXBfbGlzdGVuKHN0cnVjdCBzb2NrICpwYXJlbnQpCit7CisJc3RydWN0IHNvY2sgKnNrOworCisJQlRfREJHKCJwYXJlbnQgJXAiLCBwYXJlbnQpOworCisJLyogQ2xvc2Ugbm90IHlldCBhY2NlcHRlZCBjaGFubmVscyAqLworCXdoaWxlICgoc2sgPSBidF9hY2NlcHRfZGVxdWV1ZShwYXJlbnQsIE5VTEwpKSkgeworCQlzY29fc29ja19jbG9zZShzayk7CisJCXNjb19zb2NrX2tpbGwoc2spOworCX0KKworCXBhcmVudC0+c2tfc3RhdGUgID0gQlRfQ0xPU0VEOworCXNvY2tfc2V0X2ZsYWcocGFyZW50LCBTT0NLX1pBUFBFRCk7Cit9CisKKy8qIEtpbGwgc29ja2V0IChvbmx5IGlmIHphcHBlZCBhbmQgb3JwaGFuKQorICogTXVzdCBiZSBjYWxsZWQgb24gdW5sb2NrZWQgc29ja2V0LgorICovCitzdGF0aWMgdm9pZCBzY29fc29ja19raWxsKHN0cnVjdCBzb2NrICpzaykKK3sKKwlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19aQVBQRUQpIHx8IHNrLT5za19zb2NrZXQpCisJCXJldHVybjsKKworCUJUX0RCRygic2sgJXAgc3RhdGUgJWQiLCBzaywgc2stPnNrX3N0YXRlKTsKKworCS8qIEtpbGwgcG9vciBvcnBoYW4gKi8KKwlidF9zb2NrX3VubGluaygmc2NvX3NrX2xpc3QsIHNrKTsKKwlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX0RFQUQpOworCXNvY2tfcHV0KHNrKTsKK30KKworLyogQ2xvc2Ugc29ja2V0LgorICogTXVzdCBiZSBjYWxsZWQgb24gdW5sb2NrZWQgc29ja2V0LgorICovCitzdGF0aWMgdm9pZCBzY29fc29ja19jbG9zZShzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHNjb19jb25uICpjb25uOworCisJc2NvX3NvY2tfY2xlYXJfdGltZXIoc2spOworCisJbG9ja19zb2NrKHNrKTsKKworCWNvbm4gPSBzY29fcGkoc2spLT5jb25uOworCisJQlRfREJHKCJzayAlcCBzdGF0ZSAlZCBjb25uICVwIHNvY2tldCAlcCIsIHNrLCBzay0+c2tfc3RhdGUsIGNvbm4sIHNrLT5za19zb2NrZXQpOworCisJc3dpdGNoIChzay0+c2tfc3RhdGUpIHsKKwljYXNlIEJUX0xJU1RFTjoKKwkJc2NvX3NvY2tfY2xlYW51cF9saXN0ZW4oc2spOworCQlicmVhazsKKworCWNhc2UgQlRfQ09OTkVDVEVEOgorCWNhc2UgQlRfQ09ORklHOgorCWNhc2UgQlRfQ09OTkVDVDoKKwljYXNlIEJUX0RJU0NPTk46CisJCXNjb19jaGFuX2RlbChzaywgRUNPTk5SRVNFVCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJc29ja19zZXRfZmxhZyhzaywgU09DS19aQVBQRUQpOworCQlicmVhazsKKwl9OworCisJcmVsZWFzZV9zb2NrKHNrKTsKKworCXNjb19zb2NrX2tpbGwoc2spOworfQorCitzdGF0aWMgdm9pZCBzY29fc29ja19pbml0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2sgKnBhcmVudCkKK3sKKwlCVF9EQkcoInNrICVwIiwgc2spOworCisJaWYgKHBhcmVudCkgCisJCXNrLT5za190eXBlID0gcGFyZW50LT5za190eXBlOworfQorCitzdGF0aWMgc3RydWN0IHByb3RvIHNjb19wcm90byA9IHsKKwkubmFtZQkJPSAiU0NPIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9ial9zaXplCT0gc2l6ZW9mKHN0cnVjdCBzY29fcGluZm8pCit9OworCitzdGF0aWMgc3RydWN0IHNvY2sgKnNjb19zb2NrX2FsbG9jKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90bywgaW50IHByaW8pCit7CisJc3RydWN0IHNvY2sgKnNrOworCisJc2sgPSBza19hbGxvYyhQRl9CTFVFVE9PVEgsIHByaW8sICZzY29fcHJvdG8sIDEpOworCWlmICghc2spCisJCXJldHVybiBOVUxMOworCisJc29ja19pbml0X2RhdGEoc29jaywgc2spOworCUlOSVRfTElTVF9IRUFEKCZidF9zayhzayktPmFjY2VwdF9xKTsKKworCXNrLT5za19kZXN0cnVjdCA9IHNjb19zb2NrX2Rlc3RydWN0OworCXNrLT5za19zbmR0aW1lbyA9IFNDT19DT05OX1RJTUVPVVQ7CisKKwlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKKworCXNrLT5za19wcm90b2NvbCA9IHByb3RvOworCXNrLT5za19zdGF0ZSAgICA9IEJUX09QRU47CisKKwlzY29fc29ja19pbml0X3RpbWVyKHNrKTsKKworCWJ0X3NvY2tfbGluaygmc2NvX3NrX2xpc3QsIHNrKTsKKwlyZXR1cm4gc2s7Cit9CisKK3N0YXRpYyBpbnQgc2NvX3NvY2tfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlCVF9EQkcoInNvY2sgJXAiLCBzb2NrKTsKKworCXNvY2stPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7CisKKwlpZiAoc29jay0+dHlwZSAhPSBTT0NLX1NFUVBBQ0tFVCkKKwkJcmV0dXJuIC1FU09DS1ROT1NVUFBPUlQ7CisKKwlzb2NrLT5vcHMgPSAmc2NvX3NvY2tfb3BzOworCisJaWYgKCEoc2sgPSBzY29fc29ja19hbGxvYyhzb2NrLCBwcm90b2NvbCwgR0ZQX0tFUk5FTCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNjb19zb2NrX2luaXQoc2ssIE5VTEwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjb19zb2NrX2JpbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgYWRkcl9sZW4pCit7CisJc3RydWN0IHNvY2thZGRyX3NjbyAqc2EgPSAoc3RydWN0IHNvY2thZGRyX3NjbyAqKSBhZGRyOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWJkYWRkcl90ICpzcmMgPSAmc2EtPnNjb19iZGFkZHI7CisJaW50IGVyciA9IDA7CisKKwlCVF9EQkcoInNrICVwICVzIiwgc2ssIGJhdG9zdHIoJnNhLT5zY29fYmRhZGRyKSk7CisKKwlpZiAoIWFkZHIgfHwgYWRkci0+c2FfZmFtaWx5ICE9IEFGX0JMVUVUT09USCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsb2NrX3NvY2soc2spOworCisJaWYgKHNrLT5za19zdGF0ZSAhPSBCVF9PUEVOKSB7CisJCWVyciA9IC1FQkFERkQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl3cml0ZV9sb2NrX2JoKCZzY29fc2tfbGlzdC5sb2NrKTsKKworCWlmIChiYWNtcChzcmMsIEJEQUREUl9BTlkpICYmIF9fc2NvX2dldF9zb2NrX2J5X2FkZHIoc3JjKSkgeworCQllcnIgPSAtRUFERFJJTlVTRTsKKwl9IGVsc2UgeworCQkvKiBTYXZlIHNvdXJjZSBhZGRyZXNzICovCisJCWJhY3B5KCZidF9zayhzayktPnNyYywgJnNhLT5zY29fYmRhZGRyKTsKKwkJc2stPnNrX3N0YXRlID0gQlRfQk9VTkQ7CisJfQorCisJd3JpdGVfdW5sb2NrX2JoKCZzY29fc2tfbGlzdC5sb2NrKTsKKworZG9uZToKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc2NvX3NvY2tfY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCBhbGVuLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNvY2thZGRyX3NjbyAqc2EgPSAoc3RydWN0IHNvY2thZGRyX3NjbyAqKSBhZGRyOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCBlcnIgPSAwOworCisKKwlCVF9EQkcoInNrICVwIiwgc2spOworCisJaWYgKGFkZHItPnNhX2ZhbWlseSAhPSBBRl9CTFVFVE9PVEggfHwgYWxlbiA8IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfc2NvKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc2stPnNrX3N0YXRlICE9IEJUX09QRU4gJiYgc2stPnNrX3N0YXRlICE9IEJUX0JPVU5EKQorCQlyZXR1cm4gLUVCQURGRDsKKworCWlmIChzay0+c2tfdHlwZSAhPSBTT0NLX1NFUVBBQ0tFVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsb2NrX3NvY2soc2spOworCisJLyogU2V0IGRlc3RpbmF0aW9uIGFkZHJlc3MgYW5kIHBzbSAqLworCWJhY3B5KCZidF9zayhzayktPmRzdCwgJnNhLT5zY29fYmRhZGRyKTsKKworCWlmICgoZXJyID0gc2NvX2Nvbm5lY3Qoc2spKSkKKwkJZ290byBkb25lOworCisJZXJyID0gYnRfc29ja193YWl0X3N0YXRlKHNrLCBCVF9DT05ORUNURUQsIAorCQkJc29ja19zbmR0aW1lbyhzaywgZmxhZ3MgJiBPX05PTkJMT0NLKSk7CisKK2RvbmU6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNjb19zb2NrX2xpc3RlbihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgYmFja2xvZykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlpbnQgZXJyID0gMDsKKworCUJUX0RCRygic2sgJXAgYmFja2xvZyAlZCIsIHNrLCBiYWNrbG9nKTsKKworCWxvY2tfc29jayhzayk7CisKKwlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0JPVU5EIHx8IHNvY2stPnR5cGUgIT0gU09DS19TRVFQQUNLRVQpIHsKKwkJZXJyID0gLUVCQURGRDsKKwkJZ290byBkb25lOworCX0KKworCXNrLT5za19tYXhfYWNrX2JhY2tsb2cgPSBiYWNrbG9nOworCXNrLT5za19hY2tfYmFja2xvZyA9IDA7CisJc2stPnNrX3N0YXRlID0gQlRfTElTVEVOOworCitkb25lOgorCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzY29fc29ja19hY2NlcHQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2tldCAqbmV3c29jaywgaW50IGZsYWdzKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrLCAqY2g7CisJbG9uZyB0aW1lbzsKKwlpbnQgZXJyID0gMDsKKworCWxvY2tfc29jayhzayk7CisKKwlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0xJU1RFTikgeworCQllcnIgPSAtRUJBREZEOworCQlnb3RvIGRvbmU7CisJfQorCisJdGltZW8gPSBzb2NrX3JjdnRpbWVvKHNrLCBmbGFncyAmIE9fTk9OQkxPQ0spOworCisJQlRfREJHKCJzayAlcCB0aW1lbyAlbGQiLCBzaywgdGltZW8pOworCisJLyogV2FpdCBmb3IgYW4gaW5jb21pbmcgY29ubmVjdGlvbi4gKHdha2Utb25lKS4gKi8KKwlhZGRfd2FpdF9xdWV1ZV9leGNsdXNpdmUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJd2hpbGUgKCEoY2ggPSBidF9hY2NlcHRfZGVxdWV1ZShzaywgbmV3c29jaykpKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmICghdGltZW8pIHsKKwkJCWVyciA9IC1FQUdBSU47CisJCQlicmVhazsKKwkJfQorCisJCXJlbGVhc2Vfc29jayhzayk7CisJCXRpbWVvID0gc2NoZWR1bGVfdGltZW91dCh0aW1lbyk7CisJCWxvY2tfc29jayhzayk7CisKKwkJaWYgKHNrLT5za19zdGF0ZSAhPSBCVF9MSVNURU4pIHsKKwkJCWVyciA9IC1FQkFERkQ7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJZXJyID0gc29ja19pbnRyX2Vycm5vKHRpbWVvKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisKKwlpZiAoZXJyKQorCQlnb3RvIGRvbmU7CisKKwluZXdzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKworCUJUX0RCRygibmV3IHNvY2tldCAlcCIsIGNoKTsKKworZG9uZToKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc2NvX3NvY2tfZ2V0bmFtZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCAqbGVuLCBpbnQgcGVlcikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfc2NvICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHJfc2NvICopIGFkZHI7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisKKwlCVF9EQkcoInNvY2sgJXAsIHNrICVwIiwgc29jaywgc2spOworCisJYWRkci0+c2FfZmFtaWx5ID0gQUZfQkxVRVRPT1RIOworCSpsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3Njbyk7CisKKwlpZiAocGVlcikKKwkJYmFjcHkoJnNhLT5zY29fYmRhZGRyLCAmYnRfc2soc2spLT5kc3QpOworCWVsc2UKKwkJYmFjcHkoJnNhLT5zY29fYmRhZGRyLCAmYnRfc2soc2spLT5zcmMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2NvX3NvY2tfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIAorCQkJICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlpbnQgZXJyID0gMDsKKworCUJUX0RCRygic29jayAlcCwgc2sgJXAiLCBzb2NrLCBzayk7CisKKwlpZiAoc2stPnNrX2VycikKKwkJcmV0dXJuIHNvY2tfZXJyb3Ioc2spOworCisJaWYgKG1zZy0+bXNnX2ZsYWdzICYgTVNHX09PQikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJbG9ja19zb2NrKHNrKTsKKworCWlmIChzay0+c2tfc3RhdGUgPT0gQlRfQ09OTkVDVEVEKQorCQllcnIgPSBzY29fc2VuZF9mcmFtZShzaywgbXNnLCBsZW4pOworCWVsc2UKKwkJZXJyID0gLUVOT1RDT05OOworCisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNjb19zb2NrX3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlpbnQgZXJyID0gMDsKKworCUJUX0RCRygic2sgJXAiLCBzayk7CisKKwlsb2NrX3NvY2soc2spOworCisJc3dpdGNoIChvcHRuYW1lKSB7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT1BST1RPT1BUOworCQlicmVhazsKKwl9CisKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc2NvX3NvY2tfZ2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHNjb19vcHRpb25zIG9wdHM7CisJc3RydWN0IHNjb19jb25uaW5mbyBjaW5mbzsKKwlpbnQgbGVuLCBlcnIgPSAwOyAKKworCUJUX0RCRygic2sgJXAiLCBzayk7CisKKwlpZiAoZ2V0X3VzZXIobGVuLCBvcHRsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWxvY2tfc29jayhzayk7CisKKwlzd2l0Y2ggKG9wdG5hbWUpIHsKKwljYXNlIFNDT19PUFRJT05TOgorCQlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0NPTk5FQ1RFRCkgeworCQkJZXJyID0gLUVOT1RDT05OOworCQkJYnJlYWs7CisJCX0KKworCQlvcHRzLm10dSA9IHNjb19waShzayktPmNvbm4tPm10dTsKKworCQlCVF9EQkcoIm10dSAlZCIsIG9wdHMubXR1KTsKKworCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwgc2l6ZW9mKG9wdHMpKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsIChjaGFyICopJm9wdHMsIGxlbikpCisJCQllcnIgPSAtRUZBVUxUOworCisJCWJyZWFrOworCisJY2FzZSBTQ09fQ09OTklORk86CisJCWlmIChzay0+c2tfc3RhdGUgIT0gQlRfQ09OTkVDVEVEKSB7CisJCQllcnIgPSAtRU5PVENPTk47CisJCQlicmVhazsKKwkJfQorCisJCWNpbmZvLmhjaV9oYW5kbGUgPSBzY29fcGkoc2spLT5jb25uLT5oY29uLT5oYW5kbGU7CisJCW1lbWNweShjaW5mby5kZXZfY2xhc3MsIHNjb19waShzayktPmNvbm4tPmhjb24tPmRldl9jbGFzcywgMyk7CisKKwkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sIHNpemVvZihjaW5mbykpOworCQlpZiAoY29weV90b191c2VyKG9wdHZhbCwgKGNoYXIgKikmY2luZm8sIGxlbikpCisJCQllcnIgPSAtRUZBVUxUOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT1BST1RPT1BUOworCQlicmVhazsKKwl9CisKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc2NvX3NvY2tfcmVsZWFzZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCBlcnIgPSAwOworCisJQlRfREJHKCJzb2NrICVwLCBzayAlcCIsIHNvY2ssIHNrKTsKKworCWlmICghc2spCisJCXJldHVybiAwOworCisJc2NvX3NvY2tfY2xvc2Uoc2spOworCisJaWYgKHNvY2tfZmxhZyhzaywgU09DS19MSU5HRVIpICYmIHNrLT5za19saW5nZXJ0aW1lKSB7CisJCWxvY2tfc29jayhzayk7CisJCWVyciA9IGJ0X3NvY2tfd2FpdF9zdGF0ZShzaywgQlRfQ0xPU0VELCBzay0+c2tfbGluZ2VydGltZSk7CisJCXJlbGVhc2Vfc29jayhzayk7CisJfQorCisJc29ja19vcnBoYW4oc2spOworCXNjb19zb2NrX2tpbGwoc2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fc2NvX2NoYW5fYWRkKHN0cnVjdCBzY29fY29ubiAqY29ubiwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29jayAqcGFyZW50KQoreworCUJUX0RCRygiY29ubiAlcCIsIGNvbm4pOworCisJc2NvX3BpKHNrKS0+Y29ubiA9IGNvbm47CisJY29ubi0+c2sgPSBzazsKKworCWlmIChwYXJlbnQpCisJCWJ0X2FjY2VwdF9lbnF1ZXVlKHBhcmVudCwgc2spOworfQorCisvKiBEZWxldGUgY2hhbm5lbC4gCisgKiBNdXN0IGJlIGNhbGxlZCBvbiB0aGUgbG9ja2VkIHNvY2tldC4gKi8KK3N0YXRpYyB2b2lkIHNjb19jaGFuX2RlbChzdHJ1Y3Qgc29jayAqc2ssIGludCBlcnIpCit7CisJc3RydWN0IHNjb19jb25uICpjb25uOworCisJY29ubiA9IHNjb19waShzayktPmNvbm47CisKKwlCVF9EQkcoInNrICVwLCBjb25uICVwLCBlcnIgJWQiLCBzaywgY29ubiwgZXJyKTsKKworCWlmIChjb25uKSB7IAorCQlzY29fY29ubl9sb2NrKGNvbm4pOworCQljb25uLT5zayA9IE5VTEw7CisJCXNjb19waShzayktPmNvbm4gPSBOVUxMOworCQlzY29fY29ubl91bmxvY2soY29ubik7CisJCWhjaV9jb25uX3B1dChjb25uLT5oY29uKTsKKwl9CisKKwlzay0+c2tfc3RhdGUgPSBCVF9DTE9TRUQ7CisJc2stPnNrX2VyciAgID0gZXJyOworCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCisJc29ja19zZXRfZmxhZyhzaywgU09DS19aQVBQRUQpOworfQorCitzdGF0aWMgdm9pZCBzY29fY29ubl9yZWFkeShzdHJ1Y3Qgc2NvX2Nvbm4gKmNvbm4pCit7CisJc3RydWN0IHNvY2sgKnBhcmVudCwgKnNrOworCisJQlRfREJHKCJjb25uICVwIiwgY29ubik7CisKKwlzY29fY29ubl9sb2NrKGNvbm4pOworCisJaWYgKChzayA9IGNvbm4tPnNrKSkgeworCQlzY29fc29ja19jbGVhcl90aW1lcihzayk7CisJCWJoX2xvY2tfc29jayhzayk7CisJCXNrLT5za19zdGF0ZSA9IEJUX0NPTk5FQ1RFRDsKKwkJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CisJCWJoX3VubG9ja19zb2NrKHNrKTsKKwl9IGVsc2UgeworCQlwYXJlbnQgPSBzY29fZ2V0X3NvY2tfbGlzdGVuKGNvbm4tPnNyYyk7CisJCWlmICghcGFyZW50KQorCQkJZ290byBkb25lOworCisJCWJoX2xvY2tfc29jayhwYXJlbnQpOworCisJCXNrID0gc2NvX3NvY2tfYWxsb2MoTlVMTCwgQlRQUk9UT19TQ08sIEdGUF9BVE9NSUMpOworCQlpZiAoIXNrKSB7CisJCQliaF91bmxvY2tfc29jayhwYXJlbnQpOworCQkJZ290byBkb25lOworCQl9CisKKwkJc2NvX3NvY2tfaW5pdChzaywgcGFyZW50KTsKKworCQliYWNweSgmYnRfc2soc2spLT5zcmMsIGNvbm4tPnNyYyk7CisJCWJhY3B5KCZidF9zayhzayktPmRzdCwgY29ubi0+ZHN0KTsKKworCQloY2lfY29ubl9ob2xkKGNvbm4tPmhjb24pOworCQlfX3Njb19jaGFuX2FkZChjb25uLCBzaywgcGFyZW50KTsKKworCQlzay0+c2tfc3RhdGUgPSBCVF9DT05ORUNURUQ7CisKKwkJLyogV2FrZSB1cCBwYXJlbnQgKi8KKwkJcGFyZW50LT5za19kYXRhX3JlYWR5KHBhcmVudCwgMSk7CisKKwkJYmhfdW5sb2NrX3NvY2socGFyZW50KTsKKwl9CisKK2RvbmU6CisJc2NvX2Nvbm5fdW5sb2NrKGNvbm4pOworfQorCisvKiAtLS0tLSBTQ08gaW50ZXJmYWNlIHdpdGggbG93ZXIgbGF5ZXIgKEhDSSkgLS0tLS0gKi8KK3N0YXRpYyBpbnQgc2NvX2Nvbm5lY3RfaW5kKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLCBfX3U4IHR5cGUpCit7CisJQlRfREJHKCJoZGV2ICVzLCBiZGFkZHIgJXMiLCBoZGV2LT5uYW1lLCBiYXRvc3RyKGJkYWRkcikpOworCisJLyogQWx3YXlzIGFjY2VwdCBjb25uZWN0aW9uICovCisJcmV0dXJuIEhDSV9MTV9BQ0NFUFQ7Cit9CisKK3N0YXRpYyBpbnQgc2NvX2Nvbm5lY3RfY2ZtKHN0cnVjdCBoY2lfY29ubiAqaGNvbiwgX191OCBzdGF0dXMpCit7CisJQlRfREJHKCJoY29uICVwIGJkYWRkciAlcyBzdGF0dXMgJWQiLCBoY29uLCBiYXRvc3RyKCZoY29uLT5kc3QpLCBzdGF0dXMpOworCisJaWYgKGhjb24tPnR5cGUgIT0gU0NPX0xJTkspCisJCXJldHVybiAwOworCisJaWYgKCFzdGF0dXMpIHsKKwkJc3RydWN0IHNjb19jb25uICpjb25uOworCisJCWNvbm4gPSBzY29fY29ubl9hZGQoaGNvbiwgc3RhdHVzKTsKKwkJaWYgKGNvbm4pCisJCQlzY29fY29ubl9yZWFkeShjb25uKTsKKwl9IGVsc2UgCisJCXNjb19jb25uX2RlbChoY29uLCBidF9lcnIoc3RhdHVzKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY29fZGlzY29ubl9pbmQoc3RydWN0IGhjaV9jb25uICpoY29uLCBfX3U4IHJlYXNvbikKK3sKKwlCVF9EQkcoImhjb24gJXAgcmVhc29uICVkIiwgaGNvbiwgcmVhc29uKTsKKworCWlmIChoY29uLT50eXBlICE9IFNDT19MSU5LKQorCQlyZXR1cm4gMDsKKworCXNjb19jb25uX2RlbChoY29uLCBidF9lcnIocmVhc29uKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2NvX3JlY3Zfc2NvZGF0YShzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNjb19jb25uICpjb25uID0gaGNvbi0+c2NvX2RhdGE7CisKKwlpZiAoIWNvbm4pCisJCWdvdG8gZHJvcDsKKworCUJUX0RCRygiY29ubiAlcCBsZW4gJWQiLCBjb25uLCBza2ItPmxlbik7CisKKwlpZiAoc2tiLT5sZW4pIHsKKwkJc2NvX3JlY3ZfZnJhbWUoY29ubiwgc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCitkcm9wOgorCWtmcmVlX3NrYihza2IpOwkKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLSBQcm9jIGZzIHN1cHBvcnQgLS0tLSAqLworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgdm9pZCAqc2NvX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHNvY2sgKnNrOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCWxvZmZfdCBsID0gKnBvczsKKworCXJlYWRfbG9ja19iaCgmc2NvX3NrX2xpc3QubG9jayk7CisKKwlza19mb3JfZWFjaChzaywgbm9kZSwgJnNjb19za19saXN0LmhlYWQpCisJCWlmICghbC0tKQorCQkJZ290byBmb3VuZDsKKwlzayA9IE5VTEw7Citmb3VuZDoKKwlyZXR1cm4gc2s7Cit9CisKK3N0YXRpYyB2b2lkICpzY29fc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKmUsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBzb2NrICpzayA9IGU7CisJKCpwb3MpKys7CisJcmV0dXJuIHNrX25leHQoc2spOworfQorCitzdGF0aWMgdm9pZCBzY29fc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKmUpCit7CisJcmVhZF91bmxvY2tfYmgoJnNjb19za19saXN0LmxvY2spOworfQorCitzdGF0aWMgaW50ICBzY29fc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKmUpCit7CisJc3RydWN0IHNvY2sgKnNrID0gZTsKKwlzZXFfcHJpbnRmKHNlcSwgIiVzICVzICVkXG4iLAorCQkJYmF0b3N0cigmYnRfc2soc2spLT5zcmMpLCBiYXRvc3RyKCZidF9zayhzayktPmRzdCksIHNrLT5za19zdGF0ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgc2NvX3NlcV9vcHMgPSB7CisJLnN0YXJ0CT0gc2NvX3NlcV9zdGFydCwKKwkubmV4dAk9IHNjb19zZXFfbmV4dCwKKwkuc3RvcAk9IHNjb19zZXFfc3RvcCwKKwkuc2hvdwk9IHNjb19zZXFfc2hvdyAKK307CisKK3N0YXRpYyBpbnQgc2NvX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmc2NvX3NlcV9vcHMpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzY29fc2VxX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHNjb19zZXFfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2NvX3Byb2NfaW5pdCh2b2lkKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJzY28iLCBTX0lSVUdPLCBwcm9jX2J0KTsKKwlpZiAoIXApCisJCXJldHVybiAtRU5PTUVNOworCXAtPm93bmVyICAgICA9IFRISVNfTU9EVUxFOworCXAtPnByb2NfZm9wcyA9ICZzY29fc2VxX2ZvcHM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzY29fcHJvY19jbGVhbnVwKHZvaWQpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkoInNjbyIsIHByb2NfYnQpOworfQorCisjZWxzZSAvKiBDT05GSUdfUFJPQ19GUyAqLworCitzdGF0aWMgaW50IF9faW5pdCBzY29fcHJvY19pbml0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzY29fcHJvY19jbGVhbnVwKHZvaWQpCit7CisJcmV0dXJuOworfQorI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIHNjb19zb2NrX29wcyA9IHsKKwkuZmFtaWx5CQk9IFBGX0JMVUVUT09USCwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnJlbGVhc2UJPSBzY29fc29ja19yZWxlYXNlLAorCS5iaW5kCQk9IHNjb19zb2NrX2JpbmQsCisJLmNvbm5lY3QJPSBzY29fc29ja19jb25uZWN0LAorCS5saXN0ZW4JCT0gc2NvX3NvY2tfbGlzdGVuLAorCS5hY2NlcHQJCT0gc2NvX3NvY2tfYWNjZXB0LAorCS5nZXRuYW1lCT0gc2NvX3NvY2tfZ2V0bmFtZSwKKwkuc2VuZG1zZwk9IHNjb19zb2NrX3NlbmRtc2csCisJLnJlY3Ztc2cJPSBidF9zb2NrX3JlY3Ztc2csCisJLnBvbGwJCT0gYnRfc29ja19wb2xsLAorCS5pb2N0bAkJPSBzb2NrX25vX2lvY3RsLAorCS5tbWFwCQk9IHNvY2tfbm9fbW1hcCwKKwkuc29ja2V0cGFpcgk9IHNvY2tfbm9fc29ja2V0cGFpciwKKwkuc2h1dGRvd24JPSBzb2NrX25vX3NodXRkb3duLAorCS5zZXRzb2Nrb3B0CT0gc2NvX3NvY2tfc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdAk9IHNjb19zb2NrX2dldHNvY2tvcHQKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSBzY29fc29ja19mYW1pbHlfb3BzID0geworCS5mYW1pbHkJPSBQRl9CTFVFVE9PVEgsCisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmNyZWF0ZQk9IHNjb19zb2NrX2NyZWF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGNpX3Byb3RvIHNjb19oY2lfcHJvdG8gPSB7CisJLm5hbWUJCT0gIlNDTyIsCisJLmlkCQk9IEhDSV9QUk9UT19TQ08sCisJLmNvbm5lY3RfaW5kCT0gc2NvX2Nvbm5lY3RfaW5kLAorCS5jb25uZWN0X2NmbQk9IHNjb19jb25uZWN0X2NmbSwKKwkuZGlzY29ubl9pbmQJPSBzY29fZGlzY29ubl9pbmQsCisJLnJlY3Zfc2NvZGF0YQk9IHNjb19yZWN2X3Njb2RhdGEKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNjb19pbml0KHZvaWQpCit7CisJaW50IGVycjsKKworCWVyciA9IHByb3RvX3JlZ2lzdGVyKCZzY29fcHJvdG8sIDApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gYnRfc29ja19yZWdpc3RlcihCVFBST1RPX1NDTywgJnNjb19zb2NrX2ZhbWlseV9vcHMpOworCWlmIChlcnIgPCAwKSB7CisJCUJUX0VSUigiU0NPIHNvY2tldCByZWdpc3RyYXRpb24gZmFpbGVkIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZXJyID0gaGNpX3JlZ2lzdGVyX3Byb3RvKCZzY29faGNpX3Byb3RvKTsKKwlpZiAoZXJyIDwgMCkgeworCQlCVF9FUlIoIlNDTyBwcm90b2NvbCByZWdpc3RyYXRpb24gZmFpbGVkIik7CisJCWJ0X3NvY2tfdW5yZWdpc3RlcihCVFBST1RPX1NDTyk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJc2NvX3Byb2NfaW5pdCgpOworCisJQlRfSU5GTygiU0NPIChWb2ljZSBMaW5rKSB2ZXIgJXMiLCBWRVJTSU9OKTsKKwlCVF9JTkZPKCJTQ08gc29ja2V0IGxheWVyIGluaXRpYWxpemVkIik7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJcHJvdG9fdW5yZWdpc3Rlcigmc2NvX3Byb3RvKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2NvX2V4aXQodm9pZCkKK3sKKwlzY29fcHJvY19jbGVhbnVwKCk7CisKKwlpZiAoYnRfc29ja191bnJlZ2lzdGVyKEJUUFJPVE9fU0NPKSA8IDApCisJCUJUX0VSUigiU0NPIHNvY2tldCB1bnJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKKworCWlmIChoY2lfdW5yZWdpc3Rlcl9wcm90bygmc2NvX2hjaV9wcm90bykgPCAwKQorCQlCVF9FUlIoIlNDTyBwcm90b2NvbCB1bnJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKKworCXByb3RvX3VucmVnaXN0ZXIoJnNjb19wcm90byk7Cit9CisKK21vZHVsZV9pbml0KHNjb19pbml0KTsKK21vZHVsZV9leGl0KHNjb19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWF4aW0gS3Jhc255YW5za3kgPG1heGtAcXVhbGNvbW0uY29tPiwgTWFyY2VsIEhvbHRtYW5uIDxtYXJjZWxAaG9sdG1hbm4ub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCbHVldG9vdGggU0NPIHZlciAiIFZFUlNJT04pOworTU9EVUxFX1ZFUlNJT04oVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImJ0LXByb3RvLTIiKTsK