ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZWU5NjIKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMjYgQEAKKyouYQorKi5sYQorKi5sbworKi5zbworKi5vCisuZGVwcy8KKy5kaXJzdGFtcAorLmxpYnMvCitNYWtlZmlsZQorTWFrZWZpbGUuaW4KKworL2FjbG9jYWwubTQKKy9hdXRvbTR0ZS5jYWNoZS8KKy9idWlsZC1hdXgvCisvY29uZmlnLioKKy9jb25maWd1cmUKKy9saWJ0b29sCisvc3RhbXAtaDEKKworL2VidGFibGVzLWxlZ2FjeQorL2VidGFibGVzLWxlZ2FjeS1yZXN0b3JlCisvZWJ0YWJsZXMtbGVnYWN5LXNhdmUKKy9lYnRhYmxlcy1sZWdhY3kuOAorL2VidGFibGVzZAorL2VidGFibGVzdQorL3N0YXRpYwpkaWZmIC0tZ2l0IGEvQW5kcm9pZC5tayBiL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFkMmQ0OQotLS0gL2Rldi9udWxsCisrKyBiL0FuZHJvaWQubWsKQEAgLTAsMCArMSw2MiBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2NmbGFncyA6PSAtTzIgLWcgXAorCS1EUFJPR05BTUU9XCJlYnRhYmxlc1wiIFwKKwktRFBST0dWRVJTSU9OPVwiMi4wLjExXCIgXAorCS1EUFJPR0RBVEU9XCJEZWNlbWJlclwgMjAxMVwiIFwKKwktRExPQ0tGSUxFPVwiL3Zhci9saWIvZWJ0YWJsZXMvbG9ja1wiIFwKKwktV25vLXNpZ24tY29tcGFyZSAtV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIFwKKwktV25vLWlnbm9yZWQtcXVhbGlmaWVycyAtV25vLXVudXNlZC1wYXJhbWV0ZXIgXAorCS1Xbm8tI3ByYWdtYS1tZXNzYWdlcworCitleHRlbnNpb25zX3NyY19maWxlcyA6PSBcCisJZXh0ZW5zaW9ucy9lYnRfODAyXzMuYyBcCisJZXh0ZW5zaW9ucy9lYnRfQVVESVQuYyBcCisJZXh0ZW5zaW9ucy9lYnRfYW1vbmcuYyBcCisJZXh0ZW5zaW9ucy9lYnRfYXJwLmMgXAorCWV4dGVuc2lvbnMvZWJ0X2FycHJlcGx5LmMgXAorCWV4dGVuc2lvbnMvZWJ0X2lwLmMgXAorCWV4dGVuc2lvbnMvZWJ0X2lwNi5jIFwKKwlleHRlbnNpb25zL2VidF9saW1pdC5jIFwKKwlleHRlbnNpb25zL2VidF9sb2cuYyBcCisJZXh0ZW5zaW9ucy9lYnRfbWFyay5jIFwKKwlleHRlbnNpb25zL2VidF9tYXJrX20uYyBcCisJZXh0ZW5zaW9ucy9lYnRfbmF0LmMgXAorCWV4dGVuc2lvbnMvZWJ0X25mbG9nLmMgXAorCWV4dGVuc2lvbnMvZWJ0X3BrdHR5cGUuYyBcCisJZXh0ZW5zaW9ucy9lYnRfcmVkaXJlY3QuYyBcCisJZXh0ZW5zaW9ucy9lYnRfc3RhbmRhcmQuYyBcCisJZXh0ZW5zaW9ucy9lYnRfc3RwLmMgXAorCWV4dGVuc2lvbnMvZWJ0X3N0cmluZy5jIFwKKwlleHRlbnNpb25zL2VidF91bG9nLmMgXAorCWV4dGVuc2lvbnMvZWJ0X3ZsYW4uYyBcCisJZXh0ZW5zaW9ucy9lYnRhYmxlX2Jyb3V0ZS5jIFwKKwlleHRlbnNpb25zL2VidGFibGVfZmlsdGVyLmMgXAorCWV4dGVuc2lvbnMvZWJ0YWJsZV9uYXQuYyBcCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCSQoZXh0ZW5zaW9uc19zcmNfZmlsZXMpIFwKKwljb21tdW5pY2F0aW9uLmMgXAorCWVidGFibGVzLXN0YW5kYWxvbmUuYyBcCisJZWJ0YWJsZXMuYyBcCisJZ2V0ZXRoZXJ0eXBlLmMgXAorCWxpYmVidGMuYyBcCisJdXNlZnVsX2Z1bmN0aW9ucy5jIFwKKworTE9DQUxfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKK0xPQ0FMX0NGTEFHUyA6PSAkKGNmbGFncykKK0xPQ0FMX01PRFVMRSA6PSBlYnRhYmxlcworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gZXRoZXJ0eXBlcworTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVYRUNVVEFCTEVTCitMT0NBTF9TUkNfRklMRVMgOj0gZXRoZXJ0eXBlcworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9FVEMpCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCmRpZmYgLS1naXQgYS9DT1BZSU5HIGIvQ09QWUlORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTQ3NTRlCi0tLSAvZGV2L251bGwKKysrIGIvQ09QWUlORwpAQCAtMCwwICsxLDM0MiBAQAorQWxsIGNvZGUgaW4gdGhpcyBwYWNrYWdlLCBpbmNsdWRpbmcgdGhlIGNvZGUgZnJvbSB0aGUgZXh0ZW5zaW9ucywKK2lzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgbGljZW5zZSwgd2hpY2ggeW91IGZpbmQgaGVyZWFmdGVyLgorCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwordXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQordGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCit5b3VyIHByb2dyYW1zLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0CitpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAoraW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2FueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KK1RoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91CitkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Cit5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQorc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgorcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKKygyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCitkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgorCisgIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwordGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKK2F1dGhvcnMnIHJlcHV0YXRpb25zLgorCisgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCitwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCitwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCitwcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKK3BhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisMCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucworYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKK3JlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgorbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKK3RoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCitlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgorbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgordGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCitpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KK1doZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncworc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Citjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCitub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7CithbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQorICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCisgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKKyAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCisgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCisgICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgorICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCisgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKKyAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCisgICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisMCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCit3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCisgICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQorICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCisgICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKKyAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KK2NvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKK3NwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQorYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKK2Zvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCithY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50CithY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKwwKKyAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0CitvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKK3ZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KK0hvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAorcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KK3RoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwordGhpcyBMaWNlbnNlLgorCisgIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KK2FwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCitjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKwwKKyAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCit0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CitsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCitlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgordGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4KKworICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCit0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcworbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKK29mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKK29mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgorT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCitUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCitQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKK1JFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKK1JFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKK09VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQorWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKK1BST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisJQXBwZW5kaXg6IEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgMTl5eSAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSAxOXl5IG5hbWUgb2YgYXV0aG9yCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQorYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCisgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9DaGFuZ2VMb2cgYi9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJkZTRkYgotLS0gL2Rldi9udWxsCisrKyBiL0NoYW5nZUxvZwpAQCAtMCwwICsxLDIwOSBAQAorMjAxMTEyMTUKKwlDaGFuZ2Vsb2cgZm9yIHYyLjAuMTAtNAorCSogcmVhbGx5IGZpeCBjb3VudGVyIHNldHRpbmcgYnVnICh0aGFua3MgdG8gSmFtZXMnIHBlcnNpc3RlbmNlKQorMjAxMTEyMDQKKwlDaGFuZ2Vsb2cgZm9yIHYyLjAuMTAtMworCSogZml4IGNvdW50ZXIgc2V0dGluZyBidWcgKHJlcG9ydGVkIGJ5IEphbWVzIFNpbmNsYWlyKQorMjAxMTA3MTAKKwlDaGFuZ2Vsb2cgZm9yIHYyLjAuMTAtMgorCSogZW5hYmxlIGNvbXBpbGVyIG9wdGltaXphdGlvbnMgKC1PMykKKwkqIHNtYWxsIGNoYW5nZXMgdG8gcmVtb3ZlIHRoZSBjb21waWxlciB3YXJuaW5ncyBkdWUgdG8gb3B0aW1pemF0aW9uIGJlaW5nCisJICB0dXJuZWQgb24gKHRoYW5rcyB0byBQZXRlciBWb2xrb3YpCisJKiByZXNwZWN0IExERkxBR1MgaW4gTWFrZWZpbGVzIChQZXRlciBWb2xrb3YpCisyMDExMDcxMAorCUNoYW5nZWxvZyBmb3IgdjIuMC4xMC0xCisJKiBmaXggLS1hbW9uZy1kc3QtZmlsZSwgd2hpY2ggdHJhbnNsYXRlZCB0byAtLWFtb25nLXNyYworCSAgKHJlcG9ydGVkIGJ5IFRoaWVycnkgV2F0ZWxldCkKKwkqIGZpeCBidWcgaW4gdGVzdF91bG9nLmMgZXhhbXBsZQorCSogTWFrZWZpbGU6IHJlc3BlY3QgTERGTEFHUyBkdXJpbmcgZWJ0YWJsZXMgYnVpbGQgKFBldGVyIFZvbGtvdikKKwkqIE1ha2VmaWxlOiBjcmVhdGUgZGlyZWN0b3JpZXMgdG8gYXZvaWQgYnVpbGQgZmFpbHVyZSB3aGVuIERFU1RESVIgaXMKKwkgIHN1cHBsaWVkIChQZXRlciBWb2xrb3YpCisJKiBpbmNvcnBvcmF0ZSBmaXhlcyBmb3IgcG9zc2libGUgaXNzdWVzIGZvdW5kIGJ5IENvdmVyaXR5IGFuYWx5c2lzCisJICAodGhhbmtzIHRvIEppcmkgUG9wZWxrYSkKKwkqIGRlZmluZSBfX0VYUE9SVEVEX0hFQURFUlNfXyB0byBnZXQgYWNjZXNzIHRvIHRoZSBMaW51eCBrZXJuZWwgaGVhZGVycworCSogZXh0ZW5kIGVidF9pcDYgdG8gYWxsb3cgbWF0Y2hpbmcgb24gaXB2Ni1pY21wIHR5cGVzL2NvZGVzIChieSBGbG9yaWFuCisJICBXZXN0cGhhbCkKKwkqIFByaW50IGEgbW9yZSB1c2VmdWwgZXJyb3IgbWVzc2FnZSB3aGVuIGFuIHVwZGF0ZSBvZiB0aGUga2VybmVsIHRhYmxlCisJICBmYWlsZWQuCisJKiBBZGQgLS1jb25jdXJyZW50IG9wdGlvbiwgd2hpY2ggZW5hYmxlcyB1c2luZyBhIGZpbGUgbG9jayB0byBzdXBwb3J0CisJICBjb25jdXJyZW50IHNjcmlwdHMgdXBkYXRpbmcgdGhlIGVidGFibGVzIGtlcm5lbCB0YWJsZXMKKzIwMTAwMjAzCisJQ2hhbmdlbG9nIGZvciB2Mi4wLjktMgorCSogZml4IHVud2FudGVkIHplcm9pbmcgb2YgY291bnRlcnMgaW4gdGhlIGxhc3QgdXNlci1kZWZpbmVkIGNoYWluCisJICAocmVwb3J0ZWQgYnkgSm9uIExld2lzKQorCSogZml4IGhpZGRlbiBzeW1ib2wgY29tcGlsYXRpb24gZXJyb3Igd2hlbiB1c2luZyBsZCBkaXJlY3RseQorCSogZml4IHJldHVybiB2YWx1ZSBjaGVja2luZyBvZiBjcmVhdCB0byBnaXZlIGEgY29ycmVjdCBlcnJvcgorCSAgbWVzc2FnZSBpZiB0aGUgYXRvbWljIGZpbGUgY291bGRuJ3QgYmUgY3JlYXRlZAorCSogY29ycmVjdCBpbmZvIGluIElOU1RBTEwgYWJvdXQgY29tcGlsYXRpb24gb2YgdWxvZworMjAwOTA2MjEKKwlDaGFuZ2Vsb2cgZm9yIHYyLjAuOSB2cyB2Mi4wLjgtMgorCSogYWRkZWQgaXA2IG1vZHVsZSBmb3IgZmlsdGVyaW5nIElQdjYgdHJhZmZpYyAoS3VvLUxhbmcgVHNlbmcsCisJICBNYW5vaGFyIENhc3RlbGlubykKKwkqIGFkZGVkIC0tbG9nLWlwNiBvcHRpb24gZm9yIGxvZ2dpbmcgSVB2NiB0cmFmZmljIChLdW8tTGFuZyBUc2VuZywKKwkgIE1hbm9oYXIgQ2FzdGVsaW5vKQorCSogYWRkZWQgbmZsb2cgd2F0Y2hlciBmb3IgbG9nZ2luZyBwYWNrZXRzIHRvIHVzZXJzcGFjZSAoUGV0ZXIgV2FyYXNpbikKKwkqIGJ1Z2ZpeCBpbiBlYnRhYmxlcy5zeXN2IChNaWNoYWwgU29sdHlzKQorCSogYnVnZml4IGZvciBhbW9uZyBtYXRjaCBvbiB4ODYtNjQgKHJlcG9ydGVkIGJ5IFBhdmVsIEVtZWx5YW5vdikKKzIwMDYxMjE3CisJU2luY2UgbGFzdCBlbnRyeToKKwkqIGZpeGVkIGEgZmV3IHJlcG9ydGVkIGJ1Z3MKKwkqIGVidF9hbW9uZyAtLWFtb25nLWRzdC1maWxlIGFuZCAtLWFtb25nLXNyYy1maWxlOiBhbGxvdworCSAgdGhlIGxpc3QgdG8gYmUgZ2l2ZW4gaW4gYSBmaWxlIChjaXJjdW12ZW50cyBjb21tYW5kIGxpbmUgbWF4LgorCSAgbGluZSBsZW5ndGgKKwkqIGVidF9uYXQgLS1zbmF0LWFycDogaWYgaXQncyBhbiBhcnAgcGFja2V0LCBhbHNvIGNoYW5nZSB0aGUgc291cmNlCisJICBhZGRyZXNzIGluIHRoZSBhcnAgaGVhZGVyCisJKiBlYnRfbWFyayAtLW1hcmstb3IsIC0tbWFyay14b3IsIC0tbWFyay1hbmQKKzIwMDUxMDIwCisJU2luY2UgbGFzdCBlbnRyeToKKwkqIGVidGFibGVzIG1vZHVsZXMgYXJlIG5vdyBsb2NhdGVkIGluIC91c3IvbGliL2VidGFibGVzLworCSogYWRkZWQgJy9zYmluL3NlcnZpY2UgZWJ0YWJsZXMnIHN1cHBvcnQKKwkqIGFkZGVkIGVidGFibGVzLXNhdmUgKHRoYW5rcyB0byBSb2sgUGFwZXogPHJvay5wYXBlekBhcm5lcy5zaT4pCisJICBhbmQgZWJ0YWJsZXMtcmVzdG9yZSAodGhlIGZpcnN0IG9uZSBhIHBlcmwgc2NyaXB0LCB0aGUgc2Vjb25kCisJICBvbmUgd3JpdHRlbiBpbiBjIChmYXN0KSkKKwkqIG9wdGltaXplZCB0aGUgY29kZSBmb3IgdGhlICctQScgY29tbWFuZCwgbWFraW5nIGVidGFibGVzLXJlc3RvcmUKKwkgIHZlcnkgZmFzdC4KKwkqIGVidGFibGVzZC9lYnRhYmxlc3UgaXMgZGVwcmVjYXRlZCBhbmQgbm90IGNvbXBpbGVkIGJ5IGRlZmF1bHQKKwkgIHRoZSBlYnRhYmxlcy1zYXZlL2VidGFibGVzLXJlc3RvcmUgc2NoZW1lIGlzIG11Y2ggYmV0dGVyCisyMDA1MDExNworCVNpbmNlIGxhc3QgZW50cnk6CisJKiBhZGRlZCB1bG9nIHdhdGNoZXIKKwkqIG1hZGUgdGhlIGVidGFibGVzIGNvZGUgbW9kdWxhciAobWFrZSBsaWJyYXJ5IGZ1bmN0aW9ucykuCisJKiBhZGRlZCB0aGUgZWJ0YWJsZXNkL2VidGFibGVzdSBzY2hlbWUgdG8gYWxsb3cgZmFzdGVyCisJICBhZGRpdGlvbiBvZiBydWxlcyAoYW5kIHRvIHRlc3QgdGhlIG1vZHVsYXIgY29kZSkuCisJKiBzb21lIHNtYWxsIGZpeGVzCisJKiBhZGRlZCAtYyBvcHRpb24gKGluaXRpYWxpemUgY291bnRlcnMpCisJKiBhZGRlZCAtQyBvcHRpb24gKGNoYW5nZSBjb3VudGVycykKKzIwMDMxMTAyCisJU2luY2UgbGFzdCBlbnRyeToKKwkqIDxncnplc19hdF9nbnUudW5pdi5nZGEucGw+IGFkZGVkIGFycHJlcGx5IGFuZCBhbW9uZyBtb2R1bGVzCisJKiA8dG9tbXlfYXRfaG9tZS50aWctZ3JyLmNvbT4gYWRkZWQgbGltaXQgbWF0Y2gKKzIwMDMwNzI0CisJKiBhZGRlZCAoYXV0b21hdGljKSBTcGFyYzY0IHN1cHBvcnQsIHRoYW5rcyB0byBNaWNoYWVsIEJlbGxpb24gYW5kCisJICBUaG9tYXMgSGVpbnogZnJvbSBoaXBhYy5vcmcgZm9yIHByb3ZpZGluZyBhIHRlc3QtYm94LgorMjAwMzA3MTcKKwkqIGFkZGVkIHN0cCBmcmFtZXMgbWF0Y2ggdHlwZQorMjAwMzA3MTMKKwkqIGFkZGVkIHN1cHBvcnQgZm9yIGRlbGV0aW5nIGFsbCB1c2VyLWRlZmluZWQgY2hhaW5zICgtWCBvcHRpb24KKwkgIHdpdGhvdXQgc3BlY2lmaWVkIGNoYWluKQorMjAwMzA2MDEKKwkqIGFkZGVkIC0tTG1hYzIKKwkqIDxjc3ZfYXRfYmx1ZXRhaWwuY29tPiBDaHJpcyBWaXRhbGU6IGJhc2ljIDgwMi4zLzgwMi4yIGZpbHRlcmluZworCSAgKGV4cGVyaW1lbnRhbCwga2VybmVsIGZpbGVzIGFyZSBpbiB0aGUgQ1ZTKQorCisyMDAzMDUwMworCSogYWRkZWQgbmVnYXRpdmUgcnVsZSBjb3VudGVyIHN1cHBvcnQKKwkqIGJ1Z2ZpeDogYmNudCB3YXMgbm90IHVwZGF0ZWQgY29ycmVjdGx5CisJKiA8YmxhbmNoZXJfYXRfY2FydGVsLXNlY3VyaXRlLmZyPiBDZWRyaWMgQmxhbmNoZXI6IGFkZCBBUlAgTUFDCisJICBtYXRjaGluZyBzdXBwb3J0CisJKiBhZGRlZCBwa3R0eXBlIG1hdGNoCisyMDAzMDQwMgorCSogZml4ZWQgY2hlY2sgYnVnIGluIGVidF9pcC5jIChyZXBvcnQgZnJvbQorCSAgam9lX2p1ZGdlX2F0X2d1YXJkaXVtLmNvbSkuCisyMDAzMDExMQorCSogZml4ZWQgcHJvYmxlbSB3aGVuIHJlbW92aW5nIGEgY2hhaW4gKHJlcG9ydCBmcm9tCisJICB5a3BodWFoX2F0X2dyZWVucGFja2V0LmNvbSkuCisJKiBBZGRlZCAtLWhlbHAgbGlzdF9leHRlbnNpb25zIHdoaWNoLCB3ZWxsLCBsaXN0cyB0aGUgZXh0ZW5zaW9ucworMjAwMjEyMDMKKwkqIGNoYW5nZWQgdGhlIHdheSB0byB1c2UgdGhlIGF0b21pYyBvcGVyYXRpb25zLiBJdCdzIG5vdyBwb3NzaWJsZQorCSAgdG8gdXNlIHRoZSBFQlRBQkxFU19BVE9NSUNfRklMRSBlbnZpcm9ubWVudCB2YXJpYWJsZSwgc28gaXQncyBubworCSAgbG9uZ2VyIG5lY2Vzc2FyeSB0byBleHBsaWNpdGx5IHN0YXRlIHRoZSBmaWxlIG5hbWUuIFNlZSB0aGUgbWFuLgorMjAwMjExMjAKKwkqIGNoYW5nZWQgdGhlIHdheSBvZiBjb21waWxpbmcuIE5ldyByZWxlYXNlcyB3aWxsIG5vdyBjb250YWluIHRoZWlyCisJICBvd24gc2V0IG9mIGtlcm5lbCBpbmNsdWRlcy4gTm8gbW9yZSBjb3B5aW5nIG9mIGtlcm5lbCBpbmNsdWRlcyB0bworCSAgL3Vzci9pbmNsdWRlL2xpbnV4CisJKiBhZGRlZCBnZXRldGhlcnR5cGUuYyAoTmljaykgYW5kIHVzZSBpdC4gUmVtb3ZlZCBuYW1lX3RvX251bWJlcigpCisJICBhbmQgbnVtYmVyX3RvX25hbWUoKS4KKzIwMDIxMTA2CisJKiBhZGRlZCBwb3NzaWJpbGl0eSB0byBzcGVjaWZ5IGEgcnVsZSBudW1iZXIgaW50ZXJ2YWwgd2hlbiBkZWxldGluZworCSAgcnVsZXMKKzIwMDIxMTAyCisJKiBhZGRlZCAhIC0gb3B0aW9uIHBvc3NpYmlsaXR5LCB3aGljaCBpcyBlcXVpdmFsZW50IHRvIC0gISBvcHRpb24KKzIwMDIxMTAyCisJKiBzaW5jZSBsYXN0IGVudHJ5OiBhZGRlZCBieXRlIGNvdW50ZXJzIGFuZCB1ZHAvdGNwIHBvcnQgbWF0Y2hpbmcKKzIwMDIwODMwCisJKiB1cGRhdGVkIHRoZSBrZXJuZWwgZmlsZXMgZm9yIDIuNC4yMC1wcmU1IGFuZCAyLjUuMzIKKwkqIGxhc3QgYmlnIGNsZWFudXAgb2Yga2VybmVsIGFuZCB1c2Vyc3BhY2UgY29kZSBqdXN0IGZpbmlzaGVkCisyMDAyMDgyMAorCSogQVJQIG1vZHVsZSBidWdmaXgKKwkqIElQIG1vZHVsZSBidWdmaXgKKwkqIG5hdCBtb2R1bGUgYnVnZml4CisyMDAyMDczMAorCSogb3RoZXIgdGhpbmdzIGRvbmUgYmVmb3JlIDIuMC1yYzEgdGhhdCBJIGNhbiB0aGluayBvZiwKKwkgIGluY2x1ZGluZyBrZXJuZWw6CisJKiBjYWNoZSBhbGlnbiBjb3VudGVycyBmb3IgYmV0dGVyIHNtcCBwZXJmb3JtYW5jZQorCSogc2ltcGxpZnkgc25hdCBjb2RlCisJKiBjaGVjayBmb3IgLS14eHh4LXRhcmdldCBSRVRVUk4gb24gYmFzZSBjaGFpbgorCSogY2xlYW51cCBjb2RlCisJKiBtaW5vciBidWdmaXhlcworMjAwMjA3MjQKKwkqIGNvZGUgY2xlYW51cAorCSogYnVnZml4IGZvciAtLWF0b21pYy1jb21taXQKKzIwMDIwNzIwCisJKiBhZGRlZCBtYXJrIHRhcmdldCttYXRjaAorMjAwMjA3MTQKKwkqIGFkZGVkIC0tYXRvbWljIG9wdGlvbnMKKzIwMDIwNzEwCisJKiBzb21lIHVubG9nZ2VkIGNoYW5nZXMgKGR1ZSB0byBsYXp5bmVzcykKKwkqIGFkZGVkIC0tTGMsIC0tTG4sIC0tTHgKKzIwMDIwNjI1CisJKiB1c2VyIGRlZmluZWQgY2hhaW5zIHN1cHBvcnQ6IGFkZGVkIC1OLCAtWCwgLUUgb3B0aW9ucy4KKzIwMDIwNjIxCisJKiBzb21lIHVubG9nZ2VkIGNoYW5nZXMgKGR1ZSB0byBsYXp5bmVzcykKKwkqIGNoYW5nZSB0aGUgb3V0cHV0IGZvciAtTCB0byBtYWtlIGl0IGxvb2sgbGlrZSBpdCB3b3VsZCBsb29rIHdoZW4KKwkgIHRoZSB1c2VyIGlucHV0cyB0aGUgY29tbWFuZC4KKwkqIHRyeSB0byBhdXRvbG9hZCBtb2R1bGVzCisJKiBzb21lIG1pbm9yIGJ1Z2ZpeGVzCisJKiBhZGQgdXNlciBkZWZpbmVkIGNoYWlucyBzdXBwb3J0ICh3aXRob3V0IG5ldyBjb21tYW5kcyB5ZXQsCisJICBkZWxpYmVyYXRlbHkpCisJKiBjb21wYXJpbmcgcnVsZXMgZGlkbid0IHRha2UgdGhlIGxvZ2ljYWwgZGV2aWNlcyBpbnRvIGFjY291bnQKKzIwMDIwNTIwCisJKiB1cGRhdGUgaGVscCBmb3IgLXMgYW5kIC1kCisJKiBhZGQgVkxBTiBpbiBldGhlcnR5cGVzCisJKiBhZGQgU1lNTElOSyBvcHRpb24gZm9yIGNvbXBpbGluZworMjAwMjA1MDEKKwkqIGFsbG93IC1pIGFuZCAtLWxvZ2ljYWwtaW4gaW4gQlJPVVRJTkcKKwkqIHVwZGF0ZSB0aGUgbWFudWFsIHBhZ2UKKwkqIHJlbmFtZSAvZXRjL2V0aGVycHJvdG8gaW50byAvZXRjL2V0aGVydHlwZXMgKHNlZW1zIHRvIGJlIGEgbW9yZQorCSAgc3RhbmRhcmQgbmFtZSkKKwkqIGFkZCBNQUMgbWFzayBmb3IgLXMgYW5kIC1kLCBhbHNvIGFkZGVkIFVuaWNhc3QsIE11bHRpY2FzdCBhbmQKKwkgIEJyb2FkY2FzdCBzcGVjaWZpY2F0aW9uIGZvciBzcGVjaWZ5aW5nIGEgKGZhbWlseSBvZikgTUFDCisJICBhZGRyZXNzZXMuCisyMDAyMDQyNworCSogYWRkZWQgYnJvdXRlIHRhYmxlLgorCSogYWRkZWQgcmVkaXJlY3QgdGFyZ2V0LgorCSogYWRkZWQgLS1yZWRpcmVjdC10YXJnZXQsIC0tc25hdC10YXJnZXQgYW5kIC0tZG5hdC10YXJnZXQgb3B0aW9ucy4KKwkqIGFkZGVkIGxvZ2ljYWxfb3V0IGFuZCBsb2dpY2FsX2luCisJKiBzbmF0IGJ1Z2ZpeCAoLT5zaXplKQorMjAwMjA0MTQKKwkqIGZpeGVkIHNvbWUgdGhpbmdzIGluIHRoZSBtYW51YWwuCisJKiBmaXhlZCAtUCBwcm9ibGVtLgorMjAwMjA0MTEKKwkqIC1qIHN0YW5kYXJkIG5vIGxvbmdlciB3b3JrcywgaXMgdGhpcyBjcnlwdGljPyBnb29kIDopCisJKiBsb3RzIG9mIGJlYXV0aWZpY2F0aW9uLgorCSAgLSBtYWRlIHNvbWUgY29kZSBzbWFsbGVyCisJICAtIG1hZGUgZXZlcnl0aGluZyBmaXQgd2l0aGluIDgwIGNvbHVtbnMKKwkqIGZpeCBwcm9ibGVtcyB3aXRoIC1pIGFuZCAtbyBvcHRpb24KKwkqIHByaW50X21lbW9yeSBub3cgcHJpbnRzIHVzZWZ1bCBpbmZvCisJKiB0cnlpbmcgdG8gc2VlIHRoZSB0YWJsZXMgd2hlbiBlYnRhYmxlcyBpcyBub3QgbG9hZGVkIGluIGtlcm5lbAorCSAgbm8gbG9uZ2VyIG1ha2VzIHRoaXMgYmUgc2VlbiBhcyBhIGJ1Zy4KKzIwMDIwNDAzCisJZWJ0YWJsZXMgdjIuMCByZWxlYXNlZCwgY2hhbmdlczoKKwkqIEEgY29tcGxldGUgcmV3cml0ZSwgbWFkZSBldmVyeXRoaW5nIG1vZHVsYXIuCisJKiBGaXhlZCBhIG9uZSB5ZWFyIG9sZCBidWcgaW4gYnJfZGIuYy4gQSBzaW1pbGFyIGJ1ZyB3YXMgcHJlc2VudAorCSAgaW4gZWJ0YWJsZXMuYy4gSXQgd2FzIHZpc2libGUgd2hlbiB0aGUgbnVtYmVyIG9mIHJ1bGVzIGdvdAorCSAgYmlnZ2VyIChhcm91bmQgOTApLgorCSogUmVtb3ZlZCB0aGUgb3B0aW9uIHRvIGFsbG93L2Rpc2FsbG93IGNvdW50ZXJzLiBGcmFtZXMgcGFzc2luZworCSAgYnkgYXJlIGFsd2F5cyBjb3VudGVkIG5vdy4KKwkqIERpZG4ndCByZWFsbHkgYWRkIGFueSBuZXcgZnVuY3Rpb25hbGl0eS4gSG93ZXZlciwgaXQgd2lsbCBiZQorCSAgX2Fsb3RfIGVhc2llciBhbmQgcHJldHRpZXIgdG8gZG8gc28gbm93LiBGZWVsIGZyZWUgdG8gYWRkIGFuCisJICBleHRlbnNpb24geW91cnNlbGYuCisJKiBUaGVyZSBhcmUgNCB0eXBlcyBvZiBleHRlbnNpb25zOgorCSAgLSBUYWJsZXMuCisJICAtIE1hdGNoZXM6IGxpa2UgaXB0YWJsZXMgaGFzLgorCSAgLSBXYXRjaGVyczogdGhlc2Ugb25seSB3YXRjaCBmcmFtZXMgdGhhdCBwYXNzZWQgYWxsIHRoZSBtYXRjaGVzCisJICAgIG9mIHRoZSBydWxlLiBUaGV5IGRvbid0IGNoYW5nZSB0aGUgZnJhbWUsIG5vciBnaXZlIGEgdmVyZGljdC4KKwkgICAgVGhlIGxvZyBleHRlbnNpb24gaXMgYSB3YXRjaGVyLgorCSAgLSBUYXJnZXRzLgorCSogdXNlcjMyL2tlcm5lbDY0IGFyY2hpdGVjdHVyZXMgbGlrZSB0aGUgU3BhcmM2NCBhcmUgdW5zdXBwb3J0ZWQuCisJICBJZiB5b3Ugd2FudCBtZSB0byBjaGFuZ2UgdGhpcywgZ2l2ZSBtZSBhY2Nlc3MgdG8gc3VjaCBhIGJveCwKKwkgIGFuZCBkb24ndCBwcmVzc3VyZSBtZS4KZGlmZiAtLWdpdCBhL0lOU1RBTEwgYi9JTlNUQUxMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0M2Q5NWMKLS0tIC9kZXYvbnVsbAorKysgYi9JTlNUQUxMCkBAIC0wLDAgKzEsMzYgQEAKK0luc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgZm9yIGlwdGFibGVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitlYnRhYmxlcyB1c2VzIHRoZSB3ZWxsLWtub3duIGNvbmZpZ3VyZShhdXRvdG9vbHMpIGluZnJhc3RydWN0dXJlLgorCisJJCAuL2NvbmZpZ3VyZQorCSQgbWFrZQorCSMgbWFrZSBpbnN0YWxsCisKKworUHJlcmVxdWlzaXRlcworPT09PT09PT09PT09PQorCisJKiBubyBrZXJuZWwtc291cmNlIHJlcXVpcmVkCisKKwkqIGJ1dCBvYnZpb3VzbHkgYSBjb21waWxlciwgZ2xpYmMtZGV2ZWwgYW5kIGxpbnV4LWtlcm5lbC1oZWFkZXJzCisJICAoL3Vzci9pbmNsdWRlL2xpbnV4KQorCisKK0NvbmZpZ3VyaW5nIGFuZCBjb21waWxpbmcKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworLi9jb25maWd1cmUgW29wdGlvbnNdCisKKy0tcHJlZml4PQorCisJVGhlIHByZWZpeCB0byBwdXQgYWxsIGluc3RhbGxlZCBmaWxlcyB1bmRlci4gSXQgZGVmYXVsdHMgdG8KKwkvdXNyL2xvY2FsLCBzbyB0aGUgYmluYXJpZXMgd2lsbCBnbyBpbnRvIC91c3IvbG9jYWwvYmluLCBzYmluLAorCW1hbnBhZ2VzIGludG8gL3Vzci9sb2NhbC9zaGFyZS9tYW4sIGV0Yy4KKworSWYgeW91IHdhbnQgdG8gZW5hYmxlIGRlYnVnZ2luZywgdXNlCisKKwkuL2NvbmZpZ3VyZSBDRkxBR1M9Ii1nZ2RiMyAtTzAiIENQUEZMQUdTPSItREVCVF9ERUJVRyIKKworKC1PMCBpcyB1c2VkIHRvIHR1cm4gb2ZmIGluc3RydWN0aW9uIHJlb3JkZXJpbmcsIHdoaWNoIG1ha2VzIGRlYnVnZ2luZworbXVjaCBlYXNpZXIuKQpkaWZmIC0tZ2l0IGEvTElDRU5TRSBiL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZDI0ODQyZgotLS0gL2Rldi9udWxsCisrKyBiL0xJQ0VOU0UKQEAgLTAsMCArMSBAQAorQ09QWUlORwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL01ha2VmaWxlLmFtIGIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE4MTAwMwotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNjkgQEAKKyMgLSotIE1ha2VmaWxlIC0qLQorCisjIEZvciBkZWJ1Z2dpbmcsIHVzZSAuL2NvbmZpZ3VyZSBDUFBGTEFHUz0tREVCVF9ERUJVRyBDRkxBR1M9Ii1PMCAtZ2dkYjMiCisKK1BST0dOQU1FID0gJHtQQUNLQUdFX05BTUV9CitQUk9HVkVSU0lPTiA9ICR7UEFDS0FHRV9WRVJTSU9OfQorUFJPR0RBVEUgPSBEZWNlbWJlclwgMjAxMQorSU5JVERJUiA9IC9ldGMvcmMuZC9pbml0LmQKK2luaXRkZGlyID0gJHtJTklURElSfQorc3lzY29uZmlnZGlyID0gJHtzeXNjb25mZGlyfS9zeXNjb25maWcKK0VCVERfQ01ETElORV9NQVhMTiA9IDIwNDgKK0VCVERfQVJHQ19NQVggPSA1MAorUElQRV9ESVIgPSAvdG1wLyR7UEFDS0FHRV9OQU1FfS12JHtQUk9HVkVSU0lPTn0KK1BJUEUgPSAke1BJUEVfRElSfS9lYnRhYmxlc2RfcGlwZQorCisKK0FDTE9DQUxfQU1GTEFHUyA9IC1JIG00CitBTV9DUFBGTEFHUyA9ICR7cmVndWxhcl9DUFBGTEFHU30gLUkke3RvcF9zcmNkaXJ9L2luY2x1ZGUgXAorCS1EUFJPR1ZFUlNJT049XCIke1BBQ0tBR0VfVkVSU0lPTn1cIiAtRFBST0dOQU1FPVwiJHtQQUNLQUdFX05BTUV9XCIgXAorCS1EUFJPR0RBVEU9XCIke1BST0dEQVRFfVwiIFwKKwktRF9QQVRIX0VUSEVSVFlQRVM9XCIke3N5c2NvbmZkaXJ9L2V0aGVydHlwZXNcIiBcCisJLURMT0NLRklMRT1cIiR7TE9DS0ZJTEV9XCIgXAorCS1ERUJURF9BUkdDX01BWD0ke0VCVERfQVJHQ19NQVh9IC1ERUJURF9DTURMSU5FX01BWExOPSR7RUJURF9DTURMSU5FX01BWExOfSBcCisJLURFQlREX1BJUEU9XCIke1BJUEV9XCIgLURFQlREX1BJUEVfRElSPVwiJHtQSVBFX0RJUn1cIgorQU1fQ0ZMQUdTID0gJHtyZWd1bGFyX0NGTEFHU30KKworc2Jpbl9QUk9HUkFNUyA9IGVidGFibGVzLWxlZ2FjeSBlYnRhYmxlc2QgZWJ0YWJsZXN1IGVidGFibGVzLWxlZ2FjeS1yZXN0b3JlCitFWFRSQV9QUk9HUkFNUyA9IHN0YXRpYyBleGFtcGxlcy91bG9nL3Rlc3RfdWxvZworc3lzY29uZl9EQVRBID0gZXRoZXJ0eXBlcworc2Jpbl9TQ1JJUFRTID0gZWJ0YWJsZXMtbGVnYWN5LXNhdmUKK21hbjhfTUFOUyA9IGVidGFibGVzLWxlZ2FjeS44CitsaWJfTFRMSUJSQVJJRVMgPSBsaWJlYnRjLmxhCisKK2xpYmVidGNfbGFfU09VUkNFUyA9IFwKKwljb21tdW5pY2F0aW9uLmMgZWJ0YWJsZXMuYyBnZXRldGhlcnR5cGUuYyBcCisJbGliZWJ0Yy5jIHVzZWZ1bF9mdW5jdGlvbnMuYyBcCisJZXh0ZW5zaW9ucy9lYnRfODAyXzMuYyBleHRlbnNpb25zL2VidF9hbW9uZy5jIGV4dGVuc2lvbnMvZWJ0X2FycC5jIFwKKwlleHRlbnNpb25zL2VidF9hcnByZXBseS5jIGV4dGVuc2lvbnMvZWJ0X2lwLmMgZXh0ZW5zaW9ucy9lYnRfaXA2LmMgXAorCWV4dGVuc2lvbnMvZWJ0X2xpbWl0LmMgZXh0ZW5zaW9ucy9lYnRfbG9nLmMgZXh0ZW5zaW9ucy9lYnRfbWFyay5jIFwKKwlleHRlbnNpb25zL2VidF9tYXJrX20uYyBleHRlbnNpb25zL2VidF9uYXQuYyBleHRlbnNpb25zL2VidF9uZmxvZy5jIFwKKwlleHRlbnNpb25zL2VidF9wa3R0eXBlLmMgZXh0ZW5zaW9ucy9lYnRfcmVkaXJlY3QuYyBcCisJZXh0ZW5zaW9ucy9lYnRfc3RhbmRhcmQuYyBleHRlbnNpb25zL2VidF9zdHAuYyBleHRlbnNpb25zL2VidF9zdHJpbmcuYyBcCisJZXh0ZW5zaW9ucy9lYnRfdWxvZy5jIGV4dGVuc2lvbnMvZWJ0X3ZsYW4uYyBleHRlbnNpb25zL2VidF9BVURJVC5jIFwKKwlleHRlbnNpb25zL2VidGFibGVfYnJvdXRlLmMgZXh0ZW5zaW9ucy9lYnRhYmxlX2ZpbHRlci5jIFwKKwlleHRlbnNpb25zL2VidGFibGVfbmF0LmMKKyMgTWFrZSBzdXJlIGVidGFibGVzLmMgY2FuIGJlIGJ1aWx0IHR3aWNlCitsaWJlYnRjX2xhX0NQUEZMQUdTID0gJHtBTV9DUFBGTEFHU30KK2VidGFibGVzX2xlZ2FjeV9TT1VSQ0VTID0gZWJ0YWJsZXMtc3RhbmRhbG9uZS5jCitlYnRhYmxlc19sZWdhY3lfTERBREQgPSBsaWJlYnRjLmxhCitlYnRhYmxlc2RfTERBREQgPSBsaWJlYnRjLmxhCitlYnRhYmxlc19sZWdhY3lfcmVzdG9yZV9TT1VSQ0VTID0gZWJ0YWJsZXMtcmVzdG9yZS5jCitlYnRhYmxlc19sZWdhY3lfcmVzdG9yZV9MREFERCA9IGxpYmVidGMubGEKK3N0YXRpY19TT1VSQ0VTID0gZWJ0YWJsZXMuYworc3RhdGljX0xERkxBR1MgPSAtc3RhdGljCitzdGF0aWNfTERBREQgPSBsaWJlYnRjLmxhCitleGFtcGxlc191bG9nX3Rlc3RfdWxvZ19TT1VSQ0VTID0gZXhhbXBsZXMvdWxvZy90ZXN0X3Vsb2cuYyBnZXRldGhlcnR5cGUuYworCitkYWVtb246IGVidGFibGVzZCBlYnRhYmxlc3UKK2V4ZWM6IGVidGFibGVzLWxlZ2FjeSBlYnRhYmxlcy1sZWdhY3ktcmVzdG9yZQorCitDTEVBTkZJTEVTID0gZWJ0YWJsZXMtbGVnYWN5LXNhdmUgZWJ0YWJsZXMtbGVnYWN5LjgKKworZWJ0YWJsZXMtbGVnYWN5LXNhdmU6IGVidGFibGVzLXNhdmUuaW4gJHt0b3BfYnVpbGRkaXJ9L2NvbmZpZy5zdGF0dXMKKwkke0FNX1ZfR0VOfXNlZCAtZSAncyFbQF1zYmluZGlyQCEke3NiaW5kaXJ9IWcnIDwkPCA+JEAKKworZWJ0YWJsZXMtbGVnYWN5Ljg6IGVidGFibGVzLWxlZ2FjeS44LmluICR7dG9wX2J1aWxkZGlyfS9jb25maWcuc3RhdHVzCisJJHtBTV9WX0dFTn1zZWQgLWUgJ3MhW0BdUEFDS0FHRV9WRVJTSU9OQCEke1BBQ0tBR0VfVkVSU0lPTn0hZycgXAorCQktZSAncyFbQF1QQUNLQUdFX0RBVEVAISR7UFJPR0RBVEV9IWcnIFwKKwkJLWUgJ3MhW0BdTE9DS0ZJTEVAISR7TE9DS0ZJTEV9IWcnIDwkPCA+JEAKZGlmZiAtLWdpdCBhL05PVElDRSBiL05PVElDRQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5kMjQ4NDJmCi0tLSAvZGV2L251bGwKKysrIGIvTk9USUNFCkBAIC0wLDAgKzEgQEAKK0NPUFlJTkcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9PV05FUlMgYi9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUxY2I2OQotLS0gL2Rldi9udWxsCisrKyBiL09XTkVSUwpAQCAtMCwwICsxLDUgQEAKK3RhbmdsZWVAZ29vZ2xlLmNvbQoreGRzdW5AZ29vZ2xlLmNvbQorZWxpcmliYmxlQGdvb2dsZS5jb20KK2FsbGVubGludHdvQGdvb2dsZS5jb20KK2psZXZhc3NldXJAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvVEhBTktTIGIvVEhBTktTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOTJlYWQKLS0tIC9kZXYvbnVsbAorKysgYi9USEFOS1MKQEAgLTAsMCArMSw5IEBACitTcGVjaWFsIHRoYW5rcyBnbyBvdXQgdG8gdGhlc2UgZWFybHkgY29udHJpYnV0b3JzOgorCitMZW5uZXJ0IEJ1eXRlbmhlaworUnVzdHkgUnVzc2VsCitIYXJhbGQgV2VsdGUKK0phc29uIEx1bnoKK1RpbSBHYXJkbmVyCitMb+9jIE1pbmllcgorTmljayBGZWRjaGlrCmRpZmYgLS1naXQgYS9hdXRvZ2VuLnNoIGIvYXV0b2dlbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMGM0Mzk1Ci0tLSAvZGV2L251bGwKKysrIGIvYXV0b2dlbi5zaApAQCAtMCwwICsxLDQgQEAKKyMhL2Jpbi9zaCAtZQorCithdXRvcmVjb25mIC1maTsKK3JtIC1SZiBhdXRvbTR0ZSouY2FjaGU7CmRpZmYgLS1naXQgYS9jb21tdW5pY2F0aW9uLmMgYi9jb21tdW5pY2F0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEwNThjMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW11bmljYXRpb24uYwpAQCAtMCwwICsxLDc3MiBAQAorLyoKKyAqIGNvbW11bmljYXRpb24uYywgdjIuMCBKdWx5IDIwMDIKKyAqCisgKiBBdXRob3I6IEJhcnQgRGUgU2NodXltZXIKKyAqCisgKi8KKworLyoKKyAqIEFsbCB0aGUgdXNlcnNwYWNlL2tlcm5lbCBjb21tdW5pY2F0aW9uIGlzIGluIHRoaXMgZmlsZS4KKyAqIFRoZSBvdGhlciBjb2RlIHNob3VsZCBub3QgaGF2ZSB0byBrbm93IGFueXRoaW5nIGFib3V0IHRoZSB3YXkgdGhlCisgKiBrZXJuZWwgbGlrZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgdGFibGUgZGF0YS4KKyAqIFRoZSBvdGhlciBjb2RlIHdvcmtzIHdpdGggbGlua2VkIGxpc3RzLiBTbywgdGhlIHRyYW5zbGF0aW9uIGlzIGRvbmUgaGVyZS4KKyAqLworCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgImluY2x1ZGUvZWJ0YWJsZXNfdS5oIgorCitleHRlcm4gY2hhciogaG9va25hbWVzW05GX0JSX05VTUhPT0tTXTsKKworI2lmZGVmIEtFUk5FTF82NF9VU0VSU1BBQ0VfMzIKKyNkZWZpbmUgc3BhcmNfY2FzdCAodWludDY0X3QpCisjZWxzZQorI2RlZmluZSBzcGFyY19jYXN0CisjZW5kaWYKKworaW50IHNvY2tmZCA9IC0xOworCitzdGF0aWMgaW50IGdldF9zb2NrZmQoKQoreworCWludCByZXQgPSAwOworCWlmIChzb2NrZmQgPT0gLTEpIHsKKwkJc29ja2ZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfUkFXLCBQRl9JTkVUKTsKKwkJaWYgKHNvY2tmZCA8IDApIHsKKwkJCWVidF9wcmludF9lcnJvcigiUHJvYmxlbSBnZXR0aW5nIGEgc29ja2V0LCAiCisJCQkJCSJ5b3UgcHJvYmFibHkgZG9uJ3QgaGF2ZSB0aGUgcmlnaHQgIgorCQkJCQkicGVybWlzc2lvbnMiKTsKKwkJCXJldCA9IC0xOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWJ0X3JlcGxhY2UgKnRyYW5zbGF0ZV91c2VyMmtlcm5lbChzdHJ1Y3QgZWJ0X3VfcmVwbGFjZSAqdV9yZXBsKQoreworCXN0cnVjdCBlYnRfcmVwbGFjZSAqbmV3OworCXN0cnVjdCBlYnRfdV9lbnRyeSAqZTsKKwlzdHJ1Y3QgZWJ0X3VfbWF0Y2hfbGlzdCAqbV9sOworCXN0cnVjdCBlYnRfdV93YXRjaGVyX2xpc3QgKndfbDsKKwlzdHJ1Y3QgZWJ0X3VfZW50cmllcyAqZW50cmllczsKKwljaGFyICpwLCAqYmFzZTsKKwlpbnQgaSwgajsKKwl1bnNpZ25lZCBpbnQgZW50cmllc19zaXplID0gMCwgKmNoYWluX29mZnNldHM7CisKKwluZXcgPSAoc3RydWN0IGVidF9yZXBsYWNlICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgZWJ0X3JlcGxhY2UpKTsKKwlpZiAoIW5ldykKKwkJZWJ0X3ByaW50X21lbW9yeSgpOworCW5ldy0+dmFsaWRfaG9va3MgPSB1X3JlcGwtPnZhbGlkX2hvb2tzOworCXN0cmNweShuZXctPm5hbWUsIHVfcmVwbC0+bmFtZSk7CisJbmV3LT5uZW50cmllcyA9IHVfcmVwbC0+bmVudHJpZXM7CisJbmV3LT5udW1fY291bnRlcnMgPSB1X3JlcGwtPm51bV9jb3VudGVyczsKKwluZXctPmNvdW50ZXJzID0gc3BhcmNfY2FzdCB1X3JlcGwtPmNvdW50ZXJzOworCWNoYWluX29mZnNldHMgPSAodW5zaWduZWQgaW50ICopY2FsbG9jKHVfcmVwbC0+bnVtX2NoYWlucywgc2l6ZW9mKHVuc2lnbmVkIGludCkpOworCWlmICghY2hhaW5fb2Zmc2V0cykKKwkJZWJ0X3ByaW50X21lbW9yeSgpOworCS8qIERldGVybWluZSBzaXplICovCisJZm9yIChpID0gMDsgaSA8IHVfcmVwbC0+bnVtX2NoYWluczsgaSsrKSB7CisJCWlmICghKGVudHJpZXMgPSB1X3JlcGwtPmNoYWluc1tpXSkpCisJCQljb250aW51ZTsKKwkJY2hhaW5fb2Zmc2V0c1tpXSA9IGVudHJpZXNfc2l6ZTsKKwkJZW50cmllc19zaXplICs9IHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJpZXMpOworCQlqID0gMDsKKwkJZSA9IGVudHJpZXMtPmVudHJpZXMtPm5leHQ7CisJCXdoaWxlIChlICE9IGVudHJpZXMtPmVudHJpZXMpIHsKKwkJCWorKzsKKwkJCWVudHJpZXNfc2l6ZSArPSBzaXplb2Yoc3RydWN0IGVidF9lbnRyeSk7CisJCQltX2wgPSBlLT5tX2xpc3Q7CisJCQl3aGlsZSAobV9sKSB7CisJCQkJZW50cmllc19zaXplICs9IG1fbC0+bS0+bWF0Y2hfc2l6ZSArCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBlYnRfZW50cnlfbWF0Y2gpOworCQkJCW1fbCA9IG1fbC0+bmV4dDsKKwkJCX0KKwkJCXdfbCA9IGUtPndfbGlzdDsKKwkJCXdoaWxlICh3X2wpIHsKKwkJCQllbnRyaWVzX3NpemUgKz0gd19sLT53LT53YXRjaGVyX3NpemUgKworCQkJCSAgIHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJ5X3dhdGNoZXIpOworCQkJCXdfbCA9IHdfbC0+bmV4dDsKKwkJCX0KKwkJCWVudHJpZXNfc2l6ZSArPSBlLT50LT50YXJnZXRfc2l6ZSArCisJCQkgICBzaXplb2Yoc3RydWN0IGVidF9lbnRyeV90YXJnZXQpOworCQkJZSA9IGUtPm5leHQ7CisJCX0KKwkJLyogQSBsaXR0bGUgc2FuaXR5IGNoZWNrICovCisJCWlmIChqICE9IGVudHJpZXMtPm5lbnRyaWVzKQorCQkJZWJ0X3ByaW50X2J1ZygiV3JvbmcgbmVudHJpZXM6ICVkICE9ICVkLCBob29rID0gJXMiLCBqLAorCQkJICAgZW50cmllcy0+bmVudHJpZXMsIGVudHJpZXMtPm5hbWUpOworCX0KKworCW5ldy0+ZW50cmllc19zaXplID0gZW50cmllc19zaXplOworCXAgPSAoY2hhciAqKW1hbGxvYyhlbnRyaWVzX3NpemUpOworCWlmICghcCkKKwkJZWJ0X3ByaW50X21lbW9yeSgpOworCisJLyogUHV0IGV2ZXJ5dGhpbmcgaW4gb25lIGJsb2NrICovCisJbmV3LT5lbnRyaWVzID0gc3BhcmNfY2FzdCBwOworCWZvciAoaSA9IDA7IGkgPCB1X3JlcGwtPm51bV9jaGFpbnM7IGkrKykgeworCQlzdHJ1Y3QgZWJ0X2VudHJpZXMgKmhscDsKKworCQlobHAgPSAoc3RydWN0IGVidF9lbnRyaWVzICopcDsKKwkJaWYgKCEoZW50cmllcyA9IHVfcmVwbC0+Y2hhaW5zW2ldKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoaSA8IE5GX0JSX05VTUhPT0tTKQorCQkJbmV3LT5ob29rX2VudHJ5W2ldID0gc3BhcmNfY2FzdCBobHA7CisJCWhscC0+bmVudHJpZXMgPSBlbnRyaWVzLT5uZW50cmllczsKKwkJaGxwLT5wb2xpY3kgPSBlbnRyaWVzLT5wb2xpY3k7CisJCXN0cmNweShobHAtPm5hbWUsIGVudHJpZXMtPm5hbWUpOworCQlobHAtPmNvdW50ZXJfb2Zmc2V0ID0gZW50cmllcy0+Y291bnRlcl9vZmZzZXQ7CisJCWhscC0+ZGlzdGluZ3Vpc2hlciA9IDA7IC8qIE1ha2UgdGhlIGtlcm5lbCBzZWUgdGhlIGxpZ2h0ICovCisJCXAgKz0gc2l6ZW9mKHN0cnVjdCBlYnRfZW50cmllcyk7CisJCWUgPSBlbnRyaWVzLT5lbnRyaWVzLT5uZXh0OworCQl3aGlsZSAoZSAhPSBlbnRyaWVzLT5lbnRyaWVzKSB7CisJCQlzdHJ1Y3QgZWJ0X2VudHJ5ICp0bXAgPSAoc3RydWN0IGVidF9lbnRyeSAqKXA7CisKKwkJCXRtcC0+Yml0bWFzayA9IGUtPmJpdG1hc2sgfCBFQlRfRU5UUllfT1JfRU5UUklFUzsKKwkJCXRtcC0+aW52ZmxhZ3MgPSBlLT5pbnZmbGFnczsKKwkJCXRtcC0+ZXRocHJvdG8gPSBlLT5ldGhwcm90bzsKKwkJCXN0cmNweSh0bXAtPmluLCBlLT5pbik7CisJCQlzdHJjcHkodG1wLT5vdXQsIGUtPm91dCk7CisJCQlzdHJjcHkodG1wLT5sb2dpY2FsX2luLCBlLT5sb2dpY2FsX2luKTsKKwkJCXN0cmNweSh0bXAtPmxvZ2ljYWxfb3V0LCBlLT5sb2dpY2FsX291dCk7CisJCQltZW1jcHkodG1wLT5zb3VyY2VtYWMsIGUtPnNvdXJjZW1hYywKKwkJCSAgIHNpemVvZih0bXAtPnNvdXJjZW1hYykpOworCQkJbWVtY3B5KHRtcC0+c291cmNlbXNrLCBlLT5zb3VyY2Vtc2ssCisJCQkgICBzaXplb2YodG1wLT5zb3VyY2Vtc2spKTsKKwkJCW1lbWNweSh0bXAtPmRlc3RtYWMsIGUtPmRlc3RtYWMsIHNpemVvZih0bXAtPmRlc3RtYWMpKTsKKwkJCW1lbWNweSh0bXAtPmRlc3Rtc2ssIGUtPmRlc3Rtc2ssIHNpemVvZih0bXAtPmRlc3Rtc2spKTsKKworCQkJYmFzZSA9IHA7CisJCQlwICs9IHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJ5KTsKKwkJCW1fbCA9IGUtPm1fbGlzdDsKKwkJCXdoaWxlIChtX2wpIHsKKwkJCQltZW1jcHkocCwgbV9sLT5tLCBtX2wtPm0tPm1hdGNoX3NpemUgKworCQkJCSAgIHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoKSk7CisJCQkJcCArPSBtX2wtPm0tPm1hdGNoX3NpemUgKworCQkJCSAgIHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoKTsKKwkJCQltX2wgPSBtX2wtPm5leHQ7CisJCQl9CisJCQl0bXAtPndhdGNoZXJzX29mZnNldCA9IHAgLSBiYXNlOworCQkJd19sID0gZS0+d19saXN0OworCQkJd2hpbGUgKHdfbCkgeworCQkJCW1lbWNweShwLCB3X2wtPncsIHdfbC0+dy0+d2F0Y2hlcl9zaXplICsKKwkJCQkgICBzaXplb2Yoc3RydWN0IGVidF9lbnRyeV93YXRjaGVyKSk7CisJCQkJcCArPSB3X2wtPnctPndhdGNoZXJfc2l6ZSArCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBlYnRfZW50cnlfd2F0Y2hlcik7CisJCQkJd19sID0gd19sLT5uZXh0OworCQkJfQorCQkJdG1wLT50YXJnZXRfb2Zmc2V0ID0gcCAtIGJhc2U7CisJCQltZW1jcHkocCwgZS0+dCwgZS0+dC0+dGFyZ2V0X3NpemUgKworCQkJICAgc2l6ZW9mKHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0KSk7CisJCQlpZiAoIXN0cmNtcChlLT50LT51Lm5hbWUsIEVCVF9TVEFOREFSRF9UQVJHRVQpKSB7CisJCQkJc3RydWN0IGVidF9zdGFuZGFyZF90YXJnZXQgKnN0ID0KKwkJCQkgICAoc3RydWN0IGVidF9zdGFuZGFyZF90YXJnZXQgKilwOworCQkJCS8qIFRyYW5zbGF0ZSB0aGUganVtcCB0byBhIHVkYyAqLworCQkJCWlmIChzdC0+dmVyZGljdCA+PSAwKQorCQkJCQlzdC0+dmVyZGljdCA9IGNoYWluX29mZnNldHMKKwkJCQkJICAgW3N0LT52ZXJkaWN0ICsgTkZfQlJfTlVNSE9PS1NdOworCQkJfQorCQkJcCArPSBlLT50LT50YXJnZXRfc2l6ZSArCisJCQkgICBzaXplb2Yoc3RydWN0IGVidF9lbnRyeV90YXJnZXQpOworCQkJdG1wLT5uZXh0X29mZnNldCA9IHAgLSBiYXNlOworCQkJZSA9IGUtPm5leHQ7CisJCX0KKwl9CisKKwkvKiBTYW5pdHkgY2hlY2sgKi8KKwlpZiAocCAtIChjaGFyICopbmV3LT5lbnRyaWVzICE9IG5ldy0+ZW50cmllc19zaXplKQorCQllYnRfcHJpbnRfYnVnKCJFbnRyaWVzX3NpemUgYnVnIik7CisJZnJlZShjaGFpbl9vZmZzZXRzKTsKKwlyZXR1cm4gbmV3OworfQorCitzdGF0aWMgdm9pZCBzdG9yZV90YWJsZV9pbl9maWxlKGNoYXIgKmZpbGVuYW1lLCBzdHJ1Y3QgZWJ0X3JlcGxhY2UgKnJlcGwpCit7CisJY2hhciAqZGF0YTsKKwlpbnQgc2l6ZTsKKwlpbnQgZmQ7CisKKwkvKiBTdGFydCBmcm9tIGFuIGVtcHR5IGZpbGUgd2l0aCB0aGUgY29ycmVjdCBwcml2aWxpZ2VzICovCisJaWYgKChmZCA9IGNyZWF0KGZpbGVuYW1lLCAwNjAwKSkgPT0gLTEpIHsKKwkJZWJ0X3ByaW50X2Vycm9yKCJDb3VsZG4ndCBjcmVhdGUgZmlsZSAlcyIsIGZpbGVuYW1lKTsKKwkJcmV0dXJuOworCX0KKworCXNpemUgPSBzaXplb2Yoc3RydWN0IGVidF9yZXBsYWNlKSArIHJlcGwtPmVudHJpZXNfc2l6ZSArCisJICAgcmVwbC0+bmVudHJpZXMgKiBzaXplb2Yoc3RydWN0IGVidF9jb3VudGVyKTsKKwlkYXRhID0gKGNoYXIgKiltYWxsb2Moc2l6ZSk7CisJaWYgKCFkYXRhKQorCQllYnRfcHJpbnRfbWVtb3J5KCk7CisJbWVtY3B5KGRhdGEsIHJlcGwsIHNpemVvZihzdHJ1Y3QgZWJ0X3JlcGxhY2UpKTsKKwltZW1jcHkoZGF0YSArIHNpemVvZihzdHJ1Y3QgZWJ0X3JlcGxhY2UpLCAoY2hhciAqKXJlcGwtPmVudHJpZXMsCisJICAgcmVwbC0+ZW50cmllc19zaXplKTsKKwkvKiBJbml0aWFsaXplIGNvdW50ZXJzIHRvIHplcm8sIGRlbGl2ZXJfY291bnRlcnMoKSBjYW4gdXBkYXRlIHRoZW0gKi8KKwltZW1zZXQoZGF0YSArIHNpemVvZihzdHJ1Y3QgZWJ0X3JlcGxhY2UpICsgcmVwbC0+ZW50cmllc19zaXplLAorCSAgIDAsIHJlcGwtPm5lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBlYnRfY291bnRlcikpOworCWlmICh3cml0ZShmZCwgZGF0YSwgc2l6ZSkgIT0gc2l6ZSkKKwkJZWJ0X3ByaW50X2Vycm9yKCJDb3VsZG4ndCB3cml0ZSBldmVyeXRoaW5nIHRvIGZpbGUgJXMiLAorCQkJCWZpbGVuYW1lKTsKKwljbG9zZShmZCk7CisJZnJlZShkYXRhKTsKK30KKwordm9pZCBlYnRfZGVsaXZlcl90YWJsZShzdHJ1Y3QgZWJ0X3VfcmVwbGFjZSAqdV9yZXBsKQoreworCXNvY2tsZW5fdCBvcHRsZW47CisJc3RydWN0IGVidF9yZXBsYWNlICpyZXBsOworCisJLyogVHJhbnNsYXRlIHRoZSBzdHJ1Y3QgZWJ0X3VfcmVwbGFjZSB0byBhIHN0cnVjdCBlYnRfcmVwbGFjZSAqLworCXJlcGwgPSB0cmFuc2xhdGVfdXNlcjJrZXJuZWwodV9yZXBsKTsKKwlpZiAodV9yZXBsLT5maWxlbmFtZSAhPSBOVUxMKSB7CisJCXN0b3JlX3RhYmxlX2luX2ZpbGUodV9yZXBsLT5maWxlbmFtZSwgcmVwbCk7CisJCWdvdG8gZnJlZV9yZXBsOworCX0KKwkvKiBHaXZlIHRoZSBkYXRhIHRvIHRoZSBrZXJuZWwgKi8KKwlvcHRsZW4gPSBzaXplb2Yoc3RydWN0IGVidF9yZXBsYWNlKSArIHJlcGwtPmVudHJpZXNfc2l6ZTsKKwlpZiAoZ2V0X3NvY2tmZCgpKQorCQlnb3RvIGZyZWVfcmVwbDsKKwlpZiAoIXNldHNvY2tvcHQoc29ja2ZkLCBJUFBST1RPX0lQLCBFQlRfU09fU0VUX0VOVFJJRVMsIHJlcGwsIG9wdGxlbikpCisJCWdvdG8gZnJlZV9yZXBsOworCWlmICh1X3JlcGwtPmNvbW1hbmQgPT0gOCkgeyAvKiBUaGUgZWJ0YWJsZXMgbW9kdWxlIG1heSBub3QKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogeWV0IGJlIGxvYWRlZCB3aXRoIC0tYXRvbWljLWNvbW1pdCAqLworCQllYnRhYmxlc19pbnNtb2QoImVidGFibGVzIik7CisJCWlmICghc2V0c29ja29wdChzb2NrZmQsIElQUFJPVE9fSVAsIEVCVF9TT19TRVRfRU5UUklFUywKKwkJICAgIHJlcGwsIG9wdGxlbikpCisJCQlnb3RvIGZyZWVfcmVwbDsKKwl9CisKKwllYnRfcHJpbnRfZXJyb3IoIlVuYWJsZSB0byB1cGRhdGUgdGhlIGtlcm5lbC4gVHdvIHBvc3NpYmxlIGNhdXNlczpcbiIKKwkJCSIxLiBNdWx0aXBsZSBlYnRhYmxlcyBwcm9ncmFtcyB3ZXJlIGV4ZWN1dGluZyBzaW11bHRhbmVvdXNseS4gVGhlIGVidGFibGVzXG4iCisJCQkiICAgdXNlcnNwYWNlIHRvb2wgZG9lc24ndCBieSBkZWZhdWx0IHN1cHBvcnQgbXVsdGlwbGUgZWJ0YWJsZXMgcHJvZ3JhbXMgcnVubmluZ1xuIgorCQkJIiAgIGNvbmN1cnJlbnRseS4gVGhlIGVidGFibGVzIG9wdGlvbiAtLWNvbmN1cnJlbnQgb3IgYSB0b29sIGxpa2UgZmxvY2sgY2FuIGJlXG4iCisJCQkiICAgdXNlZCB0byBzdXBwb3J0IGNvbmN1cnJlbnQgc2NyaXB0cyB0aGF0IHVwZGF0ZSB0aGUgZWJ0YWJsZXMga2VybmVsIHRhYmxlcy5cbiIKKwkJCSIyLiBUaGUga2VybmVsIGRvZXNuJ3Qgc3VwcG9ydCBhIGNlcnRhaW4gZWJ0YWJsZXMgZXh0ZW5zaW9uLCBjb25zaWRlclxuIgorCQkJIiAgIHJlY29tcGlsaW5nIHlvdXIga2VybmVsIG9yIGluc21vZCB0aGUgZXh0ZW5zaW9uLlxuIik7CitmcmVlX3JlcGw6CisJaWYgKHJlcGwpIHsKKwkJZnJlZShyZXBsLT5lbnRyaWVzKTsKKwkJZnJlZShyZXBsKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc3RvcmVfY291bnRlcnNfaW5fZmlsZShjaGFyICpmaWxlbmFtZSwgc3RydWN0IGVidF91X3JlcGxhY2UgKnJlcGwpCit7CisJaW50IHNpemUgPSByZXBsLT5uZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgZWJ0X2NvdW50ZXIpLCByZXQgPSAwOworCXVuc2lnbmVkIGludCBlbnRyaWVzX3NpemU7CisJc3RydWN0IGVidF9yZXBsYWNlIGhscDsKKwlGSUxFICpmaWxlOworCisJaWYgKCEoZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAicitiIikpKSB7CisJCWVidF9wcmludF9lcnJvcigiQ291bGQgbm90IG9wZW4gZmlsZSAlcyIsIGZpbGVuYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKwkvKiBGaW5kIG91dCBlbnRyaWVzX3NpemUgYW5kIHRoZW4gc2V0IHRoZSBmaWxlIHBvaW50ZXIgdG8gdGhlCisJICogY291bnRlcnMgKi8KKwlpZiAoZnNlZWsoZmlsZSwgKGNoYXIgKikoJmhscC5lbnRyaWVzX3NpemUpIC0gKGNoYXIgKikoJmhscCksIFNFRUtfU0VUKQorCSAgIHx8IGZyZWFkKCZlbnRyaWVzX3NpemUsIHNpemVvZihjaGFyKSwgc2l6ZW9mKHVuc2lnbmVkIGludCksIGZpbGUpICE9CisJICAgc2l6ZW9mKHVuc2lnbmVkIGludCkgfHwKKwkgICBmc2VlayhmaWxlLCBlbnRyaWVzX3NpemUgKyBzaXplb2Yoc3RydWN0IGVidF9yZXBsYWNlKSwgU0VFS19TRVQpKSB7CisJCWVidF9wcmludF9lcnJvcigiRmlsZSAlcyBpcyBjb3JydXB0IiwgZmlsZW5hbWUpOworCQlyZXQgPSAtMTsKKwkJZ290byBjbG9zZV9maWxlOworCX0KKwlpZiAoZndyaXRlKHJlcGwtPmNvdW50ZXJzLCBzaXplb2YoY2hhciksIHNpemUsIGZpbGUpICE9IHNpemUpIHsKKwkJZWJ0X3ByaW50X2Vycm9yKCJDb3VsZCBub3Qgd3JpdGUgZXZlcnl0aGluZyB0byBmaWxlICVzIiwKKwkJCQlmaWxlbmFtZSk7CisJCXJldCA9IC0xOworCX0KK2Nsb3NlX2ZpbGU6CisJZmNsb3NlKGZpbGUpOworCXJldHVybiByZXQ7Cit9CisKKy8qIEdldHMgZXhlY3V0ZWQgYWZ0ZXIgZWJ0X2RlbGl2ZXJfdGFibGUuIERlbGl2ZXJzIHRoZSBjb3VudGVycyB0byB0aGUga2VybmVsCisgKiBhbmQgcmVzZXRzIHRoZSBjb3VudGVyY2hhbmdlcyB0byBDTlRfTk9STSAqLwordm9pZCBlYnRfZGVsaXZlcl9jb3VudGVycyhzdHJ1Y3QgZWJ0X3VfcmVwbGFjZSAqdV9yZXBsKQoreworCXN0cnVjdCBlYnRfY291bnRlciAqb2xkLCAqbmV3LCAqbmV3Y291bnRlcnM7CisJc29ja2xlbl90IG9wdGxlbjsKKwlzdHJ1Y3QgZWJ0X3JlcGxhY2UgcmVwbDsKKwlzdHJ1Y3QgZWJ0X2NudGNoYW5nZXMgKmNjID0gdV9yZXBsLT5jYy0+bmV4dCwgKmNjMjsKKwlzdHJ1Y3QgZWJ0X3VfZW50cmllcyAqZW50cmllcyA9IE5VTEw7CisJc3RydWN0IGVidF91X2VudHJ5ICpuZXh0ID0gTlVMTDsKKwlpbnQgaSwgY2hhaW5uciA9IC0xOworCisJaWYgKHVfcmVwbC0+bmVudHJpZXMgPT0gMCkKKwkJcmV0dXJuOworCisJbmV3Y291bnRlcnMgPSAoc3RydWN0IGVidF9jb3VudGVyICopCisJICAgbWFsbG9jKHVfcmVwbC0+bmVudHJpZXMgKiBzaXplb2Yoc3RydWN0IGVidF9jb3VudGVyKSk7CisJaWYgKCFuZXdjb3VudGVycykKKwkJZWJ0X3ByaW50X21lbW9yeSgpOworCW1lbXNldChuZXdjb3VudGVycywgMCwgdV9yZXBsLT5uZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgZWJ0X2NvdW50ZXIpKTsKKwlvbGQgPSB1X3JlcGwtPmNvdW50ZXJzOworCW5ldyA9IG5ld2NvdW50ZXJzOworCXdoaWxlIChjYyAhPSB1X3JlcGwtPmNjKSB7CisJCWlmICghbmV4dCB8fCBuZXh0ID09IGVudHJpZXMtPmVudHJpZXMpIHsKKwkJCWNoYWlubnIrKzsKKwkJCXdoaWxlIChjaGFpbm5yIDwgdV9yZXBsLT5udW1fY2hhaW5zICYmICghKGVudHJpZXMgPSB1X3JlcGwtPmNoYWluc1tjaGFpbm5yXSkgfHwKKwkJCSAgICAgICAobmV4dCA9IGVudHJpZXMtPmVudHJpZXMtPm5leHQpID09IGVudHJpZXMtPmVudHJpZXMpKQorCQkJCWNoYWlubnIrKzsKKwkJCWlmIChjaGFpbm5yID09IHVfcmVwbC0+bnVtX2NoYWlucykKKwkJCQlicmVhazsKKwkJfQorCQlpZiAobmV4dCA9PSBOVUxMKQorCQkJZWJ0X3ByaW50X2J1ZygibmV4dCA9PSBOVUxMIik7CisJCWlmIChjYy0+dHlwZSA9PSBDTlRfTk9STSkgeworCQkJLyogJ05vcm1hbCcgcnVsZSwgbWVhbmluZyB3ZSBkaWRuJ3QgZG8gYW55dGhpbmcgdG8gaXQKKwkJCSAqIFNvLCB3ZSBqdXN0IGNvcHkgKi8KKwkJCSpuZXcgPSAqb2xkOworCQkJbmV4dC0+Y250ID0gKm5ldzsKKwkJCW5leHQtPmNudF9zdXJwbHVzLnBjbnQgPSBuZXh0LT5jbnRfc3VycGx1cy5iY250ID0gMDsKKwkJCW9sZCsrOyAvKiBXZSd2ZSB1c2VkIGFuIG9sZCBjb3VudGVyICovCisJCQluZXcrKzsgLyogV2UndmUgc2V0IGEgbmV3IGNvdW50ZXIgKi8KKwkJCW5leHQgPSBuZXh0LT5uZXh0OworCQl9IGVsc2UgaWYgKGNjLT50eXBlID09IENOVF9ERUwpIHsKKwkJCW9sZCsrOyAvKiBEb24ndCB1c2UgdGhpcyBvbGQgY291bnRlciAqLworCQl9IGVsc2UgeworCQkJaWYgKGNjLT50eXBlID09IENOVF9DSEFOR0UpIHsKKwkJCQlpZiAoY2MtPmNoYW5nZSAlIDMgPT0gMSkKKwkJCQkJbmV3LT5wY250ID0gb2xkLT5wY250ICsgbmV4dC0+Y250X3N1cnBsdXMucGNudDsKKwkJCQllbHNlIGlmIChjYy0+Y2hhbmdlICUgMyA9PSAyKQorCQkJCQluZXctPnBjbnQgPSBvbGQtPnBjbnQgLSBuZXh0LT5jbnRfc3VycGx1cy5wY250OworCQkJCWVsc2UKKwkJCQkJbmV3LT5wY250ID0gbmV4dC0+Y250LnBjbnQ7CisJCQkJaWYgKGNjLT5jaGFuZ2UgLyAzID09IDEpCisJCQkJCW5ldy0+YmNudCA9IG9sZC0+YmNudCArIG5leHQtPmNudF9zdXJwbHVzLmJjbnQ7CisJCQkJZWxzZSBpZiAoY2MtPmNoYW5nZSAvIDMgPT0gMikKKwkJCQkJbmV3LT5iY250ID0gb2xkLT5iY250IC0gbmV4dC0+Y250X3N1cnBsdXMuYmNudDsKKwkJCQllbHNlCisJCQkJCW5ldy0+YmNudCA9IG5leHQtPmNudC5iY250OworCQkJfSBlbHNlCisJCQkJKm5ldyA9IG5leHQtPmNudDsKKwkJCW5leHQtPmNudCA9ICpuZXc7CisJCQluZXh0LT5jbnRfc3VycGx1cy5wY250ID0gbmV4dC0+Y250X3N1cnBsdXMuYmNudCA9IDA7CisJCQlpZiAoY2MtPnR5cGUgPT0gQ05UX0FERCkKKwkJCQluZXcrKzsKKwkJCWVsc2UgeworCQkJCW9sZCsrOworCQkJCW5ldysrOworCQkJfQorCQkJbmV4dCA9IG5leHQtPm5leHQ7CisJCX0KKwkJY2MgPSBjYy0+bmV4dDsKKwl9CisKKwlmcmVlKHVfcmVwbC0+Y291bnRlcnMpOworCXVfcmVwbC0+Y291bnRlcnMgPSBuZXdjb3VudGVyczsKKwl1X3JlcGwtPm51bV9jb3VudGVycyA9IHVfcmVwbC0+bmVudHJpZXM7CisJLyogUmVzZXQgdGhlIGNvdW50ZXJjaGFuZ2VzIHRvIENOVF9OT1JNIGFuZCBkZWxldGUgdGhlIHVudXNlZCBjYyAqLworCWkgPSAwOworCWNjID0gdV9yZXBsLT5jYy0+bmV4dDsKKwl3aGlsZSAoY2MgIT0gdV9yZXBsLT5jYykgeworCQlpZiAoY2MtPnR5cGUgPT0gQ05UX0RFTCkgeworCQkJY2MtPnByZXYtPm5leHQgPSBjYy0+bmV4dDsKKwkJCWNjLT5uZXh0LT5wcmV2ID0gY2MtPnByZXY7CisJCQljYzIgPSBjYy0+bmV4dDsKKwkJCWZyZWUoY2MpOworCQkJY2MgPSBjYzI7CisJCX0gZWxzZSB7CisJCQljYy0+dHlwZSA9IENOVF9OT1JNOworCQkJY2MtPmNoYW5nZSA9IDA7CisJCQlpKys7CisJCQljYyA9IGNjLT5uZXh0OworCQl9CisJfQorCWlmIChpICE9IHVfcmVwbC0+bmVudHJpZXMpCisJCWVidF9wcmludF9idWcoImkgIT0gdV9yZXBsLT5uZW50cmllcyIpOworCWlmICh1X3JlcGwtPmZpbGVuYW1lICE9IE5VTEwpIHsKKwkJc3RvcmVfY291bnRlcnNfaW5fZmlsZSh1X3JlcGwtPmZpbGVuYW1lLCB1X3JlcGwpOworCQlyZXR1cm47CisJfQorCW9wdGxlbiA9IHVfcmVwbC0+bmVudHJpZXMgKiBzaXplb2Yoc3RydWN0IGVidF9jb3VudGVyKSArCisJICAgc2l6ZW9mKHN0cnVjdCBlYnRfcmVwbGFjZSk7CisJLyogTm93IHB1dCB0aGUgc3R1ZmYgaW4gdGhlIGtlcm5lbCdzIHN0cnVjdCBlYnRfcmVwbGFjZSAqLworCXJlcGwuY291bnRlcnMgPSBzcGFyY19jYXN0IHVfcmVwbC0+Y291bnRlcnM7CisJcmVwbC5udW1fY291bnRlcnMgPSB1X3JlcGwtPm51bV9jb3VudGVyczsKKwltZW1jcHkocmVwbC5uYW1lLCB1X3JlcGwtPm5hbWUsIHNpemVvZihyZXBsLm5hbWUpKTsKKworCWlmIChnZXRfc29ja2ZkKCkpCisJCXJldHVybjsKKwlpZiAoc2V0c29ja29wdChzb2NrZmQsIElQUFJPVE9fSVAsIEVCVF9TT19TRVRfQ09VTlRFUlMsICZyZXBsLCBvcHRsZW4pKQorCQllYnRfcHJpbnRfYnVnKCJDb3VsZG4ndCB1cGRhdGUga2VybmVsIGNvdW50ZXJzIik7Cit9CisKK3N0YXRpYyBpbnQKK2VidF90cmFuc2xhdGVfbWF0Y2goc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbSwgc3RydWN0IGVidF91X21hdGNoX2xpc3QgKioqbCkKK3sKKwlzdHJ1Y3QgZWJ0X3VfbWF0Y2hfbGlzdCAqbmV3OworCWludCByZXQgPSAwOworCisJbmV3ID0gKHN0cnVjdCBlYnRfdV9tYXRjaF9saXN0ICopCisJICAgbWFsbG9jKHNpemVvZihzdHJ1Y3QgZWJ0X3VfbWF0Y2hfbGlzdCkpOworCWlmICghbmV3KQorCQllYnRfcHJpbnRfbWVtb3J5KCk7CisJbmV3LT5tID0gKHN0cnVjdCBlYnRfZW50cnlfbWF0Y2ggKikKKwkgICBtYWxsb2MobS0+bWF0Y2hfc2l6ZSArIHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoKSk7CisJaWYgKCFuZXctPm0pCisJCWVidF9wcmludF9tZW1vcnkoKTsKKwltZW1jcHkobmV3LT5tLCBtLCBtLT5tYXRjaF9zaXplICsgc2l6ZW9mKHN0cnVjdCBlYnRfZW50cnlfbWF0Y2gpKTsKKwluZXctPm5leHQgPSBOVUxMOworCSoqbCA9IG5ldzsKKwkqbCA9ICZuZXctPm5leHQ7CisJaWYgKGVidF9maW5kX21hdGNoKG5ldy0+bS0+dS5uYW1lKSA9PSBOVUxMKSB7CisJCWVidF9wcmludF9lcnJvcigiS2VybmVsIG1hdGNoICVzIHVuc3VwcG9ydGVkIGJ5IHVzZXJzcGFjZSB0b29sIiwKKwkJCQluZXctPm0tPnUubmFtZSk7CisJCXJldCA9IC0xOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitlYnRfdHJhbnNsYXRlX3dhdGNoZXIoc3RydWN0IGVidF9lbnRyeV93YXRjaGVyICp3LAorICAgc3RydWN0IGVidF91X3dhdGNoZXJfbGlzdCAqKipsKQoreworCXN0cnVjdCBlYnRfdV93YXRjaGVyX2xpc3QgKm5ldzsKKwlpbnQgcmV0ID0gMDsKKworCW5ldyA9IChzdHJ1Y3QgZWJ0X3Vfd2F0Y2hlcl9saXN0ICopCisJICAgbWFsbG9jKHNpemVvZihzdHJ1Y3QgZWJ0X3Vfd2F0Y2hlcl9saXN0KSk7CisJaWYgKCFuZXcpCisJCWVidF9wcmludF9tZW1vcnkoKTsKKwluZXctPncgPSAoc3RydWN0IGVidF9lbnRyeV93YXRjaGVyICopCisJICAgbWFsbG9jKHctPndhdGNoZXJfc2l6ZSArIHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJ5X3dhdGNoZXIpKTsKKwlpZiAoIW5ldy0+dykKKwkJZWJ0X3ByaW50X21lbW9yeSgpOworCW1lbWNweShuZXctPncsIHcsIHctPndhdGNoZXJfc2l6ZSArIHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJ5X3dhdGNoZXIpKTsKKwluZXctPm5leHQgPSBOVUxMOworCSoqbCA9IG5ldzsKKwkqbCA9ICZuZXctPm5leHQ7CisJaWYgKGVidF9maW5kX3dhdGNoZXIobmV3LT53LT51Lm5hbWUpID09IE5VTEwpIHsKKwkJZWJ0X3ByaW50X2Vycm9yKCJLZXJuZWwgd2F0Y2hlciAlcyB1bnN1cHBvcnRlZCBieSB1c2Vyc3BhY2UgIgorCQkJCSJ0b29sIiwgbmV3LT53LT51Lm5hbWUpOworCQlyZXQgPSAtMTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorZWJ0X3RyYW5zbGF0ZV9lbnRyeShzdHJ1Y3QgZWJ0X2VudHJ5ICplLCBpbnQgKmhvb2ssIGludCAqbiwgaW50ICpjbnQsCisgICBpbnQgKnRvdGFsY250LCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKip1X2UsIHN0cnVjdCBlYnRfdV9yZXBsYWNlICp1X3JlcGwsCisgICB1bnNpZ25lZCBpbnQgdmFsaWRfaG9va3MsIGNoYXIgKmJhc2UsIHN0cnVjdCBlYnRfY250Y2hhbmdlcyAqKmNjKQoreworCS8qIEFuIGVudHJ5ICovCisJaWYgKGUtPmJpdG1hc2sgJiBFQlRfRU5UUllfT1JfRU5UUklFUykgeworCQlzdHJ1Y3QgZWJ0X3VfZW50cnkgKm5ldzsKKwkJc3RydWN0IGVidF91X21hdGNoX2xpc3QgKiptX2w7CisJCXN0cnVjdCBlYnRfdV93YXRjaGVyX2xpc3QgKip3X2w7CisJCXN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICp0OworCisJCW5ldyA9IChzdHJ1Y3QgZWJ0X3VfZW50cnkgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBlYnRfdV9lbnRyeSkpOworCQlpZiAoIW5ldykKKwkJCWVidF9wcmludF9tZW1vcnkoKTsKKwkJbmV3LT5iaXRtYXNrID0gZS0+Yml0bWFzazsKKwkJLyoKKwkJICogUGxhaW4gdXNlcnNwYWNlIGNvZGUgZG9lc24ndCBrbm93IGFib3V0CisJCSAqIEVCVF9FTlRSWV9PUl9FTlRSSUVTCisJCSAqLworCQluZXctPmJpdG1hc2sgJj0gfkVCVF9FTlRSWV9PUl9FTlRSSUVTOworCQluZXctPmludmZsYWdzID0gZS0+aW52ZmxhZ3M7CisJCW5ldy0+ZXRocHJvdG8gPSBlLT5ldGhwcm90bzsKKwkJc3RyY3B5KG5ldy0+aW4sIGUtPmluKTsKKwkJc3RyY3B5KG5ldy0+b3V0LCBlLT5vdXQpOworCQlzdHJjcHkobmV3LT5sb2dpY2FsX2luLCBlLT5sb2dpY2FsX2luKTsKKwkJc3RyY3B5KG5ldy0+bG9naWNhbF9vdXQsIGUtPmxvZ2ljYWxfb3V0KTsKKwkJbWVtY3B5KG5ldy0+c291cmNlbWFjLCBlLT5zb3VyY2VtYWMsIHNpemVvZihuZXctPnNvdXJjZW1hYykpOworCQltZW1jcHkobmV3LT5zb3VyY2Vtc2ssIGUtPnNvdXJjZW1zaywgc2l6ZW9mKG5ldy0+c291cmNlbXNrKSk7CisJCW1lbWNweShuZXctPmRlc3RtYWMsIGUtPmRlc3RtYWMsIHNpemVvZihuZXctPmRlc3RtYWMpKTsKKwkJbWVtY3B5KG5ldy0+ZGVzdG1zaywgZS0+ZGVzdG1zaywgc2l6ZW9mKG5ldy0+ZGVzdG1zaykpOworCQlpZiAoKnRvdGFsY250ID49IHVfcmVwbC0+bmVudHJpZXMpCisJCQllYnRfcHJpbnRfYnVnKCIqdG90YWxjbnQgPj0gdV9yZXBsLT5uZW50cmllcyIpOworCQluZXctPmNudCA9IHVfcmVwbC0+Y291bnRlcnNbKnRvdGFsY250XTsKKwkJbmV3LT5jbnRfc3VycGx1cy5wY250ID0gbmV3LT5jbnRfc3VycGx1cy5iY250ID0gMDsKKwkJbmV3LT5jYyA9ICpjYzsKKwkJKmNjID0gKCpjYyktPm5leHQ7CisJCW5ldy0+bV9saXN0ID0gTlVMTDsKKwkJbmV3LT53X2xpc3QgPSBOVUxMOworCQluZXctPm5leHQgPSAoKnVfZSktPm5leHQ7CisJCW5ldy0+bmV4dC0+cHJldiA9IG5ldzsKKwkJKCp1X2UpLT5uZXh0ID0gbmV3OworCQluZXctPnByZXYgPSAqdV9lOworCQkqdV9lID0gbmV3OworCQltX2wgPSAmbmV3LT5tX2xpc3Q7CisJCUVCVF9NQVRDSF9JVEVSQVRFKGUsIGVidF90cmFuc2xhdGVfbWF0Y2gsICZtX2wpOworCQl3X2wgPSAmbmV3LT53X2xpc3Q7CisJCUVCVF9XQVRDSEVSX0lURVJBVEUoZSwgZWJ0X3RyYW5zbGF0ZV93YXRjaGVyLCAmd19sKTsKKworCQl0ID0gKHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICopKCgoY2hhciAqKWUpICsgZS0+dGFyZ2V0X29mZnNldCk7CisJCW5ldy0+dCA9IChzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqKQorCQkgICBtYWxsb2ModC0+dGFyZ2V0X3NpemUgKyBzaXplb2Yoc3RydWN0IGVidF9lbnRyeV90YXJnZXQpKTsKKwkJaWYgKCFuZXctPnQpCisJCQllYnRfcHJpbnRfbWVtb3J5KCk7CisJCWlmIChlYnRfZmluZF90YXJnZXQodC0+dS5uYW1lKSA9PSBOVUxMKSB7CisJCQllYnRfcHJpbnRfZXJyb3IoIktlcm5lbCB0YXJnZXQgJXMgdW5zdXBwb3J0ZWQgYnkgIgorCQkJCQkidXNlcnNwYWNlIHRvb2wiLCB0LT51Lm5hbWUpOworCQkJcmV0dXJuIC0xOworCQl9CisJCW1lbWNweShuZXctPnQsIHQsIHQtPnRhcmdldF9zaXplICsKKwkJICAgc2l6ZW9mKHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0KSk7CisJCS8qIERlYWwgd2l0aCBqdW1wcyB0byB1ZGMgKi8KKwkJaWYgKCFzdHJjbXAodC0+dS5uYW1lLCBFQlRfU1RBTkRBUkRfVEFSR0VUKSkgeworCQkJY2hhciAqdG1wID0gYmFzZTsKKwkJCWludCB2ZXJkaWN0ID0gKChzdHJ1Y3QgZWJ0X3N0YW5kYXJkX3RhcmdldCAqKXQpLT52ZXJkaWN0OworCQkJaW50IGk7CisKKwkJCWlmICh2ZXJkaWN0ID49IDApIHsKKwkJCQl0bXAgKz0gdmVyZGljdDsKKwkJCQlmb3IgKGkgPSBORl9CUl9OVU1IT09LUzsgaSA8IHVfcmVwbC0+bnVtX2NoYWluczsgaSsrKQorCQkJCQlpZiAodV9yZXBsLT5jaGFpbnNbaV0tPmtlcm5lbF9zdGFydCA9PSB0bXApCisJCQkJCQlicmVhazsKKwkJCQlpZiAoaSA9PSB1X3JlcGwtPm51bV9jaGFpbnMpCisJCQkJCWVidF9wcmludF9idWcoIkNhbid0IGZpbmQgdWRjIGZvciBqdW1wIik7CisJCQkJKChzdHJ1Y3QgZWJ0X3N0YW5kYXJkX3RhcmdldCAqKW5ldy0+dCktPnZlcmRpY3QgPSBpLU5GX0JSX05VTUhPT0tTOworCQkJfQorCQl9CisKKwkJKCpjbnQpKys7CisJCSgqdG90YWxjbnQpKys7CisJCXJldHVybiAwOworCX0gZWxzZSB7IC8qIEEgbmV3IGNoYWluICovCisJCWludCBpOworCQlzdHJ1Y3QgZWJ0X2VudHJpZXMgKmVudHJpZXMgPSAoc3RydWN0IGVidF9lbnRyaWVzICopZTsKKworCQlpZiAoKm4gIT0gKmNudCkKKwkJCWVidF9wcmludF9idWcoIk5yIG9mIGVudHJpZXMgaW4gdGhlIGNoYWluIGlzIHdyb25nIik7CisJCSpuID0gZW50cmllcy0+bmVudHJpZXM7CisJCSpjbnQgPSAwOworCQlmb3IgKGkgPSAqaG9vayArIDE7IGkgPCBORl9CUl9OVU1IT09LUzsgaSsrKQorCQkJaWYgKHZhbGlkX2hvb2tzICYgKDEgPDwgaSkpCisJCQkJYnJlYWs7CisJCSpob29rID0gaTsKKwkJKnVfZSA9IHVfcmVwbC0+Y2hhaW5zWypob29rXS0+ZW50cmllczsKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKiBJbml0aWFsaXplIGFsbCBjaGFpbiBoZWFkZXJzICovCitzdGF0aWMgaW50CitlYnRfdHJhbnNsYXRlX2NoYWlucyhzdHJ1Y3QgZWJ0X2VudHJ5ICplLCBpbnQgKmhvb2ssCisgICBzdHJ1Y3QgZWJ0X3VfcmVwbGFjZSAqdV9yZXBsLCB1bnNpZ25lZCBpbnQgdmFsaWRfaG9va3MpCit7CisJaW50IGk7CisJc3RydWN0IGVidF9lbnRyaWVzICplbnRyaWVzID0gKHN0cnVjdCBlYnRfZW50cmllcyAqKWU7CisJc3RydWN0IGVidF91X2VudHJpZXMgKm5ldzsKKworCWlmICghKGUtPmJpdG1hc2sgJiBFQlRfRU5UUllfT1JfRU5UUklFUykpIHsKKwkJZm9yIChpID0gKmhvb2sgKyAxOyBpIDwgTkZfQlJfTlVNSE9PS1M7IGkrKykKKwkJCWlmICh2YWxpZF9ob29rcyAmICgxIDw8IGkpKQorCQkJCWJyZWFrOworCQluZXcgPSAoc3RydWN0IGVidF91X2VudHJpZXMgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBlYnRfdV9lbnRyaWVzKSk7CisJCWlmICghbmV3KQorCQkJZWJ0X3ByaW50X21lbW9yeSgpOworCQlpZiAoaSA9PSB1X3JlcGwtPm1heF9jaGFpbnMpCisJCQllYnRfZG91YmxlX2NoYWlucyh1X3JlcGwpOworCQl1X3JlcGwtPmNoYWluc1tpXSA9IG5ldzsKKwkJaWYgKGkgPj0gTkZfQlJfTlVNSE9PS1MpCisJCQluZXctPmtlcm5lbF9zdGFydCA9IChjaGFyICopZTsKKwkJKmhvb2sgPSBpOworCQluZXctPm5lbnRyaWVzID0gZW50cmllcy0+bmVudHJpZXM7CisJCW5ldy0+cG9saWN5ID0gZW50cmllcy0+cG9saWN5OworCQluZXctPmVudHJpZXMgPSAoc3RydWN0IGVidF91X2VudHJ5ICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgZWJ0X3VfZW50cnkpKTsKKwkJaWYgKCFuZXctPmVudHJpZXMpCisJCQllYnRfcHJpbnRfbWVtb3J5KCk7CisJCW5ldy0+ZW50cmllcy0+bmV4dCA9IG5ldy0+ZW50cmllcy0+cHJldiA9IG5ldy0+ZW50cmllczsKKwkJbmV3LT5jb3VudGVyX29mZnNldCA9IGVudHJpZXMtPmNvdW50ZXJfb2Zmc2V0OworCQlzdHJjcHkobmV3LT5uYW1lLCBlbnRyaWVzLT5uYW1lKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmV0cmlldmVfZnJvbV9maWxlKGNoYXIgKmZpbGVuYW1lLCBzdHJ1Y3QgZWJ0X3JlcGxhY2UgKnJlcGwsCisgICBjaGFyIGNvbW1hbmQpCit7CisJRklMRSAqZmlsZTsKKwljaGFyICpobHAgPSBOVUxMLCAqZW50cmllczsKKwlzdHJ1Y3QgZWJ0X2NvdW50ZXIgKmNvdW50ZXJzOworCWludCBzaXplLCByZXQgPSAwOworCisJaWYgKCEoZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAicitiIikpKSB7CisJCWVidF9wcmludF9lcnJvcigiQ291bGQgbm90IG9wZW4gZmlsZSAlcyIsIGZpbGVuYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKwkvKiBNYWtlIHN1cmUgdGFibGUgbmFtZSBpcyByaWdodCBpZiBjb21tYW5kIGlzbid0IC1MIG9yIC0tYXRvbWljLWNvbW1pdCAqLworCWlmIChjb21tYW5kICE9ICdMJyAmJiBjb21tYW5kICE9IDgpIHsKKwkJaGxwID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKHJlcGwtPm5hbWUpICsgMSk7CisJCWlmICghaGxwKQorCQkJZWJ0X3ByaW50X21lbW9yeSgpOworCQlzdHJjcHkoaGxwLCByZXBsLT5uYW1lKTsKKwl9CisJaWYgKGZyZWFkKHJlcGwsIHNpemVvZihjaGFyKSwgc2l6ZW9mKHN0cnVjdCBlYnRfcmVwbGFjZSksIGZpbGUpCisJICAgIT0gc2l6ZW9mKHN0cnVjdCBlYnRfcmVwbGFjZSkpIHsKKwkJZWJ0X3ByaW50X2Vycm9yKCJGaWxlICVzIGlzIGNvcnJ1cHQiLCBmaWxlbmFtZSk7CisJCXJldCA9IC0xOworCQlnb3RvIGNsb3NlX2ZpbGU7CisJfQorCWlmIChjb21tYW5kICE9ICdMJyAmJiBjb21tYW5kICE9IDggJiYgc3RyY21wKGhscCwgcmVwbC0+bmFtZSkpIHsKKwkJZWJ0X3ByaW50X2Vycm9yKCJGaWxlICVzIGNvbnRhaW5zIHdyb25nIHRhYmxlIG5hbWUgb3IgaXMgIgorCQkJCSJjb3JydXB0IiwgZmlsZW5hbWUpOworCQlyZXQgPSAtMTsKKwkJZ290byBjbG9zZV9maWxlOworCX0gZWxzZSBpZiAoIWVidF9maW5kX3RhYmxlKHJlcGwtPm5hbWUpKSB7CisJCWVidF9wcmludF9lcnJvcigiRmlsZSAlcyBjb250YWlucyBpbnZhbGlkIHRhYmxlIG5hbWUiLAorCQkJCWZpbGVuYW1lKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gY2xvc2VfZmlsZTsKKwl9CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBlYnRfcmVwbGFjZSkgKworCSAgIHJlcGwtPm5lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBlYnRfY291bnRlcikgKyByZXBsLT5lbnRyaWVzX3NpemU7CisJZnNlZWsoZmlsZSwgMCwgU0VFS19FTkQpOworCWlmIChzaXplICE9IGZ0ZWxsKGZpbGUpKSB7CisJCWVidF9wcmludF9lcnJvcigiRmlsZSAlcyBoYXMgd3Jvbmcgc2l6ZSIsIGZpbGVuYW1lKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gY2xvc2VfZmlsZTsKKwl9CisJZW50cmllcyA9IChjaGFyICopbWFsbG9jKHJlcGwtPmVudHJpZXNfc2l6ZSk7CisJaWYgKCFlbnRyaWVzKQorCQllYnRfcHJpbnRfbWVtb3J5KCk7CisJcmVwbC0+ZW50cmllcyA9IHNwYXJjX2Nhc3QgZW50cmllczsKKwlpZiAocmVwbC0+bmVudHJpZXMpIHsKKwkJY291bnRlcnMgPSAoc3RydWN0IGVidF9jb3VudGVyICopCisJCSAgIG1hbGxvYyhyZXBsLT5uZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgZWJ0X2NvdW50ZXIpKTsKKwkJcmVwbC0+Y291bnRlcnMgPSBzcGFyY19jYXN0IGNvdW50ZXJzOworCQlpZiAoIXJlcGwtPmNvdW50ZXJzKQorCQkJZWJ0X3ByaW50X21lbW9yeSgpOworCX0gZWxzZQorCQlyZXBsLT5jb3VudGVycyA9IHNwYXJjX2Nhc3QgTlVMTDsKKwkvKiBDb3B5IGVudHJpZXMgYW5kIGNvdW50ZXJzICovCisJaWYgKGZzZWVrKGZpbGUsIHNpemVvZihzdHJ1Y3QgZWJ0X3JlcGxhY2UpLCBTRUVLX1NFVCkgfHwKKwkgICBmcmVhZCgoY2hhciAqKXJlcGwtPmVudHJpZXMsIHNpemVvZihjaGFyKSwgcmVwbC0+ZW50cmllc19zaXplLCBmaWxlKQorCSAgICE9IHJlcGwtPmVudHJpZXNfc2l6ZSB8fAorCSAgIGZzZWVrKGZpbGUsIHNpemVvZihzdHJ1Y3QgZWJ0X3JlcGxhY2UpICsgcmVwbC0+ZW50cmllc19zaXplLAorCQkgU0VFS19TRVQpCisJICAgfHwgKHJlcGwtPmNvdW50ZXJzICYmIGZyZWFkKChjaGFyICopcmVwbC0+Y291bnRlcnMsIHNpemVvZihjaGFyKSwKKwkgICByZXBsLT5uZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgZWJ0X2NvdW50ZXIpLCBmaWxlKQorCSAgICE9IHJlcGwtPm5lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBlYnRfY291bnRlcikpKSB7CisJCWVidF9wcmludF9lcnJvcigiRmlsZSAlcyBpcyBjb3JydXB0IiwgZmlsZW5hbWUpOworCQlmcmVlKGVudHJpZXMpOworCQlyZXBsLT5lbnRyaWVzID0gTlVMTDsKKwkJcmV0ID0gLTE7CisJfQorY2xvc2VfZmlsZToKKwlmY2xvc2UoZmlsZSk7CisJZnJlZShobHApOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmV0cmlldmVfZnJvbV9rZXJuZWwoc3RydWN0IGVidF9yZXBsYWNlICpyZXBsLCBjaGFyIGNvbW1hbmQsCisJCQkJaW50IGluaXQpCit7CisJc29ja2xlbl90IG9wdGxlbjsKKwlpbnQgb3B0bmFtZTsKKwljaGFyICplbnRyaWVzOworCisJb3B0bGVuID0gc2l6ZW9mKHN0cnVjdCBlYnRfcmVwbGFjZSk7CisJaWYgKGdldF9zb2NrZmQoKSkKKwkJcmV0dXJuIC0xOworCS8qIC0tYXRvbWljLWluaXQgfHwgLS1pbml0LXRhYmxlICovCisJaWYgKGluaXQpCisJCW9wdG5hbWUgPSBFQlRfU09fR0VUX0lOSVRfSU5GTzsKKwllbHNlCisJCW9wdG5hbWUgPSBFQlRfU09fR0VUX0lORk87CisJaWYgKGdldHNvY2tvcHQoc29ja2ZkLCBJUFBST1RPX0lQLCBvcHRuYW1lLCByZXBsLCAmb3B0bGVuKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKCAhKGVudHJpZXMgPSAoY2hhciAqKW1hbGxvYyhyZXBsLT5lbnRyaWVzX3NpemUpKSApCisJCWVidF9wcmludF9tZW1vcnkoKTsKKwlyZXBsLT5lbnRyaWVzID0gc3BhcmNfY2FzdCBlbnRyaWVzOworCWlmIChyZXBsLT5uZW50cmllcykgeworCQlzdHJ1Y3QgZWJ0X2NvdW50ZXIgKmNvdW50ZXJzOworCisJCWlmICghKGNvdW50ZXJzID0gKHN0cnVjdCBlYnRfY291bnRlciAqKQorCQkgICBtYWxsb2MocmVwbC0+bmVudHJpZXMgKiBzaXplb2Yoc3RydWN0IGVidF9jb3VudGVyKSkpICkKKwkJCWVidF9wcmludF9tZW1vcnkoKTsKKwkJcmVwbC0+Y291bnRlcnMgPSBzcGFyY19jYXN0IGNvdW50ZXJzOworCX0KKwllbHNlCisJCXJlcGwtPmNvdW50ZXJzID0gc3BhcmNfY2FzdCBOVUxMOworCisJLyogV2Ugd2FudCB0byByZWNlaXZlIHRoZSBjb3VudGVycyAqLworCXJlcGwtPm51bV9jb3VudGVycyA9IHJlcGwtPm5lbnRyaWVzOworCW9wdGxlbiArPSByZXBsLT5lbnRyaWVzX3NpemUgKyByZXBsLT5udW1fY291bnRlcnMgKgorCSAgIHNpemVvZihzdHJ1Y3QgZWJ0X2NvdW50ZXIpOworCWlmIChpbml0KQorCQlvcHRuYW1lID0gRUJUX1NPX0dFVF9JTklUX0VOVFJJRVM7CisJZWxzZQorCQlvcHRuYW1lID0gRUJUX1NPX0dFVF9FTlRSSUVTOworCWlmIChnZXRzb2Nrb3B0KHNvY2tmZCwgSVBQUk9UT19JUCwgb3B0bmFtZSwgcmVwbCwgJm9wdGxlbikpCisJCWVidF9wcmludF9idWcoIkhtbSwgd2hhdCBpcyB3cm9uZz8/PyBidWcjMSIpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBlYnRfZ2V0X3RhYmxlKHN0cnVjdCBlYnRfdV9yZXBsYWNlICp1X3JlcGwsIGludCBpbml0KQoreworCWludCBpLCBqLCBrLCBob29rOworCXN0cnVjdCBlYnRfcmVwbGFjZSByZXBsOworCXN0cnVjdCBlYnRfdV9lbnRyeSAqdV9lID0gTlVMTDsKKwlzdHJ1Y3QgZWJ0X2NudGNoYW5nZXMgKm5ld19jYyA9IE5VTEwsICpjYzsKKworCXN0cmNweShyZXBsLm5hbWUsIHVfcmVwbC0+bmFtZSk7CisJaWYgKHVfcmVwbC0+ZmlsZW5hbWUgIT0gTlVMTCkgeworCQlpZiAoaW5pdCkKKwkJCWVidF9wcmludF9idWcoIkdldHRpbmcgaW5pdGlhbCB0YWJsZSBkYXRhIGZyb20gYSBmaWxlIGlzIGltcG9zc2libGUiKTsKKwkJaWYgKHJldHJpZXZlX2Zyb21fZmlsZSh1X3JlcGwtPmZpbGVuYW1lLCAmcmVwbCwgdV9yZXBsLT5jb21tYW5kKSkKKwkJCXJldHVybiAtMTsKKwkJLyogLUwgd2l0aCBhIHdyb25nIHRhYmxlIG5hbWUgc2hvdWxkIGJlIGRlYWx0IHdpdGggc2lsZW50bHkgKi8KKwkJc3RyY3B5KHVfcmVwbC0+bmFtZSwgcmVwbC5uYW1lKTsKKwl9IGVsc2UgaWYgKHJldHJpZXZlX2Zyb21fa2VybmVsKCZyZXBsLCB1X3JlcGwtPmNvbW1hbmQsIGluaXQpKQorCQlyZXR1cm4gLTE7CisKKwkvKiBUcmFuc2xhdGUgdGhlIHN0cnVjdCBlYnRfcmVwbGFjZSB0byBhIHN0cnVjdCBlYnRfdV9yZXBsYWNlICovCisJdV9yZXBsLT52YWxpZF9ob29rcyA9IHJlcGwudmFsaWRfaG9va3M7CisJdV9yZXBsLT5uZW50cmllcyA9IHJlcGwubmVudHJpZXM7CisJdV9yZXBsLT5udW1fY291bnRlcnMgPSByZXBsLm51bV9jb3VudGVyczsKKwl1X3JlcGwtPmNvdW50ZXJzID0gcmVwbC5jb3VudGVyczsKKwl1X3JlcGwtPmNjID0gKHN0cnVjdCBlYnRfY250Y2hhbmdlcyAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGVidF9jbnRjaGFuZ2VzKSk7CisJaWYgKCF1X3JlcGwtPmNjKQorCQllYnRfcHJpbnRfbWVtb3J5KCk7CisJdV9yZXBsLT5jYy0+bmV4dCA9IHVfcmVwbC0+Y2MtPnByZXYgPSB1X3JlcGwtPmNjOworCWNjID0gdV9yZXBsLT5jYzsKKwlmb3IgKGkgPSAwOyBpIDwgcmVwbC5uZW50cmllczsgaSsrKSB7CisJCW5ld19jYyA9IChzdHJ1Y3QgZWJ0X2NudGNoYW5nZXMgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBlYnRfY250Y2hhbmdlcykpOworCQlpZiAoIW5ld19jYykKKwkJCWVidF9wcmludF9tZW1vcnkoKTsKKwkJbmV3X2NjLT50eXBlID0gQ05UX05PUk07CisJCW5ld19jYy0+Y2hhbmdlID0gMDsKKwkJbmV3X2NjLT5wcmV2ID0gY2M7CisJCWNjLT5uZXh0ID0gbmV3X2NjOworCQljYyA9IG5ld19jYzsKKwl9CisJaWYgKHJlcGwubmVudHJpZXMpIHsKKwkJbmV3X2NjLT5uZXh0ID0gdV9yZXBsLT5jYzsKKwkJdV9yZXBsLT5jYy0+cHJldiA9IG5ld19jYzsKKwl9CisJdV9yZXBsLT5jaGFpbnMgPSAoc3RydWN0IGVidF91X2VudHJpZXMgKiopY2FsbG9jKEVCVF9PUklfTUFYX0NIQUlOUywgc2l6ZW9mKHZvaWQgKikpOworCXVfcmVwbC0+bWF4X2NoYWlucyA9IEVCVF9PUklfTUFYX0NIQUlOUzsKKwlob29rID0gLTE7CisJLyogRklYTUU6IENsZWFuIHVwIHdoZW4gYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgKi8KKwlFQlRfRU5UUllfSVRFUkFURShyZXBsLmVudHJpZXMsIHJlcGwuZW50cmllc19zaXplLCBlYnRfdHJhbnNsYXRlX2NoYWlucywKKwkgICAmaG9vaywgdV9yZXBsLCB1X3JlcGwtPnZhbGlkX2hvb2tzKTsKKwlpZiAoaG9vayA+PSBORl9CUl9OVU1IT09LUykKKwkJdV9yZXBsLT5udW1fY2hhaW5zID0gaG9vayArIDE7CisJZWxzZQorCQl1X3JlcGwtPm51bV9jaGFpbnMgPSBORl9CUl9OVU1IT09LUzsKKwlpID0gMDsgLyogSG9sZHMgdGhlIGV4cGVjdGVkIG5yLiBvZiBlbnRyaWVzIGZvciB0aGUgY2hhaW4gKi8KKwlqID0gMDsgLyogSG9sZHMgdGhlIHVwIHRvIG5vdyBjb3VudGVkIGVudHJpZXMgZm9yIHRoZSBjaGFpbiAqLworCWsgPSAwOyAvKiBIb2xkcyB0aGUgdG90YWwgbnIuIG9mIGVudHJpZXMsIHNob3VsZCBlcXVhbCB1X3JlcGwtPm5lbnRyaWVzIGFmdGVyd2FyZHMgKi8KKwljYyA9IHVfcmVwbC0+Y2MtPm5leHQ7CisJaG9vayA9IC0xOworCUVCVF9FTlRSWV9JVEVSQVRFKChjaGFyICopcmVwbC5lbnRyaWVzLCByZXBsLmVudHJpZXNfc2l6ZSwKKwkgICBlYnRfdHJhbnNsYXRlX2VudHJ5LCAmaG9vaywgJmksICZqLCAmaywgJnVfZSwgdV9yZXBsLAorCSAgIHVfcmVwbC0+dmFsaWRfaG9va3MsIChjaGFyICopcmVwbC5lbnRyaWVzLCAmY2MpOworCWlmIChrICE9IHVfcmVwbC0+bmVudHJpZXMpCisJCWVidF9wcmludF9idWcoIldyb25nIHRvdGFsIG5lbnRyaWVzIik7CisJZnJlZShyZXBsLmVudHJpZXMpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmFjIGIvY29uZmlndXJlLmFjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNGVkZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWd1cmUuYWMKQEAgLTAsMCArMSwyNiBAQAorQUNfSU5JVChbZWJ0YWJsZXNdLCBbMi4wLjExXSkKK0FDX0NPTkZJR19BVVhfRElSKFtidWlsZC1hdXhdKQorQUNfQ09ORklHX0hFQURFUlMoW2NvbmZpZy5oXSkKK0FDX0NPTkZJR19NQUNST19ESVIoW200XSkKK0FDX1BST0dfSU5TVEFMTAorQU1fSU5JVF9BVVRPTUFLRShbLVdhbGwgZm9yZWlnbiBzdWJkaXItb2JqZWN0cyB0YXItcGF4XSkKK0FDX1BST0dfQ0MKK0FNX1BST0dfQ0NfQ19PCitBQ19ESVNBQkxFX1NUQVRJQworbTRfaWZkZWYoW0FNX1BST0dfQVJdLCBbQU1fUFJPR19BUl0pCitBTV9QUk9HX0xJQlRPT0wKKworQUNfQVJHX1ZBUihbTE9DS0ZJTEVdLCBbQ3VzdG9tIGxpYmVidGMgbG9ja2ZpbGUgcGF0aCAoZGVmYXVsdDogL3Zhci9saWIvZWJ0YWJsZXMvbG9jayldKQorQVNfSUYoW3Rlc3QgIngkTE9DS0ZJTEUiID0geF0sIFtMT0NLRklMRT0iL3Zhci9saWIvZWJ0YWJsZXMvbG9jayJdKQorCityZWd1bGFyX0NGTEFHUz0iLVdhbGwgLVd1bnVzZWQiCityZWd1bGFyX0NQUEZMQUdTPSIiCitjYXNlICIkaG9zdCIgaW4KKwlzcGFyYzY0LSopCisJCXJlZ3VsYXJfQ1BQRkxBR1M9IiRyZWd1bGFyX0NQUEZMQUdTIC1ERUJUX01JTl9BTElHTj04IC1ES0VSTkVMXzY0X1VTRVJTUEFDRV8zMiI7OworZXNhYworCitBQ19TVUJTVChbcmVndWxhcl9DRkxBR1NdKQorQUNfU1VCU1QoW3JlZ3VsYXJfQ1BQRkxBR1NdKQorQUNfQ09ORklHX0ZJTEVTKFtNYWtlZmlsZV0pCitBQ19PVVRQVVQKZGlmZiAtLWdpdCBhL2VidGFibGVzLWxlZ2FjeS44LmluIGIvZWJ0YWJsZXMtbGVnYWN5LjguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQxNzA0NQotLS0gL2Rldi9udWxsCisrKyBiL2VidGFibGVzLWxlZ2FjeS44LmluCkBAIC0wLDAgKzEsMTE0NiBAQAorLlRIIEVCVEFCTEVTIDggICJAUEFDS0FHRV9EQVRFQCIKKy5cIgorLlwiIE1hbiBwYWdlIHdyaXR0ZW4gYnkgQmFydCBEZSBTY2h1eW1lciA8YmRzY2h1eW1AcGFuZG9yYS5iZT4KKy5cIiBJdCBpcyBiYXNlZCBvbiB0aGUgaXB0YWJsZXMgbWFuIHBhZ2UuCisuXCIKKy5cIiBUaGUgbWFuIHBhZ2Ugd2FzIGVkaXRlZCwgRmVicnVhcnkgMjV0aCAyMDAzLCBieSAKKy5cIiAgICAgIEdyZWcgTW9yZ2FuIDwiIGRyX2tsdWRnZV9hdF91c2Vyc19zb3VyY2Vmb3JnZV9uZXQgPgorLlwiCisuXCIgSXB0YWJsZXMgcGFnZSBieSBIZXJ2ZSBFeWNoZW5uZSBNYXJjaCAyMDAwLgorLlwiCisuXCIgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisuXCIgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisuXCIgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisuXCIgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisuXCIKKy5cIiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisuXCIgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisuXCIgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy5cIiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy5cIgorLlwiICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLlwiICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLlwiICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKy5cIiAgICAgCisuXCIKKy5TSCBOQU1FCitlYnRhYmxlcy1sZWdhY3kgKEBQQUNLQUdFX1ZFUlNJT05AKSBcLSBFdGhlcm5ldCBicmlkZ2UgZnJhbWUgdGFibGUgYWRtaW5pc3RyYXRpb24gKGxlZ2FjeSkKKy5TSCBTWU5PUFNJUworLkJSICJlYnRhYmxlcyAiIFsgLXQgIiB0YWJsZSBdICIgLSBbIEFDREkgIl0gY2hhaW4gcnVsZSBzcGVjaWZpY2F0aW9uIFttYXRjaCBleHRlbnNpb25zXSBbd2F0Y2hlciBleHRlbnNpb25zXSB0YXJnZXQiCisuYnIKKy5CUiAiZWJ0YWJsZXMgIiBbIC10ICIgdGFibGUgXSAiIC1QICIgY2hhaW4gIiBBQ0NFUFQgIiB8ICIgRFJPUCAiIHwgIiBSRVRVUk4KKy5icgorLkJSICJlYnRhYmxlcyAiIFsgLXQgIiB0YWJsZSBdICIgLUYgIiBbY2hhaW5dIgorLmJyCisuQlIgImVidGFibGVzICIgWyAtdCAiIHRhYmxlIF0gIiAtWiAiIFtjaGFpbl0iCisuYnIKKy5CUiAiZWJ0YWJsZXMgIiBbIC10ICIgdGFibGUgXSAiIC1MICIgWyIgLVogIl0gW2NoYWluXSBbIFsiIC0tTG4gIl0gfCBbIiAtLUx4ICJdIF0gWyIgLS1MYyAiXSBbIiAtLUxtYWMyIF0KKy5icgorLkJSICJlYnRhYmxlcyAiIFsgLXQgIiB0YWJsZSBdICIgLU4gIiBjaGFpbiBbIiAiLVAgQUNDRVBUICIgfCAiIERST1AgIiB8ICIgUkVUVVJOIiBdCisuYnIKKy5CUiAiZWJ0YWJsZXMgIiBbIC10ICIgdGFibGUgXSAiIC1YICIgW2NoYWluXSIKKy5icgorLkJSICJlYnRhYmxlcyAiIFsgLXQgIiB0YWJsZSBdICIgLUUgIiBvbGQtY2hhaW4tbmFtZSBuZXctY2hhaW4tbmFtZSIKKy5icgorLkJSICJlYnRhYmxlcyAiIFsgLXQgIiB0YWJsZSBdICIgLS1pbml0LXRhYmxlCisuYnIKKy5CUiAiZWJ0YWJsZXMgIiBbIC10ICIgdGFibGUgXSBbIiAtLWF0b21pYy1maWxlICIgZmlsZV0gIiAtLWF0b21pYy1jb21taXQKKy5icgorLkJSICJlYnRhYmxlcyAiIFsgLXQgIiB0YWJsZSBdIFsiIC0tYXRvbWljLWZpbGUgIiBmaWxlXSAiIC0tYXRvbWljLWluaXQKKy5icgorLkJSICJlYnRhYmxlcyAiIFsgLXQgIiB0YWJsZSBdIFsiIC0tYXRvbWljLWZpbGUgIiBmaWxlXSAiIC0tYXRvbWljLXNhdmUKKy5icgorCisuU0ggTEVHQUNZCitUaGlzIHRvb2wgdXNlcyB0aGUgb2xkIHh0YWJsZXMvc2V0c29ja29wdCBmcmFtZXdvcmssIGFuZCBpcyBhIGxlZ2FjeSB2ZXJzaW9uCitvZiBlYnRhYmxlcy4gVGhhdCBtZWFucyB0aGF0IGEgbmV3LCBtb3JlIG1vZGVybiB0b29sIGV4aXN0cyB3aXRoIHRoZSBzYW1lCitmdW5jdGlvbmFsaXR5IHVzaW5nIHRoZSBuZl90YWJsZXMgZnJhbWV3b3JrIGFuZCB5b3UgYXJlIGVuY291cmFnZWQgdG8gbWlncmF0ZSBub3cuCitUaGUgbmV3IGJpbmFyaWVzIChrbm93biBhcyBlYnRhYmxlcy1uZnQgYW5kIGZvcm1lcmx5IGtub3duIGFzIGVidGFibGVzLWNvbXBhdCkKK3VzZXMgdGhlIHNhbWUgc3ludGF4IGFuZCBzZW1hbnRpY3MgdGhhbiB0aGlzIGxlZ2FjeSBvbmUuCisKK1lvdSBjYW4gc3RpbGwgdXNlIHRoaXMgbGVnYWN5IHRvb2wuIFlvdSBzaG91bGQgcHJvYmFibHkgZ2V0IHNvbWUgc3BlY2lmaWMKK2luZm9ybWF0aW9uIGZyb20geW91ciBMaW51eCBkaXN0cmlidXRpb24gb3IgdmVuZG9yLgorTW9yZSBkb2NzIGFyZSBhdmFpbGFibGUgYXQgaHR0cHM6Ly93aWtpLm5mdGFibGVzLm9yZworCisuU0ggREVTQ1JJUFRJT04KKy5CIGVidGFibGVzCitpcyBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtIHVzZWQgdG8gc2V0IHVwIGFuZCBtYWludGFpbiB0aGUKK3RhYmxlcyBvZiBydWxlcyAoaW5zaWRlIHRoZSBMaW51eCBrZXJuZWwpIHRoYXQgaW5zcGVjdAorRXRoZXJuZXQgZnJhbWVzLgorSXQgaXMgYW5hbG9nb3VzIHRvIHRoZQorLkIgaXB0YWJsZXMKK2FwcGxpY2F0aW9uLCBidXQgbGVzcyBjb21wbGljYXRlZCwgZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIEV0aGVybmV0IHByb3RvY29sCitpcyBtdWNoIHNpbXBsZXIgdGhhbiB0aGUgSVAgcHJvdG9jb2wuCisuU1MgQ0hBSU5TCitUaGVyZSBhcmUgdGhyZWUgZWJ0YWJsZXMgdGFibGVzIHdpdGggYnVpbHQtaW4gY2hhaW5zIGluIHRoZQorTGludXgga2VybmVsLiBUaGVzZSB0YWJsZXMgYXJlIHVzZWQgdG8gZGl2aWRlIGZ1bmN0aW9uYWxpdHkgaW50bworZGlmZmVyZW50IHNldHMgb2YgcnVsZXMuIEVhY2ggc2V0IG9mIHJ1bGVzIGlzIGNhbGxlZCBhIGNoYWluLgorRWFjaCBjaGFpbiBpcyBhbiBvcmRlcmVkIGxpc3Qgb2YgcnVsZXMgdGhhdCBjYW4gbWF0Y2ggRXRoZXJuZXQgZnJhbWVzLiBJZiBhCitydWxlIG1hdGNoZXMgYW4gRXRoZXJuZXQgZnJhbWUsIHRoZW4gYSBwcm9jZXNzaW5nIHNwZWNpZmljYXRpb24gdGVsbHMKK3doYXQgdG8gZG8gd2l0aCB0aGF0IG1hdGNoaW5nIGZyYW1lLiBUaGUgcHJvY2Vzc2luZyBzcGVjaWZpY2F0aW9uIGlzCitjYWxsZWQgYSAndGFyZ2V0Jy4gSG93ZXZlciwgaWYgdGhlIGZyYW1lIGRvZXMgbm90IG1hdGNoIHRoZSBjdXJyZW50CitydWxlIGluIHRoZSBjaGFpbiwgdGhlbiB0aGUgbmV4dCBydWxlIGluIHRoZSBjaGFpbiBpcyBleGFtaW5lZCBhbmQgc28gZm9ydGguCitUaGUgdXNlciBjYW4gY3JlYXRlIG5ldyAodXNlci1kZWZpbmVkKSBjaGFpbnMgdGhhdCBjYW4gYmUgdXNlZCBhcyB0aGUgJ3RhcmdldCcKK29mIGEgcnVsZS4gVXNlci1kZWZpbmVkIGNoYWlucyBhcmUgdmVyeSB1c2VmdWwgdG8gZ2V0IGJldHRlciBwZXJmb3JtYW5jZQorb3ZlciB0aGUgbGluZWFyIHRyYXZlcnNhbCBvZiB0aGUgcnVsZXMgYW5kIGFyZSBhbHNvIGVzc2VudGlhbCBmb3Igc3RydWN0dXJpbmcKK3RoZSBmaWx0ZXJpbmcgcnVsZXMgaW50byB3ZWxsLW9yZ2FuaXplZCBhbmQgbWFpbnRhaW5hYmxlIHNldHMgb2YgcnVsZXMuCisuU1MgVEFSR0VUUworQSBmaXJld2FsbCBydWxlIHNwZWNpZmllcyBjcml0ZXJpYSBmb3IgYW4gRXRoZXJuZXQgZnJhbWUgYW5kIGEgZnJhbWUKK3Byb2Nlc3Npbmcgc3BlY2lmaWNhdGlvbiBjYWxsZWQgYSB0YXJnZXQuICBXaGVuIGEgZnJhbWUgbWF0Y2hlcyBhIHJ1bGUsCit0aGVuIHRoZSBuZXh0IGFjdGlvbiBwZXJmb3JtZWQgYnkgdGhlIGtlcm5lbCBpcyBzcGVjaWZpZWQgYnkgdGhlIHRhcmdldC4KK1RoZSB0YXJnZXQgY2FuIGJlIG9uZSBvZiB0aGVzZSB2YWx1ZXM6CisuQlIgQUNDRVBUICwKKy5CUiBEUk9QICwKKy5CUiBDT05USU5VRSAsCisuQlIgUkVUVVJOICwKK2FuICdleHRlbnNpb24nIChzZWUgYmVsb3cpIG9yIGEganVtcCB0byBhIHVzZXItZGVmaW5lZCBjaGFpbi4KKy5QUAorLkIgQUNDRVBUCittZWFucyB0byBsZXQgdGhlIGZyYW1lIHRocm91Z2guCisuQiBEUk9QCittZWFucyB0aGUgZnJhbWUgaGFzIHRvIGJlIGRyb3BwZWQuIEluIHRoZQorLkJSIEJST1VUSU5HICIgY2hhaW4gaG93ZXZlciwgdGhlICIgQUNDRVBUICIgYW5kICIgRFJPUCAiIHRhcmdldCBoYXZlIGRpZmZlcmVudCIKK21lYW5pbmdzIChzZWUgdGhlIGluZm8gcHJvdmlkZWQgZm9yIHRoZQorLkJSIC10ICIgb3B0aW9uKS4iCisuQiBDT05USU5VRQorbWVhbnMgdGhlIG5leHQgcnVsZSBoYXMgdG8gYmUgY2hlY2tlZC4gVGhpcyBjYW4gYmUgaGFuZHksIGYuZS4sIHRvIGtub3cgaG93IG1hbnkKK2ZyYW1lcyBwYXNzIGEgY2VydGFpbiBwb2ludCBpbiB0aGUgY2hhaW4sIHRvIGxvZyB0aG9zZSBmcmFtZXMgb3IgdG8gYXBwbHkgbXVsdGlwbGUKK3RhcmdldHMgb24gYSBmcmFtZS4KKy5CIFJFVFVSTgorbWVhbnMgc3RvcCB0cmF2ZXJzaW5nIHRoaXMgY2hhaW4gYW5kIHJlc3VtZSBhdCB0aGUgbmV4dCBydWxlIGluIHRoZQorcHJldmlvdXMgKGNhbGxpbmcpIGNoYWluLgorRm9yIHRoZSBleHRlbnNpb24gdGFyZ2V0cyBwbGVhc2UgcmVmZXIgdG8gdGhlCisuQiAiVEFSR0VUIEVYVEVOU0lPTlMiCitzZWN0aW9uIG9mIHRoaXMgbWFuIHBhZ2UuCisuU1MgVEFCTEVTCitBcyBzdGF0ZWQgZWFybGllciwgdGhlcmUgYXJlIHRocmVlIGVidGFibGVzIHRhYmxlcyBpbiB0aGUgTGludXgKK2tlcm5lbC4gIFRoZSB0YWJsZSBuYW1lcyBhcmUKKy5CUiBmaWx0ZXIgIiwgIiBuYXQgIiBhbmQgIiBicm91dGUgLgorT2YgdGhlc2UgdGhyZWUgdGFibGVzLAordGhlIGZpbHRlciB0YWJsZSBpcyB0aGUgZGVmYXVsdCB0YWJsZSB0aGF0IHRoZSBjb21tYW5kIG9wZXJhdGVzIG9uLgorSWYgeW91IGFyZSB3b3JraW5nIHdpdGggdGhlIGZpbHRlciB0YWJsZSwgdGhlbiB5b3UgY2FuIGRyb3AgdGhlICctdCBmaWx0ZXInCithcmd1bWVudCB0byB0aGUgZWJ0YWJsZXMgY29tbWFuZC4gIEhvd2V2ZXIsIHlvdSB3aWxsIG5lZWQgdG8gcHJvdmlkZQordGhlIC10IGFyZ3VtZW50IGZvciB0aGUgb3RoZXIgdHdvIHRhYmxlcy4gIE1vcmVvdmVyLCB0aGUgLXQgYXJndW1lbnQgbXVzdCBiZSB0aGUKK2ZpcnN0IGFyZ3VtZW50IG9uIHRoZSBlYnRhYmxlcyBjb21tYW5kIGxpbmUsIGlmIHVzZWQuIAorLlRQCisuQiAiLXQsIC0tdGFibGUiCisuYnIKKy5CIGZpbHRlcgoraXMgdGhlIGRlZmF1bHQgdGFibGUgYW5kIGNvbnRhaW5zIHRocmVlIGJ1aWx0LWluIGNoYWluczoKKy5CIElOUFVUIAorKGZvciBmcmFtZXMgZGVzdGluZWQgZm9yIHRoZSBicmlkZ2UgaXRzZWxmLCBvbiB0aGUgbGV2ZWwgb2YgdGhlIE1BQyBkZXN0aW5hdGlvbiBhZGRyZXNzKSwgCisuQiBPVVRQVVQgCisoZm9yIGxvY2FsbHktZ2VuZXJhdGVkIG9yIChiKXJvdXRlZCBmcmFtZXMpIGFuZAorLkIgRk9SV0FSRCAKKyhmb3IgZnJhbWVzIGJlaW5nIGZvcndhcmRlZCBieSB0aGUgYnJpZGdlKS4KKy5icgorLmJyCisuQiBuYXQKK2lzIG1vc3RseSB1c2VkIHRvIGNoYW5nZSB0aGUgbWFjIGFkZHJlc3NlcyBhbmQgY29udGFpbnMgdGhyZWUgYnVpbHQtaW4gY2hhaW5zOgorLkIgUFJFUk9VVElORyAKKyhmb3IgYWx0ZXJpbmcgZnJhbWVzIGFzIHNvb24gYXMgdGhleSBjb21lIGluKSwgCisuQiBPVVRQVVQgCisoZm9yIGFsdGVyaW5nIGxvY2FsbHkgZ2VuZXJhdGVkIG9yIChiKXJvdXRlZCBmcmFtZXMgYmVmb3JlIHRoZXkgYXJlIGJyaWRnZWQpIGFuZCAKKy5CIFBPU1RST1VUSU5HCisoZm9yIGFsdGVyaW5nIGZyYW1lcyBhcyB0aGV5IGFyZSBhYm91dCB0byBnbyBvdXQpLiBBIHNtYWxsIG5vdGUgb24gdGhlIG5hbWluZworb2YgY2hhaW5zIFBSRVJPVVRJTkcgYW5kIFBPU1RST1VUSU5HOiBpdCB3b3VsZCBiZSBtb3JlIGFjY3VyYXRlIHRvIGNhbGwgdGhlbQorUFJFRk9SV0FSRElORyBhbmQgUE9TVEZPUldBUkRJTkcsIGJ1dCBmb3IgYWxsIHRob3NlIHdobyBjb21lIGZyb20gdGhlCitpcHRhYmxlcyB3b3JsZCB0byBlYnRhYmxlcyBpdCBpcyBlYXNpZXIgdG8gaGF2ZSB0aGUgc2FtZSBuYW1lcy4gTm90ZSB0aGF0IHlvdQorY2FuIGNoYW5nZSB0aGUgbmFtZQorLkJSICIiICggLUUgKQoraWYgeW91IGRvbid0IGxpa2UgdGhlIGRlZmF1bHQuCisuYnIKKy5icgorLkIgYnJvdXRlCitpcyB1c2VkIHRvIG1ha2UgYSBicm91dGVyLCBpdCBoYXMgb25lIGJ1aWx0LWluIGNoYWluOgorLkJSIEJST1VUSU5HIC4KK1RoZSB0YXJnZXRzCisuQlIgRFJPUCAiIGFuZCAiIEFDQ0VQVAoraGF2ZSBhIHNwZWNpYWwgbWVhbmluZyBpbiB0aGUgYnJvdXRlIHRhYmxlICh0aGVzZSBuYW1lcyBhcmUgdXNlZCBpbnN0ZWFkIG9mCittb3JlIGRlc2NyaXB0aXZlIG5hbWVzIHRvIGtlZXAgdGhlIGltcGxlbWVudGF0aW9uIGdlbmVyaWMpLgorLkIgRFJPUAorYWN0dWFsbHkgbWVhbnMgdGhlIGZyYW1lIGhhcyB0byBiZSByb3V0ZWQsIHdoaWxlCisuQiBBQ0NFUFQKK21lYW5zIHRoZSBmcmFtZSBoYXMgdG8gYmUgYnJpZGdlZC4gVGhlCisuQiBCUk9VVElORworY2hhaW4gaXMgdHJhdmVyc2VkIHZlcnkgZWFybHkuIEhvd2V2ZXIsIGl0IGlzIG9ubHkgdHJhdmVyc2VkIGJ5IGZyYW1lcyBlbnRlcmluZyBvbgorYSBicmlkZ2UgcG9ydCB0aGF0IGlzIGluIGZvcndhcmRpbmcgc3RhdGUuIE5vcm1hbGx5IHRob3NlIGZyYW1lcword291bGQgYmUgYnJpZGdlZCwgYnV0IHlvdSBjYW4gZGVjaWRlIG90aGVyd2lzZSBoZXJlLiBUaGUKKy5CIHJlZGlyZWN0Cit0YXJnZXQgaXMgdmVyeSBoYW5keSBoZXJlLgorLlNIIEVCVEFCTEVTIENPTU1BTkQgTElORSBBUkdVTUVOVFMKK0FmdGVyIHRoZSBpbml0aWFsIGVidGFibGVzICctdCB0YWJsZScgY29tbWFuZCBsaW5lIGFyZ3VtZW50LCB0aGUgcmVtYWluaW5nCithcmd1bWVudHMgY2FuIGJlIGRpdmlkZWQgaW50byBzZXZlcmFsIGdyb3Vwcy4gIFRoZXNlIGdyb3VwcworYXJlIGNvbW1hbmRzLCBtaXNjZWxsYW5lb3VzIGNvbW1hbmRzLCBydWxlIHNwZWNpZmljYXRpb25zLCBtYXRjaCBleHRlbnNpb25zLAord2F0Y2hlciBleHRlbnNpb25zIGFuZCB0YXJnZXQgZXh0ZW5zaW9ucy4KKy5TUyBDT01NQU5EUworVGhlIGVidGFibGVzIGNvbW1hbmQgYXJndW1lbnRzIHNwZWNpZnkgdGhlIGFjdGlvbnMgdG8gcGVyZm9ybSBvbiB0aGUgdGFibGUKK2RlZmluZWQgd2l0aCB0aGUgLXQgYXJndW1lbnQuICBJZiB5b3UgZG8gbm90IHVzZSB0aGUgLXQgYXJndW1lbnQgdG8gbmFtZQorYSB0YWJsZSwgdGhlIGNvbW1hbmRzIGFwcGx5IHRvIHRoZSBkZWZhdWx0IGZpbHRlciB0YWJsZS4KK09ubHkgb25lIGNvbW1hbmQgbWF5IGJlIHVzZWQgb24gdGhlIGNvbW1hbmQgbGluZSBhdCBhIHRpbWUsIGV4Y2VwdCB3aGVuCit0aGUgY29tbWFuZHMKKy5CUiAtTCAiIGFuZCAiIC1aCithcmUgY29tYmluZWQsIHRoZSBjb21tYW5kcworLkJSIC1OICIgYW5kICIgLVAKK2FyZSBjb21iaW5lZCwgb3Igd2hlbgorLkIgLS1hdG9taWMtZmlsZQoraXMgdXNlZC4KKy5UUAorLkIgIi1BLCAtLWFwcGVuZCIKK0FwcGVuZCBhIHJ1bGUgdG8gdGhlIGVuZCBvZiB0aGUgc2VsZWN0ZWQgY2hhaW4uCisuVFAKKy5CICItRCwgLS1kZWxldGUiCitEZWxldGUgdGhlIHNwZWNpZmllZCBydWxlIG9yIHJ1bGVzIGZyb20gdGhlIHNlbGVjdGVkIGNoYWluLiBUaGVyZSBhcmUgdHdvIHdheXMgdG8KK3VzZSB0aGlzIGNvbW1hbmQuIFRoZSBmaXJzdCBpcyBieSBzcGVjaWZ5aW5nIGFuIGludGVydmFsIG9mIHJ1bGUgbnVtYmVycwordG8gZGVsZXRlIChkaXJlY3RseSBhZnRlcgorLkJSIC1EICkuCitTeW50YXg6IFxmSXN0YXJ0X25yXGZQW1xmSTplbmRfbnJcZlBdICh1c2UKKy5CIC1MIC0tTG4KK3RvIGxpc3QgdGhlIHJ1bGVzIHdpdGggdGhlaXIgcnVsZSBudW1iZXIpLiBXaGVuIFxmSWVuZF9uclxmUCBpcyBvbWl0dGVkLCBhbGwgcnVsZXMgc3RhcnRpbmcKK2Zyb20gXGZJc3RhcnRfbnJcZlAgYXJlIGRlbGV0ZWQuIFVzaW5nIG5lZ2F0aXZlIG51bWJlcnMgaXMgYWxsb3dlZCwgZm9yIG1vcmUKK2RldGFpbHMgYWJvdXQgdXNpbmcgbmVnYXRpdmUgbnVtYmVycywgc2VlIHRoZQorLkIgLUkKK2NvbW1hbmQuIFRoZSBzZWNvbmQgdXNhZ2UgaXMgYnkKK3NwZWNpZnlpbmcgdGhlIGNvbXBsZXRlIHJ1bGUgYXMgaXQgd291bGQgaGF2ZSBiZWVuIHNwZWNpZmllZCB3aGVuIGl0IHdhcyBhZGRlZC4gT25seQordGhlIGZpcnN0IGVuY291bnRlcmVkIHJ1bGUgdGhhdCBpcyB0aGUgc2FtZSBhcyB0aGlzIHNwZWNpZmllZCBydWxlLCBpbiBvdGhlcgord29yZHMgdGhlIG1hdGNoaW5nIHJ1bGUgd2l0aCB0aGUgbG93ZXN0IChwb3NpdGl2ZSkgcnVsZSBudW1iZXIsIGlzIGRlbGV0ZWQuCisuVFAKKy5CICItQywgLS1jaGFuZ2UtY291bnRlcnMiCitDaGFuZ2UgdGhlIGNvdW50ZXJzIG9mIHRoZSBzcGVjaWZpZWQgcnVsZSBvciBydWxlcyBmcm9tIHRoZSBzZWxlY3RlZCBjaGFpbi4gVGhlcmUgYXJlIHR3byB3YXlzIHRvCit1c2UgdGhpcyBjb21tYW5kLiBUaGUgZmlyc3QgaXMgYnkgc3BlY2lmeWluZyBhbiBpbnRlcnZhbCBvZiBydWxlIG51bWJlcnMKK3RvIGRvIHRoZSBjaGFuZ2VzIG9uIChkaXJlY3RseSBhZnRlcgorLkJSIC1DICkuCitTeW50YXg6IFxmSXN0YXJ0X25yXGZQW1xmSTplbmRfbnJcZlBdICh1c2UKKy5CIC1MIC0tTG4KK3RvIGxpc3QgdGhlIHJ1bGVzIHdpdGggdGhlaXIgcnVsZSBudW1iZXIpLiBUaGUgZGV0YWlscyBhcmUgdGhlIHNhbWUgYXMgZm9yIHRoZQorLkJSIC1EICIgY29tbWFuZC4gVGhlIHNlY29uZCB1c2FnZSBpcyBieSIKK3NwZWNpZnlpbmcgdGhlIGNvbXBsZXRlIHJ1bGUgYXMgaXQgd291bGQgaGF2ZSBiZWVuIHNwZWNpZmllZCB3aGVuIGl0IHdhcyBhZGRlZC4gT25seQordGhlIGNvdW50ZXJzIG9mIHRoZSBmaXJzdCBlbmNvdW50ZXJlZCBydWxlIHRoYXQgaXMgdGhlIHNhbWUgYXMgdGhpcyBzcGVjaWZpZWQgcnVsZSwgaW4gb3RoZXIKK3dvcmRzIHRoZSBtYXRjaGluZyBydWxlIHdpdGggdGhlIGxvd2VzdCAocG9zaXRpdmUpIHJ1bGUgbnVtYmVyLCBhcmUgY2hhbmdlZC4KK0luIHRoZSBmaXJzdCB1c2FnZSwgdGhlIGNvdW50ZXJzIGFyZSBzcGVjaWZpZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIGludGVydmFsIHNwZWNpZmljYXRpb24sCitpbiB0aGUgc2Vjb25kIHVzYWdlIGRpcmVjdGx5IGFmdGVyCisuQlIgLUMgLgorRmlyc3QgdGhlIHBhY2tldCBjb3VudGVyIGlzIHNwZWNpZmllZCwgdGhlbiB0aGUgYnl0ZSBjb3VudGVyLiBJZiB0aGUgc3BlY2lmaWVkIGNvdW50ZXJzIHN0YXJ0Cit3aXRoIGEgJysnLCB0aGUgY291bnRlciB2YWx1ZXMgYXJlIGFkZGVkIHRvIHRoZSByZXNwZWN0aXZlIGN1cnJlbnQgY291bnRlciB2YWx1ZXMuCitJZiB0aGUgc3BlY2lmaWVkIGNvdW50ZXJzIHN0YXJ0IHdpdGggYSAnLScsIHRoZSBjb3VudGVyIHZhbHVlcyBhcmUgZGVjcmVhc2VkIGZyb20gdGhlIHJlc3BlY3RpdmUKK2N1cnJlbnQgY291bnRlciB2YWx1ZXMuIE5vIGJvdW5kcyBjaGVja2luZyBpcyBkb25lLiBJZiB0aGUgY291bnRlcnMgZG9uJ3Qgc3RhcnQgd2l0aCAnKycgb3IgJy0nLAordGhlIGN1cnJlbnQgY291bnRlcnMgYXJlIGNoYW5nZWQgdG8gdGhlIHNwZWNpZmllZCBjb3VudGVycy4KKy5UUAorLkIgIi1JLCAtLWluc2VydCIKK0luc2VydCB0aGUgc3BlY2lmaWVkIHJ1bGUgaW50byB0aGUgc2VsZWN0ZWQgY2hhaW4gYXQgdGhlIHNwZWNpZmllZCBydWxlIG51bWJlci4gSWYgdGhlCitydWxlIG51bWJlciBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgcnVsZSBpcyBhZGRlZCBhdCB0aGUgaGVhZCBvZiB0aGUgY2hhaW4uCitJZiB0aGUgY3VycmVudCBudW1iZXIgb2YgcnVsZXMgZXF1YWxzCisuSVIgTiAsCit0aGVuIHRoZSBzcGVjaWZpZWQgbnVtYmVyIGNhbiBiZQorYmV0d2VlbgorLklSIC1OICIgYW5kICIgTisxIC4KK0ZvciBhIHBvc2l0aXZlIG51bWJlcgorLklSIGkgLAoraXQgaG9sZHMgdGhhdAorLklSIGkgIiBhbmQgIiBpLU4tMQorc3BlY2lmeSB0aGUgc2FtZSBwbGFjZSBpbiB0aGUgY2hhaW4gd2hlcmUgdGhlIHJ1bGUgc2hvdWxkIGJlIGluc2VydGVkLiBUaGUgcnVsZSBudW1iZXIKKzAgc3BlY2lmaWVzIHRoZSBwbGFjZSBwYXN0IHRoZSBsYXN0IHJ1bGUgaW4gdGhlIGNoYWluIGFuZCB1c2luZyB0aGlzIG51bWJlciBpcyB0aGVyZWZvcmUKK2VxdWl2YWxlbnQgdG8gdXNpbmcgdGhlCisuQlIgLUEgIiBjb21tYW5kLiIKK1J1bGUgbnVtYmVycyBzdHJ1Y3RseSBzbWFsbGVyIHRoYW4gMCBjYW4gYmUgdXNlZnVsIHdoZW4gbW9yZSB0aGFuIG9uZSBydWxlIG5lZWRzIHRvIGJlIGluc2VydGVkCitpbiBhIGNoYWluLgorLlRQCisuQiAiLVAsIC0tcG9saWN5IgorU2V0IHRoZSBwb2xpY3kgZm9yIHRoZSBjaGFpbiB0byB0aGUgZ2l2ZW4gdGFyZ2V0LiBUaGUgcG9saWN5IGNhbiBiZQorLkJSIEFDQ0VQVCAiLCAiIERST1AgIiBvciAiIFJFVFVSTiAuCisuVFAKKy5CICItRiwgLS1mbHVzaCIKK0ZsdXNoIHRoZSBzZWxlY3RlZCBjaGFpbi4gSWYgbm8gY2hhaW4gaXMgc2VsZWN0ZWQsIHRoZW4gZXZlcnkgY2hhaW4gd2lsbCBiZQorZmx1c2hlZC4gRmx1c2hpbmcgYSBjaGFpbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIHBvbGljeSBvZiB0aGUKK2NoYWluLCBob3dldmVyLgorLlRQCisuQiAiLVosIC0temVybyIKK1NldCB0aGUgY291bnRlcnMgb2YgdGhlIHNlbGVjdGVkIGNoYWluIHRvIHplcm8uIElmIG5vIGNoYWluIGlzIHNlbGVjdGVkLCBhbGwgdGhlIGNvdW50ZXJzCithcmUgc2V0IHRvIHplcm8uIFRoZQorLkIgIi1aIgorY29tbWFuZCBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSAKKy5CICItTCIKK2NvbW1hbmQuCitXaGVuIGJvdGggdGhlCisuQiAiLVoiCithbmQKKy5CICItTCIKK2NvbW1hbmRzIGFyZSB1c2VkIHRvZ2V0aGVyIGluIHRoaXMgd2F5LCB0aGUgcnVsZSBjb3VudGVycyBhcmUgcHJpbnRlZCBvbiB0aGUgc2NyZWVuCitiZWZvcmUgdGhleSBhcmUgc2V0IHRvIHplcm8uCisuVFAKKy5CICItTCwgLS1saXN0IgorTGlzdCBhbGwgcnVsZXMgaW4gdGhlIHNlbGVjdGVkIGNoYWluLiBJZiBubyBjaGFpbiBpcyBzZWxlY3RlZCwgYWxsIGNoYWlucworYXJlIGxpc3RlZC4KKy5icgorVGhlIGZvbGxvd2luZyBvcHRpb25zIGNoYW5nZSB0aGUgb3V0cHV0IG9mIHRoZQorLkIgIi1MIgorY29tbWFuZC4KKy5icgorLkIgIi0tTG4iCisuYnIKK1BsYWNlcyB0aGUgcnVsZSBudW1iZXIgaW4gZnJvbnQgb2YgZXZlcnkgcnVsZS4gVGhpcyBvcHRpb24gaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlCisuQlIgLS1MeCAiIG9wdGlvbi4iCisuYnIKKy5CICItLUxjIgorLmJyCitTaG93cyB0aGUgY291bnRlcnMgYXQgdGhlIGVuZCBvZiBlYWNoIHJ1bGUgZGlzcGxheWVkIGJ5IHRoZQorLkIgIi1MIgorY29tbWFuZC4gQm90aCBhIGZyYW1lIGNvdW50ZXIgKHBjbnQpIGFuZCBhIGJ5dGUgY291bnRlciAoYmNudCkgYXJlIGRpc3BsYXllZC4KK1RoZSBmcmFtZSBjb3VudGVyIHNob3dzIGhvdyBtYW55IGZyYW1lcyBoYXZlIG1hdGNoZWQgdGhlIHNwZWNpZmljIHJ1bGUsIHRoZSBieXRlCitjb3VudGVyIHNob3dzIHRoZSBzdW0gb2YgdGhlIGZyYW1lIHNpemVzIG9mIHRoZXNlIG1hdGNoaW5nIGZyYW1lcy4gVXNpbmcgdGhpcyBvcHRpb24KKy5CUiAiIiAiaW4gY29tYmluYXRpb24gd2l0aCB0aGUgIiAtLUx4ICIgb3B0aW9uIGNhdXNlcyB0aGUgY291bnRlcnMgdG8gYmUgd3JpdHRlbiBvdXQiCisuQlIgIiIgImluIHRoZSAnIiAtYyAiIDxwY250PiA8YmNudD4nIG9wdGlvbiBmb3JtYXQuIgorLmJyCisuQiAiLS1MeCIKKy5icgorQ2hhbmdlcyB0aGUgb3V0cHV0IHNvIHRoYXQgaXQgcHJvZHVjZXMgYSBzZXQgb2YgZWJ0YWJsZXMgY29tbWFuZHMgdGhhdCBjb25zdHJ1Y3QKK3RoZSBjb250ZW50cyBvZiB0aGUgY2hhaW4sIHdoZW4gc3BlY2lmaWVkLgorSWYgbm8gY2hhaW4gaXMgc3BlY2lmaWVkLCBlYnRhYmxlcyBjb21tYW5kcyB0byBjb25zdHJ1Y3QgdGhlIGNvbnRlbnRzIG9mIHRoZQordGFibGUgYXJlIGdpdmVuLCBpbmNsdWRpbmcgY29tbWFuZHMgZm9yIGNyZWF0aW5nIHRoZSB1c2VyLWRlZmluZWQgY2hhaW5zIChpZiBhbnkpLgorWW91IGNhbiB1c2UgdGhpcyBzZXQgb2YgY29tbWFuZHMgaW4gYW4gZWJ0YWJsZXMgYm9vdCBvciByZWxvYWQKK3NjcmlwdC4gIEZvciBleGFtcGxlIHRoZSBvdXRwdXQgY291bGQgYmUgdXNlZCBhdCBzeXN0ZW0gc3RhcnR1cC4KK1RoZSAKKy5CICItLUx4Igorb3B0aW9uIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZQorLkIgIi0tTG4iCitsaXN0aW5nIG9wdGlvbi4gVXNpbmcgdGhlCisuQlIgLS1MeCAiIG9wdGlvbiB0b2dldGhlciB3aXRoIHRoZSAiIC0tTGMgIiBvcHRpb24gd2lsbCBjYXVzZSB0aGUgY291bnRlcnMgdG8gYmUgd3JpdHRlbiBvdXQiCisuQlIgIiIgImluIHRoZSAnIiAtYyAiIDxwY250PiA8YmNudD4nIG9wdGlvbiBmb3JtYXQuIgorLmJyCisuQiAiLS1MbWFjMiIKKy5icgorU2hvd3MgYWxsIE1BQyBhZGRyZXNzZXMgd2l0aCB0aGUgc2FtZSBsZW5ndGgsIGFkZGluZyBsZWFkaW5nIHplcm9lcworaWYgbmVjZXNzYXJ5LiBUaGUgZGVmYXVsdCByZXByZXNlbnRhdGlvbiBvbWl0cyBsZWFkaW5nIHplcm9lcyBpbiB0aGUgYWRkcmVzc2VzLgorLlRQCisuQiAiLU4sIC0tbmV3LWNoYWluIgorQ3JlYXRlIGEgbmV3IHVzZXItZGVmaW5lZCBjaGFpbiB3aXRoIHRoZSBnaXZlbiBuYW1lLiBUaGUgbnVtYmVyIG9mCit1c2VyLWRlZmluZWQgY2hhaW5zIGlzIGxpbWl0ZWQgb25seSBieSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIGNoYWluIG5hbWVzLgorQSB1c2VyLWRlZmluZWQgY2hhaW4gbmFtZSBoYXMgYSBtYXhpbXVtCitsZW5ndGggb2YgMzEgY2hhcmFjdGVycy4gVGhlIHN0YW5kYXJkIHBvbGljeSBvZiB0aGUgdXNlci1kZWZpbmVkIGNoYWluIGlzCitBQ0NFUFQuIFRoZSBwb2xpY3kgb2YgdGhlIG5ldyBjaGFpbiBjYW4gYmUgaW5pdGlhbGl6ZWQgdG8gYSBkaWZmZXJlbnQgc3RhbmRhcmQKK3RhcmdldCBieSB1c2luZyB0aGUKKy5CIC1QCitjb21tYW5kIHRvZ2V0aGVyIHdpdGggdGhlCisuQiAtTgorY29tbWFuZC4gSW4gdGhpcyBjYXNlLCB0aGUgY2hhaW4gbmFtZSBkb2VzIG5vdCBoYXZlIHRvIGJlIHNwZWNpZmllZCBmb3IgdGhlCisuQiAtUAorY29tbWFuZC4KKy5UUAorLkIgIi1YLCAtLWRlbGV0ZS1jaGFpbiIKK0RlbGV0ZSB0aGUgc3BlY2lmaWVkIHVzZXItZGVmaW5lZCBjaGFpbi4gVGhlcmUgbXVzdCBiZSBubyByZW1haW5pbmcgcmVmZXJlbmNlcyAoanVtcHMpCit0byB0aGUgc3BlY2lmaWVkIGNoYWluLCBvdGhlcndpc2UgZWJ0YWJsZXMgd2lsbCByZWZ1c2UgdG8gZGVsZXRlIGl0LiBJZiBubyBjaGFpbiBpcworc3BlY2lmaWVkLCBhbGwgdXNlci1kZWZpbmVkIGNoYWlucyB0aGF0IGFyZW4ndCByZWZlcmVuY2VkIHdpbGwgYmUgcmVtb3ZlZC4KKy5UUAorLkIgIi1FLCAtLXJlbmFtZS1jaGFpbiIKK1JlbmFtZSB0aGUgc3BlY2lmaWVkIGNoYWluIHRvIGEgbmV3IG5hbWUuICBCZXNpZGVzIHJlbmFtaW5nIGEgdXNlci1kZWZpbmVkCitjaGFpbiwgeW91IGNhbiByZW5hbWUgYSBzdGFuZGFyZCBjaGFpbiB0byBhIG5hbWUgdGhhdCBzdWl0cyB5b3VyCit0YXN0ZS4gRm9yIGV4YW1wbGUsIGlmIHlvdSBsaWtlIFBSRUZPUldBUkRJTkcgbW9yZSB0aGFuIFBSRVJPVVRJTkcsCit0aGVuIHlvdSBjYW4gdXNlIHRoZSAtRSBjb21tYW5kIHRvIHJlbmFtZSB0aGUgUFJFUk9VVElORyBjaGFpbi4gSWYgeW91IGRvCityZW5hbWUgb25lIG9mIHRoZSBzdGFuZGFyZCBlYnRhYmxlcyBjaGFpbiBuYW1lcywgcGxlYXNlIGJlIHN1cmUgdG8gbWVudGlvbgordGhpcyBmYWN0IHNob3VsZCB5b3UgcG9zdCBhIHF1ZXN0aW9uIG9uIHRoZSBlYnRhYmxlcyBtYWlsaW5nIGxpc3RzLgorSXQgd291bGQgYmUgd2lzZSB0byB1c2UgdGhlIHN0YW5kYXJkIG5hbWUgaW4geW91ciBwb3N0LiBSZW5hbWluZyBhIHN0YW5kYXJkCitlYnRhYmxlcyBjaGFpbiBpbiB0aGlzIGZhc2hpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgc3RydWN0dXJlIG9yIGZ1bmN0aW9uaW5nCitvZiB0aGUgZWJ0YWJsZXMga2VybmVsIHRhYmxlLgorLlRQCisuQiAiLS1pbml0LXRhYmxlIgorUmVwbGFjZSB0aGUgY3VycmVudCB0YWJsZSBkYXRhIGJ5IHRoZSBpbml0aWFsIHRhYmxlIGRhdGEuCisuVFAKKy5CICItLWF0b21pYy1pbml0IgorQ29weSB0aGUga2VybmVsJ3MgaW5pdGlhbCBkYXRhIG9mIHRoZSB0YWJsZSB0byB0aGUgc3BlY2lmaWVkCitmaWxlLiBUaGlzIGNhbiBiZSB1c2VkIGFzIHRoZSBmaXJzdCBhY3Rpb24sIGFmdGVyIHdoaWNoIHJ1bGVzIGFyZSBhZGRlZAordG8gdGhlIGZpbGUuIFRoZSBmaWxlIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlCisuQiAtLWF0b21pYy1maWxlCitjb21tYW5kIG9yIHRocm91Z2ggdGhlCisuSVIgRUJUQUJMRVNfQVRPTUlDX0ZJTEUgIiBlbnZpcm9ubWVudCB2YXJpYWJsZS4iCisuVFAKKy5CICItLWF0b21pYy1zYXZlIgorQ29weSB0aGUga2VybmVsJ3MgY3VycmVudCBkYXRhIG9mIHRoZSB0YWJsZSB0byB0aGUgc3BlY2lmaWVkCitmaWxlLiBUaGlzIGNhbiBiZSB1c2VkIGFzIHRoZSBmaXJzdCBhY3Rpb24sIGFmdGVyIHdoaWNoIHJ1bGVzIGFyZSBhZGRlZAordG8gdGhlIGZpbGUuIFRoZSBmaWxlIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlCisuQiAtLWF0b21pYy1maWxlCitjb21tYW5kIG9yIHRocm91Z2ggdGhlCisuSVIgRUJUQUJMRVNfQVRPTUlDX0ZJTEUgIiBlbnZpcm9ubWVudCB2YXJpYWJsZS4iCisuVFAKKy5CICItLWF0b21pYy1jb21taXQiCitSZXBsYWNlIHRoZSBrZXJuZWwgdGFibGUgZGF0YSB3aXRoIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgc3BlY2lmaWVkCitmaWxlLiBUaGlzIGlzIGEgdXNlZnVsIGNvbW1hbmQgdGhhdCBhbGxvd3MgeW91IHRvIGxvYWQgYWxsIHlvdXIgcnVsZXMgb2YgYQorY2VydGFpbiB0YWJsZSBpbnRvIHRoZSBrZXJuZWwgYXQgb25jZSwgc2F2aW5nIHRoZSBrZXJuZWwgYSBsb3Qgb2YgcHJlY2lvdXMKK3RpbWUgYW5kIGFsbG93aW5nIGF0b21pYyB1cGRhdGVzIG9mIHRoZSB0YWJsZXMuIFRoZSBmaWxlIHdoaWNoIGNvbnRhaW5zCit0aGUgdGFibGUgZGF0YSBpcyBjb25zdHJ1Y3RlZCBieSB1c2luZyBlaXRoZXIgdGhlCisuQiAiLS1hdG9taWMtaW5pdCIKK29yIHRoZQorLkIgIi0tYXRvbWljLXNhdmUiCitjb21tYW5kIHRvIGdlbmVyYXRlIGEgc3RhcnRpbmcgZmlsZS4gQWZ0ZXIgdGhhdCwgdXNpbmcgdGhlCisuQiAiLS1hdG9taWMtZmlsZSIKK2NvbW1hbmQgd2hlbiBjb25zdHJ1Y3RpbmcgcnVsZXMgb3Igc2V0dGluZyB0aGUKKy5JUiBFQlRBQkxFU19BVE9NSUNfRklMRSAiIGVudmlyb25tZW50IHZhcmlhYmxlIgorYWxsb3dzIHlvdSB0byBleHRlbmQgdGhlIGZpbGUgYW5kIGJ1aWxkIHRoZSBjb21wbGV0ZSB0YWJsZSBiZWZvcmUKK2NvbW1pdHRpbmcgaXQgdG8gdGhlIGtlcm5lbC4gVGhpcyBjb21tYW5kIGNhbiBiZSB2ZXJ5IHVzZWZ1bCBpbiBib290IHNjcmlwdHMKK3RvIHBvcHVsYXRlIHRoZSBlYnRhYmxlcyB0YWJsZXMgaW4gYSBmYXN0IHdheS4KKy5TUyBNSVNDRUxMQU5PVVMgQ09NTUFORFMKKy5UUAorLkIgIi1WLCAtLXZlcnNpb24iCitTaG93IHRoZSB2ZXJzaW9uIG9mIHRoZSBlYnRhYmxlcyB1c2Vyc3BhY2UgcHJvZ3JhbS4KKy5UUAorLkJSICItaCwgLS1oZWxwICIgIltcZklsaXN0IG9mIG1vZHVsZSBuYW1lc1xmUF0iCitHaXZlIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGNvbW1hbmQgc3ludGF4LiBIZXJlIHlvdSBjYW4gYWxzbyBzcGVjaWZ5CituYW1lcyBvZiBleHRlbnNpb25zIGFuZCBlYnRhYmxlcyB3aWxsIHRyeSB0byB3cml0ZSBoZWxwIGFib3V0IHRob3NlCitleHRlbnNpb25zLiBFLmcuCisuSVIgImVidGFibGVzIC1oIHNuYXQgbG9nIGlwIGFycCIgLgorU3BlY2lmeQorLkkgbGlzdF9leHRlbnNpb25zCit0byBsaXN0IGFsbCBleHRlbnNpb25zIHN1cHBvcnRlZCBieSB0aGUgdXNlcnNwYWNlCit1dGlsaXR5LgorLlRQCisuQlIgIi1qLCAtLWp1bXAgIiAiXGZJdGFyZ2V0XGZQIgorVGhlIHRhcmdldCBvZiB0aGUgcnVsZS4gVGhpcyBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisuQlIgQUNDRVBUICwKKy5CUiBEUk9QICwKKy5CUiBDT05USU5VRSAsCisuQlIgUkVUVVJOICwKK2EgdGFyZ2V0IGV4dGVuc2lvbiAoc2VlCisuQlIgIlRBUkdFVCBFWFRFTlNJT05TIiAiKSIKK29yIGEgdXNlci1kZWZpbmVkIGNoYWluIG5hbWUuCisuVFAKKy5CIC0tYXRvbWljLWZpbGUgIlxmSWZpbGVcZlAiCitMZXQgdGhlIGNvbW1hbmQgb3BlcmF0ZSBvbiB0aGUgc3BlY2lmaWVkCisuSVIgZmlsZSAuCitUaGUgZGF0YSBvZiB0aGUgdGFibGUgdG8KK29wZXJhdGUgb24gd2lsbCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgZmlsZSBhbmQgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uCit3aWxsIGJlIHNhdmVkIGJhY2sgaW50byB0aGUgZmlsZS4gSWYgc3BlY2lmaWVkLCB0aGlzIG9wdGlvbiBzaG91bGQgY29tZQorYmVmb3JlIHRoZSBjb21tYW5kIHNwZWNpZmljYXRpb24uIEFuIGFsdGVybmF0aXZlIHRoYXQgc2hvdWxkIGJlIHByZWZlcnJlZCwKK2lzIHNldHRpbmcgdGhlCisuSVIgRUJUQUJMRVNfQVRPTUlDX0ZJTEUgIiBlbnZpcm9ubWVudCB2YXJpYWJsZS4iCisuVFAKKy5CIC1NLCAtLW1vZHByb2JlICJcZklwcm9ncmFtXGZQIgorV2hlbiB0YWxraW5nIHRvIHRoZSBrZXJuZWwsIHVzZSB0aGlzCisuSSBwcm9ncmFtCit0byB0cnkgdG8gYXV0b21hdGljYWxseSBsb2FkIG1pc3Npbmcga2VybmVsIG1vZHVsZXMuCisuVFAKKy5CIC0tY29uY3VycmVudAorVXNlIGEgZmlsZSBsb2NrIHRvIHN1cHBvcnQgY29uY3VycmVudCBzY3JpcHRzIHVwZGF0aW5nIHRoZSBlYnRhYmxlcyBrZXJuZWwgdGFibGVzLgorCisuU1MKK1JVTEUgU1BFQ0lGSUNBVElPTlMKK1RoZSBmb2xsb3dpbmcgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBtYWtlIHVwIGEgcnVsZSBzcGVjaWZpY2F0aW9uIChhcyB1c2VkIAoraW4gdGhlIGFkZCBhbmQgZGVsZXRlIGNvbW1hbmRzKS4gQSAiISIgb3B0aW9uIGJlZm9yZSB0aGUgc3BlY2lmaWNhdGlvbiAKK2ludmVydHMgdGhlIHRlc3QgZm9yIHRoYXQgc3BlY2lmaWNhdGlvbi4gQXBhcnQgZnJvbSB0aGVzZSBzdGFuZGFyZCBydWxlIAorc3BlY2lmaWNhdGlvbnMgdGhlcmUgYXJlIHNvbWUgb3RoZXIgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBvZiBpbnRlcmVzdC4KK1NlZSBib3RoIHRoZSAKKy5CUiAiTUFUQ0ggRVhURU5TSU9OUyIgCithbmQgdGhlCisuQlIgIldBVENIRVIgRVhURU5TSU9OUyIgCitiZWxvdy4KKy5UUAorLkJSICItcCwgLS1wcm90b2NvbCAiICJbIV0gXGZJcHJvdG9jb2xcZlAiCitUaGUgcHJvdG9jb2wgdGhhdCB3YXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSBmcmFtZS4gVGhpcyBjYW4gYmUgYQoraGV4YWRlY2ltYWwgbnVtYmVyLCBhYm92ZSAKKy5JUiAweDA2MDAgLAorYSBuYW1lIChlLmcuCisuSSBBUlAKKykgb3IKKy5CUiBMRU5HVEggLgorVGhlIHByb3RvY29sIGZpZWxkIG9mIHRoZSBFdGhlcm5ldCBmcmFtZSBjYW4gYmUgdXNlZCB0byBkZW5vdGUgdGhlCitsZW5ndGggb2YgdGhlIGhlYWRlciAoODAyLjIvODAyLjMgbmV0d29ya3MpLiBXaGVuIHRoZSB2YWx1ZSBvZiB0aGF0IGZpZWxkIGlzCitiZWxvdyBvciBlcXVhbHMKKy5JUiAweDA2MDAgLAordGhlIHZhbHVlIGVxdWFscyB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyIGFuZCBzaG91bGRuJ3QgYmUgdXNlZCBhcyBhCitwcm90b2NvbCBudW1iZXIuIEluc3RlYWQsIGFsbCBmcmFtZXMgd2hlcmUgdGhlIHByb3RvY29sIGZpZWxkIGlzIHVzZWQgYXMKK3RoZSBsZW5ndGggZmllbGQgYXJlIGFzc3VtZWQgdG8gYmUgb2YgdGhlIHNhbWUgJ3Byb3RvY29sJy4gVGhlIHByb3RvY29sCituYW1lIHVzZWQgaW4gZWJ0YWJsZXMgZm9yIHRoZXNlIGZyYW1lcyBpcworLkJSIExFTkdUSCAuCisuYnIKK1RoZSBmaWxlCisuQiAvZXRjL2V0aGVydHlwZXMKK2NhbiBiZSB1c2VkIHRvIHNob3cgcmVhZGFibGUKK2NoYXJhY3RlcnMgaW5zdGVhZCBvZiBoZXhhZGVjaW1hbCBudW1iZXJzIGZvciB0aGUgcHJvdG9jb2xzLiBGb3IgZXhhbXBsZSwKKy5JIDB4MDgwMAord2lsbCBiZSByZXByZXNlbnRlZCBieSAKKy5JUiBJUFY0IC4KK1RoZSB1c2Ugb2YgdGhpcyBmaWxlIGlzIG5vdCBjYXNlIHNlbnNpdGl2ZS4gCitTZWUgdGhhdCBmaWxlIGZvciBtb3JlIGluZm9ybWF0aW9uLiBUaGUgZmxhZyAKKy5CIC0tcHJvdG8KK2lzIGFuIGFsaWFzIGZvciB0aGlzIG9wdGlvbi4KKy5UUCAKKy5CUiAiLWksIC0taW4taW50ZXJmYWNlICIgIlshXSBcZkluYW1lXGZQIgorVGhlIGludGVyZmFjZSAoYnJpZGdlIHBvcnQpIHZpYSB3aGljaCBhIGZyYW1lIGlzIHJlY2VpdmVkICh0aGlzIG9wdGlvbiBpcyB1c2VmdWwgaW4gdGhlCisuQlIgSU5QVVQgLAorLkJSIEZPUldBUkQgLAorLkJSIFBSRVJPVVRJTkcgIiBhbmQgIiBCUk9VVElORworY2hhaW5zKS4gSWYgdGhlIGludGVyZmFjZSBuYW1lIGVuZHMgd2l0aCAnKycsIHRoZW4KK2FueSBpbnRlcmZhY2UgbmFtZSB0aGF0IGJlZ2lucyB3aXRoIHRoaXMgbmFtZSAoZGlzcmVnYXJkaW5nICcrJykgd2lsbCBtYXRjaC4KK1RoZSBmbGFnCisuQiAtLWluLWlmCitpcyBhbiBhbGlhcyBmb3IgdGhpcyBvcHRpb24uCisuVFAKKy5CUiAiLS1sb2dpY2FsLWluICIgIlshXSBcZkluYW1lXGZQIgorVGhlIChsb2dpY2FsKSBicmlkZ2UgaW50ZXJmYWNlIHZpYSB3aGljaCBhIGZyYW1lIGlzIHJlY2VpdmVkICh0aGlzIG9wdGlvbiBpcyB1c2VmdWwgaW4gdGhlCisuQlIgSU5QVVQgLAorLkJSIEZPUldBUkQgLAorLkJSIFBSRVJPVVRJTkcgIiBhbmQgIiBCUk9VVElORworY2hhaW5zKS4KK0lmIHRoZSBpbnRlcmZhY2UgbmFtZSBlbmRzIHdpdGggJysnLCB0aGVuCithbnkgaW50ZXJmYWNlIG5hbWUgdGhhdCBiZWdpbnMgd2l0aCB0aGlzIG5hbWUgKGRpc3JlZ2FyZGluZyAnKycpIHdpbGwgbWF0Y2guCisuVFAKKy5CUiAiLW8sIC0tb3V0LWludGVyZmFjZSAiICJbIV0gXGZJbmFtZVxmUCIKK1RoZSBpbnRlcmZhY2UgKGJyaWRnZSBwb3J0KSB2aWEgd2hpY2ggYSBmcmFtZSBpcyBnb2luZyB0byBiZSBzZW50ICh0aGlzIG9wdGlvbiBpcyB1c2VmdWwgaW4gdGhlCisuQlIgT1VUUFVUICwKKy5CIEZPUldBUkQKK2FuZAorLkIgUE9TVFJPVVRJTkcKK2NoYWlucykuIElmIHRoZSBpbnRlcmZhY2UgbmFtZSBlbmRzIHdpdGggJysnLCB0aGVuCithbnkgaW50ZXJmYWNlIG5hbWUgdGhhdCBiZWdpbnMgd2l0aCB0aGlzIG5hbWUgKGRpc3JlZ2FyZGluZyAnKycpIHdpbGwgbWF0Y2guCitUaGUgZmxhZworLkIgLS1vdXQtaWYKK2lzIGFuIGFsaWFzIGZvciB0aGlzIG9wdGlvbi4KKy5UUAorLkJSICItLWxvZ2ljYWwtb3V0ICIgIlshXSBcZkluYW1lXGZQIgorVGhlIChsb2dpY2FsKSBicmlkZ2UgaW50ZXJmYWNlIHZpYSB3aGljaCBhIGZyYW1lIGlzIGdvaW5nIHRvIGJlIHNlbnQgKHRoaXMgb3B0aW9uCitpcyB1c2VmdWwgaW4gdGhlCisuQlIgT1VUUFVUICwKKy5CIEZPUldBUkQKK2FuZAorLkIgUE9TVFJPVVRJTkcKK2NoYWlucykuCitJZiB0aGUgaW50ZXJmYWNlIG5hbWUgZW5kcyB3aXRoICcrJywgdGhlbgorYW55IGludGVyZmFjZSBuYW1lIHRoYXQgYmVnaW5zIHdpdGggdGhpcyBuYW1lIChkaXNyZWdhcmRpbmcgJysnKSB3aWxsIG1hdGNoLgorLlRQCisuQlIgIi1zLCAtLXNvdXJjZSAiICJbIV0gXGZJYWRkcmVzc1xmUFsvXGZJbWFza1xmUF0iCitUaGUgc291cmNlIE1BQyBhZGRyZXNzLiBCb3RoIG1hc2sgYW5kIGFkZHJlc3MgYXJlIHdyaXR0ZW4gYXMgNiBoZXhhZGVjaW1hbAorbnVtYmVycyBzZXBhcmF0ZWQgYnkgY29sb25zLiBBbHRlcm5hdGl2ZWx5IG9uZSBjYW4gc3BlY2lmeSBVbmljYXN0LAorTXVsdGljYXN0LCBCcm9hZGNhc3Qgb3IgQkdBIChCcmlkZ2UgR3JvdXAgQWRkcmVzcyk6CisuYnIKKy5JUiAiVW5pY2FzdCIgIj0wMDowMDowMDowMDowMDowMC8wMTowMDowMDowMDowMDowMCwiCisuSVIgIk11bHRpY2FzdCIgIj0wMTowMDowMDowMDowMDowMC8wMTowMDowMDowMDowMDowMCwiCisuSVIgIkJyb2FkY2FzdCIgIj1mZjpmZjpmZjpmZjpmZjpmZi9mZjpmZjpmZjpmZjpmZjpmZiBvciIKKy5JUiAiQkdBIiAiPTAxOjgwOmMyOjAwOjAwOjAwL2ZmOmZmOmZmOmZmOmZmOmZmLiIKK05vdGUgdGhhdCBhIGJyb2FkY2FzdAorYWRkcmVzcyB3aWxsIGFsc28gbWF0Y2ggdGhlIG11bHRpY2FzdCBzcGVjaWZpY2F0aW9uLiBUaGUgZmxhZworLkIgLS1zcmMKK2lzIGFuIGFsaWFzIGZvciB0aGlzIG9wdGlvbi4KKy5UUAorLkJSICItZCwgLS1kZXN0aW5hdGlvbiAiICJbIV0gXGZJYWRkcmVzc1xmUFsvXGZJbWFza1xmUF0iCitUaGUgZGVzdGluYXRpb24gTUFDIGFkZHJlc3MuIFNlZQorLkIgLXMKKyhhYm92ZSkgZm9yIG1vcmUgZGV0YWlscyBvbiBNQUMgYWRkcmVzc2VzLiBUaGUgZmxhZworLkIgLS1kc3QKK2lzIGFuIGFsaWFzIGZvciB0aGlzIG9wdGlvbi4KKy5UUAorLkJSICItYywgLS1zZXQtY291bnRlciAiICJcZklwY250IGJjbnRcZlAiCitJZiB1c2VkIHdpdGgKKy5CUiAtQSAiIG9yICIgLUkgIiwgdGhlbiB0aGUgcGFja2V0IGFuZCBieXRlIGNvdW50ZXJzIG9mIHRoZSBuZXcgcnVsZSB3aWxsIGJlIHNldCB0bworLklSIHBjbnQgIiwgcmVzcC4gIiBiY250ICIuCitJZiB1c2VkIHdpdGggdGhlCisuQlIgLUMgIiBvciAiIC1EICIgY29tbWFuZHMsIG9ubHkgcnVsZXMgd2l0aCBhIHBhY2tldCBhbmQgYnl0ZSBjb3VudCBlcXVhbCB0byIKKy5JUiBwY250ICIsIHJlc3AuICIgYmNudCAiIHdpbGwgbWF0Y2guIgorCisuU1MgTUFUQ0ggRVhURU5TSU9OUworRWJ0YWJsZXMgZXh0ZW5zaW9ucyBhcmUgZHluYW1pY2FsbHkgbG9hZGVkIGludG8gdGhlIHVzZXJzcGFjZSB0b29sLAordGhlcmUgaXMgdGhlcmVmb3JlIG5vIG5lZWQgdG8gZXhwbGljaXRseSBsb2FkIHRoZW0gd2l0aCBhCistbSBvcHRpb24gbGlrZSBpcyBkb25lIGluIGlwdGFibGVzLgorVGhlc2UgZXh0ZW5zaW9ucyBkZWFsIHdpdGggZnVuY3Rpb25hbGl0eSBzdXBwb3J0ZWQgYnkga2VybmVsIG1vZHVsZXMgc3VwcGxlbWVudGFsIHRvCit0aGUgY29yZSBlYnRhYmxlcyBjb2RlLgorLlNTIDgwMl8zCitTcGVjaWZ5IDgwMi4zIERTQVAvU1NBUCBmaWVsZHMgb3IgU05BUCB0eXBlLiAgVGhlIHByb3RvY29sIG11c3QgYmUgc3BlY2lmaWVkIGFzCisuSVIgIkxFTkdUSCAiICIoc2VlIHRoZSBvcHRpb24gIiAiIC1wICIgYWJvdmUpLgorLlRQCisuQlIgIi0tODAyXzMtc2FwICIgIlshXSBcZklzYXBcZlAiCitEU0FQIGFuZCBTU0FQIGFyZSB0d28gb25lIGJ5dGUgODAyLjMgZmllbGRzLiAgVGhlIGJ5dGVzIGFyZSBhbHdheXMKK2VxdWFsLCBzbyBvbmx5IG9uZSBieXRlIChoZXhhZGVjaW1hbCkgaXMgbmVlZGVkIGFzIGFuIGFyZ3VtZW50LgorLlRQCisuQlIgIi0tODAyXzMtdHlwZSAiICJbIV0gXGZJdHlwZVxmUCIKK0lmIHRoZSA4MDIuMyBEU0FQIGFuZCBTU0FQIHZhbHVlcyBhcmUgMHhhYSB0aGVuIHRoZSBTTkFQIHR5cGUgZmllbGQgbXVzdAorYmUgY29uc3VsdGVkIHRvIGRldGVybWluZSB0aGUgcGF5bG9hZCBwcm90b2NvbC4gIFRoaXMgaXMgYSB0d28gYnl0ZQorKGhleGFkZWNpbWFsKSBhcmd1bWVudC4gIE9ubHkgODAyLjMgZnJhbWVzIHdpdGggRFNBUC9TU0FQIDB4YWEgYXJlCitjaGVja2VkIGZvciB0eXBlLgorLlNTIGFtb25nCitNYXRjaCBhIE1BQyBhZGRyZXNzIG9yIE1BQy9JUCBhZGRyZXNzIHBhaXIgdmVyc3VzIGEgbGlzdCBvZiBNQUMgYWRkcmVzc2VzCithbmQgTUFDL0lQIGFkZHJlc3MgcGFpcnMuCitBIGxpc3QgZW50cnkgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorLklSIHh4Onh4Onh4Onh4Onh4Onh4Wz1pcC5pcC5pcC5pcF1bLF0gIi4gTXVsdGlwbGUiCitsaXN0IGVudHJpZXMgYXJlIHNlcGFyYXRlZCBieSBhIGNvbW1hLCBzcGVjaWZ5aW5nIGFuIElQIGFkZHJlc3MgY29ycmVzcG9uZGluZyB0bwordGhlIE1BQyBhZGRyZXNzIGlzIG9wdGlvbmFsLiBNdWx0aXBsZSBNQUMvSVAgYWRkcmVzcyBwYWlycyB3aXRoIHRoZSBzYW1lIE1BQyBhZGRyZXNzCitidXQgZGlmZmVyZW50IElQIGFkZHJlc3MgKGFuZCB2aWNlIHZlcnNhKSBjYW4gYmUgc3BlY2lmaWVkLiBJZiB0aGUgTUFDIGFkZHJlc3MgZG9lc24ndAorbWF0Y2ggYW55IGVudHJ5IGZyb20gdGhlIGxpc3QsIHRoZSBmcmFtZSBkb2Vzbid0IG1hdGNoIHRoZSBydWxlICh1bmxlc3MgIiEiIHdhcyB1c2VkKS4KKy5UUAorLkJSICItLWFtb25nLWRzdCAiICJbIV0gXGZJbGlzdFxmUCIKK0NvbXBhcmUgdGhlIE1BQyBkZXN0aW5hdGlvbiB0byB0aGUgZ2l2ZW4gbGlzdC4gSWYgdGhlIEV0aGVybmV0IGZyYW1lIGhhcyB0eXBlCisuSVIgSVB2NCAiIG9yICIgQVJQICwKK3RoZW4gY29tcGFyaXNvbiB3aXRoIE1BQy9JUCBkZXN0aW5hdGlvbiBhZGRyZXNzIHBhaXJzIGZyb20gdGhlCitsaXN0IGlzIHBvc3NpYmxlLgorLlRQCisuQlIgIi0tYW1vbmctc3JjICIgIlshXSBcZklsaXN0XGZQIgorQ29tcGFyZSB0aGUgTUFDIHNvdXJjZSB0byB0aGUgZ2l2ZW4gbGlzdC4gSWYgdGhlIEV0aGVybmV0IGZyYW1lIGhhcyB0eXBlCisuSVIgSVB2NCAiIG9yICIgQVJQICwKK3RoZW4gY29tcGFyaXNvbiB3aXRoIE1BQy9JUCBzb3VyY2UgYWRkcmVzcyBwYWlycyBmcm9tIHRoZSBsaXN0CitpcyBwb3NzaWJsZS4KKy5UUAorLkJSICItLWFtb25nLWRzdC1maWxlICIgIlshXSBcZklmaWxlXGZQIgorU2FtZSBhcworLkJSIC0tYW1vbmctZHN0ICIgYnV0IHRoZSBsaXN0IGlzIHJlYWQgaW4gZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUuIgorLlRQCisuQlIgIi0tYW1vbmctc3JjLWZpbGUgIiAiWyFdIFxmSWZpbGVcZlAiCitTYW1lIGFzCisuQlIgLS1hbW9uZy1zcmMgIiBidXQgdGhlIGxpc3QgaXMgcmVhZCBpbiBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZS4iCisuU1MgYXJwCitTcGVjaWZ5IChSKUFSUCBmaWVsZHMuIFRoZSBwcm90b2NvbCBtdXN0IGJlIHNwZWNpZmllZCBhcworLklSIEFSUCAiIG9yICIgUkFSUCAuCisuVFAKKy5CUiAiLS1hcnAtb3Bjb2RlICIgIlshXSBcZklvcGNvZGVcZlAiCitUaGUgKFIpQVJQIG9wY29kZSAoZGVjaW1hbCBvciBhIHN0cmluZywgZm9yIG1vcmUgZGV0YWlscyBzZWUKKy5CUiAiZWJ0YWJsZXMgLWggYXJwIiApLgorLlRQCisuQlIgIi0tYXJwLWh0eXBlICIgIlshXSBcZkloYXJkd2FyZSB0eXBlXGZQIgorVGhlIGhhcmR3YXJlIHR5cGUsIHRoaXMgY2FuIGJlIGEgZGVjaW1hbCBvciB0aGUgc3RyaW5nCisuSSBFdGhlcm5ldAorKHdoaWNoIHNldHMKKy5JIHR5cGUKK3RvIDEpLiBNb3N0IChSKUFSUCBwYWNrZXRzIGhhdmUgRXRlcm5ldCBhcyBoYXJkd2FyZSB0eXBlLgorLlRQCisuQlIgIi0tYXJwLXB0eXBlICIgIlshXSBcZklwcm90b2NvbCB0eXBlXGZQIgorVGhlIHByb3RvY29sIHR5cGUgZm9yIHdoaWNoIHRoZSAocilhcnAgaXMgdXNlZCAoaGV4YWRlY2ltYWwgb3IgdGhlIHN0cmluZworLklSIElQdjQgLAorZGVub3RpbmcgMHgwODAwKS4KK01vc3QgKFIpQVJQIHBhY2tldHMgaGF2ZSBwcm90b2NvbCB0eXBlIElQdjQuCisuVFAKKy5CUiAiLS1hcnAtaXAtc3JjICIgIlshXSBcZklhZGRyZXNzXGZQWy9cZkltYXNrXGZQXSIKK1RoZSAoUilBUlAgSVAgc291cmNlIGFkZHJlc3Mgc3BlY2lmaWNhdGlvbi4KKy5UUAorLkJSICItLWFycC1pcC1kc3QgIiAiWyFdIFxmSWFkZHJlc3NcZlBbL1xmSW1hc2tcZlBdIgorVGhlIChSKUFSUCBJUCBkZXN0aW5hdGlvbiBhZGRyZXNzIHNwZWNpZmljYXRpb24uCisuVFAKKy5CUiAiLS1hcnAtbWFjLXNyYyAiICJbIV0gXGZJYWRkcmVzc1xmUFsvXGZJbWFza1xmUF0iCitUaGUgKFIpQVJQIE1BQyBzb3VyY2UgYWRkcmVzcyBzcGVjaWZpY2F0aW9uLgorLlRQCisuQlIgIi0tYXJwLW1hYy1kc3QgIiAiWyFdIFxmSWFkZHJlc3NcZlBbL1xmSW1hc2tcZlBdIgorVGhlIChSKUFSUCBNQUMgZGVzdGluYXRpb24gYWRkcmVzcyBzcGVjaWZpY2F0aW9uLgorLlRQCisuQlIgIiIgIlshXSIgIiAtLWFycC1ncmF0dWl0b3VzIgorQ2hlY2tzIGZvciBBUlAgZ3JhdHVpdG91cyBwYWNrZXRzOiBjaGVja3MgZXF1YWxpdHkgb2YgSVB2NCBzb3VyY2UKK2FkZHJlc3MgYW5kIElQdjQgZGVzdGluYXRpb24gYWRkcmVzcyBpbnNpZGUgdGhlIEFSUCBoZWFkZXIuCisuU1MgaXAKK1NwZWNpZnkgSVB2NCBmaWVsZHMuIFRoZSBwcm90b2NvbCBtdXN0IGJlIHNwZWNpZmllZCBhcworLklSIElQdjQgLgorLlRQCisuQlIgIi0taXAtc291cmNlICIgIlshXSBcZklhZGRyZXNzXGZQWy9cZkltYXNrXGZQXSIKK1RoZSBzb3VyY2UgSVAgYWRkcmVzcy4KK1RoZSBmbGFnCisuQiAtLWlwLXNyYworaXMgYW4gYWxpYXMgZm9yIHRoaXMgb3B0aW9uLgorLlRQCisuQlIgIi0taXAtZGVzdGluYXRpb24gIiAiWyFdIFxmSWFkZHJlc3NcZlBbL1xmSW1hc2tcZlBdIgorVGhlIGRlc3RpbmF0aW9uIElQIGFkZHJlc3MuCitUaGUgZmxhZworLkIgLS1pcC1kc3QKK2lzIGFuIGFsaWFzIGZvciB0aGlzIG9wdGlvbi4KKy5UUAorLkJSICItLWlwLXRvcyAiICJbIV0gXGZJdG9zXGZQIgorVGhlIElQIHR5cGUgb2Ygc2VydmljZSwgaW4gaGV4YWRlY2ltYWwgbnVtYmVycy4KKy5CUiBJUHY0IC4KKy5UUAorLkJSICItLWlwLXByb3RvY29sICIgIlshXSBcZklwcm90b2NvbFxmUCIKK1RoZSBJUCBwcm90b2NvbC4KK1RoZSBmbGFnCisuQiAtLWlwLXByb3RvCitpcyBhbiBhbGlhcyBmb3IgdGhpcyBvcHRpb24uCisuVFAKKy5CUiAiLS1pcC1zb3VyY2UtcG9ydCAiICJbIV0gXGZJcG9ydDFcZlBbOlxmSXBvcnQyXGZQXSIKK1RoZSBzb3VyY2UgcG9ydCBvciBwb3J0IHJhbmdlIGZvciB0aGUgSVAgcHJvdG9jb2xzIDYgKFRDUCksIDE3CisoVURQKSwgMzMgKERDQ1ApIG9yIDEzMiAoU0NUUCkuIFRoZQorLkIgLS1pcC1wcm90b2NvbAorb3B0aW9uIG11c3QgYmUgc3BlY2lmaWVkIGFzCisuSVIgVENQICIsICIgVURQICIsICIgRENDUCAiIG9yICIgU0NUUCAuCitJZgorLklSIHBvcnQxICIgaXMgb21pdHRlZCwgIiAwOnBvcnQyICIgaXMgdXNlZDsgaWYgIiBwb3J0MiAiIGlzIG9taXR0ZWQgYnV0IGEgY29sb24gaXMgc3BlY2lmaWVkLCAiIHBvcnQxOjY1NTM1ICIgaXMgdXNlZC4iCitUaGUgZmxhZworLkIgLS1pcC1zcG9ydAoraXMgYW4gYWxpYXMgZm9yIHRoaXMgb3B0aW9uLgorLlRQCisuQlIgIi0taXAtZGVzdGluYXRpb24tcG9ydCAiICJbIV0gXGZJcG9ydDFcZlBbOlxmSXBvcnQyXGZQXSIKK1RoZSBkZXN0aW5hdGlvbiBwb3J0IG9yIHBvcnQgcmFuZ2UgZm9yIGlwIHByb3RvY29scyA2IChUQ1ApLCAxNworKFVEUCksIDMzIChEQ0NQKSBvciAxMzIgKFNDVFApLiBUaGUKKy5CIC0taXAtcHJvdG9jb2wKK29wdGlvbiBtdXN0IGJlIHNwZWNpZmllZCBhcworLklSIFRDUCAiLCAiIFVEUCAiLCAiIERDQ1AgIiBvciAiIFNDVFAgLgorSWYKKy5JUiBwb3J0MSAiIGlzIG9taXR0ZWQsICIgMDpwb3J0MiAiIGlzIHVzZWQ7IGlmICIgcG9ydDIgIiBpcyBvbWl0dGVkIGJ1dCBhIGNvbG9uIGlzIHNwZWNpZmllZCwgIiBwb3J0MTo2NTUzNSAiIGlzIHVzZWQuIgorVGhlIGZsYWcKKy5CIC0taXAtZHBvcnQKK2lzIGFuIGFsaWFzIGZvciB0aGlzIG9wdGlvbi4KKy5TUyBpcDYKK1NwZWNpZnkgSVB2NiBmaWVsZHMuIFRoZSBwcm90b2NvbCBtdXN0IGJlIHNwZWNpZmllZCBhcworLklSIElQdjYgLgorLlRQCisuQlIgIi0taXA2LXNvdXJjZSAiICJbIV0gXGZJYWRkcmVzc1xmUFsvXGZJbWFza1xmUF0iCitUaGUgc291cmNlIElQdjYgYWRkcmVzcy4KK1RoZSBmbGFnCisuQiAtLWlwNi1zcmMKK2lzIGFuIGFsaWFzIGZvciB0aGlzIG9wdGlvbi4KKy5UUAorLkJSICItLWlwNi1kZXN0aW5hdGlvbiAiICJbIV0gXGZJYWRkcmVzc1xmUFsvXGZJbWFza1xmUF0iCitUaGUgZGVzdGluYXRpb24gSVB2NiBhZGRyZXNzLgorVGhlIGZsYWcKKy5CIC0taXA2LWRzdAoraXMgYW4gYWxpYXMgZm9yIHRoaXMgb3B0aW9uLgorLlRQCisuQlIgIi0taXA2LXRjbGFzcyAiICJbIV0gXGZJdGNsYXNzXGZQIgorVGhlIElQdjYgdHJhZmZpYyBjbGFzcywgaW4gaGV4YWRlY2ltYWwgbnVtYmVycy4KKy5UUAorLkJSICItLWlwNi1wcm90b2NvbCAiICJbIV0gXGZJcHJvdG9jb2xcZlAiCitUaGUgSVAgcHJvdG9jb2wuCitUaGUgZmxhZworLkIgLS1pcDYtcHJvdG8KK2lzIGFuIGFsaWFzIGZvciB0aGlzIG9wdGlvbi4KKy5UUAorLkJSICItLWlwNi1zb3VyY2UtcG9ydCAiICJbIV0gXGZJcG9ydDFcZlBbOlxmSXBvcnQyXGZQXSIKK1RoZSBzb3VyY2UgcG9ydCBvciBwb3J0IHJhbmdlIGZvciB0aGUgSVB2NiBwcm90b2NvbHMgNiAoVENQKSwgMTcKKyhVRFApLCAzMyAoRENDUCkgb3IgMTMyIChTQ1RQKS4gVGhlCisuQiAtLWlwNi1wcm90b2NvbAorb3B0aW9uIG11c3QgYmUgc3BlY2lmaWVkIGFzCisuSVIgVENQICIsICIgVURQICIsICIgRENDUCAiIG9yICIgU0NUUCAuCitJZgorLklSIHBvcnQxICIgaXMgb21pdHRlZCwgIiAwOnBvcnQyICIgaXMgdXNlZDsgaWYgIiBwb3J0MiAiIGlzIG9taXR0ZWQgYnV0IGEgY29sb24gaXMgc3BlY2lmaWVkLCAiIHBvcnQxOjY1NTM1ICIgaXMgdXNlZC4iCitUaGUgZmxhZworLkIgLS1pcDYtc3BvcnQKK2lzIGFuIGFsaWFzIGZvciB0aGlzIG9wdGlvbi4KKy5UUAorLkJSICItLWlwNi1kZXN0aW5hdGlvbi1wb3J0ICIgIlshXSBcZklwb3J0MVxmUFs6XGZJcG9ydDJcZlBdIgorVGhlIGRlc3RpbmF0aW9uIHBvcnQgb3IgcG9ydCByYW5nZSBmb3IgSVB2NiBwcm90b2NvbHMgNiAoVENQKSwgMTcKKyhVRFApLCAzMyAoRENDUCkgb3IgMTMyIChTQ1RQKS4gVGhlCisuQiAtLWlwNi1wcm90b2NvbAorb3B0aW9uIG11c3QgYmUgc3BlY2lmaWVkIGFzCisuSVIgVENQICIsICIgVURQICIsICIgRENDUCAiIG9yICIgU0NUUCAuCitJZgorLklSIHBvcnQxICIgaXMgb21pdHRlZCwgIiAwOnBvcnQyICIgaXMgdXNlZDsgaWYgIiBwb3J0MiAiIGlzIG9taXR0ZWQgYnV0IGEgY29sb24gaXMgc3BlY2lmaWVkLCAiIHBvcnQxOjY1NTM1ICIgaXMgdXNlZC4iCitUaGUgZmxhZworLkIgLS1pcDYtZHBvcnQKK2lzIGFuIGFsaWFzIGZvciB0aGlzIG9wdGlvbi4KKy5UUAorLkJSICItLWlwNi1pY21wLXR5cGUgIiAiWyFdIHtcZkl0eXBlXGZQWzpcZkl0eXBlXGZQXS9cZkljb2RlXGZQWzpcZkljb2RlXGZQXXxcZkl0eXBlbmFtZVxmUH0iCitTcGVjaWZ5IGlwdjZcLWljbXAgdHlwZSBhbmQgY29kZSB0byBtYXRjaC4KK1JhbmdlcyBmb3IgYm90aCB0eXBlIGFuZCBjb2RlIGFyZSBzdXBwb3J0ZWQuIFR5cGUgYW5kIGNvZGUgYXJlCitzZXBhcmF0ZWQgYnkgYSBzbGFzaC4gVmFsaWQgbnVtYmVycyBmb3IgdHlwZSBhbmQgcmFuZ2UgYXJlIDAgdG8gMjU1LgorVG8gbWF0Y2ggYSBzaW5nbGUgdHlwZSBpbmNsdWRpbmcgYWxsIHZhbGlkIGNvZGVzLCBzeW1ib2xpYyBuYW1lcyBjYW4KK2JlIHVzZWQgaW5zdGVhZCBvZiBudW1iZXJzLiBUaGUgbGlzdCBvZiBrbm93biB0eXBlIG5hbWVzIGlzIHNob3duIGJ5IHRoZSBjb21tYW5kCisubmYKKyAgZWJ0YWJsZXMgXC1cLWhlbHAgaXA2CisuZmkKK1RoaXMgb3B0aW9uIGlzIG9ubHkgdmFsaWQgZm9yIFwtXC1pcDYtcHJvY29jb2wgaXB2Ni1pY21wLgorLlNTIGxpbWl0CitUaGlzIG1vZHVsZSBtYXRjaGVzIGF0IGEgbGltaXRlZCByYXRlIHVzaW5nIGEgdG9rZW4gYnVja2V0IGZpbHRlci4KK0EgcnVsZSB1c2luZyB0aGlzIGV4dGVuc2lvbiB3aWxsIG1hdGNoIHVudGlsIHRoaXMgbGltaXQgaXMgcmVhY2hlZC4KK0l0IGNhbiBiZSB1c2VkIHdpdGggdGhlCisuQiAtLWxvZword2F0Y2hlciB0byBnaXZlIGxpbWl0ZWQgbG9nZ2luZywgZm9yIGV4YW1wbGUuIEl0cyB1c2UgaXMgdGhlIHNhbWUKK2FzIHRoZSBsaW1pdCBtYXRjaCBvZiBpcHRhYmxlcy4KKy5UUAorLkJSICItLWxpbWl0ICIgIltcZkl2YWx1ZVxmUF0iCitNYXhpbXVtIGF2ZXJhZ2UgbWF0Y2hpbmcgcmF0ZTogc3BlY2lmaWVkIGFzIGEgbnVtYmVyLCB3aXRoIGFuIG9wdGlvbmFsCisuSVIgL3NlY29uZCAiLCAiIC9taW51dGUgIiwgIiAvaG91ciAiLCBvciAiIC9kYXkgIiBzdWZmaXg7IHRoZSBkZWZhdWx0IGlzICIgMy9ob3VyIC4KKy5UUAorLkJSICItLWxpbWl0LWJ1cnN0ICIgIltcZkludW1iZXJcZlBdIgorTWF4aW11bSBpbml0aWFsIG51bWJlciBvZiBwYWNrZXRzIHRvIG1hdGNoOiB0aGlzIG51bWJlciBnZXRzIHJlY2hhcmdlZCBieQorb25lIGV2ZXJ5IHRpbWUgdGhlIGxpbWl0IHNwZWNpZmllZCBhYm92ZSBpcyBub3QgcmVhY2hlZCwgdXAgdG8gdGhpcworbnVtYmVyOyB0aGUgZGVmYXVsdCBpcworLklSIDUgLgorLlNTIG1hcmtfbQorLlRQCisuQlIgIi0tbWFyayAiICJbIV0gW1xmSXZhbHVlXGZQXVsvXGZJbWFza1xmUF0iCitNYXRjaGVzIGZyYW1lcyB3aXRoIHRoZSBnaXZlbiB1bnNpZ25lZCBtYXJrIHZhbHVlLiBJZiBhCisuSVIgdmFsdWUgIiBhbmQgIiBtYXNrICIgYXJlIHNwZWNpZmllZCwgdGhlIGxvZ2ljYWwgQU5EIG9mIHRoZSBtYXJrIHZhbHVlIG9mIHRoZSBmcmFtZSBhbmQiCit0aGUgdXNlci1zcGVjaWZpZWQKKy5JUiBtYXNrICIgaXMgdGFrZW4gYmVmb3JlIGNvbXBhcmluZyBpdCB3aXRoIHRoZSIKK3VzZXItc3BlY2lmaWVkIG1hcmsKKy5JUiB2YWx1ZSAiLiBXaGVuIG9ubHkgYSBtYXJrICIKKy5JUiB2YWx1ZSAiIGlzIHNwZWNpZmllZCwgdGhlIHBhY2tldCIKK29ubHkgbWF0Y2hlcyB3aGVuIHRoZSBtYXJrIHZhbHVlIG9mIHRoZSBmcmFtZSBlcXVhbHMgdGhlIHVzZXItc3BlY2lmaWVkCittYXJrCisuSVIgdmFsdWUgLgorSWYgb25seSBhCisuSVIgbWFzayAiIGlzIHNwZWNpZmllZCwgdGhlIGxvZ2ljYWwiCitBTkQgb2YgdGhlIG1hcmsgdmFsdWUgb2YgdGhlIGZyYW1lIGFuZCB0aGUgdXNlci1zcGVjaWZpZWQKKy5JUiBtYXNrICIgaXMgdGFrZW4gYW5kIHRoZSBmcmFtZSBtYXRjaGVzIHdoZW4gdGhlIHJlc3VsdCBvZiB0aGlzIGxvZ2ljYWwgQU5EIGlzIgorbm9uLXplcm8uIE9ubHkgc3BlY2lmeWluZyBhCisuSVIgbWFzayAiIGlzIHVzZWZ1bCB0byBtYXRjaCBtdWx0aXBsZSBtYXJrIHZhbHVlcy4iCisuU1MgcGt0dHlwZQorLlRQCisuQlIgIi0tcGt0dHlwZS10eXBlICIgIlshXSBcZkl0eXBlXGZQIgorTWF0Y2hlcyBvbiB0aGUgRXRoZXJuZXQgImNsYXNzIiBvZiB0aGUgZnJhbWUsIHdoaWNoIGlzIGRldGVybWluZWQgYnkgdGhlCitnZW5lcmljIG5ldHdvcmtpbmcgY29kZS4gUG9zc2libGUgdmFsdWVzOgorLklSIGJyb2FkY2FzdCAiIChNQUMgZGVzdGluYXRpb24gaXMgdGhlIGJyb2FkY2FzdCBhZGRyZXNzKSwiCisuSVIgbXVsdGljYXN0ICIgKE1BQyBkZXN0aW5hdGlvbiBpcyBhIG11bHRpY2FzdCBhZGRyZXNzKSwiCisuSVIgaG9zdCAiIChNQUMgZGVzdGluYXRpb24gaXMgdGhlIHJlY2VpdmluZyBuZXR3b3JrIGRldmljZSksIG9yICIKKy5JUiBvdGhlcmhvc3QgIiAobm9uZSBvZiB0aGUgYWJvdmUpLiIKKy5TUyBzdHAKK1NwZWNpZnkgc3RwIEJQRFUgKGJyaWRnZSBwcm90b2NvbCBkYXRhIHVuaXQpIGZpZWxkcy4gVGhlIGRlc3RpbmF0aW9uCithZGRyZXNzCisuQlIgIiIgKCAtZCAiKSBtdXN0IGJlIHNwZWNpZmllZCBhcyB0aGUgYnJpZGdlIGdyb3VwIGFkZHJlc3MiCisuSVIgIiIgKCBCR0EgKS4KK0ZvciBhbGwgb3B0aW9ucyBmb3Igd2hpY2ggYSByYW5nZSBvZiB2YWx1ZXMgY2FuIGJlIHNwZWNpZmllZCwgaXQgaG9sZHMgdGhhdAoraWYgdGhlIGxvd2VyIGJvdW5kIGlzIG9taXR0ZWQgKGJ1dCB0aGUgY29sb24gaXMgbm90KSwgdGhlbiB0aGUgbG93ZXN0IHBvc3NpYmxlIGxvd2VyIGJvdW5kCitmb3IgdGhhdCBvcHRpb24gaXMgdXNlZCwgd2hpbGUgaWYgdGhlIHVwcGVyIGJvdW5kIGlzIG9taXR0ZWQgKGJ1dCB0aGUgY29sb24gYWdhaW4gaXMgbm90KSwgdGhlCitoaWdoZXN0IHBvc3NpYmxlIHVwcGVyIGJvdW5kIGZvciB0aGF0IG9wdGlvbiBpcyB1c2VkLgorLlRQCisuQlIgIi0tc3RwLXR5cGUgIiAiWyFdIFxmSXR5cGVcZlAiCitUaGUgQlBEVSB0eXBlICgwLTI1NSksIHJlY29nbml6ZWQgbm9uLW51bWVyaWNhbCB0eXBlcyBhcmUKKy5JUiBjb25maWcgIiwgZGVub3RpbmcgYSBjb25maWd1cmF0aW9uIEJQRFUgKD0wKSwgYW5kIgorLklSIHRjbiAiLCBkZW5vdGhpbmcgYSB0b3BvbG9neSBjaGFuZ2Ugbm90aWZpY2F0aW9uIEJQRFUgKD0xMjgpLiIKKy5UUAorLkJSICItLXN0cC1mbGFncyAiICJbIV0gXGZJZmxhZ1xmUCIKK1RoZSBCUERVIGZsYWcgKDAtMjU1KSwgcmVjb2duaXplZCBub24tbnVtZXJpY2FsIGZsYWdzIGFyZQorLklSIHRvcG9sb2d5LWNoYW5nZSAiLCBkZW5vdGluZyB0aGUgdG9wb2xvZ3kgY2hhbmdlIGZsYWcgKD0xKSwgYW5kIgorLklSIHRvcG9sb2d5LWNoYW5nZS1hY2sgIiwgZGVub3RpbmcgdGhlIHRvcG9sb2d5IGNoYW5nZSBhY2tub3dsZWRnZW1lbnQgZmxhZyAoPTEyOCkuIgorLlRQCisuQlIgIi0tc3RwLXJvb3QtcHJpbyAiICJbIV0gW1xmSXByaW9cZlBdWzpcZklwcmlvXGZQXSIKK1RoZSByb290IHByaW9yaXR5ICgwLTY1NTM1KSByYW5nZS4KKy5UUAorLkJSICItLXN0cC1yb290LWFkZHIgIiAiWyFdIFtcZklhZGRyZXNzXGZQXVsvXGZJbWFza1xmUF0iCitUaGUgcm9vdCBtYWMgYWRkcmVzcywgc2VlIHRoZSBvcHRpb24KKy5CUiAtcyAiIGZvciBtb3JlIGRldGFpbHMuIgorLlRQCisuQlIgIi0tc3RwLXJvb3QtY29zdCAiICJbIV0gW1xmSWNvc3RcZlBdWzpcZkljb3N0XGZQXSIKK1RoZSByb290IHBhdGggY29zdCAoMC00Mjk0OTY3Mjk1KSByYW5nZS4KKy5UUAorLkJSICItLXN0cC1zZW5kZXItcHJpbyAiICJbIV0gW1xmSXByaW9cZlBdWzpcZklwcmlvXGZQXSIKK1RoZSBCUERVJ3Mgc2VuZGVyIHByaW9yaXR5ICgwLTY1NTM1KSByYW5nZS4KKy5UUAorLkJSICItLXN0cC1zZW5kZXItYWRkciAiICJbIV0gW1xmSWFkZHJlc3NcZlBdWy9cZkltYXNrXGZQXSIKK1RoZSBCUERVJ3Mgc2VuZGVyIG1hYyBhZGRyZXNzLCBzZWUgdGhlIG9wdGlvbgorLkJSIC1zICIgZm9yIG1vcmUgZGV0YWlscy4iCisuVFAKKy5CUiAiLS1zdHAtcG9ydCAiICJbIV0gW1xmSXBvcnRcZlBdWzpcZklwb3J0XGZQXSIKK1RoZSBwb3J0IGlkZW50aWZpZXIgKDAtNjU1MzUpIHJhbmdlLgorLlRQCisuQlIgIi0tc3RwLW1zZy1hZ2UgIiAiWyFdIFtcZklhZ2VcZlBdWzpcZklhZ2VcZlBdIgorVGhlIG1lc3NhZ2UgYWdlIHRpbWVyICgwLTY1NTM1KSByYW5nZS4KKy5UUAorLkJSICItLXN0cC1tYXgtYWdlICIgIlshXSBbXGZJYWdlXGZQXVs6XGZJYWdlXGZQXSIKK1RoZSBtYXggYWdlIHRpbWVyICgwLTY1NTM1KSByYW5nZS4KKy5UUAorLkJSICItLXN0cC1oZWxsby10aW1lICIgIlshXSBbXGZJdGltZVxmUF1bOlxmSXRpbWVcZlBdIgorVGhlIGhlbGxvIHRpbWUgdGltZXIgKDAtNjU1MzUpIHJhbmdlLgorLlRQCisuQlIgIi0tc3RwLWZvcndhcmQtZGVsYXkgIiAiWyFdIFtcZklkZWxheVxmUF1bOlxmSWRlbGF5XGZQXSIKK1RoZSBmb3J3YXJkIGRlbGF5IHRpbWVyICgwLTY1NTM1KSByYW5nZS4KKy5TUyBzdHJpbmcKK1RoaXMgbW9kdWxlIG1hdGNoZXMgb24gYSBnaXZlbiBzdHJpbmcgdXNpbmcgc29tZSBwYXR0ZXJuIG1hdGNoaW5nIHN0cmF0ZWd5LgorLlRQCisuQlIgIi0tc3RyaW5nLWFsZ28gIiAiXGZJYWxnb3JpdGhtXGZQIgorVGhlIHBhdHRlcm4gbWF0Y2hpbmcgc3RyYXRlZ3kuIChibSA9IEJveWVyLU1vb3JlLCBrbXAgPSBLbnV0aC1QcmF0dC1Nb3JyaXMpCisuVFAKKy5CUiAiLS1zdHJpbmctZnJvbSAiICJcZklvZmZzZXRcZlAiCitUaGUgbG93ZXN0IG9mZnNldCBmcm9tIHdoaWNoIGEgbWF0Y2ggY2FuIHN0YXJ0LiAoZGVmYXVsdDogMCkKKy5UUAorLkJSICItLXN0cmluZy10byAiICJcZklvZmZzZXRcZlAiCitUaGUgaGlnaGVzdCBvZmZzZXQgZnJvbSB3aGljaCBhIG1hdGNoIGNhbiBzdGFydC4gKGRlZmF1bHQ6IHNpemUgb2YgZnJhbWUpCisuVFAKKy5CUiAiLS1zdHJpbmcgIiAiWyFdIFxmSXBhdHRlcm5cZlAiCitNYXRjaGVzIHRoZSBnaXZlbiBwYXR0ZXJuLgorLlRQCisuQlIgIi0tc3RyaW5nLWhleCAiICJbIV0gXGZJcGF0dGVyblxmUCIKK01hdGNoZXMgdGhlIGdpdmVuIHBhdHRlcm4gaW4gaGV4IG5vdGF0aW9uLCBlLmcuICd8MEQgMEF8JywgJ3wwRDBBfCcsICd3d3d8MDl8bmV0ZmlsdGVyfDAzfG9yZ3wwMHwnCisuVFAKKy5CUiAiLS1zdHJpbmctaWNhc2UiCitJZ25vcmUgY2FzZSB3aGVuIHNlYXJjaGluZy4KKy5TUyB2bGFuCitTcGVjaWZ5IDgwMi4xUSBUYWcgQ29udHJvbCBJbmZvcm1hdGlvbiBmaWVsZHMuCitUaGUgcHJvdG9jb2wgbXVzdCBiZSBzcGVjaWZpZWQgYXMKKy5JUiA4MDJfMVEgIiAoMHg4MTAwKS4iCisuVFAKKy5CUiAiLS12bGFuLWlkICIgIlshXSBcZklpZFxmUCIKK1RoZSBWTEFOIGlkZW50aWZpZXIgZmllbGQgKFZJRCkuIERlY2ltYWwgbnVtYmVyIGZyb20gMCB0byA0MDk1LgorLlRQCisuQlIgIi0tdmxhbi1wcmlvICIgIlshXSBcZklwcmlvXGZQIgorVGhlIHVzZXIgcHJpb3JpdHkgZmllbGQsIGEgZGVjaW1hbCBudW1iZXIgZnJvbSAwIHRvIDcuCitUaGUgVklEIHNob3VsZCBiZSBzZXQgdG8gMCAoIm51bGwgVklEIikgb3IgdW5zcGVjaWZpZWQKKyhpbiB0aGUgbGF0dGVyIGNhc2UgdGhlIFZJRCBpcyBkZWxpYmVyYXRlbHkgc2V0IHRvIDApLgorLlRQCisuQlIgIi0tdmxhbi1lbmNhcCAiICJbIV0gXGZJdHlwZVxmUCIKK1RoZSBlbmNhcHN1bGF0ZWQgRXRoZXJuZXQgZnJhbWUgdHlwZS9sZW5ndGguCitTcGVjaWZpZWQgYXMgYSBoZXhhZGVjaW1hbAorbnVtYmVyIGZyb20gMHgwMDAwIHRvIDB4RkZGRiBvciBhcyBhIHN5bWJvbGljIG5hbWUKK2Zyb20KKy5CUiAvZXRjL2V0aGVydHlwZXMgLgorCisuU1MgV0FUQ0hFUiBFWFRFTlNJT05TCitXYXRjaGVycyBvbmx5IGxvb2sgYXQgZnJhbWVzIHBhc3NpbmcgYnksIHRoZXkgZG9uJ3QgbW9kaWZ5IHRoZW0gbm9yIGRlY2lkZQordG8gYWNjZXB0IHRoZSBmcmFtZXMgb3Igbm90LiBUaGVzZSB3YXRjaGVycyBvbmx5CitzZWUgdGhlIGZyYW1lIGlmIHRoZSBmcmFtZSBtYXRjaGVzIHRoZSBydWxlLCBhbmQgdGhleSBzZWUgaXQgYmVmb3JlIHRoZQordGFyZ2V0IGlzIGV4ZWN1dGVkLgorLlNTIGxvZworVGhlIGxvZyB3YXRjaGVyIHdyaXRlcyBkZXNjcmlwdGl2ZSBkYXRhIGFib3V0IGEgZnJhbWUgdG8gdGhlIHN5c2xvZy4KKy5UUAorLkIgIi0tbG9nIgorLmJyCitMb2cgd2l0aCB0aGUgZGVmYXVsdCBsb2dnaW4gb3B0aW9uczogbG9nLWxldmVsPQorLklSIGluZm8gLAorbG9nLXByZWZpeD0iIiwgbm8gaXAgbG9nZ2luZywgbm8gYXJwIGxvZ2dpbmcuCisuVFAKKy5CIC0tbG9nLWxldmVsICJcZklsZXZlbFxmUCIKKy5icgorRGVmaW5lcyB0aGUgbG9nZ2luZyBsZXZlbC4gRm9yIHRoZSBwb3NzaWJsZSB2YWx1ZXMsIHNlZQorLkJSICJlYnRhYmxlcyAtaCBsb2ciIC4KK1RoZSBkZWZhdWx0IGxldmVsIGlzIAorLklSIGluZm8gLgorLlRQCisuQlIgLS1sb2ctcHJlZml4ICIgXGZJdGV4dFxmUCIKKy5icgorRGVmaW5lcyB0aGUgcHJlZml4CisuSSB0ZXh0Cit0byBiZSBwcmludGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgd2l0aCB0aGUgbG9nZ2luZyBpbmZvcm1hdGlvbi4KKy5UUAorLkIgLS1sb2ctaXAgCisuYnIKK1dpbGwgbG9nIHRoZSBpcCBpbmZvcm1hdGlvbiB3aGVuIGEgZnJhbWUgbWFkZSBieSB0aGUgaXAgcHJvdG9jb2wgbWF0Y2hlcyAKK3RoZSBydWxlLiBUaGUgZGVmYXVsdCBpcyBubyBpcCBpbmZvcm1hdGlvbiBsb2dnaW5nLgorLlRQCisuQiAtLWxvZy1pcDYgCisuYnIKK1dpbGwgbG9nIHRoZSBpcHY2IGluZm9ybWF0aW9uIHdoZW4gYSBmcmFtZSBtYWRlIGJ5IHRoZSBpcHY2IHByb3RvY29sIG1hdGNoZXMgCit0aGUgcnVsZS4gVGhlIGRlZmF1bHQgaXMgbm8gaXB2NiBpbmZvcm1hdGlvbiBsb2dnaW5nLgorLlRQCisuQiAtLWxvZy1hcnAKKy5icgorV2lsbCBsb2cgdGhlIChyKWFycCBpbmZvcm1hdGlvbiB3aGVuIGEgZnJhbWUgbWFkZSBieSB0aGUgKHIpYXJwIHByb3RvY29scworbWF0Y2hlcyB0aGUgcnVsZS4gVGhlIGRlZmF1bHQgaXMgbm8gKHIpYXJwIGluZm9ybWF0aW9uIGxvZ2dpbmcuCisuU1MgbmZsb2cKK1RoZSBuZmxvZyB3YXRjaGVyIHBhc3NlcyB0aGUgcGFja2V0IHRvIHRoZSBsb2FkZWQgbG9nZ2luZyBiYWNrZW5kCitpbiBvcmRlciB0byBsb2cgdGhlIHBhY2tldC4gVGhpcyBpcyB1c3VhbGx5IHVzZWQgaW4gY29tYmluYXRpb24gd2l0aAorbmZuZXRsaW5rX2xvZyBhcyBsb2dnaW5nIGJhY2tlbmQsIHdoaWNoIHdpbGwgbXVsdGljYXN0IHRoZSBwYWNrZXQKK3Rocm91Z2ggYQorLklSIG5ldGxpbmsKK3NvY2tldCB0byB0aGUgc3BlY2lmaWVkIG11bHRpY2FzdCBncm91cC4gT25lIG9yIG1vcmUgdXNlcnNwYWNlIHByb2Nlc3NlcworbWF5IHN1YnNjcmliZSB0byB0aGUgZ3JvdXAgdG8gcmVjZWl2ZSB0aGUgcGFja2V0cy4KKy5UUAorLkIgIi0tbmZsb2ciCisuYnIKK0xvZyB3aXRoIHRoZSBkZWZhdWx0IGxvZ2dpbmcgb3B0aW9ucworLlRQCisuQiAtLW5mbG9nLWdyb3VwICJcZklubGdyb3VwXGZQIgorLmJyCitUaGUgbmV0bGluayBncm91cCAoMSAtIDJeMzItMSkgdG8gd2hpY2ggcGFja2V0cyBhcmUgKG9ubHkgYXBwbGljYWJsZSBmb3IKK25mbmV0bGlua19sb2cpLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxLgorLlRQCisuQiAtLW5mbG9nLXByZWZpeCAiXGZJcHJlZml4XGZQIgorLmJyCitBIHByZWZpeCBzdHJpbmcgdG8gaW5jbHVkZSBpbiB0aGUgbG9nIG1lc3NhZ2UsIHVwIHRvIDMwIGNoYXJhY3RlcnMKK2xvbmcsIHVzZWZ1bCBmb3IgZGlzdGluZ3Vpc2hpbmcgbWVzc2FnZXMgaW4gdGhlIGxvZ3MuCisuVFAKKy5CIC0tbmZsb2ctcmFuZ2UgIlxmSXNpemVcZlAiCisuYnIKK1RoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgY29waWVkIHRvIHVzZXJzcGFjZSAob25seSBhcHBsaWNhYmxlIGZvcgorbmZuZXRsaW5rX2xvZykuIG5mbmV0bGlua19sb2cgaW5zdGFuY2VzIG1heSBzcGVjaWZ5IHRoZWlyIG93bgorcmFuZ2UsIHRoaXMgb3B0aW9uIG92ZXJyaWRlcyBpdC4KKy5UUAorLkIgLS1uZmxvZy10aHJlc2hvbGQgIlxmSXNpemVcZlAiCisuYnIKK051bWJlciBvZiBwYWNrZXRzIHRvIHF1ZXVlIGluc2lkZSB0aGUga2VybmVsIGJlZm9yZSBzZW5kaW5nIHRoZW0KK3RvIHVzZXJzcGFjZSAob25seSBhcHBsaWNhYmxlIGZvciBuZm5ldGxpbmtfbG9nKS4gSGlnaGVyIHZhbHVlcworcmVzdWx0IGluIGxlc3Mgb3ZlcmhlYWQgcGVyIHBhY2tldCwgYnV0IGluY3JlYXNlIGRlbGF5IHVudGlsIHRoZQorcGFja2V0cyByZWFjaCB1c2Vyc3BhY2UuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEuCisuU1MgdWxvZworVGhlIHVsb2cgd2F0Y2hlciBwYXNzZXMgdGhlIHBhY2tldCB0byBhIHVzZXJzcGFjZQorbG9nZ2luZyBkYWVtb24gdXNpbmcgbmV0bGluayBtdWx0aWNhc3Qgc29ja2V0cy4gVGhpcyBkaWZmZXJzCitmcm9tIHRoZSBsb2cgd2F0Y2hlciBpbiB0aGUgc2Vuc2UgdGhhdCB0aGUgY29tcGxldGUgcGFja2V0IGlzCitzZW50IHRvIHVzZXJzcGFjZSBpbnN0ZWFkIG9mIGEgZGVzY3JpcHRpdmUgdGV4dCBhbmQgdGhhdAorbmV0bGluayBtdWx0aWNhc3Qgc29ja2V0cyBhcmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBzeXNsb2cuCitUaGlzIHdhdGNoZXIgZW5hYmxlcyBwYXJzaW5nIG9mIHBhY2tldHMgd2l0aCB1c2Vyc3BhY2UgcHJvZ3JhbXMsIHRoZQorcGh5c2ljYWwgYnJpZGdlIGluIGFuZCBvdXQgcG9ydHMgYXJlIGFsc28gaW5jbHVkZWQgaW4gdGhlIG5ldGxpbmsgbWVzc2FnZXMuCitUaGUgdWxvZyB3YXRjaGVyIG1vZHVsZSBhY2NlcHRzIDIgcGFyYW1ldGVycyB3aGVuIHRoZSBtb2R1bGUgaXMgbG9hZGVkCitpbnRvIHRoZSBrZXJuZWwgKGUuZy4gd2l0aCBtb2Rwcm9iZSk6CisuQiBubGJ1ZnNpegorc3BlY2lmaWVzIGhvdyBiaWcgdGhlIGJ1ZmZlciBmb3IgZWFjaCBuZXRsaW5rIG11bHRpY2FzdAorZ3JvdXAgaXMuIElmIHlvdSBzYXkKKy5JUiBubGJ1ZnNpej04MTkyICwKK2ZvciBleGFtcGxlLCB1cCB0byBlaWdodCBrQiBvZiBwYWNrZXRzIHdpbGwKK2dldCBhY2N1bXVsYXRlZCBpbiB0aGUga2VybmVsIHVudGlsIHRoZXkgYXJlIHNlbnQgdG8gdXNlcnNwYWNlLiBJdCBpcworbm90IHBvc3NpYmxlIHRvIGFsbG9jYXRlIG1vcmUgdGhhbiAxMjhrQi4gUGxlYXNlIGFsc28ga2VlcCBpbiBtaW5kIHRoYXQKK3RoaXMgYnVmZmVyIHNpemUgaXMgYWxsb2NhdGVkIGZvciBlYWNoIG5sZ3JvdXAgeW91IGFyZSB1c2luZywgc28gdGhlCit0b3RhbCBrZXJuZWwgbWVtb3J5IHVzYWdlIGluY3JlYXNlcyBieSB0aGF0IGZhY3Rvci4gVGhlIGRlZmF1bHQgaXMgNDA5Ni4KKy5CIGZsdXNodGltZW91dAorc3BlY2lmaWVzIGFmdGVyIGhvdyBtYW55IGh1bmRyZWR0aHMgb2YgYSBzZWNvbmQgdGhlIHF1ZXVlIHNob3VsZCBiZQorZmx1c2hlZCwgZXZlbiBpZiBpdCBpcyBub3QgZnVsbCB5ZXQuIFRoZSBkZWZhdWx0IGlzIDEwIChvbmUgdGVudGggb2YKK2Egc2Vjb25kKS4KKy5UUAorLkIgIi0tdWxvZyIKKy5icgorVXNlIHRoZSBkZWZhdWx0IHNldHRpbmdzOiB1bG9nLXByZWZpeD0iIiwgdWxvZy1ubGdyb3VwPTEsCit1bG9nLWNwcmFuZ2U9NDA5NiwgdWxvZy1xdGhyZXNob2xkPTEuCisuVFAKKy5CIC0tdWxvZy1wcmVmaXggIlxmSXRleHRcZlAiCisuYnIKK0RlZmluZXMgdGhlIHByZWZpeCBpbmNsdWRlZCB3aXRoIHRoZSBwYWNrZXRzIHNlbnQgdG8gdXNlcnNwYWNlLgorLlRQCisuQlIgLS11bG9nLW5sZ3JvdXAgIiBcZklncm91cFxmUCIKKy5icgorRGVmaW5lcyB3aGljaCBuZXRsaW5rIGdyb3VwIG51bWJlciB0byB1c2UgKGEgbnVtYmVyIGZyb20gMSB0byAzMikuCitNYWtlIHN1cmUgdGhlIG5ldGxpbmsgZ3JvdXAgbnVtYmVycyB1c2VkIGZvciB0aGUgaXB0YWJsZXMgVUxPRwordGFyZ2V0IGRpZmZlciBmcm9tIHRob3NlIHVzZWQgZm9yIHRoZSBlYnRhYmxlcyB1bG9nIHdhdGNoZXIuCitUaGUgZGVmYXVsdCBncm91cCBudW1iZXIgaXMgMS4KKy5UUAorLkJSIC0tdWxvZy1jcHJhbmdlICIgXGZJcmFuZ2VcZlAiCisuYnIKK0RlZmluZXMgdGhlIG1heGltdW0gY29weSByYW5nZSB0byB1c2Vyc3BhY2UsIGZvciBwYWNrZXRzIG1hdGNoaW5nIHRoZQorcnVsZS4gVGhlIGRlZmF1bHQgcmFuZ2UgaXMgMCwgd2hpY2ggbWVhbnMgdGhlIG1heGltdW0gY29weSByYW5nZSBpcworZ2l2ZW4gYnkKKy5CUiBubGJ1ZnNpeiAuCitBIG1heGltdW0gY29weSByYW5nZSBsYXJnZXIgdGhhbgorMTI4KjEwMjQgaXMgbWVhbmluZ2xlc3MgYXMgdGhlIHBhY2tldHMgc2VudCB0byB1c2Vyc3BhY2UgaGF2ZSBhbiB1cHBlcgorc2l6ZSBsaW1pdCBvZiAxMjgqMTAyNC4KKy5UUAorLkJSIC0tdWxvZy1xdGhyZXNob2xkICIgXGZJdGhyZXNob2xkXGZQIgorLmJyCitRdWV1ZSBhdCBtb3N0CisuSSB0aHJlc2hvbGQKK251bWJlciBvZiBwYWNrZXRzIGJlZm9yZSBzZW5kaW5nIHRoZW0gdG8KK3VzZXJzcGFjZSB3aXRoIGEgbmV0bGluayBzb2NrZXQuIE5vdGUgdGhhdCBwYWNrZXRzIGNhbiBiZSBzZW50IHRvCit1c2Vyc3BhY2UgYmVmb3JlIHRoZSBxdWV1ZSBpcyBmdWxsLCB0aGlzIGhhcHBlbnMgd2hlbiB0aGUgdWxvZwora2VybmVsIHRpbWVyIGdvZXMgb2ZmICh0aGUgZnJlcXVlbmN5IG9mIHRoaXMgdGltZXIgZGVwZW5kcyBvbgorLkJSIGZsdXNodGltZW91dCApLgorLlNTIFRBUkdFVCBFWFRFTlNJT05TCisuU1MgYXJwcmVwbHkKK1RoZQorLkIgYXJwcmVwbHkKK3RhcmdldCBjYW4gYmUgdXNlZCBpbiB0aGUKKy5CUiBQUkVST1VUSU5HICIgY2hhaW4gb2YgdGhlICIgbmF0ICIgdGFibGUuIgorSWYgdGhpcyB0YXJnZXQgc2VlcyBhbiBBUlAgcmVxdWVzdCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgcmVwbHkKK3dpdGggYW4gQVJQIHJlcGx5LiBUaGUgdXNlZCBNQUMgYWRkcmVzcyBmb3IgdGhlIHJlcGx5IGNhbiBiZSBzcGVjaWZpZWQuCitUaGUgcHJvdG9jb2wgbXVzdCBiZSBzcGVjaWZpZWQgYXMKKy5JUiBBUlAgLgorV2hlbiB0aGUgQVJQIG1lc3NhZ2UgaXMgbm90IGFuIEFSUCByZXF1ZXN0IG9yIHdoZW4gdGhlIEFSUCByZXF1ZXN0IGlzbid0Citmb3IgYW4gSVAgYWRkcmVzcyBvbiBhbiBFdGhlcm5ldCBuZXR3b3JrLCBpdCBpcyBpZ25vcmVkIGJ5IHRoaXMgdGFyZ2V0CisuQlIgIiIgKCBDT05USU5VRSApLgorV2hlbiB0aGUgQVJQIHJlcXVlc3QgaXMgbWFsZm9ybWVkLCBpdCBpcyBkcm9wcGVkCisuQlIgIiIgKCBEUk9QICkuCisuVFAKKy5CUiAiLS1hcnByZXBseS1tYWMgIiAiXGZJYWRkcmVzc1xmUCIKK1NwZWNpZmllcyB0aGUgTUFDIGFkZHJlc3MgdG8gcmVwbHkgd2l0aDogdGhlIEV0aGVybmV0IHNvdXJjZSBNQUMgYW5kIHRoZQorQVJQIHBheWxvYWQgc291cmNlIE1BQyB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIHRoaXMgYWRkcmVzcy4KKy5UUAorLkJSICItLWFycHJlcGx5LXRhcmdldCAiICJcZkl0YXJnZXRcZlAiCitTcGVjaWZpZXMgdGhlIHN0YW5kYXJkIHRhcmdldC4gQWZ0ZXIgc2VuZGluZyB0aGUgQVJQIHJlcGx5LCB0aGUgcnVsZSBzdGlsbAoraGFzIHRvIGdpdmUgYSBzdGFuZGFyZCB0YXJnZXQgc28gZWJ0YWJsZXMga25vd3Mgd2hhdCB0byBkbyB3aXRoIHRoZSBBUlAgcmVxdWVzdC4KK1RoZSBkZWZhdWx0IHRhcmdldAorLkJSICIiICJpcyAiIERST1AgLgorLlNTIGRuYXQKK1RoZQorLkIgZG5hdAordGFyZ2V0IGNhbiBvbmx5IGJlIHVzZWQgaW4gdGhlCisuQlIgQlJPVVRJTkcgIiBjaGFpbiBvZiB0aGUgIiBicm91dGUgIiB0YWJsZSBhbmQgdGhlICIKKy5CUiBQUkVST1VUSU5HICIgYW5kICIgT1VUUFVUICIgY2hhaW5zIG9mIHRoZSAiIG5hdCAiIHRhYmxlLiIKK0l0IHNwZWNpZmllcyB0aGF0IHRoZSBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyBoYXMgdG8gYmUgY2hhbmdlZC4KKy5UUAorLkJSICItLXRvLWRlc3RpbmF0aW9uICIgIlxmSWFkZHJlc3NcZlAiCisuYnIKK0NoYW5nZSB0aGUgZGVzdGluYXRpb24gTUFDIGFkZHJlc3MgdG8gdGhlIHNwZWNpZmllZAorLklSIGFkZHJlc3MgLgorVGhlIGZsYWcKKy5CIC0tdG8tZHN0CitpcyBhbiBhbGlhcyBmb3IgdGhpcyBvcHRpb24uCisuVFAKKy5CUiAiLS1kbmF0LXRhcmdldCAiICJcZkl0YXJnZXRcZlAiCisuYnIKK1NwZWNpZmllcyB0aGUgc3RhbmRhcmQgdGFyZ2V0LiBBZnRlciBkb2luZyB0aGUgZG5hdCwgdGhlIHJ1bGUgc3RpbGwgaGFzIHRvCitnaXZlIGEgc3RhbmRhcmQgdGFyZ2V0IHNvIGVidGFibGVzIGtub3dzIHdoYXQgdG8gZG8gd2l0aCB0aGUgZG5hdGVkIGZyYW1lLgorVGhlIGRlZmF1bHQgdGFyZ2V0IGlzCisuQlIgQUNDRVBUIC4KK01ha2luZyBpdAorLkJSIENPTlRJTlVFICIgY291bGQgbGV0IHlvdSB1c2UiCittdWx0aXBsZSB0YXJnZXQgZXh0ZW5zaW9ucyBvbiB0aGUgc2FtZSBmcmFtZS4gTWFraW5nIGl0CisuQlIgRFJPUCAiIG9ubHkgbWFrZXMiCitzZW5zZSBpbiB0aGUKKy5CUiBCUk9VVElORyAiIGNoYWluIGJ1dCB1c2luZyB0aGUgIiByZWRpcmVjdCAiIHRhcmdldCBpcyBtb3JlIGxvZ2ljYWwgdGhlcmUuICIgUkVUVVJOICIgaXMgYWxzbyBhbGxvd2VkLiBOb3RlIHRoYXQgdXNpbmcgIiBSRVRVUk4KK2luIGEgYmFzZSBjaGFpbiBpcyBub3QgYWxsb3dlZCAoZm9yIG9idmlvdXMgcmVhc29ucykuCisuU1MgbWFyaworLkJSICIiICJUaGUgIiBtYXJrICIgdGFyZ2V0IGNhbiBiZSB1c2VkIGluIGV2ZXJ5IGNoYWluIG9mIGV2ZXJ5IHRhYmxlLiBJdCBpcyBwb3NzaWJsZSIKK3RvIHVzZSB0aGUgbWFya2luZyBvZiBhIGZyYW1lL3BhY2tldCBpbiBib3RoIGVidGFibGVzIGFuZCBpcHRhYmxlcywKK2lmIHRoZSBicmlkZ2UtbmYgY29kZSBpcyBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwuIEJvdGggcHV0IHRoZSBtYXJraW5nIGF0IHRoZQorc2FtZSBwbGFjZS4gVGhpcyBhbGxvd3MgZm9yIGEgZm9ybSBvZiBjb21tdW5pY2F0aW9uIGJldHdlZW4gZWJ0YWJsZXMgYW5kIGlwdGFibGVzLgorLlRQCisuQlIgIi0tbWFyay1zZXQgIiAiXGZJdmFsdWVcZlAiCisuYnIKK01hcmsgdGhlIGZyYW1lIHdpdGggdGhlIHNwZWNpZmllZCBub24tbmVnYXRpdmUKKy5JUiB2YWx1ZSAuCisuVFAKKy5CUiAiLS1tYXJrLW9yICIgIlxmSXZhbHVlXGZQIgorLmJyCitPciB0aGUgZnJhbWUgd2l0aCB0aGUgc3BlY2lmaWVkIG5vbi1uZWdhdGl2ZQorLklSIHZhbHVlIC4KKy5UUAorLkJSICItLW1hcmstYW5kICIgIlxmSXZhbHVlXGZQIgorLmJyCitBbmQgdGhlIGZyYW1lIHdpdGggdGhlIHNwZWNpZmllZCBub24tbmVnYXRpdmUKKy5JUiB2YWx1ZSAuCisuVFAKKy5CUiAiLS1tYXJrLXhvciAiICJcZkl2YWx1ZVxmUCIKKy5icgorWG9yIHRoZSBmcmFtZSB3aXRoIHRoZSBzcGVjaWZpZWQgbm9uLW5lZ2F0aXZlCisuSVIgdmFsdWUgLgorLlRQCisuQlIgIi0tbWFyay10YXJnZXQgIiAiXGZJdGFyZ2V0XGZQIgorLmJyCitTcGVjaWZpZXMgdGhlIHN0YW5kYXJkIHRhcmdldC4gQWZ0ZXIgbWFya2luZyB0aGUgZnJhbWUsIHRoZSBydWxlCitzdGlsbCBoYXMgdG8gZ2l2ZSBhIHN0YW5kYXJkIHRhcmdldCBzbyBlYnRhYmxlcyBrbm93cyB3aGF0IHRvIGRvLgorVGhlIGRlZmF1bHQgdGFyZ2V0IGlzCisuQlIgQUNDRVBUICIuIE1ha2luZyBpdCAiIENPTlRJTlVFICIgY2FuIGxldCB5b3UgZG8gb3RoZXIiCit0aGluZ3Mgd2l0aCB0aGUgZnJhbWUgaW4gc3Vic2VxdWVudCBydWxlcyBvZiB0aGUgY2hhaW4uCisuU1MgcmVkaXJlY3QKK1RoZQorLkIgcmVkaXJlY3QKK3RhcmdldCB3aWxsIGNoYW5nZSB0aGUgTUFDIHRhcmdldCBhZGRyZXNzIHRvIHRoYXQgb2YgdGhlIGJyaWRnZSBkZXZpY2UgdGhlCitmcmFtZSBhcnJpdmVkIG9uLiBUaGlzIHRhcmdldCBjYW4gb25seSBiZSB1c2VkIGluIHRoZQorLkJSIEJST1VUSU5HICIgY2hhaW4gb2YgdGhlICIgYnJvdXRlICIgdGFibGUgYW5kIHRoZSAiCisuQlIgUFJFUk9VVElORyAiIGNoYWluIG9mIHRoZSAiIG5hdCAiIHRhYmxlLiIKK0luIHRoZQorLkJSIEJST1VUSU5HICIgY2hhaW4sIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgYnJpZGdlIHBvcnQgaXMgdXNlZCBhcyBkZXN0aW5hdGlvbiBhZGRyZXNzLCIKKy5CUiAiIiAiaW4gdGhlICIgUFJFUk9VVElORyAiIGNoYWluLCB0aGUgTUFDIGFkZHJlc3Mgb2YgdGhlIGJyaWRnZSBpcyB1c2VkLiIKKy5UUAorLkJSICItLXJlZGlyZWN0LXRhcmdldCAiICJcZkl0YXJnZXRcZlAiCisuYnIKK1NwZWNpZmllcyB0aGUgc3RhbmRhcmQgdGFyZ2V0LiBBZnRlciBkb2luZyB0aGUgTUFDIHJlZGlyZWN0LCB0aGUgcnVsZQorc3RpbGwgaGFzIHRvIGdpdmUgYSBzdGFuZGFyZCB0YXJnZXQgc28gZWJ0YWJsZXMga25vd3Mgd2hhdCB0byBkby4KK1RoZSBkZWZhdWx0IHRhcmdldCBpcworLkJSIEFDQ0VQVCAiLiBNYWtpbmcgaXQgIiBDT05USU5VRSAiIGNvdWxkIGxldCB5b3UgdXNlIgorbXVsdGlwbGUgdGFyZ2V0IGV4dGVuc2lvbnMgb24gdGhlIHNhbWUgZnJhbWUuIE1ha2luZyBpdAorLkJSIERST1AgIiBpbiB0aGUgIiBCUk9VVElORyAiIGNoYWluIHdpbGwgbGV0IHRoZSBmcmFtZXMgYmUgcm91dGVkLiAiIFJFVFVSTiAiIGlzIGFsc28gYWxsb3dlZC4gTm90ZSIKKy5CUiAiIiAidGhhdCB1c2luZyAiIFJFVFVSTiAiIGluIGEgYmFzZSBjaGFpbiBpcyBub3QgYWxsb3dlZC4iCisuU1Mgc25hdAorVGhlCisuQiBzbmF0Cit0YXJnZXQgY2FuIG9ubHkgYmUgdXNlZCBpbiB0aGUKKy5CUiBQT1NUUk9VVElORyAiIGNoYWluIG9mIHRoZSAiIG5hdCAiIHRhYmxlLiIKK0l0IHNwZWNpZmllcyB0aGF0IHRoZSBzb3VyY2UgTUFDIGFkZHJlc3MgaGFzIHRvIGJlIGNoYW5nZWQuCisuVFAKKy5CUiAiLS10by1zb3VyY2UgIiAiXGZJYWRkcmVzc1xmUCIKKy5icgorQ2hhbmdlcyB0aGUgc291cmNlIE1BQyBhZGRyZXNzIHRvIHRoZSBzcGVjaWZpZWQKKy5JUiBhZGRyZXNzICIuIFRoZSBmbGFnIgorLkIgLS10by1zcmMKK2lzIGFuIGFsaWFzIGZvciB0aGlzIG9wdGlvbi4KKy5UUAorLkJSICItLXNuYXQtdGFyZ2V0ICIgIlxmSXRhcmdldFxmUCIKKy5icgorU3BlY2lmaWVzIHRoZSBzdGFuZGFyZCB0YXJnZXQuIEFmdGVyIGRvaW5nIHRoZSBzbmF0LCB0aGUgcnVsZSBzdGlsbCBoYXMgCit0byBnaXZlIGEgc3RhbmRhcmQgdGFyZ2V0IHNvIGVidGFibGVzIGtub3dzIHdoYXQgdG8gZG8uCisuQlIgIiIgIlRoZSBkZWZhdWx0IHRhcmdldCBpcyAiIEFDQ0VQVCAiLiBNYWtpbmcgaXQgIiBDT05USU5VRSAiIGNvdWxkIGxldCB5b3UgdXNlIgorLkJSICIiICJtdWx0aXBsZSB0YXJnZXQgZXh0ZW5zaW9ucyBvbiB0aGUgc2FtZSBmcmFtZS4gTWFraW5nIGl0ICIgRFJPUCAiIGRvZXNuJ3QiCisuQlIgIiIgIm1ha2Ugc2Vuc2UsIGJ1dCB5b3UgY291bGQgZG8gdGhhdCB0b28uICIgUkVUVVJOICIgaXMgYWxzbyBhbGxvd2VkLiBOb3RlIgorLkJSICIiICJ0aGF0IHVzaW5nICIgUkVUVVJOICIgaW4gYSBiYXNlIGNoYWluIGlzIG5vdCBhbGxvd2VkLiIKKy5icgorLlRQCisuQlIgIi0tc25hdC1hcnAgIgorLmJyCitBbHNvIGNoYW5nZSB0aGUgaGFyZHdhcmUgc291cmNlIGFkZHJlc3MgaW5zaWRlIHRoZSBhcnAgaGVhZGVyIGlmIHRoZSBwYWNrZXQgaXMgYW4KK2FycCBtZXNzYWdlIGFuZCB0aGUgaGFyZHdhcmUgYWRkcmVzcyBsZW5ndGggaW4gdGhlIGFycCBoZWFkZXIgaXMgNiBieXRlcy4KKy5icgorLlNIIEZJTEVTCisuSSAvZXRjL2V0aGVydHlwZXMKKy5JIEBMT0NLRklMRUAKKy5TSCBFTlZJUk9OTUVOVCBWQVJJQUJMRVMKKy5JIEVCVEFCTEVTX0FUT01JQ19GSUxFCisuU0ggTUFJTElOR0xJU1RTCisuQlIgIiIgIlNlZSAiIGh0dHA6Ly9uZXRmaWx0ZXIub3JnL21haWxpbmdsaXN0cy5odG1sCisuU0ggU0VFIEFMU08KKy5CUiBpcHRhYmxlcyAiKDgpLCAiIGJyY3RsICIoOCksICIgaWZjb25maWcgIig4KSwgIiByb3V0ZSAoOCkKKy5QUAorLkJSICIiICJTZWUgIiBodHRwOi8vZWJ0YWJsZXMuc2YubmV0CmRpZmYgLS1naXQgYS9lYnRhYmxlcy1yZXN0b3JlLmMgYi9lYnRhYmxlcy1yZXN0b3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI0ZDBjZgotLS0gL2Rldi9udWxsCisrKyBiL2VidGFibGVzLXJlc3RvcmUuYwpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIGVidGFibGVzLXJlc3RvcmUuYywgT2N0b2JlciAyMDA1CisgKgorICogQXV0aG9yOiBCYXJ0IERlIFNjaHV5bWVyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSAiaW5jbHVkZS9lYnRhYmxlc191LmgiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsKKwl7Lm5hbWUgPSAibm9mbHVzaCIsIC5oYXNfYXJnID0gMCwgLnZhbCA9ICduJ30sCisJeyAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZWJ0X3VfcmVwbGFjZSByZXBsYWNlWzNdOwordm9pZCBlYnRfZWFybHlfaW5pdF9vbmNlKCk7CisKKyNkZWZpbmUgT1BUX0tFUk5FTERBVEEgIDB4ODAwIC8qIEFsc28gZGVmaW5lZCBpbiBlYnRhYmxlcy5jICovCisKK3N0YXRpYyB2b2lkIHByaW50X3VzYWdlKCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBlYnRhYmxlcy1yZXN0b3JlIFsgLS1ub2ZsdXNoIF1cbiIpOworCWV4aXQoMSk7Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlfdGFibGVfbmFtZXMoKQoreworCXN0cmNweShyZXBsYWNlWzBdLm5hbWUsICJmaWx0ZXIiKTsKKwlzdHJjcHkocmVwbGFjZVsxXS5uYW1lLCAibmF0Iik7CisJc3RyY3B5KHJlcGxhY2VbMl0ubmFtZSwgImJyb3V0ZSIpOworfQorCisjZGVmaW5lIGVidHJlc3RfcHJpbnRfZXJyb3IoZm9ybWF0LCBhcmdzLi4uKSBkbyB7ZnByaW50ZihzdGRlcnIsICJlYnRhYmxlcy1yZXN0b3JlOiAiXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpbmUgJWQ6ICJmb3JtYXQiLlxuIiwgbGluZSwgIyNhcmdzKTsgZXhpdCgtMSk7fSB3aGlsZSAoMCkKK2ludCBtYWluKGludCBhcmdjXywgY2hhciAqYXJndl9bXSkKK3sKKwljaGFyICphcmd2W0VCVERfQVJHQ19NQVhdLCBjbWRsaW5lW0VCVERfQ01ETElORV9NQVhMTl07CisJaW50IGksIG9mZnNldCwgcXVvdGVtb2RlID0gMCwgYXJnYywgdGFibGVfbnIgPSAtMSwgbGluZSA9IDAsIHdoaXRlc3BhY2UsIGMsIGZsdXNoID0gMTsKKwljaGFyIGVidGFibGVzX3N0cltdID0gImVidGFibGVzIjsKKworCXdoaWxlICgoYyA9IGdldG9wdF9sb25nKGFyZ2NfLCBhcmd2XywgIm4iLCBvcHRpb25zLCBOVUxMKSkgIT0gLTEpIHsKKwkJc3dpdGNoKGMpIHsKKwkJCWNhc2UgJ24nOgorCQkJCWZsdXNoID0gMDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRfdXNhZ2UoKTsKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWVidF9zaWxlbnQgPSAwOworCWNvcHlfdGFibGVfbmFtZXMoKTsKKwllYnRfZWFybHlfaW5pdF9vbmNlKCk7CisJYXJndlswXSA9IGVidGFibGVzX3N0cjsKKworCXdoaWxlIChmZ2V0cyhjbWRsaW5lLCBFQlREX0NNRExJTkVfTUFYTE4sIHN0ZGluKSkgeworCQlsaW5lKys7CisJCWlmICgqY21kbGluZSA9PSAnIycgfHwgKmNtZGxpbmUgPT0gJ1xuJykKKwkJCWNvbnRpbnVlOworCQkqc3RyY2hyKGNtZGxpbmUsICdcbicpID0gJ1wwJzsKKwkJaWYgKCpjbWRsaW5lID09ICcqJykgeworCQkJaWYgKHRhYmxlX25yICE9IC0xKSB7CisJCQkJZWJ0X2RlbGl2ZXJfdGFibGUoJnJlcGxhY2VbdGFibGVfbnJdKTsKKwkJCQllYnRfZGVsaXZlcl9jb3VudGVycygmcmVwbGFjZVt0YWJsZV9ucl0pOworCQkJfQorCQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCQlpZiAoIXN0cmNtcChyZXBsYWNlW2ldLm5hbWUsIGNtZGxpbmUrMSkpCisJCQkJCWJyZWFrOworCQkJaWYgKGkgPT0gMykKKwkJCQllYnRyZXN0X3ByaW50X2Vycm9yKCJ0YWJsZSAnJXMnIHdhcyBub3QgcmVjb2duaXplZCIsIGNtZGxpbmUrMSk7CisJCQl0YWJsZV9uciA9IGk7CisJCQlyZXBsYWNlW3RhYmxlX25yXS5jb21tYW5kID0gMTE7CisJCQllYnRfZ2V0X2tlcm5lbF90YWJsZSgmcmVwbGFjZVt0YWJsZV9ucl0sIGZsdXNoKTsKKwkJCXJlcGxhY2VbdGFibGVfbnJdLmNvbW1hbmQgPSAwOworCQkJcmVwbGFjZVt0YWJsZV9ucl0uZmxhZ3MgPSBPUFRfS0VSTkVMREFUQTsgLyogUHJldmVudCBkb19jb21tYW5kIGZyb20gaW5pdGlhbGlzaW5nIHJlcGxhY2UgKi8KKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKHRhYmxlX25yID09IC0xKQorCQkJZWJ0cmVzdF9wcmludF9lcnJvcigibm8gdGFibGUgc3BlY2lmaWVkIik7CisJCWlmICgqY21kbGluZSA9PSAnOicpIHsKKwkJCWludCBwb2xpY3ksIGNoYWluX25yOworCQkJY2hhciAqY2g7CisKKwkJCWlmICghKGNoID0gc3RyY2hyKGNtZGxpbmUsICcgJykpKQorCQkJCWVidHJlc3RfcHJpbnRfZXJyb3IoIm5vIHBvbGljeSBzcGVjaWZpZWQiKTsKKwkJCSpjaCA9ICdcMCc7CisJCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1NUQU5EQVJEX1RBUkdFVFM7IGkrKykKKwkJCQlpZiAoIXN0cmNtcChjaCsxLCBlYnRfc3RhbmRhcmRfdGFyZ2V0c1tpXSkpIHsKKwkJCQkJcG9saWN5ID0gLWkgLTE7CisJCQkJCWlmIChwb2xpY3kgPT0gRUJUX0NPTlRJTlVFKQorCQkJCQkJaSA9IE5VTV9TVEFOREFSRF9UQVJHRVRTOworCQkJCQlicmVhazsKKwkJCQl9CisJCQlpZiAoaSA9PSBOVU1fU1RBTkRBUkRfVEFSR0VUUykKKwkJCQllYnRyZXN0X3ByaW50X2Vycm9yKCJpbnZhbGlkIHBvbGljeSBzcGVjaWZpZWQiKTsKKwkJCS8qIE5vIG5lZWQgdG8gY2hlY2sgY2hhaW4gbmFtZSBmb3IgY29uc2lzdGVuY3ksIHNpbmNlCisJCQkgKiB3ZSdyZSBzdXBwb3NlZCB0byBiZSByZWFkaW5nIGFuIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisJCQkgKiBmaWxlLiAqLworCQkJaWYgKChjaGFpbl9uciA9IGVidF9nZXRfY2hhaW5ucigmcmVwbGFjZVt0YWJsZV9ucl0sIGNtZGxpbmUrMSkpID09IC0xKQorCQkJCWVidF9uZXdfY2hhaW4oJnJlcGxhY2VbdGFibGVfbnJdLCBjbWRsaW5lKzEsIHBvbGljeSk7CisJCQllbHNlCisJCQkJcmVwbGFjZVt0YWJsZV9ucl0uY2hhaW5zW2NoYWluX25yXS0+cG9saWN5ID0gcG9saWN5OworCQkJY29udGludWU7CisJCX0KKwkJYXJndlsxXSA9IGNtZGxpbmU7CisJCW9mZnNldCA9IHdoaXRlc3BhY2UgPSAwOworCQlhcmdjID0gMjsKKwkJd2hpbGUgKGNtZGxpbmVbb2Zmc2V0XSAhPSAnXDAnKSB7CisJCQlpZiAoY21kbGluZVtvZmZzZXRdID09ICdcIicpIHsKKwkJCQl3aGl0ZXNwYWNlID0gMDsKKwkJCQlxdW90ZW1vZGUgXj0gMTsKKwkJCQlpZiAocXVvdGVtb2RlKQorCQkJCQlhcmd2W2FyZ2MrK10gPSAmY21kbGluZVtvZmZzZXQrMV07CisJCQkJZWxzZSBpZiAoY21kbGluZVtvZmZzZXQrMV0gIT0gJyAnICYmIGNtZGxpbmVbb2Zmc2V0KzFdICE9ICdcMCcpCisJCQkJCWVidHJlc3RfcHJpbnRfZXJyb3IoInN5bnRheCBlcnJvciBhdCBcIiIpOworCQkJCWNtZGxpbmVbb2Zmc2V0XSA9ICdcMCc7CisJCQl9IGVsc2UgaWYgKCFxdW90ZW1vZGUgJiYgY21kbGluZVtvZmZzZXRdID09ICcgJykgeworCQkJCXdoaXRlc3BhY2UgPSAxOworCQkJCWNtZGxpbmVbb2Zmc2V0XSA9ICdcMCc7CisJCQl9IGVsc2UgaWYgKHdoaXRlc3BhY2UgPT0gMSkgeworCQkJCWFyZ3ZbYXJnYysrXSA9ICZjbWRsaW5lW29mZnNldF07CisJCQkJd2hpdGVzcGFjZSA9IDA7CisJCQl9CisJCQlvZmZzZXQrKzsKKwkJfQorCQlpZiAocXVvdGVtb2RlKQorCQkJZWJ0cmVzdF9wcmludF9lcnJvcigid3JvbmcgdXNlIG9mICdcIiciKTsKKwkJb3B0aW5kID0gMDsgLyogU2V0dGluZyBvcHRpbmQgPSAxIGNhdXNlcyBzZXJpb3VzIGFubm95YW5jZXMgKi8KKwkJZG9fY29tbWFuZChhcmdjLCBhcmd2LCBFWEVDX1NUWUxFX0RBRU1PTiwgJnJlcGxhY2VbdGFibGVfbnJdKTsKKwkJZWJ0X3JlaW5pdF9leHRlbnNpb25zKCk7CisJfQorCisJaWYgKHRhYmxlX25yICE9IC0xKSB7CisJCWVidF9kZWxpdmVyX3RhYmxlKCZyZXBsYWNlW3RhYmxlX25yXSk7CisJCWVidF9kZWxpdmVyX2NvdW50ZXJzKCZyZXBsYWNlW3RhYmxlX25yXSk7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZWJ0YWJsZXMtc2F2ZS5pbiBiL2VidGFibGVzLXNhdmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5MjRhMgotLS0gL2Rldi9udWxsCisrKyBiL2VidGFibGVzLXNhdmUuaW4KQEAgLTAsMCArMSw2MSBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisjCisjCisjIEEgc2NyaXB0IHRoYXQgZ2VuZXJhdGVzIHRleHQgb3V0cHV0IG9mIHRoZSBlYnRhYmxlcyBydWxlcy4KKyMgU2ltaWxhciB0byBpcHRhYmxlcy1zYXZlLgorIworIyBJdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBhY3RpdmUgY29uZmlndXJhdGlvbiB0byAvZXRjL3N5c2NvbmZpZy9lYnRhYmxlcworCit1c2Ugc3RyaWN0OworbXkgJHRhYmxlOworbXkgJGVidGFibGVzID0gIkBzYmluZGlyQC9lYnRhYmxlcyI7CitteSAkY250ID0gIiI7CitteSAkdmVyc2lvbiA9ICIxLjAiOworbXkgJHRhYmxlX25hbWU7CisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgUHJvY2VzcyBmaWx0ZXIgdGFibGUKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3N1YiBwcm9jZXNzX3RhYmxlIHsKKyAgICBteSAkY2hhaW4gPSAiIjsKKyAgICBteSAkcnVsZXMgPSAiIjsKKyAgICBteSAkY2hhaW5zID0gIiI7CisgICAgbXkgJGxpbmUgPSAiIjsKKworICAgIGZvcmVhY2ggJGxpbmUgKHNwbGl0KCJcbiIsJF9bMF0pKSB7CisgICAgICAgIGlmICgkbGluZSA9fiBtL0JyaWRnZSB0YWJsZTogKC4qKS8pIHsKKyAgICAgICAgICAgIHByaW50ICIqJDFcbiI7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9CisgICAgICAgIGlmICgkbGluZSA9fiBtL0JyaWRnZSBjaGFpbjogKC4qPyksIGVudHJpZXM6LiogcG9saWN5OiAoLiopLykgeworICAgICAgICAgICAgJGNoYWlucyA9ICRjaGFpbnMgLiAiOiQxICQyXG4iOworICAgICAgICAgICAgJGNoYWluID0gJDE7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9CisgICAgICAgIGlmICgkbGluZSA9fiBtL14kLykgeworICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfQorICAgICAgICBpZiAoJGNudCBlcSAiLS1MYyIpIHsKKyAgICAgICAgICAgICRsaW5lID1+IHMvLCBwY250ID0gKC4qKSAtLSBiY250ID0gKC4qKS8tYyAkMSAkMi87CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkbGluZSA9fiBzLyAkLy87CisgICAgICAgIH0KKyAgICAgICAgJHJ1bGVzID0gJHJ1bGVzIC4gIi1BICRjaGFpbiAkbGluZVxuIjsKKyAgICB9CisKKyAgICBwcmludCAkY2hhaW5zOworICAgIHByaW50ICRydWxlczsKKyAgICBwcmludCAiXG4iOworfQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit1bmxlc3MgKC14ICRlYnRhYmxlcykgeyBleGl0IC0xIH07CitwcmludCAiIyBHZW5lcmF0ZWQgYnkgZWJ0YWJsZXMtc2F2ZSB2JHZlcnNpb24gKGxlZ2FjeSkgb24gIiAuIGBkYXRlYDsKK2lmIChkZWZpbmVkKCRFTlZ7J0VCVEFCTEVTX1NBVkVfQ09VTlRFUid9KSAmJiAkRU5WeydFQlRBQkxFU19TQVZFX0NPVU5URVInfSBlcSAieWVzIikgeworICAgICRjbnQgPSAiLS1MYyI7Cit9Citmb3JlYWNoICR0YWJsZV9uYW1lIChzcGxpdCgiXG4iLCBgZ3JlcCAtRSAnXmVidGFibGVfJyAvcHJvYy9tb2R1bGVzIHwgY3V0IC1mMSAtZCcgJyB8IHNlZCBzL2VidGFibGVfLy9gKSkgeworICAgICR0YWJsZSA9YCRlYnRhYmxlcyAtdCAkdGFibGVfbmFtZSAtTCAkY250YDsKKyAgICB1bmxlc3MgKCQ/ID09IDApIHsgcHJpbnQgJHRhYmxlOyBleGl0IC0xIH07CisgICAgJnByb2Nlc3NfdGFibGUoJHRhYmxlKTsKK30KZGlmZiAtLWdpdCBhL2VidGFibGVzLXN0YW5kYWxvbmUuYyBiL2VidGFibGVzLXN0YW5kYWxvbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzQ5ZDM5Ci0tLSAvZGV2L251bGwKKysrIGIvZWJ0YWJsZXMtc3RhbmRhbG9uZS5jCkBAIC0wLDAgKzEsMTQgQEAKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJpbmNsdWRlL2VidGFibGVzX3UuaCIKKworc3RhdGljIHN0cnVjdCBlYnRfdV9yZXBsYWNlIHJlcGxhY2U7Cit2b2lkIGVidF9lYXJseV9pbml0X29uY2UoKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwllYnRfc2lsZW50ID0gMDsKKwllYnRfZWFybHlfaW5pdF9vbmNlKCk7CisJc3RyY3B5KHJlcGxhY2UubmFtZSwgImZpbHRlciIpOworCWRvX2NvbW1hbmQoYXJnYywgYXJndiwgRVhFQ19TVFlMRV9QUkcsICZyZXBsYWNlKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2VidGFibGVzLmMgYi9lYnRhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZjVjMmIKLS0tIC9kZXYvbnVsbAorKysgYi9lYnRhYmxlcy5jCkBAIC0wLDAgKzEsMTI0MSBAQAorLyoKKyAqIGVidGFibGVzLmMsIHYyLjAgSnVseSAyMDAyCisgKgorICogQXV0aG9yOiBCYXJ0IERlIFNjaHV5bWVyCisgKgorICogIFRoaXMgY29kZSB3YXMgc3RvbmdseSBpbnNwaXJlZCBvbiB0aGUgaXB0YWJsZXMgY29kZSB3aGljaCBpcworICogIENvcHlyaWdodCAoQykgMTk5OSBQYXVsIGBSdXN0eScgUnVzc2VsbCAmIE1pY2hhZWwgSi4gTmV1bGluZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSAiaW5jbHVkZS9lYnRhYmxlc191LmgiCisjaW5jbHVkZSAiaW5jbHVkZS9ldGhlcm5ldGRiLmgiCisKKy8qIENoZWNrcyB3aGV0aGVyIGEgY29tbWFuZCBoYXMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZCAqLworI2RlZmluZSBPUFRfQ09NTUFORFMgKHJlcGxhY2UtPmZsYWdzICYgT1BUX0NPTU1BTkQgfHwgcmVwbGFjZS0+ZmxhZ3MgJiBPUFRfWkVSTykKKworI2RlZmluZSBPUFRfQ09NTUFORAkweDAxCisjZGVmaW5lIE9QVF9UQUJMRQkweDAyCisjZGVmaW5lIE9QVF9JTgkJMHgwNAorI2RlZmluZSBPUFRfT1VUCQkweDA4CisjZGVmaW5lIE9QVF9KVU1QCTB4MTAKKyNkZWZpbmUgT1BUX1BST1RPQ09MCTB4MjAKKyNkZWZpbmUgT1BUX1NPVVJDRQkweDQwCisjZGVmaW5lIE9QVF9ERVNUCTB4ODAKKyNkZWZpbmUgT1BUX1pFUk8JMHgxMDAKKyNkZWZpbmUgT1BUX0xPR0lDQUxJTgkweDIwMAorI2RlZmluZSBPUFRfTE9HSUNBTE9VVAkweDQwMAorI2RlZmluZSBPUFRfS0VSTkVMREFUQQkweDgwMCAvKiBUaGlzIHZhbHVlIGlzIGFsc28gZGVmaW5lZCBpbiBlYnRhYmxlc2QuYyAqLworI2RlZmluZSBPUFRfQ09VTlQJMHgxMDAwIC8qIFRoaXMgdmFsdWUgaXMgYWxzbyBkZWZpbmVkIGluIGxpYmVidGMuYyAqLworI2RlZmluZSBPUFRfQ05UX0lOQ1IJMHgyMDAwIC8qIFRoaXMgdmFsdWUgaXMgYWxzbyBkZWZpbmVkIGluIGxpYmVidGMuYyAqLworI2RlZmluZSBPUFRfQ05UX0RFQ1IJMHg0MDAwIC8qIFRoaXMgdmFsdWUgaXMgYWxzbyBkZWZpbmVkIGluIGxpYmVidGMuYyAqLworCisvKiBEZWZhdWx0IGNvbW1hbmQgbGluZSBvcHRpb25zLiBEbyBub3QgbWVzcyBhcm91bmQgd2l0aCB0aGUgYWxyZWFkeQorICogYXNzaWduZWQgbnVtYmVycyB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nICovCitzdGF0aWMgc3RydWN0IG9wdGlvbiBlYnRfb3JpZ2luYWxfb3B0aW9uc1tdID0KK3sKKwl7ICJhcHBlbmQiICAgICAgICAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0EnIH0sCisJeyAiaW5zZXJ0IiAgICAgICAgICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJyB9LAorCXsgImRlbGV0ZSIgICAgICAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnRCcgfSwKKwl7ICJsaXN0IiAgICAgICAgICAgLCBvcHRpb25hbF9hcmd1bWVudCwgMCwgJ0wnIH0sCisJeyAiTGMiICAgICAgICAgICAgICwgbm9fYXJndW1lbnQgICAgICAsIDAsIDQgICB9LAorCXsgIkxuIiAgICAgICAgICAgICAsIG5vX2FyZ3VtZW50ICAgICAgLCAwLCA1ICAgfSwKKwl7ICJMeCIgICAgICAgICAgICAgLCBub19hcmd1bWVudCAgICAgICwgMCwgNiAgIH0sCisJeyAiTG1hYzIiICAgICAgICAgICwgbm9fYXJndW1lbnQgICAgICAsIDAsIDEyICB9LAorCXsgInplcm8iICAgICAgICAgICAsIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAnWicgfSwKKwl7ICJmbHVzaCIgICAgICAgICAgLCBvcHRpb25hbF9hcmd1bWVudCwgMCwgJ0YnIH0sCisJeyAicG9saWN5IiAgICAgICAgICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdQJyB9LAorCXsgImluLWludGVyZmFjZSIgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnaScgfSwKKwl7ICJpbi1pZiIgICAgICAgICAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2knIH0sCisJeyAibG9naWNhbC1pbiIgICAgICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIDIgICB9LAorCXsgImxvZ2ljYWwtb3V0IiAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAzICAgfSwKKwl7ICJvdXQtaW50ZXJmYWNlIiAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ28nIH0sCisJeyAib3V0LWlmIiAgICAgICAgICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdvJyB9LAorCXsgInZlcnNpb24iICAgICAgICAsIG5vX2FyZ3VtZW50ICAgICAgLCAwLCAnVicgfSwKKwl7ICJoZWxwIiAgICAgICAgICAgLCBub19hcmd1bWVudCAgICAgICwgMCwgJ2gnIH0sCisJeyAianVtcCIgICAgICAgICAgICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdqJyB9LAorCXsgInNldC1jb3VudGVycyIgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnYycgfSwKKwl7ICJjaGFuZ2UtY291bnRlcnMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0MnIH0sCisJeyAicHJvdG8iICAgICAgICAgICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdwJyB9LAorCXsgInByb3RvY29sIiAgICAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAncCcgfSwKKwl7ICJkYiIgICAgICAgICAgICAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2InIH0sCisJeyAic291cmNlIiAgICAgICAgICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdzJyB9LAorCXsgInNyYyIgICAgICAgICAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAncycgfSwKKwl7ICJkZXN0aW5hdGlvbiIgICAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2QnIH0sCisJeyAiZHN0IiAgICAgICAgICAgICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdkJyB9LAorCXsgInRhYmxlIiAgICAgICAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAndCcgfSwKKwl7ICJtb2Rwcm9iZSIgICAgICAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ00nIH0sCisJeyAibmV3LWNoYWluIiAgICAgICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdOJyB9LAorCXsgInJlbmFtZS1jaGFpbiIgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnRScgfSwKKwl7ICJkZWxldGUtY2hhaW4iICAgLCBvcHRpb25hbF9hcmd1bWVudCwgMCwgJ1gnIH0sCisJeyAiYXRvbWljLWluaXQiICAgICwgbm9fYXJndW1lbnQgICAgICAsIDAsIDcgICB9LAorCXsgImF0b21pYy1jb21taXQiICAsIG5vX2FyZ3VtZW50ICAgICAgLCAwLCA4ICAgfSwKKwl7ICJhdG9taWMtZmlsZSIgICAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgOSAgIH0sCisJeyAiYXRvbWljLXNhdmUiICAgICwgbm9fYXJndW1lbnQgICAgICAsIDAsIDEwICB9LAorCXsgImluaXQtdGFibGUiICAgICAsIG5vX2FyZ3VtZW50ICAgICAgLCAwLCAxMSAgfSwKKwl7ICJjb25jdXJyZW50IiAgICAgLCBub19hcmd1bWVudCAgICAgICwgMCwgMTMgIH0sCisJeyAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uICplYnRfb3B0aW9ucyA9IGVidF9vcmlnaW5hbF9vcHRpb25zOworCisvKiBIb2xkcyBhbGwgdGhlIGRhdGEgKi8KK3N0YXRpYyBzdHJ1Y3QgZWJ0X3VfcmVwbGFjZSAqcmVwbGFjZTsKKworLyogVGhlIGNob3NlbiB0YWJsZSAqLworc3RhdGljIHN0cnVjdCBlYnRfdV90YWJsZSAqdGFibGU7CisKKy8qIFRoZSBwb2ludGVycyBpbiBoZXJlIGFyZSBzcGVjaWFsOgorICogVGhlIHN0cnVjdCBlYnRfdGFyZ2V0IHBvaW50ZXIgaXMgYWN0dWFsbHkgYSBzdHJ1Y3QgZWJ0X3VfdGFyZ2V0IHBvaW50ZXIuCisgKiBJIGRvIG5vdCBmZWVsIGxpa2UgdXNpbmcgYSB1bmlvbi4KKyAqIFdlIG5lZWQgYSBzdHJ1Y3QgZWJ0X3VfdGFyZ2V0IHBvaW50ZXIgYmVjYXVzZSB3ZSBrbm93IHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhCisgKiB0aGV5IHBvaW50IHRvIHdvbid0IGNoYW5nZS4gV2Ugd2FudCB0byBhbGxvdyB0aGF0IHRoZSBzdHJ1Y3QgZWJ0X3VfdGFyZ2V0LnQKKyAqIG1lbWJlciBjYW4gY2hhbmdlLgorICogVGhlIHNhbWUgaG9sZHMgZm9yIHRoZSBzdHJ1Y3QgZWJ0X21hdGNoIGFuZCBzdHJ1Y3QgZWJ0X3dhdGNoZXIgcG9pbnRlcnMgKi8KK3N0YXRpYyBzdHJ1Y3QgZWJ0X3VfZW50cnkgKm5ld19lbnRyeTsKKworCitzdGF0aWMgaW50IGdsb2JhbF9vcHRpb25fb2Zmc2V0OworI2RlZmluZSBPUFRJT05fT0ZGU0VUIDI1Ngorc3RhdGljIHN0cnVjdCBvcHRpb24gKm1lcmdlX29wdGlvbnMoc3RydWN0IG9wdGlvbiAqb2xkb3B0cywKKyAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKm5ld29wdHMsIHVuc2lnbmVkIGludCAqb3B0aW9uc19vZmZzZXQpCit7CisJdW5zaWduZWQgaW50IG51bV9vbGQsIG51bV9uZXcsIGk7CisJc3RydWN0IG9wdGlvbiAqbWVyZ2U7CisKKwlpZiAoIW5ld29wdHMgfHwgIW9sZG9wdHMgfHwgIW9wdGlvbnNfb2Zmc2V0KQorCQllYnRfcHJpbnRfYnVnKCJtZXJnZSB3cm9uZyIpOworCWZvciAobnVtX29sZCA9IDA7IG9sZG9wdHNbbnVtX29sZF0ubmFtZTsgbnVtX29sZCsrKTsKKwlmb3IgKG51bV9uZXcgPSAwOyBuZXdvcHRzW251bV9uZXddLm5hbWU7IG51bV9uZXcrKyk7CisKKwlnbG9iYWxfb3B0aW9uX29mZnNldCArPSBPUFRJT05fT0ZGU0VUOworCSpvcHRpb25zX29mZnNldCA9IGdsb2JhbF9vcHRpb25fb2Zmc2V0OworCisJbWVyZ2UgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBvcHRpb24pICogKG51bV9uZXcgKyBudW1fb2xkICsgMSkpOworCWlmICghbWVyZ2UpCisJCWVidF9wcmludF9tZW1vcnkoKTsKKwltZW1jcHkobWVyZ2UsIG9sZG9wdHMsIG51bV9vbGQgKiBzaXplb2Yoc3RydWN0IG9wdGlvbikpOworCWZvciAoaSA9IDA7IGkgPCBudW1fbmV3OyBpKyspIHsKKwkJbWVyZ2VbbnVtX29sZCArIGldID0gbmV3b3B0c1tpXTsKKwkJbWVyZ2VbbnVtX29sZCArIGldLnZhbCArPSAqb3B0aW9uc19vZmZzZXQ7CisJfQorCW1lbXNldChtZXJnZSArIG51bV9vbGQgKyBudW1fbmV3LCAwLCBzaXplb2Yoc3RydWN0IG9wdGlvbikpOworCS8qIE9ubHkgZnJlZSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgc3R1ZmYgKi8KKwlpZiAob2xkb3B0cyAhPSBlYnRfb3JpZ2luYWxfb3B0aW9ucykKKwkJZnJlZShvbGRvcHRzKTsKKworCXJldHVybiBtZXJnZTsKK30KKworc3RhdGljIHZvaWQgbWVyZ2VfbWF0Y2goc3RydWN0IGVidF91X21hdGNoICptKQoreworCWVidF9vcHRpb25zID0gbWVyZ2Vfb3B0aW9ucworCSAgIChlYnRfb3B0aW9ucywgbS0+ZXh0cmFfb3BzLCAmKG0tPm9wdGlvbl9vZmZzZXQpKTsKK30KKworc3RhdGljIHZvaWQgbWVyZ2Vfd2F0Y2hlcihzdHJ1Y3QgZWJ0X3Vfd2F0Y2hlciAqdykKK3sKKwllYnRfb3B0aW9ucyA9IG1lcmdlX29wdGlvbnMKKwkgICAoZWJ0X29wdGlvbnMsIHctPmV4dHJhX29wcywgJih3LT5vcHRpb25fb2Zmc2V0KSk7Cit9CisKK3N0YXRpYyB2b2lkIG1lcmdlX3RhcmdldChzdHJ1Y3QgZWJ0X3VfdGFyZ2V0ICp0KQoreworCWVidF9vcHRpb25zID0gbWVyZ2Vfb3B0aW9ucworCSAgIChlYnRfb3B0aW9ucywgdC0+ZXh0cmFfb3BzLCAmKHQtPm9wdGlvbl9vZmZzZXQpKTsKK30KKworLyogQmUgYmFja3dhcmRzIGNvbXBhdGlibGUsIHNvIGRvbid0IHVzZSAnKycgaW4ga2VybmVsICovCisjZGVmaW5lIElGX1dJTERDQVJEIDEKK3N0YXRpYyB2b2lkIHByaW50X2lmYWNlKGNvbnN0IGNoYXIgKmlmYWNlKQoreworCWNoYXIgKmM7CisKKwlpZiAoKGMgPSBzdHJjaHIoaWZhY2UsIElGX1dJTERDQVJEKSkpCisJCSpjID0gJysnOworCXByaW50ZigiJXMgIiwgaWZhY2UpOworCWlmIChjKQorCQkqYyA9IElGX1dJTERDQVJEOworfQorCisvKiBXZSB1c2UgcmVwbGFjZS0+ZmxhZ3MsIHNvIHdlIGNhbid0IHVzZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqIDB4MDEgPT0gT1BUX0NPTU1BTkQsIDB4MDIgPT0gT1BUX1RBQkxFLCAweDEwMCA9PSBPUFRfWkVSTyAqLworI2RlZmluZSBMSVNUX04gICAgMHgwNAorI2RlZmluZSBMSVNUX0MgICAgMHgwOAorI2RlZmluZSBMSVNUX1ggICAgMHgxMAorI2RlZmluZSBMSVNUX01BQzIgMHgyMAorCisvKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGxpc3RfcnVsZXMoKSAqLworc3RhdGljIHZvaWQgbGlzdF9lbShzdHJ1Y3QgZWJ0X3VfZW50cmllcyAqZW50cmllcykKK3sKKwlpbnQgaSwgaiwgc3BhY2UgPSAwLCBkaWdpdHM7CisJc3RydWN0IGVidF91X2VudHJ5ICpobHA7CisJc3RydWN0IGVidF91X21hdGNoX2xpc3QgKm1fbDsKKwlzdHJ1Y3QgZWJ0X3Vfd2F0Y2hlcl9saXN0ICp3X2w7CisJc3RydWN0IGVidF91X21hdGNoICptOworCXN0cnVjdCBlYnRfdV93YXRjaGVyICp3OworCXN0cnVjdCBlYnRfdV90YXJnZXQgKnQ7CisKKwlpZiAocmVwbGFjZS0+ZmxhZ3MgJiBMSVNUX01BQzIpCisJCWVidF9wcmludHN0eWxlX21hYyA9IDI7CisJZWxzZQorCQllYnRfcHJpbnRzdHlsZV9tYWMgPSAwOworCWhscCA9IGVudHJpZXMtPmVudHJpZXMtPm5leHQ7CisJaWYgKHJlcGxhY2UtPmZsYWdzICYgTElTVF9YICYmIGVudHJpZXMtPnBvbGljeSAhPSBFQlRfQUNDRVBUKSB7CisJCXByaW50ZigiZWJ0YWJsZXMgLXQgJXMgLVAgJXMgJXNcbiIsIHJlcGxhY2UtPm5hbWUsCisJCSAgIGVudHJpZXMtPm5hbWUsIGVidF9zdGFuZGFyZF90YXJnZXRzWy1lbnRyaWVzLT5wb2xpY3kgLSAxXSk7CisJfSBlbHNlIGlmICghKHJlcGxhY2UtPmZsYWdzICYgTElTVF9YKSkgeworCQlwcmludGYoIlxuQnJpZGdlIGNoYWluOiAlcywgZW50cmllczogJWQsIHBvbGljeTogJXNcbiIsCisJCSAgIGVudHJpZXMtPm5hbWUsIGVudHJpZXMtPm5lbnRyaWVzLAorCQkgICBlYnRfc3RhbmRhcmRfdGFyZ2V0c1stZW50cmllcy0+cG9saWN5IC0gMV0pOworCX0KKworCWlmIChyZXBsYWNlLT5mbGFncyAmIExJU1RfTikgeworCQlpID0gZW50cmllcy0+bmVudHJpZXM7CisJCXdoaWxlIChpID4gOSkgeworCQkJc3BhY2UrKzsKKwkJCWkgLz0gMTA7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllcy0+bmVudHJpZXM7IGkrKykgeworCQlpZiAocmVwbGFjZS0+ZmxhZ3MgJiBMSVNUX04pIHsKKwkJCWRpZ2l0cyA9IDA7CisJCQkvKiBBIGxpdHRsZSB3b3JrIHRvIGdldCBuaWNlIHJ1bGUgbnVtYmVycy4gKi8KKwkJCWogPSBpICsgMTsKKwkJCXdoaWxlIChqID4gOSkgeworCQkJCWRpZ2l0cysrOworCQkJCWogLz0gMTA7CisJCQl9CisJCQlmb3IgKGogPSAwOyBqIDwgc3BhY2UgLSBkaWdpdHM7IGorKykKKwkJCQlwcmludGYoIiAiKTsKKwkJCXByaW50ZigiJWQuICIsIGkgKyAxKTsKKwkJfQorCQlpZiAocmVwbGFjZS0+ZmxhZ3MgJiBMSVNUX1gpCisJCQlwcmludGYoImVidGFibGVzIC10ICVzIC1BICVzICIsCisJCQkgICByZXBsYWNlLT5uYW1lLCBlbnRyaWVzLT5uYW1lKTsKKworCQkvKiBUaGUgc3RhbmRhcmQgdGFyZ2V0J3MgcHJpbnQoKSB1c2VzIHRoaXMgdG8gZmluZCBvdXQKKwkJICogdGhlIG5hbWUgb2YgYSB1ZGMgKi8KKwkJaGxwLT5yZXBsYWNlID0gcmVwbGFjZTsKKworCQkvKiBEb24ndCBwcmludCBhbnl0aGluZyBhYm91dCB0aGUgcHJvdG9jb2wgaWYgbm8gcHJvdG9jb2wgd2FzCisJCSAqIHNwZWNpZmllZCwgb2J2aW91c2x5IHRoaXMgbWVhbnMgYW55IHByb3RvY29sIHdpbGwgZG8uICovCisJCWlmICghKGhscC0+Yml0bWFzayAmIEVCVF9OT1BST1RPKSkgeworCQkJcHJpbnRmKCItcCAiKTsKKwkJCWlmIChobHAtPmludmZsYWdzICYgRUJUX0lQUk9UTykKKwkJCQlwcmludGYoIiEgIik7CisJCQlpZiAoaGxwLT5iaXRtYXNrICYgRUJUXzgwMl8zKQorCQkJCXByaW50ZigiTGVuZ3RoICIpOworCQkJZWxzZSB7CisJCQkJc3RydWN0IGV0aGVydHlwZWVudCAqZW50OworCisJCQkJZW50ID0gZ2V0ZXRoZXJ0eXBlYnludW1iZXIobnRvaHMoaGxwLT5ldGhwcm90bykpOworCQkJCWlmICghZW50KQorCQkJCQlwcmludGYoIjB4JXggIiwgbnRvaHMoaGxwLT5ldGhwcm90bykpOworCQkJCWVsc2UKKwkJCQkJcHJpbnRmKCIlcyAiLCBlbnQtPmVfbmFtZSk7CisJCQl9CisJCX0KKwkJaWYgKGhscC0+Yml0bWFzayAmIEVCVF9TT1VSQ0VNQUMpIHsKKwkJCXByaW50ZigiLXMgIik7CisJCQlpZiAoaGxwLT5pbnZmbGFncyAmIEVCVF9JU09VUkNFKQorCQkJCXByaW50ZigiISAiKTsKKwkJCWVidF9wcmludF9tYWNfYW5kX21hc2soaGxwLT5zb3VyY2VtYWMsIGhscC0+c291cmNlbXNrKTsKKwkJCXByaW50ZigiICIpOworCQl9CisJCWlmIChobHAtPmJpdG1hc2sgJiBFQlRfREVTVE1BQykgeworCQkJcHJpbnRmKCItZCAiKTsKKwkJCWlmIChobHAtPmludmZsYWdzICYgRUJUX0lERVNUKQorCQkJCXByaW50ZigiISAiKTsKKwkJCWVidF9wcmludF9tYWNfYW5kX21hc2soaGxwLT5kZXN0bWFjLCBobHAtPmRlc3Rtc2spOworCQkJcHJpbnRmKCIgIik7CisJCX0KKwkJaWYgKGhscC0+aW5bMF0gIT0gJ1wwJykgeworCQkJcHJpbnRmKCItaSAiKTsKKwkJCWlmIChobHAtPmludmZsYWdzICYgRUJUX0lJTikKKwkJCQlwcmludGYoIiEgIik7CisJCQlwcmludF9pZmFjZShobHAtPmluKTsKKwkJfQorCQlpZiAoaGxwLT5sb2dpY2FsX2luWzBdICE9ICdcMCcpIHsKKwkJCXByaW50ZigiLS1sb2dpY2FsLWluICIpOworCQkJaWYgKGhscC0+aW52ZmxhZ3MgJiBFQlRfSUxPR0lDQUxJTikKKwkJCQlwcmludGYoIiEgIik7CisJCQlwcmludF9pZmFjZShobHAtPmxvZ2ljYWxfaW4pOworCQl9CisJCWlmIChobHAtPmxvZ2ljYWxfb3V0WzBdICE9ICdcMCcpIHsKKwkJCXByaW50ZigiLS1sb2dpY2FsLW91dCAiKTsKKwkJCWlmIChobHAtPmludmZsYWdzICYgRUJUX0lMT0dJQ0FMT1VUKQorCQkJCXByaW50ZigiISAiKTsKKwkJCXByaW50X2lmYWNlKGhscC0+bG9naWNhbF9vdXQpOworCQl9CisJCWlmIChobHAtPm91dFswXSAhPSAnXDAnKSB7CisJCQlwcmludGYoIi1vICIpOworCQkJaWYgKGhscC0+aW52ZmxhZ3MgJiBFQlRfSU9VVCkKKwkJCQlwcmludGYoIiEgIik7CisJCQlwcmludF9pZmFjZShobHAtPm91dCk7CisJCX0KKworCQltX2wgPSBobHAtPm1fbGlzdDsKKwkJd2hpbGUgKG1fbCkgeworCQkJbSA9IGVidF9maW5kX21hdGNoKG1fbC0+bS0+dS5uYW1lKTsKKwkJCWlmICghbSkKKwkJCQllYnRfcHJpbnRfYnVnKCJNYXRjaCBub3QgZm91bmQiKTsKKwkJCW0tPnByaW50KGhscCwgbV9sLT5tKTsKKwkJCW1fbCA9IG1fbC0+bmV4dDsKKwkJfQorCQl3X2wgPSBobHAtPndfbGlzdDsKKwkJd2hpbGUgKHdfbCkgeworCQkJdyA9IGVidF9maW5kX3dhdGNoZXIod19sLT53LT51Lm5hbWUpOworCQkJaWYgKCF3KQorCQkJCWVidF9wcmludF9idWcoIldhdGNoZXIgbm90IGZvdW5kIik7CisJCQl3LT5wcmludChobHAsIHdfbC0+dyk7CisJCQl3X2wgPSB3X2wtPm5leHQ7CisJCX0KKworCQlwcmludGYoIi1qICIpOworCQlpZiAoc3RyY21wKGhscC0+dC0+dS5uYW1lLCBFQlRfU1RBTkRBUkRfVEFSR0VUKSkKKwkJCXByaW50ZigiJXMgIiwgaGxwLT50LT51Lm5hbWUpOworCQl0ID0gZWJ0X2ZpbmRfdGFyZ2V0KGhscC0+dC0+dS5uYW1lKTsKKwkJaWYgKCF0KQorCQkJZWJ0X3ByaW50X2J1ZygiVGFyZ2V0ICclcycgbm90IGZvdW5kIiwgaGxwLT50LT51Lm5hbWUpOworCQl0LT5wcmludChobHAsIGhscC0+dCk7CisJCWlmIChyZXBsYWNlLT5mbGFncyAmIExJU1RfQykgeworCQkJdWludDY0X3QgcGNudCA9IGhscC0+Y250LnBjbnQ7CisJCQl1aW50NjRfdCBiY250ID0gaGxwLT5jbnQuYmNudDsKKworCQkJaWYgKHJlcGxhY2UtPmZsYWdzICYgTElTVF9YKQorCQkJCXByaW50ZigiLWMgJSJQUkl1NjQiICUiUFJJdTY0LCBwY250LCBiY250KTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiwgcGNudCA9ICUiUFJJdTY0IiAtLSBiY250ID0gJSJQUkl1NjQsIHBjbnQsIGJjbnQpOworCQl9CisJCXByaW50ZigiXG4iKTsKKwkJaGxwID0gaGxwLT5uZXh0OworCX0KK30KKworc3RhdGljIHZvaWQgcHJpbnRfaGVscCgpCit7CisJc3RydWN0IGVidF91X21hdGNoX2xpc3QgKm1fbDsKKwlzdHJ1Y3QgZWJ0X3Vfd2F0Y2hlcl9saXN0ICp3X2w7CisKKwlQUklOVF9WRVJTSU9OOworCXByaW50ZigKKyJVc2FnZTpcbiIKKyJlYnRhYmxlcyAtW0FESV0gY2hhaW4gcnVsZS1zcGVjaWZpY2F0aW9uIFtvcHRpb25zXVxuIgorImVidGFibGVzIC1QIGNoYWluIHRhcmdldFxuIgorImVidGFibGVzIC1bTEZaXSBbY2hhaW5dXG4iCisiZWJ0YWJsZXMgLVtOWF0gW2NoYWluXVxuIgorImVidGFibGVzIC1FIG9sZC1jaGFpbi1uYW1lIG5ldy1jaGFpbi1uYW1lXG5cbiIKKyJDb21tYW5kczpcbiIKKyItLWFwcGVuZCAtQSBjaGFpbiAgICAgICAgICAgICA6IGFwcGVuZCB0byBjaGFpblxuIgorIi0tZGVsZXRlIC1EIGNoYWluICAgICAgICAgICAgIDogZGVsZXRlIG1hdGNoaW5nIHJ1bGUgZnJvbSBjaGFpblxuIgorIi0tZGVsZXRlIC1EIGNoYWluIHJ1bGVudW0gICAgIDogZGVsZXRlIHJ1bGUgYXQgcG9zaXRpb24gcnVsZW51bSBmcm9tIGNoYWluXG4iCisiLS1jaGFuZ2UtY291bnRlcnMgLUMgY2hhaW5cbiIKKyIgICAgICAgICAgW3J1bGVudW1dIHBjbnQgYmNudCA6IGNoYW5nZSBjb3VudGVycyBvZiBleGlzdGluZyBydWxlXG4iCisiLS1pbnNlcnQgLUkgY2hhaW4gcnVsZW51bSAgICAgOiBpbnNlcnQgcnVsZSBhdCBwb3NpdGlvbiBydWxlbnVtIGluIGNoYWluXG4iCisiLS1saXN0ICAgLUwgW2NoYWluXSAgICAgICAgICAgOiBsaXN0IHRoZSBydWxlcyBpbiBhIGNoYWluIG9yIGluIGFsbCBjaGFpbnNcbiIKKyItLWZsdXNoICAtRiBbY2hhaW5dICAgICAgICAgICA6IGRlbGV0ZSBhbGwgcnVsZXMgaW4gY2hhaW4gb3IgaW4gYWxsIGNoYWluc1xuIgorIi0taW5pdC10YWJsZSAgICAgICAgICAgICAgICAgIDogcmVwbGFjZSB0aGUga2VybmVsIHRhYmxlIHdpdGggdGhlIGluaXRpYWwgdGFibGVcbiIKKyItLXplcm8gICAtWiBbY2hhaW5dICAgICAgICAgICA6IHB1dCBjb3VudGVycyBvbiB6ZXJvIGluIGNoYWluIG9yIGluIGFsbCBjaGFpbnNcbiIKKyItLXBvbGljeSAtUCBjaGFpbiB0YXJnZXQgICAgICA6IGNoYW5nZSBwb2xpY3kgb24gY2hhaW4gdG8gdGFyZ2V0XG4iCisiLS1uZXctY2hhaW4gLU4gY2hhaW4gICAgICAgICAgOiBjcmVhdGUgYSB1c2VyIGRlZmluZWQgY2hhaW5cbiIKKyItLXJlbmFtZS1jaGFpbiAtRSBvbGQgbmV3ICAgICA6IHJlbmFtZSBhIGNoYWluXG4iCisiLS1kZWxldGUtY2hhaW4gLVggW2NoYWluXSAgICAgOiBkZWxldGUgYSB1c2VyIGRlZmluZWQgY2hhaW5cbiIKKyItLWF0b21pYy1jb21taXQgICAgICAgICAgICAgICA6IHVwZGF0ZSB0aGUga2VybmVsIHcvdCB0YWJsZSBjb250YWluZWQgaW4gPEZJTEU+XG4iCisiLS1hdG9taWMtaW5pdCAgICAgICAgICAgICAgICAgOiBwdXQgdGhlIGluaXRpYWwga2VybmVsIHRhYmxlIGludG8gPEZJTEU+XG4iCisiLS1hdG9taWMtc2F2ZSAgICAgICAgICAgICAgICAgOiBwdXQgdGhlIGN1cnJlbnQga2VybmVsIHRhYmxlIGludG8gPEZJTEU+XG4iCisiLS1hdG9taWMtZmlsZSBmaWxlICAgICAgICAgICAgOiBzZXQgPEZJTEU+IHRvIGZpbGVcblxuIgorIk9wdGlvbnM6XG4iCisiLS1wcm90byAgLXAgWyFdIHByb3RvICAgICAgICAgOiBwcm90b2NvbCBoZXhhZGVjaW1hbCwgYnkgbmFtZSBvciBMRU5HVEhcbiIKKyItLXNyYyAgICAtcyBbIV0gYWRkcmVzc1svbWFza106IHNvdXJjZSBtYWMgYWRkcmVzc1xuIgorIi0tZHN0ICAgIC1kIFshXSBhZGRyZXNzWy9tYXNrXTogZGVzdGluYXRpb24gbWFjIGFkZHJlc3NcbiIKKyItLWluLWlmICAtaSBbIV0gbmFtZVsrXSAgICAgICA6IG5ldHdvcmsgaW5wdXQgaW50ZXJmYWNlIG5hbWVcbiIKKyItLW91dC1pZiAtbyBbIV0gbmFtZVsrXSAgICAgICA6IG5ldHdvcmsgb3V0cHV0IGludGVyZmFjZSBuYW1lXG4iCisiLS1sb2dpY2FsLWluICBbIV0gbmFtZVsrXSAgICAgOiBsb2dpY2FsIGJyaWRnZSBpbnB1dCBpbnRlcmZhY2UgbmFtZVxuIgorIi0tbG9naWNhbC1vdXQgWyFdIG5hbWVbK10gICAgIDogbG9naWNhbCBicmlkZ2Ugb3V0cHV0IGludGVyZmFjZSBuYW1lXG4iCisiLS1zZXQtY291bnRlcnMgLWMgY2hhaW5cbiIKKyIgICAgICAgICAgcGNudCBiY250ICAgICAgICAgICA6IHNldCB0aGUgY291bnRlcnMgb2YgdGhlIHRvIGJlIGFkZGVkIHJ1bGVcbiIKKyItLW1vZHByb2JlIC1NIHByb2dyYW0gICAgICAgICA6IHRyeSB0byBpbnNlcnQgbW9kdWxlcyB1c2luZyB0aGlzIHByb2dyYW1cbiIKKyItLWNvbmN1cnJlbnQgICAgICAgICAgICAgICAgICA6IHVzZSBhIGZpbGUgbG9jayB0byBzdXBwb3J0IGNvbmN1cnJlbnQgc2NyaXB0c1xuIgorIi0tdmVyc2lvbiAtViAgICAgICAgICAgICAgICAgIDogcHJpbnQgcGFja2FnZSB2ZXJzaW9uXG5cbiIKKyJFbnZpcm9ubWVudCB2YXJpYWJsZTpcbiIKK0FUT01JQ19FTlZfVkFSSUFCTEUgIiAgICAgICAgICA6IGlmIHNldCA8RklMRT4gKHNlZSBhYm92ZSkgd2lsbCBlcXVhbCBpdHMgdmFsdWUiCisiXG5cbiIpOworCW1fbCA9IG5ld19lbnRyeS0+bV9saXN0OworCXdoaWxlIChtX2wpIHsKKwkJKChzdHJ1Y3QgZWJ0X3VfbWF0Y2ggKiltX2wtPm0pLT5oZWxwKCk7CisJCXByaW50ZigiXG4iKTsKKwkJbV9sID0gbV9sLT5uZXh0OworCX0KKwl3X2wgPSBuZXdfZW50cnktPndfbGlzdDsKKwl3aGlsZSAod19sKSB7CisJCSgoc3RydWN0IGVidF91X3dhdGNoZXIgKil3X2wtPncpLT5oZWxwKCk7CisJCXByaW50ZigiXG4iKTsKKwkJd19sID0gd19sLT5uZXh0OworCX0KKwkoKHN0cnVjdCBlYnRfdV90YXJnZXQgKiluZXdfZW50cnktPnQpLT5oZWxwKCk7CisJcHJpbnRmKCJcbiIpOworCWlmICh0YWJsZS0+aGVscCkKKwkJdGFibGUtPmhlbHAoZWJ0X2hvb2tuYW1lcyk7Cit9CisKKy8qIEV4ZWN1dGUgY29tbWFuZCBMICovCitzdGF0aWMgdm9pZCBsaXN0X3J1bGVzKCkKK3sKKwlpbnQgaTsKKworCWlmICghKHJlcGxhY2UtPmZsYWdzICYgTElTVF9YKSkKKwkJcHJpbnRmKCJCcmlkZ2UgdGFibGU6ICVzXG4iLCB0YWJsZS0+bmFtZSk7CisJaWYgKHJlcGxhY2UtPnNlbGVjdGVkX2NoYWluICE9IC0xKQorCQlsaXN0X2VtKGVidF90b19jaGFpbihyZXBsYWNlKSk7CisJZWxzZSB7CisJCS8qIENyZWF0ZSBuZXcgY2hhaW5zIGFuZCByZW5hbWUgc3RhbmRhcmQgY2hhaW5zIHdoZW4gbmVjZXNzYXJ5ICovCisJCWlmIChyZXBsYWNlLT5mbGFncyAmIExJU1RfWCAmJiByZXBsYWNlLT5udW1fY2hhaW5zID4gTkZfQlJfTlVNSE9PS1MpIHsKKwkJCWZvciAoaSA9IE5GX0JSX05VTUhPT0tTOyBpIDwgcmVwbGFjZS0+bnVtX2NoYWluczsgaSsrKQorCQkJCXByaW50ZigiZWJ0YWJsZXMgLXQgJXMgLU4gJXNcbiIsIHJlcGxhY2UtPm5hbWUsIHJlcGxhY2UtPmNoYWluc1tpXS0+bmFtZSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgTkZfQlJfTlVNSE9PS1M7IGkrKykKKwkJCQlpZiAocmVwbGFjZS0+Y2hhaW5zW2ldICYmIHN0cmNtcChyZXBsYWNlLT5jaGFpbnNbaV0tPm5hbWUsIGVidF9ob29rbmFtZXNbaV0pKQorCQkJCQlwcmludGYoImVidGFibGVzIC10ICVzIC1FICVzICVzXG4iLCByZXBsYWNlLT5uYW1lLCBlYnRfaG9va25hbWVzW2ldLCByZXBsYWNlLT5jaGFpbnNbaV0tPm5hbWUpOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCByZXBsYWNlLT5udW1fY2hhaW5zOyBpKyspCisJCQlpZiAocmVwbGFjZS0+Y2hhaW5zW2ldKQorCQkJCWxpc3RfZW0ocmVwbGFjZS0+Y2hhaW5zW2ldKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfcnVsZV9yYW5nZShjb25zdCBjaGFyICphcmd2LCBpbnQgKnJ1bGVfbnIsIGludCAqcnVsZV9ucl9lbmQpCit7CisJY2hhciAqY29sb24gPSBzdHJjaHIoYXJndiwgJzonKSwgKmJ1ZmZlcjsKKworCWlmIChjb2xvbikgeworCQkqY29sb24gPSAnXDAnOworCQlpZiAoKihjb2xvbiArIDEpID09ICdcMCcpCisJCQkqcnVsZV9ucl9lbmQgPSAtMTsgLyogVW50aWwgdGhlIGxhc3QgcnVsZSAqLworCQllbHNlIHsKKwkJCSpydWxlX25yX2VuZCA9IHN0cnRvbChjb2xvbiArIDEsICZidWZmZXIsIDEwKTsKKwkJCWlmICgqYnVmZmVyICE9ICdcMCcgfHwgKnJ1bGVfbnJfZW5kID09IDApCisJCQkJcmV0dXJuIC0xOworCQl9CisJfQorCWlmIChjb2xvbiA9PSBhcmd2KQorCQkqcnVsZV9uciA9IDE7IC8qIEJlZ2lubmluZyB3aXRoIHRoZSBmaXJzdCBydWxlICovCisJZWxzZSB7CisJCSpydWxlX25yID0gc3RydG9sKGFyZ3YsICZidWZmZXIsIDEwKTsKKwkJaWYgKCpidWZmZXIgIT0gJ1wwJyB8fCAqcnVsZV9uciA9PSAwKQorCQkJcmV0dXJuIC0xOworCX0KKwlpZiAoIWNvbG9uKQorCQkqcnVsZV9ucl9lbmQgPSAqcnVsZV9ucjsKKwlyZXR1cm4gMDsKK30KKworLyogSW5jcmVtZW50aW5nIG9yIGRlY3JlbWVudGluZyBydWxlcyBpbiBkYWVtb24gbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGFzIHRoZQorICogaW52b2x2ZWQgY29kZSBvdmVybG9hZCBpcyBub3Qgd29ydGggaXQgKHRvbyBhbm5veWluZyB0byB0YWtlIHRoZSBpbmNyZWFzZWQKKyAqIGNvdW50ZXJzIGluIHRoZSBrZXJuZWwgaW50byBhY2NvdW50KS4gKi8KK3N0YXRpYyBpbnQgcGFyc2VfY2hhbmdlX2NvdW50ZXJzX3J1bGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBpbnQgKnJ1bGVfbnIsIGludCAqcnVsZV9ucl9lbmQsIGludCBleGVjX3N0eWxlKQoreworCWNoYXIgKmJ1ZmZlcjsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChvcHRpbmQgKyAxID49IGFyZ2MgfHwgKGFyZ3Zbb3B0aW5kXVswXSA9PSAnLScgJiYgKGFyZ3Zbb3B0aW5kXVsxXSA8ICcwJyB8fCBhcmd2W29wdGluZF1bMV0gPiAnOScpKSB8fAorCSAgICAoYXJndltvcHRpbmQgKyAxXVswXSA9PSAnLScgJiYgKGFyZ3Zbb3B0aW5kICsgMV1bMV0gPCAnMCcgICYmIGFyZ3Zbb3B0aW5kICsgMV1bMV0gPiAnOScpKSkKKwkJZWJ0X3ByaW50X2Vycm9yMigiVGhlIGNvbW1hbmQgLUMgbmVlZHMgYXQgbGVhc3QgMiBhcmd1bWVudHMiKTsKKwlpZiAob3B0aW5kICsgMiA8IGFyZ2MgJiYgKGFyZ3Zbb3B0aW5kICsgMl1bMF0gIT0gJy0nIHx8IChhcmd2W29wdGluZCArIDJdWzFdID49ICcwJyAmJiBhcmd2W29wdGluZCArIDJdWzFdIDw9ICc5JykpKSB7CisJCWlmIChvcHRpbmQgKyAzICE9IGFyZ2MpCisJCQllYnRfcHJpbnRfZXJyb3IyKCJObyBleHRyYSBvcHRpb25zIGFsbG93ZWQgd2l0aCAtQyBzdGFydF9ucls6ZW5kX25yXSBwY250IGJjbnQiKTsKKwkJaWYgKHBhcnNlX3J1bGVfcmFuZ2UoYXJndltvcHRpbmRdLCBydWxlX25yLCBydWxlX25yX2VuZCkpCisJCQllYnRfcHJpbnRfZXJyb3IyKCJTb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB0aGUgcnVsZSBudW1iZXIgc3BlY2lmaWNhdGlvbiAnJXMnIiwgYXJndltvcHRpbmRdKTsKKwkJb3B0aW5kKys7CisJfQorCisJaWYgKGFyZ3Zbb3B0aW5kXVswXSA9PSAnKycpIHsKKwkJaWYgKGV4ZWNfc3R5bGUgPT0gRVhFQ19TVFlMRV9EQUVNT04pCitkYWVtb25faW5jcjoKKwkJCWVidF9wcmludF9lcnJvcjIoIkluY3JlbWVudGluZyBydWxlIGNvdW50ZXJzICglcykgbm90IGFsbG93ZWQgaW4gZGFlbW9uIG1vZGUiLCBhcmd2W29wdGluZF0pOworCQlyZXQgKz0gMTsKKwkJbmV3X2VudHJ5LT5jbnRfc3VycGx1cy5wY250ID0gc3RydG91bGwoYXJndltvcHRpbmRdICsgMSwgJmJ1ZmZlciwgMTApOworCX0gZWxzZSBpZiAoYXJndltvcHRpbmRdWzBdID09ICctJykgeworCQlpZiAoZXhlY19zdHlsZSA9PSBFWEVDX1NUWUxFX0RBRU1PTikKK2RhZW1vbl9kZWNyOgorCQkJZWJ0X3ByaW50X2Vycm9yMigiRGVjcmVtZW50aW5nIHJ1bGUgY291bnRlcnMgKCVzKSBub3QgYWxsb3dlZCBpbiBkYWVtb24gbW9kZSIsIGFyZ3Zbb3B0aW5kXSk7CisJCXJldCArPSAyOworCQluZXdfZW50cnktPmNudF9zdXJwbHVzLnBjbnQgPSBzdHJ0b3VsbChhcmd2W29wdGluZF0gKyAxLCAmYnVmZmVyLCAxMCk7CisJfSBlbHNlCisJCW5ld19lbnRyeS0+Y250X3N1cnBsdXMucGNudCA9IHN0cnRvdWxsKGFyZ3Zbb3B0aW5kXSwgJmJ1ZmZlciwgMTApOworCisJaWYgKCpidWZmZXIgIT0gJ1wwJykKKwkJZ290byBpbnZhbGlkOworCW9wdGluZCsrOworCWlmIChhcmd2W29wdGluZF1bMF0gPT0gJysnKSB7CisJCWlmIChleGVjX3N0eWxlID09IEVYRUNfU1RZTEVfREFFTU9OKQorCQkJZ290byBkYWVtb25faW5jcjsKKwkJcmV0ICs9IDM7CisJCW5ld19lbnRyeS0+Y250X3N1cnBsdXMuYmNudCA9IHN0cnRvdWxsKGFyZ3Zbb3B0aW5kXSArIDEsICZidWZmZXIsIDEwKTsKKwl9IGVsc2UgaWYgKGFyZ3Zbb3B0aW5kXVswXSA9PSAnLScpIHsKKwkJaWYgKGV4ZWNfc3R5bGUgPT0gRVhFQ19TVFlMRV9EQUVNT04pCisJCQlnb3RvIGRhZW1vbl9kZWNyOworCQlyZXQgKz0gNjsKKwkJbmV3X2VudHJ5LT5jbnRfc3VycGx1cy5iY250ID0gc3RydG91bGwoYXJndltvcHRpbmRdICsgMSwgJmJ1ZmZlciwgMTApOworCX0gZWxzZQorCQluZXdfZW50cnktPmNudF9zdXJwbHVzLmJjbnQgPSBzdHJ0b3VsbChhcmd2W29wdGluZF0sICZidWZmZXIsIDEwKTsKKworCWlmICgqYnVmZmVyICE9ICdcMCcpCisJCWdvdG8gaW52YWxpZDsKKwlvcHRpbmQrKzsKKwlyZXR1cm4gcmV0OworaW52YWxpZDoKKwllYnRfcHJpbnRfZXJyb3IyKCJQYWNrZXQgY291bnRlciAnJXMnIGludmFsaWQiLCBhcmd2W29wdGluZF0pOworfQorCitzdGF0aWMgaW50IHBhcnNlX2lmYWNlKGNoYXIgKmlmYWNlLCBjaGFyICpvcHRpb24pCit7CisJY2hhciAqYzsKKworCWlmICgoYyA9IHN0cmNocihpZmFjZSwgJysnKSkpIHsKKwkJaWYgKCooYyArIDEpICE9ICdcMCcpIHsKKwkJCWVidF9wcmludF9lcnJvcigiU3B1cmlvdXMgY2hhcmFjdGVycyBhZnRlciAnKycgd2lsZGNhcmQgZm9yICclcyciLCBvcHRpb24pOworCQkJcmV0dXJuIC0xOworCQl9IGVsc2UKKwkJCSpjID0gSUZfV0lMRENBUkQ7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIGVidF9lYXJseV9pbml0X29uY2UoKQoreworCWVidF9pdGVyYXRlX21hdGNoZXMobWVyZ2VfbWF0Y2gpOworCWVidF9pdGVyYXRlX3dhdGNoZXJzKG1lcmdlX3dhdGNoZXIpOworCWVidF9pdGVyYXRlX3RhcmdldHMobWVyZ2VfdGFyZ2V0KTsKK30KKworLyogV2UgdXNlIGV4ZWNfc3R5bGUgaW5zdGVhZCBvZiAjaWZkZWYncyBiZWNhdXNlIGVidGFibGVzLnNvIGlzIGEgc2hhcmVkIG9iamVjdC4gKi8KK2ludCBkb19jb21tYW5kKGludCBhcmdjLCBjaGFyICphcmd2W10sIGludCBleGVjX3N0eWxlLAorICAgICAgICAgICAgICAgc3RydWN0IGVidF91X3JlcGxhY2UgKnJlcGxhY2VfKQoreworCWNoYXIgKmJ1ZmZlcjsKKwlpbnQgYywgaTsKKwlpbnQgemVyb2NoYWluID0gLTE7IC8qIE5lZWRlZCBmb3IgdGhlIC1aIG9wdGlvbiAod2UgY2FuIGhhdmUgLVogPHRoaXM+IC1MIDx0aGF0PikgKi8KKwlpbnQgY2hjb3VudGVyID0gMDsgLyogTmVlZGVkIGZvciAtQyAqLworCWludCBwb2xpY3kgPSAwOworCWludCBydWxlX25yID0gMDsKKwlpbnQgcnVsZV9ucl9lbmQgPSAwOworCXN0cnVjdCBlYnRfdV90YXJnZXQgKnQ7CisJc3RydWN0IGVidF91X21hdGNoICptOworCXN0cnVjdCBlYnRfdV93YXRjaGVyICp3OworCXN0cnVjdCBlYnRfdV9tYXRjaF9saXN0ICptX2w7CisJc3RydWN0IGVidF91X3dhdGNoZXJfbGlzdCAqd19sOworCXN0cnVjdCBlYnRfdV9lbnRyaWVzICplbnRyaWVzOworCisJb3B0ZXJyID0gMDsKKwllYnRfbW9kcHJvYmUgPSBOVUxMOworCisJcmVwbGFjZSA9IHJlcGxhY2VfOworCisJLyogVGhlIGRhZW1vbiBkb2Vzbid0IHVzZSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKwlpZiAoZXhlY19zdHlsZSA9PSBFWEVDX1NUWUxFX1BSRykgeworCQlidWZmZXIgPSBnZXRlbnYoQVRPTUlDX0VOVl9WQVJJQUJMRSk7CisJCWlmIChidWZmZXIpIHsKKwkJCXJlcGxhY2UtPmZpbGVuYW1lID0gbWFsbG9jKHN0cmxlbihidWZmZXIpICsgMSk7CisJCQlpZiAoIXJlcGxhY2UtPmZpbGVuYW1lKQorCQkJCWVidF9wcmludF9tZW1vcnkoKTsKKwkJCXN0cmNweShyZXBsYWNlLT5maWxlbmFtZSwgYnVmZmVyKTsKKwkJCWJ1ZmZlciA9IE5VTEw7CisJCX0KKwl9CisKKwlyZXBsYWNlLT5mbGFncyAmPSBPUFRfS0VSTkVMREFUQTsgLyogZWJ0YWJsZXNkIG5lZWRzIE9QVF9LRVJORUxEQVRBICovCisJcmVwbGFjZS0+c2VsZWN0ZWRfY2hhaW4gPSAtMTsKKwlyZXBsYWNlLT5jb21tYW5kID0gJ2gnOworCisJaWYgKCFuZXdfZW50cnkpIHsKKwkJbmV3X2VudHJ5ID0gKHN0cnVjdCBlYnRfdV9lbnRyeSAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGVidF91X2VudHJ5KSk7CisJCWlmICghbmV3X2VudHJ5KQorCQkJZWJ0X3ByaW50X21lbW9yeSgpOworCX0KKwkvKiBQdXQgc29tZSBzYW5lIHZhbHVlcyBpbiBvdXIgbmV3IGVudHJ5ICovCisJZWJ0X2luaXRpYWxpemVfZW50cnkobmV3X2VudHJ5KTsKKwluZXdfZW50cnktPnJlcGxhY2UgPSByZXBsYWNlOworCisJLyogVGhlIHNjZW5hcmlvIGluZHVjZWQgYnkgdGhpcyBsb29wIG1ha2VzIHRoYXQ6CisJICogJy10JyAgLCctTScgYW5kIC0tYXRvbWljIChpZiBzcGVjaWZpZWQpIGhhdmUgdG8gY29tZQorCSAqIGJlZm9yZSAnLUEnIGFuZCB0aGUgbGlrZSAqLworCisJLyogR2V0b3B0IHNhdmVzIHRoZSBkYXkgKi8KKwl3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LAorCSAgICItQTpEOkM6STpOOkU6WDo6TDo6Wjo6Rjo6UDpWaGk6bzpqOmM6cDpzOmQ6dDpNOiIsIGVidF9vcHRpb25zLCBOVUxMKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChjKSB7CisKKwkJY2FzZSAnQSc6IC8qIEFkZCBhIHJ1bGUgKi8KKwkJY2FzZSAnRCc6IC8qIERlbGV0ZSBhIHJ1bGUgKi8KKwkJY2FzZSAnQyc6IC8qIENoYW5nZSBjb3VudGVycyAqLworCQljYXNlICdQJzogLyogRGVmaW5lIHBvbGljeSAqLworCQljYXNlICdJJzogLyogSW5zZXJ0IGEgcnVsZSAqLworCQljYXNlICdOJzogLyogTWFrZSBhIHVzZXIgZGVmaW5lZCBjaGFpbiAqLworCQljYXNlICdFJzogLyogUmVuYW1lIGNoYWluICovCisJCWNhc2UgJ1gnOiAvKiBEZWxldGUgY2hhaW4gKi8KKwkJCS8qIFdlIGFsbG93IC1OIGNoYWlubmFtZSAtUCBwb2xpY3kgKi8KKwkJCWlmIChyZXBsYWNlLT5jb21tYW5kID09ICdOJyAmJiBjID09ICdQJykgeworCQkJCXJlcGxhY2UtPmNvbW1hbmQgPSBjOworCQkJCW9wdGluZC0tOyAvKiBObyB0YWJsZSBzcGVjaWZpZWQgKi8KKwkJCQlnb3RvIGhhbmRsZV9QOworCQkJfQorCQkJaWYgKE9QVF9DT01NQU5EUykKKwkJCQllYnRfcHJpbnRfZXJyb3IyKCJNdWx0aXBsZSBjb21tYW5kcyBhcmUgbm90IGFsbG93ZWQiKTsKKworCQkJcmVwbGFjZS0+Y29tbWFuZCA9IGM7CisJCQlyZXBsYWNlLT5mbGFncyB8PSBPUFRfQ09NTUFORDsKKwkJCWlmICghKHJlcGxhY2UtPmZsYWdzICYgT1BUX0tFUk5FTERBVEEpKQorCQkJCWVidF9nZXRfa2VybmVsX3RhYmxlKHJlcGxhY2UsIDApOworCQkJaWYgKG9wdGFyZyAmJiAob3B0YXJnWzBdID09ICctJyB8fCAhc3RyY21wKG9wdGFyZywgIiEiKSkpCisJCQkJZWJ0X3ByaW50X2Vycm9yMigiTm8gY2hhaW4gbmFtZSBzcGVjaWZpZWQiKTsKKwkJCWlmIChjID09ICdOJykgeworCQkJCWlmIChlYnRfZ2V0X2NoYWlubnIocmVwbGFjZSwgb3B0YXJnKSAhPSAtMSkKKwkJCQkJZWJ0X3ByaW50X2Vycm9yMigiQ2hhaW4gJXMgYWxyZWFkeSBleGlzdHMiLCBvcHRhcmcpOworCQkJCWVsc2UgaWYgKGVidF9maW5kX3RhcmdldChvcHRhcmcpKQorCQkJCQllYnRfcHJpbnRfZXJyb3IyKCJUYXJnZXQgd2l0aCBuYW1lICVzIGV4aXN0cyIsIG9wdGFyZyk7CisJCQkJZWxzZSBpZiAoc3RybGVuKG9wdGFyZykgPj0gRUJUX0NIQUlOX01BWE5BTUVMRU4pCisJCQkJCWVidF9wcmludF9lcnJvcjIoIkNoYWluIG5hbWUgbGVuZ3RoIGNhbid0IGV4Y2VlZCAlZCIsCisJCQkJCQkJRUJUX0NIQUlOX01BWE5BTUVMRU4gLSAxKTsKKwkJCQllbHNlIGlmIChzdHJjaHIob3B0YXJnLCAnICcpICE9IE5VTEwpCisJCQkJCWVidF9wcmludF9lcnJvcjIoIlVzZSBvZiAnICcgbm90IGFsbG93ZWQgaW4gY2hhaW4gbmFtZXMiKTsKKwkJCQllYnRfbmV3X2NoYWluKHJlcGxhY2UsIG9wdGFyZywgRUJUX0FDQ0VQVCk7CisJCQkJLyogVGhpcyBpcyBuZWVkZWQgdG8gZ2V0IC1OIHggLVAgeSB3b3JraW5nICovCisJCQkJcmVwbGFjZS0+c2VsZWN0ZWRfY2hhaW4gPSBlYnRfZ2V0X2NoYWlubnIocmVwbGFjZSwgb3B0YXJnKTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoYyA9PSAnWCcpIHsKKwkJCQlpZiAob3B0aW5kID49IGFyZ2MpIHsKKwkJCQkJcmVwbGFjZS0+c2VsZWN0ZWRfY2hhaW4gPSAtMTsKKwkJCQkJZWJ0X2RlbGV0ZV9jaGFpbihyZXBsYWNlKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaWYgKG9wdGluZCA8IGFyZ2MgLSAxKQorCQkJCQllYnRfcHJpbnRfZXJyb3IyKCJObyBleHRyYSBvcHRpb25zIGFsbG93ZWQgd2l0aCAtWCIpOworCisJCQkJaWYgKChyZXBsYWNlLT5zZWxlY3RlZF9jaGFpbiA9IGVidF9nZXRfY2hhaW5ucihyZXBsYWNlLCBhcmd2W29wdGluZF0pKSA9PSAtMSkKKwkJCQkJZWJ0X3ByaW50X2Vycm9yMigiQ2hhaW4gJyVzJyBkb2Vzbid0IGV4aXN0IiwgYXJndltvcHRpbmRdKTsKKwkJCQllYnRfZGVsZXRlX2NoYWluKHJlcGxhY2UpOworCQkJCWlmIChlYnRfZXJyb3Jtc2dbMF0gIT0gJ1wwJykKKwkJCQkJcmV0dXJuIC0xOworCQkJCW9wdGluZCsrOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoKHJlcGxhY2UtPnNlbGVjdGVkX2NoYWluID0gZWJ0X2dldF9jaGFpbm5yKHJlcGxhY2UsIG9wdGFyZykpID09IC0xKQorCQkJCWVidF9wcmludF9lcnJvcjIoIkNoYWluICclcycgZG9lc24ndCBleGlzdCIsIG9wdGFyZyk7CisJCQlpZiAoYyA9PSAnRScpIHsKKwkJCQlpZiAob3B0aW5kID49IGFyZ2MpCisJCQkJCWVidF9wcmludF9lcnJvcjIoIk5vIG5ldyBjaGFpbiBuYW1lIHNwZWNpZmllZCIpOworCQkJCWVsc2UgaWYgKG9wdGluZCA8IGFyZ2MgLSAxKQorCQkJCQllYnRfcHJpbnRfZXJyb3IyKCJObyBleHRyYSBvcHRpb25zIGFsbG93ZWQgd2l0aCAtRSIpOworCQkJCWVsc2UgaWYgKHN0cmxlbihhcmd2W29wdGluZF0pID49IEVCVF9DSEFJTl9NQVhOQU1FTEVOKQorCQkJCQllYnRfcHJpbnRfZXJyb3IyKCJDaGFpbiBuYW1lIGxlbmd0aCBjYW4ndCBleGNlZWQgJWQgY2hhcmFjdGVycyIsIEVCVF9DSEFJTl9NQVhOQU1FTEVOIC0gMSk7CisJCQkJZWxzZSBpZiAoZWJ0X2dldF9jaGFpbm5yKHJlcGxhY2UsIGFyZ3Zbb3B0aW5kXSkgIT0gLTEpCisJCQkJCWVidF9wcmludF9lcnJvcjIoIkNoYWluICclcycgYWxyZWFkeSBleGlzdHMiLCBhcmd2W29wdGluZF0pOworCQkJCWVsc2UgaWYgKGVidF9maW5kX3RhcmdldChhcmd2W29wdGluZF0pKQorCQkJCQllYnRfcHJpbnRfZXJyb3IyKCJUYXJnZXQgd2l0aCBuYW1lICclcycgZXhpc3RzIiwgYXJndltvcHRpbmRdKTsKKwkJCQllbHNlIGlmIChzdHJjaHIoYXJndltvcHRpbmRdLCAnICcpICE9IE5VTEwpCisJCQkJCWVidF9wcmludF9lcnJvcjIoIlVzZSBvZiAnICcgbm90IGFsbG93ZWQgaW4gY2hhaW4gbmFtZXMiKTsKKwkJCQllYnRfcmVuYW1lX2NoYWluKHJlcGxhY2UsIGFyZ3Zbb3B0aW5kXSk7CisJCQkJb3B0aW5kKys7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKGMgPT0gJ0QnICYmIG9wdGluZCA8IGFyZ2MgJiYgKGFyZ3Zbb3B0aW5kXVswXSAhPSAnLScgfHwgKGFyZ3Zbb3B0aW5kXVsxXSA+PSAnMCcgJiYgYXJndltvcHRpbmRdWzFdIDw9ICc5JykpKSB7CisJCQkJaWYgKG9wdGluZCAhPSBhcmdjIC0gMSkKKwkJCQkJZWJ0X3ByaW50X2Vycm9yMigiTm8gZXh0cmEgb3B0aW9ucyBhbGxvd2VkIHdpdGggLUQgc3RhcnRfbnJbOmVuZF9ucl0iKTsKKwkJCQlpZiAocGFyc2VfcnVsZV9yYW5nZShhcmd2W29wdGluZF0sICZydWxlX25yLCAmcnVsZV9ucl9lbmQpKQorCQkJCQllYnRfcHJpbnRfZXJyb3IyKCJQcm9ibGVtIHdpdGggdGhlIHNwZWNpZmllZCBydWxlIG51bWJlcihzKSAnJXMnIiwgYXJndltvcHRpbmRdKTsKKwkJCQlvcHRpbmQrKzsKKwkJCX0gZWxzZSBpZiAoYyA9PSAnQycpIHsKKwkJCQlpZiAoKGNoY291bnRlciA9IHBhcnNlX2NoYW5nZV9jb3VudGVyc19ydWxlKGFyZ2MsIGFyZ3YsICZydWxlX25yLCAmcnVsZV9ucl9lbmQsIGV4ZWNfc3R5bGUpKSA9PSAtMSkKKwkJCQkJcmV0dXJuIC0xOworCQkJfSBlbHNlIGlmIChjID09ICdJJykgeworCQkJCWlmIChvcHRpbmQgPj0gYXJnYyB8fCAoYXJndltvcHRpbmRdWzBdID09ICctJyAmJiAoYXJndltvcHRpbmRdWzFdIDwgJzAnIHx8IGFyZ3Zbb3B0aW5kXVsxXSA+ICc5JykpKQorCQkJCQlydWxlX25yID0gMTsKKwkJCQllbHNlIHsKKwkJCQkJcnVsZV9uciA9IHN0cnRvbChhcmd2W29wdGluZF0sICZidWZmZXIsIDEwKTsKKwkJCQkJaWYgKCpidWZmZXIgIT0gJ1wwJykKKwkJCQkJCWVidF9wcmludF9lcnJvcjIoIlByb2JsZW0gd2l0aCB0aGUgc3BlY2lmaWVkIHJ1bGUgbnVtYmVyICclcyciLCBhcmd2W29wdGluZF0pOworCQkJCQlvcHRpbmQrKzsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGMgPT0gJ1AnKSB7CitoYW5kbGVfUDoKKwkJCQlpZiAob3B0aW5kID49IGFyZ2MpCisJCQkJCWVidF9wcmludF9lcnJvcjIoIk5vIHBvbGljeSBzcGVjaWZpZWQiKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1NUQU5EQVJEX1RBUkdFVFM7IGkrKykKKwkJCQkJaWYgKCFzdHJjbXAoYXJndltvcHRpbmRdLCBlYnRfc3RhbmRhcmRfdGFyZ2V0c1tpXSkpIHsKKwkJCQkJCXBvbGljeSA9IC1pIC0xOworCQkJCQkJaWYgKHBvbGljeSA9PSBFQlRfQ09OVElOVUUpCisJCQkJCQkJZWJ0X3ByaW50X2Vycm9yMigiV3JvbmcgcG9saWN5ICclcyciLCBhcmd2W29wdGluZF0pOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQlpZiAoaSA9PSBOVU1fU1RBTkRBUkRfVEFSR0VUUykKKwkJCQkJZWJ0X3ByaW50X2Vycm9yMigiVW5rbm93biBwb2xpY3kgJyVzJyIsIGFyZ3Zbb3B0aW5kXSk7CisJCQkJb3B0aW5kKys7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnTCc6IC8qIExpc3QgKi8KKwkJY2FzZSAnRic6IC8qIEZsdXNoICovCisJCWNhc2UgJ1onOiAvKiBaZXJvIGNvdW50ZXJzICovCisJCQlpZiAoYyA9PSAnWicpIHsKKwkJCQlpZiAoKHJlcGxhY2UtPmZsYWdzICYgT1BUX1pFUk8pIHx8IChyZXBsYWNlLT5mbGFncyAmIE9QVF9DT01NQU5EICYmIHJlcGxhY2UtPmNvbW1hbmQgIT0gJ0wnKSkKK3ByaW50X3plcm86CisJCQkJCWVidF9wcmludF9lcnJvcjIoIkNvbW1hbmQgLVogb25seSBhbGxvd2VkIHRvZ2V0aGVyIHdpdGggY29tbWFuZCAtTCIpOworCQkJCXJlcGxhY2UtPmZsYWdzIHw9IE9QVF9aRVJPOworCQkJfSBlbHNlIHsKKwkJCQlpZiAocmVwbGFjZS0+ZmxhZ3MgJiBPUFRfQ09NTUFORCkKKwkJCQkJZWJ0X3ByaW50X2Vycm9yMigiTXVsdGlwbGUgY29tbWFuZHMgYXJlIG5vdCBhbGxvd2VkIik7CisJCQkJcmVwbGFjZS0+Y29tbWFuZCA9IGM7CisJCQkJcmVwbGFjZS0+ZmxhZ3MgfD0gT1BUX0NPTU1BTkQ7CisJCQkJaWYgKHJlcGxhY2UtPmZsYWdzICYgT1BUX1pFUk8gJiYgYyAhPSAnTCcpCisJCQkJCWdvdG8gcHJpbnRfemVybzsKKwkJCX0KKworI2lmZGVmIFNJTEVOVF9EQUVNT04KKwkJCWlmIChjPT0gJ0wnICYmIGV4ZWNfc3R5bGUgPT0gRVhFQ19TVFlMRV9EQUVNT04pCisJCQkJZWJ0X3ByaW50X2Vycm9yMigiLUwgbm90IHN1cHBvcnRlZCBpbiBkYWVtb24gbW9kZSIpOworI2VuZGlmCisKKwkJCWlmICghKHJlcGxhY2UtPmZsYWdzICYgT1BUX0tFUk5FTERBVEEpKQorCQkJCWVidF9nZXRfa2VybmVsX3RhYmxlKHJlcGxhY2UsIDApOworCQkJaSA9IC0xOworCQkJaWYgKG9wdGluZCA8IGFyZ2MgJiYgYXJndltvcHRpbmRdWzBdICE9ICctJykgeworCQkJCWlmICgoaSA9IGVidF9nZXRfY2hhaW5ucihyZXBsYWNlLCBhcmd2W29wdGluZF0pKSA9PSAtMSkKKwkJCQkJZWJ0X3ByaW50X2Vycm9yMigiQ2hhaW4gJyVzJyBkb2Vzbid0IGV4aXN0IiwgYXJndltvcHRpbmRdKTsKKwkJCQlvcHRpbmQrKzsKKwkJCX0KKwkJCWlmIChpICE9IC0xKSB7CisJCQkJaWYgKGMgPT0gJ1onKQorCQkJCQl6ZXJvY2hhaW4gPSBpOworCQkJCWVsc2UKKwkJCQkJcmVwbGFjZS0+c2VsZWN0ZWRfY2hhaW4gPSBpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ1YnOiAvKiBWZXJzaW9uICovCisJCQlpZiAoT1BUX0NPTU1BTkRTKQorCQkJCWVidF9wcmludF9lcnJvcjIoIk11bHRpcGxlIGNvbW1hbmRzIGFyZSBub3QgYWxsb3dlZCIpOworCQkJcmVwbGFjZS0+Y29tbWFuZCA9ICdWJzsKKwkJCWlmIChleGVjX3N0eWxlID09IEVYRUNfU1RZTEVfREFFTU9OKQorCQkJCWVidF9wcmludF9lcnJvcjIoUFJPR05BTUUiIHYiUFJPR1ZFUlNJT04iICgiUFJPR0RBVEUiKVxuIik7CisJCQlQUklOVF9WRVJTSU9OOworCQkJZXhpdCgwKTsKKwkJY2FzZSAnTSc6IC8qIE1vZHByb2JlICovCisJCQlpZiAoT1BUX0NPTU1BTkRTKQorCQkJCWVidF9wcmludF9lcnJvcjIoIlBsZWFzZSBwdXQgdGhlIC1NIG9wdGlvbiBlYXJsaWVyIik7CisJCQlmcmVlKGVidF9tb2Rwcm9iZSk7CisJCQllYnRfbW9kcHJvYmUgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAnaCc6IC8qIEhlbHAgKi8KKyNpZmRlZiBTSUxFTlRfREFFTU9OCisJCQlpZiAoZXhlY19zdHlsZSA9PSBFWEVDX1NUWUxFX0RBRU1PTikKKwkJCQllYnRfcHJpbnRfZXJyb3IyKCItaCBub3Qgc3VwcG9ydGVkIGluIGRhZW1vbiBtb2RlIik7CisjZW5kaWYKKwkJCWlmIChPUFRfQ09NTUFORFMpCisJCQkJZWJ0X3ByaW50X2Vycm9yMigiTXVsdGlwbGUgY29tbWFuZHMgYXJlIG5vdCBhbGxvd2VkIik7CisJCQlyZXBsYWNlLT5jb21tYW5kID0gJ2gnOworCisJCQkvKiBBbGwgb3RoZXIgYXJndW1lbnRzIHNob3VsZCBiZSBleHRlbnNpb24gbmFtZXMgKi8KKwkJCXdoaWxlIChvcHRpbmQgPCBhcmdjKSB7CisJCQkJc3RydWN0IGVidF91X21hdGNoICptOworCQkJCXN0cnVjdCBlYnRfdV93YXRjaGVyICp3OworCisJCQkJaWYgKCFzdHJjYXNlY21wKCJsaXN0X2V4dGVuc2lvbnMiLCBhcmd2W29wdGluZF0pKSB7CisJCQkJCWVidF9saXN0X2V4dGVuc2lvbnMoKTsKKwkJCQkJZXhpdCgwKTsKKwkJCQl9CisJCQkJaWYgKChtID0gZWJ0X2ZpbmRfbWF0Y2goYXJndltvcHRpbmRdKSkpCisJCQkJCWVidF9hZGRfbWF0Y2gobmV3X2VudHJ5LCBtKTsKKwkJCQllbHNlIGlmICgodyA9IGVidF9maW5kX3dhdGNoZXIoYXJndltvcHRpbmRdKSkpCisJCQkJCWVidF9hZGRfd2F0Y2hlcihuZXdfZW50cnksIHcpOworCQkJCWVsc2UgeworCQkJCQlpZiAoISh0ID0gZWJ0X2ZpbmRfdGFyZ2V0KGFyZ3Zbb3B0aW5kXSkpKQorCQkJCQkJZWJ0X3ByaW50X2Vycm9yMigiRXh0ZW5zaW9uICclcycgbm90IGZvdW5kIiwgYXJndltvcHRpbmRdKTsKKwkJCQkJaWYgKHJlcGxhY2UtPmZsYWdzICYgT1BUX0pVTVApCisJCQkJCQllYnRfcHJpbnRfZXJyb3IyKCJTb3JyeSwgeW91IGNhbiBvbmx5IHNlZSBoZWxwIGZvciBvbmUgdGFyZ2V0IGV4dGVuc2lvbiBhdCBhIHRpbWUiKTsKKwkJCQkJcmVwbGFjZS0+ZmxhZ3MgfD0gT1BUX0pVTVA7CisJCQkJCW5ld19lbnRyeS0+dCA9IChzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqKXQ7CisJCQkJfQorCQkJCW9wdGluZCsrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ3QnOiAvKiBUYWJsZSAqLworCQkJaWYgKE9QVF9DT01NQU5EUykKKwkJCQllYnRfcHJpbnRfZXJyb3IyKCJQbGVhc2UgcHV0IHRoZSAtdCBvcHRpb24gZmlyc3QiKTsKKwkJCWVidF9jaGVja19vcHRpb24yKCYocmVwbGFjZS0+ZmxhZ3MpLCBPUFRfVEFCTEUpOworCQkJaWYgKHN0cmxlbihvcHRhcmcpID4gRUJUX1RBQkxFX01BWE5BTUVMRU4gLSAxKQorCQkJCWVidF9wcmludF9lcnJvcjIoIlRhYmxlIG5hbWUgbGVuZ3RoIGNhbm5vdCBleGNlZWQgJWQgY2hhcmFjdGVycyIsIEVCVF9UQUJMRV9NQVhOQU1FTEVOIC0gMSk7CisJCQlzdHJjcHkocmVwbGFjZS0+bmFtZSwgb3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdpJzogLyogSW5wdXQgaW50ZXJmYWNlICovCisJCWNhc2UgMiAgOiAvKiBMb2dpY2FsIGlucHV0IGludGVyZmFjZSAqLworCQljYXNlICdvJzogLyogT3V0cHV0IGludGVyZmFjZSAqLworCQljYXNlIDMgIDogLyogTG9naWNhbCBvdXRwdXQgaW50ZXJmYWNlICovCisJCWNhc2UgJ2onOiAvKiBUYXJnZXQgKi8KKwkJY2FzZSAncCc6IC8qIE5ldCBmYW1pbHkgcHJvdG9jb2wgKi8KKwkJY2FzZSAncyc6IC8qIFNvdXJjZSBtYWMgKi8KKwkJY2FzZSAnZCc6IC8qIERlc3RpbmF0aW9uIG1hYyAqLworCQljYXNlICdjJzogLyogU2V0IGNvdW50ZXJzICovCisJCQlpZiAoIU9QVF9DT01NQU5EUykKKwkJCQllYnRfcHJpbnRfZXJyb3IyKCJObyBjb21tYW5kIHNwZWNpZmllZCIpOworCQkJaWYgKHJlcGxhY2UtPmNvbW1hbmQgIT0gJ0EnICYmIHJlcGxhY2UtPmNvbW1hbmQgIT0gJ0QnICYmIHJlcGxhY2UtPmNvbW1hbmQgIT0gJ0knICYmIHJlcGxhY2UtPmNvbW1hbmQgIT0gJ0MnKQorCQkJCWVidF9wcmludF9lcnJvcjIoIkNvbW1hbmQgYW5kIG9wdGlvbiBkbyBub3QgbWF0Y2giKTsKKwkJCWlmIChjID09ICdpJykgeworCQkJCWVidF9jaGVja19vcHRpb24yKCYocmVwbGFjZS0+ZmxhZ3MpLCBPUFRfSU4pOworCQkJCWlmIChyZXBsYWNlLT5zZWxlY3RlZF9jaGFpbiA+IDIgJiYgcmVwbGFjZS0+c2VsZWN0ZWRfY2hhaW4gPCBORl9CUl9CUk9VVElORykKKwkJCQkJZWJ0X3ByaW50X2Vycm9yMigiVXNlIC1pIG9ubHkgaW4gSU5QVVQsIEZPUldBUkQsIFBSRVJPVVRJTkcgYW5kIEJST1VUSU5HIGNoYWlucyIpOworCQkJCWlmIChlYnRfY2hlY2tfaW52ZXJzZTIob3B0YXJnKSkKKwkJCQkJbmV3X2VudHJ5LT5pbnZmbGFncyB8PSBFQlRfSUlOOworCisJCQkJaWYgKHN0cmxlbihvcHRhcmcpID49IElGTkFNU0laKQorYmlnX2lmYWNlX2xlbmd0aDoKKwkJCQkJZWJ0X3ByaW50X2Vycm9yMigiSW50ZXJmYWNlIG5hbWUgbGVuZ3RoIGNhbm5vdCBleGNlZWQgJWQgY2hhcmFjdGVycyIsIElGTkFNU0laIC0gMSk7CisJCQkJc3RyY3B5KG5ld19lbnRyeS0+aW4sIG9wdGFyZyk7CisJCQkJaWYgKHBhcnNlX2lmYWNlKG5ld19lbnRyeS0+aW4sICItaSIpKQorCQkJCQlyZXR1cm4gLTE7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKGMgPT0gMikgeworCQkJCWVidF9jaGVja19vcHRpb24yKCYocmVwbGFjZS0+ZmxhZ3MpLCBPUFRfTE9HSUNBTElOKTsKKwkJCQlpZiAocmVwbGFjZS0+c2VsZWN0ZWRfY2hhaW4gPiAyICYmIHJlcGxhY2UtPnNlbGVjdGVkX2NoYWluIDwgTkZfQlJfQlJPVVRJTkcpCisJCQkJCWVidF9wcmludF9lcnJvcjIoIlVzZSAtLWxvZ2ljYWwtaW4gb25seSBpbiBJTlBVVCwgRk9SV0FSRCwgUFJFUk9VVElORyBhbmQgQlJPVVRJTkcgY2hhaW5zIik7CisJCQkJaWYgKGVidF9jaGVja19pbnZlcnNlMihvcHRhcmcpKQorCQkJCQluZXdfZW50cnktPmludmZsYWdzIHw9IEVCVF9JTE9HSUNBTElOOworCisJCQkJaWYgKHN0cmxlbihvcHRhcmcpID49IElGTkFNU0laKQorCQkJCQlnb3RvIGJpZ19pZmFjZV9sZW5ndGg7CisJCQkJc3RyY3B5KG5ld19lbnRyeS0+bG9naWNhbF9pbiwgb3B0YXJnKTsKKwkJCQlpZiAocGFyc2VfaWZhY2UobmV3X2VudHJ5LT5sb2dpY2FsX2luLCAiLS1sb2dpY2FsLWluIikpCisJCQkJCXJldHVybiAtMTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoYyA9PSAnbycpIHsKKwkJCQllYnRfY2hlY2tfb3B0aW9uMigmKHJlcGxhY2UtPmZsYWdzKSwgT1BUX09VVCk7CisJCQkJaWYgKHJlcGxhY2UtPnNlbGVjdGVkX2NoYWluIDwgMiB8fCByZXBsYWNlLT5zZWxlY3RlZF9jaGFpbiA9PSBORl9CUl9CUk9VVElORykKKwkJCQkJZWJ0X3ByaW50X2Vycm9yMigiVXNlIC1vIG9ubHkgaW4gT1VUUFVULCBGT1JXQVJEIGFuZCBQT1NUUk9VVElORyBjaGFpbnMiKTsKKwkJCQlpZiAoZWJ0X2NoZWNrX2ludmVyc2UyKG9wdGFyZykpCisJCQkJCW5ld19lbnRyeS0+aW52ZmxhZ3MgfD0gRUJUX0lPVVQ7CisKKwkJCQlpZiAoc3RybGVuKG9wdGFyZykgPj0gSUZOQU1TSVopCisJCQkJCWdvdG8gYmlnX2lmYWNlX2xlbmd0aDsKKwkJCQlzdHJjcHkobmV3X2VudHJ5LT5vdXQsIG9wdGFyZyk7CisJCQkJaWYgKHBhcnNlX2lmYWNlKG5ld19lbnRyeS0+b3V0LCAiLW8iKSkKKwkJCQkJcmV0dXJuIC0xOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChjID09IDMpIHsKKwkJCQllYnRfY2hlY2tfb3B0aW9uMigmKHJlcGxhY2UtPmZsYWdzKSwgT1BUX0xPR0lDQUxPVVQpOworCQkJCWlmIChyZXBsYWNlLT5zZWxlY3RlZF9jaGFpbiA8IDIgfHwgcmVwbGFjZS0+c2VsZWN0ZWRfY2hhaW4gPT0gTkZfQlJfQlJPVVRJTkcpCisJCQkJCWVidF9wcmludF9lcnJvcjIoIlVzZSAtLWxvZ2ljYWwtb3V0IG9ubHkgaW4gT1VUUFVULCBGT1JXQVJEIGFuZCBQT1NUUk9VVElORyBjaGFpbnMiKTsKKwkJCQlpZiAoZWJ0X2NoZWNrX2ludmVyc2UyKG9wdGFyZykpCisJCQkJCW5ld19lbnRyeS0+aW52ZmxhZ3MgfD0gRUJUX0lMT0dJQ0FMT1VUOworCisJCQkJaWYgKHN0cmxlbihvcHRhcmcpID49IElGTkFNU0laKQorCQkJCQlnb3RvIGJpZ19pZmFjZV9sZW5ndGg7CisJCQkJc3RyY3B5KG5ld19lbnRyeS0+bG9naWNhbF9vdXQsIG9wdGFyZyk7CisJCQkJaWYgKHBhcnNlX2lmYWNlKG5ld19lbnRyeS0+bG9naWNhbF9vdXQsICItLWxvZ2ljYWwtb3V0IikpCisJCQkJCXJldHVybiAtMTsgICAgCisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKGMgPT0gJ2onKSB7CisJCQkJZWJ0X2NoZWNrX29wdGlvbjIoJihyZXBsYWNlLT5mbGFncyksIE9QVF9KVU1QKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1NUQU5EQVJEX1RBUkdFVFM7IGkrKykKKwkJCQkJaWYgKCFzdHJjbXAob3B0YXJnLCBlYnRfc3RhbmRhcmRfdGFyZ2V0c1tpXSkpIHsKKwkJCQkJCXQgPSBlYnRfZmluZF90YXJnZXQoRUJUX1NUQU5EQVJEX1RBUkdFVCk7CisJCQkJCQkoKHN0cnVjdCBlYnRfc3RhbmRhcmRfdGFyZ2V0ICopIHQtPnQpLT52ZXJkaWN0ID0gLWkgLSAxOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQlpZiAoLWkgLSAxID09IEVCVF9SRVRVUk4gJiYgcmVwbGFjZS0+c2VsZWN0ZWRfY2hhaW4gPCBORl9CUl9OVU1IT09LUykgeworCQkJCQllYnRfcHJpbnRfZXJyb3IyKCJSZXR1cm4gdGFyZ2V0IG9ubHkgZm9yIHVzZXIgZGVmaW5lZCBjaGFpbnMiKTsKKwkJCQl9IGVsc2UgaWYgKGkgIT0gTlVNX1NUQU5EQVJEX1RBUkdFVFMpCisJCQkJCWJyZWFrOworCisJCQkJaWYgKChpID0gZWJ0X2dldF9jaGFpbm5yKHJlcGxhY2UsIG9wdGFyZykpICE9IC0xKSB7CisJCQkJCWlmIChpIDwgTkZfQlJfTlVNSE9PS1MpCisJCQkJCQllYnRfcHJpbnRfZXJyb3IyKCJEb24ndCBqdW1wIHRvIGEgc3RhbmRhcmQgY2hhaW4iKTsKKwkJCQkJdCA9IGVidF9maW5kX3RhcmdldChFQlRfU1RBTkRBUkRfVEFSR0VUKTsKKwkJCQkJKChzdHJ1Y3QgZWJ0X3N0YW5kYXJkX3RhcmdldCAqKSB0LT50KS0+dmVyZGljdCA9IGkgLSBORl9CUl9OVU1IT09LUzsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogTXVzdCBiZSBhbiBleHRlbnNpb24gdGhlbiAqLworCQkJCQlzdHJ1Y3QgZWJ0X3VfdGFyZ2V0ICp0OworCisJCQkJCXQgPSBlYnRfZmluZF90YXJnZXQob3B0YXJnKTsKKwkJCQkJLyogLWogc3RhbmRhcmQgbm90IGFsbG93ZWQgZWl0aGVyICovCisJCQkJCWlmICghdCB8fCB0ID09IChzdHJ1Y3QgZWJ0X3VfdGFyZ2V0ICopbmV3X2VudHJ5LT50KQorCQkJCQkJZWJ0X3ByaW50X2Vycm9yMigiSWxsZWdhbCB0YXJnZXQgbmFtZSAnJXMnIiwgb3B0YXJnKTsKKwkJCQkJbmV3X2VudHJ5LT50ID0gKHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICopdDsKKwkJCQkJZWJ0X2ZpbmRfdGFyZ2V0KEVCVF9TVEFOREFSRF9UQVJHRVQpLT51c2VkID0gMDsKKwkJCQkJdC0+dXNlZCA9IDE7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChjID09ICdzJykgeworCQkJCWVidF9jaGVja19vcHRpb24yKCYocmVwbGFjZS0+ZmxhZ3MpLCBPUFRfU09VUkNFKTsKKwkJCQlpZiAoZWJ0X2NoZWNrX2ludmVyc2UyKG9wdGFyZykpCisJCQkJCW5ld19lbnRyeS0+aW52ZmxhZ3MgfD0gRUJUX0lTT1VSQ0U7CisKKwkJCQlpZiAoZWJ0X2dldF9tYWNfYW5kX21hc2sob3B0YXJnLCBuZXdfZW50cnktPnNvdXJjZW1hYywgbmV3X2VudHJ5LT5zb3VyY2Vtc2spKQorCQkJCQllYnRfcHJpbnRfZXJyb3IyKCJQcm9ibGVtIHdpdGggc3BlY2lmaWVkIHNvdXJjZSBtYWMgJyVzJyIsIG9wdGFyZyk7CisJCQkJbmV3X2VudHJ5LT5iaXRtYXNrIHw9IEVCVF9TT1VSQ0VNQUM7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKGMgPT0gJ2QnKSB7CisJCQkJZWJ0X2NoZWNrX29wdGlvbjIoJihyZXBsYWNlLT5mbGFncyksIE9QVF9ERVNUKTsKKwkJCQlpZiAoZWJ0X2NoZWNrX2ludmVyc2UyKG9wdGFyZykpCisJCQkJCW5ld19lbnRyeS0+aW52ZmxhZ3MgfD0gRUJUX0lERVNUOworCisJCQkJaWYgKGVidF9nZXRfbWFjX2FuZF9tYXNrKG9wdGFyZywgbmV3X2VudHJ5LT5kZXN0bWFjLCBuZXdfZW50cnktPmRlc3Rtc2spKQorCQkJCQllYnRfcHJpbnRfZXJyb3IyKCJQcm9ibGVtIHdpdGggc3BlY2lmaWVkIGRlc3RpbmF0aW9uIG1hYyAnJXMnIiwgb3B0YXJnKTsKKwkJCQluZXdfZW50cnktPmJpdG1hc2sgfD0gRUJUX0RFU1RNQUM7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKGMgPT0gJ2MnKSB7CisJCQkJZWJ0X2NoZWNrX29wdGlvbjIoJihyZXBsYWNlLT5mbGFncyksIE9QVF9DT1VOVCk7CisJCQkJaWYgKGVidF9jaGVja19pbnZlcnNlMihvcHRhcmcpKQorCQkJCQllYnRfcHJpbnRfZXJyb3IyKCJVbmV4cGVjdGVkICchJyBhZnRlciAtYyIpOworCQkJCWlmIChvcHRpbmQgPj0gYXJnYyB8fCBvcHRhcmdbMF0gPT0gJy0nIHx8IGFyZ3Zbb3B0aW5kXVswXSA9PSAnLScpCisJCQkJCWVidF9wcmludF9lcnJvcjIoIk9wdGlvbiAtYyBuZWVkcyAyIGFyZ3VtZW50cyIpOworCisJCQkJbmV3X2VudHJ5LT5jbnQucGNudCA9IHN0cnRvdWxsKG9wdGFyZywgJmJ1ZmZlciwgMTApOworCQkJCWlmICgqYnVmZmVyICE9ICdcMCcpCisJCQkJCWVidF9wcmludF9lcnJvcjIoIlBhY2tldCBjb3VudGVyICclcycgaW52YWxpZCIsIG9wdGFyZyk7CisJCQkJbmV3X2VudHJ5LT5jbnQuYmNudCA9IHN0cnRvdWxsKGFyZ3Zbb3B0aW5kXSwgJmJ1ZmZlciwgMTApOworCQkJCWlmICgqYnVmZmVyICE9ICdcMCcpCisJCQkJCWVidF9wcmludF9lcnJvcjIoIlBhY2tldCBjb3VudGVyICclcycgaW52YWxpZCIsIGFyZ3Zbb3B0aW5kXSk7CisJCQkJb3B0aW5kKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQllYnRfY2hlY2tfb3B0aW9uMigmKHJlcGxhY2UtPmZsYWdzKSwgT1BUX1BST1RPQ09MKTsKKwkJCWlmIChlYnRfY2hlY2tfaW52ZXJzZTIob3B0YXJnKSkKKwkJCQluZXdfZW50cnktPmludmZsYWdzIHw9IEVCVF9JUFJPVE87CisKKwkJCW5ld19lbnRyeS0+Yml0bWFzayAmPSB+KCh1bnNpZ25lZCBpbnQpRUJUX05PUFJPVE8pOworCQkJaSA9IHN0cnRvbChvcHRhcmcsICZidWZmZXIsIDE2KTsKKwkJCWlmICgqYnVmZmVyID09ICdcMCcgJiYgKGkgPCAwIHx8IGkgPiAweEZGRkYpKQorCQkJCWVidF9wcmludF9lcnJvcjIoIlByb2JsZW0gd2l0aCB0aGUgc3BlY2lmaWVkIHByb3RvY29sIik7CisJCQlpZiAoKmJ1ZmZlciAhPSAnXDAnKSB7CisJCQkJc3RydWN0IGV0aGVydHlwZWVudCAqZW50OworCisJCQkJaWYgKCFzdHJjYXNlY21wKG9wdGFyZywgIkxFTkdUSCIpKSB7CisJCQkJCW5ld19lbnRyeS0+Yml0bWFzayB8PSBFQlRfODAyXzM7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbnQgPSBnZXRldGhlcnR5cGVieW5hbWUob3B0YXJnKTsKKwkJCQlpZiAoIWVudCkKKwkJCQkJZWJ0X3ByaW50X2Vycm9yMigiUHJvYmxlbSB3aXRoIHRoZSBzcGVjaWZpZWQgRXRoZXJuZXQgcHJvdG9jb2wgJyVzJywgcGVyaGFwcyAiX1BBVEhfRVRIRVJUWVBFUyAiIGlzIG1pc3NpbmciLCBvcHRhcmcpOworCQkJCW5ld19lbnRyeS0+ZXRocHJvdG8gPSBlbnQtPmVfZXRoZXJ0eXBlOworCQkJfSBlbHNlCisJCQkJbmV3X2VudHJ5LT5ldGhwcm90byA9IGk7CisKKwkJCWlmIChuZXdfZW50cnktPmV0aHByb3RvIDwgMHgwNjAwKQorCQkJCWVidF9wcmludF9lcnJvcjIoIlNvcnJ5LCBwcm90b2NvbHMgaGF2ZSB2YWx1ZXMgYWJvdmUgb3IgZXF1YWwgdG8gMHgwNjAwIik7CisJCQlicmVhazsKKwkJY2FzZSA0ICA6IC8qIExjICovCisjaWZkZWYgU0lMRU5UX0RBRU1PTgorCQkJaWYgKGV4ZWNfc3R5bGUgPT0gRVhFQ19TVFlMRV9EQUVNT04pCisJCQkJZWJ0X3ByaW50X2Vycm9yMigiLS1MYyBpcyBub3Qgc3VwcG9ydGVkIGluIGRhZW1vbiBtb2RlIik7CisjZW5kaWYKKwkJCWVidF9jaGVja19vcHRpb24yKCYocmVwbGFjZS0+ZmxhZ3MpLCBMSVNUX0MpOworCQkJaWYgKHJlcGxhY2UtPmNvbW1hbmQgIT0gJ0wnKQorCQkJCWVidF9wcmludF9lcnJvcigiVXNlIC0tTGMgd2l0aCAtTCIpOworCQkJcmVwbGFjZS0+ZmxhZ3MgfD0gTElTVF9DOworCQkJYnJlYWs7CisJCWNhc2UgNSAgOiAvKiBMbiAqLworI2lmZGVmIFNJTEVOVF9EQUVNT04KKwkJCWlmIChleGVjX3N0eWxlID09IEVYRUNfU1RZTEVfREFFTU9OKQorCQkJCWVidF9wcmludF9lcnJvcjIoIi0tTG4gaXMgbm90IHN1cHBvcnRlZCBpbiBkYWVtb24gbW9kZSIpOworI2VuZGlmCisJCQllYnRfY2hlY2tfb3B0aW9uMigmKHJlcGxhY2UtPmZsYWdzKSwgTElTVF9OKTsKKwkJCWlmIChyZXBsYWNlLT5jb21tYW5kICE9ICdMJykKKwkJCQllYnRfcHJpbnRfZXJyb3IyKCJVc2UgLS1MbiB3aXRoIC1MIik7CisJCQlpZiAocmVwbGFjZS0+ZmxhZ3MgJiBMSVNUX1gpCisJCQkJZWJ0X3ByaW50X2Vycm9yMigiLS1MeCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIC0tTG4iKTsKKwkJCXJlcGxhY2UtPmZsYWdzIHw9IExJU1RfTjsKKwkJCWJyZWFrOworCQljYXNlIDYgIDogLyogTHggKi8KKyNpZmRlZiBTSUxFTlRfREFFTU9OCisJCQlpZiAoZXhlY19zdHlsZSA9PSBFWEVDX1NUWUxFX0RBRU1PTikKKwkJCQllYnRfcHJpbnRfZXJyb3IyKCItLUx4IGlzIG5vdCBzdXBwb3J0ZWQgaW4gZGFlbW9uIG1vZGUiKTsKKyNlbmRpZgorCQkJZWJ0X2NoZWNrX29wdGlvbjIoJihyZXBsYWNlLT5mbGFncyksIExJU1RfWCk7CisJCQlpZiAocmVwbGFjZS0+Y29tbWFuZCAhPSAnTCcpCisJCQkJZWJ0X3ByaW50X2Vycm9yMigiVXNlIC0tTHggd2l0aCAtTCIpOworCQkJaWYgKHJlcGxhY2UtPmZsYWdzICYgTElTVF9OKQorCQkJCWVidF9wcmludF9lcnJvcjIoIi0tTHggaXMgbm90IGNvbXBhdGlibGUgd2l0aCAtLUxuIik7CisJCQlyZXBsYWNlLT5mbGFncyB8PSBMSVNUX1g7CisJCQlicmVhazsKKwkJY2FzZSAxMiA6IC8qIExtYWMyICovCisjaWZkZWYgU0lMRU5UX0RBRU1PTgorCQkJaWYgKGV4ZWNfc3R5bGUgPT0gRVhFQ19TVFlMRV9EQUVNT04pCisJCQkJZWJ0X3ByaW50X2Vycm9yKCItLUxtYWMyIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZGFlbW9uIG1vZGUiKTsKKyNlbmRpZgorCQkJZWJ0X2NoZWNrX29wdGlvbjIoJihyZXBsYWNlLT5mbGFncyksIExJU1RfTUFDMik7CisJCQlpZiAocmVwbGFjZS0+Y29tbWFuZCAhPSAnTCcpCisJCQkJZWJ0X3ByaW50X2Vycm9yMigiVXNlIC0tTG1hYzIgd2l0aCAtTCIpOworCQkJcmVwbGFjZS0+ZmxhZ3MgfD0gTElTVF9NQUMyOworCQkJYnJlYWs7CisJCWNhc2UgOCA6IC8qIGF0b21pYy1jb21taXQgKi8KKwkJCWlmIChleGVjX3N0eWxlID09IEVYRUNfU1RZTEVfREFFTU9OKQorCQkJCWVidF9wcmludF9lcnJvcjIoIi0tYXRvbWljLWNvbW1pdCBpcyBub3Qgc3VwcG9ydGVkIGluIGRhZW1vbiBtb2RlIik7CisJCQlyZXBsYWNlLT5jb21tYW5kID0gYzsKKwkJCWlmIChPUFRfQ09NTUFORFMpCisJCQkJZWJ0X3ByaW50X2Vycm9yMigiTXVsdGlwbGUgY29tbWFuZHMgYXJlIG5vdCBhbGxvd2VkIik7CisJCQlyZXBsYWNlLT5mbGFncyB8PSBPUFRfQ09NTUFORDsKKwkJCWlmICghcmVwbGFjZS0+ZmlsZW5hbWUpCisJCQkJZWJ0X3ByaW50X2Vycm9yMigiTm8gYXRvbWljIGZpbGUgc3BlY2lmaWVkIik7CisJCQkvKiBHZXQgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIGZpbGUgKi8KKwkJCWVidF9nZXRfdGFibGUocmVwbGFjZSwgMCk7CisJCQkvKiBXZSBkb24ndCB3YW50IHRoZSBrZXJuZWwgZ2l2aW5nIHVzIGl0cyBjb3VudGVycywKKwkJCSAqIHRoZXkgd291bGQgb3ZlcndyaXRlIHRoZSBjb3VudGVycyBleHRyYWN0ZWQgZnJvbQorCQkJICogdGhlIGZpbGUgKi8KKwkJCXJlcGxhY2UtPm51bV9jb3VudGVycyA9IDA7CisJCQkvKiBNYWtlIHN1cmUgdGhlIHRhYmxlIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUga2VybmVsICovCisJCQlmcmVlKHJlcGxhY2UtPmZpbGVuYW1lKTsKKwkJCXJlcGxhY2UtPmZpbGVuYW1lID0gTlVMTDsKKwkJCWJyZWFrOworCQljYXNlIDcgOiAvKiBhdG9taWMtaW5pdCAqLworCQljYXNlIDEwOiAvKiBhdG9taWMtc2F2ZSAqLworCQljYXNlIDExOiAvKiBpbml0LXRhYmxlICovCisJCQlpZiAoZXhlY19zdHlsZSA9PSBFWEVDX1NUWUxFX0RBRU1PTikgeworCQkJCWlmIChjID09IDcpIHsKKwkJCQkJZWJ0X3ByaW50X2Vycm9yMigiLS1hdG9taWMtaW5pdCBpcyBub3Qgc3VwcG9ydGVkIGluIGRhZW1vbiBtb2RlIik7CisJCQkJfSBlbHNlIGlmIChjID09IDEwKQorCQkJCQllYnRfcHJpbnRfZXJyb3IyKCItLWF0b21pYy1zYXZlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZGFlbW9uIG1vZGUiKTsKKwkJCQllYnRfcHJpbnRfZXJyb3IyKCItLWluaXQtdGFibGUgaXMgbm90IHN1cHBvcnRlZCBpbiBkYWVtb24gbW9kZSIpOworCQkJfQorCQkJcmVwbGFjZS0+Y29tbWFuZCA9IGM7CisJCQlpZiAoT1BUX0NPTU1BTkRTKQorCQkJCWVidF9wcmludF9lcnJvcjIoIk11bHRpcGxlIGNvbW1hbmRzIGFyZSBub3QgYWxsb3dlZCIpOworCQkJaWYgKGMgIT0gMTEgJiYgIXJlcGxhY2UtPmZpbGVuYW1lKQorCQkJCWVidF9wcmludF9lcnJvcjIoIk5vIGF0b21pYyBmaWxlIHNwZWNpZmllZCIpOworCQkJcmVwbGFjZS0+ZmxhZ3MgfD0gT1BUX0NPTU1BTkQ7CisJCQl7CisJCQkJY2hhciAqdG1wID0gcmVwbGFjZS0+ZmlsZW5hbWU7CisKKwkJCQkvKiBHZXQgdGhlIGtlcm5lbCB0YWJsZSAqLworCQkJCXJlcGxhY2UtPmZpbGVuYW1lID0gTlVMTDsKKwkJCQllYnRfZ2V0X2tlcm5lbF90YWJsZShyZXBsYWNlLCBjID09IDEwID8gMCA6IDEpOworCQkJCXJlcGxhY2UtPmZpbGVuYW1lID0gdG1wOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgOSA6IC8qIGF0b21pYyAqLworCQkJaWYgKGV4ZWNfc3R5bGUgPT0gRVhFQ19TVFlMRV9EQUVNT04pCisJCQkJZWJ0X3ByaW50X2Vycm9yMigiLS1hdG9taWMgaXMgbm90IHN1cHBvcnRlZCBpbiBkYWVtb24gbW9kZSIpOworCQkJaWYgKE9QVF9DT01NQU5EUykKKwkJCQllYnRfcHJpbnRfZXJyb3IyKCItLWF0b21pYyBoYXMgdG8gY29tZSBiZWZvcmUgdGhlIGNvbW1hbmQiKTsKKwkJCS8qIEEgcG9zc2libGUgbWVtb3J5IGxlYWsgaGVyZSwgYnV0IHRoaXMgaXMgbm90CisJCQkgKiBleGVjdXRlZCBpbiBkYWVtb24gbW9kZSAqLworCQkJcmVwbGFjZS0+ZmlsZW5hbWUgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4ob3B0YXJnKSArIDEpOworCQkJc3RyY3B5KHJlcGxhY2UtPmZpbGVuYW1lLCBvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgMTMgOiAvKiBjb25jdXJyZW50ICovCisJCQlpZiAoT1BUX0NPTU1BTkRTKQorCQkJCWVidF9wcmludF9lcnJvcjIoIlBsZWFzZSBwdXQgdGhlIC0tY29uY3VycmVudCBvcHRpb24gZmlyc3QiKTsKKwkJCXVzZV9sb2NrZmQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgMSA6CisJCQlpZiAoIXN0cmNtcChvcHRhcmcsICIhIikpCisJCQkJZWJ0X2NoZWNrX2ludmVyc2UyKG9wdGFyZyk7CisJCQllbHNlCisJCQkJZWJ0X3ByaW50X2Vycm9yMigiQmFkIGFyZ3VtZW50IDogJyVzJyIsIG9wdGFyZyk7CisJCQkvKiBlYnRfY2hlY2tfaW52ZXJzZSgpIGRpZCBvcHRpbmQrKyAqLworCQkJb3B0aW5kLS07CisJCQljb250aW51ZTsKKwkJZGVmYXVsdDoKKwkJCS8qIElzIGl0IGEgdGFyZ2V0IG9wdGlvbj8gKi8KKwkJCXQgPSAoc3RydWN0IGVidF91X3RhcmdldCAqKW5ld19lbnRyeS0+dDsKKwkJCWlmICgodC0+cGFyc2UoYyAtIHQtPm9wdGlvbl9vZmZzZXQsIGFyZ3YsIGFyZ2MsIG5ld19lbnRyeSwgJnQtPmZsYWdzLCAmdC0+dCkpKSB7CisJCQkJaWYgKGVidF9lcnJvcm1zZ1swXSAhPSAnXDAnKQorCQkJCQlyZXR1cm4gLTE7CisJCQkJZ290byBjaGVja19leHRlbnNpb247CisJCQl9CisKKwkJCS8qIElzIGl0IGEgbWF0Y2hfb3B0aW9uPyAqLworCQkJZm9yIChtID0gZWJ0X21hdGNoZXM7IG07IG0gPSBtLT5uZXh0KQorCQkJCWlmIChtLT5wYXJzZShjIC0gbS0+b3B0aW9uX29mZnNldCwgYXJndiwgYXJnYywgbmV3X2VudHJ5LCAmbS0+ZmxhZ3MsICZtLT5tKSkKKwkJCQkJYnJlYWs7CisKKwkJCWlmIChtICE9IE5VTEwpIHsKKwkJCQlpZiAoZWJ0X2Vycm9ybXNnWzBdICE9ICdcMCcpCisJCQkJCXJldHVybiAtMTsKKwkJCQlpZiAobS0+dXNlZCA9PSAwKSB7CisJCQkJCWVidF9hZGRfbWF0Y2gobmV3X2VudHJ5LCBtKTsKKwkJCQkJbS0+dXNlZCA9IDE7CisJCQkJfQorCQkJCWdvdG8gY2hlY2tfZXh0ZW5zaW9uOworCQkJfQorCisJCQkvKiBJcyBpdCBhIHdhdGNoZXIgb3B0aW9uPyAqLworCQkJZm9yICh3ID0gZWJ0X3dhdGNoZXJzOyB3OyB3ID0gdy0+bmV4dCkKKwkJCQlpZiAody0+cGFyc2UoYyAtIHctPm9wdGlvbl9vZmZzZXQsIGFyZ3YsIGFyZ2MsIG5ld19lbnRyeSwgJnctPmZsYWdzLCAmdy0+dykpCisJCQkJCWJyZWFrOworCisJCQlpZiAodyA9PSBOVUxMICYmIGMgPT0gJz8nKQorCQkJCWVidF9wcmludF9lcnJvcjIoIlVua25vd24gYXJndW1lbnQ6ICclcyciLCBhcmd2W29wdGluZCAtIDFdLCAoY2hhcilvcHRvcHQsIChjaGFyKWMpOworCQkJZWxzZSBpZiAodyA9PSBOVUxMKSB7CisJCQkJaWYgKCFzdHJjbXAodC0+bmFtZSwgInN0YW5kYXJkIikpCisJCQkJCWVidF9wcmludF9lcnJvcjIoIlVua25vd24gYXJndW1lbnQ6IGRvbid0IGZvcmdldCB0aGUgLXQgb3B0aW9uIik7CisJCQkJZWxzZQorCQkJCQllYnRfcHJpbnRfZXJyb3IyKCJUYXJnZXQtc3BlY2lmaWMgb3B0aW9uIGRvZXMgbm90IGNvcnJlc3BvbmQgd2l0aCBzcGVjaWZpZWQgdGFyZ2V0Iik7CisJCQl9CisJCQlpZiAoZWJ0X2Vycm9ybXNnWzBdICE9ICdcMCcpCisJCQkJcmV0dXJuIC0xOworCQkJaWYgKHctPnVzZWQgPT0gMCkgeworCQkJCWVidF9hZGRfd2F0Y2hlcihuZXdfZW50cnksIHcpOworCQkJCXctPnVzZWQgPSAxOworCQkJfQorY2hlY2tfZXh0ZW5zaW9uOgorCQkJaWYgKHJlcGxhY2UtPmNvbW1hbmQgIT0gJ0EnICYmIHJlcGxhY2UtPmNvbW1hbmQgIT0gJ0knICYmCisJCQkgICAgcmVwbGFjZS0+Y29tbWFuZCAhPSAnRCcgJiYgcmVwbGFjZS0+Y29tbWFuZCAhPSAnQycpCisJCQkJZWJ0X3ByaW50X2Vycm9yMigiRXh0ZW5zaW9ucyBvbmx5IGZvciAtQSwgLUksIC1EIGFuZCAtQyIpOworCQl9CisJCWVidF9pbnZlcnQgPSAwOworCX0KKworCS8qIEp1c3QgaW4gY2FzZSB3ZSBkaWRuJ3QgY2F0Y2ggYW4gZXJyb3IgKi8KKwlpZiAoZWJ0X2Vycm9ybXNnWzBdICE9ICdcMCcpCisJCXJldHVybiAtMTsKKworCWlmICghKHRhYmxlID0gZWJ0X2ZpbmRfdGFibGUocmVwbGFjZS0+bmFtZSkpKQorCQllYnRfcHJpbnRfZXJyb3IyKCJCYWQgdGFibGUgbmFtZSIpOworCisJaWYgKHJlcGxhY2UtPmNvbW1hbmQgPT0gJ2gnICYmICEocmVwbGFjZS0+ZmxhZ3MgJiBPUFRfWkVSTykpIHsKKwkJcHJpbnRfaGVscCgpOworCQlpZiAoZXhlY19zdHlsZSA9PSBFWEVDX1NUWUxFX1BSRykKKwkJCWV4aXQoMCk7CisJfQorCisJLyogRG8gdGhlIGZpbmFsIGNoZWNrcyAqLworCWlmIChyZXBsYWNlLT5jb21tYW5kID09ICdBJyB8fCByZXBsYWNlLT5jb21tYW5kID09ICdJJyB8fAorCSAgIHJlcGxhY2UtPmNvbW1hbmQgPT0gJ0QnIHx8IHJlcGxhY2UtPmNvbW1hbmQgPT0gJ0MnKSB7CisJCS8qIFRoaXMgd2lsbCBwdXQgdGhlIGhvb2tfbWFzayByaWdodCBmb3IgdGhlIGNoYWlucyAqLworCQllYnRfY2hlY2tfZm9yX2xvb3BzKHJlcGxhY2UpOworCQlpZiAoZWJ0X2Vycm9ybXNnWzBdICE9ICdcMCcpCisJCQlyZXR1cm4gLTE7CisJCWVudHJpZXMgPSBlYnRfdG9fY2hhaW4ocmVwbGFjZSk7CisJCW1fbCA9IG5ld19lbnRyeS0+bV9saXN0OworCQl3X2wgPSBuZXdfZW50cnktPndfbGlzdDsKKwkJdCA9IChzdHJ1Y3QgZWJ0X3VfdGFyZ2V0ICopbmV3X2VudHJ5LT50OworCQl3aGlsZSAobV9sKSB7CisJCQltID0gKHN0cnVjdCBlYnRfdV9tYXRjaCAqKShtX2wtPm0pOworCQkJbS0+ZmluYWxfY2hlY2sobmV3X2VudHJ5LCBtLT5tLCByZXBsYWNlLT5uYW1lLAorCQkJICAgZW50cmllcy0+aG9va19tYXNrLCAwKTsKKwkJCWlmIChlYnRfZXJyb3Jtc2dbMF0gIT0gJ1wwJykKKwkJCQlyZXR1cm4gLTE7CisJCQltX2wgPSBtX2wtPm5leHQ7CisJCX0KKwkJd2hpbGUgKHdfbCkgeworCQkJdyA9IChzdHJ1Y3QgZWJ0X3Vfd2F0Y2hlciAqKSh3X2wtPncpOworCQkJdy0+ZmluYWxfY2hlY2sobmV3X2VudHJ5LCB3LT53LCByZXBsYWNlLT5uYW1lLAorCQkJICAgZW50cmllcy0+aG9va19tYXNrLCAwKTsKKwkJCWlmIChlYnRfZXJyb3Jtc2dbMF0gIT0gJ1wwJykKKwkJCQlyZXR1cm4gLTE7CisJCQl3X2wgPSB3X2wtPm5leHQ7CisJCX0KKwkJdC0+ZmluYWxfY2hlY2sobmV3X2VudHJ5LCB0LT50LCByZXBsYWNlLT5uYW1lLAorCQkgICBlbnRyaWVzLT5ob29rX21hc2ssIDApOworCQlpZiAoZWJ0X2Vycm9ybXNnWzBdICE9ICdcMCcpCisJCQlyZXR1cm4gLTE7CisJfQorCS8qIFNvLCB0aGUgZXh0ZW5zaW9ucyBjYW4gd29yayB3aXRoIHRoZSBob3N0IGVuZGlhbi4KKwkgKiBUaGUga2VybmVsIGRvZXMgbm90IGhhdmUgdG8gZG8gdGhpcyBvZiBjb3Vyc2UgKi8KKwluZXdfZW50cnktPmV0aHByb3RvID0gaHRvbnMobmV3X2VudHJ5LT5ldGhwcm90byk7CisKKwlpZiAocmVwbGFjZS0+Y29tbWFuZCA9PSAnUCcpIHsKKwkJaWYgKHJlcGxhY2UtPnNlbGVjdGVkX2NoYWluIDwgTkZfQlJfTlVNSE9PS1MgJiYgcG9saWN5ID09IEVCVF9SRVRVUk4pCisJCQllYnRfcHJpbnRfZXJyb3IyKCJQb2xpY3kgUkVUVVJOIG9ubHkgYWxsb3dlZCBmb3IgdXNlciBkZWZpbmVkIGNoYWlucyIpOworCQllYnRfY2hhbmdlX3BvbGljeShyZXBsYWNlLCBwb2xpY3kpOworCQlpZiAoZWJ0X2Vycm9ybXNnWzBdICE9ICdcMCcpCisJCQlyZXR1cm4gLTE7CisJfSBlbHNlIGlmIChyZXBsYWNlLT5jb21tYW5kID09ICdMJykgeworCQlsaXN0X3J1bGVzKCk7CisJCWlmICghKHJlcGxhY2UtPmZsYWdzICYgT1BUX1pFUk8pICYmIGV4ZWNfc3R5bGUgPT0gRVhFQ19TVFlMRV9QUkcpCisJCQlleGl0KDApOworCX0KKwlpZiAocmVwbGFjZS0+ZmxhZ3MgJiBPUFRfWkVSTykgeworCQlyZXBsYWNlLT5zZWxlY3RlZF9jaGFpbiA9IHplcm9jaGFpbjsKKwkJZWJ0X3plcm9fY291bnRlcnMocmVwbGFjZSk7CisJfSBlbHNlIGlmIChyZXBsYWNlLT5jb21tYW5kID09ICdGJykgeworCQllYnRfZmx1c2hfY2hhaW5zKHJlcGxhY2UpOworCX0gZWxzZSBpZiAocmVwbGFjZS0+Y29tbWFuZCA9PSAnQScgfHwgcmVwbGFjZS0+Y29tbWFuZCA9PSAnSScpIHsKKwkJZWJ0X2FkZF9ydWxlKHJlcGxhY2UsIG5ld19lbnRyeSwgcnVsZV9ucik7CisJCWlmIChlYnRfZXJyb3Jtc2dbMF0gIT0gJ1wwJykKKwkJCXJldHVybiAtMTsKKwkJLyogTWFrZXMgdW5kb2luZyB0aGUgYWRkIGVhc2llciAoanVtcHMgdG8gZGVsZXRlX3RoZV9ydWxlKSAqLworCQlpZiAocnVsZV9uciA8PSAwKQorCQkJcnVsZV9uci0tOworCQlydWxlX25yX2VuZCA9IHJ1bGVfbnI7CisKKwkJLyogYSBqdW1wIHRvIGEgdWRjIHJlcXVpcmVzIGNoZWNraW5nIGZvciBsb29wcyAqLworCQlpZiAoIXN0cmNtcChuZXdfZW50cnktPnQtPnUubmFtZSwgRUJUX1NUQU5EQVJEX1RBUkdFVCkgJiYKKwkJKChzdHJ1Y3QgZWJ0X3N0YW5kYXJkX3RhcmdldCAqKShuZXdfZW50cnktPnQpKS0+dmVyZGljdCA+PSAwKSB7CisJCQkvKiBGSVhNRTogdGhpcyBjYW4gYmUgZG9uZSBmYXN0ZXIgKi8KKwkJCWVidF9jaGVja19mb3JfbG9vcHMocmVwbGFjZSk7CisJCQlpZiAoZWJ0X2Vycm9ybXNnWzBdICE9ICdcMCcpCisJCQkJZ290byBkZWxldGVfdGhlX3J1bGU7CisJCX0KKworCQkvKiBEbyB0aGUgZmluYWxfY2hlY2soKSwgZm9yIGFsbCBlbnRyaWVzLgorCQkgKiBUaGlzIGlzIG5lZWRlZCB3aGVuIGFkZGluZyBhIHJ1bGUgdGhhdCBoYXMgYSBjaGFpbiB0YXJnZXQgKi8KKwkJaSA9IC0xOworCQl3aGlsZSAoKytpICE9IHJlcGxhY2UtPm51bV9jaGFpbnMpIHsKKwkJCXN0cnVjdCBlYnRfdV9lbnRyeSAqZTsKKworCQkJZW50cmllcyA9IHJlcGxhY2UtPmNoYWluc1tpXTsKKwkJCWlmICghZW50cmllcykgeworCQkJCWlmIChpIDwgTkZfQlJfTlVNSE9PS1MpCisJCQkJCWNvbnRpbnVlOworCQkJCWVsc2UKKwkJCQkJZWJ0X3ByaW50X2J1Zygid2hvb3BzXG4iKTsKKwkJCX0KKwkJCWUgPSBlbnRyaWVzLT5lbnRyaWVzLT5uZXh0OworCQkJd2hpbGUgKGUgIT0gZW50cmllcy0+ZW50cmllcykgeworCQkJCS8qIFVzZXJzcGFjZSBleHRlbnNpb25zIHVzZSBob3N0IGVuZGlhbiAqLworCQkJCWUtPmV0aHByb3RvID0gbnRvaHMoZS0+ZXRocHJvdG8pOworCQkJCWVidF9kb19maW5hbF9jaGVja3MocmVwbGFjZSwgZSwgZW50cmllcyk7CisJCQkJaWYgKGVidF9lcnJvcm1zZ1swXSAhPSAnXDAnKQorCQkJCQlnb3RvIGRlbGV0ZV90aGVfcnVsZTsKKwkJCQllLT5ldGhwcm90byA9IGh0b25zKGUtPmV0aHByb3RvKTsKKwkJCQllID0gZS0+bmV4dDsKKwkJCX0KKwkJfQorCQkvKiBEb24ndCByZXVzZSB0aGUgYWRkZWQgcnVsZSAqLworCQluZXdfZW50cnkgPSBOVUxMOworCX0gZWxzZSBpZiAocmVwbGFjZS0+Y29tbWFuZCA9PSAnRCcpIHsKK2RlbGV0ZV90aGVfcnVsZToKKwkJZWJ0X2RlbGV0ZV9ydWxlKHJlcGxhY2UsIG5ld19lbnRyeSwgcnVsZV9uciwgcnVsZV9ucl9lbmQpOworCQlpZiAoZWJ0X2Vycm9ybXNnWzBdICE9ICdcMCcpCisJCQlyZXR1cm4gLTE7CisJfSBlbHNlIGlmIChyZXBsYWNlLT5jb21tYW5kID09ICdDJykgeworCQllYnRfY2hhbmdlX2NvdW50ZXJzKHJlcGxhY2UsIG5ld19lbnRyeSwgcnVsZV9uciwgcnVsZV9ucl9lbmQsICYobmV3X2VudHJ5LT5jbnRfc3VycGx1cyksIGNoY291bnRlcik7CisJCWlmIChlYnRfZXJyb3Jtc2dbMF0gIT0gJ1wwJykKKwkJCXJldHVybiAtMTsKKwl9CisJLyogQ29tbWFuZHMgLU4sIC1FLCAtWCwgLS1hdG9taWMtY29tbWl0LCAtLWF0b21pYy1jb21taXQsIC0tYXRvbWljLXNhdmUsCisJICogLS1pbml0LXRhYmxlIGZhbGwgdGhyb3VnaCAqLworCisJaWYgKGVidF9lcnJvcm1zZ1swXSAhPSAnXDAnKQorCQlyZXR1cm4gLTE7CisJaWYgKHRhYmxlLT5jaGVjaykKKwkJdGFibGUtPmNoZWNrKHJlcGxhY2UpOworCisJaWYgKGV4ZWNfc3R5bGUgPT0gRVhFQ19TVFlMRV9QUkcpIHsvKiBJbXBsaWVzIGVidF9lcnJvcm1zZ1swXSA9PSAnXDAnICovCisJCWVidF9kZWxpdmVyX3RhYmxlKHJlcGxhY2UpOworCisJCWlmIChyZXBsYWNlLT5uZW50cmllcykKKwkJCWVidF9kZWxpdmVyX2NvdW50ZXJzKHJlcGxhY2UpOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2VidGFibGVzZC5jIGIvZWJ0YWJsZXNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJkNTFmYQotLS0gL2Rldi9udWxsCisrKyBiL2VidGFibGVzZC5jCkBAIC0wLDAgKzEsMzcxIEBACisvKgorICogZWJ0YWJsZXNkLmMsIEphbnVhcnkgMjAwNQorICoKKyAqIEF1dGhvcjogQmFydCBEZSBTY2h1eW1lcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgImluY2x1ZGUvZWJ0YWJsZXNfdS5oIgorCisjZGVmaW5lIE9QVF9LRVJORUxEQVRBCTB4ODAwIC8qIEFsc28gZGVmaW5lZCBpbiBlYnRhYmxlcy5jICovCisKK3N0YXRpYyBzdHJ1Y3QgZWJ0X3VfcmVwbGFjZSByZXBsYWNlWzNdOworI2RlZmluZSBPUEVOX01FVEhPRF9GSUxFIDEKKyNkZWZpbmUgT1BFTl9NRVRIT0RfS0VSTkVMIDIKK3N0YXRpYyBpbnQgb3Blbl9tZXRob2RbM107Cit2b2lkIGVidF9lYXJseV9pbml0X29uY2UoKTsKKworc3RhdGljIHZvaWQgc2lncGlwZV9oYW5kbGVyKGludCBzaWcpCit7Cit9CitzdGF0aWMgdm9pZCBjb3B5X3RhYmxlX25hbWVzKCkKK3sKKwlzdHJjcHkocmVwbGFjZVswXS5uYW1lLCAiZmlsdGVyIik7CisJc3RyY3B5KHJlcGxhY2VbMV0ubmFtZSwgIm5hdCIpOworCXN0cmNweShyZXBsYWNlWzJdLm5hbWUsICJicm91dGUiKTsKK30KKworaW50IG1haW4oaW50IGFyZ2NfLCBjaGFyICphcmd2X1tdKQoreworCWNoYXIgKmFyZ3ZbRUJURF9BUkdDX01BWF0sICphcmdzWzRdLCBuYW1lW10gPSAibWtkaXIiLAorCSAgICAgbWtkaXJfb3B0aW9uW10gPSAiLXAiLCBta2Rpcl9kaXJbXSA9IEVCVERfUElQRV9ESVIsCisJICAgICBjbWRsaW5lW0VCVERfQ01ETElORV9NQVhMTl07CisJaW50IHJlYWRmZCwgYmFzZSA9IDAsIG9mZnNldCA9IDAsIG4gPSAwLCBxdW90ZW1vZGUgPSAwOworCisJLyogTWFrZSBzdXJlIHRoZSBwaXBlIGRpcmVjdG9yeSBleGlzdHMgKi8KKwlhcmdzWzBdID0gbmFtZTsKKwlhcmdzWzFdID0gbWtkaXJfb3B0aW9uOworCWFyZ3NbMl0gPSBta2Rpcl9kaXI7CisJYXJnc1szXSA9IE5VTEw7CisJc3dpdGNoIChmb3JrKCkpIHsKKwljYXNlIDA6CisJCWV4ZWN2cChhcmdzWzBdLCBhcmdzKTsKKworCQkvKiBOb3QgdXN1YWxseSByZWFjaGVkICovCisJCWV4aXQoMCk7CisJY2FzZSAtMToKKwkJcmV0dXJuIC0xOworCisJZGVmYXVsdDogLyogUGFyZW50ICovCisJCXdhaXQoTlVMTCk7CisJfQorCisJaWYgKG1rZmlmbyhFQlREX1BJUEUsIDA2MDApIDwgMCAmJiBlcnJubyAhPSBFRVhJU1QpIHsKKwkJcHJpbnRmKCJFcnJvciBjcmVhdGluZyBGSUZPICIgRUJURF9QSVBFICJcbiIpOworCQlnb3RvIGRvX2V4aXQ7CisJfQorCisJaWYgKChyZWFkZmQgPSBvcGVuKEVCVERfUElQRSwgT19SRE9OTFkgfCBPX05PTkJMT0NLLCAwKSkgPT0gLTEpIHsKKwkJcGVycm9yKCJvcGVuIik7CisJCWdvdG8gZG9fZXhpdDsKKwl9CisKKwlpZiAoc2lnbmFsKFNJR1BJUEUsIHNpZ3BpcGVfaGFuZGxlcikgPT0gU0lHX0VSUikgeworCQlwZXJyb3IoInNpZ25hbCIpOworCQlnb3RvIGRvX2V4aXQ7CisJfQorCisJZWJ0X3NpbGVudCA9IDE7CisKKwljb3B5X3RhYmxlX25hbWVzKCk7CisJZWJ0X2Vhcmx5X2luaXRfb25jZSgpOworCisJd2hpbGUgKDEpIHsKKwkJaW50IG4yLCBpLCBhcmdjLCB0YWJsZV9uciwgbnRvdDsKKworCQkvKiBiYXNlID09IDAgKi8KKwkJbnRvdCA9IHJlYWQocmVhZGZkLCBjbWRsaW5lK29mZnNldCwgRUJURF9DTURMSU5FX01BWExOLW9mZnNldC0xKTsKKwkJaWYgKG50b3QgPD0gMCkKKwkJCWNvbnRpbnVlOworCQludG90ICs9IG9mZnNldDsKK2NvbnRpbnVlX3JlYWQ6CisJCS8qIFB1dCAnXDAnIGJldHdlZW4gYXJndW1lbnRzLiAqLworCQlmb3IgKDsgb2Zmc2V0IDwgbnRvdDsgbisrLCBvZmZzZXQrKykgeworCQkJaWYgKGNtZGxpbmVbb2Zmc2V0XSA9PSAnXCInKSB7CisJCQkJcXVvdGVtb2RlIF49IDE7CisJCQkJY21kbGluZVtvZmZzZXRdID0gJ1wwJzsKKwkJCX0gZWxzZSBpZiAoIXF1b3RlbW9kZSAmJiBjbWRsaW5lW29mZnNldF0gPT0gJyAnKSB7CisJCQkJY21kbGluZVtvZmZzZXRdID0gJ1wwJzsKKwkJCX0gZWxzZSBpZiAoY21kbGluZVtvZmZzZXRdID09ICdcbicpIHsKKwkJCQlpZiAocXVvdGVtb2RlKQorCQkJCQllYnRfcHJpbnRfZXJyb3IoImVidGFibGVzZDogd3JvbmcgbnVtYmVyIG9mIFwiIGRlbGltaXRlcnMiKTsKKwkJCQljbWRsaW5lW29mZnNldF0gPSAnXDAnOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChuID09IDApIHsKKwkJCWlmIChvZmZzZXQgPT0gbnRvdCkgeworCQkJCS8qIFRoZSBudG90IGJ5dGVzIHdlcmUgcGFyc2VkIGFuZCBlbmRlZCB3aXRoICdcbicgKi8KKwkJCQliYXNlID0gMDsKKwkJCQlvZmZzZXQgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJb2Zmc2V0Kys7CisJCQliYXNlID0gb2Zmc2V0OworCQkJbiA9IDA7CisJCQlnb3RvIGNvbnRpbnVlX3JlYWQ7CisJCX0KKwkJaWYgKG9mZnNldCA9PSBudG90KSB7IC8qIFRoZSBudG90IGJ5dGVzIHdlcmUgcGFyc2VkIGJ1dCBubyBjb21wbGV0ZSBydWxlIGlzIHlldCBzcGVjaWZpZWQgKi8KKwkJCWlmIChiYXNlID09IDApIHsKKwkJCQllYnRfcHJpbnRfZXJyb3IoImVidGFibGVzZDogdGhlIG1heGltdW0gY29tbWFuZCBsaW5lIGxlbmd0aCBpcyAlZCIsIEVCVERfQ01ETElORV9NQVhMTi0xKTsKKwkJCQlnb3RvIHdyaXRlX21zZzsKKwkJCX0KKwkJCW1lbW1vdmUoY21kbGluZSwgY21kbGluZStiYXNlK29mZnNldCwgbnRvdC1vZmZzZXQpOworCQkJb2Zmc2V0IC09IGJhc2U7CisJCQlvZmZzZXQrKzsKKwkJCWJhc2UgPSAwOworCQkJY29udGludWU7CisJCX0KKworCQl0YWJsZV9uciA9IDA7CisJCW4yID0gMDsKKwkJYXJnYyA9IDA7CisJCXdoaWxlIChuMiA8IG4gJiYgYXJnYyA8IEVCVERfQVJHQ19NQVgpIHsKKwkJCWlmICgqKGNtZGxpbmUgKyBiYXNlICsgbjIpID09ICdcMCcpIHsKKwkJCQluMisrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYXJndlthcmdjKytdID0gY21kbGluZSArIGJhc2UgKyBuMjsKKwkJCW4yICs9IHN0cmxlbihjbWRsaW5lICsgYmFzZSArIG4yKSArIDE7CisJCX0KKwkJb2Zmc2V0Kys7IC8qIE1vdmUgcGFzdCB0aGUgJ1xuJyAqLworCQliYXNlID0gb2Zmc2V0OworCisJCWlmIChhcmdjID4gRUJURF9BUkdDX01BWCkgeworCQkJZWJ0X3ByaW50X2Vycm9yKCJlYnRhYmxlc2Q6IG1heGltdW0gJWQgYXJndW1lbnRzICIKKwkJCSAgICAgICAgICAgICAgICAiYWxsb3dlZCIsIEVCVERfQVJHQ19NQVggLSAxKTsKKwkJCWdvdG8gd3JpdGVfbXNnOworCQl9CisJCWlmIChhcmdjID09IDEpIHsKKwkJCWVidF9wcmludF9lcnJvcigiZWJ0YWJsZXNkOiBubyBhcmd1bWVudHMiKTsKKwkJCWdvdG8gd3JpdGVfbXNnOworCQl9CisKKwkJLyogUGFyc2UgdGhlIG9wdGlvbnMgKi8KKwkJaWYgKCFzdHJjbXAoYXJndlsxXSwgIi10IikpIHsKKwkJCWlmIChhcmdjIDwgMykgeworCQkJCWVidF9wcmludF9lcnJvcigiZWJ0YWJsZXNkOiAtdCBidXQgbm8gdGFibGUiKTsKKwkJCQlnb3RvIHdyaXRlX21zZzsKKwkJCX0KKwkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCQkJaWYgKCFzdHJjbXAocmVwbGFjZVtpXS5uYW1lLCBhcmd2WzJdKSkKKwkJCQkJYnJlYWs7CisJCQlpZiAoaSA9PSAzKSB7CisJCQkJZWJ0X3ByaW50X2Vycm9yKCJlYnRhYmxlc2Q6IHRhYmxlICclcycgd2FzICIKKwkJCQkgICAgICAgICAgICAgICAgIm5vdCByZWNvZ25pemVkIiwgYXJndlsyXSk7CisJCQkJZ290byB3cml0ZV9tc2c7CisJCQl9CisJCQl0YWJsZV9uciA9IGk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiZnJlZSIpKSB7CisJCQlpZiAoYXJnYyAhPSAzKSB7CisJCQkJZWJ0X3ByaW50X2Vycm9yKCJlYnRhYmxlc2Q6IGNvbW1hbmQgZnJlZSAiCisJCQkJICAgICAgICAgICAgICAgICJuZWVkcyBleGFjdGx5IG9uZSBhcmd1bWVudCIpOworCQkJCWdvdG8gd3JpdGVfbXNnOworCQkJfQorCQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCQlpZiAoIXN0cmNtcChyZXBsYWNlW2ldLm5hbWUsIGFyZ3ZbMl0pKQorCQkJCQlicmVhazsKKwkJCWlmIChpID09IDMpIHsKKwkJCQllYnRfcHJpbnRfZXJyb3IoImVidGFibGVzZDogdGFibGUgJyVzJyB3YXMgIgorCQkJCSAgICAgICAgICAgICAgICAibm90IHJlY29nbml6ZWQiLCBhcmd2WzJdKTsKKwkJCQlnb3RvIHdyaXRlX21zZzsKKwkJCX0KKwkJCWlmICghKHJlcGxhY2VbaV0uZmxhZ3MgJiBPUFRfS0VSTkVMREFUQSkpIHsKKwkJCQllYnRfcHJpbnRfZXJyb3IoImVidGFibGVzZDogdGFibGUgJXMgaGFzIG5vdCAiCisJCQkJICAgICAgICAgICAgICAgICJiZWVuIG9wZW5lZCIpOworCQkJCWdvdG8gd3JpdGVfbXNnOworCQkJfQorCQkJZWJ0X2NsZWFudXBfcmVwbGFjZSgmcmVwbGFjZVtpXSk7CisJCQljb3B5X3RhYmxlX25hbWVzKCk7CisJCQlyZXBsYWNlW2ldLmZsYWdzICY9IH5PUFRfS0VSTkVMREFUQTsKKwkJCWdvdG8gd3JpdGVfbXNnOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIm9wZW4iKSkgeworCQkJaWYgKGFyZ2MgIT0gMykgeworCQkJCWVidF9wcmludF9lcnJvcigiZWJ0YWJsZXNkOiBjb21tYW5kIG9wZW4gIgorCQkJCSAgICAgICAgICAgICAgICAibmVlZHMgZXhhY3RseSBvbmUgYXJndW1lbnQiKTsKKwkJCQlnb3RvIHdyaXRlX21zZzsKKwkJCX0KKworCQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCQlpZiAoIXN0cmNtcChyZXBsYWNlW2ldLm5hbWUsIGFyZ3ZbMl0pKQorCQkJCQlicmVhazsKKwkJCWlmIChpID09IDMpIHsKKwkJCQllYnRfcHJpbnRfZXJyb3IoImVidGFibGVzZDogdGFibGUgJyVzJyB3YXMgIgorCQkJCSAgICAgICAgICAgICAgICAibm90IHJlY29nbml6ZWQiLCBhcmd2WzJdKTsKKwkJCQlnb3RvIHdyaXRlX21zZzsKKwkJCX0KKwkJCWlmIChyZXBsYWNlW2ldLmZsYWdzICYgT1BUX0tFUk5FTERBVEEpIHsKKwkJCQllYnRfcHJpbnRfZXJyb3IoImVidGFibGVzZDogdGFibGUgJXMgbmVlZHMgdG8gIgorCQkJCSAgICAgICAgICAgICAgICAiYmUgZnJlZWQgYmVmb3JlIGl0IGNhbiBiZSAiCisJCQkJICAgICAgICAgICAgICAgICJvcGVuZWQiKTsKKwkJCQlnb3RvIHdyaXRlX21zZzsKKwkJCX0KKwkJCWlmICghZWJ0X2dldF9rZXJuZWxfdGFibGUoJnJlcGxhY2VbaV0sIDApKSB7CisJCQkJcmVwbGFjZVtpXS5mbGFncyB8PSBPUFRfS0VSTkVMREFUQTsKKwkJCQlvcGVuX21ldGhvZFtpXSA9IE9QRU5fTUVUSE9EX0tFUk5FTDsKKwkJCX0KKwkJCWdvdG8gd3JpdGVfbXNnOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgImZvcGVuIikpIHsKKwkJCXN0cnVjdCBlYnRfdV9yZXBsYWNlIHRtcDsKKworCQkJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKKwkJCWlmIChhcmdjICE9IDQpIHsKKwkJCQllYnRfcHJpbnRfZXJyb3IoImVidGFibGVzZDogY29tbWFuZCBmb3BlbiAiCisJCQkJICAgICAgICAgICAgICAgICJuZWVkcyBleGFjdGx5IHR3byBhcmd1bWVudHMiKTsKKwkJCQlnb3RvIHdyaXRlX21zZzsKKwkJCX0KKworCQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCQlpZiAoIXN0cmNtcChyZXBsYWNlW2ldLm5hbWUsIGFyZ3ZbMl0pKQorCQkJCQlicmVhazsKKwkJCWlmIChpID09IDMpIHsKKwkJCQllYnRfcHJpbnRfZXJyb3IoImVidGFibGVzZDogdGFibGUgJyVzJyB3YXMgIgorCQkJCSAgICAgICAgICAgICAgICAibm90IHJlY29nbml6ZWQiLCBhcmd2WzJdKTsKKwkJCQlnb3RvIHdyaXRlX21zZzsKKwkJCX0KKwkJCWlmIChyZXBsYWNlW2ldLmZsYWdzICYgT1BUX0tFUk5FTERBVEEpIHsKKwkJCQllYnRfcHJpbnRfZXJyb3IoImVidGFibGVzZDogdGFibGUgJXMgbmVlZHMgdG8gIgorCQkJCSAgICAgICAgICAgICAgICAiYmUgZnJlZWQgYmVmb3JlIGl0IGNhbiBiZSAiCisJCQkJICAgICAgICAgICAgICAgICJvcGVuZWQiKTsKKwkJCQlnb3RvIHdyaXRlX21zZzsKKwkJCX0KKwkJCXRtcC5maWxlbmFtZSA9IChjaGFyICopbWFsbG9jKHN0cmxlbihhcmd2WzNdKSArIDEpOworCQkJaWYgKCF0bXAuZmlsZW5hbWUpIHsKKwkJCQllYnRfcHJpbnRfZXJyb3IoIk91dCBvZiBtZW1vcnkiKTsKKwkJCQlnb3RvIHdyaXRlX21zZzsKKwkJCX0KKwkJCXN0cmNweSh0bXAuZmlsZW5hbWUsIGFyZ3ZbM10pOworCQkJc3RyY3B5KHRtcC5uYW1lLCAiZmlsdGVyIik7CisJCQl0bXAuY29tbWFuZCA9ICdMJzsgLyogTWFrZSBzdXJlIHJldHJpZXZlX2Zyb21fZmlsZSgpCisJCQkgICAgICAgICAgICAgICAgICAgICogZG9lc24ndCBjb21wbGFpbiBhYm91dCB3cm9uZworCQkJICAgICAgICAgICAgICAgICAgICAqIHRhYmxlIG5hbWUgKi8KKworCQkJZWJ0X2dldF9rZXJuZWxfdGFibGUoJnRtcCwgMCk7CisJCQlmcmVlKHRtcC5maWxlbmFtZSk7CisJCQl0bXAuZmlsZW5hbWUgPSBOVUxMOworCQkJaWYgKGVidF9lcnJvcm1zZ1swXSAhPSAnXDAnKQorCQkJCWdvdG8gd3JpdGVfbXNnOworCisJCQlpZiAoc3RyY21wKHRtcC5uYW1lLCBhcmd2WzJdKSkgeworCQkJCWVidF9wcmludF9lcnJvcigiZWJ0YWJsZXNkOiBvcGVuZWQgZmlsZSB3aXRoICIKKwkJCQkgICAgICAgICAgICAgICAgIndyb25nIHRhYmxlIG5hbWUgJyVzJyIsIHRtcC5uYW1lKTsKKwkJCQllYnRfY2xlYW51cF9yZXBsYWNlKCZ0bXApOworCQkJCWdvdG8gd3JpdGVfbXNnOworCQkJfQorCQkJcmVwbGFjZVtpXSA9IHRtcDsKKwkJCXJlcGxhY2VbaV0uY29tbWFuZCA9ICdcMCc7CisJCQlyZXBsYWNlW2ldLmZsYWdzIHw9IE9QVF9LRVJORUxEQVRBOworCQkJb3Blbl9tZXRob2RbaV0gPSBPUEVOX01FVEhPRF9GSUxFOworCQkJZ290byB3cml0ZV9tc2c7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiY29tbWl0IikpIHsKKwkJCWlmIChhcmdjICE9IDMpIHsKKwkJCQllYnRfcHJpbnRfZXJyb3IoImVidGFibGVzZDogY29tbWFuZCBjb21taXQgIgorCQkJCSAgICAgICAgICAgICAgICAibmVlZHMgZXhhY3RseSBvbmUgYXJndW1lbnQiKTsKKwkJCQlnb3RvIHdyaXRlX21zZzsKKwkJCX0KKworCQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCQlpZiAoIXN0cmNtcChyZXBsYWNlW2ldLm5hbWUsIGFyZ3ZbMl0pKQorCQkJCQlicmVhazsKKwkJCWlmIChpID09IDMpIHsKKwkJCQllYnRfcHJpbnRfZXJyb3IoImVidGFibGVzZDogdGFibGUgJyVzJyB3YXMgIgorCQkJCSAgICAgICAgICAgICAgICAibm90IHJlY29nbml6ZWQiLCBhcmd2WzJdKTsKKwkJCQlnb3RvIHdyaXRlX21zZzsKKwkJCX0KKwkJCWlmICghKHJlcGxhY2VbaV0uZmxhZ3MgJiBPUFRfS0VSTkVMREFUQSkpIHsKKwkJCQllYnRfcHJpbnRfZXJyb3IoImVidGFibGVzZDogdGFibGUgJXMgaGFzIG5vdCAiCisJCQkJICAgICAgICAgICAgICAgICJiZWVuIG9wZW5lZCIpOworCQkJCWdvdG8gd3JpdGVfbXNnOworCQkJfQorCQkJLyogVGhlIGNvdW50ZXJzIGZyb20gdGhlIGtlcm5lbCBhcmUgdXNlbGVzcyBpZiB3ZSAKKwkJCSAqIGRpZG4ndCBzdGFydCBmcm9tIGEga2VybmVsIHRhYmxlICovCisJCQlpZiAob3Blbl9tZXRob2RbaV0gPT0gT1BFTl9NRVRIT0RfRklMRSkKKwkJCQlyZXBsYWNlW2ldLm51bV9jb3VudGVycyA9IDA7CisJCQllYnRfZGVsaXZlcl90YWJsZSgmcmVwbGFjZVtpXSk7CisJCQlpZiAoZWJ0X2Vycm9ybXNnWzBdID09ICdcMCcgJiYgb3Blbl9tZXRob2RbaV0gPT0gT1BFTl9NRVRIT0RfS0VSTkVMKQorCQkJCWVidF9kZWxpdmVyX2NvdW50ZXJzKCZyZXBsYWNlW2ldKTsKKwkJCWdvdG8gd3JpdGVfbXNnOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgImZjb21taXQiKSkgeworCQkJaWYgKGFyZ2MgIT0gNCkgeworCQkJCWVidF9wcmludF9lcnJvcigiZWJ0YWJsZXNkOiBjb21tYW5kIGNvbW1pdCAiCisJCQkJICAgICAgICAgICAgICAgICJuZWVkcyBleGFjdGx5IHR3byBhcmd1bWVudCIpOworCQkJCWdvdG8gd3JpdGVfbXNnOworCQkJfQorCisJCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJCWlmICghc3RyY21wKHJlcGxhY2VbaV0ubmFtZSwgYXJndlsyXSkpCisJCQkJCWJyZWFrOworCQkJaWYgKGkgPT0gMykgeworCQkJCWVidF9wcmludF9lcnJvcigiZWJ0YWJsZXNkOiB0YWJsZSAnJXMnIHdhcyAiCisJCQkJICAgICAgICAgICAgICAgICJub3QgcmVjb2duaXplZCIsIGFyZ3ZbMl0pOworCQkJCWdvdG8gd3JpdGVfbXNnOworCQkJfQorCQkJaWYgKCEocmVwbGFjZVtpXS5mbGFncyAmIE9QVF9LRVJORUxEQVRBKSkgeworCQkJCWVidF9wcmludF9lcnJvcigiZWJ0YWJsZXNkOiB0YWJsZSAlcyBoYXMgbm90ICIKKwkJCQkgICAgICAgICAgICAgICAgImJlZW4gb3BlbmVkIik7CisJCQkJZ290byB3cml0ZV9tc2c7CisJCQl9CisJCQlyZXBsYWNlW2ldLmZpbGVuYW1lID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKGFyZ3ZbM10pICsgMSk7CisJCQlpZiAoIXJlcGxhY2VbaV0uZmlsZW5hbWUpIHsKKwkJCQllYnRfcHJpbnRfZXJyb3IoIk91dCBvZiBtZW1vcnkiKTsKKwkJCQlnb3RvIHdyaXRlX21zZzsKKwkJCX0KKwkJCXN0cmNweShyZXBsYWNlW2ldLmZpbGVuYW1lLCBhcmd2WzNdKTsKKwkJCWVidF9kZWxpdmVyX3RhYmxlKCZyZXBsYWNlW2ldKTsKKwkJCWlmIChlYnRfZXJyb3Jtc2dbMF0gPT0gJ1wwJyAmJiBvcGVuX21ldGhvZFtpXSA9PSBPUEVOX01FVEhPRF9LRVJORUwpCisJCQkJZWJ0X2RlbGl2ZXJfY291bnRlcnMoJnJlcGxhY2VbaV0pOworCQkJZnJlZShyZXBsYWNlW2ldLmZpbGVuYW1lKTsKKwkJCXJlcGxhY2VbaV0uZmlsZW5hbWUgPSBOVUxMOworCQkJZ290byB3cml0ZV9tc2c7CisJCX1lbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICJxdWl0IikpIHsKKwkJCWlmIChhcmdjICE9IDIpIHsKKwkJCQllYnRfcHJpbnRfZXJyb3IoImVidGFibGVzZDogY29tbWFuZCBxdWl0IGRvZXMgIgorCQkJCSAgICAgICAgICAgICAgICAibm90IHRha2UgYW55IGFyZ3VtZW50cyIpOworCQkJCWdvdG8gd3JpdGVfbXNnOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJaWYgKCEocmVwbGFjZVt0YWJsZV9ucl0uZmxhZ3MgJiBPUFRfS0VSTkVMREFUQSkpIHsKKwkJCWVidF9wcmludF9lcnJvcigiZWJ0YWJsZXNkOiB0YWJsZSAlcyBoYXMgbm90IGJlZW4gIgorCQkJICAgICAgICAgICAgICAgICJvcGVuZWQiLCByZXBsYWNlW3RhYmxlX25yXS5uYW1lKTsKKwkJCWdvdG8gd3JpdGVfbXNnOworCQl9CisJCW9wdGluZCA9IDA7IC8qIFNldHRpbmcgb3B0aW5kID0gMSBjYXVzZXMgc2VyaW91cyBhbm5veWFuY2VzICovCisJCWRvX2NvbW1hbmQoYXJnYywgYXJndiwgRVhFQ19TVFlMRV9EQUVNT04sICZyZXBsYWNlW3RhYmxlX25yXSk7CisJCWVidF9yZWluaXRfZXh0ZW5zaW9ucygpOword3JpdGVfbXNnOgorI2lmbmRlZiBTSUxFTlRfREFFTU9OCisJCWlmIChlYnRfZXJyb3Jtc2dbMF0gIT0gJ1wwJykKKwkJCXByaW50ZigiJXMuXG4iLCBlYnRfZXJyb3Jtc2cpOworI2VuZGlmCisJCWVidF9lcnJvcm1zZ1swXT0gJ1wwJzsKKwkJbiA9IDA7CisJCWdvdG8gY29udGludWVfcmVhZDsKKwl9Citkb19leGl0OgorCXVubGluayhFQlREX1BJUEUpOworCQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZWJ0YWJsZXN1LmMgYi9lYnRhYmxlc3UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2VlMTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZWJ0YWJsZXN1LmMKQEAgLTAsMCArMSw4OSBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKK3N0YXRpYyB2b2lkIHByaW50X2hlbHAoKQoreworCXByaW50ZigiZWJ0YWJsZXN1IHYiUFJPR1ZFUlNJT04iICgiUFJPR0RBVEUiKVxuIik7CisJcHJpbnRmKAorIlVzYWdlOlxuIgorImVidGFibGVzdSBvcGVuIHRhYmxlICAgICAgICAgOiBjb3B5IHRoZSBrZXJuZWwgdGFibGVcbiIKKyJlYnRhYmxlc3UgZm9wZW4gdGFibGUgZmlsZSAgIDogY29weSB0aGUgdGFibGUgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGVcbiIKKyJlYnRhYmxlc3UgZnJlZSB0YWJsZSAgICAgICAgIDogcmVtb3ZlIHRoZSB0YWJsZSBmcm9tIG1lbW9yeVxuIgorImVidGFibGVzdSBjb21taXQgdGFibGUgICAgICAgOiBjb21taXQgdGhlIHRhYmxlIHRvIHRoZSBrZXJuZWxcbiIKKyJlYnRhYmxlc3UgZmNvbW1pdCB0YWJsZSBmaWxlIDogY29tbWl0IHRoZSB0YWJsZSB0byB0aGUgc3BlY2lmaWVkIGZpbGVcblxuIgorImVidGFibGVzdSA8ZWJ0YWJsZXMgb3B0aW9ucz4gOiB0aGUgZWJ0YWJsZXMgc3BlY2lmaWNhdGlvbnNcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlIHNwYWNlcyBvbmx5IHRvIHNlcGFyYXRlIG9wdGlvbnMgYW5kIGNvbW1hbmRzXG4iCisiRm9yIHRoZSBlYnRhYmxlcyBvcHRpb25zLCBzZWVcbiMgZWJ0YWJsZXMgLWhcbm9yXG4jIG1hbiBlYnRhYmxlc1xuIgorCSk7Cit9CitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWNoYXIgKmFyZ3VtZW50cywgKnBvczsKKwlpbnQgaSwgd3JpdGVmZCwgbGVuID0gMDsKKworCWlmIChhcmdjID4gRUJURF9BUkdDX01BWCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImVidGFibGVzZCBhY2NlcHRzIGF0IG1vc3QgJWQgYXJndW1lbnRzLCAlZCAiCisJCSAgICAgICAgImFyZ3VtZW50cyB3ZXJlIHNwZWNpZmllZC4gSWYgeW91IG5lZWQgdGhpcyBtYW55ICIKKwkJICAgICAgICAiYXJndW1lbnRzLCByZWNvbXBpbGUgdGhpcyB0b29sIHdpdGggYSBoaWdoZXIgdmFsdWUgZm9yIgorCQkgICAgICAgICIgRUJURF9BUkdDX01BWC5cbiIsIEVCVERfQVJHQ19NQVggLSAxLCBhcmdjIC0gMSk7CisJCXJldHVybiAtMTsKKwl9IGVsc2UgaWYgKGFyZ2MgPT0gMSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkF0IGxlYXN0IG9uZSBhcmd1bWVudCBpcyBuZWVkZWQuXG4iKTsKKwkJcHJpbnRfaGVscCgpOworCQlleGl0KDApOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspCisJCWxlbiArPSBzdHJsZW4oYXJndltpXSk7CisJLyogRG9uJ3QgZm9yZ2V0ICdcMCcgKi8KKwlsZW4gKz0gYXJnYzsKKwlpZiAobGVuID4gRUJURF9DTURMSU5FX01BWExOKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZWJ0YWJsZXNkIGhhcyBhIG1heGltdW0gY29tbWFuZCBsaW5lIGFyZ3VtZW50ICIKKwkJICAgICAgICJsZW5ndGggb2YgJWQsIGFuIGFyZ3VtZW50IGxlbmd0aCBvZiAlZCB3YXMgcmVjZWl2ZWQuICIKKwkJICAgICAgICJJZiBhIHNtYWxsZXIgbGVuZ3RoIGlzIHVuZmVhc2libGUsIHJlY29tcGlsZSB0aGlzIHRvb2wgIgorCQkgICAgICAgIndpdGggYSBoaWdoZXIgdmFsdWUgZm9yIEVCVERfQ01ETElORV9NQVhMTi5cbiIsCisJCSAgICAgICBFQlREX0NNRExJTkVfTUFYTE4sIGxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoIXN0cmNtcChhcmd2WzFdLCAiLWgiKSB8fCAhc3RyY21wKGFyZ3ZbMV0sICItLWhlbHAiKSkgeworCQlpZiAoYXJnYyAhPSAyKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzIGRvZXMgbm90IGFjY2VwdCBvcHRpb25zLlxuIiwgYXJndlsxXSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJcHJpbnRfaGVscCgpOworCQlleGl0KDApOworCX0KKworCWlmICghKGFyZ3VtZW50cyA9IChjaGFyICopbWFsbG9jKGxlbikpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZWJ0YWJsZXN1OiBvdXQgb2YgbWVtb3J5LlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoKHdyaXRlZmQgPSBvcGVuKEVCVERfUElQRSwgT19XUk9OTFksIDApKSA9PSAtMSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIHRoZSBwaXBlLCBwZXJoYXBzIGVidGFibGVzZCBpcyAiCisJCSAgICAgICAgIm5vdCBydW5uaW5nIG9yIHlvdSBkb24ndCBoYXZlIHdyaXRlIHBlcm1pc3Npb24gKHRyeSAiCisJCSAgICAgICAgInJ1bm5pbmcgYXMgcm9vdCkuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXBvcyA9IGFyZ3VtZW50czsKKwlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CisJCXN0cmNweShwb3MsIGFyZ3ZbaV0pOworCQlwb3MgKz0gc3RybGVuKGFyZ3ZbaV0pOworCQkqKHBvcysrKSA9ICcgJzsKKwl9CisKKwkqKHBvcy0xKSA9ICdcbic7CisJaWYgKHdyaXRlKHdyaXRlZmQsIGFyZ3VtZW50cywgbGVuKSA9PSAtMSkgeworCQlwZXJyb3IoIndyaXRlIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9ldGhlcnR5cGVzIGIvZXRoZXJ0eXBlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTMxNzdiCi0tLSAvZGV2L251bGwKKysrIGIvZXRoZXJ0eXBlcwpAQCAtMCwwICsxLDM5IEBACisjCisjIEV0aGVybmV0IGZyYW1lIHR5cGVzCisjCQlUaGlzIGZpbGUgZGVzY3JpYmVzIHNvbWUgb2YgdGhlIHZhcmlvdXMgRXRoZXJuZXQKKyMJCXByb3RvY29sIHR5cGVzIHRoYXQgYXJlIHVzZWQgb24gRXRoZXJuZXQgbmV0d29ya3MuCisjCisjIFRoaXMgbGlzdCBjb3VsZCBiZSBmb3VuZCBvbjoKKyMgICAgICAgICBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2V0aGVybmV0LW51bWJlcnMKKyMgICAgICAgICBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2llZWUtODAyLW51bWJlcnMKKyMKKyMgPG5hbWU+ICAgIDxoZXhudW1iZXI+IDxhbGlhczE+Li4uPGFsaWFzMzU+ICNDb21tZW50CisjCitJUHY0CSAJMDgwMCAgCWlwIGlwNCAJCSMgSW50ZXJuZXQgSVAgKElQdjQpCitYMjUJCTA4MDUKK0FSUAkJMDgwNglldGhlci1hcnAJIworRlJfQVJQCQkwODA4ICAgIAkJIyBGcmFtZSBSZWxheSBBUlAgICAgICAgIFtSRkMxNzAxXQorQlBRCQkwOEZGCQkJIyBHOEJQUSBBWC4yNSBFdGhlcm5ldCBQYWNrZXQKK0RFQwkJNjAwMAkJCSMgREVDIEFzc2lnbmVkIHByb3RvCitETkFfREwJCTYwMDEJCQkjIERFQyBETkEgRHVtcC9Mb2FkCitETkFfUkMJCTYwMDIJCQkjIERFQyBETkEgUmVtb3RlIENvbnNvbGUKK0ROQV9SVAkJNjAwMwkJCSMgREVDIEROQSBSb3V0aW5nCitMQVQJCTYwMDQJCQkjIERFQyBMQVQKK0RJQUcJCTYwMDUJCQkjIERFQyBEaWFnbm9zdGljcworQ1VTVAkJNjAwNgkJCSMgREVDIEN1c3RvbWVyIHVzZQorU0NBCQk2MDA3CQkJIyBERUMgU3lzdGVtcyBDb21tcyBBcmNoCitURUIJCTY1NTgJCQkjIFRyYW5zIEV0aGVyIEJyaWRnaW5nICAgW1JGQzE3MDFdCitSQVdfRlIgIAk2NTU5CQkJIyBSYXcgRnJhbWUgUmVsYXkgICAgICAgIFtSRkMxNzAxXQorUkFSUAkJODAzNQkJCSMgUmV2ZXJzZSBBUlAgICAgICAgICAgICBbUkZDOTAzXQorQUFSUAkJODBGMwkJCSMgQXBwbGV0YWxrIEFBUlAKK0FUQUxLCQk4MDlCCQkJIyBBcHBsZXRhbGsKKzgwMl8xUQkJODEwMAk4MDIxcSAxcSA4MDIuMXEJZG90MXEgIyA4MDIuMVEgVmlydHVhbCBMQU4gdGFnZ2VkIGZyYW1lCitJUFgJCTgxMzcJCQkjIE5vdmVsbCBJUFgKK05ldEJFVUkJCTgxOTEJCQkjIE5ldEJFVUkKK0lQdjYJCTg2REQJaXA2IAkJIyBJUCB2ZXJzaW9uIDYKK1BQUAkJODgwQgkJCSMgUFBQCitBVE1NUE9BCQk4ODRDCQkJIyBNdWx0aVByb3RvY29sIG92ZXIgQVRNCitQUFBfRElTQwk4ODYzCQkJIyBQUFBvRSBkaXNjb3ZlcnkgbWVzc2FnZXMKK1BQUF9TRVMJCTg4NjQJCQkjIFBQUG9FIHNlc3Npb24gbWVzc2FnZXMKK0FUTUZBVEUJCTg4ODQJCQkjIEZyYW1lLWJhc2VkIEFUTSBUcmFuc3BvcnQgb3ZlciBFdGhlcm5ldAorTE9PUAkJOTAwMAlsb29wYmFjayAJIyBsb29wIHByb3RvCmRpZmYgLS1naXQgYS9leGFtcGxlcy9wZXJmX3Rlc3QvcGVyZl90ZXN0IGIvZXhhbXBsZXMvcGVyZl90ZXN0L3BlcmZfdGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZmRhMjY2Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcGVyZl90ZXN0L3BlcmZfdGVzdApAQCAtMCwwICsxLDI2MSBAQAorIyEvYmluL2Jhc2gKKyMKKyMgVGhlIGVidGFibGVzdS9lYnRhYmxlc2QgcHJvZ3JhbXMgYXJlIGRlcHJlY2F0ZWQsCisjIHRoZXkncmUgbW9zdGx5IHVzZWZ1bCBmb3IgZGVidWdnaW5nIGVidGFibGVzIGluIGRhZW1vbgorIyBtb2RlLiBGb3IgZmFzdCBwb3B1bGF0aW9uIG9mIHRhYmxlcywgdXNlIGVidGFibGVzLXJlc3RvcmUuCisjIFlvdSBzaG91bGQgcHJvYmFibHkganVzdCBpZ25vcmUgdGhpcyBzY3JpcHQuCisjCisjIFRoaXMgc2NyaXB0IGNhbiBiZSB1c2VkIHRvIGNvbXBhcmUgdGhlIHNwZWVkIG9mCisjIHRoZSBkaWZmZXJlbnQgbWV0aG9kcyBmb3IgYWRkaW5nIHJ1bGVzIGluIGVidGFibGVzCisjIGNoYWlucy4KKyMKKyMgQXBhcnQgZnJvbSB0aGUgc3RhbmRhcmQgbWV0aG9kIG9mIGFkZGluZyBydWxlcyB3aXRoCisjIHRoZSBlYnRhYmxlcyB0b29sLCBydWxlcyBjYW4gYmUgYWRkZWQgKGZhc3Rlcikgd2l0aAorIyBlYnRhYmxlc2QgcnVubmluZyBpbiB0aGUgYmFja2dyb3VuZCBhbmQgYWNjZXB0aW5nCisjIGNvbW1hbmRzIHRocm91Z2ggYSBwaXBlLiBUaGUgcGlwZSBjYW4gYmUgd3JpdHRlbiB0bworIyB3aXRoIHRoZSBzdGFuZGFyZCBzaGVsbCB0b29scy4gVGhlIG9ubHkgcmVzdHJpY3Rpb24gaXMKKyMgdGhhdCBzcGFjZXMgYXJlIG9ubHkgdXNlZCB0byBzZXBhcmF0ZSBvcHRpb25zIGFuZAorIyBjb21tYW5kcywgaS5lLiBzcGFjZXMgYXJlIG5vdCBhbGxvd2VkIGluIHN0cmluZ3MsIGV2ZW4KKyMgaWYgdGhleSBhcmUgYmV0d2VlbiAiIi4gRS5nLgorIyBlYnRhYmxlc3UgLUEgLS1sb2ctcHJlZml4ICJhIHNwYWNlIgorIyBpcyBub3QgYWxsb3dlZCwgaG93ZXZlcgorIyBlYnRhYmxlc3UgLUEgLS1sb2ctcHJlZml4ICJhX3NwYWNlIgorIyBpcyBhbGxvd2VkLgorIworIyBBdXRob3I6IEJhcnQgRGUgU2NodXltZXIKKyMKKworZXhwb3J0IFBJUEU9L3RtcC9lYnRhYmxlcy12Mi4wLjcvZWJ0YWJsZXNkX3BpcGUKK2V4cG9ydCBFQlRBQkxFUz0vdXNyL2xvY2FsL3NiaW4vZWJ0YWJsZXMKK2V4cG9ydCBFQlRBQkxFU0Q9L3Vzci9sb2NhbC9zYmluL2VidGFibGVzZAorZXhwb3J0IEVCVEFCTEVTVT0vdXNyL2xvY2FsL3NiaW4vZWJ0YWJsZXN1CisKK2lmIFtbICQjID0gMCBdXQordGhlbgorCitybSAtZiBpZXRzIG5pZXRzIGlldHMub3V0IG5pZXRzLm91dAorTUFYTElNSVQ9MTAwMDAKK2ZvciAoKExJTUlUPTEwOyBMSU1JVCA8PSBNQVhMSU1JVDsgTElNSVQgKj0gMTApKSBkbworICBraWxsYWxsIGVidGFibGVzZCAyPi9kZXYvbnVsbAorICAkRUJUQUJMRVMgLS1pbml0LXRhYmxlCisgIGV4cG9ydCBMSU1JVAorICB0aW1lICQwIDEKKyAgZWNobyAiYWRkZWQiICRMSU1JVCAicnVsZXMgd2l0aCBlY2hvIgorICAkRUJUQUJMRVMgLS1hdG9taWMtZmlsZSBpZXRzIC0tYXRvbWljLXNhdmUKKyAgJEVCVEFCTEVTIC1GCisgIHRpbWUgJDAgMgorICBlY2hvICJhZGRlZCIgJExJTUlUICJydWxlcyB3aXRoIGVidGFibGVzIgorICAkRUJUQUJMRVMgLS1hdG9taWMtZmlsZSBuaWV0cyAtLWF0b21pYy1zYXZlCisgICRFQlRBQkxFUyAtLWF0b21pYy1maWxlIGlldHMgLUwgPiBpZXRzLm91dAorICAkRUJUQUJMRVMgLS1hdG9taWMtZmlsZSBuaWV0cyAtTCA+IG5pZXRzLm91dAorICBkaWZmIC1wdXJOIGlldHMub3V0IG5pZXRzLm91dAorICBybSAtZiBuaWV0cyBuaWV0cy5vdXQKKyAga2lsbGFsbCBlYnRhYmxlc2QgMj4vZGV2L251bGwKKyAgJEVCVEFCTEVTIC1GCisgIHRpbWUgJDAgMworICBlY2hvICJhZGRlZCIgJExJTUlUICJydWxlcyB3aXRoIGVidGFibGVzdSIKKyAgJEVCVEFCTEVTIC0tYXRvbWljLWZpbGUgbmlldHMgLS1hdG9taWMtc2F2ZQorICAkRUJUQUJMRVMgLS1hdG9taWMtZmlsZSBpZXRzIC1MID4gaWV0cy5vdXQKKyAgJEVCVEFCTEVTIC0tYXRvbWljLWZpbGUgbmlldHMgLUwgPiBuaWV0cy5vdXQKKyAgZGlmZiAtcHVyTiBpZXRzLm91dCBuaWV0cy5vdXQKKyAgcm0gLWYgbmlldHMgbmlldHMub3V0CisgIHRpbWUgJDAgNAorICBlY2hvICJhZGRlZCIgJExJTUlUICJydWxlcyB3aXRoIGF0b21pYy1maWxlIgorICAkRUJUQUJMRVMgLS1hdG9taWMtZmlsZSBuaWV0cyAtLWF0b21pYy1zYXZlCisgICRFQlRBQkxFUyAtLWF0b21pYy1maWxlIG5pZXRzIC1MID4gbmlldHMub3V0CisgIGRpZmYgLXB1ck4gaWV0cy5vdXQgbmlldHMub3V0CisgIHJtIC1mIG5pZXRzIG5pZXRzLm91dAorICB0aW1lICQwIDUKKyAgZWNobyAiYWRkZWQiICRMSU1JVCAicnVsZXMgd2l0aCBvbmUgYXRvbWljLWNvbW1pdCIKKyAgJEVCVEFCTEVTIC0tYXRvbWljLWZpbGUgbmlldHMgLS1hdG9taWMtc2F2ZQorICAkRUJUQUJMRVMgLS1hdG9taWMtZmlsZSBuaWV0cyAtTCA+IG5pZXRzLm91dAorICBkaWZmIC1wdXJOIGlldHMub3V0IG5pZXRzLm91dAorICBybSAtZiBpZXRzIGlldHMub3V0IG5pZXRzIG5pZXRzLm91dAorZG9uZQorCitlbGlmIFtbICQxID0gIjEiIF1dCit0aGVuCisKKyRFQlRBQkxFU0QgJgorcGlkPWBqb2JzIC1wICckRUJUQUJMRVNEJ2AKK3NsZWVwIDEKKyRFQlRBQkxFU1Ugb3BlbiBmaWx0ZXIKKyMgQWRkIHJ1bGVzIHdpdGggZWJ0YWJsZXNkCitlY2hvICIkRUJUQUJMRVNVIC1GIiA+PiRQSVBFCitmb3IgKChhPTE7IGEgPD0gTElNSVQ7IGErKykpIGRvCisgIGVjaG8gIiRFQlRBQkxFU1UgLUEgRk9SV0FSRCIgPj4kUElQRQorZG9uZQorJEVCVEFCTEVTVSBjb21taXQgZmlsdGVyCiskRUJUQUJMRVNVIHF1aXQKK3dhaXQgJHBpZAorCitlbGlmIFtbICQxID0gIjIiIF1dCit0aGVuCisKKyMgQWRkIHJ1bGVzIHdpdGggZWJ0YWJsZXMKK2ZvciAoKGE9MTsgYSA8PSBMSU1JVDsgYSsrKSkKK2RvCisgICRFQlRBQkxFUyAtQSBGT1JXQVJECitkb25lCisKK2VsaWYgW1sgJDEgPSAiMyIgXV0KK3RoZW4KKworJEVCVEFCTEVTRCAmCitwaWQ9YGpvYnMgLXAgJyRFQlRBQkxFU0QnYAorc2xlZXAgMQorJEVCVEFCTEVTVSBvcGVuIGZpbHRlcgorIyBBZGQgcnVsZXMgd2l0aCBlYnRhYmxlc3UKK2ZvciAoKGE9MTsgYSA8PSBMSU1JVDsgYSsrKSkKK2RvCisgICRFQlRBQkxFU1UgLUEgRk9SV0FSRAorZG9uZQorJEVCVEFCTEVTVSBjb21taXQgZmlsdGVyCiskRUJUQUJMRVNVIHF1aXQKK3dhaXQgJHBpZAorCitlbGlmIFtbICQxID0gIjQiIF1dCit0aGVuCisKKyMgQWRkIHJ1bGVzIHdpdGggZWJ0YWJsZXMgLS1hdG9taWMtZmlsZQorJEVCVEFCTEVTIC0tYXRvbWljLWZpbGUgbmlldHMgLS1hdG9taWMtaW5pdAorZm9yICgoYT0xOyBhIDw9IExJTUlUOyBhKyspKQorZG8KKyAgJEVCVEFCTEVTIC0tYXRvbWljLWZpbGUgbmlldHMgLUEgRk9SV0FSRAorZG9uZQorJEVCVEFCTEVTIC0tYXRvbWljLWZpbGUgbmlldHMgLS1hdG9taWMtY29tbWl0CisKK2Vsc2UKKworIyBBZGQgcnVsZXMgdGFrZW4gZnJvbSBhIGJpbmFyeSBmaWxlIGNvbnRhaW5pbmcgYSBzYXZlZCB0YWJsZQorJEVCVEFCTEVTIC0tYXRvbWljLWZpbGUgaWV0cyAtLWF0b21pYy1jb21taXQKKworZmkKKworCisjIEZyb20gdGhlIHJlc3VsdHMgYmVsb3csIHdlIGNhbiBjb25jbHVkZSB0aGUgZm9sbG93aW5nIGFib3V0CisjIHRhYmxlIGNvbnN0cnVjdGlvbnMgd2hlbiBzcGVlZCBpcyBhbiBpc3N1ZS4KKyMgRm9yIGZpcnN0LXRpbWUgZmFzdCBjb25zdHJ1Y3Rpb24gb2YgdGFibGVzLCBpdCdzIGJlc3QgdG8gdXNlIHRoZQorIyAgIGVjaG8gKyBlYnRhYmxlc2QgbWV0aG9kLiBJZiB0aGUgZWNobyBtZXRob2QgaXMgdW53YW50ZWQsIGl0CisjICAgaXMgYmVzdCB0byB1c2UgdGhlIGVidGFibGVzdSArIGVidGFibGVzZCBtZXRob2QuCisjICAgVGhlIGVjaG8gbWV0aG9kIGlzIG11Y2ggZmFzdGVyIGJlY2F1c2UgZWNobyBpcyBhIGJhc2gKKyMgICBidWlsdC1pbiBjb21tYW5kLgorIyAgIFBlcmhhcHMgaW50aWFsaXplIHRoZSBrZXJuZWwgdGFibGVzIHRvIGVtcHR5IGNoYWlucyB3aXRoCisjICAgcG9saWN5IERST1AgYmVmb3JlIGNvbnN0cnVjdGluZyB0aGUgdGFibGUgaW4gdXNlcnNwYWNlLgorIyBGb3IgY29uc3RydWN0aW9uIG9mIHRhYmxlcyB0aGF0IHdlcmUgY29uc3RydWN0ZWQgZWFybGllciwgaXQKKyMgICBpcyBiZXN0IHRvIHNhdmUgdGhvc2UgY29uc3RydWN0ZWQgdGFibGVzIHRvIGEgYmluYXJ5IGZpbGUKKyMgICBhbmQgdGhlbiB1c2UgLS1hdG9taWMtY29tbWl0IHRvIGdldCB0aGUgdGFibGUgaW4gdGhlIGtlcm5lbAorIyAgICh0aGlzIGlzIGxpZ2h0bmluZyBmYXN0IGNvbXBhcmVkIHdpdGggdGhlIG90aGVyIG1ldGhvZHMpLgorIworIyBTeXN0ZW0gc3BlY3M6CisjIHByb2Nlc3NvciAgICAgICA6IDAKKyMgdmVuZG9yX2lkICAgICAgIDogQXV0aGVudGljQU1ECisjIGNwdSBmYW1pbHkgICAgICA6IDYKKyMgbW9kZWwgICAgICAgICAgIDogNAorIyBtb2RlbCBuYW1lICAgICAgOiBBTUQgQXRobG9uKHRtKSBwcm9jZXNzb3IKKyMgc3RlcHBpbmcgICAgICAgIDogNAorIyBjcHUgTUh6ICAgICAgICAgOiAxMDAwLjU5MgorIyBjYWNoZSBzaXplICAgICAgOiAyNTYgS0IKKyMgTWVtVG90YWwgICAgICAgIDogNTE1NzgwIGtCCisjCisjIyMjMTAgcnVsZXMjIyMjCisjCisjIHJlYWwgICAgMG0wLjA3OHMKKyMgdXNlciAgICAwbTAuMDMwcworIyBzeXMgICAgIDBtMC4wNDVzCisjIGFkZGVkIDEwIHJ1bGVzIHdpdGggZWNobworIworIyByZWFsICAgIDBtMC4wOThzCisjIHVzZXIgICAgMG0wLjAzMXMKKyMgc3lzICAgICAwbTAuMDYzcworIyBhZGRlZCAxMCBydWxlcyB3aXRoIGVidGFibGVzCisjCisjIHJlYWwgICAgMG0wLjI3NXMKKyMgdXNlciAgICAwbTAuMDgzcworIyBzeXMgICAgIDBtMC4xODhzCisjIGFkZGVkIDEwIHJ1bGVzIHdpdGggZWJ0YWJsZXN1CisjCisjIHJlYWwgICAgMG0wLjI3OXMKKyMgdXNlciAgICAwbTAuMDgycworIyBzeXMgICAgIDBtMC4xOTJzCisjIGFkZGVkIDEwIHJ1bGVzIHdpdGggYXRvbWljLWZpbGUKKyMKKyMgcmVhbCAgICAwbTAuMDE3cworIyB1c2VyICAgIDBtMC4wMDlzCisjIHN5cyAgICAgMG0wLjAwOHMKKyMgYWRkZWQgMTAgcnVsZXMgd2l0aCBvbmUgYXRvbWljLWNvbW1pdAorIworIyByZWFsICAgIDBtMC4wOTVzCisjIHVzZXIgICAgMG0wLjA1MHMKKyMgc3lzICAgICAwbTAuMDQzcworIyBhZGRlZCAxMDAgcnVsZXMgd2l0aCBlY2hvCisjCisjIHJlYWwgICAgMG0wLjkzNnMKKyMgdXNlciAgICAwbTAuMzE1cworIyBzeXMgICAgIDBtMC41ODdzCisjIGFkZGVkIDEwMCBydWxlcyB3aXRoIGVidGFibGVzCisjCisjIHJlYWwgICAgMG0xLjk2N3MKKyMgdXNlciAgICAwbTAuNDQ5cworIyBzeXMgICAgIDBtMS40NzlzCisjIGFkZGVkIDEwMCBydWxlcyB3aXRoIGVidGFibGVzdQorIworIyByZWFsICAgIDBtMi40NzJzCisjIHVzZXIgICAgMG0wLjc0NXMKKyMgc3lzICAgICAwbTEuNjYwcworIyBhZGRlZCAxMDAgcnVsZXMgd2l0aCBhdG9taWMtZmlsZQorIworIyByZWFsICAgIDBtMC4wMThzCisjIHVzZXIgICAgMG0wLjAwNnMKKyMgc3lzICAgICAwbTAuMDEycworIyBhZGRlZCAxMDAgcnVsZXMgd2l0aCBvbmUgYXRvbWljLWNvbW1pdAorIworIyByZWFsICAgIDBtMC43NDBzCisjIHVzZXIgICAgMG0wLjQ2MXMKKyMgc3lzICAgICAwbTAuMjY1cworIyBhZGRlZCAxMDAwIHJ1bGVzIHdpdGggZWNobworIworIyByZWFsICAgIDBtMTIuNDcxcworIyB1c2VyICAgIDBtNC40MjNzCisjIHN5cyAgICAgMG03LjgyOHMKKyMgYWRkZWQgMTAwMCBydWxlcyB3aXRoIGVidGFibGVzCisjCisjIHJlYWwgICAgMG0xNy43MTVzCisjIHVzZXIgICAgMG02LjgxNHMKKyMgc3lzICAgICAwbTEwLjYwNHMKKyMgYWRkZWQgMTAwMCBydWxlcyB3aXRoIGVidGFibGVzdQorIworIyByZWFsICAgIDBtMjguMTc2cworIyB1c2VyICAgIDBtOC44NzVzCisjIHN5cyAgICAgMG0xOC43MDRzCisjIGFkZGVkIDEwMDAgcnVsZXMgd2l0aCBhdG9taWMtZmlsZQorIworIyByZWFsICAgIDBtMC4wMjVzCisjIHVzZXIgICAgMG0wLjAxNXMKKyMgc3lzICAgICAwbTAuMDEwcworIyBhZGRlZCAxMDAwIHJ1bGVzIHdpdGggb25lIGF0b21pYy1jb21taXQKKyMKKyMgcmVhbCAgICAxbTExLjQ3NHMKKyMgdXNlciAgICAxbTkuNjYycworIyBzeXMgICAgIDBtMS4wMzVzCisjIGFkZGVkIDEwMDAwIHJ1bGVzIHdpdGggZWNobworIworIyByZWFsICAgIDEwbTkuNDE4cworIyB1c2VyICAgIDRtMTkuMTYzcworIyBzeXMgICAgIDVtMzcuNTQ4cworIyBhZGRlZCAxMDAwMCBydWxlcyB3aXRoIGVidGFibGVzCisjCisjIHJlYWwgICAgMm0zMi4xMTlzCisjIHVzZXIgICAgMW0zOC4wODVzCisjIHN5cyAgICAgMG01Mi4yOThzCisjIGFkZGVkIDEwMDAwIHJ1bGVzIHdpdGggZWJ0YWJsZXN1CisjCisjIHJlYWwgICAgMTNtMjMuMzk2cworIyB1c2VyICAgIDVtMjkuNzcwcworIyBzeXMgICAgIDZtNDQuNTk4cworIyBhZGRlZCAxMDAwMCBydWxlcyB3aXRoIGF0b21pYy1maWxlCisjCisjIHJlYWwgICAgMG0wLjMxOXMKKyMgdXNlciAgICAwbTAuMDM3cworIyBzeXMgICAgIDBtMC4wNTdzCisjIGFkZGVkIDEwMDAwIHJ1bGVzIHdpdGggb25lIGF0b21pYy1jb21taXQKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Vsb2cvdGVzdF91bG9nLmMgYi9leGFtcGxlcy91bG9nL3Rlc3RfdWxvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYmQ5MDkKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy91bG9nL3Rlc3RfdWxvZy5jCkBAIC0wLDAgKzEsMjkyIEBACisKKy8qCisgKiBTaW1wbGUgZXhhbXBsZSBwcm9ncmFtIHRvIGxvZyBwYWNrZXRzIHJlY2VpdmVkIHdpdGggdGhlIHVsb2cKKyAqIHdhdGNoZXIgb2YgZWJ0YWJsZXMuCisgKgorICogdXNhZ2U6CisgKiBBZGQgdGhlIGFwcHJvcHJpYXRlIGVidGFibGVzIHVsb2cgcnVsZSwgZS5nLiAoMCA8IE5MR1JPVVAgPCAzMyk6CisgKiAgIGVidGFibGVzIC1BIEZPUldBUkQgLS11bG9nLW5sZ3JvdXAgTkxHUk9VUAorICogU3RhcnQgdGhpcyBhcHBsaWNhdGlvbiBzb21ld2hlcmU6CisgKiAgIHRlc3RfdWxvZyBOTEdST1VQCisgKgorICogY29tcGlsZSB3aXRoIG1ha2UgdGVzdF91bG9nIEtFUk5FTF9JTkNMVURFUz08cGF0aF90b19rZXJuZWxfaW5jbHVkZV9kaXI+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9ldGhlci5oPgorI2luY2x1ZGUgPG5ldGluZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lwX2ljbXAuaD4KKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2VidGFibGVzX3UuaCIKKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2V0aGVybmV0ZGIuaCIKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF91bG9nLmg+CisKKy8qIDxsaW51eC9pZl92bGFuLmg+IGRvZXNuJ3QgaGFuZCB0aGlzIHRvIHVzZXJzcGFjZSA6LSggKi8KKyNkZWZpbmUgVkxBTl9ITEVOIDQKK3N0cnVjdCB2bGFuX2hkciB7CisJdW5zaWduZWQgc2hvcnQgVENJOworCXVuc2lnbmVkIHNob3J0IGVuY2FwOworfTsKKworc3RhdGljIHN0cnVjdCBzb2NrYWRkcl9ubCBzYV9sb2NhbCA9Cit7CisJLm5sX2ZhbWlseSA9IEFGX05FVExJTkssCisJLm5sX2dyb3VwcyA9IDEsCit9OworCitzdGF0aWMgc3RydWN0IHNvY2thZGRyX25sIHNhX2tlcm5lbCA9Cit7CisJLm5sX2ZhbWlseSA9IEFGX05FVExJTkssCisJLm5sX3BpZCA9IDAsCisJLm5sX2dyb3VwcyA9IDEsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqaG9va3N0cltORl9CUl9OVU1IT09LU10gPQoreworICAgICAgICBbTkZfQlJfUE9TVF9ST1VUSU5HXSAiUE9TVFJPVVRJTkciLAorICAgICAgICAgW05GX0JSX1BSRV9ST1VUSU5HXSAiUFJFUk9VVElORyIsCisgICAgICAgICAgIFtORl9CUl9MT0NBTF9PVVRdICJPVVRQVVQiLAorICAgICAgICAgICAgW05GX0JSX0xPQ0FMX0lOXSAiSU5QVVQiLAorICAgICAgICAgICAgW05GX0JSX0JST1VUSU5HXSAiQlJPVVRJTkciLAorICAgICAgICAgICAgIFtORl9CUl9GT1JXQVJEXSAiRk9SV0FSRCIKK307CisKKyNkZWZpbmUgREVCVUdfUVVFVUUgMAorI2RlZmluZSBCVUZMRU4gNjU1MzYKK3N0YXRpYyBjaGFyIGJ1ZltCVUZMRU5dOworc3RhdGljIGludCBzZmQ7CisKKy8qIEdldCB0aGUgbmV4dCBlYnRfdWxvZyBwYWNrZXQsIHRhbGsgdG8gdGhlIGtlcm5lbCBpZiBuZWNlc3NhcnkgKi8KK2VidF91bG9nX3BhY2tldF9tc2dfdCAqdWxvZ19nZXRfcGFja2V0KCkKK3sKKwlzdGF0aWMgc3RydWN0IG5sbXNnaGRyICpubGggPSBOVUxMOworCXN0YXRpYyBpbnQgbGVuLCByZW1haW5fbGVuOworCXN0YXRpYyBpbnQgcGt0c19wZXJfbXNnID0gMDsKKwllYnRfdWxvZ19wYWNrZXRfbXNnX3QgKm1zZzsKKwlzb2NrbGVuX3QgYWRkcmxlbiA9IHNpemVvZihzYV9rZXJuZWwpOworCisJaWYgKCFubGgpIHsKK3JlY3ZfbmV3OgorCQlpZiAocGt0c19wZXJfbXNnICYmIERFQlVHX1FVRVVFKQorCQkJcHJpbnRmKCJQQUNLRVRTIElOIExBU1QgTVNHOiAlZFxuIiwgcGt0c19wZXJfbXNnKTsKKwkJcGt0c19wZXJfbXNnID0gMDsKKwkJbGVuID0gcmVjdmZyb20oc2ZkLCBidWYsIEJVRkxFTiwgMCwKKwkJICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZzYV9rZXJuZWwsICZhZGRybGVuKTsKKwkJaWYgKGFkZHJsZW4gIT0gc2l6ZW9mKHNhX2tlcm5lbCkpIHsKKwkJCXByaW50ZigiYWRkcmxlbiAldSAhPSAldVxuIiwgYWRkcmxlbiwKKwkJCSAgICAgICAodWludDMyX3Qpc2l6ZW9mKHNhX2tlcm5lbCkpOworCQkJZXhpdCgtMSk7CisJCX0KKwkJaWYgKGxlbiA9PSAtMSkgeworCQkJcGVycm9yKCJyZWN2bXNnIik7CisJCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQkJZ290byByZWN2X25ldzsKKwkJCWV4aXQoLTEpOworCQl9CisJCW5saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKilidWY7CisJCWlmIChubGgtPm5sbXNnX2ZsYWdzICYgTVNHX1RSVU5DIHx8IGxlbiA+IEJVRkxFTikgeworCQkJcHJpbnRmKCJQYWNrZXQgdHJ1bmNhdGVkIik7CisJCQlleGl0KC0xKTsKKwkJfQorCQlpZiAoIU5MTVNHX09LKG5saCwgQlVGTEVOKSkgeworCQkJcGVycm9yKCJOZXRsaW5rIG1lc3NhZ2UgcGFyc2UgZXJyb3JcbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKKwltc2cgPSBOTE1TR19EQVRBKG5saCk7CisKKwlyZW1haW5fbGVuID0gKGxlbiAtICgoY2hhciAqKW5saCAtIGJ1ZikpOworCWlmIChubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfTVVMVEkgJiYgbmxoLT5ubG1zZ190eXBlICE9IE5MTVNHX0RPTkUpCisJCW5saCA9IE5MTVNHX05FWFQobmxoLCByZW1haW5fbGVuKTsKKwllbHNlCisJCW5saCA9IE5VTEw7CisKKwlwa3RzX3Blcl9tc2crKzsKKwlyZXR1cm4gbXNnOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGksIGN1cnJfbGVuLCBwa3RjbnQgPSAwOworCWludCByY3ZidWZzaXplID0gQlVGTEVOOworCWVidF91bG9nX3BhY2tldF9tc2dfdCAqbXNnOworCXN0cnVjdCBldGhoZHIgKmVoZHI7CisJc3RydWN0IGV0aGVydHlwZWVudCAqZXR5cGU7CisJc3RydWN0IHByb3RvZW50ICpwcm90b3R5cGU7CisJc3RydWN0IGlwaGRyICppcGg7CisJc3RydWN0IGljbXBoZHIgKmljbXBoOworCXN0cnVjdCB0bSogcHRtOworCWNoYXIgdGltZV9zdHJbNDBdLCAqY3RtcDsKKworCWlmIChhcmdjID09IDIpIHsKKwkJaSA9IHN0cnRvdWwoYXJndlsxXSwgJmN0bXAsIDEwKTsKKwkJaWYgKCpjdG1wICE9ICdcMCcgfHwgaSA8IDEgfHwgaSA+IDMyKSB7CisJCQlwcmludGYoIlVzYWdlOiAlcyA8Z3JvdXAgbnVtYmVyPlxuV2l0aCAgMCA8IGdyb3VwICIKKwkJCSAgICAgICAibnVtYmVyIDwgMzNcbiIsIGFyZ3ZbMF0pOworCQkJZXhpdCgwKTsKKwkJfQorCQlzYV9sb2NhbC5ubF9ncm91cHMgPSBzYV9rZXJuZWwubmxfZ3JvdXBzID0gMSA8PCAoaSAtIDEpOworCX0KKworCXNhX2xvY2FsLm5sX3BpZCA9IGdldHBpZCgpOworCXNmZCA9IHNvY2tldChQRl9ORVRMSU5LLCBTT0NLX1JBVywgTkVUTElOS19ORkxPRyk7CisJaWYgKCFzZmQpIHsKKwkJcGVycm9yKCJzb2NrZXQiKTsKKwkJZXhpdCgtMSk7CisJfQorCisJaWYgKGJpbmQoc2ZkLCAoc3RydWN0IHNvY2thZGRyICopKCZzYV9sb2NhbCksIHNpemVvZihzYV9sb2NhbCkpID09CisJICAgIC0xKSB7CisJCXBlcnJvcigiYmluZCIpOworCQlleGl0KC0xKTsKKwl9CisJaSA9IHNldHNvY2tvcHQoc2ZkLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsICZyY3ZidWZzaXplLAorCSAgICAgICAgICAgICAgIHNpemVvZihyY3ZidWZzaXplKSk7CisKKwl3aGlsZSAoMSkgeworCQlpZiAoIShtc2cgPSB1bG9nX2dldF9wYWNrZXQoKSkpCisJCQljb250aW51ZTsKKworCQlpZiAobXNnLT52ZXJzaW9uICE9IEVCVF9VTE9HX1ZFUlNJT04pIHsKKwkJCXByaW50ZigiV1JPTkcgVkVSU0lPTjogJWQgSU5TVEVBRCBPRiAlZFxuIiwKKwkJCSAgICAgICBtc2ctPnZlcnNpb24sIEVCVF9VTE9HX1ZFUlNJT04pOworCQkJY29udGludWU7CisJCX0KKwkJcHJpbnRmKCJQQUNLRVQgTlI6ICVkXG4iLCArK3BrdGNudCk7CisJCWlwaCA9IE5VTEw7CisJCWN1cnJfbGVuID0gRVRIX0hMRU47CisKKwkJcHJpbnRmKCJJTkRFVj0lc1xuT1VUREVWPSVzXG5QSFlTSU5ERVY9JXNcblBIWVNPVVRERVY9JXNcbiIKKwkJICAgICAgICJQUkVGSVg9JyVzJyIsIG1zZy0+aW5kZXYsIG1zZy0+b3V0ZGV2LCBtc2ctPnBoeXNpbmRldiwKKwkJICAgICAgIG1zZy0+cGh5c291dGRldiwgbXNnLT5wcmVmaXgpOworCisJCXB0bSA9IGxvY2FsdGltZSgmbXNnLT5zdGFtcC50dl9zZWMpOworCQlzdHJmdGltZSAodGltZV9zdHIsIHNpemVvZih0aW1lX3N0ciksICIlWS0lbS0lZCAlSDolTTolUyIsIHB0bSk7CisJCXByaW50ZigiXG5BUlJJVkFMIFRJTUU6ICVzXG5NQVJLPSVsdVxuSE9PSz0lc1xuIiwgdGltZV9zdHIsCisJCSAgICAgICBtc2ctPm1hcmssIGhvb2tzdHJbbXNnLT5ob29rXSk7CisKKwkJaWYgKG1zZy0+ZGF0YV9sZW4gPCBjdXJyX2xlbikgeworCQkJcHJpbnRmKCI9PT09PlBhY2tldCBzbWFsbGVyIHRoYW4gRXRoZXJuZXQgaGVhZGVyICIKKwkJCSAgICAgICAibGVuZ3RoPD09PT1cbiIpOworCQkJZ290byBsZXRzY29udGludWU7CisJCX0KKworCQlwcmludGYoIjo6Ojo6Ojo6RVRIRVJORVQ6SEVBREVSOjo6Ojo6OjpcbiIpOworCisJCWVoZHIgPSAoc3RydWN0IGV0aGhkciAqKW1zZy0+ZGF0YTsKKwkJcHJpbnRmKCJNQUMgU1JDPSVzXG4iLCBldGhlcl9udG9hKChjb25zdCBzdHJ1Y3QgZXRoZXJfYWRkciAqKQorCQkgICAgICAgZWhkci0+aF9zb3VyY2UpKTsKKwkJcHJpbnRmKCJNQUMgRFNUPSVzXG5FVEhFUk5FVCBQUk9UT0NPTD0iLCBldGhlcl9udG9hKAorCQkgICAgICAgKGNvbnN0IHN0cnVjdCBldGhlcl9hZGRyICopZWhkci0+aF9kZXN0KSk7CisJCWV0eXBlID0gZ2V0ZXRoZXJ0eXBlYnludW1iZXIobnRvaHMoZWhkci0+aF9wcm90bykpOworCQlpZiAoIWV0eXBlKQorCQkJcHJpbnRmKCIweCV4XG4iLCBudG9ocyhlaGRyLT5oX3Byb3RvKSk7CisJCWVsc2UKKwkJCXByaW50ZigiJXNcbiIsIGV0eXBlLT5lX25hbWUpOworCisJCWlmIChlaGRyLT5oX3Byb3RvID09IGh0b25zKEVUSF9QXzgwMjFRKSkgeworCQkJc3RydWN0IHZsYW5faGRyICp2bGFuaCA9IChzdHJ1Y3Qgdmxhbl9oZHIgKikKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoY2hhciAqKWVoZHIpICsgY3Vycl9sZW4pOworCQkJcHJpbnRmKCI6Ojo6Ojo6Ojo6VkxBTjpIRUFERVI6Ojo6Ojo6Ojo6XG4iKTsKKwkJCWN1cnJfbGVuICs9IFZMQU5fSExFTjsKKwkJCWlmIChtc2ctPmRhdGFfbGVuIDwgY3Vycl9sZW4pIHsKKwkJCQlwcmludGYoIj09PT0+UGFja2V0IG9ubHkgY29udGFpbnMgcGFydGlhbCAiCisJCQkJICAgICAgICJWTEFOIGhlYWRlcjw9PT09XG4iKTsKKwkJCQlnb3RvIGxldHNjb250aW51ZTsKKwkJCX0KKworCQkJcHJpbnRmKCJWTEFOIFRDST0lZFxuIiwgbnRvaHModmxhbmgtPlRDSSkpOworCQkJcHJpbnRmKCJWTEFOIEVOQ0FQUyBQUk9UT0NPTD0iKTsKKwkJCWV0eXBlID0gZ2V0ZXRoZXJ0eXBlYnludW1iZXIobnRvaHModmxhbmgtPmVuY2FwKSk7CisJCQlpZiAoIWV0eXBlKQorCQkJCXByaW50ZigiMHgleFxuIiwgbnRvaHModmxhbmgtPmVuY2FwKSk7CisJCQllbHNlCisJCQkJcHJpbnRmKCIlc1xuIiwgZXR5cGUtPmVfbmFtZSk7CisJCQlpZiAoZWhkci0+aF9wcm90byA9PSBodG9ucyhFVEhfUF9JUCkpCisJCQkJaXBoID0gKHN0cnVjdCBpcGhkciAqKSh2bGFuaCArIDEpOworCQl9IGVsc2UgaWYgKGVoZHItPmhfcHJvdG8gPT0gaHRvbnMoRVRIX1BfSVApKQorCQkJaXBoID0gKHN0cnVjdCBpcGhkciAqKSgoKGNoYXIgKillaGRyKSArIGN1cnJfbGVuKTsKKwkJaWYgKCFpcGgpCisJCQlnb3RvIGxldHNjb250aW51ZTsKKworCQljdXJyX2xlbiArPSBzaXplb2Yoc3RydWN0IGlwaGRyKTsKKwkJaWYgKG1zZy0+ZGF0YV9sZW4gPCBjdXJyX2xlbiB8fCBtc2ctPmRhdGFfbGVuIDwKKwkJICAgIChjdXJyX2xlbiArPSBpcGgtPmlobCAqIDQgLSBzaXplb2Yoc3RydWN0IGlwaGRyKSkpIHsKKwkJCXByaW50ZigiPT09PT5QYWNrZXQgb25seSBjb250YWlucyBwYXJ0aWFsIElQICIKKwkJCSAgICAgICAiaGVhZGVyPD09PT1cbiIpOworCQkJZ290byBsZXRzY29udGludWU7CisJCX0KKworCQlwcmludGYoIjo6Ojo6Ojo6Ojo6SVA6SEVBREVSOjo6Ojo6Ojo6OjpcbiIpOworCQlwcmludGYoIklQIFNSQyBBRERSPSIpOworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQkJcHJpbnRmKCIlZCVzIiwgKCh1bnNpZ25lZCBjaGFyICopJmlwaC0+c2FkZHIpW2ldLAorCQkJICAgKGkgPT0gMykgPyAiIiA6ICIuIik7CisJCXByaW50ZigiXG5JUCBERVNUIEFERFI9Iik7CisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCQlwcmludGYoIiVkJXMiLCAoKHVuc2lnbmVkIGNoYXIgKikmaXBoLT5kYWRkcilbaV0sCisJCQkgICAoaSA9PSAzKSA/ICIiIDogIi4iKTsKKwkJcHJpbnRmKCJcbklQIFBST1RPQ09MPSIpOworCQlpZiAoIShwcm90b3R5cGUgPSBnZXRwcm90b2J5bnVtYmVyKGlwaC0+cHJvdG9jb2wpKSkKKwkJCXByaW50ZigiJWRcbiIsIGlwaC0+cHJvdG9jb2wpOworCQllbHNlCisJCQlwcmludGYoIiVzXG4iLCBwcm90b3R5cGUtPnBfbmFtZSk7CisKKwkJaWYgKGlwaC0+cHJvdG9jb2wgIT0gSVBQUk9UT19JQ01QKQorCQkJZ290byBsZXRzY29udGludWU7CisKKwkJaWNtcGggPSAoc3RydWN0IGljbXBoZHIgKikoKChjaGFyICopZWhkcikgKyBjdXJyX2xlbik7CisJCWN1cnJfbGVuICs9IDQ7CisJCWlmIChtc2ctPmRhdGFfbGVuIDwgY3Vycl9sZW4pIHsKK3RydW5jYXRlZF9pY21wOgorCQkJcHJpbnRmKCI9PT09PlBhY2tldCBvbmx5IGNvbnRhaW5zIHBhcnRpYWwgSUNNUCAiCisJCQkgICAgICAgImhlYWRlcjw9PT09XG4iKTsKKwkJCWdvdG8gbGV0c2NvbnRpbnVlOworCQl9CisJCWlmIChpY21waC0+dHlwZSAhPSBJQ01QX0VDSE8gJiYgaWNtcGgtPnR5cGUgIT0gSUNNUF9FQ0hPUkVQTFkpCisJCQlnb3RvIGxldHNjb250aW51ZTsKKworCQljdXJyX2xlbiArPSA0OworCQlpZiAobXNnLT5kYXRhX2xlbiA8IGN1cnJfbGVuKQorCQkJZ290byB0cnVuY2F0ZWRfaWNtcDsKKwkJLyogTm9ybWFsbHkgdGhlIHByb2Nlc3MgaWQsIGl0J3Mgc2VudCBvdXQgaW4gbWFjaGluZQorCQkgKiBieXRlIG9yZGVyICovCisKKwkJcHJpbnRmKCJJQ01QX0VDSE8gSURFTlRJRklFUj0ldVxuIiwgaWNtcGgtPnVuLmVjaG8uaWQpOworCQlwcmludGYoIklDTVBfRUNITyBTRVEgTlI9JXVcbiIsIG50b2hzKGljbXBoLT51bi5lY2hvLnNlcXVlbmNlKSk7CisKK2xldHNjb250aW51ZToKKwkJcHJpbnRmKCI9PT0+VG90YWwgUGFja2V0IGxlbmd0aDogJWxkLCBvZiB3aGljaCB3ZSBleGFtaW5lZCAiCisJCSAgICAgICAiJWQgYnl0ZXNcbiIsIG1zZy0+ZGF0YV9sZW4sIGN1cnJfbGVuKTsKKwkJcHJpbnRmKCIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4iCisJCSAgICAgICAiIyMjIyMjRU5EI09GIyNQQUNLRVQjRFVNUCMjIyMjI1xuIgorCQkgICAgICAgIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiIpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9lYnRfODAyXzMuYyBiL2V4dGVuc2lvbnMvZWJ0XzgwMl8zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcwZmQ0NAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZWJ0XzgwMl8zLmMKQEAgLTAsMCArMSwxNDcgQEAKKy8qIDgwMl8zCisgKgorICogQXV0aG9yOgorICogQ2hyaXMgVml0YWxlIDxjc3ZAYmx1ZXRhaWwuY29tPgorICoKKyAqIE1heSAyMDAzCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSAiLi4vaW5jbHVkZS9lYnRhYmxlc191LmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9ldGhlcm5ldGRiLmgiCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfODAyXzMuaD4KKworI2RlZmluZSBfODAyXzNfU0FQICcxJworI2RlZmluZSBfODAyXzNfVFlQRSAnMicKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gb3B0c1tdID0KK3sKKwl7ICI4MDJfMy1zYXAiICAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgXzgwMl8zX1NBUCB9LAorCXsgIjgwMl8zLXR5cGUiICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBfODAyXzNfVFlQRSB9LAorCXsgMCB9Cit9OworCitzdGF0aWMgdm9pZCBwcmludF9oZWxwKCkKK3sKKwlwcmludGYoCisiODAyXzMgb3B0aW9uczpcbiIKKyItLTgwMl8zLXNhcCBbIV0gcHJvdG9jb2wgICAgICAgOiA4MDIuMyBEU0FQL1NTQVAtIDEgYnl0ZSB2YWx1ZSAoaGV4KVxuIgorIiAgRFNBUCBhbmQgU1NBUCBhcmUgYWx3YXlzIHRoZSBzYW1lLiAgT25lIFNBUCBhcHBsaWVzIHRvIGJvdGggZmllbGRzXG4iCisiLS04MDJfMy10eXBlIFshXSBwcm90b2NvbCAgICAgIDogODAyLjMgU05BUCBUeXBlLSAyIGJ5dGUgdmFsdWUgKGhleClcbiIKKyIgIFR5cGUgaW1wbGllcyBTQVAgdmFsdWUgMHhhYVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGluaXQoc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbWF0Y2gpCit7CisJc3RydWN0IGVidF84MDJfM19pbmZvICppbmZvID0gKHN0cnVjdCBlYnRfODAyXzNfaW5mbyAqKW1hdGNoLT5kYXRhOworCisJaW5mby0+aW52ZmxhZ3MgPSAwOworCWluZm8tPmJpdG1hc2sgPSAwOworfQorCitzdGF0aWMgaW50IHBhcnNlKGludCBjLCBjaGFyICoqYXJndiwgaW50IGFyZ2MsIGNvbnN0IHN0cnVjdCBlYnRfdV9lbnRyeSAqZW50cnksCisgICB1bnNpZ25lZCBpbnQgKmZsYWdzLCBzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICoqbWF0Y2gpCit7CisJc3RydWN0IGVidF84MDJfM19pbmZvICppbmZvID0gKHN0cnVjdCBlYnRfODAyXzNfaW5mbyAqKSAoKm1hdGNoKS0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgaTsKKwljaGFyICplbmQ7CisKKwlzd2l0Y2ggKGMpIHsKKwkJY2FzZSBfODAyXzNfU0FQOgorCQkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIF84MDJfM19TQVApOworCQkJaWYgKGVidF9jaGVja19pbnZlcnNlMihvcHRhcmcpKQorCQkJCWluZm8tPmludmZsYWdzIHw9IEVCVF84MDJfM19TQVA7CisJCQlpID0gc3RydG91bChvcHRhcmcsICZlbmQsIDE2KTsKKwkJCWlmIChpID4gMjU1IHx8ICplbmQgIT0gJ1wwJykgCisJCQkJZWJ0X3ByaW50X2Vycm9yMigiUHJvYmxlbSB3aXRoIHNwZWNpZmllZCAiCisJCQkJCQkic2FwIGhleCB2YWx1ZSwgJXgiLGkpOworCQkJaW5mby0+c2FwID0gaTsgLyogb25lIGJ5dGUsIHNvIG5vIGJ5dGUgb3JkZXIgd29ycmllcyAqLworCQkJaW5mby0+Yml0bWFzayB8PSBFQlRfODAyXzNfU0FQOworCQkJYnJlYWs7CisJCWNhc2UgXzgwMl8zX1RZUEU6CisJCQllYnRfY2hlY2tfb3B0aW9uMihmbGFncywgXzgwMl8zX1RZUEUpOworCQkJaWYgKGVidF9jaGVja19pbnZlcnNlMihvcHRhcmcpKQorCQkJCWluZm8tPmludmZsYWdzIHw9IEVCVF84MDJfM19UWVBFOworCQkJaSA9IHN0cnRvdWwob3B0YXJnLCAmZW5kLCAxNik7CisJCQlpZiAoaSA+IDY1NTM1IHx8ICplbmQgIT0gJ1wwJykgeworCQkJCWVidF9wcmludF9lcnJvcjIoIlByb2JsZW0gd2l0aCB0aGUgc3BlY2lmaWVkICIKKwkJCQkJCSJ0eXBlIGhleCB2YWx1ZSwgJXgiLGkpOworCQkJfQorCQkJaW5mby0+dHlwZSA9IGh0b25zKGkpOworCQkJaW5mby0+Yml0bWFzayB8PSBFQlRfODAyXzNfVFlQRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBmaW5hbF9jaGVjayhjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbWF0Y2gsIGNvbnN0IGNoYXIgKm5hbWUsCisgICB1bnNpZ25lZCBpbnQgaG9va21hc2ssIHVuc2lnbmVkIGludCB0aW1lKQoreworCWlmICghKGVudHJ5LT5iaXRtYXNrICYgRUJUXzgwMl8zKSkKKwkJZWJ0X3ByaW50X2Vycm9yKCJGb3IgODAyLjMgRFNBUC9TU0FQIGZpbHRlcmluZyB0aGUgcHJvdG9jb2wgIgorCQkJCSJtdXN0IGJlIExFTkdUSCIpOworfQorCitzdGF0aWMgdm9pZCBwcmludChjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbWF0Y2gpCit7CisJc3RydWN0IGVidF84MDJfM19pbmZvICppbmZvID0gKHN0cnVjdCBlYnRfODAyXzNfaW5mbyAqKW1hdGNoLT5kYXRhOworCisJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfODAyXzNfU0FQKSB7CisJCXByaW50ZigiLS04MDJfMy1zYXAgIik7CisJCWlmIChpbmZvLT5pbnZmbGFncyAmIEVCVF84MDJfM19TQVApCisJCQlwcmludGYoIiEgIik7CisJCXByaW50ZigiMHglLjJ4ICIsIGluZm8tPnNhcCk7CisJfQorCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUXzgwMl8zX1RZUEUpIHsKKwkJcHJpbnRmKCItLTgwMl8zLXR5cGUgIik7CisJCWlmIChpbmZvLT5pbnZmbGFncyAmIEVCVF84MDJfM19UWVBFKQorCQkJcHJpbnRmKCIhICIpOworCQlwcmludGYoIjB4JS40eCAiLCBudG9ocyhpbmZvLT50eXBlKSk7CisJfQorfQorCitzdGF0aWMgaW50IGNvbXBhcmUoY29uc3Qgc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbTEsCisgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICptMikKK3sKKwlzdHJ1Y3QgZWJ0XzgwMl8zX2luZm8gKmluZm8xID0gKHN0cnVjdCBlYnRfODAyXzNfaW5mbyAqKW0xLT5kYXRhOworCXN0cnVjdCBlYnRfODAyXzNfaW5mbyAqaW5mbzIgPSAoc3RydWN0IGVidF84MDJfM19pbmZvICopbTItPmRhdGE7CisKKwlpZiAoaW5mbzEtPmJpdG1hc2sgIT0gaW5mbzItPmJpdG1hc2spCisJCXJldHVybiAwOworCWlmIChpbmZvMS0+aW52ZmxhZ3MgIT0gaW5mbzItPmludmZsYWdzKQorCQlyZXR1cm4gMDsKKwlpZiAoaW5mbzEtPmJpdG1hc2sgJiBFQlRfODAyXzNfU0FQKSB7CisJCWlmIChpbmZvMS0+c2FwICE9IGluZm8yLT5zYXApIAorCQkJcmV0dXJuIDA7CisJfQorCWlmIChpbmZvMS0+Yml0bWFzayAmIEVCVF84MDJfM19UWVBFKSB7CisJCWlmIChpbmZvMS0+dHlwZSAhPSBpbmZvMi0+dHlwZSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBlYnRfdV9tYXRjaCBfODAyXzNfbWF0Y2ggPSAKK3sKKwkubmFtZQkJPSAiODAyXzMiLAorCS5zaXplCQk9IHNpemVvZihzdHJ1Y3QgZWJ0XzgwMl8zX2luZm8pLAorCS5oZWxwCQk9IHByaW50X2hlbHAsCisJLmluaXQJCT0gaW5pdCwKKwkucGFyc2UJCT0gcGFyc2UsCisJLmZpbmFsX2NoZWNrCT0gZmluYWxfY2hlY2ssCisJLnByaW50CQk9IHByaW50LAorCS5jb21wYXJlCT0gY29tcGFyZSwKKwkuZXh0cmFfb3BzCT0gb3B0cywKK307CisKK3N0YXRpYyB2b2lkIF9JTklUKHZvaWQpCit7CisJZWJ0X3JlZ2lzdGVyX21hdGNoKCZfODAyXzNfbWF0Y2gpOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9lYnRfQVVESVQuYyBiL2V4dGVuc2lvbnMvZWJ0X0FVRElULmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliZWZjYwotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZWJ0X0FVRElULmMKQEAgLTAsMCArMSwxMTAgQEAKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSAiLi4vaW5jbHVkZS9lYnRhYmxlc191LmgiCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X0FVRElULmg+CisKKyNkZWZpbmUgQVVESVRfVFlQRSAgJzEnCitzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRzW10gPQoreworCXsgImF1ZGl0LXR5cGUiICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIEFVRElUX1RZUEUgfSwKKwl7IDAgfQorfTsKKworc3RhdGljIHZvaWQgcHJpbnRfaGVscCgpCit7CisJcHJpbnRmKAorCSJBVURJVCB0YXJnZXQgb3B0aW9uczpcbiIKKwkiIC0tYXVkaXQtdHlwZSBUWVBFICAgICAgICAgIDogU2V0IGFjdGlvbiB0eXBlIHRvIHJlY29yZC5cbiIpOworfQorCitzdGF0aWMgdm9pZCBpbml0KHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICp0YXJnZXQpCit7CisJc3RydWN0IHh0X0FVRElUX2luZm8gKmluZm8gPSAoc3RydWN0IHh0X0FVRElUX2luZm8gKikgdGFyZ2V0LT5kYXRhOworCisJaW5mby0+dHlwZSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2UoaW50IGMsIGNoYXIgKiphcmd2LCBpbnQgYXJnYywKKyAgIGNvbnN0IHN0cnVjdCBlYnRfdV9lbnRyeSAqZW50cnksIHVuc2lnbmVkIGludCAqZmxhZ3MsCisgICBzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqKnRhcmdldCkKK3sKKwlzdHJ1Y3QgeHRfQVVESVRfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgeHRfQVVESVRfaW5mbyAqKSAoKnRhcmdldCktPmRhdGE7CisKKwlzd2l0Y2ggKGMpIHsKKwljYXNlIEFVRElUX1RZUEU6CisJCWVidF9jaGVja19vcHRpb24yKGZsYWdzLCBBVURJVF9UWVBFKTsKKworCQlpZiAoIXN0cmNhc2VjbXAob3B0YXJnLCAiYWNjZXB0IikpCisJCQlpbmZvLT50eXBlID0gWFRfQVVESVRfVFlQRV9BQ0NFUFQ7CisJCWVsc2UgaWYgKCFzdHJjYXNlY21wKG9wdGFyZywgImRyb3AiKSkKKwkJCWluZm8tPnR5cGUgPSBYVF9BVURJVF9UWVBFX0RST1A7CisJCWVsc2UgaWYgKCFzdHJjYXNlY21wKG9wdGFyZywgInJlamVjdCIpKQorCQkJaW5mby0+dHlwZSA9IFhUX0FVRElUX1RZUEVfUkVKRUNUOworCQllbHNlCisJCQllYnRfcHJpbnRfZXJyb3IyKCJCYWQgYWN0aW9uIHR5cGUgdmFsdWUgYCVzJyIsIG9wdGFyZyk7CisKKwkJYnJlYWs7CisJIGRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZmluYWxfY2hlY2soY29uc3Qgc3RydWN0IGVidF91X2VudHJ5ICplbnRyeSwKKyAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICp0YXJnZXQsIGNvbnN0IGNoYXIgKm5hbWUsCisgICB1bnNpZ25lZCBpbnQgaG9va21hc2ssIHVuc2lnbmVkIGludCB0aW1lKQoreworfQorCitzdGF0aWMgdm9pZCBwcmludChjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKnRhcmdldCkKK3sKKwljb25zdCBzdHJ1Y3QgeHRfQVVESVRfaW5mbyAqaW5mbyA9CisJCShjb25zdCBzdHJ1Y3QgeHRfQVVESVRfaW5mbyAqKSB0YXJnZXQtPmRhdGE7CisKKwlwcmludGYoIi0tYXVkaXQtdHlwZSAiKTsKKworCXN3aXRjaChpbmZvLT50eXBlKSB7CisJY2FzZSBYVF9BVURJVF9UWVBFX0FDQ0VQVDoKKwkJcHJpbnRmKCJhY2NlcHQiKTsKKwkJYnJlYWs7CisJY2FzZSBYVF9BVURJVF9UWVBFX0RST1A6CisJCXByaW50ZigiZHJvcCIpOworCQlicmVhazsKKwljYXNlIFhUX0FVRElUX1RZUEVfUkVKRUNUOgorCQlwcmludGYoInJlamVjdCIpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZShjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdDEsCisgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdDIpCit7CisJY29uc3Qgc3RydWN0IHh0X0FVRElUX2luZm8gKmluZm8xID0KKwkJKGNvbnN0IHN0cnVjdCB4dF9BVURJVF9pbmZvICopIHQxLT5kYXRhOworCWNvbnN0IHN0cnVjdCB4dF9BVURJVF9pbmZvICppbmZvMiA9CisJCShjb25zdCBzdHJ1Y3QgeHRfQVVESVRfaW5mbyAqKSB0Mi0+ZGF0YTsKKworCXJldHVybiBpbmZvMS0+dHlwZSA9PSBpbmZvMi0+dHlwZTsKK30KKworc3RhdGljIHN0cnVjdCBlYnRfdV90YXJnZXQgQVVESVRfdGFyZ2V0ID0KK3sKKwkubmFtZQkJPSAiQVVESVQiLAorCS5zaXplCQk9IHNpemVvZihzdHJ1Y3QgeHRfQVVESVRfaW5mbyksCisJLmhlbHAJCT0gcHJpbnRfaGVscCwKKwkuaW5pdAkJPSBpbml0LAorCS5wYXJzZQkJPSBwYXJzZSwKKwkuZmluYWxfY2hlY2sJPSBmaW5hbF9jaGVjaywKKwkucHJpbnQJCT0gcHJpbnQsCisJLmNvbXBhcmUJPSBjb21wYXJlLAorCS5leHRyYV9vcHMJPSBvcHRzLAorfTsKKworc3RhdGljIHZvaWQgX0lOSVQodm9pZCkKK3sKKwllYnRfcmVnaXN0ZXJfdGFyZ2V0KCZBVURJVF90YXJnZXQpOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9lYnRfYW1vbmcuYyBiL2V4dGVuc2lvbnMvZWJ0X2Ftb25nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBjMDk4YwotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZWJ0X2Ftb25nLmMKQEAgLTAsMCArMSw0OTcgQEAKKy8qIGVidF9hbW9uZworICoKKyAqIEF1dGhvcnM6CisgKiBHcnplZ29yeiBCb3Jvd2lhayA8Z3J6ZXNAZ251LnVuaXYuZ2RhLnBsPgorICoKKyAqIEF1Z3VzdCwgMjAwMworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiLi4vaW5jbHVkZS9lYnRhYmxlc191LmgiCisjaW5jbHVkZSA8bmV0aW5ldC9ldGhlci5oPgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZXRoZXJuZXRkYi5oIgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfYW1vbmcuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2RlZmluZSBBTU9OR19EU1QgJzEnCisjZGVmaW5lIEFNT05HX1NSQyAnMicKKyNkZWZpbmUgQU1PTkdfRFNUX0YgJzMnCisjZGVmaW5lIEFNT05HX1NSQ19GICc0JworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBvcHRzW10gPSB7CisJeyJhbW9uZy1kc3QiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgQU1PTkdfRFNUfSwKKwl7ImFtb25nLXNyYyIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBBTU9OR19TUkN9LAorCXsiYW1vbmctZHN0LWZpbGUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgQU1PTkdfRFNUX0Z9LAorCXsiYW1vbmctc3JjLWZpbGUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgQU1PTkdfU1JDX0Z9LAorCXswfQorfTsKKworI2lmZGVmIERFQlVHCitzdGF0aWMgdm9pZCBoZXhkdW1wKGNvbnN0IHZvaWQgKm1lbSwgaW50IGhvd21hbnkpCit7CisJcHJpbnRmKCJcbiIpOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSBtZW07CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaG93bWFueTsgaSsrKSB7CisJCWlmIChpICUgMzIgPT0gMCkgeworCQkJcHJpbnRmKCJcbiUwNHg6ICIsIGkpOworCQl9CisJCXByaW50ZigiJTIuMnglYyIsIHBbaV0sICIuICJbaSAlIDQgPT0gM10pOworCX0KKwlwcmludGYoIlxuIik7Cit9CisjZW5kaWYJCQkJLyogREVCVUcgKi8KKworc3RhdGljIHZvaWQgcHJpbnRfaGVscCgpCit7CisJcHJpbnRmKAorImBhbW9uZycgb3B0aW9uczpcbiIKKyItLWFtb25nLWRzdCAgICAgIFshXSBsaXN0ICAgICAgOiBtYXRjaGVzIGlmIGV0aGVyIGRzdCBpcyBpbiBsaXN0XG4iCisiLS1hbW9uZy1zcmMgICAgICBbIV0gbGlzdCAgICAgIDogbWF0Y2hlcyBpZiBldGhlciBzcmMgaXMgaW4gbGlzdFxuIgorIi0tYW1vbmctZHN0LWZpbGUgWyFdIGZpbGUgICAgICA6IG9idGFpbiBkc3QgbGlzdCBmcm9tIGZpbGVcbiIKKyItLWFtb25nLXNyYy1maWxlIFshXSBmaWxlICAgICAgOiBvYnRhaW4gc3JjIGxpc3QgZnJvbSBmaWxlXG4iCisibGlzdCBoYXMgZm9ybTpcbiIKKyIgeHg6eHg6eHg6eHg6eHg6eHhbPWlwLmlwLmlwLmlwXSx5eTp5eTp5eTp5eTp5eTp5eVs9aXAuaXAuaXAuaXBdIgorIiwuLi4seno6eno6eno6eno6eno6enpbPWlwLmlwLmlwLmlwXVssXVxuIgorIlRoaW5ncyBpbiBicmFja2V0cyBhcmUgb3B0aW9uYWwuXG4iCisiSWYgeW91IHdhbnQgdG8gYWxsb3cgdHdvIChvciBtb3JlKSBJUCBhZGRyZXNzZXMgdG8gb25lIE1BQyBhZGRyZXNzLCB5b3VcbiIKKyJjYW4gc3BlY2lmeSB0d28gKG9yIG1vcmUpIHBhaXJzIHdpdGggdGhlIHNhbWUgTUFDLCBlLmcuXG4iCisiIDAwOjAwOjAwOmZhOmViOmZlPTE1My4xOS4xMjAuMjUwLDAwOjAwOjAwOmZhOmViOmZlPTE5Mi4xNjguMC4xXG4iCisJKTsKK30KK3N0YXRpYyBpbnQgb2xkX3NpemU7CisKK3N0YXRpYyB2b2lkIGluaXQoc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbWF0Y2gpCit7CisJc3RydWN0IGVidF9hbW9uZ19pbmZvICphbW9uZ2luZm8gPQorCSAgICAoc3RydWN0IGVidF9hbW9uZ19pbmZvICopIG1hdGNoLT5kYXRhOworCisJbWVtc2V0KGFtb25naW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBlYnRfYW1vbmdfaW5mbykpOworCW9sZF9zaXplID0gc2l6ZW9mKHN0cnVjdCBlYnRfYW1vbmdfaW5mbyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWJ0X21hY193b3JtaGFzaCAqbmV3X3dvcm1oYXNoKGludCBuKQoreworCWludCBzaXplID0KKwkgICAgc2l6ZW9mKHN0cnVjdCBlYnRfbWFjX3dvcm1oYXNoKSArCisJICAgIG4gKiBzaXplb2Yoc3RydWN0IGVidF9tYWNfd29ybWhhc2hfdHVwbGUpOworCXN0cnVjdCBlYnRfbWFjX3dvcm1oYXNoICpyZXN1bHQgPQorCSAgICAoc3RydWN0IGVidF9tYWNfd29ybWhhc2ggKikgbWFsbG9jKHNpemUpOworCisJaWYgKCFyZXN1bHQpCisJCWVidF9wcmludF9tZW1vcnkoKTsKKwltZW1zZXQocmVzdWx0LCAwLCBzaXplKTsKKwlyZXN1bHQtPnBvb2xzaXplID0gbjsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBjb3B5X3dvcm1oYXNoKHN0cnVjdCBlYnRfbWFjX3dvcm1oYXNoICpkLAorCQkJICBjb25zdCBzdHJ1Y3QgZWJ0X21hY193b3JtaGFzaCAqcykKK3sKKwlpbnQgZHBvb2xzaXplID0gZC0+cG9vbHNpemU7CisJaW50IGRzaXplLCBzc2l6ZSwgYW1vdW50OworCisJZHNpemUgPSBlYnRfbWFjX3dvcm1oYXNoX3NpemUoZCk7CisJc3NpemUgPSBlYnRfbWFjX3dvcm1oYXNoX3NpemUocyk7CisJYW1vdW50ID0gZHNpemUgPCBzc2l6ZSA/IGRzaXplIDogc3NpemU7CisJbWVtY3B5KGQsIHMsIGFtb3VudCk7CisJZC0+cG9vbHNpemUgPSBkcG9vbHNpemU7Cit9CisKKy8qIFJldHVybnM6CisgKiAtMSB3aGVuICdcMCcgcmVhY2hlZAorICogLTIgd2hlbiBgbicgYnl0ZXMgcmVhZCBhbmQgbm8gZGVsaW1pdGVyIGZvdW5kCisgKiAgMCB3aGVuIG5vIGxlc3MgdGhhbiBgbicgYnl0ZXMgcmVhZCBhbmQgZGVsaW1pdGVyIGZvdW5kCisgKiBpZiBgZGVzdGJ1ZicgaXMgbm90IE5VTEwsIGl0IGlzIGZpbGxlZCBieSByZWFkIGJ5dGVzIGFuZCBlbmRlZCB3aXRoICdcMCcKKyAqICpwcCBpcyBzZXQgb24gdGhlIGZpcnN0IGJ5dGUgbm90IGNvcGllZCB0byBgZGVzdGJ1ZicKKyAqLworc3RhdGljIGludCByZWFkX3VudGlsKGNvbnN0IGNoYXIgKipwcCwgY29uc3QgY2hhciAqZGVsaW1pdGVycywKKwkJICAgICAgY2hhciAqZGVzdGJ1ZiwgaW50IG4pCit7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgcmV0ID0gMDsKKwljaGFyIGM7CisKKwl3aGlsZSAoMSkgeworCQljID0gKipwcDsKKwkJaWYgKCFjKSB7CisJCQlyZXQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzdHJjaHIoZGVsaW1pdGVycywgYykpIHsKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJfQorCQlpZiAoY291bnQgPT0gbikgeworCQkJcmV0ID0gLTI7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZGVzdGJ1ZikKKwkJCWRlc3RidWZbY291bnQrK10gPSBjOworCQkoKnBwKSsrOworCX0KKwlpZiAoZGVzdGJ1ZikKKwkJZGVzdGJ1Zltjb3VudF0gPSAwOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZmNtcChjb25zdCB2b2lkICp2YSwgY29uc3Qgdm9pZCAqdmIpIHsKKwljb25zdCBzdHJ1Y3QgZWJ0X21hY193b3JtaGFzaF90dXBsZSAqYSA9IHZhOworCWNvbnN0IHN0cnVjdCBlYnRfbWFjX3dvcm1oYXNoX3R1cGxlICpiID0gdmI7CisJaW50IGNhID0gKChjb25zdCB1bnNpZ25lZCBjaGFyKilhLT5jbXApWzddOworCWludCBjYiA9ICgoY29uc3QgdW5zaWduZWQgY2hhciopYi0+Y21wKVs3XTsKKworCXJldHVybiBjYSAtIGNiOworfQorCitzdGF0aWMgdm9pZCBpbmRleF90YWJsZShzdHJ1Y3QgZWJ0X21hY193b3JtaGFzaCAqd2gpCit7CisJaW50IGlwb29sLCBpdGFibGU7CisJaW50IGM7CisKKwlmb3IgKGl0YWJsZSA9IDA7IGl0YWJsZSA8PSAyNTY7IGl0YWJsZSsrKSB7CisJCXdoLT50YWJsZVtpdGFibGVdID0gd2gtPnBvb2xzaXplOworCX0KKwlpcG9vbCA9IDA7CisJaXRhYmxlID0gMDsKKwl3aGlsZSAoMSkgeworCQl3aC0+dGFibGVbaXRhYmxlXSA9IGlwb29sOworCQljID0gKChjb25zdCB1bnNpZ25lZCBjaGFyKil3aC0+cG9vbFtpcG9vbF0uY21wKVs3XTsKKwkJaWYgKGl0YWJsZSA8PSBjKSB7CisJCQlpdGFibGUrKzsKKwkJfSBlbHNlIHsKKwkJCWlwb29sKys7CisJCX0KKwkJaWYgKGlwb29sID4gd2gtPnBvb2xzaXplKQorCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGVidF9tYWNfd29ybWhhc2ggKmNyZWF0ZV93b3JtaGFzaChjb25zdCBjaGFyICphcmcpCit7CisJY29uc3QgY2hhciAqcGMgPSBhcmc7CisJY29uc3QgY2hhciAqYW5jaG9yOworCWNoYXIgKmVuZHB0cjsKKwlzdHJ1Y3QgZWJ0X21hY193b3JtaGFzaCAqd29ya2NvcHksICpyZXN1bHQsICpoOworCXVuc2lnbmVkIGNoYXIgbWFjWzZdOworCXVuc2lnbmVkIGNoYXIgaXBbNF07CisJaW50IG5tYWNzID0gMDsKKwlpbnQgaTsKKwljaGFyIHRva2VuWzRdOworCisJaWYgKCEod29ya2NvcHkgPSBuZXdfd29ybWhhc2goMTAyNCkpKSB7CisJCWVidF9wcmludF9tZW1vcnkoKTsKKwl9CisJd2hpbGUgKDEpIHsKKwkJLyogcmVtZW1iZXIgY3VycmVudCBwb3NpdGlvbiwgd2UnbGwgbmVlZCBpdCBvbiBlcnJvciAqLworCQlhbmNob3IgPSBwYzsKKworCQkvKiBjb2xsZWN0IE1BQzsgYWxsIGl0cyBieXRlcyBhcmUgZm9sbG93ZWQgYnkgJzonIChjb2xvbiksCisJCSAqIGV4Y2VwdCBmb3IgdGhlIGxhc3Qgb25lIHdoaWNoIGNhbiBiZSBmb2xsb3dlZCBieSAKKwkJICogJywnIChjb21tYSksICc9JyBvciAnXDAnICovCisJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJCWlmIChyZWFkX3VudGlsKCZwYywgIjoiLCB0b2tlbiwgMikgPCAwCisJCQkgICAgfHwgdG9rZW5bMF0gPT0gMCkgeworCQkJCWVidF9wcmludF9lcnJvcigiTUFDIHBhcnNlIGVycm9yOiAlLjIwcyIsIGFuY2hvcik7CisJCQkJZnJlZSh3b3JrY29weSk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQltYWNbaV0gPSBzdHJ0b2wodG9rZW4sICZlbmRwdHIsIDE2KTsKKwkJCWlmICgqZW5kcHRyKSB7CisJCQkJZWJ0X3ByaW50X2Vycm9yKCJNQUMgcGFyc2UgZXJyb3I6ICUuMjBzIiwgYW5jaG9yKTsKKwkJCQlmcmVlKHdvcmtjb3B5KTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCXBjKys7CisJCX0KKwkJaWYgKHJlYWRfdW50aWwoJnBjLCAiPSwiLCB0b2tlbiwgMikgPT0gLTIgfHwgdG9rZW5bMF0gPT0gMCkgeworCQkJZWJ0X3ByaW50X2Vycm9yKCJNQUMgcGFyc2UgZXJyb3I6ICUuMjBzIiwgYW5jaG9yKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCW1hY1tpXSA9IHN0cnRvbCh0b2tlbiwgJmVuZHB0ciwgMTYpOworCQlpZiAoKmVuZHB0cikgeworCQkJZWJ0X3ByaW50X2Vycm9yKCJNQUMgcGFyc2UgZXJyb3I6ICUuMjBzIiwgYW5jaG9yKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmICgqcGMgPT0gJz0nKSB7CisJCQkvKiBhbiBJUCBmb2xsb3dzIHRoZSBNQUM7IGNvbGxlY3Qgc2ltaWxhcmx5IHRvIE1BQyAqLworCQkJcGMrKzsKKwkJCWFuY2hvciA9IHBjOworCQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJCWlmIChyZWFkX3VudGlsKCZwYywgIi4iLCB0b2tlbiwgMykgPCAwIHx8IHRva2VuWzBdID09IDApIHsKKwkJCQkJZWJ0X3ByaW50X2Vycm9yKCJJUCBwYXJzZSBlcnJvcjogJS4yMHMiLCBhbmNob3IpOworCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQl9CisJCQkJaXBbaV0gPSBzdHJ0b2wodG9rZW4sICZlbmRwdHIsIDEwKTsKKwkJCQlpZiAoKmVuZHB0cikgeworCQkJCQllYnRfcHJpbnRfZXJyb3IoIklQIHBhcnNlIGVycm9yOiAlLjIwcyIsIGFuY2hvcik7CisJCQkJCXJldHVybiBOVUxMOworCQkJCX0KKwkJCQlwYysrOworCQkJfQorCQkJaWYgKHJlYWRfdW50aWwoJnBjLCAiLCIsIHRva2VuLCAzKSA9PSAtMiB8fCB0b2tlblswXSA9PSAwKSB7CisJCQkJZWJ0X3ByaW50X2Vycm9yKCJJUCBwYXJzZSBlcnJvcjogJS4yMHMiLCBhbmNob3IpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJaXBbM10gPSBzdHJ0b2wodG9rZW4sICZlbmRwdHIsIDEwKTsKKwkJCWlmICgqZW5kcHRyKSB7CisJCQkJZWJ0X3ByaW50X2Vycm9yKCJJUCBwYXJzZSBlcnJvcjogJS4yMHMiLCBhbmNob3IpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJaWYgKGlwWzBdID09IDAgJiYgaXBbMV0gPT0gMCAmJiBpcFsyXSA9PSAwICYmIGlwWzNdID09IDApIHsKKwkJCQllYnRfcHJpbnRfZXJyb3IoIklsbGVnYWwgSVAgMC4wLjAuMCIpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogbm8gSVAsIHdlIHNldCBpdCB0byAwLjAuMC4wICovCisJCQltZW1zZXQoaXAsIDAsIDQpOworCQl9CisKKwkJLyogd2UgaGF2ZSBjb2xsZWN0ZWQgTUFDIGFuZCBJUCwgc28gd2UgYWRkIGFuIGVudHJ5ICovCisJCW1lbWNweSgoKGNoYXIgKikgd29ya2NvcHktPnBvb2xbbm1hY3NdLmNtcCkgKyAyLCBtYWMsIDYpOworCQltZW1jcHkoJih3b3JrY29weS0+cG9vbFtubWFjc10uaXApLCBpcCwgNCk7CisJCW5tYWNzKys7CisKKwkJLyogcmUtYWxsb2NhdGUgbWVtb3J5IGlmIG5lZWRlZCAqLworCQlpZiAoKnBjICYmIG5tYWNzID49IHdvcmtjb3B5LT5wb29sc2l6ZSkgeworCQkJaWYgKCEoaCA9IG5ld193b3JtaGFzaChubWFjcyAqIDIpKSkgeworCQkJCWVidF9wcmludF9tZW1vcnkoKTsKKwkJCX0KKwkJCWNvcHlfd29ybWhhc2goaCwgd29ya2NvcHkpOworCQkJZnJlZSh3b3JrY29weSk7CisJCQl3b3JrY29weSA9IGg7CisJCX0KKworCQkvKiBjaGVjayBpZiBlbmQgb2Ygc3RyaW5nIHdhcyByZWFjaGVkICovCisJCWlmICghKnBjKSB7CisJCQlicmVhazsKKwkJfQorCisJCS8qIG5vdyBgcGMnIHBvaW50cyB0byBjb21tYSBpZiB3ZSBhcmUgaGVyZTsgKi8KKwkJLyogaW5jcmVtZW50IHRoaXMgdG8gdGhlIG5leHQgY2hhciAqLworCQkvKiBidXQgZmlyc3QgYXNzZXJ0IDotPiAqLworCQlpZiAoKnBjICE9ICcsJykgeworCQkJZWJ0X3ByaW50X2Vycm9yKCJTb21ldGhpbmcgd2VudCB3cm9uZzsgbm8gY29tbWEuLi5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcGMrKzsKKworCQkvKiBhZ2FpbiBjaGVjayBpZiBlbmQgb2Ygc3RyaW5nIHdhcyByZWFjaGVkOyAqLworCQkvKiB3ZSBhbGxvdyBhbiBlbmRpbmcgY29tbWEgKi8KKwkJaWYgKCEqcGMpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghKHJlc3VsdCA9IG5ld193b3JtaGFzaChubWFjcykpKSB7CisJCWVidF9wcmludF9tZW1vcnkoKTsKKwl9CisJY29weV93b3JtaGFzaChyZXN1bHQsIHdvcmtjb3B5KTsKKwlmcmVlKHdvcmtjb3B5KTsKKwlxc29ydCgmcmVzdWx0LT5wb29sLCByZXN1bHQtPnBvb2xzaXplLAorCQkJc2l6ZW9mKHN0cnVjdCBlYnRfbWFjX3dvcm1oYXNoX3R1cGxlKSwgZmNtcCk7CisJaW5kZXhfdGFibGUocmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisjZGVmaW5lIE9QVF9EU1QgMHgwMQorI2RlZmluZSBPUFRfU1JDIDB4MDIKK3N0YXRpYyBpbnQgcGFyc2UoaW50IGMsIGNoYXIgKiphcmd2LCBpbnQgYXJnYywKKwkJIGNvbnN0IHN0cnVjdCBlYnRfdV9lbnRyeSAqZW50cnksIHVuc2lnbmVkIGludCAqZmxhZ3MsCisJCSBzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICoqbWF0Y2gpCit7CisJc3RydWN0IGVidF9hbW9uZ19pbmZvICppbmZvID0KKwkgICAgKHN0cnVjdCBlYnRfYW1vbmdfaW5mbyAqKSAoKm1hdGNoKS0+ZGF0YTsKKwlzdHJ1Y3QgZWJ0X21hY193b3JtaGFzaCAqd2g7CisJc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqaDsKKwlpbnQgbmV3X3NpemU7CisJbG9uZyBmbGVuID0gMDsKKwlpbnQgZmQgPSAtMTsKKworCXN3aXRjaCAoYykgeworCWNhc2UgQU1PTkdfRFNUX0Y6CisJY2FzZSBBTU9OR19TUkNfRjoKKwljYXNlIEFNT05HX0RTVDoKKwljYXNlIEFNT05HX1NSQzoKKwkJaWYgKGMgPT0gQU1PTkdfRFNUIHx8IGMgPT0gQU1PTkdfRFNUX0YpIHsKKwkJCWVidF9jaGVja19vcHRpb24yKGZsYWdzLCBPUFRfRFNUKTsKKwkJfSBlbHNlIHsKKwkJCWVidF9jaGVja19vcHRpb24yKGZsYWdzLCBPUFRfU1JDKTsKKwkJfQorCQlpZiAoZWJ0X2NoZWNrX2ludmVyc2UyKG9wdGFyZykpIHsKKwkJCWlmIChjID09IEFNT05HX0RTVCB8fCBjID09IEFNT05HX0RTVF9GKQorCQkJCWluZm8tPmJpdG1hc2sgfD0gRUJUX0FNT05HX0RTVF9ORUc7CisJCQllbHNlCisJCQkJaW5mby0+Yml0bWFzayB8PSBFQlRfQU1PTkdfU1JDX05FRzsKKwkJfQorCQlpZiAoYyA9PSBBTU9OR19EU1RfRiB8fCBjID09IEFNT05HX1NSQ19GKSB7CisJCQlzdHJ1Y3Qgc3RhdCBzdGF0czsKKworCQkJaWYgKChmZCA9IG9wZW4ob3B0YXJnLCBPX1JET05MWSkpID09IC0xKQorCQkJCWVidF9wcmludF9lcnJvcigiQ291bGRuJ3Qgb3BlbiBmaWxlICclcyciLCBvcHRhcmcpOworCQkJZnN0YXQoZmQsICZzdGF0cyk7CisJCQlmbGVuID0gc3RhdHMuc3Rfc2l6ZTsKKwkJCS8qIHVzZSBtbWFwIGJlY2F1c2UgdGhlIGZpbGUgd2lsbCBwcm9iYWJseSBiZSBiaWcgKi8KKwkJCW9wdGFyZyA9IG1tYXAoMCwgZmxlbiwgUFJPVF9SRUFEfFBST1RfV1JJVEUsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisJCQlpZiAob3B0YXJnID09IE1BUF9GQUlMRUQpCisJCQkJZWJ0X3ByaW50X2Vycm9yKCJDb3VsZG4ndCBtYXAgZmlsZSB0byBtZW1vcnkiKTsKKwkJCWlmIChvcHRhcmdbZmxlbi0xXSAhPSAnXG4nKQorCQkJCWVidF9wcmludF9lcnJvcigiRmlsZSBzaG91bGQgZW5kIHdpdGggYSBuZXdsaW5lIik7CisJCQlpZiAoc3RyY2hyKG9wdGFyZywgJ1xuJykgIT0gb3B0YXJnK2ZsZW4tMSkKKwkJCQllYnRfcHJpbnRfZXJyb3IoIkZpbGUgc2hvdWxkIG9ubHkgY29udGFpbiBvbmUgbGluZSIpOworCQkJb3B0YXJnW2ZsZW4tMV0gPSAnXDAnOworCQkJaWYgKGVidF9lcnJvcm1zZ1swXSAhPSAnXDAnKSB7CisJCQkJbXVubWFwKGFyZ3YsIGZsZW4pOworCQkJCWNsb3NlKGZkKTsKKwkJCQlleGl0KC0xKTsKKwkJCX0KKwkJfQorCQl3aCA9IGNyZWF0ZV93b3JtaGFzaChvcHRhcmcpOworCQlpZiAoZWJ0X2Vycm9ybXNnWzBdICE9ICdcMCcpCisJCQlicmVhazsKKworCQluZXdfc2l6ZSA9IG9sZF9zaXplK2VidF9tYWNfd29ybWhhc2hfc2l6ZSh3aCk7CisJCWggPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBlYnRfZW50cnlfbWF0Y2gpK0VCVF9BTElHTihuZXdfc2l6ZSkpOworCQlpZiAoIWgpCisJCQllYnRfcHJpbnRfbWVtb3J5KCk7CisJCW1lbWNweShoLCAqbWF0Y2gsIG9sZF9zaXplK3NpemVvZihzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoKSk7CisJCW1lbWNweSgoY2hhciAqKWgrb2xkX3NpemUrc2l6ZW9mKHN0cnVjdCBlYnRfZW50cnlfbWF0Y2gpLCB3aCwKKwkJICAgICAgIGVidF9tYWNfd29ybWhhc2hfc2l6ZSh3aCkpOworCQloLT5tYXRjaF9zaXplID0gRUJUX0FMSUdOKG5ld19zaXplKTsKKwkJaW5mbyA9IChzdHJ1Y3QgZWJ0X2Ftb25nX2luZm8gKikgaC0+ZGF0YTsKKwkJaWYgKGMgPT0gQU1PTkdfRFNUIHx8IGMgPT0gQU1PTkdfRFNUX0YpIHsKKwkJCWluZm8tPndoX2RzdF9vZnMgPSBvbGRfc2l6ZTsKKwkJfSBlbHNlIHsKKwkJCWluZm8tPndoX3NyY19vZnMgPSBvbGRfc2l6ZTsKKwkJfQorCQlvbGRfc2l6ZSA9IG5ld19zaXplOworCQlmcmVlKCptYXRjaCk7CisJCSptYXRjaCA9IGg7CisJCWZyZWUod2gpOworCQlpZiAoYyA9PSBBTU9OR19EU1RfRiB8fCBjID09IEFNT05HX1NSQ19GKSB7CisJCQltdW5tYXAoYXJndiwgZmxlbik7CisJCQljbG9zZShmZCk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBmaW5hbF9jaGVjayhjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorCQkJY29uc3Qgc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbWF0Y2gsCisJCQljb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgaG9va21hc2ssCisJCQl1bnNpZ25lZCBpbnQgdGltZSkKK3sKK30KKworI2lmZGVmIERFQlVHCitzdGF0aWMgdm9pZCB3b3JtaGFzaF9kZWJ1Zyhjb25zdCBzdHJ1Y3QgZWJ0X21hY193b3JtaGFzaCAqd2gpCit7CisJaW50IGk7CisKKwlwcmludGYoInBvb2xzaXplOiAlZFxuIiwgd2gtPnBvb2xzaXplKTsKKwlmb3IgKGkgPSAwOyBpIDw9IDI1NjsgaSsrKSB7CisJCXByaW50ZigiJTAyeCAiLCB3aC0+dGFibGVbaV0pOworCQlpZiAoaSAlIDE2ID09IDE1KSB7CisJCQlwcmludGYoIlxuIik7CisJCX0KKwl9CisJcHJpbnRmKCJcbiIpOworfQorI2VuZGlmIC8qIERFQlVHICovCisKK3N0YXRpYyB2b2lkIHdvcm1oYXNoX3ByaW50b3V0KGNvbnN0IHN0cnVjdCBlYnRfbWFjX3dvcm1oYXNoICp3aCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyICppcDsKKworCWZvciAoaSA9IDA7IGkgPCB3aC0+cG9vbHNpemU7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgZWJ0X21hY193b3JtaGFzaF90dXBsZSAqcDsKKworCQlwID0gKGNvbnN0IHN0cnVjdCBlYnRfbWFjX3dvcm1oYXNoX3R1cGxlICopKCZ3aC0+cG9vbFtpXSk7CisJCWVidF9wcmludF9tYWMoKChjb25zdCB1bnNpZ25lZCBjaGFyICopICZwLT5jbXBbMF0pICsgMik7CisJCWlmIChwLT5pcCkgeworCQkJaXAgPSAodW5zaWduZWQgY2hhciAqKSAmcC0+aXA7CisJCQlwcmludGYoIj0ldS4ldS4ldS4ldSIsIGlwWzBdLCBpcFsxXSwgaXBbMl0sIGlwWzNdKTsKKwkJfQorCQlwcmludGYoIiwiKTsKKwl9CisJcHJpbnRmKCIgIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50KGNvbnN0IHN0cnVjdCBlYnRfdV9lbnRyeSAqZW50cnksCisJCSAgY29uc3Qgc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbWF0Y2gpCit7CisJc3RydWN0IGVidF9hbW9uZ19pbmZvICppbmZvID0gKHN0cnVjdCBlYnRfYW1vbmdfaW5mbyAqKW1hdGNoLT5kYXRhOworCisJaWYgKGluZm8tPndoX2RzdF9vZnMpIHsKKwkJcHJpbnRmKCItLWFtb25nLWRzdCAiKTsKKwkJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfQU1PTkdfRFNUX05FRykgeworCQkJcHJpbnRmKCIhICIpOworCQl9CisJCXdvcm1oYXNoX3ByaW50b3V0KGVidF9hbW9uZ193aF9kc3QoaW5mbykpOworCX0KKwlpZiAoaW5mby0+d2hfc3JjX29mcykgeworCQlwcmludGYoIi0tYW1vbmctc3JjICIpOworCQlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF9BTU9OR19TUkNfTkVHKSB7CisJCQlwcmludGYoIiEgIik7CisJCX0KKwkJd29ybWhhc2hfcHJpbnRvdXQoZWJ0X2Ftb25nX3doX3NyYyhpbmZvKSk7CisJfQorfQorCitzdGF0aWMgaW50IGNvbXBhcmVfd2goY29uc3Qgc3RydWN0IGVidF9tYWNfd29ybWhhc2ggKmF3LAorCQkgICAgICBjb25zdCBzdHJ1Y3QgZWJ0X21hY193b3JtaGFzaCAqYncpCit7CisJaW50IGFzLCBiczsKKworCWFzID0gZWJ0X21hY193b3JtaGFzaF9zaXplKGF3KTsKKwlicyA9IGVidF9tYWNfd29ybWhhc2hfc2l6ZShidyk7CisJaWYgKGFzICE9IGJzKQorCQlyZXR1cm4gMDsKKwlpZiAoYXMgJiYgbWVtY21wKGF3LCBidywgYXMpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjb21wYXJlKGNvbnN0IHN0cnVjdCBlYnRfZW50cnlfbWF0Y2ggKm0xLAorCQkgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICptMikKK3sKKwlzdHJ1Y3QgZWJ0X2Ftb25nX2luZm8gKmEgPSAoc3RydWN0IGVidF9hbW9uZ19pbmZvICopIG0xLT5kYXRhOworCXN0cnVjdCBlYnRfYW1vbmdfaW5mbyAqYiA9IChzdHJ1Y3QgZWJ0X2Ftb25nX2luZm8gKikgbTItPmRhdGE7CisKKwlpZiAoIWNvbXBhcmVfd2goZWJ0X2Ftb25nX3doX2RzdChhKSwgZWJ0X2Ftb25nX3doX2RzdChiKSkpCisJCXJldHVybiAwOworCWlmICghY29tcGFyZV93aChlYnRfYW1vbmdfd2hfc3JjKGEpLCBlYnRfYW1vbmdfd2hfc3JjKGIpKSkKKwkJcmV0dXJuIDA7CisJaWYgKGEtPmJpdG1hc2sgIT0gYi0+Yml0bWFzaykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWJ0X3VfbWF0Y2ggYW1vbmdfbWF0Y2ggPSB7CisJLm5hbWUgCQk9ICJhbW9uZyIsCisJLnNpemUgCQk9IHNpemVvZihzdHJ1Y3QgZWJ0X2Ftb25nX2luZm8pLAorCS5oZWxwIAkJPSBwcmludF9oZWxwLAorCS5pbml0IAkJPSBpbml0LAorCS5wYXJzZSAJCT0gcGFyc2UsCisJLmZpbmFsX2NoZWNrIAk9IGZpbmFsX2NoZWNrLAorCS5wcmludCAJCT0gcHJpbnQsCisJLmNvbXBhcmUgCT0gY29tcGFyZSwKKwkuZXh0cmFfb3BzIAk9IG9wdHMsCit9OworCitzdGF0aWMgdm9pZCBfSU5JVCh2b2lkKQoreworCWVidF9yZWdpc3Rlcl9tYXRjaCgmYW1vbmdfbWF0Y2gpOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9lYnRfYXJwLmMgYi9leHRlbnNpb25zL2VidF9hcnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGI2ZTkwCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9lYnRfYXJwLmMKQEAgLTAsMCArMSwzNjggQEAKKy8qIGVidF9hcnAKKyAqCisgKiBBdXRob3JzOgorICogQmFydCBEZSBTY2h1eW1lciA8YmRzY2h1eW1AcGFuZG9yYS5iZT4KKyAqIFRpbSBHYXJkbmVyIDx0aW1nQHRwaS5jb20+CisgKgorICogQXByaWwsIDIwMDIKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlICIuLi9pbmNsdWRlL2VidGFibGVzX3UuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2V0aGVybmV0ZGIuaCIKKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2FycC5oPgorCisjZGVmaW5lIEFSUF9PUENPREUgJzEnCisjZGVmaW5lIEFSUF9IVFlQRSAgJzInCisjZGVmaW5lIEFSUF9QVFlQRSAgJzMnCisjZGVmaW5lIEFSUF9JUF9TICAgJzQnCisjZGVmaW5lIEFSUF9JUF9EICAgJzUnCisjZGVmaW5lIEFSUF9NQUNfUyAgJzYnCisjZGVmaW5lIEFSUF9NQUNfRCAgJzcnCisjZGVmaW5lIEFSUF9HUkFUICAgJzgnCitzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBvcHRzW10gPQoreworCXsgImFycC1vcGNvZGUiICAgICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIEFSUF9PUENPREUgfSwKKwl7ICJhcnAtb3AiICAgICAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBBUlBfT1BDT0RFIH0sCisJeyAiYXJwLWh0eXBlIiAgICAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgQVJQX0hUWVBFICB9LAorCXsgImFycC1wdHlwZSIgICAgICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIEFSUF9QVFlQRSAgfSwKKwl7ICJhcnAtaXAtc3JjIiAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBBUlBfSVBfUyAgIH0sCisJeyAiYXJwLWlwLWRzdCIgICAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgQVJQX0lQX0QgICB9LAorCXsgImFycC1tYWMtc3JjIiAgICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIEFSUF9NQUNfUyAgfSwKKwl7ICJhcnAtbWFjLWRzdCIgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBBUlBfTUFDX0QgIH0sCisJeyAiYXJwLWdyYXR1aXRvdXMiLCAgICAgICBub19hcmd1bWVudCwgMCwgQVJQX0dSQVQgICB9LAorCXsgMCB9Cit9OworCisjZGVmaW5lIE5VTU9QQ09ERVMgOQorLyogYSBmZXcgbmFtZXMgKi8KK3N0YXRpYyBjaGFyICpvcGNvZGVzW10gPQoreworCSJSZXF1ZXN0IiwKKwkiUmVwbHkiLAorCSJSZXF1ZXN0X1JldmVyc2UiLAorCSJSZXBseV9SZXZlcnNlIiwKKwkiRFJBUlBfUmVxdWVzdCIsCisJIkRSQVJQX1JlcGx5IiwKKwkiRFJBUlBfRXJyb3IiLAorCSJJbkFSUF9SZXF1ZXN0IiwKKwkiQVJQX05BSyIsCit9OworCitzdGF0aWMgdm9pZCBwcmludF9oZWxwKCkKK3sKKwlpbnQgaTsKKworCXByaW50ZigKKyJhcnAgb3B0aW9uczpcbiIKKyItLWFycC1vcGNvZGUgIFshXSBvcGNvZGUgICAgICAgIDogQVJQIG9wY29kZSAoaW50ZWdlciBvciBzdHJpbmcpXG4iCisiLS1hcnAtaHR5cGUgICBbIV0gdHlwZSAgICAgICAgICA6IEFSUCBoYXJkd2FyZSB0eXBlIChpbnRlZ2VyIG9yIHN0cmluZylcbiIKKyItLWFycC1wdHlwZSAgIFshXSB0eXBlICAgICAgICAgIDogQVJQIHByb3RvY29sIHR5cGUgKGhleGFkZWNpbWFsIG9yIHN0cmluZylcbiIKKyItLWFycC1pcC1zcmMgIFshXSBhZGRyZXNzWy9tYXNrXTogQVJQIElQIHNvdXJjZSBzcGVjaWZpY2F0aW9uXG4iCisiLS1hcnAtaXAtZHN0ICBbIV0gYWRkcmVzc1svbWFza106IEFSUCBJUCB0YXJnZXQgc3BlY2lmaWNhdGlvblxuIgorIi0tYXJwLW1hYy1zcmMgWyFdIGFkZHJlc3NbL21hc2tdOiBBUlAgTUFDIHNvdXJjZSBzcGVjaWZpY2F0aW9uXG4iCisiLS1hcnAtbWFjLWRzdCBbIV0gYWRkcmVzc1svbWFza106IEFSUCBNQUMgdGFyZ2V0IHNwZWNpZmljYXRpb25cbiIKKyJbIV0gLS1hcnAtZ3JhdHVpdG91cyAgICAgICAgICAgIDogQVJQIGdyYXR1aXRvdXMgcGFja2V0XG4iCisiIG9wY29kZSBzdHJpbmdzOiBcbiIpOworCWZvciAoaSA9IDA7IGkgPCBOVU1PUENPREVTOyBpKyspCisJCXByaW50ZigiICVkID0gJXNcbiIsIGkgKyAxLCBvcGNvZGVzW2ldKTsKKwlwcmludGYoCisiIGhhcmR3YXJlIHR5cGUgc3RyaW5nOiAxID0gRXRoZXJuZXRcbiIKKyIgcHJvdG9jb2wgdHlwZSBzdHJpbmc6IHNlZSAiX1BBVEhfRVRIRVJUWVBFUyJcbiIpOworfQorCitzdGF0aWMgdm9pZCBpbml0KHN0cnVjdCBlYnRfZW50cnlfbWF0Y2ggKm1hdGNoKQoreworCXN0cnVjdCBlYnRfYXJwX2luZm8gKmFycGluZm8gPSAoc3RydWN0IGVidF9hcnBfaW5mbyAqKW1hdGNoLT5kYXRhOworCisJYXJwaW5mby0+aW52ZmxhZ3MgPSAwOworCWFycGluZm8tPmJpdG1hc2sgPSAwOworfQorCisKKyNkZWZpbmUgT1BUX09QQ09ERSAweDAxCisjZGVmaW5lIE9QVF9IVFlQRSAgMHgwMgorI2RlZmluZSBPUFRfUFRZUEUgIDB4MDQKKyNkZWZpbmUgT1BUX0lQX1MgICAweDA4CisjZGVmaW5lIE9QVF9JUF9EICAgMHgxMAorI2RlZmluZSBPUFRfTUFDX1MgIDB4MjAKKyNkZWZpbmUgT1BUX01BQ19EICAweDQwCisjZGVmaW5lIE9QVF9HUkFUICAgMHg4MAorc3RhdGljIGludCBwYXJzZShpbnQgYywgY2hhciAqKmFyZ3YsIGludCBhcmdjLCBjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorICAgdW5zaWduZWQgaW50ICpmbGFncywgc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqKm1hdGNoKQoreworCXN0cnVjdCBlYnRfYXJwX2luZm8gKmFycGluZm8gPSAoc3RydWN0IGVidF9hcnBfaW5mbyAqKSgqbWF0Y2gpLT5kYXRhOworCWxvbmcgaW50IGk7CisJY2hhciAqZW5kOworCXVpbnQzMl90ICphZGRyOworCXVpbnQzMl90ICptYXNrOworCXVuc2lnbmVkIGNoYXIgKm1hZGRyOworCXVuc2lnbmVkIGNoYXIgKm1tYXNrOworCisJc3dpdGNoIChjKSB7CisJY2FzZSBBUlBfT1BDT0RFOgorCQllYnRfY2hlY2tfb3B0aW9uMihmbGFncywgT1BUX09QQ09ERSk7CisJCWlmIChlYnRfY2hlY2tfaW52ZXJzZTIob3B0YXJnKSkKKwkJCWFycGluZm8tPmludmZsYWdzIHw9IEVCVF9BUlBfT1BDT0RFOworCQlpID0gc3RydG9sKG9wdGFyZywgJmVuZCwgMTApOworCQlpZiAoaSA8IDAgfHwgaSA+PSAoMHgxIDw8IDE2KSB8fCAqZW5kICE9J1wwJykgeworCQkJZm9yIChpID0gMDsgaSA8IE5VTU9QQ09ERVM7IGkrKykKKwkJCQlpZiAoIXN0cmNhc2VjbXAob3Bjb2Rlc1tpXSwgb3B0YXJnKSkKKwkJCQkJYnJlYWs7CisJCQlpZiAoaSA9PSBOVU1PUENPREVTKQorCQkJCWVidF9wcmludF9lcnJvcjIoIlByb2JsZW0gd2l0aCBzcGVjaWZpZWQgQVJQIG9wY29kZSIpOworCQkJaSsrOworCQl9CisJCWFycGluZm8tPm9wY29kZSA9IGh0b25zKGkpOworCQlhcnBpbmZvLT5iaXRtYXNrIHw9IEVCVF9BUlBfT1BDT0RFOworCQlicmVhazsKKworCWNhc2UgQVJQX0hUWVBFOgorCQllYnRfY2hlY2tfb3B0aW9uMihmbGFncywgT1BUX0hUWVBFKTsKKwkJaWYgKGVidF9jaGVja19pbnZlcnNlMihvcHRhcmcpKQorCQkJYXJwaW5mby0+aW52ZmxhZ3MgfD0gRUJUX0FSUF9IVFlQRTsKKwkJaSA9IHN0cnRvbChvcHRhcmcsICZlbmQsIDEwKTsKKwkJaWYgKGkgPCAwIHx8IGkgPj0gKDB4MSA8PCAxNikgfHwgKmVuZCAhPSdcMCcpIHsKKwkJCWlmICghc3RyY2FzZWNtcCgiRXRoZXJuZXQiLCBhcmd2W29wdGluZCAtIDFdKSkKKwkJCQlpID0gMTsKKwkJCWVsc2UKKwkJCQllYnRfcHJpbnRfZXJyb3IyKCJQcm9ibGVtIHdpdGggc3BlY2lmaWVkIEFSUCBoYXJkd2FyZSB0eXBlIik7CisJCX0KKwkJYXJwaW5mby0+aHR5cGUgPSBodG9ucyhpKTsKKwkJYXJwaW5mby0+Yml0bWFzayB8PSBFQlRfQVJQX0hUWVBFOworCQlicmVhazsKKworCWNhc2UgQVJQX1BUWVBFOgorCXsKKwkJdWludDE2X3QgcHJvdG87CisKKwkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIE9QVF9QVFlQRSk7CisJCWlmIChlYnRfY2hlY2tfaW52ZXJzZTIob3B0YXJnKSkKKwkJCWFycGluZm8tPmludmZsYWdzIHw9IEVCVF9BUlBfUFRZUEU7CisKKwkJaSA9IHN0cnRvbChvcHRhcmcsICZlbmQsIDE2KTsKKwkJaWYgKGkgPCAwIHx8IGkgPj0gKDB4MSA8PCAxNikgfHwgKmVuZCAhPSdcMCcpIHsKKwkJCXN0cnVjdCBldGhlcnR5cGVlbnQgKmVudDsKKworCQkJZW50ID0gZ2V0ZXRoZXJ0eXBlYnluYW1lKGFyZ3Zbb3B0aW5kIC0gMV0pOworCQkJaWYgKCFlbnQpCisJCQkJZWJ0X3ByaW50X2Vycm9yMigiUHJvYmxlbSB3aXRoIHNwZWNpZmllZCBBUlAgIgorCQkJCQkJInByb3RvY29sIHR5cGUiKTsKKwkJCXByb3RvID0gZW50LT5lX2V0aGVydHlwZTsKKworCQl9IGVsc2UKKwkJCXByb3RvID0gaTsKKwkJYXJwaW5mby0+cHR5cGUgPSBodG9ucyhwcm90byk7CisJCWFycGluZm8tPmJpdG1hc2sgfD0gRUJUX0FSUF9QVFlQRTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBBUlBfSVBfUzoKKwljYXNlIEFSUF9JUF9EOgorCQlpZiAoYyA9PSBBUlBfSVBfUykgeworCQkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIE9QVF9JUF9TKTsKKwkJCWFkZHIgPSAmYXJwaW5mby0+c2FkZHI7CisJCQltYXNrID0gJmFycGluZm8tPnNtc2s7CisJCQlhcnBpbmZvLT5iaXRtYXNrIHw9IEVCVF9BUlBfU1JDX0lQOworCQl9IGVsc2UgeworCQkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIE9QVF9JUF9EKTsKKwkJCWFkZHIgPSAmYXJwaW5mby0+ZGFkZHI7CisJCQltYXNrID0gJmFycGluZm8tPmRtc2s7CisJCQlhcnBpbmZvLT5iaXRtYXNrIHw9IEVCVF9BUlBfRFNUX0lQOworCQl9CisJCWlmIChlYnRfY2hlY2tfaW52ZXJzZTIob3B0YXJnKSkgeworCQkJaWYgKGMgPT0gQVJQX0lQX1MpCisJCQkJYXJwaW5mby0+aW52ZmxhZ3MgfD0gRUJUX0FSUF9TUkNfSVA7CisJCQllbHNlCisJCQkJYXJwaW5mby0+aW52ZmxhZ3MgfD0gRUJUX0FSUF9EU1RfSVA7CisJCX0KKwkJZWJ0X3BhcnNlX2lwX2FkZHJlc3Mob3B0YXJnLCBhZGRyLCBtYXNrKTsKKwkJYnJlYWs7CisKKwljYXNlIEFSUF9NQUNfUzoKKwljYXNlIEFSUF9NQUNfRDoKKwkJaWYgKGMgPT0gQVJQX01BQ19TKSB7CisJCQllYnRfY2hlY2tfb3B0aW9uMihmbGFncywgT1BUX01BQ19TKTsKKwkJCW1hZGRyID0gYXJwaW5mby0+c21hZGRyOworCQkJbW1hc2sgPSBhcnBpbmZvLT5zbW1zazsKKwkJCWFycGluZm8tPmJpdG1hc2sgfD0gRUJUX0FSUF9TUkNfTUFDOworCQl9IGVsc2UgeworCQkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIE9QVF9NQUNfRCk7CisJCQltYWRkciA9IGFycGluZm8tPmRtYWRkcjsKKwkJCW1tYXNrID0gYXJwaW5mby0+ZG1tc2s7CisJCQlhcnBpbmZvLT5iaXRtYXNrIHw9IEVCVF9BUlBfRFNUX01BQzsKKwkJfQorCQlpZiAoZWJ0X2NoZWNrX2ludmVyc2UyKG9wdGFyZykpIHsKKwkJCWlmIChjID09IEFSUF9NQUNfUykKKwkJCQlhcnBpbmZvLT5pbnZmbGFncyB8PSBFQlRfQVJQX1NSQ19NQUM7CisJCQllbHNlCisJCQkJYXJwaW5mby0+aW52ZmxhZ3MgfD0gRUJUX0FSUF9EU1RfTUFDOworCQl9CisJCWlmIChlYnRfZ2V0X21hY19hbmRfbWFzayhvcHRhcmcsIG1hZGRyLCBtbWFzaykpCisJCQllYnRfcHJpbnRfZXJyb3IyKCJQcm9ibGVtIHdpdGggQVJQIE1BQyBhZGRyZXNzIGFyZ3VtZW50Iik7CisJCWJyZWFrOworCWNhc2UgQVJQX0dSQVQ6CisJCWVidF9jaGVja19vcHRpb24yKGZsYWdzLCBPUFRfR1JBVCk7CisJCWFycGluZm8tPmJpdG1hc2sgfD0gRUJUX0FSUF9HUkFUOworCQlpZiAoZWJ0X2ludmVydCkKKwkJCWFycGluZm8tPmludmZsYWdzIHw9IEVCVF9BUlBfR1JBVDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmFsX2NoZWNrKGNvbnN0IHN0cnVjdCBlYnRfdV9lbnRyeSAqZW50cnksCisgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICptYXRjaCwgY29uc3QgY2hhciAqbmFtZSwKKyAgIHVuc2lnbmVkIGludCBob29rbWFzaywgdW5zaWduZWQgaW50IHRpbWUpCit7CisJaWYgKChlbnRyeS0+ZXRocHJvdG8gIT0gRVRIX1BfQVJQICYmIGVudHJ5LT5ldGhwcm90byAhPSBFVEhfUF9SQVJQKSB8fAorCSAgICBlbnRyeS0+aW52ZmxhZ3MgJiBFQlRfSVBST1RPKQorCQllYnRfcHJpbnRfZXJyb3IoIkZvciAoUilBUlAgZmlsdGVyaW5nIHRoZSBwcm90b2NvbCBtdXN0IGJlIHNwZWNpZmllZCBhcyBBUlAgb3IgUkFSUCIpOworfQorCitzdGF0aWMgdm9pZCBwcmludChjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbWF0Y2gpCit7CisJc3RydWN0IGVidF9hcnBfaW5mbyAqYXJwaW5mbyA9IChzdHJ1Y3QgZWJ0X2FycF9pbmZvICopbWF0Y2gtPmRhdGE7CisJaW50IGk7CisKKwlpZiAoYXJwaW5mby0+Yml0bWFzayAmIEVCVF9BUlBfT1BDT0RFKSB7CisJCWludCBvcGNvZGUgPSBudG9ocyhhcnBpbmZvLT5vcGNvZGUpOworCQlwcmludGYoIi0tYXJwLW9wICIpOworCQlpZiAoYXJwaW5mby0+aW52ZmxhZ3MgJiBFQlRfQVJQX09QQ09ERSkKKwkJCXByaW50ZigiISAiKTsKKwkJaWYgKG9wY29kZSA+IDAgJiYgb3Bjb2RlIDw9IE5VTU9QQ09ERVMpCisJCQlwcmludGYoIiVzICIsIG9wY29kZXNbb3Bjb2RlIC0gMV0pOworCQllbHNlCisJCQlwcmludGYoIiVkICIsIG9wY29kZSk7CisJfQorCWlmIChhcnBpbmZvLT5iaXRtYXNrICYgRUJUX0FSUF9IVFlQRSkgeworCQlwcmludGYoIi0tYXJwLWh0eXBlICIpOworCQlpZiAoYXJwaW5mby0+aW52ZmxhZ3MgJiBFQlRfQVJQX0hUWVBFKQorCQkJcHJpbnRmKCIhICIpOworCQlwcmludGYoIiVkICIsIG50b2hzKGFycGluZm8tPmh0eXBlKSk7CisJfQorCWlmIChhcnBpbmZvLT5iaXRtYXNrICYgRUJUX0FSUF9QVFlQRSkgeworCQlzdHJ1Y3QgZXRoZXJ0eXBlZW50ICplbnQ7CisKKwkJcHJpbnRmKCItLWFycC1wdHlwZSAiKTsKKwkJaWYgKGFycGluZm8tPmludmZsYWdzICYgRUJUX0FSUF9QVFlQRSkKKwkJCXByaW50ZigiISAiKTsKKwkJZW50ID0gZ2V0ZXRoZXJ0eXBlYnludW1iZXIobnRvaHMoYXJwaW5mby0+cHR5cGUpKTsKKwkJaWYgKCFlbnQpCisJCQlwcmludGYoIjB4JXggIiwgbnRvaHMoYXJwaW5mby0+cHR5cGUpKTsKKwkJZWxzZQorCQkJcHJpbnRmKCIlcyAiLCBlbnQtPmVfbmFtZSk7CisJfQorCWlmIChhcnBpbmZvLT5iaXRtYXNrICYgRUJUX0FSUF9TUkNfSVApIHsKKwkJcHJpbnRmKCItLWFycC1pcC1zcmMgIik7CisJCWlmIChhcnBpbmZvLT5pbnZmbGFncyAmIEVCVF9BUlBfU1JDX0lQKQorCQkJcHJpbnRmKCIhICIpOworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQkJcHJpbnRmKCIlZCVzIiwgKCh1bnNpZ25lZCBjaGFyICopJmFycGluZm8tPnNhZGRyKVtpXSwKKwkJCSAgIChpID09IDMpID8gIiIgOiAiLiIpOworCQlwcmludGYoIiVzICIsIGVidF9tYXNrX3RvX2RvdHRlZChhcnBpbmZvLT5zbXNrKSk7CisJfQorCWlmIChhcnBpbmZvLT5iaXRtYXNrICYgRUJUX0FSUF9EU1RfSVApIHsKKwkJcHJpbnRmKCItLWFycC1pcC1kc3QgIik7CisJCWlmIChhcnBpbmZvLT5pbnZmbGFncyAmIEVCVF9BUlBfRFNUX0lQKQorCQkJcHJpbnRmKCIhICIpOworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQkJcHJpbnRmKCIlZCVzIiwgKCh1bnNpZ25lZCBjaGFyICopJmFycGluZm8tPmRhZGRyKVtpXSwKKwkJCSAgIChpID09IDMpID8gIiIgOiAiLiIpOworCQlwcmludGYoIiVzICIsIGVidF9tYXNrX3RvX2RvdHRlZChhcnBpbmZvLT5kbXNrKSk7CisJfQorCWlmIChhcnBpbmZvLT5iaXRtYXNrICYgRUJUX0FSUF9TUkNfTUFDKSB7CisJCXByaW50ZigiLS1hcnAtbWFjLXNyYyAiKTsKKwkJaWYgKGFycGluZm8tPmludmZsYWdzICYgRUJUX0FSUF9TUkNfTUFDKQorCQkJcHJpbnRmKCIhICIpOworCQllYnRfcHJpbnRfbWFjX2FuZF9tYXNrKGFycGluZm8tPnNtYWRkciwgYXJwaW5mby0+c21tc2spOworCQlwcmludGYoIiAiKTsKKwl9CisJaWYgKGFycGluZm8tPmJpdG1hc2sgJiBFQlRfQVJQX0RTVF9NQUMpIHsKKwkJcHJpbnRmKCItLWFycC1tYWMtZHN0ICIpOworCQlpZiAoYXJwaW5mby0+aW52ZmxhZ3MgJiBFQlRfQVJQX0RTVF9NQUMpCisJCQlwcmludGYoIiEgIik7CisJCWVidF9wcmludF9tYWNfYW5kX21hc2soYXJwaW5mby0+ZG1hZGRyLCBhcnBpbmZvLT5kbW1zayk7CisJCXByaW50ZigiICIpOworCX0KKwlpZiAoYXJwaW5mby0+Yml0bWFzayAmIEVCVF9BUlBfR1JBVCkgeworCQlpZiAoYXJwaW5mby0+aW52ZmxhZ3MgJiBFQlRfQVJQX0dSQVQpCisJCQlwcmludGYoIiEgIik7CisJCXByaW50ZigiLS1hcnAtZ3JhdHVpdG91cyAiKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZShjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICptMSwKKyAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnlfbWF0Y2ggKm0yKQoreworCXN0cnVjdCBlYnRfYXJwX2luZm8gKmFycGluZm8xID0gKHN0cnVjdCBlYnRfYXJwX2luZm8gKiltMS0+ZGF0YTsKKwlzdHJ1Y3QgZWJ0X2FycF9pbmZvICphcnBpbmZvMiA9IChzdHJ1Y3QgZWJ0X2FycF9pbmZvICopbTItPmRhdGE7CisKKwlpZiAoYXJwaW5mbzEtPmJpdG1hc2sgIT0gYXJwaW5mbzItPmJpdG1hc2spCisJCXJldHVybiAwOworCWlmIChhcnBpbmZvMS0+aW52ZmxhZ3MgIT0gYXJwaW5mbzItPmludmZsYWdzKQorCQlyZXR1cm4gMDsKKwlpZiAoYXJwaW5mbzEtPmJpdG1hc2sgJiBFQlRfQVJQX09QQ09ERSkgeworCQlpZiAoYXJwaW5mbzEtPm9wY29kZSAhPSBhcnBpbmZvMi0+b3Bjb2RlKQorCQkJcmV0dXJuIDA7CisJfQorCWlmIChhcnBpbmZvMS0+Yml0bWFzayAmIEVCVF9BUlBfSFRZUEUpIHsKKwkJaWYgKGFycGluZm8xLT5odHlwZSAhPSBhcnBpbmZvMi0+aHR5cGUpCisJCQlyZXR1cm4gMDsKKwl9CisJaWYgKGFycGluZm8xLT5iaXRtYXNrICYgRUJUX0FSUF9QVFlQRSkgeworCQlpZiAoYXJwaW5mbzEtPnB0eXBlICE9IGFycGluZm8yLT5wdHlwZSkKKwkJCXJldHVybiAwOworCX0KKwlpZiAoYXJwaW5mbzEtPmJpdG1hc2sgJiBFQlRfQVJQX1NSQ19JUCkgeworCQlpZiAoYXJwaW5mbzEtPnNhZGRyICE9IGFycGluZm8yLT5zYWRkcikKKwkJCXJldHVybiAwOworCQlpZiAoYXJwaW5mbzEtPnNtc2sgIT0gYXJwaW5mbzItPnNtc2spCisJCQlyZXR1cm4gMDsKKwl9CisJaWYgKGFycGluZm8xLT5iaXRtYXNrICYgRUJUX0FSUF9EU1RfSVApIHsKKwkJaWYgKGFycGluZm8xLT5kYWRkciAhPSBhcnBpbmZvMi0+ZGFkZHIpCisJCQlyZXR1cm4gMDsKKwkJaWYgKGFycGluZm8xLT5kbXNrICE9IGFycGluZm8yLT5kbXNrKQorCQkJcmV0dXJuIDA7CisJfQorCWlmIChhcnBpbmZvMS0+Yml0bWFzayAmIEVCVF9BUlBfU1JDX01BQykgeworCQlpZiAobWVtY21wKGFycGluZm8xLT5zbWFkZHIsIGFycGluZm8yLT5zbWFkZHIsIEVUSF9BTEVOKSkKKwkJCXJldHVybiAwOworCQlpZiAobWVtY21wKGFycGluZm8xLT5zbW1zaywgYXJwaW5mbzItPnNtbXNrLCBFVEhfQUxFTikpCisJCQlyZXR1cm4gMDsKKwl9CisJaWYgKGFycGluZm8xLT5iaXRtYXNrICYgRUJUX0FSUF9EU1RfTUFDKSB7CisJCWlmIChtZW1jbXAoYXJwaW5mbzEtPmRtYWRkciwgYXJwaW5mbzItPmRtYWRkciwgRVRIX0FMRU4pKQorCQkJcmV0dXJuIDA7CisJCWlmIChtZW1jbXAoYXJwaW5mbzEtPmRtbXNrLCBhcnBpbmZvMi0+ZG1tc2ssIEVUSF9BTEVOKSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBlYnRfdV9tYXRjaCBhcnBfbWF0Y2ggPQoreworCS5uYW1lCQk9ICJhcnAiLAorCS5zaXplCQk9IHNpemVvZihzdHJ1Y3QgZWJ0X2FycF9pbmZvKSwKKwkuaGVscAkJPSBwcmludF9oZWxwLAorCS5pbml0CQk9IGluaXQsCisJLnBhcnNlCQk9IHBhcnNlLAorCS5maW5hbF9jaGVjawk9IGZpbmFsX2NoZWNrLAorCS5wcmludAkJPSBwcmludCwKKwkuY29tcGFyZQk9IGNvbXBhcmUsCisJLmV4dHJhX29wcwk9IG9wdHMsCit9OworCitzdGF0aWMgdm9pZCBfSU5JVCh2b2lkKQoreworCWVidF9yZWdpc3Rlcl9tYXRjaCgmYXJwX21hdGNoKTsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZWJ0X2FycHJlcGx5LmMgYi9leHRlbnNpb25zL2VidF9hcnByZXBseS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5OTg2OGIKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2VidF9hcnByZXBseS5jCkBAIC0wLDAgKzEsMTM5IEBACisvKiBlYnRfYXJwcmVwbHkKKyAqCisgKiBBdXRob3JzOgorICogR3J6ZWdvcnogQm9yb3dpYWsgPGdyemVzQGdudS51bml2LmdkYS5wbD4KKyAqIEJhcnQgRGUgU2NodXltZXIgPGJkc2NodXltQHBhbmRvcmEuYmU+CisgKgorICogIEF1Z3VzdCwgMjAwMworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZWJ0YWJsZXNfdS5oIgorI2luY2x1ZGUgPG5ldGluZXQvZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hcnByZXBseS5oPgorCitzdGF0aWMgaW50IG1hY19zdXBwbGllZDsKKworI2RlZmluZSBSRVBMWV9NQUMgJzEnCisjZGVmaW5lIFJFUExZX1RBUkdFVCAnMicKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIG9wdHNbXSA9Cit7CisJeyAiYXJwcmVwbHktbWFjIiAsICAgIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBSRVBMWV9NQUMgICAgfSwKKwl7ICJhcnByZXBseS10YXJnZXQiICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIFJFUExZX1RBUkdFVCB9LAorCXsgMCB9Cit9OworCitzdGF0aWMgdm9pZCBwcmludF9oZWxwKCkKK3sKKwlwcmludGYoCisJImFycHJlcGx5IHRhcmdldCBvcHRpb25zOlxuIgorCSIgLS1hcnByZXBseS1tYWMgYWRkcmVzcyAgICAgICAgICAgOiBzb3VyY2UgTUFDIG9mIGdlbmVyYXRlZCByZXBseVxuIgorCSIgLS1hcnByZXBseS10YXJnZXQgdGFyZ2V0ICAgICAgICAgOiBBQ0NFUFQsIERST1AsIFJFVFVSTiBvciBDT05USU5VRVxuIgorCSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhbmRhcmQgdGFyZ2V0IGlzIERST1ApXG4iKTsKK30KKworc3RhdGljIHZvaWQgaW5pdChzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdGFyZ2V0KQoreworCXN0cnVjdCBlYnRfYXJwcmVwbHlfaW5mbyAqcmVwbHlpbmZvID0KKwkgICAoc3RydWN0IGVidF9hcnByZXBseV9pbmZvICopdGFyZ2V0LT5kYXRhOworCisJcmVwbHlpbmZvLT50YXJnZXQgPSBFQlRfRFJPUDsKKwltZW1zZXQocmVwbHlpbmZvLT5tYWMsIDAsIEVUSF9BTEVOKTsKKwltYWNfc3VwcGxpZWQgPSAwOworfQorCisjZGVmaW5lIE9QVF9SRVBMWV9NQUMgICAgIDB4MDEKKyNkZWZpbmUgT1BUX1JFUExZX1RBUkdFVCAgMHgwMgorc3RhdGljIGludCBwYXJzZShpbnQgYywgY2hhciAqKmFyZ3YsIGludCBhcmdjLAorICAgY29uc3Qgc3RydWN0IGVidF91X2VudHJ5ICplbnRyeSwgdW5zaWduZWQgaW50ICpmbGFncywKKyAgIHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICoqdGFyZ2V0KQoreworCXN0cnVjdCBlYnRfYXJwcmVwbHlfaW5mbyAqcmVwbHlpbmZvID0KKwkgICAoc3RydWN0IGVidF9hcnByZXBseV9pbmZvICopKCp0YXJnZXQpLT5kYXRhOworCXN0cnVjdCBldGhlcl9hZGRyICphZGRyOworCisJc3dpdGNoIChjKSB7CisJY2FzZSBSRVBMWV9NQUM6CisJCWVidF9jaGVja19vcHRpb24yKGZsYWdzLCBPUFRfUkVQTFlfTUFDKTsKKwkJaWYgKCEoYWRkciA9IGV0aGVyX2F0b24ob3B0YXJnKSkpCisJCQllYnRfcHJpbnRfZXJyb3IyKCJQcm9ibGVtIHdpdGggc3BlY2lmaWVkIC0tYXJwcmVwbHktbWFjIG1hYyIpOworCQltZW1jcHkocmVwbHlpbmZvLT5tYWMsIGFkZHIsIEVUSF9BTEVOKTsKKwkJbWFjX3N1cHBsaWVkID0gMTsKKwkJYnJlYWs7CisJY2FzZSBSRVBMWV9UQVJHRVQ6CisJCWVidF9jaGVja19vcHRpb24yKGZsYWdzLCBPUFRfUkVQTFlfVEFSR0VUKTsKKwkJaWYgKEZJTExfVEFSR0VUKG9wdGFyZywgcmVwbHlpbmZvLT50YXJnZXQpKQorCQkJZWJ0X3ByaW50X2Vycm9yMigiSWxsZWdhbCAtLWFycHJlcGx5LXRhcmdldCB0YXJnZXQiKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmFsX2NoZWNrKGNvbnN0IHN0cnVjdCBlYnRfdV9lbnRyeSAqZW50cnksCisgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdGFyZ2V0LCBjb25zdCBjaGFyICpuYW1lLAorICAgdW5zaWduZWQgaW50IGhvb2ttYXNrLCB1bnNpZ25lZCBpbnQgdGltZSkKK3sKKwlzdHJ1Y3QgZWJ0X2FycHJlcGx5X2luZm8gKnJlcGx5aW5mbyA9CisJICAgKHN0cnVjdCBlYnRfYXJwcmVwbHlfaW5mbyAqKXRhcmdldC0+ZGF0YTsKKworCWlmIChlbnRyeS0+ZXRocHJvdG8gIT0gRVRIX1BfQVJQIHx8IGVudHJ5LT5pbnZmbGFncyAmIEVCVF9JUFJPVE8pIHsKKwkJZWJ0X3ByaW50X2Vycm9yKCJGb3IgQVJQIHJlcGx5aW5nIHRoZSBwcm90b2NvbCBtdXN0IGJlIHNwZWNpZmllZCBhcyBBUlAiKTsKKwl9IGVsc2UgaWYgKHRpbWUgPT0gMCAmJiBtYWNfc3VwcGxpZWQgPT0gMCkgeworCQllYnRfcHJpbnRfZXJyb3IoIk5vIGFycHJlcGx5IG1hYyBzdXBwbGllZCIpOworCX0gZWxzZSBpZiAoQkFTRV9DSEFJTiAmJiByZXBseWluZm8tPnRhcmdldCA9PSBFQlRfUkVUVVJOKSB7CisJCWVidF9wcmludF9lcnJvcigiLS1hcnByZXBseS10YXJnZXQgUkVUVVJOIG5vdCBhbGxvd2VkIG9uIGJhc2UgY2hhaW4iKTsKKwl9IGVsc2UgeworCQlDTEVBUl9CQVNFX0NIQUlOX0JJVDsKKwkJaWYgKHN0cmNtcChuYW1lLCAibmF0IikgfHwgaG9va21hc2sgJiB+KDEgPDwgTkZfQlJfUFJFX1JPVVRJTkcpKQorCQkJZWJ0X3ByaW50X2Vycm9yKCJhcnByZXBseSBvbmx5IGFsbG93ZWQgaW4gUFJFUk9VVElORyIpOworCX0KK30KKworc3RhdGljIHZvaWQgcHJpbnQoY29uc3Qgc3RydWN0IGVidF91X2VudHJ5ICplbnRyeSwKKyAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICp0YXJnZXQpCit7CisJc3RydWN0IGVidF9hcnByZXBseV9pbmZvICpyZXBseWluZm8gPQorCSAgIChzdHJ1Y3QgZWJ0X2FycHJlcGx5X2luZm8gKil0YXJnZXQtPmRhdGE7CisKKwlwcmludGYoIi0tYXJwcmVwbHktbWFjICIpOworCWVidF9wcmludF9tYWMocmVwbHlpbmZvLT5tYWMpOworCWlmIChyZXBseWluZm8tPnRhcmdldCA9PSBFQlRfRFJPUCkKKwkJcmV0dXJuOworCXByaW50ZigiIC0tYXJwcmVwbHktdGFyZ2V0ICVzIiwgVEFSR0VUX05BTUUocmVwbHlpbmZvLT50YXJnZXQpKTsKK30KKworc3RhdGljIGludCBjb21wYXJlKGNvbnN0IHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICp0MSwKKyAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICp0MikKK3sKKwlzdHJ1Y3QgZWJ0X2FycHJlcGx5X2luZm8gKnJlcGx5aW5mbzEgPQorCSAgIChzdHJ1Y3QgZWJ0X2FycHJlcGx5X2luZm8gKil0MS0+ZGF0YTsKKwlzdHJ1Y3QgZWJ0X2FycHJlcGx5X2luZm8gKnJlcGx5aW5mbzIgPQorCSAgIChzdHJ1Y3QgZWJ0X2FycHJlcGx5X2luZm8gKil0Mi0+ZGF0YTsKKworCXJldHVybiBtZW1jbXAocmVwbHlpbmZvMS0+bWFjLCByZXBseWluZm8yLT5tYWMsIEVUSF9BTEVOKSA9PSAwCisJCSYmIHJlcGx5aW5mbzEtPnRhcmdldCA9PSByZXBseWluZm8yLT50YXJnZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWJ0X3VfdGFyZ2V0IGFycHJlcGx5X3RhcmdldCA9Cit7CisJLm5hbWUJCT0gImFycHJlcGx5IiwKKwkuc2l6ZQkJPSBzaXplb2Yoc3RydWN0IGVidF9hcnByZXBseV9pbmZvKSwKKwkuaGVscAkJPSBwcmludF9oZWxwLAorCS5pbml0CQk9IGluaXQsCisJLnBhcnNlCQk9IHBhcnNlLAorCS5maW5hbF9jaGVjawk9IGZpbmFsX2NoZWNrLAorCS5wcmludAkJPSBwcmludCwKKwkuY29tcGFyZQk9IGNvbXBhcmUsCisJLmV4dHJhX29wcwk9IG9wdHMsCit9OworCitzdGF0aWMgdm9pZCBfSU5JVCh2b2lkKQoreworCWVidF9yZWdpc3Rlcl90YXJnZXQoJmFycHJlcGx5X3RhcmdldCk7Cit9CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2VidF9pbmF0LmMgYi9leHRlbnNpb25zL2VidF9pbmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhmNjViNAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZWJ0X2luYXQuYwpAQCAtMCwwICsxLDM4NiBAQAorLyogZWJ0X2luYXQKKyAqCisgKiBBdXRob3JzOgorICogR3J6ZWdvcnogQm9yb3dpYWsgPGdyemVzQGdudS51bml2LmdkYS5wbD4KKyAqCisgKiBBdWd1c3QsIDIwMDMKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2V0aGVyLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICIuLi9pbmNsdWRlL2VidGFibGVzX3UuaCIKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9pbmF0Lmg+CisKK3N0YXRpYyBpbnQgc19zdWJfc3VwcGxpZWQsIGRfc3ViX3N1cHBsaWVkOworCisjZGVmaW5lIE5BVF9TICcxJworI2RlZmluZSBOQVRfRCAnMScKKyNkZWZpbmUgTkFUX1NfU1VCICcyJworI2RlZmluZSBOQVRfRF9TVUIgJzInCisjZGVmaW5lIE5BVF9TX1RBUkdFVCAnMycKKyNkZWZpbmUgTkFUX0RfVEFSR0VUICczJworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gb3B0c19zW10gPQoreworCXsgImlzbmF0LWxpc3QiICAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBOQVRfUyB9LAorCXsgImlzbmF0LXN1YiIgICAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBOQVRfU19TVUIgfSwKKwl7ICJpc25hdC1kZWZhdWx0LXRhcmdldCIgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBOQVRfU19UQVJHRVQgfSwKKwl7IDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gb3B0c19kW10gPQoreworCXsgImlkbmF0LWxpc3QiICAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBOQVRfRCB9LAorCXsgImlkbmF0LXN1YiIgICAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBOQVRfRF9TVUIgfSwKKwl7ICJpZG5hdC1kZWZhdWx0LXRhcmdldCIgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBOQVRfRF9UQVJHRVQgfSwKKwl7IDAgfQorfTsKKworc3RhdGljIHZvaWQgcHJpbnRfaGVscF9jb21tb24oY29uc3QgY2hhciAqY2FzKQoreworCXByaW50ZigKKyJpc25hdCBvcHRpb25zOlxuIgorIiAtLWklMS4xc25hdC1saXN0ICAgICAgICAgICAgICAgICAgICA6IGluZGV4ZWQgbGlzdCBvZiBNQUMgYWRkcmVzc2VzXG4iCisiIC0taSUxLjFzbmF0LXN1YiAgICAgICAgICAgICAgICAgICAgIDogLzI0IHN1Ym5ldCB0byB3aGljaCB0aGUgcnVsZSBhcHBseVxuIgorIiAtLWklMS4xc25hdC1kZWZhdWx0LXRhcmdldCB0YXJnZXQgICA6IEFDQ0VQVCwgRFJPUCwgUkVUVVJOIG9yIENPTlRJTlVFXG4iCisiSW5kZXhlZCBsaXN0IG9mIGFkZHJlc3NlcyBpcyBhcyBmb2xsb3dzOlxuIgorIlx0bGlzdCA6PSBjaHVua1xuIgorIlx0bGlzdCA6PSBsaXN0IGNodW5rXG4iCisiXHRjaHVuayA6PSBwYWlyICcsJ1xuIgorIlx0cGFpciA6PSBpbmRleCAnPScgYWN0aW9uXG4iCisiXHRhY3Rpb24gOj0gbWFjX2FkZHJcbiIKKyJcdGFjdGlvbiA6PSBtYWNfYWRkciAnKydcbiIKKyJcdGFjdGlvbiA6PSAnXydcbiIKKyJ3aGVyZVxuIgorIlx0aW5kZXggLS0gYW4gaW50ZWdlciBbMC4uMjU1XVxuIgorIlx0bWFjX2FkZHIgLS0gYSBNQUMgYWRkcmVzcyBpbiBmb3JtYXQgeHg6eHg6eHg6eHg6eHg6eHhcbiIKKyJJZiAnXycgYXQgc29tZSBpbmRleCBpcyBzcGVjaWZpZWQsIHBhY2tldHMgd2l0aCBsYXN0ICVzIElQIGFkZHJlc3MgYnl0ZVxuIgorImVxdWFsIHRvIGluZGV4IGFyZSBEUk9QcGVkLiBJZiB0aGVyZSBpcyBhIE1BQyBhZGRyZXNzLCB0aGV5IGFyZSAlMS4xc25hdHRlZFxuIgorInRvIHRoaXMgYW5kIHRoZSB0YXJnZXQgaXMgQ09OVElOVUUuIElmIHRoaXMgTUFDIGlzIGZvbGxvd2VkIGJ5ICcrJywgdGhlXG4iCisidGFyZ2V0IGlzIEFDQ0VQVC5cbiIKKyJGb3IgZXhhbXBsZSxcbiIKKyItLWlkbmF0LWxpc3QgMj0yMDoyMToyMjoyMzoyNDoyNSw0PV8sNz0zMDozMTozMjozMzozNDozNSxcbiIKKyJpcyB2YWxpZC5cbiIKKyJUaGUgc3VibmV0IE1VU1QgYmUgc3BlY2lmaWVkLiBPbmx5IHBhY2tldHMgd2l0aCAzIGZpcnN0IGJ5dGVzIG9mIHRoZWlyXG4iCisiJXMgYWRkcmVzcyBhcmUgY29uc2lkZXJlZC4gLS1pJTEuMXNuYXQtc3ViIHBhcmFtZXRlciBtdXN0IGJlZ2luIHdpdGhcbiIKKyIzIGludGVnZXJzIHNlcGFyYXRlZCBieSBkb3RzLiBPbmx5IHRoZXkgYXJlIGNvbnNpZGVyZWQsIHRoZSByZXN0IGlzIGlnbm9yZWQuXG4iCisiTm8gbWF0dGVyIGlmIHlvdSB3cml0ZSAnMTkyLjE2OC40Mi4nLCAnMTkyLjE2OC40Mi4wJywgJzE5Mi4xNjguNDIuMTInLFxuIgorIicxOTIuMTY4LjQyLjAvMjQnLCAnMTkyLjE2OC40Mi4wLzIzJyBvciAnMTkyLjE2OC40Mi5pJTEuMXNuYXRfc3Vja3MhISEnLFxuIgorIlRoZSBudW1iZXJzIDE5MiwgMTY4IGFuZCA0MiBhcmUgdGFrZW4gYW5kIGl0IGJlaGF2ZXMgbGlrZSBhIC8yNCBJUCBzdWJuZXQuXG4iCisiLS1pJTEuMXNuYXQtZGVmYXVsdC10YXJnZXQgYWZmZWN0cyBvbmx5IHRoZSBwYWNrZXQgbm90IG1hdGNoaW5nIHRoZSBzdWJuZXQuXG4iLAorCQljYXMsIGNhcywgY2FzLCBjYXMsIGNhcywgY2FzLCBjYXMsIGNhcywKKwkJY2FzLCBjYXMsIGNhcywgY2FzLCBjYXMsIGNhcywgY2FzLCBjYXMKKwkpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9oZWxwX3MoKQoreworCXByaW50X2hlbHBfY29tbW9uKCJzcmMiKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfaGVscF9kKCkKK3sKKwlwcmludF9oZWxwX2NvbW1vbigiZGVzdCIpOworfQorCitzdGF0aWMgdm9pZCBpbml0X3Moc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKnRhcmdldCkKK3sKKwlzdHJ1Y3QgZWJ0X2luYXRfaW5mbyAqbmF0aW5mbyA9IChzdHJ1Y3QgZWJ0X2luYXRfaW5mbyAqKXRhcmdldC0+ZGF0YTsKKworCXNfc3ViX3N1cHBsaWVkID0gMDsKKwltZW1zZXQobmF0aW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBlYnRfaW5hdF9pbmZvKSk7CisJbmF0aW5mby0+dGFyZ2V0ID0gRUJUX0NPTlRJTlVFOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgaW5pdF9kKHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICp0YXJnZXQpCit7CisJc3RydWN0IGVidF9pbmF0X2luZm8gKm5hdGluZm8gPSAoc3RydWN0IGVidF9pbmF0X2luZm8gKil0YXJnZXQtPmRhdGE7CisKKwlkX3N1Yl9zdXBwbGllZCA9IDA7CisJbWVtc2V0KG5hdGluZm8sIDAsIHNpemVvZihzdHJ1Y3QgZWJ0X2luYXRfaW5mbykpOworCW5hdGluZm8tPnRhcmdldCA9IEVCVF9DT05USU5VRTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX2xpc3QoY29uc3QgY2hhciAqYXJnLCBzdHJ1Y3QgZWJ0X2luYXRfaW5mbyAqaW5mbykKK3sKKwlpbnQgaTsKKwljaGFyIGM7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgbm93X2luZGV4ID0gMTsKKwlpbnQgaW5kZXg7CisJY2hhciBidWZbNF07CisJdW5zaWduZWQgY2hhciBtYWNbNl07CisJaW50IGlidWYgPSAwOworCWludCBpbWFjID0gMDsKKwlpbnQgdGFyZ2V0OworCW1lbXNldChidWYsIDAsIDQpOworCWkgPSAwOworCXdoaWxlICgxKSB7CisJCWMgPSBhcmdbaV07CisJCWlmIChub3dfaW5kZXgpIHsKKwkJCWlmIChpc2RpZ2l0KGMpKSB7CisJCQkJYnVmW2lidWYrK10gPSBjOworCQkJCWlmIChpYnVmID4gMykgeworCQkJCQlwcmludF9lcnJvcigiSW5kZXggdG9vIGxvbmcgYXQgcG9zaXRpb24gJWQiLCBpKTsKKwkJCQl9CisJCQkJZ290byBuZXh0OworCQkJfQorCQkJaWYgKGMgPT0gJz0nKSB7CisJCQkJaWYgKGlidWYgPT0gMCkgeworCQkJCQlwcmludF9lcnJvcigiSW50ZWdlciBpbmRleCBleHBlY3RlZCBiZWZvcmUgJz0nIGF0IHBvc2l0aW9uICVkIiwgaSk7CisJCQkJfQorCQkJCWJ1ZltpYnVmXSA9IDA7CisJCQkJaWJ1ZiA9IDA7CisJCQkJaW5kZXggPSBhdG9pKGJ1Zik7CisJCQkJaWYgKGluZGV4IDwgMCB8fCAyNTUgPCBpbmRleCkgeworCQkJCQlwcmludF9lcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIFswLi4yNTVdLCBuYW1lbHkgJWQiLCBpbmRleCk7CisJCQkJfQorCQkJCW5vd19pbmRleCA9IDA7CisJCQkJbWVtc2V0KG1hYywgMCwgNik7CisJCQkJaW1hYyA9IDA7CisJCQkJdGFyZ2V0ID0gRUJUX0NPTlRJTlVFOworCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJCWlmIChjID09ICdcMCcpIHsKKwkJCQlnb3RvIG5leHQ7CisJCQl9CisJCQlwcmludF9lcnJvcigiVW5leHBlY3RlZCAnJWMnIHdoZXJlIGludGVnZXIgb3IgJz0nIGV4cGVjdGVkIiwgYyk7CisJCX0KKwkJZWxzZSB7CisJCQlpZiAoaXN4ZGlnaXQoYykpIHsKKwkJCQlidWZbaWJ1ZisrXSA9IGM7CisJCQkJaWYgKGlidWYgPiAyKSB7CisJCQkJCXByaW50X2Vycm9yKCJNQUMgYWRkcmVzcyBjaHVuayB0b28gbG9uZyBhdCBwb3NpdGlvbiAlZCIsIGkpOworCQkJCX0KKwkJCQlnb3RvIG5leHQ7CisJCQl9CisJCQlpZiAoYyA9PSAnOicgfHwgYyA9PSAnLCcgfHwgYyA9PSAnXDAnKSB7CisJCQkJYnVmW2lidWZdID0gMDsKKwkJCQlpYnVmID0gMDsKKwkJCQltYWNbaW1hYysrXSA9IHN0cnRvbChidWYsIDAsIDE2KTsKKwkJCQlpZiAoYyA9PSAnLCcgfHwgYyA9PSAnXDAnKSB7CisJCQkJCWluZm8tPmFbaW5kZXhdLmVuYWJsZWQgPSAxOworCQkJCQlpbmZvLT5hW2luZGV4XS50YXJnZXQgPSB0YXJnZXQ7CisJCQkJCW1lbWNweShpbmZvLT5hW2luZGV4XS5tYWMsIG1hYywgNik7CisJCQkJCW5vd19pbmRleCA9IDE7CisJCQkJCWNvdW50Kys7CisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQkJaWYgKGMgPT0gJzonICYmIGltYWMgPj0gNikgeworCQkJCQlwcmludF9lcnJvcigiVG9vIG1hbnkgTUFDIGFkZHJlc3MgY2h1bmtzIGF0IHBvc2l0aW9uICVkIiwgaSk7CisJCQkJfQorCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJCWlmIChjID09ICdfJykgeworCQkJCXRhcmdldCA9IEVCVF9EUk9QOworCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJCWlmIChjID09ICcrJykgeworCQkJCXRhcmdldCA9IEVCVF9BQ0NFUFQ7CisJCQkJZ290byBuZXh0OworCQkJfQorCQkJcHJpbnRfZXJyb3IoIlVuZXhwZWN0ZWQgJyVjJyB3aGVyZSBoZXggZGlnaXQsICdfJywgJysnLCAnLCcgb3IgZW5kIG9mIHN0cmluZyBleHBlY3RlZCIsIGMpOworCQl9CisJbmV4dDoKKwkJaWYgKCFjKSBicmVhazsKKwkJaSsrOworCX0KKwlpZiAoY291bnQgPT0gMCkgeworCQlwcmludF9lcnJvcigiTGlzdCBlbXB0eSIpOworCX0KK30KKworc3RhdGljIHVpbnQzMl90IHBhcnNlX2lwKGNvbnN0IGNoYXIgKnMpCit7CisJaW50IGEwLCBhMSwgYTI7CisJY2hhciBpcFs0XTsKKwlzc2NhbmYocywgIiVkLiVkLiVkIiwgJmEwLCAmYTEsICZhMik7CisJaXBbMF0gPSBhMDsKKwlpcFsxXSA9IGExOworCWlwWzJdID0gYTI7CisJaXBbM10gPSAwOworCXJldHVybiAqKHVpbnQzMl90KilpcDsKK30KKworI2RlZmluZSBPUFRfSVNOQVQgICAgICAgICAweDAxCisjZGVmaW5lIE9QVF9JU05BVF9TVUIgICAgIDB4MDIKKyNkZWZpbmUgT1BUX0lTTkFUX1RBUkdFVCAgMHgwNAorc3RhdGljIGludCBwYXJzZV9zKGludCBjLCBjaGFyICoqYXJndiwgaW50IGFyZ2MsCisgICBjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LCB1bnNpZ25lZCBpbnQgKmZsYWdzLAorICAgc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKip0YXJnZXQpCit7CisJc3RydWN0IGVidF9pbmF0X2luZm8gKm5hdGluZm8gPSAoc3RydWN0IGVidF9pbmF0X2luZm8gKikoKnRhcmdldCktPmRhdGE7CisKKwlzd2l0Y2ggKGMpIHsKKwljYXNlIE5BVF9TOgorCQljaGVja19vcHRpb24oZmxhZ3MsIE9QVF9JU05BVCk7CisJCXBhcnNlX2xpc3Qob3B0YXJnLCBuYXRpbmZvKTsKKwkJYnJlYWs7CisJY2FzZSBOQVRfU19UQVJHRVQ6CisJCWNoZWNrX29wdGlvbihmbGFncywgT1BUX0lTTkFUX1RBUkdFVCk7CisJCWlmIChGSUxMX1RBUkdFVChvcHRhcmcsIG5hdGluZm8tPnRhcmdldCkpCisJCQlwcmludF9lcnJvcigiSWxsZWdhbCAtLWlzbmF0LWRlZmF1bHQtdGFyZ2V0IHRhcmdldCIpOworCQlicmVhazsKKwljYXNlIE5BVF9TX1NVQjoKKwkJbmF0aW5mby0+aXBfc3VibmV0ID0gcGFyc2VfaXAob3B0YXJnKTsKKwkJc19zdWJfc3VwcGxpZWQgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgT1BUX0lETkFUICAgICAgICAweDAxCisjZGVmaW5lIE9QVF9JRE5BVF9TVUIgICAgMHgwMgorI2RlZmluZSBPUFRfSUROQVRfVEFSR0VUIDB4MDQKK3N0YXRpYyBpbnQgcGFyc2VfZChpbnQgYywgY2hhciAqKmFyZ3YsIGludCBhcmdjLAorICAgY29uc3Qgc3RydWN0IGVidF91X2VudHJ5ICplbnRyeSwgdW5zaWduZWQgaW50ICpmbGFncywKKyAgIHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICoqdGFyZ2V0KQoreworCXN0cnVjdCBlYnRfaW5hdF9pbmZvICpuYXRpbmZvID0gKHN0cnVjdCBlYnRfaW5hdF9pbmZvICopKCp0YXJnZXQpLT5kYXRhOworCisJc3dpdGNoIChjKSB7CisJY2FzZSBOQVRfRDoKKwkJY2hlY2tfb3B0aW9uKGZsYWdzLCBPUFRfSUROQVQpOworCQlwYXJzZV9saXN0KG9wdGFyZywgbmF0aW5mbyk7CisJCWJyZWFrOworCWNhc2UgTkFUX0RfVEFSR0VUOgorCQljaGVja19vcHRpb24oZmxhZ3MsIE9QVF9JRE5BVF9UQVJHRVQpOworCQlpZiAoRklMTF9UQVJHRVQob3B0YXJnLCBuYXRpbmZvLT50YXJnZXQpKQorCQkJcHJpbnRfZXJyb3IoIklsbGVnYWwgLS1pZG5hdC1kZWZhdWx0LXRhcmdldCB0YXJnZXQiKTsKKwkJYnJlYWs7CisJY2FzZSBOQVRfRF9TVUI6CisJCW5hdGluZm8tPmlwX3N1Ym5ldCA9IHBhcnNlX2lwKG9wdGFyZyk7CisJCWRfc3ViX3N1cHBsaWVkID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBmaW5hbF9jaGVja19zKGNvbnN0IHN0cnVjdCBlYnRfdV9lbnRyeSAqZW50cnksCisgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdGFyZ2V0LCBjb25zdCBjaGFyICpuYW1lLAorICAgdW5zaWduZWQgaW50IGhvb2ttYXNrLCB1bnNpZ25lZCBpbnQgdGltZSkKK3sKKwlzdHJ1Y3QgZWJ0X2luYXRfaW5mbyAqbmF0aW5mbyA9IChzdHJ1Y3QgZWJ0X2luYXRfaW5mbyAqKXRhcmdldC0+ZGF0YTsKKworCWlmIChCQVNFX0NIQUlOICYmIG5hdGluZm8tPnRhcmdldCA9PSBFQlRfUkVUVVJOKQorCQlwcmludF9lcnJvcigiLS1pc25hdC1kZWZhdWx0LXRhcmdldCBSRVRVUk4gbm90IGFsbG93ZWQgb24gYmFzZSBjaGFpbiIpOworCUNMRUFSX0JBU0VfQ0hBSU5fQklUOworCWlmICgoaG9va21hc2sgJiB+KDEgPDwgTkZfQlJfUE9TVF9ST1VUSU5HKSkgfHwgc3RyY21wKG5hbWUsICJuYXQiKSkKKwkJcHJpbnRfZXJyb3IoIldyb25nIGNoYWluIGZvciBpc25hdCIpOworCWlmICh0aW1lID09IDAgJiYgc19zdWJfc3VwcGxpZWQgPT0gMCkKKwkJcHJpbnRfZXJyb3IoIk5vIGlzbmF0IHN1Ym5ldCBzdXBwbGllZCIpOworfQorCitzdGF0aWMgdm9pZCBmaW5hbF9jaGVja19kKGNvbnN0IHN0cnVjdCBlYnRfdV9lbnRyeSAqZW50cnksCisgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdGFyZ2V0LCBjb25zdCBjaGFyICpuYW1lLAorICAgdW5zaWduZWQgaW50IGhvb2ttYXNrLCB1bnNpZ25lZCBpbnQgdGltZSkKK3sKKwlzdHJ1Y3QgZWJ0X2luYXRfaW5mbyAqbmF0aW5mbyA9IChzdHJ1Y3QgZWJ0X2luYXRfaW5mbyAqKXRhcmdldC0+ZGF0YTsKKworCWlmIChCQVNFX0NIQUlOICYmIG5hdGluZm8tPnRhcmdldCA9PSBFQlRfUkVUVVJOKQorCQlwcmludF9lcnJvcigiLS1pZG5hdC1kZWZhdWx0LXRhcmdldCBSRVRVUk4gbm90IGFsbG93ZWQgb24gYmFzZSBjaGFpbiIpOworCUNMRUFSX0JBU0VfQ0hBSU5fQklUOworCWlmICgoKGhvb2ttYXNrICYgfigoMSA8PCBORl9CUl9QUkVfUk9VVElORykgfCAoMSA8PCBORl9CUl9MT0NBTF9PVVQpKSkKKwkgICB8fCBzdHJjbXAobmFtZSwgIm5hdCIpKSAmJgorCSAgICgoaG9va21hc2sgJiB+KDEgPDwgTkZfQlJfQlJPVVRJTkcpKSB8fCBzdHJjbXAobmFtZSwgImJyb3V0ZSIpKSkKKwkJcHJpbnRfZXJyb3IoIldyb25nIGNoYWluIGZvciBpZG5hdCIpOworCWlmICh0aW1lID09IDAgJiYgZF9zdWJfc3VwcGxpZWQgPT0gMCkKKwkJcHJpbnRfZXJyb3IoIk5vIGlkbmF0IHN1Ym5ldCBzdXBwbGllZCIpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9saXN0KGNvbnN0IHN0cnVjdCBlYnRfaW5hdF9pbmZvICppbmZvKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlpZiAoaW5mby0+YVtpXS5lbmFibGVkKSB7CisJCQlwcmludGYoIiVkPSIsIGkpOworCQkJaWYgKGluZm8tPmFbaV0udGFyZ2V0ID09IEVCVF9EUk9QKSB7CisJCQkJcHJpbnRmKCJfIik7CisJCQl9CisJCQllbHNlIHsKKwkJCQlpZiAoaW5mby0+YVtpXS50YXJnZXQgPT0gRUJUX0FDQ0VQVCkgeworCQkJCQlwcmludGYoIisiKTsKKwkJCQl9CisJCQkJcHJpbnRfbWFjKGluZm8tPmFbaV0ubWFjKTsKKwkJCX0KKwkJCXByaW50ZigiLCIpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBwcmludF9zKGNvbnN0IHN0cnVjdCBlYnRfdV9lbnRyeSAqZW50cnksCisgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdGFyZ2V0KQoreworCXN0cnVjdCBlYnRfaW5hdF9pbmZvICppbmZvID0gKHN0cnVjdCBlYnRfaW5hdF9pbmZvICopdGFyZ2V0LT5kYXRhOworCisJdW5zaWduZWQgY2hhciBzdWJbNF07CisJKih1aW50MzJfdCopc3ViID0gaW5mby0+aXBfc3VibmV0OworCXByaW50ZigiLS1pc25hdC1zdWIgJXUuJXUuJXUuMC8yNCIsIHN1YlswXSwgc3ViWzFdLCBzdWJbMl0pOworCXByaW50ZigiIC0taXNuYXQtbGlzdCAiKTsKKwlwcmludF9saXN0KGluZm8pOworCXByaW50ZigiIC0taXNuYXQtZGVmYXVsdC10YXJnZXQgJXMiLCBUQVJHRVRfTkFNRShpbmZvLT50YXJnZXQpKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfZChjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKnRhcmdldCkKK3sKKwlzdHJ1Y3QgZWJ0X2luYXRfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZWJ0X2luYXRfaW5mbyAqKXRhcmdldC0+ZGF0YTsKKworCXVuc2lnbmVkIGNoYXIgc3ViWzRdOworCSoodWludDMyX3QqKXN1YiA9IGluZm8tPmlwX3N1Ym5ldDsKKwlwcmludGYoIi0taWRuYXQtc3ViICV1LiV1LiV1LjAvMjQiLCBzdWJbMF0sIHN1YlsxXSwgc3ViWzJdKTsKKwlwcmludGYoIiAtLWlkbmF0LWxpc3QgIik7CisJcHJpbnRfbGlzdChpbmZvKTsKKwlwcmludGYoIiAtLWlkbmF0LWRlZmF1bHQtdGFyZ2V0ICVzIiwgVEFSR0VUX05BTUUoaW5mby0+dGFyZ2V0KSk7Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZShjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdDEsCisgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdDIpCit7CisJc3RydWN0IGVidF9pbmF0X2luZm8gKm5hdGluZm8xID0gKHN0cnVjdCBlYnRfaW5hdF9pbmZvICopdDEtPmRhdGE7CisJc3RydWN0IGVidF9pbmF0X2luZm8gKm5hdGluZm8yID0gKHN0cnVjdCBlYnRfaW5hdF9pbmZvICopdDItPmRhdGE7CisKKworCXJldHVybiAhbWVtY21wKG5hdGluZm8xLCBuYXRpbmZvMiwgc2l6ZW9mKHN0cnVjdCBlYnRfaW5hdF9pbmZvKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWJ0X3VfdGFyZ2V0IGlzbmF0X3RhcmdldCA9Cit7CisJLm5hbWUJCT0gRUJUX0lTTkFUX1RBUkdFVCwKKwkuc2l6ZQkJPSBzaXplb2Yoc3RydWN0IGVidF9pbmF0X2luZm8pLAorCS5oZWxwCQk9IHByaW50X2hlbHBfcywKKwkuaW5pdAkJPSBpbml0X3MsCisJLnBhcnNlCQk9IHBhcnNlX3MsCisJLmZpbmFsX2NoZWNrCT0gZmluYWxfY2hlY2tfcywKKwkucHJpbnQJCT0gcHJpbnRfcywKKwkuY29tcGFyZQk9IGNvbXBhcmUsCisJLmV4dHJhX29wcwk9IG9wdHNfcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgZWJ0X3VfdGFyZ2V0IGlkbmF0X3RhcmdldCA9Cit7CisJLm5hbWUJCT0gRUJUX0lETkFUX1RBUkdFVCwKKwkuc2l6ZQkJPSBzaXplb2Yoc3RydWN0IGVidF9pbmF0X2luZm8pLAorCS5oZWxwCQk9IHByaW50X2hlbHBfZCwKKwkuaW5pdAkJPSBpbml0X2QsCisJLnBhcnNlCQk9IHBhcnNlX2QsCisJLmZpbmFsX2NoZWNrCT0gZmluYWxfY2hlY2tfZCwKKwkucHJpbnQJCT0gcHJpbnRfZCwKKwkuY29tcGFyZQk9IGNvbXBhcmUsCisJLmV4dHJhX29wcwk9IG9wdHNfZCwKK307CisKK3N0YXRpYyB2b2lkIF9JTklUKHZvaWQpCit7CisJcmVnaXN0ZXJfdGFyZ2V0KCZpc25hdF90YXJnZXQpOworCXJlZ2lzdGVyX3RhcmdldCgmaWRuYXRfdGFyZ2V0KTsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZWJ0X2lwLmMgYi9leHRlbnNpb25zL2VidF9pcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZmZhZGUKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2VidF9pcC5jCkBAIC0wLDAgKzEsNDc4IEBACisvKiBlYnRfaXAKKyAqIAorICogQXV0aG9yczoKKyAqIEJhcnQgRGUgU2NodXltZXIgPGJkc2NodXltQHBhbmRvcmEuYmU+CisgKgorICogQ2hhbmdlczoKKyAqICAgIGFkZGVkIGlwLXNwb3J0IGFuZCBpcC1kcG9ydDsgcGFyc2luZyBvZiBwb3J0IGFyZ3VtZW50cyBpcworICogICAgYmFzZWQgb24gY29kZSBmcm9tIGlwdGFibGVzLTEuMi43YQorICogICAgSW5ub21pbmF0ZSBTZWN1cml0eSBUZWNobm9sb2dpZXMgQUcgPG1ob3BmQGlubm9taW5hdGUuY29tPgorICogICAgU2VwdGVtYmVyLCAyMDAyCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlICIuLi9pbmNsdWRlL2VidGFibGVzX3UuaCIKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9pcC5oPgorCisjZGVmaW5lIElQX1NPVVJDRSAnMScKKyNkZWZpbmUgSVBfREVTVCAgICcyJworI2RlZmluZSBJUF9teVRPUyAgJzMnIC8qIGluY2x1ZGUvYml0cy9pbi5oIHNlZW1zIHRvIGFscmVhZHkgZGVmaW5lIElQX1RPUyAqLworI2RlZmluZSBJUF9QUk9UTyAgJzQnCisjZGVmaW5lIElQX1NQT1JUICAnNScKKyNkZWZpbmUgSVBfRFBPUlQgICc2JworI2RlZmluZSBJUF9JQ01QICAgJzcnCisjZGVmaW5lIElQX0lHTVAgICAnOCcKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gb3B0c1tdID0KK3sKKwl7ICJpcC1zb3VyY2UiICAgICAgICAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBJUF9TT1VSQ0UgfSwKKwl7ICJpcC1zcmMiICAgICAgICAgICAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBJUF9TT1VSQ0UgfSwKKwl7ICJpcC1kZXN0aW5hdGlvbiIgICAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBJUF9ERVNUICAgfSwKKwl7ICJpcC1kc3QiICAgICAgICAgICAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBJUF9ERVNUICAgfSwKKwl7ICJpcC10b3MiICAgICAgICAgICAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBJUF9teVRPUyAgfSwKKwl7ICJpcC1wcm90b2NvbCIgICAgICAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBJUF9QUk9UTyAgfSwKKwl7ICJpcC1wcm90byIgICAgICAgICAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBJUF9QUk9UTyAgfSwKKwl7ICJpcC1zb3VyY2UtcG9ydCIgICAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBJUF9TUE9SVCAgfSwKKwl7ICJpcC1zcG9ydCIgICAgICAgICAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBJUF9TUE9SVCAgfSwKKwl7ICJpcC1kZXN0aW5hdGlvbi1wb3J0IiAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBJUF9EUE9SVCAgfSwKKwl7ICJpcC1kcG9ydCIgICAgICAgICAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBJUF9EUE9SVCAgfSwKKwl7ICJpcC1pY21wLXR5cGUiICAgICAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBJUF9JQ01QICAgfSwKKwl7ICJpcC1pZ21wLXR5cGUiICAgICAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBJUF9JR01QICAgfSwKKwl7IDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlYnRfaWNtcF9uYW1lcyBpY21wX2NvZGVzW10gPSB7CisJeyAiZWNoby1yZXBseSIsIDAsIDAsIDB4RkYgfSwKKwkvKiBBbGlhcyAqLyB7ICJwb25nIiwgMCwgMCwgMHhGRiB9LAorCisJeyAiZGVzdGluYXRpb24tdW5yZWFjaGFibGUiLCAzLCAwLCAweEZGIH0sCisJeyAgICJuZXR3b3JrLXVucmVhY2hhYmxlIiwgMywgMCwgMCB9LAorCXsgICAiaG9zdC11bnJlYWNoYWJsZSIsIDMsIDEsIDEgfSwKKwl7ICAgInByb3RvY29sLXVucmVhY2hhYmxlIiwgMywgMiwgMiB9LAorCXsgICAicG9ydC11bnJlYWNoYWJsZSIsIDMsIDMsIDMgfSwKKwl7ICAgImZyYWdtZW50YXRpb24tbmVlZGVkIiwgMywgNCwgNCB9LAorCXsgICAic291cmNlLXJvdXRlLWZhaWxlZCIsIDMsIDUsIDUgfSwKKwl7ICAgIm5ldHdvcmstdW5rbm93biIsIDMsIDYsIDYgfSwKKwl7ICAgImhvc3QtdW5rbm93biIsIDMsIDcsIDcgfSwKKwl7ICAgIm5ldHdvcmstcHJvaGliaXRlZCIsIDMsIDksIDkgfSwKKwl7ICAgImhvc3QtcHJvaGliaXRlZCIsIDMsIDEwLCAxMCB9LAorCXsgICAiVE9TLW5ldHdvcmstdW5yZWFjaGFibGUiLCAzLCAxMSwgMTEgfSwKKwl7ICAgIlRPUy1ob3N0LXVucmVhY2hhYmxlIiwgMywgMTIsIDEyIH0sCisJeyAgICJjb21tdW5pY2F0aW9uLXByb2hpYml0ZWQiLCAzLCAxMywgMTMgfSwKKwl7ICAgImhvc3QtcHJlY2VkZW5jZS12aW9sYXRpb24iLCAzLCAxNCwgMTQgfSwKKwl7ICAgInByZWNlZGVuY2UtY3V0b2ZmIiwgMywgMTUsIDE1IH0sCisKKwl7ICJzb3VyY2UtcXVlbmNoIiwgNCwgMCwgMHhGRiB9LAorCisJeyAicmVkaXJlY3QiLCA1LCAwLCAweEZGIH0sCisJeyAgICJuZXR3b3JrLXJlZGlyZWN0IiwgNSwgMCwgMCB9LAorCXsgICAiaG9zdC1yZWRpcmVjdCIsIDUsIDEsIDEgfSwKKwl7ICAgIlRPUy1uZXR3b3JrLXJlZGlyZWN0IiwgNSwgMiwgMiB9LAorCXsgICAiVE9TLWhvc3QtcmVkaXJlY3QiLCA1LCAzLCAzIH0sCisKKwl7ICJlY2hvLXJlcXVlc3QiLCA4LCAwLCAweEZGIH0sCisJLyogQWxpYXMgKi8geyAicGluZyIsIDgsIDAsIDB4RkYgfSwKKworCXsgInJvdXRlci1hZHZlcnRpc2VtZW50IiwgOSwgMCwgMHhGRiB9LAorCisJeyAicm91dGVyLXNvbGljaXRhdGlvbiIsIDEwLCAwLCAweEZGIH0sCisKKwl7ICJ0aW1lLWV4Y2VlZGVkIiwgMTEsIDAsIDB4RkYgfSwKKwkvKiBBbGlhcyAqLyB7ICJ0dGwtZXhjZWVkZWQiLCAxMSwgMCwgMHhGRiB9LAorCXsgICAidHRsLXplcm8tZHVyaW5nLXRyYW5zaXQiLCAxMSwgMCwgMCB9LAorCXsgICAidHRsLXplcm8tZHVyaW5nLXJlYXNzZW1ibHkiLCAxMSwgMSwgMSB9LAorCisJeyAicGFyYW1ldGVyLXByb2JsZW0iLCAxMiwgMCwgMHhGRiB9LAorCXsgICAiaXAtaGVhZGVyLWJhZCIsIDEyLCAwLCAwIH0sCisJeyAgICJyZXF1aXJlZC1vcHRpb24tbWlzc2luZyIsIDEyLCAxLCAxIH0sCisKKwl7ICJ0aW1lc3RhbXAtcmVxdWVzdCIsIDEzLCAwLCAweEZGIH0sCisKKwl7ICJ0aW1lc3RhbXAtcmVwbHkiLCAxNCwgMCwgMHhGRiB9LAorCisJeyAiYWRkcmVzcy1tYXNrLXJlcXVlc3QiLCAxNywgMCwgMHhGRiB9LAorCisJeyAiYWRkcmVzcy1tYXNrLXJlcGx5IiwgMTgsIDAsIDB4RkYgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlYnRfaWNtcF9uYW1lcyBpZ21wX3R5cGVzW10gPSB7CisJeyAibWVtYmVyc2hpcC1xdWVyeSIsIDB4MTEgfSwKKwl7ICJtZW1iZXJzaGlwLXJlcG9ydC12MSIsIDB4MTIgfSwKKwl7ICJtZW1iZXJzaGlwLXJlcG9ydC12MiIsIDB4MTYgfSwKKwl7ICJsZWF2ZS1ncm91cCIsIDB4MTcgfSwKKwl7ICJtZW1iZXJzaGlwLXJlcG9ydC12MyIsIDB4MjIgfSwKK307CisKKy8qIHB1dCB0aGUgbWFzayBpbnRvIDQgYnl0ZXMgKi8KKy8qIHRyYW5zZm9ybSBhIHByb3RvY29sIGFuZCBzZXJ2aWNlIG5hbWUgaW50byBhIHBvcnQgbnVtYmVyICovCitzdGF0aWMgdWludDE2X3QgcGFyc2VfcG9ydChjb25zdCBjaGFyICpwcm90b2NvbCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc2VydmVudCAqc2VydmljZTsKKwljaGFyICplbmQ7CisJaW50IHBvcnQ7CisKKwlwb3J0ID0gc3RydG9sKG5hbWUsICZlbmQsIDEwKTsKKwlpZiAoKmVuZCAhPSAnXDAnKSB7CisJCWlmIChwcm90b2NvbCAmJiAKKwkJICAgIChzZXJ2aWNlID0gZ2V0c2VydmJ5bmFtZShuYW1lLCBwcm90b2NvbCkpICE9IE5VTEwpCisJCQlyZXR1cm4gbnRvaHMoc2VydmljZS0+c19wb3J0KTsKKwl9CisJZWxzZSBpZiAocG9ydCA+PSAwIHx8IHBvcnQgPD0gMHhGRkZGKSB7CisJCXJldHVybiBwb3J0OworCX0KKwllYnRfcHJpbnRfZXJyb3IoIlByb2JsZW0gd2l0aCBzcGVjaWZpZWQgJXMgcG9ydCAnJXMnIiwgCisJCQlwcm90b2NvbD9wcm90b2NvbDoiIiwgbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitwYXJzZV9wb3J0X3JhbmdlKGNvbnN0IGNoYXIgKnByb3RvY29sLCBjb25zdCBjaGFyICpwb3J0c3RyaW5nLCB1aW50MTZfdCAqcG9ydHMpCit7CisJY2hhciAqYnVmZmVyOworCWNoYXIgKmNwOworCQorCWJ1ZmZlciA9IHN0cmR1cChwb3J0c3RyaW5nKTsKKwlpZiAoKGNwID0gc3RyY2hyKGJ1ZmZlciwgJzonKSkgPT0gTlVMTCkKKwkJcG9ydHNbMF0gPSBwb3J0c1sxXSA9IHBhcnNlX3BvcnQocHJvdG9jb2wsIGJ1ZmZlcik7CisJZWxzZSB7CisJCSpjcCA9ICdcMCc7CisJCWNwKys7CisJCXBvcnRzWzBdID0gYnVmZmVyWzBdID8gcGFyc2VfcG9ydChwcm90b2NvbCwgYnVmZmVyKSA6IDA7CisJCWlmIChlYnRfZXJyb3Jtc2dbMF0gIT0gJ1wwJykKKwkJCXJldHVybjsKKwkJcG9ydHNbMV0gPSBjcFswXSA/IHBhcnNlX3BvcnQocHJvdG9jb2wsIGNwKSA6IDB4RkZGRjsKKwkJaWYgKGVidF9lcnJvcm1zZ1swXSAhPSAnXDAnKQorCQkJcmV0dXJuOworCQkKKwkJaWYgKHBvcnRzWzBdID4gcG9ydHNbMV0pCisJCQllYnRfcHJpbnRfZXJyb3IoIkludmFsaWQgcG9ydHJhbmdlIChtaW4gPiBtYXgpIik7CisJfQorCWZyZWUoYnVmZmVyKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfcG9ydF9yYW5nZSh1aW50MTZfdCAqcG9ydHMpCit7CisJaWYgKHBvcnRzWzBdID09IHBvcnRzWzFdKQorCQlwcmludGYoIiVkICIsIHBvcnRzWzBdKTsKKwllbHNlCisJCXByaW50ZigiJWQ6JWQgIiwgcG9ydHNbMF0sIHBvcnRzWzFdKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfaGVscCgpCit7CisJcHJpbnRmKAorImlwIG9wdGlvbnM6XG4iCisiLS1pcC1zcmMgICAgWyFdIGFkZHJlc3NbL21hc2tdOiBpcCBzb3VyY2Ugc3BlY2lmaWNhdGlvblxuIgorIi0taXAtZHN0ICAgIFshXSBhZGRyZXNzWy9tYXNrXTogaXAgZGVzdGluYXRpb24gc3BlY2lmaWNhdGlvblxuIgorIi0taXAtdG9zICAgIFshXSB0b3MgICAgICAgICAgIDogaXAgdG9zIHNwZWNpZmljYXRpb25cbiIKKyItLWlwLXByb3RvICBbIV0gcHJvdG9jb2wgICAgICA6IGlwIHByb3RvY29sIHNwZWNpZmljYXRpb25cbiIKKyItLWlwLXNwb3J0ICBbIV0gcG9ydFs6cG9ydF0gICA6IHRjcC91ZHAgc291cmNlIHBvcnQgb3IgcG9ydCByYW5nZVxuIgorIi0taXAtZHBvcnQgIFshXSBwb3J0Wzpwb3J0XSAgIDogdGNwL3VkcCBkZXN0aW5hdGlvbiBwb3J0IG9yIHBvcnQgcmFuZ2VcbiIKKyItLWlwLWljbXAtdHlwZSBbIV0gdHlwZVtbOnR5cGVdL2NvZGVbOmNvZGVdXSA6IGljbXAgdHlwZS9jb2RlIG9yIHR5cGUvY29kZSByYW5nZVxuIgorIi0taXAtaWdtcC10eXBlIFshXSB0eXBlWzp0eXBlXSAgICAgICAgICAgICAgIDogaWdtcCB0eXBlIG9yIHR5cGUgcmFuZ2VcbiIpOworCisJcHJpbnRmKCJcblZhbGlkIElDTVAgVHlwZXM6XG4iKTsKKwllYnRfcHJpbnRfaWNtcF90eXBlcyhpY21wX2NvZGVzLCBBUlJBWV9TSVpFKGljbXBfY29kZXMpKTsKKwlwcmludGYoIlxuVmFsaWQgSUdNUCBUeXBlczpcbiIpOworCWVidF9wcmludF9pY21wX3R5cGVzKGlnbXBfdHlwZXMsIEFSUkFZX1NJWkUoaWdtcF90eXBlcykpOworfQorCitzdGF0aWMgdm9pZCBpbml0KHN0cnVjdCBlYnRfZW50cnlfbWF0Y2ggKm1hdGNoKQoreworCXN0cnVjdCBlYnRfaXBfaW5mbyAqaXBpbmZvID0gKHN0cnVjdCBlYnRfaXBfaW5mbyAqKW1hdGNoLT5kYXRhOworCisJaXBpbmZvLT5pbnZmbGFncyA9IDA7CisJaXBpbmZvLT5iaXRtYXNrID0gMDsKK30KKworI2RlZmluZSBPUFRfU09VUkNFIDB4MDEKKyNkZWZpbmUgT1BUX0RFU1QgICAweDAyCisjZGVmaW5lIE9QVF9UT1MgICAgMHgwNAorI2RlZmluZSBPUFRfUFJPVE8gIDB4MDgKKyNkZWZpbmUgT1BUX1NQT1JUICAweDEwCisjZGVmaW5lIE9QVF9EUE9SVCAgMHgyMAorI2RlZmluZSBPUFRfSUNNUCAgIDB4NDAKKyNkZWZpbmUgT1BUX0lHTVAgICAweDgwCitzdGF0aWMgaW50IHBhcnNlKGludCBjLCBjaGFyICoqYXJndiwgaW50IGFyZ2MsIGNvbnN0IHN0cnVjdCBlYnRfdV9lbnRyeSAqZW50cnksCisgICB1bnNpZ25lZCBpbnQgKmZsYWdzLCBzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICoqbWF0Y2gpCit7CisJc3RydWN0IGVidF9pcF9pbmZvICppcGluZm8gPSAoc3RydWN0IGVidF9pcF9pbmZvICopKCptYXRjaCktPmRhdGE7CisJY2hhciAqZW5kOworCWxvbmcgaW50IGk7CisKKwlzd2l0Y2ggKGMpIHsKKwljYXNlIElQX1NPVVJDRToKKwkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIE9QVF9TT1VSQ0UpOworCQlpcGluZm8tPmJpdG1hc2sgfD0gRUJUX0lQX1NPVVJDRTsKKworCWNhc2UgSVBfREVTVDoKKwkJaWYgKGMgPT0gSVBfREVTVCkgeworCQkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIE9QVF9ERVNUKTsKKwkJCWlwaW5mby0+Yml0bWFzayB8PSBFQlRfSVBfREVTVDsKKwkJfQorCQlpZiAoZWJ0X2NoZWNrX2ludmVyc2UyKG9wdGFyZykpIHsKKwkJCWlmIChjID09IElQX1NPVVJDRSkKKwkJCQlpcGluZm8tPmludmZsYWdzIHw9IEVCVF9JUF9TT1VSQ0U7CisJCQllbHNlCisJCQkJaXBpbmZvLT5pbnZmbGFncyB8PSBFQlRfSVBfREVTVDsKKwkJfQorCQlpZiAoYyA9PSBJUF9TT1VSQ0UpCisJCQllYnRfcGFyc2VfaXBfYWRkcmVzcyhvcHRhcmcsICZpcGluZm8tPnNhZGRyLCAmaXBpbmZvLT5zbXNrKTsKKwkJZWxzZQorCQkJZWJ0X3BhcnNlX2lwX2FkZHJlc3Mob3B0YXJnLCAmaXBpbmZvLT5kYWRkciwgJmlwaW5mby0+ZG1zayk7CisJCWJyZWFrOworCisJY2FzZSBJUF9TUE9SVDoKKwljYXNlIElQX0RQT1JUOgorCQlpZiAoYyA9PSBJUF9TUE9SVCkgeworCQkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIE9QVF9TUE9SVCk7CisJCQlpcGluZm8tPmJpdG1hc2sgfD0gRUJUX0lQX1NQT1JUOworCQkJaWYgKGVidF9jaGVja19pbnZlcnNlMihvcHRhcmcpKQorCQkJCWlwaW5mby0+aW52ZmxhZ3MgfD0gRUJUX0lQX1NQT1JUOworCQl9IGVsc2UgeworCQkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIE9QVF9EUE9SVCk7CisJCQlpcGluZm8tPmJpdG1hc2sgfD0gRUJUX0lQX0RQT1JUOworCQkJaWYgKGVidF9jaGVja19pbnZlcnNlMihvcHRhcmcpKQorCQkJCWlwaW5mby0+aW52ZmxhZ3MgfD0gRUJUX0lQX0RQT1JUOworCQl9CisJCWlmIChjID09IElQX1NQT1JUKQorCQkJcGFyc2VfcG9ydF9yYW5nZShOVUxMLCBvcHRhcmcsIGlwaW5mby0+c3BvcnQpOworCQllbHNlCisJCQlwYXJzZV9wb3J0X3JhbmdlKE5VTEwsIG9wdGFyZywgaXBpbmZvLT5kcG9ydCk7CisJCWJyZWFrOworCisJY2FzZSBJUF9JQ01QOgorCQllYnRfY2hlY2tfb3B0aW9uMihmbGFncywgT1BUX0lDTVApOworCQlpcGluZm8tPmJpdG1hc2sgfD0gRUJUX0lQX0lDTVA7CisJCWlmIChlYnRfY2hlY2tfaW52ZXJzZTIob3B0YXJnKSkKKwkJCWlwaW5mby0+aW52ZmxhZ3MgfD0gRUJUX0lQX0lDTVA7CisJCWlmIChlYnRfcGFyc2VfaWNtcChpY21wX2NvZGVzLCBBUlJBWV9TSVpFKGljbXBfY29kZXMpLCBvcHRhcmcsCisJCQkJICAgaXBpbmZvLT5pY21wX3R5cGUsIGlwaW5mby0+aWNtcF9jb2RlKSkKKwkJCXJldHVybiAwOworCQlicmVhazsKKworCWNhc2UgSVBfSUdNUDoKKwkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIE9QVF9JR01QKTsKKwkJaXBpbmZvLT5iaXRtYXNrIHw9IEVCVF9JUF9JR01QOworCQlpZiAoZWJ0X2NoZWNrX2ludmVyc2UyKG9wdGFyZykpCisJCQlpcGluZm8tPmludmZsYWdzIHw9IEVCVF9JUF9JR01QOworCQlpZiAoZWJ0X3BhcnNlX2ljbXAoaWdtcF90eXBlcywgQVJSQVlfU0laRShpZ21wX3R5cGVzKSwgb3B0YXJnLAorCQkJCSAgIGlwaW5mby0+aWdtcF90eXBlLCBOVUxMKSkKKwkJCXJldHVybiAwOworCQlicmVhazsKKworCWNhc2UgSVBfbXlUT1M6CisJCWVidF9jaGVja19vcHRpb24yKGZsYWdzLCBPUFRfVE9TKTsKKwkJaWYgKGVidF9jaGVja19pbnZlcnNlMihvcHRhcmcpKQorCQkJaXBpbmZvLT5pbnZmbGFncyB8PSBFQlRfSVBfVE9TOworCQlpID0gc3RydG9sKG9wdGFyZywgJmVuZCwgMTYpOworCQlpZiAoaSA8IDAgfHwgaSA+IDI1NSB8fCAqZW5kICE9ICdcMCcpCisJCQllYnRfcHJpbnRfZXJyb3IyKCJQcm9ibGVtIHdpdGggc3BlY2lmaWVkIElQIHRvcyIpOworCQlpcGluZm8tPnRvcyA9IGk7CisJCWlwaW5mby0+Yml0bWFzayB8PSBFQlRfSVBfVE9TOworCQlicmVhazsKKworCWNhc2UgSVBfUFJPVE86CisJCWVidF9jaGVja19vcHRpb24yKGZsYWdzLCBPUFRfUFJPVE8pOworCQlpZiAoZWJ0X2NoZWNrX2ludmVyc2UyKG9wdGFyZykpCisJCQlpcGluZm8tPmludmZsYWdzIHw9IEVCVF9JUF9QUk9UTzsKKwkJaSA9IHN0cnRvdWwob3B0YXJnLCAmZW5kLCAxMCk7CisJCWlmICgqZW5kICE9ICdcMCcpIHsKKwkJCXN0cnVjdCBwcm90b2VudCAqcGU7CisKKwkJCXBlID0gZ2V0cHJvdG9ieW5hbWUob3B0YXJnKTsKKwkJCWlmIChwZSA9PSBOVUxMKQorCQkJCWVidF9wcmludF9lcnJvcigiVW5rbm93biBzcGVjaWZpZWQgSVAgcHJvdG9jb2wgLSAlcyIsIGFyZ3Zbb3B0aW5kIC0gMV0pOworCQkJaXBpbmZvLT5wcm90b2NvbCA9IHBlLT5wX3Byb3RvOworCQl9IGVsc2UgeworCQkJaXBpbmZvLT5wcm90b2NvbCA9ICh1bnNpZ25lZCBjaGFyKSBpOworCQl9CisJCWlwaW5mby0+Yml0bWFzayB8PSBFQlRfSVBfUFJPVE87CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZmluYWxfY2hlY2soY29uc3Qgc3RydWN0IGVidF91X2VudHJ5ICplbnRyeSwKKyAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnlfbWF0Y2ggKm1hdGNoLCBjb25zdCBjaGFyICpuYW1lLAorICAgdW5zaWduZWQgaW50IGhvb2ttYXNrLCB1bnNpZ25lZCBpbnQgdGltZSkKK3sKKwlzdHJ1Y3QgZWJ0X2lwX2luZm8gKmlwaW5mbyA9IChzdHJ1Y3QgZWJ0X2lwX2luZm8gKiltYXRjaC0+ZGF0YTsKKworCWlmIChlbnRyeS0+ZXRocHJvdG8gIT0gRVRIX1BfSVAgfHwgZW50cnktPmludmZsYWdzICYgRUJUX0lQUk9UTykgeworCQllYnRfcHJpbnRfZXJyb3IoIkZvciBJUCBmaWx0ZXJpbmcgdGhlIHByb3RvY29sIG11c3QgYmUgIgorCQkgICAgICAgICAgICAic3BlY2lmaWVkIGFzIElQdjQiKTsKKwl9IGVsc2UgaWYgKGlwaW5mby0+Yml0bWFzayAmIChFQlRfSVBfU1BPUlR8RUJUX0lQX0RQT1JUKSAmJgorCQkoIShpcGluZm8tPmJpdG1hc2sgJiBFQlRfSVBfUFJPVE8pIHx8CisJCWlwaW5mby0+aW52ZmxhZ3MgJiBFQlRfSVBfUFJPVE8gfHwKKwkJKGlwaW5mby0+cHJvdG9jb2whPUlQUFJPVE9fVENQICYmCisJCSBpcGluZm8tPnByb3RvY29sIT1JUFBST1RPX1VEUCAmJgorCQkgaXBpbmZvLT5wcm90b2NvbCE9SVBQUk9UT19TQ1RQICYmCisJCSBpcGluZm8tPnByb3RvY29sIT1JUFBST1RPX0RDQ1ApKSkgeworCQllYnRfcHJpbnRfZXJyb3IoIkZvciBwb3J0IGZpbHRlcmluZyB0aGUgSVAgcHJvdG9jb2wgbXVzdCBiZSAiCisJCQkJImVpdGhlciA2ICh0Y3ApLCAxNyAodWRwKSwgMzMgKGRjY3ApIG9yICIKKwkJCQkiMTMyIChzY3RwKSIpOworCX0gZWxzZSBpZiAoKGlwaW5mby0+Yml0bWFzayAmIEVCVF9JUF9JQ01QKSAmJgorCSAgICAgICAgICghKGlwaW5mby0+Yml0bWFzayAmIEVCVF9JUF9QUk9UTykgfHwKKwkgICAgICAgICAgICBpcGluZm8tPmludmZsYWdzICYgRUJUX0lQX1BST1RPIHx8CisJICAgICAgICAgICAgaXBpbmZvLT5wcm90b2NvbCAhPSBJUFBST1RPX0lDTVApKSB7CisJCWVidF9wcmludF9lcnJvcigiRm9yIElDTVAgZmlsdGVyaW5nIHRoZSBJUCBwcm90b2NvbCBtdXN0IGJlICIKKwkJCQkiMSAoaWNtcCkiKTsKKwl9IGVsc2UgaWYgKChpcGluZm8tPmJpdG1hc2sgJiBFQlRfSVBfSUdNUCkgJiYKKwkgICAgICAgICAoIShpcGluZm8tPmJpdG1hc2sgJiBFQlRfSVBfUFJPVE8pIHx8CisJICAgICAgICAgICAgaXBpbmZvLT5pbnZmbGFncyAmIEVCVF9JUF9QUk9UTyB8fAorCSAgICAgICAgICAgIGlwaW5mby0+cHJvdG9jb2wgIT0gSVBQUk9UT19JR01QKSkgeworCQllYnRfcHJpbnRfZXJyb3IoIkZvciBJR01QIGZpbHRlcmluZyB0aGUgSVAgcHJvdG9jb2wgbXVzdCBiZSAiCisJCQkJIjIgKGlnbXApIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBwcmludChjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbWF0Y2gpCit7CisJc3RydWN0IGVidF9pcF9pbmZvICppcGluZm8gPSAoc3RydWN0IGVidF9pcF9pbmZvICopbWF0Y2gtPmRhdGE7CisJaW50IGo7CisKKwlpZiAoaXBpbmZvLT5iaXRtYXNrICYgRUJUX0lQX1NPVVJDRSkgeworCQlwcmludGYoIi0taXAtc3JjICIpOworCQlpZiAoaXBpbmZvLT5pbnZmbGFncyAmIEVCVF9JUF9TT1VSQ0UpCisJCQlwcmludGYoIiEgIik7CisJCWZvciAoaiA9IDA7IGogPCA0OyBqKyspCisJCQlwcmludGYoIiVkJXMiLCgodW5zaWduZWQgY2hhciAqKSZpcGluZm8tPnNhZGRyKVtqXSwKKwkJCSAgIChqID09IDMpID8gIiIgOiAiLiIpOworCQlwcmludGYoIiVzICIsIGVidF9tYXNrX3RvX2RvdHRlZChpcGluZm8tPnNtc2spKTsKKwl9CisJaWYgKGlwaW5mby0+Yml0bWFzayAmIEVCVF9JUF9ERVNUKSB7CisJCXByaW50ZigiLS1pcC1kc3QgIik7CisJCWlmIChpcGluZm8tPmludmZsYWdzICYgRUJUX0lQX0RFU1QpCisJCQlwcmludGYoIiEgIik7CisJCWZvciAoaiA9IDA7IGogPCA0OyBqKyspCisJCQlwcmludGYoIiVkJXMiLCAoKHVuc2lnbmVkIGNoYXIgKikmaXBpbmZvLT5kYWRkcilbal0sCisJCQkgICAoaiA9PSAzKSA/ICIiIDogIi4iKTsKKwkJcHJpbnRmKCIlcyAiLCBlYnRfbWFza190b19kb3R0ZWQoaXBpbmZvLT5kbXNrKSk7CisJfQorCWlmIChpcGluZm8tPmJpdG1hc2sgJiBFQlRfSVBfVE9TKSB7CisJCXByaW50ZigiLS1pcC10b3MgIik7CisJCWlmIChpcGluZm8tPmludmZsYWdzICYgRUJUX0lQX1RPUykKKwkJCXByaW50ZigiISAiKTsKKwkJcHJpbnRmKCIweCUwMlggIiwgaXBpbmZvLT50b3MpOworCX0KKwlpZiAoaXBpbmZvLT5iaXRtYXNrICYgRUJUX0lQX1BST1RPKSB7CisJCXN0cnVjdCBwcm90b2VudCAqcGU7CisKKwkJcHJpbnRmKCItLWlwLXByb3RvICIpOworCQlpZiAoaXBpbmZvLT5pbnZmbGFncyAmIEVCVF9JUF9QUk9UTykKKwkJCXByaW50ZigiISAiKTsKKwkJcGUgPSBnZXRwcm90b2J5bnVtYmVyKGlwaW5mby0+cHJvdG9jb2wpOworCQlpZiAocGUgPT0gTlVMTCkgeworCQkJcHJpbnRmKCIlZCAiLCBpcGluZm8tPnByb3RvY29sKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiJXMgIiwgcGUtPnBfbmFtZSk7CisJCX0KKwl9CisJaWYgKGlwaW5mby0+Yml0bWFzayAmIEVCVF9JUF9TUE9SVCkgeworCQlwcmludGYoIi0taXAtc3BvcnQgIik7CisJCWlmIChpcGluZm8tPmludmZsYWdzICYgRUJUX0lQX1NQT1JUKQorCQkJcHJpbnRmKCIhICIpOworCQlwcmludF9wb3J0X3JhbmdlKGlwaW5mby0+c3BvcnQpOworCX0KKwlpZiAoaXBpbmZvLT5iaXRtYXNrICYgRUJUX0lQX0RQT1JUKSB7CisJCXByaW50ZigiLS1pcC1kcG9ydCAiKTsKKwkJaWYgKGlwaW5mby0+aW52ZmxhZ3MgJiBFQlRfSVBfRFBPUlQpCisJCQlwcmludGYoIiEgIik7CisJCXByaW50X3BvcnRfcmFuZ2UoaXBpbmZvLT5kcG9ydCk7CisJfQorCWlmIChpcGluZm8tPmJpdG1hc2sgJiBFQlRfSVBfSUNNUCkgeworCQlwcmludGYoIi0taXAtaWNtcC10eXBlICIpOworCQlpZiAoaXBpbmZvLT5pbnZmbGFncyAmIEVCVF9JUF9JQ01QKQorCQkJcHJpbnRmKCIhICIpOworCQllYnRfcHJpbnRfaWNtcF90eXBlKGljbXBfY29kZXMsIEFSUkFZX1NJWkUoaWNtcF9jb2RlcyksCisJCQkJICAgIGlwaW5mby0+aWNtcF90eXBlLCBpcGluZm8tPmljbXBfY29kZSk7CisJfQorCWlmIChpcGluZm8tPmJpdG1hc2sgJiBFQlRfSVBfSUdNUCkgeworCQlwcmludGYoIi0taXAtaWdtcC10eXBlICIpOworCQlpZiAoaXBpbmZvLT5pbnZmbGFncyAmIEVCVF9JUF9JR01QKQorCQkJcHJpbnRmKCIhICIpOworCQllYnRfcHJpbnRfaWNtcF90eXBlKGlnbXBfdHlwZXMsIEFSUkFZX1NJWkUoaWdtcF90eXBlcyksCisJCQkJICAgIGlwaW5mby0+aWdtcF90eXBlLCBOVUxMKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZShjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICptMSwKKyAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnlfbWF0Y2ggKm0yKQoreworCXN0cnVjdCBlYnRfaXBfaW5mbyAqaXBpbmZvMSA9IChzdHJ1Y3QgZWJ0X2lwX2luZm8gKiltMS0+ZGF0YTsKKwlzdHJ1Y3QgZWJ0X2lwX2luZm8gKmlwaW5mbzIgPSAoc3RydWN0IGVidF9pcF9pbmZvICopbTItPmRhdGE7CisKKwlpZiAoaXBpbmZvMS0+Yml0bWFzayAhPSBpcGluZm8yLT5iaXRtYXNrKQorCQlyZXR1cm4gMDsKKwlpZiAoaXBpbmZvMS0+aW52ZmxhZ3MgIT0gaXBpbmZvMi0+aW52ZmxhZ3MpCisJCXJldHVybiAwOworCWlmIChpcGluZm8xLT5iaXRtYXNrICYgRUJUX0lQX1NPVVJDRSkgeworCQlpZiAoaXBpbmZvMS0+c2FkZHIgIT0gaXBpbmZvMi0+c2FkZHIpCisJCQlyZXR1cm4gMDsKKwkJaWYgKGlwaW5mbzEtPnNtc2sgIT0gaXBpbmZvMi0+c21zaykKKwkJCXJldHVybiAwOworCX0KKwlpZiAoaXBpbmZvMS0+Yml0bWFzayAmIEVCVF9JUF9ERVNUKSB7CisJCWlmIChpcGluZm8xLT5kYWRkciAhPSBpcGluZm8yLT5kYWRkcikKKwkJCXJldHVybiAwOworCQlpZiAoaXBpbmZvMS0+ZG1zayAhPSBpcGluZm8yLT5kbXNrKQorCQkJcmV0dXJuIDA7CisJfQorCWlmIChpcGluZm8xLT5iaXRtYXNrICYgRUJUX0lQX1RPUykgeworCQlpZiAoaXBpbmZvMS0+dG9zICE9IGlwaW5mbzItPnRvcykKKwkJCXJldHVybiAwOworCX0KKwlpZiAoaXBpbmZvMS0+Yml0bWFzayAmIEVCVF9JUF9QUk9UTykgeworCQlpZiAoaXBpbmZvMS0+cHJvdG9jb2wgIT0gaXBpbmZvMi0+cHJvdG9jb2wpCisJCQlyZXR1cm4gMDsKKwl9CisJaWYgKGlwaW5mbzEtPmJpdG1hc2sgJiBFQlRfSVBfU1BPUlQpIHsKKwkJaWYgKGlwaW5mbzEtPnNwb3J0WzBdICE9IGlwaW5mbzItPnNwb3J0WzBdIHx8CisJCSAgIGlwaW5mbzEtPnNwb3J0WzFdICE9IGlwaW5mbzItPnNwb3J0WzFdKQorCQkJcmV0dXJuIDA7CisJfQorCWlmIChpcGluZm8xLT5iaXRtYXNrICYgRUJUX0lQX0RQT1JUKSB7CisJCWlmIChpcGluZm8xLT5kcG9ydFswXSAhPSBpcGluZm8yLT5kcG9ydFswXSB8fAorCQkgICBpcGluZm8xLT5kcG9ydFsxXSAhPSBpcGluZm8yLT5kcG9ydFsxXSkKKwkJCXJldHVybiAwOworCX0KKwlpZiAoaXBpbmZvMS0+Yml0bWFzayAmIEVCVF9JUF9JQ01QKSB7CisJCWlmIChpcGluZm8xLT5pY21wX3R5cGVbMF0gIT0gaXBpbmZvMi0+aWNtcF90eXBlWzBdIHx8CisJCSAgICBpcGluZm8xLT5pY21wX3R5cGVbMV0gIT0gaXBpbmZvMi0+aWNtcF90eXBlWzFdIHx8CisJCSAgICBpcGluZm8xLT5pY21wX2NvZGVbMF0gIT0gaXBpbmZvMi0+aWNtcF9jb2RlWzBdIHx8CisJCSAgICBpcGluZm8xLT5pY21wX2NvZGVbMV0gIT0gaXBpbmZvMi0+aWNtcF9jb2RlWzFdKQorCQkJcmV0dXJuIDA7CisJfQorCWlmIChpcGluZm8xLT5iaXRtYXNrICYgRUJUX0lQX0lHTVApIHsKKwkJaWYgKGlwaW5mbzEtPmlnbXBfdHlwZVswXSAhPSBpcGluZm8yLT5pZ21wX3R5cGVbMF0gfHwKKwkJICAgIGlwaW5mbzEtPmlnbXBfdHlwZVsxXSAhPSBpcGluZm8yLT5pZ21wX3R5cGVbMV0pCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWJ0X3VfbWF0Y2ggaXBfbWF0Y2ggPQoreworCS5uYW1lCQk9ICJpcCIsCisJLnNpemUJCT0gc2l6ZW9mKHN0cnVjdCBlYnRfaXBfaW5mbyksCisJLmhlbHAJCT0gcHJpbnRfaGVscCwKKwkuaW5pdAkJPSBpbml0LAorCS5wYXJzZQkJPSBwYXJzZSwKKwkuZmluYWxfY2hlY2sJPSBmaW5hbF9jaGVjaywKKwkucHJpbnQJCT0gcHJpbnQsCisJLmNvbXBhcmUJPSBjb21wYXJlLAorCS5leHRyYV9vcHMJPSBvcHRzLAorfTsKKworc3RhdGljIHZvaWQgX0lOSVQodm9pZCkKK3sKKwllYnRfcmVnaXN0ZXJfbWF0Y2goJmlwX21hdGNoKTsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZWJ0X2lwNi5jIGIvZXh0ZW5zaW9ucy9lYnRfaXA2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdhNDMwMwotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZWJ0X2lwNi5jCkBAIC0wLDAgKzEsNDE5IEBACisvKiBlYnRfaXA2CisgKiAKKyAqIEF1dGhvcnM6CisgKiBLdW8tTGFuZyBUc2VuZyA8a3VvLWxhbmcudHNlbmdAaW50ZWwuY29tPgorICogTWFub2hhciBDYXN0ZWxpbm8gPG1hbm9oYXIuY2FzdGVsaW5vQGludGVsLmNvbT4KKyAqCisgKiBTdW1tYXJ5OgorICogVGhpcyBpcyBqdXN0IGEgbW9kaWZpY2F0aW9uIG9mIHRoZSBJUHY0IGNvZGUgd3JpdHRlbiBieSAKKyAqIEJhcnQgRGUgU2NodXltZXIgPGJkc2NodXltQHBhbmRvcmEuYmU+CisgKiB3aXRoIHRoZSBjaGFuZ2VzIHJlcXVpcmVkIHRvIHN1cHBvcnQgSVB2NgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZWJ0YWJsZXNfdS5oIgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2lwNi5oPgorCisKKworI2RlZmluZSBJUF9TT1VSQ0UgJzEnCisjZGVmaW5lIElQX0RFU1QgICAnMicKKyNkZWZpbmUgSVBfVENMQVNTICczJworI2RlZmluZSBJUF9QUk9UTyAgJzQnCisjZGVmaW5lIElQX1NQT1JUICAnNScKKyNkZWZpbmUgSVBfRFBPUlQgICc2JworI2RlZmluZSBJUF9JQ01QNiAgJzcnCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIG9wdHNbXSA9Cit7CisJeyAiaXA2LXNvdXJjZSIgICAgICAgICAgICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIElQX1NPVVJDRSB9LAorCXsgImlwNi1zcmMiICAgICAgICAgICAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBJUF9TT1VSQ0UgfSwKKwl7ICJpcDYtZGVzdGluYXRpb24iICAgICAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgSVBfREVTVCAgIH0sCisJeyAiaXA2LWRzdCIgICAgICAgICAgICAgICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIElQX0RFU1QgICB9LAorCXsgImlwNi10cmFmZmljLWNsYXNzIiAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBJUF9UQ0xBU1MgfSwKKwl7ICJpcDYtdGNsYXNzIiAgICAgICAgICAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgSVBfVENMQVNTIH0sCisJeyAiaXA2LXByb3RvY29sIiAgICAgICAgICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIElQX1BST1RPICB9LAorCXsgImlwNi1wcm90byIgICAgICAgICAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBJUF9QUk9UTyAgfSwKKwl7ICJpcDYtc291cmNlLXBvcnQiICAgICAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgSVBfU1BPUlQgIH0sCisJeyAiaXA2LXNwb3J0IiAgICAgICAgICAgICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIElQX1NQT1JUICB9LAorCXsgImlwNi1kZXN0aW5hdGlvbi1wb3J0IiAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBJUF9EUE9SVCAgfSwKKwl7ICJpcDYtZHBvcnQiICAgICAgICAgICAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgSVBfRFBPUlQgIH0sCisJeyAiaXA2LWljbXAtdHlwZSIJICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIElQX0lDTVA2ICB9LAorCXsgMCB9Cit9OworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWJ0X2ljbXBfbmFtZXMgaWNtcHY2X2NvZGVzW10gPSB7CisJeyAiZGVzdGluYXRpb24tdW5yZWFjaGFibGUiLCAxLCAwLCAweEZGIH0sCisJeyAibm8tcm91dGUiLCAxLCAwLCAwIH0sCisJeyAiY29tbXVuaWNhdGlvbi1wcm9oaWJpdGVkIiwgMSwgMSwgMSB9LAorCXsgImFkZHJlc3MtdW5yZWFjaGFibGUiLCAxLCAzLCAzIH0sCisJeyAicG9ydC11bnJlYWNoYWJsZSIsIDEsIDQsIDQgfSwKKworCXsgInBhY2tldC10b28tYmlnIiwgMiwgMCwgMHhGRiB9LAorCisJeyAidGltZS1leGNlZWRlZCIsIDMsIDAsIDB4RkYgfSwKKwkvKiBBbGlhcyAqLyB7ICJ0dGwtZXhjZWVkZWQiLCAzLCAwLCAweEZGIH0sCisJeyAidHRsLXplcm8tZHVyaW5nLXRyYW5zaXQiLCAzLCAwLCAwIH0sCisJeyAidHRsLXplcm8tZHVyaW5nLXJlYXNzZW1ibHkiLCAzLCAxLCAxIH0sCisKKwl7ICJwYXJhbWV0ZXItcHJvYmxlbSIsIDQsIDAsIDB4RkYgfSwKKwl7ICJiYWQtaGVhZGVyIiwgNCwgMCwgMCB9LAorCXsgInVua25vd24taGVhZGVyLXR5cGUiLCA0LCAxLCAxIH0sCisJeyAidW5rbm93bi1vcHRpb24iLCA0LCAyLCAyIH0sCisKKwl7ICJlY2hvLXJlcXVlc3QiLCAxMjgsIDAsIDB4RkYgfSwKKwkvKiBBbGlhcyAqLyB7ICJwaW5nIiwgMTI4LCAwLCAweEZGIH0sCisKKwl7ICJlY2hvLXJlcGx5IiwgMTI5LCAwLCAweEZGIH0sCisJLyogQWxpYXMgKi8geyAicG9uZyIsIDEyOSwgMCwgMHhGRiB9LAorCisJeyAicm91dGVyLXNvbGljaXRhdGlvbiIsIDEzMywgMCwgMHhGRiB9LAorCisJeyAicm91dGVyLWFkdmVydGlzZW1lbnQiLCAxMzQsIDAsIDB4RkYgfSwKKworCXsgIm5laWdoYm91ci1zb2xpY2l0YXRpb24iLCAxMzUsIDAsIDB4RkYgfSwKKwkvKiBBbGlhcyAqLyB7ICJuZWlnaGJvci1zb2xpY2l0YXRpb24iLCAxMzUsIDAsIDB4RkYgfSwKKworCXsgIm5laWdoYm91ci1hZHZlcnRpc2VtZW50IiwgMTM2LCAwLCAweEZGIH0sCisJLyogQWxpYXMgKi8geyAibmVpZ2hib3ItYWR2ZXJ0aXNlbWVudCIsIDEzNiwgMCwgMHhGRiB9LAorCisJeyAicmVkaXJlY3QiLCAxMzcsIDAsIDB4RkYgfSwKK307CisKKy8qIHRyYW5zZm9ybSBhIHByb3RvY29sIGFuZCBzZXJ2aWNlIG5hbWUgaW50byBhIHBvcnQgbnVtYmVyICovCitzdGF0aWMgdWludDE2X3QgcGFyc2VfcG9ydChjb25zdCBjaGFyICpwcm90b2NvbCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc2VydmVudCAqc2VydmljZTsKKwljaGFyICplbmQ7CisJaW50IHBvcnQ7CisKKwlwb3J0ID0gc3RydG9sKG5hbWUsICZlbmQsIDEwKTsKKwlpZiAoKmVuZCAhPSAnXDAnKSB7CisJCWlmIChwcm90b2NvbCAmJiAKKwkJICAgIChzZXJ2aWNlID0gZ2V0c2VydmJ5bmFtZShuYW1lLCBwcm90b2NvbCkpICE9IE5VTEwpCisJCQlyZXR1cm4gbnRvaHMoc2VydmljZS0+c19wb3J0KTsKKwl9CisJZWxzZSBpZiAocG9ydCA+PSAwIHx8IHBvcnQgPD0gMHhGRkZGKSB7CisJCXJldHVybiBwb3J0OworCX0KKwllYnRfcHJpbnRfZXJyb3IoIlByb2JsZW0gd2l0aCBzcGVjaWZpZWQgJXMgcG9ydCAnJXMnIiwgCisJCQlwcm90b2NvbD9wcm90b2NvbDoiIiwgbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitwYXJzZV9wb3J0X3JhbmdlKGNvbnN0IGNoYXIgKnByb3RvY29sLCBjb25zdCBjaGFyICpwb3J0c3RyaW5nLCB1aW50MTZfdCAqcG9ydHMpCit7CisJY2hhciAqYnVmZmVyOworCWNoYXIgKmNwOworCQorCWJ1ZmZlciA9IHN0cmR1cChwb3J0c3RyaW5nKTsKKwlpZiAoKGNwID0gc3RyY2hyKGJ1ZmZlciwgJzonKSkgPT0gTlVMTCkKKwkJcG9ydHNbMF0gPSBwb3J0c1sxXSA9IHBhcnNlX3BvcnQocHJvdG9jb2wsIGJ1ZmZlcik7CisJZWxzZSB7CisJCSpjcCA9ICdcMCc7CisJCWNwKys7CisJCXBvcnRzWzBdID0gYnVmZmVyWzBdID8gcGFyc2VfcG9ydChwcm90b2NvbCwgYnVmZmVyKSA6IDA7CisJCWlmIChlYnRfZXJyb3Jtc2dbMF0gIT0gJ1wwJykKKwkJCXJldHVybjsKKwkJcG9ydHNbMV0gPSBjcFswXSA/IHBhcnNlX3BvcnQocHJvdG9jb2wsIGNwKSA6IDB4RkZGRjsKKwkJaWYgKGVidF9lcnJvcm1zZ1swXSAhPSAnXDAnKQorCQkJcmV0dXJuOworCQkKKwkJaWYgKHBvcnRzWzBdID4gcG9ydHNbMV0pCisJCQllYnRfcHJpbnRfZXJyb3IoIkludmFsaWQgcG9ydHJhbmdlIChtaW4gPiBtYXgpIik7CisJfQorCWZyZWUoYnVmZmVyKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfcG9ydF9yYW5nZSh1aW50MTZfdCAqcG9ydHMpCit7CisJaWYgKHBvcnRzWzBdID09IHBvcnRzWzFdKQorCQlwcmludGYoIiVkICIsIHBvcnRzWzBdKTsKKwllbHNlCisJCXByaW50ZigiJWQ6JWQgIiwgcG9ydHNbMF0sIHBvcnRzWzFdKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfaGVscCgpCit7CisJcHJpbnRmKAorImlwNiBvcHRpb25zOlxuIgorIi0taXA2LXNyYyAgICBbIV0gYWRkcmVzc1svbWFza106IGlwdjYgc291cmNlIHNwZWNpZmljYXRpb25cbiIKKyItLWlwNi1kc3QgICAgWyFdIGFkZHJlc3NbL21hc2tdOiBpcHY2IGRlc3RpbmF0aW9uIHNwZWNpZmljYXRpb25cbiIKKyItLWlwNi10Y2xhc3MgWyFdIHRjbGFzcyAgICAgICAgOiBpcHY2IHRyYWZmaWMgY2xhc3Mgc3BlY2lmaWNhdGlvblxuIgorIi0taXA2LXByb3RvICBbIV0gcHJvdG9jb2wgICAgICA6IGlwdjYgcHJvdG9jb2wgc3BlY2lmaWNhdGlvblxuIgorIi0taXA2LXNwb3J0ICBbIV0gcG9ydFs6cG9ydF0gICA6IHRjcC91ZHAgc291cmNlIHBvcnQgb3IgcG9ydCByYW5nZVxuIgorIi0taXA2LWRwb3J0ICBbIV0gcG9ydFs6cG9ydF0gICA6IHRjcC91ZHAgZGVzdGluYXRpb24gcG9ydCBvciBwb3J0IHJhbmdlXG4iCisiLS1pcDYtaWNtcC10eXBlIFshXSB0eXBlW1s6dHlwZV0vY29kZVs6Y29kZV1dIDogaXB2Ni1pY21wIHR5cGUvY29kZSBvciB0eXBlL2NvZGUgcmFuZ2VcbiIpOworCisJcHJpbnRmKCJcblZhbGlkIElDTVB2NiBUeXBlczpcbiIpOworCWVidF9wcmludF9pY21wX3R5cGVzKGljbXB2Nl9jb2RlcywgQVJSQVlfU0laRShpY21wdjZfY29kZXMpKTsKK30KKworc3RhdGljIHZvaWQgaW5pdChzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICptYXRjaCkKK3sKKwlzdHJ1Y3QgZWJ0X2lwNl9pbmZvICppcGluZm8gPSAoc3RydWN0IGVidF9pcDZfaW5mbyAqKW1hdGNoLT5kYXRhOworCisJaXBpbmZvLT5pbnZmbGFncyA9IDA7CisJaXBpbmZvLT5iaXRtYXNrID0gMDsKKwltZW1zZXQoaXBpbmZvLT5zYWRkci5zNl9hZGRyLCAwLCBzaXplb2YoaXBpbmZvLT5zYWRkci5zNl9hZGRyKSk7CisJbWVtc2V0KGlwaW5mby0+c21zay5zNl9hZGRyLCAwLCBzaXplb2YoaXBpbmZvLT5zbXNrLnM2X2FkZHIpKTsKKwltZW1zZXQoaXBpbmZvLT5kYWRkci5zNl9hZGRyLCAwLCBzaXplb2YoaXBpbmZvLT5kYWRkci5zNl9hZGRyKSk7CisJbWVtc2V0KGlwaW5mby0+ZG1zay5zNl9hZGRyLCAwLCBzaXplb2YoaXBpbmZvLT5kbXNrLnM2X2FkZHIpKTsKK30KKworI2RlZmluZSBPUFRfU09VUkNFIDB4MDEKKyNkZWZpbmUgT1BUX0RFU1QgICAweDAyCisjZGVmaW5lIE9QVF9UQ0xBU1MgMHgwNAorI2RlZmluZSBPUFRfUFJPVE8gIDB4MDgKKyNkZWZpbmUgT1BUX1NQT1JUICAweDEwCisjZGVmaW5lIE9QVF9EUE9SVCAgMHgyMAorc3RhdGljIGludCBwYXJzZShpbnQgYywgY2hhciAqKmFyZ3YsIGludCBhcmdjLCBjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorICAgdW5zaWduZWQgaW50ICpmbGFncywgc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqKm1hdGNoKQoreworCXN0cnVjdCBlYnRfaXA2X2luZm8gKmlwaW5mbyA9IChzdHJ1Y3QgZWJ0X2lwNl9pbmZvICopKCptYXRjaCktPmRhdGE7CisJY2hhciAqZW5kOworCWxvbmcgaW50IGk7CisKKwlzd2l0Y2ggKGMpIHsKKwljYXNlIElQX1NPVVJDRToKKwkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIE9QVF9TT1VSQ0UpOworCQlpcGluZm8tPmJpdG1hc2sgfD0gRUJUX0lQNl9TT1VSQ0U7CisJCWlmIChlYnRfY2hlY2tfaW52ZXJzZTIob3B0YXJnKSkgeworCQkgICAgaXBpbmZvLT5pbnZmbGFncyB8PSBFQlRfSVA2X1NPVVJDRTsKKwkJfQorCQllYnRfcGFyc2VfaXA2X2FkZHJlc3Mob3B0YXJnLCAmaXBpbmZvLT5zYWRkciwgJmlwaW5mby0+c21zayk7CisJCWJyZWFrOworCisJY2FzZSBJUF9ERVNUOgorCQllYnRfY2hlY2tfb3B0aW9uMihmbGFncywgT1BUX0RFU1QpOworCQlpcGluZm8tPmJpdG1hc2sgfD0gRUJUX0lQNl9ERVNUOworCQlpZiAoZWJ0X2NoZWNrX2ludmVyc2UyKG9wdGFyZykpIHsKKwkJCWlwaW5mby0+aW52ZmxhZ3MgfD0gRUJUX0lQNl9ERVNUOworCQl9CisJCWVidF9wYXJzZV9pcDZfYWRkcmVzcyhvcHRhcmcsICZpcGluZm8tPmRhZGRyLCAmaXBpbmZvLT5kbXNrKTsKKwkJYnJlYWs7CisKKwljYXNlIElQX1NQT1JUOgorCWNhc2UgSVBfRFBPUlQ6CisJCWlmIChjID09IElQX1NQT1JUKSB7CisJCQllYnRfY2hlY2tfb3B0aW9uMihmbGFncywgT1BUX1NQT1JUKTsKKwkJCWlwaW5mby0+Yml0bWFzayB8PSBFQlRfSVA2X1NQT1JUOworCQkJaWYgKGVidF9jaGVja19pbnZlcnNlMihvcHRhcmcpKQorCQkJCWlwaW5mby0+aW52ZmxhZ3MgfD0gRUJUX0lQNl9TUE9SVDsKKwkJfSBlbHNlIHsKKwkJCWVidF9jaGVja19vcHRpb24yKGZsYWdzLCBPUFRfRFBPUlQpOworCQkJaXBpbmZvLT5iaXRtYXNrIHw9IEVCVF9JUDZfRFBPUlQ7CisJCQlpZiAoZWJ0X2NoZWNrX2ludmVyc2UyKG9wdGFyZykpCisJCQkJaXBpbmZvLT5pbnZmbGFncyB8PSBFQlRfSVA2X0RQT1JUOworCQl9CisJCWlmIChjID09IElQX1NQT1JUKQorCQkJcGFyc2VfcG9ydF9yYW5nZShOVUxMLCBvcHRhcmcsIGlwaW5mby0+c3BvcnQpOworCQllbHNlCisJCQlwYXJzZV9wb3J0X3JhbmdlKE5VTEwsIG9wdGFyZywgaXBpbmZvLT5kcG9ydCk7CisJCWJyZWFrOworCisJY2FzZSBJUF9JQ01QNjoKKwkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIEVCVF9JUDZfSUNNUDYpOworCQlpcGluZm8tPmJpdG1hc2sgfD0gRUJUX0lQNl9JQ01QNjsKKwkJaWYgKGVidF9jaGVja19pbnZlcnNlMihvcHRhcmcpKQorCQkJaXBpbmZvLT5pbnZmbGFncyB8PSBFQlRfSVA2X0lDTVA2OworCQlpZiAoZWJ0X3BhcnNlX2ljbXAoaWNtcHY2X2NvZGVzLCBBUlJBWV9TSVpFKGljbXB2Nl9jb2RlcyksCisJCQkJICAgb3B0YXJnLCBpcGluZm8tPmljbXB2Nl90eXBlLAorCQkJCSAgIGlwaW5mby0+aWNtcHY2X2NvZGUpKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCisJY2FzZSBJUF9UQ0xBU1M6CisJCWVidF9jaGVja19vcHRpb24yKGZsYWdzLCBPUFRfVENMQVNTKTsKKwkJaWYgKGVidF9jaGVja19pbnZlcnNlMihvcHRhcmcpKQorCQkJaXBpbmZvLT5pbnZmbGFncyB8PSBFQlRfSVA2X1RDTEFTUzsKKwkJaSA9IHN0cnRvbChvcHRhcmcsICZlbmQsIDE2KTsKKwkJaWYgKGkgPCAwIHx8IGkgPiAyNTUgfHwgKmVuZCAhPSAnXDAnKQorCQkJZWJ0X3ByaW50X2Vycm9yMigiUHJvYmxlbSB3aXRoIHNwZWNpZmllZCBJUHY2IHRyYWZmaWMgY2xhc3MiKTsKKwkJaXBpbmZvLT50Y2xhc3MgPSBpOworCQlpcGluZm8tPmJpdG1hc2sgfD0gRUJUX0lQNl9UQ0xBU1M7CisJCWJyZWFrOworCisJY2FzZSBJUF9QUk9UTzoKKwkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIE9QVF9QUk9UTyk7CisJCWlmIChlYnRfY2hlY2tfaW52ZXJzZTIob3B0YXJnKSkKKwkJCWlwaW5mby0+aW52ZmxhZ3MgfD0gRUJUX0lQNl9QUk9UTzsKKwkJaSA9IHN0cnRvdWwob3B0YXJnLCAmZW5kLCAxMCk7CisJCWlmICgqZW5kICE9ICdcMCcpIHsKKwkJCXN0cnVjdCBwcm90b2VudCAqcGU7CisKKwkJCXBlID0gZ2V0cHJvdG9ieW5hbWUob3B0YXJnKTsKKwkJCWlmIChwZSA9PSBOVUxMKQorCQkJCWVidF9wcmludF9lcnJvcigiVW5rbm93biBzcGVjaWZpZWQgSVAgcHJvdG9jb2wgLSAlcyIsIGFyZ3Zbb3B0aW5kIC0gMV0pOworCQkJaXBpbmZvLT5wcm90b2NvbCA9IHBlLT5wX3Byb3RvOworCQl9IGVsc2UgeworCQkJaXBpbmZvLT5wcm90b2NvbCA9ICh1bnNpZ25lZCBjaGFyKSBpOworCQl9CisJCWlwaW5mby0+Yml0bWFzayB8PSBFQlRfSVA2X1BST1RPOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmFsX2NoZWNrKGNvbnN0IHN0cnVjdCBlYnRfdV9lbnRyeSAqZW50cnksCisgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICptYXRjaCwgY29uc3QgY2hhciAqbmFtZSwKKyAgIHVuc2lnbmVkIGludCBob29rbWFzaywgdW5zaWduZWQgaW50IHRpbWUpCit7CisJc3RydWN0IGVidF9pcDZfaW5mbyAqaXBpbmZvID0gKHN0cnVjdCBlYnRfaXA2X2luZm8gKiltYXRjaC0+ZGF0YTsKKworCWlmIChlbnRyeS0+ZXRocHJvdG8gIT0gRVRIX1BfSVBWNiB8fCBlbnRyeS0+aW52ZmxhZ3MgJiBFQlRfSVBST1RPKSB7CisJCWVidF9wcmludF9lcnJvcigiRm9yIElQdjYgZmlsdGVyaW5nIHRoZSBwcm90b2NvbCBtdXN0IGJlICIKKwkJICAgICAgICAgICAgInNwZWNpZmllZCBhcyBJUHY2Iik7CisJfSBlbHNlIGlmIChpcGluZm8tPmJpdG1hc2sgJiAoRUJUX0lQNl9TUE9SVHxFQlRfSVA2X0RQT1JUKSAmJgorCQkoIShpcGluZm8tPmJpdG1hc2sgJiBFQlRfSVA2X1BST1RPKSB8fAorCQlpcGluZm8tPmludmZsYWdzICYgRUJUX0lQNl9QUk9UTyB8fAorCQkoaXBpbmZvLT5wcm90b2NvbCE9SVBQUk9UT19UQ1AgJiYKKwkJIGlwaW5mby0+cHJvdG9jb2whPUlQUFJPVE9fVURQICYmCisJCSBpcGluZm8tPnByb3RvY29sIT1JUFBST1RPX1NDVFAgJiYKKwkJIGlwaW5mby0+cHJvdG9jb2whPUlQUFJPVE9fRENDUCkpKQorCQllYnRfcHJpbnRfZXJyb3IoIkZvciBwb3J0IGZpbHRlcmluZyB0aGUgSVAgcHJvdG9jb2wgbXVzdCBiZSAiCisJCQkJImVpdGhlciA2ICh0Y3ApLCAxNyAodWRwKSwgMzMgKGRjY3ApIG9yICIKKwkJCQkiMTMyIChzY3RwKSIpOworCWlmICgoaXBpbmZvLT5iaXRtYXNrICYgRUJUX0lQNl9JQ01QNikgJiYKKwkgICghKGlwaW5mby0+Yml0bWFzayAmIEVCVF9JUDZfUFJPVE8pIHx8CisJICAgICBpcGluZm8tPmludmZsYWdzICYgRUJUX0lQNl9QUk9UTyB8fAorCSAgICAgaXBpbmZvLT5wcm90b2NvbCAhPSBJUFBST1RPX0lDTVBWNikpCisJCWVidF9wcmludF9lcnJvcigiRm9yIGlwdjYtaWNtcCBmaWx0ZXJpbmcgdGhlIElQIHByb3RvY29sIG11c3QgYmUgIgorCQkJCSI1OCAoaXB2Ni1pY21wKSIpOworfQorCitzdGF0aWMgdm9pZCBwcmludChjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbWF0Y2gpCit7CisJc3RydWN0IGVidF9pcDZfaW5mbyAqaXBpbmZvID0gKHN0cnVjdCBlYnRfaXA2X2luZm8gKiltYXRjaC0+ZGF0YTsKKworCWlmIChpcGluZm8tPmJpdG1hc2sgJiBFQlRfSVA2X1NPVVJDRSkgeworCQlwcmludGYoIi0taXA2LXNyYyAiKTsKKwkJaWYgKGlwaW5mby0+aW52ZmxhZ3MgJiBFQlRfSVA2X1NPVVJDRSkKKwkJCXByaW50ZigiISAiKTsKKwkJcHJpbnRmKCIlcyIsIGVidF9pcDZfdG9fbnVtZXJpYygmaXBpbmZvLT5zYWRkcikpOworCQlwcmludGYoIiVzICIsIGVidF9pcDZfbWFza190b19zdHJpbmcoJmlwaW5mby0+c21zaykpOworCX0KKwlpZiAoaXBpbmZvLT5iaXRtYXNrICYgRUJUX0lQNl9ERVNUKSB7CisJCXByaW50ZigiLS1pcDYtZHN0ICIpOworCQlpZiAoaXBpbmZvLT5pbnZmbGFncyAmIEVCVF9JUDZfREVTVCkKKwkJCXByaW50ZigiISAiKTsKKwkJcHJpbnRmKCIlcyIsIGVidF9pcDZfdG9fbnVtZXJpYygmaXBpbmZvLT5kYWRkcikpOworCQlwcmludGYoIiVzICIsIGVidF9pcDZfbWFza190b19zdHJpbmcoJmlwaW5mby0+ZG1zaykpOworCX0KKwlpZiAoaXBpbmZvLT5iaXRtYXNrICYgRUJUX0lQNl9UQ0xBU1MpIHsKKwkJcHJpbnRmKCItLWlwNi10Y2xhc3MgIik7CisJCWlmIChpcGluZm8tPmludmZsYWdzICYgRUJUX0lQNl9UQ0xBU1MpCisJCQlwcmludGYoIiEgIik7CisJCXByaW50ZigiMHglMDJYICIsIGlwaW5mby0+dGNsYXNzKTsKKwl9CisJaWYgKGlwaW5mby0+Yml0bWFzayAmIEVCVF9JUDZfUFJPVE8pIHsKKwkJc3RydWN0IHByb3RvZW50ICpwZTsKKworCQlwcmludGYoIi0taXA2LXByb3RvICIpOworCQlpZiAoaXBpbmZvLT5pbnZmbGFncyAmIEVCVF9JUDZfUFJPVE8pCisJCQlwcmludGYoIiEgIik7CisJCXBlID0gZ2V0cHJvdG9ieW51bWJlcihpcGluZm8tPnByb3RvY29sKTsKKwkJaWYgKHBlID09IE5VTEwpIHsKKwkJCXByaW50ZigiJWQgIiwgaXBpbmZvLT5wcm90b2NvbCk7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIiVzICIsIHBlLT5wX25hbWUpOworCQl9CisJfQorCWlmIChpcGluZm8tPmJpdG1hc2sgJiBFQlRfSVA2X1NQT1JUKSB7CisJCXByaW50ZigiLS1pcDYtc3BvcnQgIik7CisJCWlmIChpcGluZm8tPmludmZsYWdzICYgRUJUX0lQNl9TUE9SVCkKKwkJCXByaW50ZigiISAiKTsKKwkJcHJpbnRfcG9ydF9yYW5nZShpcGluZm8tPnNwb3J0KTsKKwl9CisJaWYgKGlwaW5mby0+Yml0bWFzayAmIEVCVF9JUDZfRFBPUlQpIHsKKwkJcHJpbnRmKCItLWlwNi1kcG9ydCAiKTsKKwkJaWYgKGlwaW5mby0+aW52ZmxhZ3MgJiBFQlRfSVA2X0RQT1JUKQorCQkJcHJpbnRmKCIhICIpOworCQlwcmludF9wb3J0X3JhbmdlKGlwaW5mby0+ZHBvcnQpOworCX0KKwlpZiAoaXBpbmZvLT5iaXRtYXNrICYgRUJUX0lQNl9JQ01QNikgeworCQlwcmludGYoIi0taXA2LWljbXAtdHlwZSAiKTsKKwkJaWYgKGlwaW5mby0+aW52ZmxhZ3MgJiBFQlRfSVA2X0lDTVA2KQorCQkJcHJpbnRmKCIhICIpOworCQllYnRfcHJpbnRfaWNtcF90eXBlKGljbXB2Nl9jb2RlcywgQVJSQVlfU0laRShpY21wdjZfY29kZXMpLAorCQkJCSAgICBpcGluZm8tPmljbXB2Nl90eXBlLCBpcGluZm8tPmljbXB2Nl9jb2RlKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZShjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICptMSwKKyAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnlfbWF0Y2ggKm0yKQoreworCXN0cnVjdCBlYnRfaXA2X2luZm8gKmlwaW5mbzEgPSAoc3RydWN0IGVidF9pcDZfaW5mbyAqKW0xLT5kYXRhOworCXN0cnVjdCBlYnRfaXA2X2luZm8gKmlwaW5mbzIgPSAoc3RydWN0IGVidF9pcDZfaW5mbyAqKW0yLT5kYXRhOworCisJaWYgKGlwaW5mbzEtPmJpdG1hc2sgIT0gaXBpbmZvMi0+Yml0bWFzaykKKwkJcmV0dXJuIDA7CisJaWYgKGlwaW5mbzEtPmludmZsYWdzICE9IGlwaW5mbzItPmludmZsYWdzKQorCQlyZXR1cm4gMDsKKwlpZiAoaXBpbmZvMS0+Yml0bWFzayAmIEVCVF9JUDZfU09VUkNFKSB7CisJCWlmICghSU42X0FSRV9BRERSX0VRVUFMKCZpcGluZm8xLT5zYWRkciwgJmlwaW5mbzItPnNhZGRyKSkKKwkJCXJldHVybiAwOworCQlpZiAoIUlONl9BUkVfQUREUl9FUVVBTCgmaXBpbmZvMS0+c21zaywgJmlwaW5mbzItPnNtc2spKQorCQkJcmV0dXJuIDA7CisJfQorCWlmIChpcGluZm8xLT5iaXRtYXNrICYgRUJUX0lQNl9ERVNUKSB7CisJCWlmICghSU42X0FSRV9BRERSX0VRVUFMKCZpcGluZm8xLT5kYWRkciwgJmlwaW5mbzItPmRhZGRyKSkKKwkJCXJldHVybiAwOworCQlpZiAoIUlONl9BUkVfQUREUl9FUVVBTCgmaXBpbmZvMS0+ZG1zaywgJmlwaW5mbzItPmRtc2spKQorCQkJcmV0dXJuIDA7CisJfQorCWlmIChpcGluZm8xLT5iaXRtYXNrICYgRUJUX0lQNl9UQ0xBU1MpIHsKKwkJaWYgKGlwaW5mbzEtPnRjbGFzcyAhPSBpcGluZm8yLT50Y2xhc3MpCisJCQlyZXR1cm4gMDsKKwl9CisJaWYgKGlwaW5mbzEtPmJpdG1hc2sgJiBFQlRfSVA2X1BST1RPKSB7CisJCWlmIChpcGluZm8xLT5wcm90b2NvbCAhPSBpcGluZm8yLT5wcm90b2NvbCkKKwkJCXJldHVybiAwOworCX0KKwlpZiAoaXBpbmZvMS0+Yml0bWFzayAmIEVCVF9JUDZfU1BPUlQpIHsKKwkJaWYgKGlwaW5mbzEtPnNwb3J0WzBdICE9IGlwaW5mbzItPnNwb3J0WzBdIHx8CisJCSAgIGlwaW5mbzEtPnNwb3J0WzFdICE9IGlwaW5mbzItPnNwb3J0WzFdKQorCQkJcmV0dXJuIDA7CisJfQorCWlmIChpcGluZm8xLT5iaXRtYXNrICYgRUJUX0lQNl9EUE9SVCkgeworCQlpZiAoaXBpbmZvMS0+ZHBvcnRbMF0gIT0gaXBpbmZvMi0+ZHBvcnRbMF0gfHwKKwkJICAgaXBpbmZvMS0+ZHBvcnRbMV0gIT0gaXBpbmZvMi0+ZHBvcnRbMV0pCisJCQlyZXR1cm4gMDsKKwl9CisJaWYgKGlwaW5mbzEtPmJpdG1hc2sgJiBFQlRfSVA2X0lDTVA2KSB7CisJCWlmIChpcGluZm8xLT5pY21wdjZfdHlwZVswXSAhPSBpcGluZm8yLT5pY21wdjZfdHlwZVswXSB8fAorCQkgICAgaXBpbmZvMS0+aWNtcHY2X3R5cGVbMV0gIT0gaXBpbmZvMi0+aWNtcHY2X3R5cGVbMV0gfHwKKwkJICAgIGlwaW5mbzEtPmljbXB2Nl9jb2RlWzBdICE9IGlwaW5mbzItPmljbXB2Nl9jb2RlWzBdIHx8CisJCSAgICBpcGluZm8xLT5pY21wdjZfY29kZVsxXSAhPSBpcGluZm8yLT5pY21wdjZfY29kZVsxXSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBlYnRfdV9tYXRjaCBpcDZfbWF0Y2ggPQoreworCS5uYW1lCQk9IEVCVF9JUDZfTUFUQ0gsCisJLnNpemUJCT0gc2l6ZW9mKHN0cnVjdCBlYnRfaXA2X2luZm8pLAorCS5oZWxwCQk9IHByaW50X2hlbHAsCisJLmluaXQJCT0gaW5pdCwKKwkucGFyc2UJCT0gcGFyc2UsCisJLmZpbmFsX2NoZWNrCT0gZmluYWxfY2hlY2ssCisJLnByaW50CQk9IHByaW50LAorCS5jb21wYXJlCT0gY29tcGFyZSwKKwkuZXh0cmFfb3BzCT0gb3B0cywKK307CisKK3N0YXRpYyB2b2lkIF9JTklUKHZvaWQpCit7CisJZWJ0X3JlZ2lzdGVyX21hdGNoKCZpcDZfbWF0Y2gpOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9lYnRfbGltaXQuYyBiL2V4dGVuc2lvbnMvZWJ0X2xpbWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZlOWQ4NAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZWJ0X2xpbWl0LmMKQEAgLTAsMCArMSwyMTggQEAKKy8qIGVidF9saW1pdAorICoKKyAqIEF1dGhvcnM6CisgKiBUb20gTWFyc2hhbGwgPHRvbW15QGhvbWUudGlnLWdyci5jb20+CisgKgorICogTW9zdGx5IGNvcGllZCBmcm9tIGlwdGFibGVzJyBsaW1pdCBtYXRjaC4KKyAqCisgKiBTZXB0ZW1iZXIsIDIwMDMKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZWJ0YWJsZXNfdS5oIgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2xpbWl0Lmg+CisKKyNkZWZpbmUgRUJUX0xJTUlUX0FWRwkiMy9ob3VyIgorI2RlZmluZSBFQlRfTElNSVRfQlVSU1QJNQorCitzdGF0aWMgaW50IHN0cmluZ190b19udW1iZXIoY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IG1pbiwgdW5zaWduZWQgaW50IG1heCwKKyAgIHVuc2lnbmVkIGludCAqcmV0KQoreworCWxvbmcgbnVtYmVyOworCWNoYXIgKmVuZDsKKworCWVycm5vID0gMDsKKwludW1iZXIgPSBzdHJ0b2wocywgJmVuZCwgMCk7CisJaWYgKCplbmQgPT0gJ1wwJyAmJiBlbmQgIT0gcykgeworCQlpZiAoZXJybm8gIT0gRVJBTkdFICYmIG1pbiA8PSBudW1iZXIgJiYgbnVtYmVyIDw9IG1heCkgeworCQkJKnJldCA9IG51bWJlcjsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtMTsKK30KKworI2RlZmluZSBGTEFHX0xJTUlUCQkweDAxCisjZGVmaW5lIEZMQUdfTElNSVRfQlVSU1QJMHgwMgorI2RlZmluZSBBUkdfTElNSVQJCScxJworI2RlZmluZSBBUkdfTElNSVRfQlVSU1QJCScyJworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBvcHRzW10gPQoreworCXsgImxpbWl0IiwJCXJlcXVpcmVkX2FyZ3VtZW50LCAwLCBBUkdfTElNSVQgfSwKKwl7ICJsaW1pdC1idXJzdCIsCXJlcXVpcmVkX2FyZ3VtZW50LCAwLCBBUkdfTElNSVRfQlVSU1QgfSwKKwl7IDAgfQorfTsKKworc3RhdGljIHZvaWQgcHJpbnRfaGVscCh2b2lkKQoreworCXByaW50ZigKKyJsaW1pdCBvcHRpb25zOlxuIgorIi0tbGltaXQgYXZnICAgICAgICAgICAgICAgICAgIDogbWF4IGF2ZXJhZ2UgbWF0Y2ggcmF0ZTogZGVmYXVsdCAiRUJUX0xJTUlUX0FWRyJcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQYWNrZXRzIHBlciBzZWNvbmQgdW5sZXNzIGZvbGxvd2VkIGJ5IFxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3NlYyAvbWludXRlIC9ob3VyIC9kYXkgcG9zdGZpeGVzXVxuIgorIi0tbGltaXQtYnVyc3QgbnVtYmVyICAgICAgICAgIDogbnVtYmVyIHRvIG1hdGNoIGluIGEgYnVyc3QsIC0xIDwgbnVtYmVyIDwgMTAwMDEsXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ICV1XG4iLCBFQlRfTElNSVRfQlVSU1QpOworfQorCitzdGF0aWMgaW50IHBhcnNlX3JhdGUoY29uc3QgY2hhciAqcmF0ZSwgdWludDMyX3QgKnZhbCkKK3sKKwljb25zdCBjaGFyICpkZWxpbTsKKwl1aW50MzJfdCByOworCXVpbnQzMl90IG11bHQgPSAxOyAgLyogU2Vjb25kcyBieSBkZWZhdWx0LiAqLworCisJZGVsaW0gPSBzdHJjaHIocmF0ZSwgJy8nKTsKKwlpZiAoZGVsaW0pIHsKKwkJaWYgKHN0cmxlbihkZWxpbSsxKSA9PSAwKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKHN0cm5jYXNlY21wKGRlbGltKzEsICJzZWNvbmQiLCBzdHJsZW4oZGVsaW0rMSkpID09IDApCisJCQltdWx0ID0gMTsKKwkJZWxzZSBpZiAoc3RybmNhc2VjbXAoZGVsaW0rMSwgIm1pbnV0ZSIsIHN0cmxlbihkZWxpbSsxKSkgPT0gMCkKKwkJCW11bHQgPSA2MDsKKwkJZWxzZSBpZiAoc3RybmNhc2VjbXAoZGVsaW0rMSwgImhvdXIiLCBzdHJsZW4oZGVsaW0rMSkpID09IDApCisJCQltdWx0ID0gNjAqNjA7CisJCWVsc2UgaWYgKHN0cm5jYXNlY21wKGRlbGltKzEsICJkYXkiLCBzdHJsZW4oZGVsaW0rMSkpID09IDApCisJCQltdWx0ID0gMjQqNjAqNjA7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KKwlyID0gYXRvaShyYXRlKTsKKwlpZiAoIXIpCisJCXJldHVybiAwOworCisJLyogVGhpcyB3b3VsZCBnZXQgbWFwcGVkIHRvIGluZmluaXRlICgxL2RheSBpcyBtaW5pbXVtIHRoZXkKKwkgICBjYW4gc3BlY2lmeSwgc28gd2UncmUgb2sgYXQgdGhhdCBlbmQpLiAqLworCWlmIChyIC8gbXVsdCA+IEVCVF9MSU1JVF9TQ0FMRSkKKwkJcmV0dXJuIDA7CisKKwkqdmFsID0gRUJUX0xJTUlUX1NDQUxFICogbXVsdCAvIHI7CisJcmV0dXJuIDE7Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIG1hdGNoLiAqLworc3RhdGljIHZvaWQgaW5pdChzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICptKQoreworCXN0cnVjdCBlYnRfbGltaXRfaW5mbyAqciA9IChzdHJ1Y3QgZWJ0X2xpbWl0X2luZm8gKiltLT5kYXRhOworCisJcGFyc2VfcmF0ZShFQlRfTElNSVRfQVZHLCAmci0+YXZnKTsKKwlyLT5idXJzdCA9IEVCVF9MSU1JVF9CVVJTVDsKK30KKworLyogRklYTUU6IGhhbmRsZSBvdmVyZmxvdzoKKwlpZiAoci0+YXZnKnItPmJ1cnN0L3ItPmJ1cnN0ICE9IHItPmF2ZykKKwkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKKwkJCSAgICJTb3JyeTogYnVyc3QgdG9vIGxhcmdlIGZvciB0aGF0IGF2ZyByYXRlLlxuIik7CisqLworCitzdGF0aWMgaW50IHBhcnNlKGludCBjLCBjaGFyICoqYXJndiwgaW50IGFyZ2MsCisgICAgICBjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorICAgICAgdW5zaWduZWQgaW50ICpmbGFncywKKyAgICAgIHN0cnVjdCBlYnRfZW50cnlfbWF0Y2ggKiptYXRjaCkKK3sKKwlzdHJ1Y3QgZWJ0X2xpbWl0X2luZm8gKnIgPSAoc3RydWN0IGVidF9saW1pdF9pbmZvICopKCptYXRjaCktPmRhdGE7CisJdW5zaWduZWQgaW50IG51bTsKKworCXN3aXRjaChjKSB7CisJY2FzZSBBUkdfTElNSVQ6CisJCWVidF9jaGVja19vcHRpb24yKGZsYWdzLCBGTEFHX0xJTUlUKTsKKwkJaWYgKGVidF9jaGVja19pbnZlcnNlMihvcHRhcmcpKQorCQkJZWJ0X3ByaW50X2Vycm9yMigiVW5leHBlY3RlZCBgIScgYWZ0ZXIgLS1saW1pdCIpOworCQlpZiAoIXBhcnNlX3JhdGUob3B0YXJnLCAmci0+YXZnKSkKKwkJCWVidF9wcmludF9lcnJvcjIoImJhZCByYXRlIGAlcyciLCBvcHRhcmcpOworCQlicmVhazsKKworCWNhc2UgQVJHX0xJTUlUX0JVUlNUOgorCQllYnRfY2hlY2tfb3B0aW9uMihmbGFncywgRkxBR19MSU1JVF9CVVJTVCk7CisJCWlmIChlYnRfY2hlY2tfaW52ZXJzZTIob3B0YXJnKSkKKwkJCWVidF9wcmludF9lcnJvcjIoIlVuZXhwZWN0ZWQgYCEnIGFmdGVyIC0tbGltaXQtYnVyc3QiKTsKKwkJaWYgKHN0cmluZ190b19udW1iZXIob3B0YXJnLCAwLCAxMDAwMCwgJm51bSkgPT0gLTEpCisJCQllYnRfcHJpbnRfZXJyb3IyKCJiYWQgLS1saW1pdC1idXJzdCBgJXMnIiwgb3B0YXJnKTsKKwkJci0+YnVyc3QgPSBudW07CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmFsX2NoZWNrKGNvbnN0IHN0cnVjdCBlYnRfdV9lbnRyeSAqZW50cnksCisgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICptYXRjaCwgY29uc3QgY2hhciAqbmFtZSwKKyAgIHVuc2lnbmVkIGludCBob29rbWFzaywgdW5zaWduZWQgaW50IHRpbWUpCit7Cit9CisKK3N0cnVjdCByYXRlcworeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdWludDMyX3QgbXVsdDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmF0ZXMgZ19yYXRlc1tdID0KK3sKKwl7ICJkYXkiLCBFQlRfTElNSVRfU0NBTEUqMjQqNjAqNjAgfSwKKwl7ICJob3VyIiwgRUJUX0xJTUlUX1NDQUxFKjYwKjYwIH0sCisJeyAibWluIiwgRUJUX0xJTUlUX1NDQUxFKjYwIH0sCisJeyAic2VjIiwgRUJUX0xJTUlUX1NDQUxFIH0KK307CisKK3N0YXRpYyB2b2lkIHByaW50X3JhdGUodWludDMyX3QgcGVyaW9kKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMTsgaSA8IHNpemVvZihnX3JhdGVzKS9zaXplb2Yoc3RydWN0IHJhdGVzKTsgaSsrKQorCQlpZiAocGVyaW9kID4gZ19yYXRlc1tpXS5tdWx0IHx8CisJCSAgICBnX3JhdGVzW2ldLm11bHQvcGVyaW9kIDwgZ19yYXRlc1tpXS5tdWx0JXBlcmlvZCkKKwkJCWJyZWFrOworCisJcHJpbnRmKCIldS8lcyAiLCBnX3JhdGVzW2ktMV0ubXVsdCAvIHBlcmlvZCwgZ19yYXRlc1tpLTFdLm5hbWUpOworfQorCitzdGF0aWMgdm9pZCBwcmludChjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbWF0Y2gpCit7CisJc3RydWN0IGVidF9saW1pdF9pbmZvICpyID0gKHN0cnVjdCBlYnRfbGltaXRfaW5mbyAqKW1hdGNoLT5kYXRhOworCisJcHJpbnRmKCItLWxpbWl0ICIpOworCXByaW50X3JhdGUoci0+YXZnKTsKKwlwcmludGYoIi0tbGltaXQtYnVyc3QgJXUgIiwgci0+YnVyc3QpOworfQorCitzdGF0aWMgaW50IGNvbXBhcmUoY29uc3Qgc3RydWN0IGVidF9lbnRyeV9tYXRjaCogbTEsCisgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICptMikKK3sKKwlzdHJ1Y3QgZWJ0X2xpbWl0X2luZm8qIGxpMSA9IChzdHJ1Y3QgZWJ0X2xpbWl0X2luZm8qKW0xLT5kYXRhOworCXN0cnVjdCBlYnRfbGltaXRfaW5mbyogbGkyID0gKHN0cnVjdCBlYnRfbGltaXRfaW5mbyopbTItPmRhdGE7CisKKwlpZiAobGkxLT5hdmcgIT0gbGkyLT5hdmcpCisJCXJldHVybiAwOworCisJaWYgKGxpMS0+YnVyc3QgIT0gbGkyLT5idXJzdCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBlYnRfdV9tYXRjaCBsaW1pdF9tYXRjaCA9Cit7CisJLm5hbWUJCT0gImxpbWl0IiwKKwkuc2l6ZQkJPSBzaXplb2Yoc3RydWN0IGVidF9saW1pdF9pbmZvKSwKKwkuaGVscAkJPSBwcmludF9oZWxwLAorCS5pbml0CQk9IGluaXQsCisJLnBhcnNlCQk9IHBhcnNlLAorCS5maW5hbF9jaGVjawk9IGZpbmFsX2NoZWNrLAorCS5wcmludAkJPSBwcmludCwKKwkuY29tcGFyZQk9IGNvbXBhcmUsCisJLmV4dHJhX29wcwk9IG9wdHMsCit9OworCitzdGF0aWMgdm9pZCBfSU5JVCh2b2lkKQoreworCWVidF9yZWdpc3Rlcl9tYXRjaCgmbGltaXRfbWF0Y2gpOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9lYnRfbG9nLmMgYi9leHRlbnNpb25zL2VidF9sb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWQzMjMyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9lYnRfbG9nLmMKQEAgLTAsMCArMSwyMjMgQEAKKy8qIGVidF9sb2cKKyAqCisgKiBBdXRob3JzOgorICogQmFydCBEZSBTY2h1eW1lciA8YmRzY2h1eW1AcGFuZG9yYS5iZT4KKyAqCisgKiBBcHJpbCwgMjAwMgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZWJ0YWJsZXNfdS5oIgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2xvZy5oPgorCisvKgorICogY29waWVkIGZyb20gc3lzbG9nLmgKKyAqIHVzZWQgZm9yIHRoZSBMT0cgdGFyZ2V0CisgKi8KKyNkZWZpbmUJTE9HX0VNRVJHCTAgLyogc3lzdGVtIGlzIHVudXNhYmxlICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJTE9HX0FMRVJUCTEgLyogYWN0aW9uIG11c3QgYmUgdGFrZW4gaW1tZWRpYXRlbHkgKi8KKyNkZWZpbmUJTE9HX0NSSVQJMiAvKiBjcml0aWNhbCBjb25kaXRpb25zICAgICAgICAgICAgICAqLworI2RlZmluZQlMT0dfRVJSCQkzIC8qIGVycm9yIGNvbmRpdGlvbnMgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUxPR19XQVJOSU5HCTQgLyogd2FybmluZyBjb25kaXRpb25zICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJTE9HX05PVElDRQk1IC8qIG5vcm1hbCBidXQgc2lnbmlmaWNhbnQgY29uZGl0aW9uICovCisjZGVmaW5lCUxPR19JTkZPCTYgLyogaW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJTE9HX0RFQlVHCTcgLyogZGVidWctbGV2ZWwgbWVzc2FnZXMgICAgICAgICAgICAgKi8KKworI2RlZmluZSBMT0dfREVGQVVMVF9MRVZFTCBMT0dfSU5GTworCit0eXBlZGVmIHN0cnVjdCBfY29kZSB7CisJY2hhciAqY19uYW1lOworCWludCBjX3ZhbDsKK30gQ09ERTsKKworc3RhdGljIENPREUgZWlnaHRfcHJpb3JpdHlbXSA9IHsKKwl7ICJlbWVyZyIsIExPR19FTUVSRyB9LAorCXsgImFsZXJ0IiwgTE9HX0FMRVJUIH0sCisJeyAiY3JpdCIsIExPR19DUklUIH0sCisJeyAiZXJyb3IiLCBMT0dfRVJSIH0sCisJeyAid2FybmluZyIsIExPR19XQVJOSU5HIH0sCisJeyAibm90aWNlIiwgTE9HX05PVElDRSB9LAorCXsgImluZm8iLCBMT0dfSU5GTyB9LAorCXsgImRlYnVnIiwgTE9HX0RFQlVHIH0KK307CisKK3N0YXRpYyBpbnQgbmFtZV90b19sb2dsZXZlbChjaGFyKiBhcmcpCit7CisJaW50IGk7CisJCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJaWYgKCFzdHJjbXAoYXJnLCBlaWdodF9wcmlvcml0eVtpXS5jX25hbWUpKQorCQkJcmV0dXJuIGVpZ2h0X3ByaW9yaXR5W2ldLmNfdmFsOworCS8qIHJldHVybiBiYWQgbG9nbGV2ZWwgKi8KKwlyZXR1cm4gOTsKK30KKworI2RlZmluZSBMT0dfUFJFRklYICcxJworI2RlZmluZSBMT0dfTEVWRUwgICcyJworI2RlZmluZSBMT0dfQVJQICAgICczJworI2RlZmluZSBMT0dfSVAgICAgICc0JworI2RlZmluZSBMT0dfTE9HICAgICc1JworI2RlZmluZSBMT0dfSVA2ICAgICc2Jworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gb3B0c1tdID0KK3sKKwl7ICJsb2ctcHJlZml4IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIExPR19QUkVGSVggfSwKKwl7ICJsb2ctbGV2ZWwiICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIExPR19MRVZFTCAgfSwKKwl7ICJsb2ctYXJwIiAgICwgbm9fYXJndW1lbnQgICAgICAsIDAsIExPR19BUlAgICAgfSwKKwl7ICJsb2ctaXAiICAgICwgbm9fYXJndW1lbnQgICAgICAsIDAsIExPR19JUCAgICAgfSwKKwl7ICJsb2ciICAgICAgICwgbm9fYXJndW1lbnQgICAgICAsIDAsIExPR19MT0cgICAgfSwKKwl7ICJsb2ctaXA2IiAgICwgbm9fYXJndW1lbnQgICAgICAsIDAsIExPR19JUDYgICAgfSwKKwl7IDAgfQorfTsKKworc3RhdGljIHZvaWQgcHJpbnRfaGVscCgpCit7CisJaW50IGk7CisKKwlwcmludGYoCisibG9nIG9wdGlvbnM6XG4iCisiLS1sb2cgICAgICAgICAgICAgICA6IHVzZSB0aGlzIGlmIHlvdSdyZSBub3Qgc3BlY2lmeWluZyBhbnl0aGluZ1xuIgorIi0tbG9nLWxldmVsIGxldmVsICAgOiBsZXZlbCA9IFsxLThdIG9yIGEgc3RyaW5nXG4iCisiLS1sb2ctcHJlZml4IHByZWZpeCA6IG1heC4gJWQgY2hhcnMuXG4iCisiLS1sb2ctaXAgICAgICAgICAgICA6IHB1dCBpcCBpbmZvLiBpbiB0aGUgbG9nIGZvciBpcCBwYWNrZXRzXG4iCisiLS1sb2ctYXJwICAgICAgICAgICA6IHB1dCAocilhcnAgaW5mby4gaW4gdGhlIGxvZyBmb3IgKHIpYXJwIHBhY2tldHNcbiIKKyItLWxvZy1pcDYgICAgICAgICAgIDogcHV0IGlwNiBpbmZvLiBpbiB0aGUgbG9nIGZvciBpcDYgcGFja2V0c1xuIgorCSwgRUJUX0xPR19QUkVGSVhfU0laRSAtIDEpOworCXByaW50ZigibGV2ZWxzOlxuIik7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJcHJpbnRmKCIlZCA9ICVzXG4iLCBlaWdodF9wcmlvcml0eVtpXS5jX3ZhbCwKKwkJICAgZWlnaHRfcHJpb3JpdHlbaV0uY19uYW1lKTsKK30KKworc3RhdGljIHZvaWQgaW5pdChzdHJ1Y3QgZWJ0X2VudHJ5X3dhdGNoZXIgKndhdGNoZXIpCit7CisJc3RydWN0IGVidF9sb2dfaW5mbyAqbG9naW5mbyA9IChzdHJ1Y3QgZWJ0X2xvZ19pbmZvICopd2F0Y2hlci0+ZGF0YTsKKworCWxvZ2luZm8tPmJpdG1hc2sgPSAwOworCWxvZ2luZm8tPnByZWZpeFswXSA9ICdcMCc7CisJbG9naW5mby0+bG9nbGV2ZWwgPSBMT0dfTk9USUNFOworfQorCisjZGVmaW5lIE9QVF9QUkVGSVggMHgwMQorI2RlZmluZSBPUFRfTEVWRUwgIDB4MDIKKyNkZWZpbmUgT1BUX0FSUCAgICAweDA0CisjZGVmaW5lIE9QVF9JUCAgICAgMHgwOAorI2RlZmluZSBPUFRfTE9HICAgIDB4MTAKKyNkZWZpbmUgT1BUX0lQNiAgICAweDIwCitzdGF0aWMgaW50IHBhcnNlKGludCBjLCBjaGFyICoqYXJndiwgaW50IGFyZ2MsIGNvbnN0IHN0cnVjdCBlYnRfdV9lbnRyeSAqZW50cnksCisgICB1bnNpZ25lZCBpbnQgKmZsYWdzLCBzdHJ1Y3QgZWJ0X2VudHJ5X3dhdGNoZXIgKip3YXRjaGVyKQoreworCXN0cnVjdCBlYnRfbG9nX2luZm8gKmxvZ2luZm8gPSAoc3RydWN0IGVidF9sb2dfaW5mbyAqKSgqd2F0Y2hlciktPmRhdGE7CisJbG9uZyBpbnQgaTsKKwljaGFyICplbmQ7CisKKwlzd2l0Y2ggKGMpIHsKKwljYXNlIExPR19QUkVGSVg6CisJCWVidF9jaGVja19vcHRpb24yKGZsYWdzLCBPUFRfUFJFRklYKTsKKwkJaWYgKGVidF9jaGVja19pbnZlcnNlKG9wdGFyZykpCisJCQllYnRfcHJpbnRfZXJyb3IyKCJVbmV4cGVjdGVkIGAhJyBhZnRlciAtLWxvZy1wcmVmaXgiKTsKKwkJaWYgKHN0cmxlbihvcHRhcmcpID4gc2l6ZW9mKGxvZ2luZm8tPnByZWZpeCkgLSAxKQorCQkJZWJ0X3ByaW50X2Vycm9yMigiUHJlZml4IHRvbyBsb25nIik7CisJCWlmIChzdHJjaHIob3B0YXJnLCAnXCInKSkKKwkJCWVidF9wcmludF9lcnJvcjIoIlVzZSBvZiBcXFwiIGlzIG5vdCBhbGxvd2VkIGluIHRoZSBwcmVmaXgiKTsKKwkJc3RyY3B5KChjaGFyICopbG9naW5mby0+cHJlZml4LCAoY2hhciAqKW9wdGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBMT0dfTEVWRUw6CisJCWVidF9jaGVja19vcHRpb24yKGZsYWdzLCBPUFRfTEVWRUwpOworCQlpID0gc3RydG9sKG9wdGFyZywgJmVuZCwgMTYpOworCQlpZiAoKmVuZCAhPSAnXDAnIHx8IGkgPCAwIHx8IGkgPiA3KQorCQkJbG9naW5mby0+bG9nbGV2ZWwgPSBuYW1lX3RvX2xvZ2xldmVsKG9wdGFyZyk7CisJCWVsc2UKKwkJCWxvZ2luZm8tPmxvZ2xldmVsID0gaTsKKwkJaWYgKGxvZ2luZm8tPmxvZ2xldmVsID09IDkpCisJCQllYnRfcHJpbnRfZXJyb3IyKCJQcm9ibGVtIHdpdGggdGhlIGxvZy1sZXZlbCIpOworCQlicmVhazsKKworCWNhc2UgTE9HX0lQOgorCQllYnRfY2hlY2tfb3B0aW9uMihmbGFncywgT1BUX0lQKTsKKwkJaWYgKGVidF9jaGVja19pbnZlcnNlKG9wdGFyZykpCisJCQllYnRfcHJpbnRfZXJyb3IyKCJVbmV4cGVjdGVkIGAhJyBhZnRlciAtLWxvZy1pcCIpOworCQlsb2dpbmZvLT5iaXRtYXNrIHw9IEVCVF9MT0dfSVA7CisJCWJyZWFrOworCisJY2FzZSBMT0dfQVJQOgorCQllYnRfY2hlY2tfb3B0aW9uMihmbGFncywgT1BUX0FSUCk7CisJCWlmIChlYnRfY2hlY2tfaW52ZXJzZShvcHRhcmcpKQorCQkJZWJ0X3ByaW50X2Vycm9yMigiVW5leHBlY3RlZCBgIScgYWZ0ZXIgLS1sb2ctYXJwIik7CisJCWxvZ2luZm8tPmJpdG1hc2sgfD0gRUJUX0xPR19BUlA7CisJCWJyZWFrOworCisJY2FzZSBMT0dfTE9HOgorCQllYnRfY2hlY2tfb3B0aW9uMihmbGFncywgT1BUX0xPRyk7CisJCWlmIChlYnRfY2hlY2tfaW52ZXJzZShvcHRhcmcpKQorCQkJZWJ0X3ByaW50X2Vycm9yMigiVW5leHBlY3RlZCBgIScgYWZ0ZXIgLS1sb2ciKTsKKwkJYnJlYWs7CisKKwljYXNlIExPR19JUDY6CisJCWVidF9jaGVja19vcHRpb24yKGZsYWdzLCBPUFRfSVA2KTsKKwkJaWYgKGVidF9jaGVja19pbnZlcnNlKG9wdGFyZykpCisJCQllYnRfcHJpbnRfZXJyb3IyKCJVbmV4cGVjdGVkIGAhJyBhZnRlciAtLWxvZy1pcDYiKTsKKwkJbG9naW5mby0+Yml0bWFzayB8PSBFQlRfTE9HX0lQNjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBmaW5hbF9jaGVjayhjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeV93YXRjaGVyICp3YXRjaGVyLCBjb25zdCBjaGFyICpuYW1lLAorICAgdW5zaWduZWQgaW50IGhvb2ttYXNrLCB1bnNpZ25lZCBpbnQgdGltZSkKK3sKK30KKworc3RhdGljIHZvaWQgcHJpbnQoY29uc3Qgc3RydWN0IGVidF91X2VudHJ5ICplbnRyeSwKKyAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnlfd2F0Y2hlciAqd2F0Y2hlcikKK3sKKwlzdHJ1Y3QgZWJ0X2xvZ19pbmZvICpsb2dpbmZvID0gKHN0cnVjdCBlYnRfbG9nX2luZm8gKil3YXRjaGVyLT5kYXRhOworCisJcHJpbnRmKCItLWxvZy1sZXZlbCAlcyAtLWxvZy1wcmVmaXggXCIlc1wiIiwKKwkJZWlnaHRfcHJpb3JpdHlbbG9naW5mby0+bG9nbGV2ZWxdLmNfbmFtZSwKKwkJbG9naW5mby0+cHJlZml4KTsKKwlpZiAobG9naW5mby0+Yml0bWFzayAmIEVCVF9MT0dfSVApCisJCXByaW50ZigiIC0tbG9nLWlwIik7CisJaWYgKGxvZ2luZm8tPmJpdG1hc2sgJiBFQlRfTE9HX0FSUCkKKwkJcHJpbnRmKCIgLS1sb2ctYXJwIik7CisJaWYgKGxvZ2luZm8tPmJpdG1hc2sgJiBFQlRfTE9HX0lQNikKKwkJcHJpbnRmKCIgLS1sb2ctaXA2Iik7CisJcHJpbnRmKCIgIik7Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZShjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X3dhdGNoZXIgKncxLAorICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeV93YXRjaGVyICp3MikKK3sKKwlzdHJ1Y3QgZWJ0X2xvZ19pbmZvICpsb2dpbmZvMSA9IChzdHJ1Y3QgZWJ0X2xvZ19pbmZvICopdzEtPmRhdGE7CisJc3RydWN0IGVidF9sb2dfaW5mbyAqbG9naW5mbzIgPSAoc3RydWN0IGVidF9sb2dfaW5mbyAqKXcyLT5kYXRhOworCisJaWYgKGxvZ2luZm8xLT5sb2dsZXZlbCAhPSBsb2dpbmZvMi0+bG9nbGV2ZWwpCisJCXJldHVybiAwOworCWlmIChsb2dpbmZvMS0+Yml0bWFzayAhPSBsb2dpbmZvMi0+Yml0bWFzaykKKwkJcmV0dXJuIDA7CisJcmV0dXJuICFzdHJjbXAoKGNoYXIgKilsb2dpbmZvMS0+cHJlZml4LCAoY2hhciAqKWxvZ2luZm8yLT5wcmVmaXgpOworfQorCitzdGF0aWMgc3RydWN0IGVidF91X3dhdGNoZXIgbG9nX3dhdGNoZXIgPQoreworCS5uYW1lCQk9ICJsb2ciLAorCS5zaXplCQk9IHNpemVvZihzdHJ1Y3QgZWJ0X2xvZ19pbmZvKSwKKwkuaGVscAkJPSBwcmludF9oZWxwLAorCS5pbml0CQk9IGluaXQsCisJLnBhcnNlCQk9IHBhcnNlLAorCS5maW5hbF9jaGVjawk9IGZpbmFsX2NoZWNrLAorCS5wcmludAkJPSBwcmludCwKKwkuY29tcGFyZQk9IGNvbXBhcmUsCisJLmV4dHJhX29wcwk9IG9wdHMsCit9OworCitzdGF0aWMgdm9pZCBfSU5JVCh2b2lkKQoreworCWVidF9yZWdpc3Rlcl93YXRjaGVyKCZsb2dfd2F0Y2hlcik7Cit9CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2VidF9tYXJrLmMgYi9leHRlbnNpb25zL2VidF9tYXJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRmOTNiNQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZWJ0X21hcmsuYwpAQCAtMCwwICsxLDE3OCBAQAorLyogZWJ0X21hcmsKKyAqCisgKiBBdXRob3JzOgorICogQmFydCBEZSBTY2h1eW1lciA8YmRzY2h1eW1AcGFuZG9yYS5iZT4KKyAqCisgKiBKdWx5LCAyMDAyLCBTZXB0ZW1iZXIgMjAwNgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZWJ0YWJsZXNfdS5oIgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X21hcmtfdC5oPgorCitzdGF0aWMgaW50IG1hcmtfc3VwcGxpZWQ7CisKKyNkZWZpbmUgTUFSS19UQVJHRVQgICcxJworI2RlZmluZSBNQVJLX1NFVE1BUksgJzInCisjZGVmaW5lIE1BUktfT1JNQVJLICAnMycKKyNkZWZpbmUgTUFSS19BTkRNQVJLICc0JworI2RlZmluZSBNQVJLX1hPUk1BUksgJzUnCitzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBvcHRzW10gPQoreworCXsgIm1hcmstdGFyZ2V0IiAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBNQVJLX1RBUkdFVCB9LAorCS8qIGFuIG9sZHRpbWUgbWVzc3VwLCB3ZSBzaG91bGQgaGF2ZSBhbHdheXMgdXNlZCB0aGUgc2NoZW1lCisJICogPGV4dGVuc2lvbi1uYW1lPi08b3B0aW9uPiAqLworCXsgInNldC1tYXJrIiAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBNQVJLX1NFVE1BUksgfSwKKwl7ICJtYXJrLXNldCIgICAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgTUFSS19TRVRNQVJLIH0sCisJeyAibWFyay1vciIgICAgICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE1BUktfT1JNQVJLICB9LAorCXsgIm1hcmstYW5kIiAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBNQVJLX0FORE1BUksgfSwKKwl7ICJtYXJrLXhvciIgICAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgTUFSS19YT1JNQVJLIH0sCisJeyAwIH0KK307CisKK3N0YXRpYyB2b2lkIHByaW50X2hlbHAoKQoreworCXByaW50ZigKKwkibWFyayB0YXJnZXQgb3B0aW9uczpcbiIKKwkiIC0tbWFyay1zZXQgdmFsdWUgICAgIDogU2V0IG5mbWFyayB2YWx1ZVxuIgorCSIgLS1tYXJrLW9yICB2YWx1ZSAgICAgOiBPciBuZm1hcmsgd2l0aCB2YWx1ZSAobmZtYXJrIHw9IHZhbHVlKVxuIgorCSIgLS1tYXJrLWFuZCB2YWx1ZSAgICAgOiBBbmQgbmZtYXJrIHdpdGggdmFsdWUgKG5mbWFyayAmPSB2YWx1ZSlcbiIKKwkiIC0tbWFyay14b3IgdmFsdWUgICAgIDogWG9yIG5mbWFyayB3aXRoIHZhbHVlIChuZm1hcmsgXj0gdmFsdWUpXG4iCisJIiAtLW1hcmstdGFyZ2V0IHRhcmdldCA6IEFDQ0VQVCwgRFJPUCwgUkVUVVJOIG9yIENPTlRJTlVFXG4iKTsKK30KKworc3RhdGljIHZvaWQgaW5pdChzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdGFyZ2V0KQoreworCXN0cnVjdCBlYnRfbWFya190X2luZm8gKm1hcmtpbmZvID0KKwkgICAoc3RydWN0IGVidF9tYXJrX3RfaW5mbyAqKXRhcmdldC0+ZGF0YTsKKworCW1hcmtpbmZvLT50YXJnZXQgPSBFQlRfQUNDRVBUOworCW1hcmtpbmZvLT5tYXJrID0gMDsKKwltYXJrX3N1cHBsaWVkID0gMDsKK30KKworI2RlZmluZSBPUFRfTUFSS19UQVJHRVQgICAweDAxCisjZGVmaW5lIE9QVF9NQVJLX1NFVE1BUksgIDB4MDIKKyNkZWZpbmUgT1BUX01BUktfT1JNQVJLICAgMHgwNAorI2RlZmluZSBPUFRfTUFSS19BTkRNQVJLICAweDA4CisjZGVmaW5lIE9QVF9NQVJLX1hPUk1BUksgIDB4MTAKK3N0YXRpYyBpbnQgcGFyc2UoaW50IGMsIGNoYXIgKiphcmd2LCBpbnQgYXJnYywKKyAgIGNvbnN0IHN0cnVjdCBlYnRfdV9lbnRyeSAqZW50cnksIHVuc2lnbmVkIGludCAqZmxhZ3MsCisgICBzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqKnRhcmdldCkKK3sKKwlzdHJ1Y3QgZWJ0X21hcmtfdF9pbmZvICptYXJraW5mbyA9CisJICAgKHN0cnVjdCBlYnRfbWFya190X2luZm8gKikoKnRhcmdldCktPmRhdGE7CisJY2hhciAqZW5kOworCisJc3dpdGNoIChjKSB7CisJY2FzZSBNQVJLX1RBUkdFVDoKKwkJeyBpbnQgdG1wOworCQllYnRfY2hlY2tfb3B0aW9uMihmbGFncywgT1BUX01BUktfVEFSR0VUKTsKKwkJaWYgKEZJTExfVEFSR0VUKG9wdGFyZywgdG1wKSkKKwkJCWVidF9wcmludF9lcnJvcjIoIklsbGVnYWwgLS1tYXJrLXRhcmdldCB0YXJnZXQiKTsKKwkJLyogdGhlIDQgbHNiIGFyZSBsZWZ0IHRvIGRlc2lnbmF0ZSB0aGUgdGFyZ2V0ICovCisJCW1hcmtpbmZvLT50YXJnZXQgPSAobWFya2luZm8tPnRhcmdldCAmIH5FQlRfVkVSRElDVF9CSVRTKSB8ICh0bXAgJiBFQlRfVkVSRElDVF9CSVRTKTsKKwkJfQorCQlyZXR1cm4gMTsKKwljYXNlIE1BUktfU0VUTUFSSzoKKwkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIE9QVF9NQVJLX1NFVE1BUkspOworCQlpZiAoKmZsYWdzICYgKE9QVF9NQVJLX09STUFSS3xPUFRfTUFSS19BTkRNQVJLfE9QVF9NQVJLX1hPUk1BUkspKQorCQkJZWJ0X3ByaW50X2Vycm9yMigiLS1tYXJrLXNldCBjYW5ub3QgYmUgdXNlZCB0b2dldGhlciB3aXRoIHNwZWNpZmljIC0tbWFyayBvcHRpb24iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKwljYXNlIE1BUktfT1JNQVJLOgorCQllYnRfY2hlY2tfb3B0aW9uMihmbGFncywgT1BUX01BUktfT1JNQVJLKTsKKwkJaWYgKCpmbGFncyAmIChPUFRfTUFSS19TRVRNQVJLfE9QVF9NQVJLX0FORE1BUkt8T1BUX01BUktfWE9STUFSSykpCisJCQllYnRfcHJpbnRfZXJyb3IyKCItLW1hcmstb3IgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXIgd2l0aCBzcGVjaWZpYyAtLW1hcmsgb3B0aW9uIik7CisJCW1hcmtpbmZvLT50YXJnZXQgPSAobWFya2luZm8tPnRhcmdldCAmIEVCVF9WRVJESUNUX0JJVFMpIHwgTUFSS19PUl9WQUxVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKwljYXNlIE1BUktfQU5ETUFSSzoKKwkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIE9QVF9NQVJLX0FORE1BUkspOworCQlpZiAoKmZsYWdzICYgKE9QVF9NQVJLX1NFVE1BUkt8T1BUX01BUktfT1JNQVJLfE9QVF9NQVJLX1hPUk1BUkspKQorCQkJZWJ0X3ByaW50X2Vycm9yMigiLS1tYXJrLWFuZCBjYW5ub3QgYmUgdXNlZCB0b2dldGhlciB3aXRoIHNwZWNpZmljIC0tbWFyayBvcHRpb24iKTsKKwkJbWFya2luZm8tPnRhcmdldCA9IChtYXJraW5mby0+dGFyZ2V0ICYgRUJUX1ZFUkRJQ1RfQklUUykgfCBNQVJLX0FORF9WQUxVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKwljYXNlIE1BUktfWE9STUFSSzoKKwkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIE9QVF9NQVJLX1hPUk1BUkspOworCQlpZiAoKmZsYWdzICYgKE9QVF9NQVJLX1NFVE1BUkt8T1BUX01BUktfQU5ETUFSS3xPUFRfTUFSS19PUk1BUkspKQorCQkJZWJ0X3ByaW50X2Vycm9yMigiLS1tYXJrLXhvciBjYW5ub3QgYmUgdXNlZCB0b2dldGhlciB3aXRoIHNwZWNpZmljIC0tbWFyayBvcHRpb24iKTsKKwkJbWFya2luZm8tPnRhcmdldCA9IChtYXJraW5mby0+dGFyZ2V0ICYgRUJUX1ZFUkRJQ1RfQklUUykgfCBNQVJLX1hPUl9WQUxVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKwkgZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCS8qIG11dHVhbCBjb2RlICovCisJbWFya2luZm8tPm1hcmsgPSBzdHJ0b3VsKG9wdGFyZywgJmVuZCwgMCk7CisJaWYgKCplbmQgIT0gJ1wwJyB8fCBlbmQgPT0gb3B0YXJnKQorCQllYnRfcHJpbnRfZXJyb3IyKCJCYWQgTUFSSyB2YWx1ZSAnJXMnIiwgb3B0YXJnKTsKKwltYXJrX3N1cHBsaWVkID0gMTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZmluYWxfY2hlY2soY29uc3Qgc3RydWN0IGVidF91X2VudHJ5ICplbnRyeSwKKyAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICp0YXJnZXQsIGNvbnN0IGNoYXIgKm5hbWUsCisgICB1bnNpZ25lZCBpbnQgaG9va21hc2ssIHVuc2lnbmVkIGludCB0aW1lKQoreworCXN0cnVjdCBlYnRfbWFya190X2luZm8gKm1hcmtpbmZvID0KKwkgICAoc3RydWN0IGVidF9tYXJrX3RfaW5mbyAqKXRhcmdldC0+ZGF0YTsKKworCWlmICh0aW1lID09IDAgJiYgbWFya19zdXBwbGllZCA9PSAwKSB7CisJCWVidF9wcmludF9lcnJvcigiTm8gbWFyayB2YWx1ZSBzdXBwbGllZCIpOworCX0gZWxzZSBpZiAoQkFTRV9DSEFJTiAmJiAobWFya2luZm8tPnRhcmdldHx+RUJUX1ZFUkRJQ1RfQklUUykgPT0gRUJUX1JFVFVSTikKKwkJZWJ0X3ByaW50X2Vycm9yKCItLW1hcmstdGFyZ2V0IFJFVFVSTiBub3QgYWxsb3dlZCBvbiBiYXNlIGNoYWluIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50KGNvbnN0IHN0cnVjdCBlYnRfdV9lbnRyeSAqZW50cnksCisgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdGFyZ2V0KQoreworCXN0cnVjdCBlYnRfbWFya190X2luZm8gKm1hcmtpbmZvID0KKwkgICAoc3RydWN0IGVidF9tYXJrX3RfaW5mbyAqKXRhcmdldC0+ZGF0YTsKKwlpbnQgdG1wOworCisJdG1wID0gbWFya2luZm8tPnRhcmdldCAmIH5FQlRfVkVSRElDVF9CSVRTOworCWlmICh0bXAgPT0gTUFSS19TRVRfVkFMVUUpCisJCXByaW50ZigiLS1tYXJrLXNldCIpOworCWVsc2UgaWYgKHRtcCA9PSBNQVJLX09SX1ZBTFVFKQorCQlwcmludGYoIi0tbWFyay1vciIpOworCWVsc2UgaWYgKHRtcCA9PSBNQVJLX1hPUl9WQUxVRSkKKwkJcHJpbnRmKCItLW1hcmsteG9yIik7CisJZWxzZSBpZiAodG1wID09IE1BUktfQU5EX1ZBTFVFKQorCQlwcmludGYoIi0tbWFyay1hbmQiKTsKKwllbHNlCisJCWVidF9wcmludF9lcnJvcigib29wcywgdW5rbm93biBtYXJrIGFjdGlvbiwgdHJ5IGEgbGF0ZXIgdmVyc2lvbiBvZiBlYnRhYmxlcyIpOworCXByaW50ZigiIDB4JWx4IiwgbWFya2luZm8tPm1hcmspOworCXRtcCA9IG1hcmtpbmZvLT50YXJnZXQgfCB+RUJUX1ZFUkRJQ1RfQklUUzsKKwlwcmludGYoIiAtLW1hcmstdGFyZ2V0ICVzIiwgVEFSR0VUX05BTUUodG1wKSk7Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZShjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdDEsCisgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdDIpCit7CisJc3RydWN0IGVidF9tYXJrX3RfaW5mbyAqbWFya2luZm8xID0KKwkgICAoc3RydWN0IGVidF9tYXJrX3RfaW5mbyAqKXQxLT5kYXRhOworCXN0cnVjdCBlYnRfbWFya190X2luZm8gKm1hcmtpbmZvMiA9CisJICAgKHN0cnVjdCBlYnRfbWFya190X2luZm8gKil0Mi0+ZGF0YTsKKworCXJldHVybiBtYXJraW5mbzEtPnRhcmdldCA9PSBtYXJraW5mbzItPnRhcmdldCAmJgorCSAgIG1hcmtpbmZvMS0+bWFyayA9PSBtYXJraW5mbzItPm1hcms7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWJ0X3VfdGFyZ2V0IG1hcmtfdGFyZ2V0ID0KK3sKKwkubmFtZQkJPSAibWFyayIsCisJLnNpemUJCT0gc2l6ZW9mKHN0cnVjdCBlYnRfbWFya190X2luZm8pLAorCS5oZWxwCQk9IHByaW50X2hlbHAsCisJLmluaXQJCT0gaW5pdCwKKwkucGFyc2UJCT0gcGFyc2UsCisJLmZpbmFsX2NoZWNrCT0gZmluYWxfY2hlY2ssCisJLnByaW50CQk9IHByaW50LAorCS5jb21wYXJlCT0gY29tcGFyZSwKKwkuZXh0cmFfb3BzCT0gb3B0cywKK307CisKK3N0YXRpYyB2b2lkIF9JTklUKHZvaWQpCit7CisJZWJ0X3JlZ2lzdGVyX3RhcmdldCgmbWFya190YXJnZXQpOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9lYnRfbWFya19tLmMgYi9leHRlbnNpb25zL2VidF9tYXJrX20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmQxMWEyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9lYnRfbWFya19tLmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qIGVidF9tYXJrX20KKyAqCisgKiBBdXRob3JzOgorICogQmFydCBEZSBTY2h1eW1lciA8YmRzY2h1eW1AcGFuZG9yYS5iZT4KKyAqCisgKiBKdWx5LCAyMDAyCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSAiLi4vaW5jbHVkZS9lYnRhYmxlc191LmgiCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbWFya19tLmg+CisKKyNkZWZpbmUgTUFSSyAnMScKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gb3B0c1tdID0KK3sKKwl7ICJtYXJrIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE1BUksgfSwKKwl7IDAgfQorfTsKKworc3RhdGljIHZvaWQgcHJpbnRfaGVscCgpCit7CisJcHJpbnRmKAorIm1hcmsgb3B0aW9uOlxuIgorIi0tbWFyayAgICBbIV0gW3ZhbHVlXVsvbWFza106IE1hdGNoIG5mbWFzayB2YWx1ZSAoc2VlIG1hbiBwYWdlKVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGluaXQoc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbWF0Y2gpCit7CisJc3RydWN0IGVidF9tYXJrX21faW5mbyAqbWFya2luZm8gPSAoc3RydWN0IGVidF9tYXJrX21faW5mbyAqKW1hdGNoLT5kYXRhOworCisJbWFya2luZm8tPm1hcmsgICAgPSAwOworCW1hcmtpbmZvLT5tYXNrICAgID0gMDsKKwltYXJraW5mby0+aW52ZXJ0ICA9IDA7CisJbWFya2luZm8tPmJpdG1hc2sgPSAwOworfQorCisjZGVmaW5lIE9QVF9NQVJLIDB4MDEKK3N0YXRpYyBpbnQgcGFyc2UoaW50IGMsIGNoYXIgKiphcmd2LCBpbnQgYXJnYywgY29uc3Qgc3RydWN0IGVidF91X2VudHJ5ICplbnRyeSwKKyAgIHVuc2lnbmVkIGludCAqZmxhZ3MsIHN0cnVjdCBlYnRfZW50cnlfbWF0Y2ggKiptYXRjaCkKK3sKKwlzdHJ1Y3QgZWJ0X21hcmtfbV9pbmZvICptYXJraW5mbyA9IChzdHJ1Y3QgZWJ0X21hcmtfbV9pbmZvICopCisJICAgKCptYXRjaCktPmRhdGE7CisJY2hhciAqZW5kOworCisJc3dpdGNoIChjKSB7CisJY2FzZSBNQVJLOgorCQllYnRfY2hlY2tfb3B0aW9uMihmbGFncywgTUFSSyk7CisJCWlmIChlYnRfY2hlY2tfaW52ZXJzZTIob3B0YXJnKSkKKwkJCW1hcmtpbmZvLT5pbnZlcnQgPSAxOworCQltYXJraW5mby0+bWFyayA9IHN0cnRvdWwob3B0YXJnLCAmZW5kLCAwKTsKKwkJbWFya2luZm8tPmJpdG1hc2sgPSBFQlRfTUFSS19BTkQ7CisJCWlmICgqZW5kID09ICcvJykgeworCQkJaWYgKGVuZCA9PSBvcHRhcmcpCisJCQkJbWFya2luZm8tPmJpdG1hc2sgPSBFQlRfTUFSS19PUjsKKwkJCW1hcmtpbmZvLT5tYXNrID0gc3RydG91bChlbmQrMSwgJmVuZCwgMCk7CisJCX0gZWxzZQorCQkJbWFya2luZm8tPm1hc2sgPSAweGZmZmZmZmZmOworCQlpZiAoICplbmQgIT0gJ1wwJyB8fCBlbmQgPT0gb3B0YXJnKQorCQkJZWJ0X3ByaW50X2Vycm9yMigiQmFkIG1hcmsgdmFsdWUgJyVzJyIsIG9wdGFyZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZmluYWxfY2hlY2soY29uc3Qgc3RydWN0IGVidF91X2VudHJ5ICplbnRyeSwKKyAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnlfbWF0Y2ggKm1hdGNoLCBjb25zdCBjaGFyICpuYW1lLAorICAgdW5zaWduZWQgaW50IGhvb2ttYXNrLCB1bnNpZ25lZCBpbnQgdGltZSkKK3sKK30KKworc3RhdGljIHZvaWQgcHJpbnQoY29uc3Qgc3RydWN0IGVidF91X2VudHJ5ICplbnRyeSwKKyAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnlfbWF0Y2ggKm1hdGNoKQoreworCXN0cnVjdCBlYnRfbWFya19tX2luZm8gKm1hcmtpbmZvID0KKwkgICAoc3RydWN0IGVidF9tYXJrX21faW5mbyAqKW1hdGNoLT5kYXRhOworCisJcHJpbnRmKCItLW1hcmsgIik7CisJaWYgKG1hcmtpbmZvLT5pbnZlcnQpCisJCXByaW50ZigiISAiKTsKKwlpZiAobWFya2luZm8tPmJpdG1hc2sgPT0gRUJUX01BUktfT1IpCisJCXByaW50ZigiLzB4JWx4ICIsIG1hcmtpbmZvLT5tYXNrKTsKKwllbHNlIGlmKG1hcmtpbmZvLT5tYXNrICE9IDB4ZmZmZmZmZmYpCisJCXByaW50ZigiMHglbHgvMHglbHggIiwgbWFya2luZm8tPm1hcmssIG1hcmtpbmZvLT5tYXNrKTsKKwllbHNlCisJCXByaW50ZigiMHglbHggIiwgbWFya2luZm8tPm1hcmspOworfQorCitzdGF0aWMgaW50IGNvbXBhcmUoY29uc3Qgc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbTEsCisgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICptMikKK3sKKwlzdHJ1Y3QgZWJ0X21hcmtfbV9pbmZvICptYXJraW5mbzEgPSAoc3RydWN0IGVidF9tYXJrX21faW5mbyAqKW0xLT5kYXRhOworCXN0cnVjdCBlYnRfbWFya19tX2luZm8gKm1hcmtpbmZvMiA9IChzdHJ1Y3QgZWJ0X21hcmtfbV9pbmZvICopbTItPmRhdGE7CisKKwlpZiAobWFya2luZm8xLT5pbnZlcnQgIT0gbWFya2luZm8yLT5pbnZlcnQpCisJCXJldHVybiAwOworCWlmIChtYXJraW5mbzEtPm1hcmsgIT0gbWFya2luZm8yLT5tYXJrKQorCQlyZXR1cm4gMDsKKwlpZiAobWFya2luZm8xLT5tYXNrICE9IG1hcmtpbmZvMi0+bWFzaykKKwkJcmV0dXJuIDA7CisJaWYgKG1hcmtpbmZvMS0+Yml0bWFzayAhPSBtYXJraW5mbzItPmJpdG1hc2spCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGVidF91X21hdGNoIG1hcmtfbWF0Y2ggPQoreworCS5uYW1lCQk9ICJtYXJrX20iLAorCS5zaXplCQk9IHNpemVvZihzdHJ1Y3QgZWJ0X21hcmtfbV9pbmZvKSwKKwkuaGVscAkJPSBwcmludF9oZWxwLAorCS5pbml0CQk9IGluaXQsCisJLnBhcnNlCQk9IHBhcnNlLAorCS5maW5hbF9jaGVjawk9IGZpbmFsX2NoZWNrLAorCS5wcmludAkJPSBwcmludCwKKwkuY29tcGFyZQk9IGNvbXBhcmUsCisJLmV4dHJhX29wcwk9IG9wdHMsCit9OworCitzdGF0aWMgdm9pZCBfSU5JVCh2b2lkKQoreworCWVidF9yZWdpc3Rlcl9tYXRjaCgmbWFya19tYXRjaCk7Cit9CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2VidF9uYXQuYyBiL2V4dGVuc2lvbnMvZWJ0X25hdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlN2U5ODcKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2VidF9uYXQuYwpAQCAtMCwwICsxLDIzOCBAQAorLyogZWJ0X25hdAorICoKKyAqIEF1dGhvcnM6CisgKiBCYXJ0IERlIFNjaHV5bWVyIDxiZHNjaHV5bUBwYW5kb3JhLmJlPgorICoKKyAqIEp1bmUsIDIwMDIKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlICIuLi9pbmNsdWRlL2VidGFibGVzX3UuaCIKKyNpbmNsdWRlIDxuZXRpbmV0L2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbmF0Lmg+CisKK3N0YXRpYyBpbnQgdG9fc291cmNlX3N1cHBsaWVkLCB0b19kZXN0X3N1cHBsaWVkOworCisjZGVmaW5lIE5BVF9TICcxJworI2RlZmluZSBOQVRfRCAnMScKKyNkZWZpbmUgTkFUX1NfVEFSR0VUICcyJworI2RlZmluZSBOQVRfRF9UQVJHRVQgJzInCisjZGVmaW5lIE5BVF9TX0FSUCAnMycKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIG9wdHNfc1tdID0KK3sKKwl7ICJ0by1zb3VyY2UiICAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBOQVRfUyB9LAorCXsgInRvLXNyYyIgICAgICAgICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE5BVF9TIH0sCisJeyAic25hdC10YXJnZXQiICAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgTkFUX1NfVEFSR0VUIH0sCisJeyAic25hdC1hcnAiICAgICAgLCAgICAgICBub19hcmd1bWVudCwgMCwgTkFUX1NfQVJQIH0sCisJeyAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIG9wdHNfZFtdID0KK3sKKwl7ICJ0by1kZXN0aW5hdGlvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBOQVRfRCB9LAorCXsgInRvLWRzdCIgICAgICAgICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE5BVF9EIH0sCisJeyAiZG5hdC10YXJnZXQiICAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgTkFUX0RfVEFSR0VUIH0sCisJeyAwIH0KK307CisKK3N0YXRpYyB2b2lkIHByaW50X2hlbHBfcygpCit7CisJcHJpbnRmKAorCSJzbmF0IG9wdGlvbnM6XG4iCisJIiAtLXRvLXNyYyBhZGRyZXNzICAgICAgIDogTUFDIGFkZHJlc3MgdG8gbWFwIHNvdXJjZSB0b1xuIgorCSIgLS1zbmF0LXRhcmdldCB0YXJnZXQgICA6IEFDQ0VQVCwgRFJPUCwgUkVUVVJOIG9yIENPTlRJTlVFXG4iCisJIiAtLXNuYXQtYXJwICAgICAgICAgICAgIDogYWxzbyBjaGFuZ2Ugc3JjIGFkZHJlc3MgaW4gYXJwIG1zZ1xuIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2hlbHBfZCgpCit7CisJcHJpbnRmKAorCSJkbmF0IG9wdGlvbnM6XG4iCisJIiAtLXRvLWRzdCBhZGRyZXNzICAgICAgIDogTUFDIGFkZHJlc3MgdG8gbWFwIGRlc3RpbmF0aW9uIHRvXG4iCisJIiAtLWRuYXQtdGFyZ2V0IHRhcmdldCAgIDogQUNDRVBULCBEUk9QLCBSRVRVUk4gb3IgQ09OVElOVUVcbiIpOworfQorCitzdGF0aWMgdm9pZCBpbml0X3Moc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKnRhcmdldCkKK3sKKwlzdHJ1Y3QgZWJ0X25hdF9pbmZvICpuYXRpbmZvID0gKHN0cnVjdCBlYnRfbmF0X2luZm8gKil0YXJnZXQtPmRhdGE7CisKKwl0b19zb3VyY2Vfc3VwcGxpZWQgPSAwOworCW5hdGluZm8tPnRhcmdldCA9IEVCVF9BQ0NFUFQ7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBpbml0X2Qoc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKnRhcmdldCkKK3sKKwlzdHJ1Y3QgZWJ0X25hdF9pbmZvICpuYXRpbmZvID0gKHN0cnVjdCBlYnRfbmF0X2luZm8gKil0YXJnZXQtPmRhdGE7CisKKwl0b19kZXN0X3N1cHBsaWVkID0gMDsKKwluYXRpbmZvLT50YXJnZXQgPSBFQlRfQUNDRVBUOworCXJldHVybjsKK30KKworI2RlZmluZSBPUFRfU05BVCAgICAgICAgIDB4MDEKKyNkZWZpbmUgT1BUX1NOQVRfVEFSR0VUICAweDAyCisjZGVmaW5lIE9QVF9TTkFUX0FSUCAgICAgMHgwNAorc3RhdGljIGludCBwYXJzZV9zKGludCBjLCBjaGFyICoqYXJndiwgaW50IGFyZ2MsCisgICBjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LCB1bnNpZ25lZCBpbnQgKmZsYWdzLAorICAgc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKip0YXJnZXQpCit7CisJc3RydWN0IGVidF9uYXRfaW5mbyAqbmF0aW5mbyA9IChzdHJ1Y3QgZWJ0X25hdF9pbmZvICopKCp0YXJnZXQpLT5kYXRhOworCXN0cnVjdCBldGhlcl9hZGRyICphZGRyOworCisJc3dpdGNoIChjKSB7CisJY2FzZSBOQVRfUzoKKwkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIE9QVF9TTkFUKTsKKwkJdG9fc291cmNlX3N1cHBsaWVkID0gMTsKKwkJaWYgKCEoYWRkciA9IGV0aGVyX2F0b24ob3B0YXJnKSkpCisJCQllYnRfcHJpbnRfZXJyb3IyKCJQcm9ibGVtIHdpdGggc3BlY2lmaWVkIC0tdG8tc291cmNlIG1hYyIpOworCQltZW1jcHkobmF0aW5mby0+bWFjLCBhZGRyLCBFVEhfQUxFTik7CisJCWJyZWFrOworCWNhc2UgTkFUX1NfVEFSR0VUOgorCQl7IGludCB0bXA7CisJCWVidF9jaGVja19vcHRpb24yKGZsYWdzLCBPUFRfU05BVF9UQVJHRVQpOworCQlpZiAoRklMTF9UQVJHRVQob3B0YXJnLCB0bXApKQorCQkJZWJ0X3ByaW50X2Vycm9yMigiSWxsZWdhbCAtLXNuYXQtdGFyZ2V0IHRhcmdldCIpOworCQluYXRpbmZvLT50YXJnZXQgPSAobmF0aW5mby0+dGFyZ2V0ICYgfkVCVF9WRVJESUNUX0JJVFMpIHwgKHRtcCAmIEVCVF9WRVJESUNUX0JJVFMpOworCQl9CisJCWJyZWFrOworCWNhc2UgTkFUX1NfQVJQOgorCQllYnRfY2hlY2tfb3B0aW9uMihmbGFncywgT1BUX1NOQVRfQVJQKTsKKwkJbmF0aW5mby0+dGFyZ2V0IF49IE5BVF9BUlBfQklUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgT1BUX0ROQVQgICAgICAgIDB4MDEKKyNkZWZpbmUgT1BUX0ROQVRfVEFSR0VUIDB4MDIKK3N0YXRpYyBpbnQgcGFyc2VfZChpbnQgYywgY2hhciAqKmFyZ3YsIGludCBhcmdjLAorICAgY29uc3Qgc3RydWN0IGVidF91X2VudHJ5ICplbnRyeSwgdW5zaWduZWQgaW50ICpmbGFncywKKyAgIHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICoqdGFyZ2V0KQoreworCXN0cnVjdCBlYnRfbmF0X2luZm8gKm5hdGluZm8gPSAoc3RydWN0IGVidF9uYXRfaW5mbyAqKSgqdGFyZ2V0KS0+ZGF0YTsKKwlzdHJ1Y3QgZXRoZXJfYWRkciAqYWRkcjsKKworCXN3aXRjaCAoYykgeworCWNhc2UgTkFUX0Q6CisJCWVidF9jaGVja19vcHRpb24yKGZsYWdzLCBPUFRfRE5BVCk7CisJCXRvX2Rlc3Rfc3VwcGxpZWQgPSAxOworCQlpZiAoIShhZGRyID0gZXRoZXJfYXRvbihvcHRhcmcpKSkKKwkJCWVidF9wcmludF9lcnJvcjIoIlByb2JsZW0gd2l0aCBzcGVjaWZpZWQgLS10by1kZXN0aW5hdGlvbiBtYWMiKTsKKwkJbWVtY3B5KG5hdGluZm8tPm1hYywgYWRkciwgRVRIX0FMRU4pOworCQlicmVhazsKKwljYXNlIE5BVF9EX1RBUkdFVDoKKwkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIE9QVF9ETkFUX1RBUkdFVCk7CisJCWlmIChGSUxMX1RBUkdFVChvcHRhcmcsIG5hdGluZm8tPnRhcmdldCkpCisJCQllYnRfcHJpbnRfZXJyb3IyKCJJbGxlZ2FsIC0tZG5hdC10YXJnZXQgdGFyZ2V0Iik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZmluYWxfY2hlY2tfcyhjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKnRhcmdldCwgY29uc3QgY2hhciAqbmFtZSwKKyAgIHVuc2lnbmVkIGludCBob29rbWFzaywgdW5zaWduZWQgaW50IHRpbWUpCit7CisJc3RydWN0IGVidF9uYXRfaW5mbyAqbmF0aW5mbyA9IChzdHJ1Y3QgZWJ0X25hdF9pbmZvICopdGFyZ2V0LT5kYXRhOworCisJaWYgKEJBU0VfQ0hBSU4gJiYgKG5hdGluZm8tPnRhcmdldCB8IH5FQlRfVkVSRElDVF9CSVRTKSA9PSBFQlRfUkVUVVJOKSB7CisJCWVidF9wcmludF9lcnJvcigiLS1zbmF0LXRhcmdldCBSRVRVUk4gbm90IGFsbG93ZWQgb24gYmFzZSBjaGFpbiIpOworCQlyZXR1cm47CisJfQorCUNMRUFSX0JBU0VfQ0hBSU5fQklUOworCWlmICgoaG9va21hc2sgJiB+KDEgPDwgTkZfQlJfUE9TVF9ST1VUSU5HKSkgfHwgc3RyY21wKG5hbWUsICJuYXQiKSkgeworCQllYnRfcHJpbnRfZXJyb3IoIldyb25nIGNoYWluIGZvciBzbmF0Iik7CisJfSBlbHNlIGlmICh0aW1lID09IDAgJiYgdG9fc291cmNlX3N1cHBsaWVkID09IDApCisJCWVidF9wcmludF9lcnJvcigiTm8gc25hdCBhZGRyZXNzIHN1cHBsaWVkIik7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmFsX2NoZWNrX2QoY29uc3Qgc3RydWN0IGVidF91X2VudHJ5ICplbnRyeSwKKyAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICp0YXJnZXQsIGNvbnN0IGNoYXIgKm5hbWUsCisgICB1bnNpZ25lZCBpbnQgaG9va21hc2ssIHVuc2lnbmVkIGludCB0aW1lKQoreworCXN0cnVjdCBlYnRfbmF0X2luZm8gKm5hdGluZm8gPSAoc3RydWN0IGVidF9uYXRfaW5mbyAqKXRhcmdldC0+ZGF0YTsKKworCWlmIChCQVNFX0NIQUlOICYmIG5hdGluZm8tPnRhcmdldCA9PSBFQlRfUkVUVVJOKSB7CisJCWVidF9wcmludF9lcnJvcigiLS1kbmF0LXRhcmdldCBSRVRVUk4gbm90IGFsbG93ZWQgb24gYmFzZSBjaGFpbiIpOworCQlyZXR1cm47CisJfQorCUNMRUFSX0JBU0VfQ0hBSU5fQklUOworCWlmICgoKGhvb2ttYXNrICYgfigoMSA8PCBORl9CUl9QUkVfUk9VVElORykgfCAoMSA8PCBORl9CUl9MT0NBTF9PVVQpKSkKKwkgICB8fCBzdHJjbXAobmFtZSwgIm5hdCIpKSAmJgorCSAgICgoaG9va21hc2sgJiB+KDEgPDwgTkZfQlJfQlJPVVRJTkcpKSB8fCBzdHJjbXAobmFtZSwgImJyb3V0ZSIpKSkgeworCQllYnRfcHJpbnRfZXJyb3IoIldyb25nIGNoYWluIGZvciBkbmF0Iik7CisJfSBlbHNlIGlmICh0aW1lID09IDAgJiYgdG9fZGVzdF9zdXBwbGllZCA9PSAwKQorCQllYnRfcHJpbnRfZXJyb3IoIk5vIGRuYXQgYWRkcmVzcyBzdXBwbGllZCIpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9zKGNvbnN0IHN0cnVjdCBlYnRfdV9lbnRyeSAqZW50cnksCisgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdGFyZ2V0KQoreworCXN0cnVjdCBlYnRfbmF0X2luZm8gKm5hdGluZm8gPSAoc3RydWN0IGVidF9uYXRfaW5mbyAqKXRhcmdldC0+ZGF0YTsKKworCXByaW50ZigiLS10by1zcmMgIik7CisJZWJ0X3ByaW50X21hYyhuYXRpbmZvLT5tYWMpOworCWlmICghKG5hdGluZm8tPnRhcmdldCZOQVRfQVJQX0JJVCkpCisJCXByaW50ZigiIC0tc25hdC1hcnAiKTsKKwlwcmludGYoIiAtLXNuYXQtdGFyZ2V0ICVzIiwgVEFSR0VUX05BTUUoKG5hdGluZm8tPnRhcmdldHx+RUJUX1ZFUkRJQ1RfQklUUykpKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfZChjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKnRhcmdldCkKK3sKKwlzdHJ1Y3QgZWJ0X25hdF9pbmZvICpuYXRpbmZvID0gKHN0cnVjdCBlYnRfbmF0X2luZm8gKil0YXJnZXQtPmRhdGE7CisKKwlwcmludGYoIi0tdG8tZHN0ICIpOworCWVidF9wcmludF9tYWMobmF0aW5mby0+bWFjKTsKKwlwcmludGYoIiAtLWRuYXQtdGFyZ2V0ICVzIiwgVEFSR0VUX05BTUUobmF0aW5mby0+dGFyZ2V0KSk7Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZShjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdDEsCisgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdDIpCit7CisJc3RydWN0IGVidF9uYXRfaW5mbyAqbmF0aW5mbzEgPSAoc3RydWN0IGVidF9uYXRfaW5mbyAqKXQxLT5kYXRhOworCXN0cnVjdCBlYnRfbmF0X2luZm8gKm5hdGluZm8yID0gKHN0cnVjdCBlYnRfbmF0X2luZm8gKil0Mi0+ZGF0YTsKKworCXJldHVybiAhbWVtY21wKG5hdGluZm8xLT5tYWMsIG5hdGluZm8yLT5tYWMsIHNpemVvZihuYXRpbmZvMS0+bWFjKSkgJiYKKwkgICBuYXRpbmZvMS0+dGFyZ2V0ID09IG5hdGluZm8yLT50YXJnZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWJ0X3VfdGFyZ2V0IHNuYXRfdGFyZ2V0ID0KK3sKKwkubmFtZQkJPSAic25hdCIsCisJLnNpemUJCT0gc2l6ZW9mKHN0cnVjdCBlYnRfbmF0X2luZm8pLAorCS5oZWxwCQk9IHByaW50X2hlbHBfcywKKwkuaW5pdAkJPSBpbml0X3MsCisJLnBhcnNlCQk9IHBhcnNlX3MsCisJLmZpbmFsX2NoZWNrCT0gZmluYWxfY2hlY2tfcywKKwkucHJpbnQJCT0gcHJpbnRfcywKKwkuY29tcGFyZQk9IGNvbXBhcmUsCisJLmV4dHJhX29wcwk9IG9wdHNfcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgZWJ0X3VfdGFyZ2V0IGRuYXRfdGFyZ2V0ID0KK3sKKwkubmFtZQkJPSAiZG5hdCIsCisJLnNpemUJCT0gc2l6ZW9mKHN0cnVjdCBlYnRfbmF0X2luZm8pLAorCS5oZWxwCQk9IHByaW50X2hlbHBfZCwKKwkuaW5pdAkJPSBpbml0X2QsCisJLnBhcnNlCQk9IHBhcnNlX2QsCisJLmZpbmFsX2NoZWNrCT0gZmluYWxfY2hlY2tfZCwKKwkucHJpbnQJCT0gcHJpbnRfZCwKKwkuY29tcGFyZQk9IGNvbXBhcmUsCisJLmV4dHJhX29wcwk9IG9wdHNfZCwKK307CisKK3N0YXRpYyB2b2lkIF9JTklUKHZvaWQpCit7CisJZWJ0X3JlZ2lzdGVyX3RhcmdldCgmc25hdF90YXJnZXQpOworCWVidF9yZWdpc3Rlcl90YXJnZXQoJmRuYXRfdGFyZ2V0KTsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZWJ0X25mbG9nLmMgYi9leHRlbnNpb25zL2VidF9uZmxvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YzU0N2QKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlbnNpb25zL2VidF9uZmxvZy5jCkBAIC0wLDAgKzEsMTcyIEBACisvKiBlYnRfbmZsb2cKKyAqCisgKiBBdXRob3JzOgorICogUGV0ZXIgV2FyYXNpbiA8cGV0ZXJAZW5kaWFuLmNvbT4KKyAqCisgKiAgRmVicnVhcnksIDIwMDgKKyAqCisgKiBCYXNlZCBvbjoKKyAqICBlYnRfdWxvZy5jLCAoQykgMjAwNCwgQmFydCBEZSBTY2h1eW1lciA8YmRzY2h1eW1AcGFuZG9yYS5iZT4KKyAqICBsaWJ4dF9ORkxPRy5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSAiLi4vaW5jbHVkZS9lYnRhYmxlc191LmgiCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbmZsb2cuaD4KKworZW51bSB7CisJTkZMT0dfR1JPVVAgPSAweDEsCisJTkZMT0dfUFJFRklYID0gMHgyLAorCU5GTE9HX1JBTkdFID0gMHg0LAorCU5GTE9HX1RIUkVTSE9MRCA9IDB4OCwKKwlORkxPR19ORkxPRyA9IDB4MTYsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBuZmxvZ19vcHRzW10gPSB7CisJeyJuZmxvZy1ncm91cCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBORkxPR19HUk9VUH0sCisJeyJuZmxvZy1wcmVmaXgiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgTkZMT0dfUFJFRklYfSwKKwl7Im5mbG9nLXJhbmdlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE5GTE9HX1JBTkdFfSwKKwl7Im5mbG9nLXRocmVzaG9sZCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBORkxPR19USFJFU0hPTER9LAorCXsibmZsb2ciLCBub19hcmd1bWVudCwgTlVMTCwgTkZMT0dfTkZMT0d9LAorCXsubmFtZSA9IE5VTEx9Cit9OworCitzdGF0aWMgdm9pZCBuZmxvZ19oZWxwKCkKK3sKKwlwcmludGYoIm5mbG9nIG9wdGlvbnM6XG4iCisJICAgICAgICItLW5mbG9nICAgICAgICAgICAgICAgOiB1c2UgdGhlIGRlZmF1bHQgbmZsb2cgcGFyYW1ldGVyc1xuIgorCSAgICAgICAiLS1uZmxvZy1wcmVmaXggcHJlZml4IDogUHJlZml4IHN0cmluZyBmb3IgbG9nIG1lc3NhZ2VcbiIKKwkgICAgICAgIi0tbmZsb2ctZ3JvdXAgZ3JvdXAgICA6IE5FVExJTksgZ3JvdXAgdXNlZCBmb3IgbG9nZ2luZ1xuIgorCSAgICAgICAiLS1uZmxvZy1yYW5nZSByYW5nZSAgIDogTnVtYmVyIG9mIGJ5dGUgdG8gY29weVxuIgorCSAgICAgICAiLS1uZmxvZy10aHJlc2hvbGQgICAgIDogTWVzc2FnZSB0aHJlc2hvbGQgb2YiCisJICAgICAgICJpbi1rZXJuZWwgcXVldWVcbiIpOworfQorCitzdGF0aWMgdm9pZCBpbml0KHN0cnVjdCBlYnRfZW50cnlfd2F0Y2hlciAqd2F0Y2hlcikKK3sKKwlzdHJ1Y3QgZWJ0X25mbG9nX2luZm8gKmluZm8gPSAoc3RydWN0IGVidF9uZmxvZ19pbmZvICopd2F0Y2hlci0+ZGF0YTsKKworCWluZm8tPnByZWZpeFswXSA9ICdcMCc7CisJaW5mby0+Z3JvdXAgPSBFQlRfTkZMT0dfREVGQVVMVF9HUk9VUDsKKwlpbmZvLT50aHJlc2hvbGQgPSBFQlRfTkZMT0dfREVGQVVMVF9USFJFU0hPTEQ7Cit9CisKK3N0YXRpYyBpbnQgbmZsb2dfcGFyc2UoaW50IGMsIGNoYXIgKiphcmd2LCBpbnQgYXJnYywKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBlYnRfdV9lbnRyeSAqZW50cnksIHVuc2lnbmVkIGludCAqZmxhZ3MsCisJCSAgICAgICBzdHJ1Y3QgZWJ0X2VudHJ5X3dhdGNoZXIgKip3YXRjaGVyKQoreworCXN0cnVjdCBlYnRfbmZsb2dfaW5mbyAqaW5mbzsKKwl1bnNpZ25lZCBpbnQgaTsKKwljaGFyICplbmQ7CisKKwlpbmZvID0gKHN0cnVjdCBlYnRfbmZsb2dfaW5mbyAqKSgqd2F0Y2hlciktPmRhdGE7CisJc3dpdGNoIChjKSB7CisJY2FzZSBORkxPR19QUkVGSVg6CisJCWlmIChlYnRfY2hlY2tfaW52ZXJzZTIob3B0YXJnKSkKKwkJCWdvdG8gaW52ZXJzZV9pbnZhbGlkOworCQllYnRfY2hlY2tfb3B0aW9uMihmbGFncywgTkZMT0dfUFJFRklYKTsKKwkJaWYgKHN0cmxlbihvcHRhcmcpID4gRUJUX05GTE9HX1BSRUZJWF9TSVpFIC0gMSkKKwkJCWVidF9wcmludF9lcnJvcigiUHJlZml4IHRvbyBsb25nIGZvciBuZmxvZy1wcmVmaXgiKTsKKwkJc3RyY3B5KGluZm8tPnByZWZpeCwgb3B0YXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIE5GTE9HX0dST1VQOgorCQlpZiAoZWJ0X2NoZWNrX2ludmVyc2UyKG9wdGFyZykpCisJCQlnb3RvIGludmVyc2VfaW52YWxpZDsKKwkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIE5GTE9HX0dST1VQKTsKKwkJaSA9IHN0cnRvdWwob3B0YXJnLCAmZW5kLCAxMCk7CisJCWlmICgqZW5kICE9ICdcMCcpCisJCQllYnRfcHJpbnRfZXJyb3IyKCItLW5mbG9nLWdyb3VwIG11c3QgYmUgYSBudW1iZXIhIik7CisJCWluZm8tPmdyb3VwID0gaTsKKwkJYnJlYWs7CisKKwljYXNlIE5GTE9HX1JBTkdFOgorCQlpZiAoZWJ0X2NoZWNrX2ludmVyc2UyKG9wdGFyZykpCisJCQlnb3RvIGludmVyc2VfaW52YWxpZDsKKwkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIE5GTE9HX1JBTkdFKTsKKwkJaSA9IHN0cnRvdWwob3B0YXJnLCAmZW5kLCAxMCk7CisJCWlmICgqZW5kICE9ICdcMCcpCisJCQllYnRfcHJpbnRfZXJyb3IyKCItLW5mbG9nLXJhbmdlIG11c3QgYmUgYSBudW1iZXIhIik7CisJCWluZm8tPmxlbiA9IGk7CisJCWJyZWFrOworCisJY2FzZSBORkxPR19USFJFU0hPTEQ6CisJCWlmIChlYnRfY2hlY2tfaW52ZXJzZTIob3B0YXJnKSkKKwkJCWdvdG8gaW52ZXJzZV9pbnZhbGlkOworCQllYnRfY2hlY2tfb3B0aW9uMihmbGFncywgTkZMT0dfVEhSRVNIT0xEKTsKKwkJaSA9IHN0cnRvdWwob3B0YXJnLCAmZW5kLCAxMCk7CisJCWlmICgqZW5kICE9ICdcMCcpCisJCQllYnRfcHJpbnRfZXJyb3IyKCItLW5mbG9nLXRocmVzaG9sZCBtdXN0IGJlIGEgbnVtYmVyISIpOworCQlpbmZvLT50aHJlc2hvbGQgPSBpOworCQlicmVhazsKKwljYXNlIE5GTE9HX05GTE9HOgorCQlpZiAoZWJ0X2NoZWNrX2ludmVyc2Uob3B0YXJnKSkKKwkJCWdvdG8gaW52ZXJzZV9pbnZhbGlkOworCQllYnRfY2hlY2tfb3B0aW9uMihmbGFncywgTkZMT0dfTkZMT0cpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKKworIGludmVyc2VfaW52YWxpZDoKKwllYnRfcHJpbnRfZXJyb3IoIlRoZSB1c2Ugb2YgJyEnIG1ha2VzIG5vIHNlbnNlIGZvciB0aGUgbmZsb2cgd2F0Y2hlciIpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBuZmxvZ19maW5hbF9jaGVjayhjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorCQkJICAgICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeV93YXRjaGVyICp3YXRjaGVyLAorCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IGhvb2ttYXNrLAorCQkJICAgICAgdW5zaWduZWQgaW50IHRpbWUpCit7Cit9CisKK3N0YXRpYyB2b2lkIG5mbG9nX3ByaW50KGNvbnN0IHN0cnVjdCBlYnRfdV9lbnRyeSAqZW50cnksCisJCQljb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X3dhdGNoZXIgKndhdGNoZXIpCit7CisJc3RydWN0IGVidF9uZmxvZ19pbmZvICppbmZvID0gKHN0cnVjdCBlYnRfbmZsb2dfaW5mbyAqKXdhdGNoZXItPmRhdGE7CisKKwlpZiAoaW5mby0+cHJlZml4WzBdICE9ICdcMCcpCisJCXByaW50ZigiLS1uZmxvZy1wcmVmaXggXCIlc1wiIiwgaW5mby0+cHJlZml4KTsKKwlpZiAoaW5mby0+Z3JvdXApCisJCXByaW50ZigiLS1uZmxvZy1ncm91cCAlZCAiLCBpbmZvLT5ncm91cCk7CisJaWYgKGluZm8tPmxlbikKKwkJcHJpbnRmKCItLW5mbG9nLXJhbmdlICVkIiwgaW5mby0+bGVuKTsKKwlpZiAoaW5mby0+dGhyZXNob2xkICE9IEVCVF9ORkxPR19ERUZBVUxUX1RIUkVTSE9MRCkKKwkJcHJpbnRmKCIgLS1uZmxvZy10aHJlc2hvbGQgJWQgIiwgaW5mby0+dGhyZXNob2xkKTsKK30KKworc3RhdGljIGludCBuZmxvZ19jb21wYXJlKGNvbnN0IHN0cnVjdCBlYnRfZW50cnlfd2F0Y2hlciAqdzEsCisJCQkgY29uc3Qgc3RydWN0IGVidF9lbnRyeV93YXRjaGVyICp3MikKK3sKKwlzdHJ1Y3QgZWJ0X25mbG9nX2luZm8gKmluZm8xID0gKHN0cnVjdCBlYnRfbmZsb2dfaW5mbyAqKXcxLT5kYXRhOworCXN0cnVjdCBlYnRfbmZsb2dfaW5mbyAqaW5mbzIgPSAoc3RydWN0IGVidF9uZmxvZ19pbmZvICopdzItPmRhdGE7CisKKwlpZiAoaW5mbzEtPmdyb3VwICE9IGluZm8yLT5ncm91cCB8fAorCSAgICBpbmZvMS0+bGVuICE9IGluZm8yLT5sZW4gfHwKKwkgICAgaW5mbzEtPnRocmVzaG9sZCAhPSBpbmZvMi0+dGhyZXNob2xkIHx8CisJICAgIHN0cmNtcChpbmZvMS0+cHJlZml4LCBpbmZvMi0+cHJlZml4KSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWJ0X3Vfd2F0Y2hlciBuZmxvZ193YXRjaGVyID0geworCS5uYW1lID0gIm5mbG9nIiwKKwkuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZWJ0X25mbG9nX2luZm8pLAorCS5oZWxwID0gbmZsb2dfaGVscCwKKwkuaW5pdCA9IGluaXQsCisJLnBhcnNlID0gbmZsb2dfcGFyc2UsCisJLmZpbmFsX2NoZWNrID0gbmZsb2dfZmluYWxfY2hlY2ssCisJLnByaW50ID0gbmZsb2dfcHJpbnQsCisJLmNvbXBhcmUgPSBuZmxvZ19jb21wYXJlLAorCS5leHRyYV9vcHMgPSBuZmxvZ19vcHRzLAorfTsKKworc3RhdGljIHZvaWQgX0lOSVQodm9pZCkKK3sKKwllYnRfcmVnaXN0ZXJfd2F0Y2hlcigmbmZsb2dfd2F0Y2hlcik7Cit9CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2VidF9wa3R0eXBlLmMgYi9leHRlbnNpb25zL2VidF9wa3R0eXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY1NzhmYwotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZWJ0X3BrdHR5cGUuYwpAQCAtMCwwICsxLDEzMSBAQAorLyogZWJ0X3BrdHR5cGUKKyAqCisgKiBBdXRob3JzOgorICogQmFydCBEZSBTY2h1eW1lciA8YmRzY2h1eW1AcGFuZG9yYS5iZT4KKyAqCisgKiBBcHJpbCwgMjAwMworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSAiLi4vaW5jbHVkZS9lYnRhYmxlc191LmgiCisjaW5jbHVkZSA8bGludXgvaWZfcGFja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfcGt0dHlwZS5oPgorCitjaGFyICpjbGFzc2VzW10gPQoreworCSJob3N0IiwKKwkiYnJvYWRjYXN0IiwKKwkibXVsdGljYXN0IiwKKwkib3RoZXJob3N0IiwKKwkib3V0Z29pbmciLAorCSJsb29wYmFjayIsCisJImZhc3Ryb3V0ZSIsCisJIlwwIgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gb3B0c1tdID0KK3sKKwl7ICJwa3R0eXBlLXR5cGUiICAgICAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnMScgfSwKKwl7IDAgfQorfTsKKworc3RhdGljIHZvaWQgcHJpbnRfaGVscCgpCit7CisJcHJpbnRmKAorInBrdHR5cGUgb3B0aW9uczpcbiIKKyItLXBrdHR5cGUtdHlwZSAgICBbIV0gdHlwZTogY2xhc3MgdGhlIHBhY2tldCBiZWxvbmdzIHRvXG4iCisiUG9zc2libGUgdmFsdWVzOiBicm9hZGNhc3QsIG11bHRpY2FzdCwgaG9zdCwgb3RoZXJob3N0LCBvciBhbnkgb3RoZXIgYnl0ZSB2YWx1ZSAod2hpY2ggd291bGQgYmUgcHJldHR5IHVzZWxlc3MpLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGluaXQoc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbWF0Y2gpCit7CisJc3RydWN0IGVidF9wa3R0eXBlX2luZm8gKnB0ID0gKHN0cnVjdCBlYnRfcGt0dHlwZV9pbmZvICopbWF0Y2gtPmRhdGE7CisKKwlwdC0+aW52ZXJ0ID0gMDsKK30KKworc3RhdGljIGludCBwYXJzZShpbnQgYywgY2hhciAqKmFyZ3YsIGludCBhcmdjLCBjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorICAgdW5zaWduZWQgaW50ICpmbGFncywgc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqKm1hdGNoKQoreworCXN0cnVjdCBlYnRfcGt0dHlwZV9pbmZvICpwdGluZm8gPSAoc3RydWN0IGVidF9wa3R0eXBlX2luZm8gKikoKm1hdGNoKS0+ZGF0YTsKKwljaGFyICplbmQ7CisJbG9uZyBpbnQgaTsKKworCXN3aXRjaCAoYykgeworCWNhc2UgJzEnOgorCQllYnRfY2hlY2tfb3B0aW9uMihmbGFncywgMSk7CisJCWlmIChlYnRfY2hlY2tfaW52ZXJzZTIob3B0YXJnKSkKKwkJCXB0aW5mby0+aW52ZXJ0ID0gMTsKKwkJaSA9IHN0cnRvbChvcHRhcmcsICZlbmQsIDE2KTsKKwkJaWYgKCplbmQgIT0gJ1wwJykgeworCQkJaW50IGogPSAwOworCQkJaSA9IC0xOworCQkJd2hpbGUgKGNsYXNzZXNbal1bMF0pCisJCQkJaWYgKCFzdHJjYXNlY21wKG9wdGFyZywgY2xhc3Nlc1tqKytdKSkgeworCQkJCQlpID0gaiAtIDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJfQorCQlpZiAoaSA8IDAgfHwgaSA+IDI1NSkKKwkJCWVidF9wcmludF9lcnJvcjIoIlByb2JsZW0gd2l0aCBzcGVjaWZpZWQgcGt0dHlwZSBjbGFzcyIpOworCQlwdGluZm8tPnBrdF90eXBlID0gKHVpbnQ4X3QpaTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBmaW5hbF9jaGVjayhjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbWF0Y2gsIGNvbnN0IGNoYXIgKm5hbWUsCisgICB1bnNpZ25lZCBpbnQgaG9va21hc2ssIHVuc2lnbmVkIGludCB0aW1lKQoreworfQorCitzdGF0aWMgdm9pZCBwcmludChjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbWF0Y2gpCit7CisJc3RydWN0IGVidF9wa3R0eXBlX2luZm8gKnB0ID0gKHN0cnVjdCBlYnRfcGt0dHlwZV9pbmZvICopbWF0Y2gtPmRhdGE7CisJaW50IGkgPSAwOworCisJcHJpbnRmKCItLXBrdHR5cGUtdHlwZSAlcyIsIHB0LT5pbnZlcnQgPyAiISAiIDogIiIpOworCXdoaWxlIChjbGFzc2VzW2krK11bMF0pOworCWlmIChwdC0+cGt0X3R5cGUgPCBpIC0gMSkKKwkJcHJpbnRmKCIlcyAiLCBjbGFzc2VzW3B0LT5wa3RfdHlwZV0pOworCWVsc2UKKwkJcHJpbnRmKCIlZCAiLCBwdC0+cGt0X3R5cGUpOworfQorCitzdGF0aWMgaW50IGNvbXBhcmUoY29uc3Qgc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbTEsCisgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICptMikKK3sKKwlzdHJ1Y3QgZWJ0X3BrdHR5cGVfaW5mbyAqcHQxID0gKHN0cnVjdCBlYnRfcGt0dHlwZV9pbmZvICopbTEtPmRhdGE7CisJc3RydWN0IGVidF9wa3R0eXBlX2luZm8gKnB0MiA9IChzdHJ1Y3QgZWJ0X3BrdHR5cGVfaW5mbyAqKW0yLT5kYXRhOworCisJaWYgKHB0MS0+aW52ZXJ0ICE9IHB0Mi0+aW52ZXJ0IHx8CisJICAgIHB0MS0+cGt0X3R5cGUgIT0gcHQyLT5wa3RfdHlwZSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWJ0X3VfbWF0Y2ggcGt0dHlwZV9tYXRjaCA9Cit7CisJLm5hbWUJCT0gInBrdHR5cGUiLAorCS5zaXplCQk9IHNpemVvZihzdHJ1Y3QgZWJ0X3BrdHR5cGVfaW5mbyksCisJLmhlbHAJCT0gcHJpbnRfaGVscCwKKwkuaW5pdAkJPSBpbml0LAorCS5wYXJzZQkJPSBwYXJzZSwKKwkuZmluYWxfY2hlY2sJPSBmaW5hbF9jaGVjaywKKwkucHJpbnQJCT0gcHJpbnQsCisJLmNvbXBhcmUJPSBjb21wYXJlLAorCS5leHRyYV9vcHMJPSBvcHRzLAorfTsKKworc3RhdGljIHZvaWQgX0lOSVQodm9pZCkKK3sKKwllYnRfcmVnaXN0ZXJfbWF0Y2goJnBrdHR5cGVfbWF0Y2gpOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9lYnRfcmVkaXJlY3QuYyBiL2V4dGVuc2lvbnMvZWJ0X3JlZGlyZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlmZTgxOAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZWJ0X3JlZGlyZWN0LmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qIGVidF9yZWRpcmVjdAorICoKKyAqIEF1dGhvcnM6CisgKiBCYXJ0IERlIFNjaHV5bWVyIDxiZHNjaHV5bUBwYW5kb3JhLmJlPgorICoKKyAqIEFwcmlsLCAyMDAyCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSAiLi4vaW5jbHVkZS9lYnRhYmxlc191LmgiCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfcmVkaXJlY3QuaD4KKworI2RlZmluZSBSRURJUkVDVF9UQVJHRVQgJzEnCitzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBvcHRzW10gPQoreworCXsgInJlZGlyZWN0LXRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBSRURJUkVDVF9UQVJHRVQgfSwKKwl7IDAgfQorfTsKKworc3RhdGljIHZvaWQgcHJpbnRfaGVscCgpCit7CisJcHJpbnRmKAorCSJyZWRpcmVjdCBvcHRpb246XG4iCisJIiAtLXJlZGlyZWN0LXRhcmdldCB0YXJnZXQgICA6IEFDQ0VQVCwgRFJPUCwgUkVUVVJOIG9yIENPTlRJTlVFXG4iKTsKK30KKworc3RhdGljIHZvaWQgaW5pdChzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdGFyZ2V0KQoreworCXN0cnVjdCBlYnRfcmVkaXJlY3RfaW5mbyAqcmVkaXJlY3RpbmZvID0KKwkgICAoc3RydWN0IGVidF9yZWRpcmVjdF9pbmZvICopdGFyZ2V0LT5kYXRhOworCisJcmVkaXJlY3RpbmZvLT50YXJnZXQgPSBFQlRfQUNDRVBUOworCXJldHVybjsKK30KKworI2RlZmluZSBPUFRfUkVESVJFQ1RfVEFSR0VUICAweDAxCitzdGF0aWMgaW50IHBhcnNlKGludCBjLCBjaGFyICoqYXJndiwgaW50IGFyZ2MsCisgICBjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LCB1bnNpZ25lZCBpbnQgKmZsYWdzLAorICAgc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKip0YXJnZXQpCit7CisJc3RydWN0IGVidF9yZWRpcmVjdF9pbmZvICpyZWRpcmVjdGluZm8gPQorCSAgIChzdHJ1Y3QgZWJ0X3JlZGlyZWN0X2luZm8gKikoKnRhcmdldCktPmRhdGE7CisKKwlzd2l0Y2ggKGMpIHsKKwljYXNlIFJFRElSRUNUX1RBUkdFVDoKKwkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIE9QVF9SRURJUkVDVF9UQVJHRVQpOworCQlpZiAoRklMTF9UQVJHRVQob3B0YXJnLCByZWRpcmVjdGluZm8tPnRhcmdldCkpCisJCQllYnRfcHJpbnRfZXJyb3IyKCJJbGxlZ2FsIC0tcmVkaXJlY3QtdGFyZ2V0IHRhcmdldCIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmFsX2NoZWNrKGNvbnN0IHN0cnVjdCBlYnRfdV9lbnRyeSAqZW50cnksCisgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdGFyZ2V0LCBjb25zdCBjaGFyICpuYW1lLAorICAgdW5zaWduZWQgaW50IGhvb2ttYXNrLCB1bnNpZ25lZCBpbnQgdGltZSkKK3sKKwlzdHJ1Y3QgZWJ0X3JlZGlyZWN0X2luZm8gKnJlZGlyZWN0aW5mbyA9CisJICAgKHN0cnVjdCBlYnRfcmVkaXJlY3RfaW5mbyAqKXRhcmdldC0+ZGF0YTsKKworCWlmIChCQVNFX0NIQUlOICYmIHJlZGlyZWN0aW5mby0+dGFyZ2V0ID09IEVCVF9SRVRVUk4pIHsKKwkJZWJ0X3ByaW50X2Vycm9yKCItLXJlZGlyZWN0LXRhcmdldCBSRVRVUk4gbm90IGFsbG93ZWQgb24gYmFzZSBjaGFpbiIpOworCQlyZXR1cm47CisJfQorCUNMRUFSX0JBU0VfQ0hBSU5fQklUOworCWlmICggKChob29rbWFzayAmIH4oMSA8PCBORl9CUl9QUkVfUk9VVElORykpIHx8IHN0cmNtcChuYW1lLCAibmF0IikpICYmCisJICAgKChob29rbWFzayAmIH4oMSA8PCBORl9CUl9CUk9VVElORykpIHx8IHN0cmNtcChuYW1lLCAiYnJvdXRlIikpICkKKwkJZWJ0X3ByaW50X2Vycm9yKCJXcm9uZyBjaGFpbiBmb3IgcmVkaXJlY3QiKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnQoY29uc3Qgc3RydWN0IGVidF91X2VudHJ5ICplbnRyeSwKKyAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICp0YXJnZXQpCit7CisJc3RydWN0IGVidF9yZWRpcmVjdF9pbmZvICpyZWRpcmVjdGluZm8gPQorCSAgIChzdHJ1Y3QgZWJ0X3JlZGlyZWN0X2luZm8gKil0YXJnZXQtPmRhdGE7CisKKwlpZiAocmVkaXJlY3RpbmZvLT50YXJnZXQgPT0gRUJUX0FDQ0VQVCkKKwkJcmV0dXJuOworCXByaW50ZigiIC0tcmVkaXJlY3QtdGFyZ2V0ICVzIiwgVEFSR0VUX05BTUUocmVkaXJlY3RpbmZvLT50YXJnZXQpKTsKK30KKworc3RhdGljIGludCBjb21wYXJlKGNvbnN0IHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICp0MSwKKyAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICp0MikKK3sKKwlzdHJ1Y3QgZWJ0X3JlZGlyZWN0X2luZm8gKnJlZGlyZWN0aW5mbzEgPQorCSAgIChzdHJ1Y3QgZWJ0X3JlZGlyZWN0X2luZm8gKil0MS0+ZGF0YTsKKwlzdHJ1Y3QgZWJ0X3JlZGlyZWN0X2luZm8gKnJlZGlyZWN0aW5mbzIgPQorCSAgIChzdHJ1Y3QgZWJ0X3JlZGlyZWN0X2luZm8gKil0Mi0+ZGF0YTsKKworCXJldHVybiByZWRpcmVjdGluZm8xLT50YXJnZXQgPT0gcmVkaXJlY3RpbmZvMi0+dGFyZ2V0OworfQorCitzdGF0aWMgc3RydWN0IGVidF91X3RhcmdldCByZWRpcmVjdF90YXJnZXQgPQoreworCS5uYW1lCQk9ICJyZWRpcmVjdCIsCisJLnNpemUJCT0gc2l6ZW9mKHN0cnVjdCBlYnRfcmVkaXJlY3RfaW5mbyksCisJLmhlbHAJCT0gcHJpbnRfaGVscCwKKwkuaW5pdAkJPSBpbml0LAorCS5wYXJzZQkJPSBwYXJzZSwKKwkuZmluYWxfY2hlY2sJPSBmaW5hbF9jaGVjaywKKwkucHJpbnQJCT0gcHJpbnQsCisJLmNvbXBhcmUJPSBjb21wYXJlLAorCS5leHRyYV9vcHMJPSBvcHRzLAorfTsKKworc3RhdGljIHZvaWQgX0lOSVQodm9pZCkKK3sKKwllYnRfcmVnaXN0ZXJfdGFyZ2V0KCZyZWRpcmVjdF90YXJnZXQpOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9lYnRfc3RhbmRhcmQuYyBiL2V4dGVuc2lvbnMvZWJ0X3N0YW5kYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNjMzMwOAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZWJ0X3N0YW5kYXJkLmMKQEAgLTAsMCArMSw5MCBAQAorLyogZWJ0X3N0YW5kYXJkCisgKgorICogQXV0aG9yczoKKyAqIEJhcnQgRGUgU2NodXltZXIgPGJkc2NodXltQHBhbmRvcmEuYmU+CisgKgorICogQXByaWwsIDIwMDIKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlICIuLi9pbmNsdWRlL2VidGFibGVzX3UuaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gb3B0c1tdID0KK3sKKwl7MH0KK307CisKK3N0YXRpYyB2b2lkIHByaW50X2hlbHAoKQoreworCXByaW50ZigiU3RhbmRhcmQgdGFyZ2V0czogRFJPUCwgQUNDRVBULCBSRVRVUk4gb3IgQ09OVElOVUU7XG4iCisJICAgICAgICJUaGUgdGFyZ2V0IGNhbiBhbHNvIGJlIGEgdXNlciBkZWZpbmVkIGNoYWluLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGluaXQoc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKnQpCit7CisJKChzdHJ1Y3QgZWJ0X3N0YW5kYXJkX3RhcmdldCAqKXQpLT52ZXJkaWN0ID0gRUJUX0NPTlRJTlVFOworfQorCitzdGF0aWMgaW50IHBhcnNlKGludCBjLCBjaGFyICoqYXJndiwgaW50IGFyZ2MsIGNvbnN0IHN0cnVjdCBlYnRfdV9lbnRyeSAqZW50cnksCisgICB1bnNpZ25lZCBpbnQgKmZsYWdzLCBzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqKnRhcmdldCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZmluYWxfY2hlY2soY29uc3Qgc3RydWN0IGVidF91X2VudHJ5ICplbnRyeSwKKyAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICp0YXJnZXQsIGNvbnN0IGNoYXIgKm5hbWUsCisgICB1bnNpZ25lZCBpbnQgaG9va21hc2ssIHVuc2lnbmVkIGludCB0aW1lKQoreworfQorCitzdGF0aWMgdm9pZCBwcmludChjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKnRhcmdldCkKK3sKKwlpbnQgdmVyZGljdCA9ICgoc3RydWN0IGVidF9zdGFuZGFyZF90YXJnZXQgKil0YXJnZXQpLT52ZXJkaWN0OworCisJaWYgKHZlcmRpY3QgPj0gMCkgeworCQlzdHJ1Y3QgZWJ0X3VfZW50cmllcyAqZW50cmllczsKKworCQllbnRyaWVzID0gZW50cnktPnJlcGxhY2UtPmNoYWluc1t2ZXJkaWN0ICsgTkZfQlJfTlVNSE9PS1NdOworCQlwcmludGYoIiVzIiwgZW50cmllcy0+bmFtZSk7CisJCXJldHVybjsKKwl9CisJaWYgKHZlcmRpY3QgPT0gRUJUX0NPTlRJTlVFKQorCQlwcmludGYoIkNPTlRJTlVFICIpOworCWVsc2UgaWYgKHZlcmRpY3QgPT0gRUJUX0FDQ0VQVCkKKwkJcHJpbnRmKCJBQ0NFUFQgIik7CisJZWxzZSBpZiAodmVyZGljdCA9PSBFQlRfRFJPUCkKKwkJcHJpbnRmKCJEUk9QICIpOworCWVsc2UgaWYgKHZlcmRpY3QgPT0gRUJUX1JFVFVSTikKKwkJcHJpbnRmKCJSRVRVUk4gIik7CisJZWxzZQorCQllYnRfcHJpbnRfYnVnKCJCYWQgc3RhbmRhcmQgdGFyZ2V0Iik7Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZShjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdDEsCisgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdDIpCit7CisJcmV0dXJuICgoc3RydWN0IGVidF9zdGFuZGFyZF90YXJnZXQgKil0MSktPnZlcmRpY3QgPT0KKwkgICAoKHN0cnVjdCBlYnRfc3RhbmRhcmRfdGFyZ2V0ICopdDIpLT52ZXJkaWN0OworfQorCitzdGF0aWMgc3RydWN0IGVidF91X3RhcmdldCBzdGFuZGFyZCA9Cit7CisJLm5hbWUJCT0gInN0YW5kYXJkIiwKKwkuc2l6ZQkJPSBzaXplb2Yoc3RydWN0IGVidF9zdGFuZGFyZF90YXJnZXQpIC0KKwkJCSAgc2l6ZW9mKHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0KSwKKwkuaGVscAkJPSBwcmludF9oZWxwLAorCS5pbml0CQk9IGluaXQsCisJLnBhcnNlCQk9IHBhcnNlLAorCS5maW5hbF9jaGVjawk9IGZpbmFsX2NoZWNrLAorCS5wcmludAkJPSBwcmludCwKKwkuY29tcGFyZQk9IGNvbXBhcmUsCisJLmV4dHJhX29wcwk9IG9wdHMsCit9OworCitzdGF0aWMgdm9pZCBfSU5JVCh2b2lkKQoreworCWVidF9yZWdpc3Rlcl90YXJnZXQoJnN0YW5kYXJkKTsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZWJ0X3N0cC5jIGIvZXh0ZW5zaW9ucy9lYnRfc3RwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzExYmM2MwotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZWJ0X3N0cC5jCkBAIC0wLDAgKzEsMzQzIEBACisvKiBlYnRfc3RwCisgKgorICogQXV0aG9yczoKKyAqIEJhcnQgRGUgU2NodXltZXIgPGJkc2NodXltQHBhbmRvcmEuYmU+CisgKgorICogSnVseSwgMjAwMworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZWJ0YWJsZXNfdS5oIgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3N0cC5oPgorCisjZGVmaW5lIFNUUF9UWVBFCSdhJworI2RlZmluZSBTVFBfRkxBR1MJJ2InCisjZGVmaW5lIFNUUF9ST09UUFJJTwknYycKKyNkZWZpbmUgU1RQX1JPT1RBRERSCSdkJworI2RlZmluZSBTVFBfUk9PVENPU1QJJ2UnCisjZGVmaW5lIFNUUF9TRU5ERVJQUklPCSdmJworI2RlZmluZSBTVFBfU0VOREVSQUREUgknZycKKyNkZWZpbmUgU1RQX1BPUlQJJ2gnCisjZGVmaW5lIFNUUF9NU0dBR0UJJ2knCisjZGVmaW5lIFNUUF9NQVhBR0UJJ2onCisjZGVmaW5lIFNUUF9IRUxMT1RJTUUJJ2snCisjZGVmaW5lIFNUUF9GV0RECSdsJworI2RlZmluZSBTVFBfTlVNT1BTIDEyCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIG9wdHNbXSA9Cit7CisJeyAic3RwLXR5cGUiICAgICAgICAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgU1RQX1RZUEV9LAorCXsgInN0cC1mbGFncyIgICAgICAgICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIFNUUF9GTEFHU30sCisJeyAic3RwLXJvb3QtcHJpbyIgICAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgU1RQX1JPT1RQUklPfSwKKwl7ICJzdHAtcm9vdC1hZGRyIiAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBTVFBfUk9PVEFERFJ9LAorCXsgInN0cC1yb290LWNvc3QiICAgICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIFNUUF9ST09UQ09TVH0sCisJeyAic3RwLXNlbmRlci1wcmlvIiAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgU1RQX1NFTkRFUlBSSU99LAorCXsgInN0cC1zZW5kZXItYWRkciIgICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIFNUUF9TRU5ERVJBRERSfSwKKwl7ICJzdHAtcG9ydCIgICAgICAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBTVFBfUE9SVH0sCisJeyAic3RwLW1zZy1hZ2UiICAgICAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgU1RQX01TR0FHRX0sCisJeyAic3RwLW1heC1hZ2UiICAgICAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgU1RQX01BWEFHRX0sCisJeyAic3RwLWhlbGxvLXRpbWUiICAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgU1RQX0hFTExPVElNRX0sCisJeyAic3RwLWZvcndhcmQtZGVsYXkiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgU1RQX0ZXRER9LAorCXsgMCB9Cit9OworCisjZGVmaW5lIEJQRFVfVFlQRV9DT05GSUcgMAorI2RlZmluZSBCUERVX1RZUEVfVENOIDB4ODAKKyNkZWZpbmUgQlBEVV9UWVBFX0NPTkZJR19TVFJJTkcgImNvbmZpZyIKKyNkZWZpbmUgQlBEVV9UWVBFX1RDTl9TVFJJTkcgInRjbiIKKworI2RlZmluZSBGTEFHX1RDIDB4MDEKKyNkZWZpbmUgRkxBR19UQ19BQ0sgMHg4MAorI2RlZmluZSBGTEFHX1RDX1NUUklORyAidG9wb2xvZ3ktY2hhbmdlIgorI2RlZmluZSBGTEFHX1RDX0FDS19TVFJJTkcgInRvcG9sb2d5LWNoYW5nZS1hY2siCisKK3N0YXRpYyB2b2lkIHByaW50X2hlbHAoKQoreworCXByaW50ZigKKyJzdHAgb3B0aW9uczpcbiIKKyItLXN0cC10eXBlIHR5cGUgICAgICAgICAgICAgICAgICA6IEJQRFUgdHlwZVxuIgorIi0tc3RwLWZsYWdzIGZsYWcgICAgICAgICAgICAgICAgIDogY29udHJvbCBmbGFnXG4iCisiLS1zdHAtcm9vdC1wcmlvIHByaW9bOnByaW9dICAgICAgOiByb290IHByaW9yaXR5ICgxNi1iaXQpIHJhbmdlXG4iCisiLS1zdHAtcm9vdC1hZGRyIGFkZHJlc3NbL21hc2tdICAgOiBNQUMgYWRkcmVzcyBvZiByb290XG4iCisiLS1zdHAtcm9vdC1jb3N0IGNvc3RbOmNvc3RdICAgICAgOiByb290IGNvc3QgKDMyLWJpdCkgcmFuZ2VcbiIKKyItLXN0cC1zZW5kZXItcHJpbyBwcmlvWzpwcmlvXSAgICA6IHNlbmRlciBwcmlvcml0eSAoMTYtYml0KSByYW5nZVxuIgorIi0tc3RwLXNlbmRlci1hZGRyIGFkZHJlc3NbL21hc2tdIDogTUFDIGFkZHJlc3Mgb2Ygc2VuZGVyXG4iCisiLS1zdHAtcG9ydCBwb3J0Wzpwb3J0XSAgICAgICAgICAgOiBwb3J0IGlkICgxNi1iaXQpIHJhbmdlXG4iCisiLS1zdHAtbXNnLWFnZSBhZ2VbOmFnZV0gICAgICAgICAgOiBtZXNzYWdlIGFnZSB0aW1lciAoMTYtYml0KSByYW5nZVxuIgorIi0tc3RwLW1heC1hZ2UgYWdlWzphZ2VdICAgICAgICAgIDogbWF4aW11bSBhZ2UgdGltZXIgKDE2LWJpdCkgcmFuZ2VcbiIKKyItLXN0cC1oZWxsby10aW1lIHRpbWVbOnRpbWVdICAgICA6IGhlbGxvIHRpbWUgdGltZXIgKDE2LWJpdCkgcmFuZ2VcbiIKKyItLXN0cC1mb3J3YXJkLWRlbGF5IGRlbGF5WzpkZWxheV06IGZvcndhcmQgZGVsYXkgdGltZXIgKDE2LWJpdCkgcmFuZ2VcbiIKKyIgUmVjb2duaXplZCBCUERVIHR5cGUgc3RyaW5nczpcbiIKKyIgICBcImNvbmZpZ1wiOiBjb25maWd1cmF0aW9uIEJQRFUgKD0wKVxuIgorIiAgIFwidGNuXCIgICA6IHRvcG9sb2d5IGNoYW5nZSBub3RpZmljYXRpb24gQlBEVSAoPTB4ODApXG4iCisiIFJlY29nbml6ZWQgY29udHJvbCBmbGFnIHN0cmluZ3M6XG4iCisiICAgXCJ0b3BvbG9neS1jaGFuZ2VcIiAgICA6IHRvcG9sb2d5IGNoYW5nZSBmbGFnICgweDAxKVxuIgorIiAgIFwidG9wb2xvZ3ktY2hhbmdlLWFja1wiOiB0b3BvbG9neSBjaGFuZ2UgYWNrbm93bGVkZ2VtZW50IGZsYWcgKDB4ODApIik7Cit9CisKK3N0YXRpYyB2b2lkIGluaXQoc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbWF0Y2gpCit7CisJc3RydWN0IGVidF9zdHBfaW5mbyAqc3RwaW5mbyA9IChzdHJ1Y3QgZWJ0X3N0cF9pbmZvICopbWF0Y2gtPmRhdGE7CisKKwlzdHBpbmZvLT5pbnZmbGFncyA9IDA7CisJc3RwaW5mby0+Yml0bWFzayA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfcmFuZ2UoY29uc3QgY2hhciAqcG9ydHN0cmluZywgdm9pZCAqbG93ZXIsIHZvaWQgKnVwcGVyLAorICAgaW50IGJpdHMsIHVpbnQzMl90IG1pbiwgdWludDMyX3QgbWF4KQoreworCWNoYXIgKmJ1ZmZlcjsKKwljaGFyICpjcCwgKmVuZDsKKwl1aW50MzJfdCBsb3dfbnIsIHVwcF9ucjsKKwlpbnQgcmV0ID0gMDsKKworCWJ1ZmZlciA9IHN0cmR1cChwb3J0c3RyaW5nKTsKKwlpZiAoKGNwID0gc3RyY2hyKGJ1ZmZlciwgJzonKSkgPT0gTlVMTCkgeworCQlsb3dfbnIgPSBzdHJ0b3VsKGJ1ZmZlciwgJmVuZCwgMTApOworCQlpZiAoKmVuZCB8fCBsb3dfbnIgPCBtaW4gfHwgbG93X25yID4gbWF4KSB7CisJCQlyZXQgPSAtMTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChiaXRzID09IDIpIHsKKwkJCSoodWludDE2X3QgKilsb3dlciA9ICBsb3dfbnI7CisJCQkqKHVpbnQxNl90ICopdXBwZXIgPSAgbG93X25yOworCQl9IGVsc2UgeworCQkJKih1aW50MzJfdCAqKWxvd2VyID0gIGxvd19ucjsKKwkJCSoodWludDMyX3QgKil1cHBlciA9ICBsb3dfbnI7CisJCX0KKwl9IGVsc2UgeworCQkqY3AgPSAnXDAnOworCQljcCsrOworCQlpZiAoISpidWZmZXIpCisJCQlsb3dfbnIgPSBtaW47CisJCWVsc2UgeworCQkJbG93X25yID0gc3RydG91bChidWZmZXIsICZlbmQsIDEwKTsKKwkJCWlmICgqZW5kIHx8IGxvd19uciA8IG1pbikgeworCQkJCXJldCA9IC0xOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJCWlmICghKmNwKQorCQkJdXBwX25yID0gbWF4OworCQllbHNlIHsKKwkJCXVwcF9uciA9IHN0cnRvdWwoY3AsICZlbmQsIDEwKTsKKwkJCWlmICgqZW5kIHx8IHVwcF9uciA+IG1heCkgeworCQkJCXJldCA9IC0xOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJCWlmICh1cHBfbnIgPCBsb3dfbnIpIHsKKwkJCXJldCA9IC0xOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKGJpdHMgPT0gMikgeworCQkJKih1aW50MTZfdCAqKWxvd2VyID0gbG93X25yOworCQkJKih1aW50MTZfdCAqKXVwcGVyID0gdXBwX25yOworCQl9IGVsc2UgeworCQkJKih1aW50MzJfdCAqKWxvd2VyID0gbG93X25yOworCQkJKih1aW50MzJfdCAqKXVwcGVyID0gdXBwX25yOworCQl9CisJfQorb3V0OgorCWZyZWUoYnVmZmVyKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBwcmludF9yYW5nZSh1bnNpZ25lZCBpbnQgbCwgdW5zaWduZWQgaW50IHUpCit7CisJaWYgKGwgPT0gdSkKKwkJcHJpbnRmKCIldSAiLCBsKTsKKwllbHNlCisJCXByaW50ZigiJXU6JXUgIiwgbCwgdSk7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2UoaW50IGMsIGNoYXIgKiphcmd2LCBpbnQgYXJnYywgY29uc3Qgc3RydWN0IGVidF91X2VudHJ5ICplbnRyeSwKKyAgIHVuc2lnbmVkIGludCAqZmxhZ3MsIHN0cnVjdCBlYnRfZW50cnlfbWF0Y2ggKiptYXRjaCkKK3sKKwlzdHJ1Y3QgZWJ0X3N0cF9pbmZvICpzdHBpbmZvID0gKHN0cnVjdCBlYnRfc3RwX2luZm8gKikoKm1hdGNoKS0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgZmxhZzsKKwlsb25nIGludCBpOworCWNoYXIgKmVuZCA9IE5VTEw7CisKKwlpZiAoYyA8ICdhJyB8fCBjID4gKCdhJyArIFNUUF9OVU1PUFMgLSAxKSkKKwkJcmV0dXJuIDA7CisJZmxhZyA9IDEgPDwgKGMgLSAnYScpOworCWVidF9jaGVja19vcHRpb24yKGZsYWdzLCBmbGFnKTsKKwlpZiAoZWJ0X2NoZWNrX2ludmVyc2UyKG9wdGFyZykpCisJCXN0cGluZm8tPmludmZsYWdzIHw9IGZsYWc7CisJc3RwaW5mby0+Yml0bWFzayB8PSBmbGFnOworCXN3aXRjaCAoZmxhZykgeworCWNhc2UgRUJUX1NUUF9UWVBFOgorCQlpID0gc3RydG9sKG9wdGFyZywgJmVuZCwgMCk7CisJCWlmIChpIDwgMCB8fCBpID4gMjU1IHx8ICplbmQgIT0gJ1wwJykgeworCQkJaWYgKCFzdHJjYXNlY21wKG9wdGFyZywgQlBEVV9UWVBFX0NPTkZJR19TVFJJTkcpKQorCQkJCXN0cGluZm8tPnR5cGUgPSBCUERVX1RZUEVfQ09ORklHOworCQkJZWxzZSBpZiAoIXN0cmNhc2VjbXAob3B0YXJnLCBCUERVX1RZUEVfVENOX1NUUklORykpCisJCQkJc3RwaW5mby0+dHlwZSA9IEJQRFVfVFlQRV9UQ047CisJCQllbHNlCisJCQkJZWJ0X3ByaW50X2Vycm9yMigiQmFkIC0tc3RwLXR5cGUgYXJndW1lbnQiKTsKKwkJfSBlbHNlCisJCQlzdHBpbmZvLT50eXBlID0gaTsKKwkJYnJlYWs7CisJY2FzZSBFQlRfU1RQX0ZMQUdTOgorCQlpID0gc3RydG9sKG9wdGFyZywgJmVuZCwgMCk7CisJCWlmIChpIDwgMCB8fCBpID4gMjU1IHx8ICplbmQgIT0gJ1wwJykgeworCQkJaWYgKCFzdHJjYXNlY21wKG9wdGFyZywgRkxBR19UQ19TVFJJTkcpKQorCQkJCXN0cGluZm8tPmNvbmZpZy5mbGFncyA9IEZMQUdfVEM7CisJCQllbHNlIGlmICghc3RyY2FzZWNtcChvcHRhcmcsIEZMQUdfVENfQUNLX1NUUklORykpCisJCQkJc3RwaW5mby0+Y29uZmlnLmZsYWdzID0gRkxBR19UQ19BQ0s7CisJCQllbHNlCisJCQkJZWJ0X3ByaW50X2Vycm9yMigiQmFkIC0tc3RwLWZsYWdzIGFyZ3VtZW50Iik7CisJCX0gZWxzZQorCQkJc3RwaW5mby0+Y29uZmlnLmZsYWdzID0gaTsKKwkJYnJlYWs7CisJY2FzZSBFQlRfU1RQX1JPT1RQUklPOgorCQlpZiAocGFyc2VfcmFuZ2UoYXJndltvcHRpbmQtMV0sICYoc3RwaW5mby0+Y29uZmlnLnJvb3RfcHJpb2wpLAorCQkgICAgJihzdHBpbmZvLT5jb25maWcucm9vdF9wcmlvdSksIDIsIDAsIDB4ZmZmZikpCisJCQllYnRfcHJpbnRfZXJyb3IoIkJhZCAtLXN0cC1yb290LXByaW8gcmFuZ2UiKTsKKwkJYnJlYWs7CisJY2FzZSBFQlRfU1RQX1JPT1RDT1NUOgorCQlpZiAocGFyc2VfcmFuZ2UoYXJndltvcHRpbmQtMV0sICYoc3RwaW5mby0+Y29uZmlnLnJvb3RfY29zdGwpLAorCQkgICAgJihzdHBpbmZvLT5jb25maWcucm9vdF9jb3N0dSksIDQsIDAsIDB4ZmZmZmZmZmYpKQorCQkJZWJ0X3ByaW50X2Vycm9yKCJCYWQgLS1zdHAtcm9vdC1jb3N0IHJhbmdlIik7CisJCWJyZWFrOworCWNhc2UgRUJUX1NUUF9TRU5ERVJQUklPOgorCQlpZiAocGFyc2VfcmFuZ2UoYXJndltvcHRpbmQtMV0sICYoc3RwaW5mby0+Y29uZmlnLnNlbmRlcl9wcmlvbCksCisJCSAgICAmKHN0cGluZm8tPmNvbmZpZy5zZW5kZXJfcHJpb3UpLCAyLCAwLCAweGZmZmYpKQorCQkJZWJ0X3ByaW50X2Vycm9yKCJCYWQgLS1zdHAtc2VuZGVyLXByaW8gcmFuZ2UiKTsKKwkJYnJlYWs7CisJY2FzZSBFQlRfU1RQX1BPUlQ6CisJCWlmIChwYXJzZV9yYW5nZShhcmd2W29wdGluZC0xXSwgJihzdHBpbmZvLT5jb25maWcucG9ydGwpLAorCQkgICAgJihzdHBpbmZvLT5jb25maWcucG9ydHUpLCAyLCAwLCAweGZmZmYpKQorCQkJZWJ0X3ByaW50X2Vycm9yKCJCYWQgLS1zdHAtcG9ydCByYW5nZSIpOworCQlicmVhazsKKwljYXNlIEVCVF9TVFBfTVNHQUdFOgorCQlpZiAocGFyc2VfcmFuZ2UoYXJndltvcHRpbmQtMV0sICYoc3RwaW5mby0+Y29uZmlnLm1zZ19hZ2VsKSwKKwkJICAgICYoc3RwaW5mby0+Y29uZmlnLm1zZ19hZ2V1KSwgMiwgMCwgMHhmZmZmKSkKKwkJCWVidF9wcmludF9lcnJvcigiQmFkIC0tc3RwLW1zZy1hZ2UgcmFuZ2UiKTsKKwkJYnJlYWs7CisJY2FzZSBFQlRfU1RQX01BWEFHRToKKwkJaWYgKHBhcnNlX3JhbmdlKGFyZ3Zbb3B0aW5kLTFdLCAmKHN0cGluZm8tPmNvbmZpZy5tYXhfYWdlbCksCisJCSAgICAmKHN0cGluZm8tPmNvbmZpZy5tYXhfYWdldSksIDIsIDAsIDB4ZmZmZikpCisJCQllYnRfcHJpbnRfZXJyb3IoIkJhZCAtLXN0cC1tYXgtYWdlIHJhbmdlIik7CisJCWJyZWFrOworCWNhc2UgRUJUX1NUUF9IRUxMT1RJTUU6CisJCWlmIChwYXJzZV9yYW5nZShhcmd2W29wdGluZC0xXSwgJihzdHBpbmZvLT5jb25maWcuaGVsbG9fdGltZWwpLAorCQkgICAgJihzdHBpbmZvLT5jb25maWcuaGVsbG9fdGltZXUpLCAyLCAwLCAweGZmZmYpKQorCQkJZWJ0X3ByaW50X2Vycm9yKCJCYWQgLS1zdHAtaGVsbG8tdGltZSByYW5nZSIpOworCQlicmVhazsKKwljYXNlIEVCVF9TVFBfRldERDoKKwkJaWYgKHBhcnNlX3JhbmdlKGFyZ3Zbb3B0aW5kLTFdLCAmKHN0cGluZm8tPmNvbmZpZy5mb3J3YXJkX2RlbGF5bCksCisJCSAgICAmKHN0cGluZm8tPmNvbmZpZy5mb3J3YXJkX2RlbGF5dSksIDIsIDAsIDB4ZmZmZikpCisJCQllYnRfcHJpbnRfZXJyb3IoIkJhZCAtLXN0cC1mb3J3YXJkLWRlbGF5IHJhbmdlIik7CisJCWJyZWFrOworCWNhc2UgRUJUX1NUUF9ST09UQUREUjoKKwkJaWYgKGVidF9nZXRfbWFjX2FuZF9tYXNrKGFyZ3Zbb3B0aW5kLTFdLAorCQkgICAgKHVuc2lnbmVkIGNoYXIgKilzdHBpbmZvLT5jb25maWcucm9vdF9hZGRyLAorCQkgICAgKHVuc2lnbmVkIGNoYXIgKilzdHBpbmZvLT5jb25maWcucm9vdF9hZGRybXNrKSkKKwkJCWVidF9wcmludF9lcnJvcigiQmFkIC0tc3RwLXJvb3QtYWRkciBhZGRyZXNzIik7CisJCWJyZWFrOworCWNhc2UgRUJUX1NUUF9TRU5ERVJBRERSOgorCQlpZiAoZWJ0X2dldF9tYWNfYW5kX21hc2soYXJndltvcHRpbmQtMV0sCisJCSAgICAodW5zaWduZWQgY2hhciAqKXN0cGluZm8tPmNvbmZpZy5zZW5kZXJfYWRkciwKKwkJICAgICh1bnNpZ25lZCBjaGFyICopc3RwaW5mby0+Y29uZmlnLnNlbmRlcl9hZGRybXNrKSkKKwkJCWVidF9wcmludF9lcnJvcigiQmFkIC0tc3RwLXNlbmRlci1hZGRyIGFkZHJlc3MiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZWJ0X3ByaW50X2Vycm9yKCJzdHAgbWF0Y2g6IHRoaXMgc2hvdWxkbid0IGhhcHBlbiIpOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZmluYWxfY2hlY2soY29uc3Qgc3RydWN0IGVidF91X2VudHJ5ICplbnRyeSwKKyAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnlfbWF0Y2ggKm1hdGNoLCBjb25zdCBjaGFyICpuYW1lLAorICAgdW5zaWduZWQgaW50IGhvb2ttYXNrLCB1bnNpZ25lZCBpbnQgdGltZSkKK3sKKwl1aW50OF90IGJyaWRnZV91bGFbNl0gPSB7MHgwMSwgMHg4MCwgMHhjMiwgMHgwMCwgMHgwMCwgMHgwMH07CisJdWludDhfdCBtc2tbNl0gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CisKKwlpZiAobWVtY21wKGVudHJ5LT5kZXN0bWFjLCBicmlkZ2VfdWxhLCA2KSB8fAorCSAgICBtZW1jbXAoZW50cnktPmRlc3Rtc2ssIG1zaywgNikpCisJCWVidF9wcmludF9lcnJvcigiU1RQIG1hdGNoaW5nIGlzIG9ubHkgdmFsaWQgd2hlbiB0aGUgIgorCQkJCSJkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyBpcyB0aGUgYnJpZGdlIGdyb3VwICIKKwkJCQkiYWRkcmVzcyAoQkdBKSAwMTo4MDpjMjowMDowMDowMCIpOworfQorCitzdGF0aWMgdm9pZCBwcmludChjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbWF0Y2gpCit7CisJc3RydWN0IGVidF9zdHBfaW5mbyAqc3RwaW5mbyA9IChzdHJ1Y3QgZWJ0X3N0cF9pbmZvICopbWF0Y2gtPmRhdGE7CisJc3RydWN0IGVidF9zdHBfY29uZmlnX2luZm8gKmMgPSAmKHN0cGluZm8tPmNvbmZpZyk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU1RQX05VTU9QUzsgaSsrKSB7CisJCWlmICghKHN0cGluZm8tPmJpdG1hc2sgJiAoMSA8PCBpKSkpCisJCQljb250aW51ZTsKKwkJcHJpbnRmKCItLSVzICVzIiwgb3B0c1tpXS5uYW1lLAorCQkgICAgICAgKHN0cGluZm8tPmludmZsYWdzICYgKDEgPDwgaSkpID8gIiEgIiA6ICIiKTsKKwkJaWYgKEVCVF9TVFBfVFlQRSA9PSAoMSA8PCBpKSkgeworCQkJaWYgKHN0cGluZm8tPnR5cGUgPT0gQlBEVV9UWVBFX0NPTkZJRykKKwkJCQlwcmludGYoIiVzIiwgQlBEVV9UWVBFX0NPTkZJR19TVFJJTkcpOworCQkJZWxzZSBpZiAoc3RwaW5mby0+dHlwZSA9PSBCUERVX1RZUEVfVENOKQorCQkJCXByaW50ZigiJXMiLCBCUERVX1RZUEVfVENOX1NUUklORyk7CisJCQllbHNlCisJCQkJcHJpbnRmKCIlZCIsIHN0cGluZm8tPnR5cGUpOworCQl9IGVsc2UgaWYgKEVCVF9TVFBfRkxBR1MgPT0gKDEgPDwgaSkpIHsKKwkJCWlmIChjLT5mbGFncyA9PSBGTEFHX1RDKQorCQkJCXByaW50ZigiJXMiLCBGTEFHX1RDX1NUUklORyk7CisJCQllbHNlIGlmIChjLT5mbGFncyA9PSBGTEFHX1RDX0FDSykKKwkJCQlwcmludGYoIiVzIiwgRkxBR19UQ19BQ0tfU1RSSU5HKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiVkIiwgYy0+ZmxhZ3MpOworCQl9IGVsc2UgaWYgKEVCVF9TVFBfUk9PVFBSSU8gPT0gKDEgPDwgaSkpCisJCQlwcmludF9yYW5nZShjLT5yb290X3ByaW9sLCBjLT5yb290X3ByaW91KTsKKwkJZWxzZSBpZiAoRUJUX1NUUF9ST09UQUREUiA9PSAoMSA8PCBpKSkKKwkJCWVidF9wcmludF9tYWNfYW5kX21hc2soKHVuc2lnbmVkIGNoYXIgKiljLT5yb290X2FkZHIsCisJCQkgICAodW5zaWduZWQgY2hhciopYy0+cm9vdF9hZGRybXNrKTsKKwkJZWxzZSBpZiAoRUJUX1NUUF9ST09UQ09TVCA9PSAoMSA8PCBpKSkKKwkJCXByaW50X3JhbmdlKGMtPnJvb3RfY29zdGwsIGMtPnJvb3RfY29zdHUpOworCQllbHNlIGlmIChFQlRfU1RQX1NFTkRFUlBSSU8gPT0gKDEgPDwgaSkpCisJCQlwcmludF9yYW5nZShjLT5zZW5kZXJfcHJpb2wsIGMtPnNlbmRlcl9wcmlvdSk7CisJCWVsc2UgaWYgKEVCVF9TVFBfU0VOREVSQUREUiA9PSAoMSA8PCBpKSkKKwkJCWVidF9wcmludF9tYWNfYW5kX21hc2soKHVuc2lnbmVkIGNoYXIgKiljLT5zZW5kZXJfYWRkciwKKwkJCSAgICh1bnNpZ25lZCBjaGFyICopYy0+c2VuZGVyX2FkZHJtc2spOworCQllbHNlIGlmIChFQlRfU1RQX1BPUlQgPT0gKDEgPDwgaSkpCisJCQlwcmludF9yYW5nZShjLT5wb3J0bCwgYy0+cG9ydHUpOworCQllbHNlIGlmIChFQlRfU1RQX01TR0FHRSA9PSAoMSA8PCBpKSkKKwkJCXByaW50X3JhbmdlKGMtPm1zZ19hZ2VsLCBjLT5tc2dfYWdldSk7CisJCWVsc2UgaWYgKEVCVF9TVFBfTUFYQUdFID09ICgxIDw8IGkpKQorCQkJcHJpbnRfcmFuZ2UoYy0+bWF4X2FnZWwsIGMtPm1heF9hZ2V1KTsKKwkJZWxzZSBpZiAoRUJUX1NUUF9IRUxMT1RJTUUgPT0gKDEgPDwgaSkpCisJCQlwcmludF9yYW5nZShjLT5oZWxsb190aW1lbCwgYy0+aGVsbG9fdGltZXUpOworCQllbHNlIGlmIChFQlRfU1RQX0ZXREQgPT0gKDEgPDwgaSkpCisJCQlwcmludF9yYW5nZShjLT5mb3J3YXJkX2RlbGF5bCwgYy0+Zm9yd2FyZF9kZWxheXUpOworCQlwcmludGYoIiAiKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZShjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICptMSwKKyAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnlfbWF0Y2ggKm0yKQoreworCXJldHVybiAoIW1lbWNtcChtMS0+ZGF0YSwgbTItPmRhdGEsIHNpemVvZihzdHJ1Y3QgZWJ0X3N0cF9pbmZvKSkpOworfQorCitzdGF0aWMgc3RydWN0IGVidF91X21hdGNoIHN0cF9tYXRjaCA9Cit7CisJLm5hbWUJCT0gInN0cCIsCisJLnNpemUJCT0gc2l6ZW9mKHN0cnVjdCBlYnRfc3RwX2luZm8pLAorCS5oZWxwCQk9IHByaW50X2hlbHAsCisJLmluaXQJCT0gaW5pdCwKKwkucGFyc2UJCT0gcGFyc2UsCisJLmZpbmFsX2NoZWNrCT0gZmluYWxfY2hlY2ssCisJLnByaW50CQk9IHByaW50LAorCS5jb21wYXJlCT0gY29tcGFyZSwKKwkuZXh0cmFfb3BzCT0gb3B0cywKK307CisKK3N0YXRpYyB2b2lkIF9JTklUKHZvaWQpCit7CisJZWJ0X3JlZ2lzdGVyX21hdGNoKCZzdHBfbWF0Y2gpOworfQpkaWZmIC0tZ2l0IGEvZXh0ZW5zaW9ucy9lYnRfc3RyaW5nLmMgYi9leHRlbnNpb25zL2VidF9zdHJpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2ZiZTE5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9lYnRfc3RyaW5nLmMKQEAgLTAsMCArMSwzMTggQEAKKy8qIGVidF9zdHJpbmcKKyAqCisgKiBBdXRob3I6CisgKiBCZXJuaWUgSGFycmlzIDxiZXJuaWUuaGFycmlzQGFsbGllZHRlbGVzaXMuY28ubno+CisgKgorICogRmVicnVhcnksIDIwMTgKKyAqCisgKiBCYXNlZCBvbjoKKyAqICBsaWJ4dF9zdHJpbmcuYywgQ29weXJpZ2h0IChDKSAyMDAwIEVtbWFudWVsIFJvZ2VyICA8d2luZmllbGRAZnJlZWdhdGVzLmJlPgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICIuLi9pbmNsdWRlL2VidGFibGVzX3UuaCIKKyNpbmNsdWRlIDxsaW51eC9pZl9wYWNrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfc3RyaW5nLmg+CisKKyNkZWZpbmUgU1RSSU5HX0ZST00gICcxJworI2RlZmluZSBTVFJJTkdfVE8gICAgJzInCisjZGVmaW5lIFNUUklOR19BTEdPICAnMycKKyNkZWZpbmUgU1RSSU5HX0lDQVNFICc0JworI2RlZmluZSBTVFJJTkcgICAgICAgJzUnCisjZGVmaW5lIFNUUklOR19IRVggICAnNicKKyNkZWZpbmUgT1BUX1NUUklOR19GUk9NICAoMSA8PCAwKQorI2RlZmluZSBPUFRfU1RSSU5HX1RPICAgICgxIDw8IDEpCisjZGVmaW5lIE9QVF9TVFJJTkdfQUxHTyAgKDEgPDwgMikKKyNkZWZpbmUgT1BUX1NUUklOR19JQ0FTRSAoMSA8PCAzKQorI2RlZmluZSBPUFRfU1RSSU5HICAgICAgICgxIDw8IDQpCisjZGVmaW5lIE9QVF9TVFJJTkdfSEVYICAgKDEgPDwgNSkKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gb3B0c1tdID0KK3sKKwl7ICJzdHJpbmctZnJvbSIgICAgICAgICAgICAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgU1RSSU5HX0ZST00gfSwKKwl7ICJzdHJpbmctdG8iICAgICAgICAgICAgICAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgU1RSSU5HX1RPIH0sCisJeyAic3RyaW5nLWFsZ28iICAgICAgICAgICAgICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIFNUUklOR19BTEdPIH0sCisJeyAic3RyaW5nLWljYXNlIiAgICAgICAgICAgICwgbm9fYXJndW1lbnQsICAgICAgIDAsIFNUUklOR19JQ0FTRSB9LAorCXsgInN0cmluZyIgICAgICAgICAgICAgICAgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBTVFJJTkcgfSwKKwl7ICJzdHJpbmctaGV4IiAgICAgICAgICAgICAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgU1RSSU5HX0hFWCB9LAorCXsgMCB9Cit9OworCitzdGF0aWMgdm9pZCBwcmludF9oZWxwKCkKK3sKKwlwcmludGYoCisic3RyaW5nIG9wdGlvbnM6XG4iCisiLS1zdHJpbmctZnJvbSBvZmZzZXQgICAgOiBPZmZzZXQgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb20gKGRlZmF1bHQ6IDApXG4iCisiLS1zdHJpbmctdG8gICBvZmZzZXQgICAgOiBPZmZzZXQgdG8gc3RvcCBzZWFyY2hpbmcgKGRlZmF1bHQ6IHBhY2tldCBzaXplKVxuIgorIi0tc3RyaW5nLWFsZ28gYWxnb3JpdGhtIDogQWxnb3JpdGhtIChibSA9IEJveWVyLU1vb3JlLCBrbXAgPSBLbnV0aC1QcmF0dC1Nb3JyaXMpXG4iCisiLS1zdHJpbmctaWNhc2UgICAgICAgICAgOiBJZ25vcmUgY2FzZSB3aGVuIHNlYXJjaGluZ1xuIgorIi0tc3RyaW5nICAgICBbIV0gc3RyaW5nIDogTWF0Y2ggYSBzdHJpbmcgaW4gYSBwYWNrZXRcbiIKKyItLXN0cmluZy1oZXggWyFdIHN0cmluZyA6IE1hdGNoIGEgaGV4IHN0cmluZyBpbiBhIHBhY2tldCwgZS5nLiB8MEQgMEF8LCB8MEQwQXwsIG5ldGZpbHRlcnwwM3xvcmdcbiIpOworfQorCitzdGF0aWMgdm9pZCBpbml0KHN0cnVjdCBlYnRfZW50cnlfbWF0Y2ggKm1hdGNoKQoreworCXN0cnVjdCB4dF9zdHJpbmdfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgeHRfc3RyaW5nX2luZm8gKiltYXRjaC0+ZGF0YTsKKworCWluZm8tPnRvX29mZnNldCA9IFVJTlQxNl9NQVg7Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX3N0cmluZyhjb25zdCBjaGFyICpzLCBzdHJ1Y3QgeHRfc3RyaW5nX2luZm8gKmluZm8pCit7CisJLyogeHRfc3RyaW5nIGRvZXMgbm90IG5lZWQgXDAgYXQgdGhlIGVuZCBvZiB0aGUgcGF0dGVybiAqLworCWlmIChzdHJsZW4ocykgPD0gWFRfU1RSSU5HX01BWF9QQVRURVJOX1NJWkUpIHsKKwkJc3RybmNweShpbmZvLT5wYXR0ZXJuLCBzLCBYVF9TVFJJTkdfTUFYX1BBVFRFUk5fU0laRSk7CisJCWluZm8tPnBhdGxlbiA9IHN0cm5sZW4ocywgWFRfU1RSSU5HX01BWF9QQVRURVJOX1NJWkUpOworCQlyZXR1cm47CisJfQorCWVidF9wcmludF9lcnJvcjMoIlNUUklORyB0b28gbG9uZyBcIiVzXCIiLCBzKTsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfaGV4X3N0cmluZyhjb25zdCBjaGFyICpzLCBzdHJ1Y3QgeHRfc3RyaW5nX2luZm8gKmluZm8pCit7CisJaW50IGk9MCwgc2xlbiwgc2luZGV4PTAsIHNjaGFyOworCXNob3J0IGhleF9mID0gMCwgbGl0ZXJhbF9mID0gMDsKKwljaGFyIGhleHRtcFszXTsKKworCXNsZW4gPSBzdHJsZW4ocyk7CisKKwlpZiAoc2xlbiA9PSAwKSB7CisJCWVidF9wcmludF9lcnJvcjMoIlNUUklORyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGNoYXIiKTsKKwl9CisKKwl3aGlsZSAoaSA8IHNsZW4pIHsKKwkJaWYgKHNbaV0gPT0gJ1xcJyAmJiAhaGV4X2YpIHsKKwkJCWxpdGVyYWxfZiA9IDE7CisJCX0gZWxzZSBpZiAoc1tpXSA9PSAnXFwnKSB7CisJCQllYnRfcHJpbnRfZXJyb3IzKCJDYW5ub3QgaW5jbHVkZSBsaXRlcmFscyBpbiBoZXggZGF0YSIpOworCQl9IGVsc2UgaWYgKHNbaV0gPT0gJ3wnKSB7CisJCQlpZiAoaGV4X2YpCisJCQkJaGV4X2YgPSAwOworCQkJZWxzZSB7CisJCQkJaGV4X2YgPSAxOworCQkJCS8qIGdldCBwYXN0IGFueSBpbml0aWFsIHdoaXRlc3BhY2UganVzdCBhZnRlciB0aGUgJ3wnICovCisJCQkJd2hpbGUgKHNbaSsxXSA9PSAnICcpCisJCQkJCWkrKzsKKwkJCX0KKwkJCWlmIChpKzEgPj0gc2xlbikKKwkJCQlicmVhazsKKwkJCWVsc2UKKwkJCQlpKys7ICAvKiBhZHZhbmNlIHRvIHRoZSBuZXh0IGNoYXJhY3RlciAqLworCQl9CisKKwkJaWYgKGxpdGVyYWxfZikgeworCQkJaWYgKGkrMSA+PSBzbGVuKSB7CisJCQkJZWJ0X3ByaW50X2Vycm9yMygiQmFkIGxpdGVyYWwgcGxhY2VtZW50IGF0IGVuZCBvZiBzdHJpbmciKTsKKwkJCX0KKwkJCWluZm8tPnBhdHRlcm5bc2luZGV4XSA9IHNbaSsxXTsKKwkJCWkgKz0gMjsgIC8qIHNraXAgb3ZlciBsaXRlcmFsIGNoYXIgKi8KKwkJCWxpdGVyYWxfZiA9IDA7CisJCX0gZWxzZSBpZiAoaGV4X2YpIHsKKwkJCWlmIChpKzEgPj0gc2xlbikgeworCQkJCWVidF9wcmludF9lcnJvcjMoIk9kZCBudW1iZXIgb2YgaGV4IGRpZ2l0cyIpOworCQkJfQorCQkJaWYgKGkrMiA+PSBzbGVuKSB7CisJCQkJLyogbXVzdCBlbmQgd2l0aCBhICJ8IiAqLworCQkJCWVidF9wcmludF9lcnJvcjMoIkludmFsaWQgaGV4IGJsb2NrIik7CisJCQl9CisJCQlpZiAoISBpc3hkaWdpdChzW2ldKSkgLyogY2hlY2sgZm9yIHZhbGlkIGhleCBjaGFyICovCisJCQkJZWJ0X3ByaW50X2Vycm9yMygiSW52YWxpZCBoZXggY2hhciAnJWMnIiwgc1tpXSk7CisJCQlpZiAoISBpc3hkaWdpdChzW2krMV0pKSAvKiBjaGVjayBmb3IgdmFsaWQgaGV4IGNoYXIgKi8KKwkJCQllYnRfcHJpbnRfZXJyb3IzKCJJbnZhbGlkIGhleCBjaGFyICclYyciLCBzW2krMV0pOworCQkJaGV4dG1wWzBdID0gc1tpXTsKKwkJCWhleHRtcFsxXSA9IHNbaSsxXTsKKwkJCWhleHRtcFsyXSA9ICdcMCc7CisJCQlpZiAoISBzc2NhbmYoaGV4dG1wLCAiJXgiLCAmc2NoYXIpKQorCQkJCWVidF9wcmludF9lcnJvcjMoIkludmFsaWQgaGV4IGNoYXIgYCVjJyIsIHNbaV0pOworCQkJaW5mby0+cGF0dGVybltzaW5kZXhdID0gKGNoYXIpIHNjaGFyOworCQkJaWYgKHNbaSsyXSA9PSAnICcpCisJCQkJaSArPSAzOyAgLyogc3BhY2VzIGluY2x1ZGVkIGluIHRoZSBoZXggYmxvY2sgKi8KKwkJCWVsc2UKKwkJCQlpICs9IDI7CisJCX0gZWxzZSB7ICAvKiB0aGUgY2hhciBpcyBub3QgcGFydCBvZiBoZXggZGF0YSwgc28ganVzdCBjb3B5ICovCisJCQlpbmZvLT5wYXR0ZXJuW3NpbmRleF0gPSBzW2ldOworCQkJaSsrOworCQl9CisJCWlmIChzaW5kZXggPiBYVF9TVFJJTkdfTUFYX1BBVFRFUk5fU0laRSkKKwkJCWVidF9wcmludF9lcnJvcjMoIlNUUklORyB0b28gbG9uZyBcIiVzXCIiLCBzKTsKKwkJc2luZGV4Kys7CisJfQorCWluZm8tPnBhdGxlbiA9IHNpbmRleDsKK30KKworc3RhdGljIGludCBwYXJzZShpbnQgYywgY2hhciAqKmFyZ3YsIGludCBhcmdjLCBjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorCQkgdW5zaWduZWQgaW50ICpmbGFncywgc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqKm1hdGNoKQoreworCXN0cnVjdCB4dF9zdHJpbmdfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgeHRfc3RyaW5nX2luZm8gKikoKm1hdGNoKS0+ZGF0YTsKKworCXN3aXRjaCAoYykgeworCWNhc2UgU1RSSU5HX0ZST006CisJCWVidF9jaGVja19vcHRpb24yKGZsYWdzLCBPUFRfU1RSSU5HX0ZST00pOworCQlpZiAoZWJ0X2NoZWNrX2ludmVyc2UyKG9wdGFyZykpCisJCQllYnRfcHJpbnRfZXJyb3IyKCJVbmV4cGVjdGVkIGAhJyBhZnRlciAtLXN0cmluZy1mcm9tIik7CisJCWluZm8tPmZyb21fb2Zmc2V0ID0gKF9fdTE2KXN0cnRvdWwob3B0YXJnLCBOVUxMLCAxMCk7CisJCWJyZWFrOworCWNhc2UgU1RSSU5HX1RPOgorCQllYnRfY2hlY2tfb3B0aW9uMihmbGFncywgT1BUX1NUUklOR19UTyk7CisJCWlmIChlYnRfY2hlY2tfaW52ZXJzZTIob3B0YXJnKSkKKwkJCWVidF9wcmludF9lcnJvcjIoIlVuZXhwZWN0ZWQgYCEnIGFmdGVyIC0tc3RyaW5nLXRvIik7CisJCWluZm8tPnRvX29mZnNldCA9IChfX3UxNilzdHJ0b3VsKG9wdGFyZywgTlVMTCwgMTApOworCQlicmVhazsKKwljYXNlIFNUUklOR19BTEdPOgorCQllYnRfY2hlY2tfb3B0aW9uMihmbGFncywgT1BUX1NUUklOR19BTEdPKTsKKwkJaWYgKGVidF9jaGVja19pbnZlcnNlMihvcHRhcmcpKQorCQkJZWJ0X3ByaW50X2Vycm9yMigiVW5leHBlY3RlZCBgIScgYWZ0ZXIgLS1zdHJpbmctYWxnbyIpOworCQlpZiAoc25wcmludGYoaW5mby0+YWxnbywgc2l6ZW9mKGluZm8tPmFsZ28pLCAiJXMiLCBvcHRhcmcpID49CisJCQkJc2l6ZW9mKGluZm8tPmFsZ28pKQorCQkJZWJ0X3ByaW50X2Vycm9yMigiXCIlc1wiIGlzIHRydW5jYXRlZCIsIGluZm8tPmFsZ28pOworCQlicmVhazsKKwljYXNlIFNUUklOR19JQ0FTRToKKwkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIE9QVF9TVFJJTkdfSUNBU0UpOworCQlpZiAoZWJ0X2NoZWNrX2ludmVyc2UyKG9wdGFyZykpCisJCQllYnRfcHJpbnRfZXJyb3IyKCJVbmV4cGVjdGVkIGAhJyBhZnRlciAtLXN0cmluZy1pY2FzZSIpOworCQlpbmZvLT51LnYxLmZsYWdzIHw9IFhUX1NUUklOR19GTEFHX0lHTk9SRUNBU0U7CisJCWJyZWFrOworCWNhc2UgU1RSSU5HOgorCQllYnRfY2hlY2tfb3B0aW9uMihmbGFncywgT1BUX1NUUklORyk7CisJCXBhcnNlX3N0cmluZyhvcHRhcmcsIGluZm8pOworCQlpZiAoZWJ0X2NoZWNrX2ludmVyc2UyKG9wdGFyZykpIHsKKwkJCWluZm8tPnUudjEuZmxhZ3MgfD0gWFRfU1RSSU5HX0ZMQUdfSU5WRVJUOworCQl9CisJCWJyZWFrOworCWNhc2UgU1RSSU5HX0hFWDoKKwkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIE9QVF9TVFJJTkdfSEVYKTsKKwkJcGFyc2VfaGV4X3N0cmluZyhvcHRhcmcsIGluZm8pOworCQlpZiAoZWJ0X2NoZWNrX2ludmVyc2UyKG9wdGFyZykpIHsKKwkJCWluZm8tPnUudjEuZmxhZ3MgfD0gWFRfU1RSSU5HX0ZMQUdfSU5WRVJUOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZmluYWxfY2hlY2soY29uc3Qgc3RydWN0IGVidF91X2VudHJ5ICplbnRyeSwKKwkJCWNvbnN0IHN0cnVjdCBlYnRfZW50cnlfbWF0Y2ggKm1hdGNoLCBjb25zdCBjaGFyICpuYW1lLAorCQkJdW5zaWduZWQgaW50IGhvb2ttYXNrLCB1bnNpZ25lZCBpbnQgdGltZSkKK3sKKwlzdHJ1Y3QgeHRfc3RyaW5nX2luZm8gKmluZm8gPSAoc3RydWN0IHh0X3N0cmluZ19pbmZvICopbWF0Y2gtPmRhdGE7CisKKwlpZiAoaW5mby0+dG9fb2Zmc2V0IDwgaW5mby0+ZnJvbV9vZmZzZXQpIHsKKwkJZWJ0X3ByaW50X2Vycm9yMygiJ3RvJyBvZmZzZXQgc2hvdWxkIG5vdCBiZSBsZXNzIHRoYW4gJ2Zyb20nICIKKwkJCQkgIm9mZnNldCIpOworCX0KK30KKworLyogVGVzdCB0byBzZWUgaWYgdGhlIHN0cmluZyBjb250YWlucyBub24tcHJpbnRhYmxlIGNoYXJzIG9yIHF1b3RlcyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGludCBpc19oZXhfc3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwKKwkJCQkJY29uc3QgdW5zaWduZWQgc2hvcnQgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGk9MDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmICghIGlzcHJpbnQoc3RyW2ldKSkgeworCQkJLyogc3RyaW5nIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBub24tcHJpbnRhYmxlIGNoYXIgKi8KKwkJCXJldHVybiAxOworCQl9CisJfQorCS8qIHVzZSBoZXggb3V0cHV0IGlmIHRoZSBsYXN0IGNoYXIgaXMgYSAiXCIgKi8KKwlpZiAoc3RyW2xlbi0xXSA9PSAnXFwnKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyogUHJpbnQgc3RyaW5nIHdpdGggInwiIGNoYXJzIGluY2x1ZGVkIGFzIG9uZSB3b3VsZCBwYXNzIHRvIC0tc3RyaW5nLWhleCAqLworc3RhdGljIHZvaWQgcHJpbnRfaGV4X3N0cmluZyhjb25zdCBjaGFyICpzdHIsIGNvbnN0IHVuc2lnbmVkIHNob3J0IGludCBsZW4pCit7CisJdW5zaWduZWQgaW50IGk7CisJLyogc3RhcnQgaGV4IGJsb2NrICovCisJcHJpbnRmKCJcInwiKTsKKwlmb3IgKGk9MDsgaSA8IGxlbjsgaSsrKQorCQlwcmludGYoIiUwMngiLCAodW5zaWduZWQgY2hhcilzdHJbaV0pOworCS8qIGNsb3NlIGhleCBibG9jayAqLworCXByaW50ZigifFwiICIpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9zdHJpbmcoY29uc3QgY2hhciAqc3RyLCBjb25zdCB1bnNpZ25lZCBzaG9ydCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGludCBpOworCXByaW50ZigiXCIiKTsKKwlmb3IgKGk9MDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmIChzdHJbaV0gPT0gJ1wiJyB8fCBzdHJbaV0gPT0gJ1xcJykKKwkJCXB1dGNoYXIoJ1xcJyk7CisJCXByaW50ZigiJWMiLCAodW5zaWduZWQgY2hhcikgc3RyW2ldKTsKKwl9CisJcHJpbnRmKCJcIiAiKTsgIC8qIGNsb3NpbmcgcXVvdGUgKi8KK30KKworc3RhdGljIHZvaWQgcHJpbnQoY29uc3Qgc3RydWN0IGVidF91X2VudHJ5ICplbnRyeSwKKwkJICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICptYXRjaCkKK3sKKwljb25zdCBzdHJ1Y3QgeHRfc3RyaW5nX2luZm8gKmluZm8gPQorCQkoY29uc3Qgc3RydWN0IHh0X3N0cmluZ19pbmZvICopIG1hdGNoLT5kYXRhOworCWludCBpbnZlcnQgPSBpbmZvLT51LnYxLmZsYWdzICYgWFRfU1RSSU5HX0ZMQUdfSU5WRVJUOworCisJaWYgKGlzX2hleF9zdHJpbmcoaW5mby0+cGF0dGVybiwgaW5mby0+cGF0bGVuKSkgeworCQlwcmludGYoIi0tc3RyaW5nLWhleCAlcyIsIGludmVydCA/ICIhICIgOiAiIik7CisJCXByaW50X2hleF9zdHJpbmcoaW5mby0+cGF0dGVybiwgaW5mby0+cGF0bGVuKTsKKwl9IGVsc2UgeworCQlwcmludGYoIi0tc3RyaW5nICVzIiwgaW52ZXJ0ID8gIiEgIiA6ICIiKTsKKwkJcHJpbnRfc3RyaW5nKGluZm8tPnBhdHRlcm4sIGluZm8tPnBhdGxlbik7CisJfQorCXByaW50ZigiLS1zdHJpbmctYWxnbyAlcyAiLCBpbmZvLT5hbGdvKTsKKwlpZiAoaW5mby0+ZnJvbV9vZmZzZXQgIT0gMCkKKwkJcHJpbnRmKCItLXN0cmluZy1mcm9tICV1ICIsIGluZm8tPmZyb21fb2Zmc2V0KTsKKwlpZiAoaW5mby0+dG9fb2Zmc2V0ICE9IDApCisJCXByaW50ZigiLS1zdHJpbmctdG8gJXUgIiwgaW5mby0+dG9fb2Zmc2V0KTsKKwlpZiAoaW5mby0+dS52MS5mbGFncyAmIFhUX1NUUklOR19GTEFHX0lHTk9SRUNBU0UpCisJCXByaW50ZigiLS1zdHJpbmctaWNhc2UgIik7Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZShjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICptMSwKKwkJICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbTIpCit7CisJY29uc3Qgc3RydWN0IHh0X3N0cmluZ19pbmZvICppbmZvMSA9CisJCShjb25zdCBzdHJ1Y3QgeHRfc3RyaW5nX2luZm8gKikgbTEtPmRhdGE7CisJY29uc3Qgc3RydWN0IHh0X3N0cmluZ19pbmZvICppbmZvMiA9CisJCShjb25zdCBzdHJ1Y3QgeHRfc3RyaW5nX2luZm8gKikgbTItPmRhdGE7CisKKwlpZiAoaW5mbzEtPmZyb21fb2Zmc2V0ICE9IGluZm8yLT5mcm9tX29mZnNldCkKKwkJcmV0dXJuIDA7CisJaWYgKGluZm8xLT50b19vZmZzZXQgIT0gaW5mbzItPnRvX29mZnNldCkKKwkJcmV0dXJuIDA7CisJaWYgKGluZm8xLT51LnYxLmZsYWdzICE9IGluZm8yLT51LnYxLmZsYWdzKQorCQlyZXR1cm4gMDsKKwlpZiAoaW5mbzEtPnBhdGxlbiAhPSBpbmZvMi0+cGF0bGVuKQorCQlyZXR1cm4gMDsKKwlpZiAoc3RybmNtcCAoaW5mbzEtPmFsZ28sIGluZm8yLT5hbGdvLCBYVF9TVFJJTkdfTUFYX0FMR09fTkFNRV9TSVpFKSAhPSAwKQorCQlyZXR1cm4gMDsKKwlpZiAoc3RybmNtcCAoaW5mbzEtPnBhdHRlcm4sIGluZm8yLT5wYXR0ZXJuLCBpbmZvMS0+cGF0bGVuKSAhPSAwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGVidF91X21hdGNoIHN0cmluZ19tYXRjaCA9Cit7CisJLm5hbWUJCT0gInN0cmluZyIsCisJLnJldmlzaW9uCT0gMSwKKwkuc2l6ZQkJPSBzaXplb2Yoc3RydWN0IHh0X3N0cmluZ19pbmZvKSwKKwkuaGVscAkJPSBwcmludF9oZWxwLAorCS5pbml0CQk9IGluaXQsCisJLnBhcnNlCQk9IHBhcnNlLAorCS5maW5hbF9jaGVjawk9IGZpbmFsX2NoZWNrLAorCS5wcmludAkJPSBwcmludCwKKwkuY29tcGFyZQk9IGNvbXBhcmUsCisJLmV4dHJhX29wcwk9IG9wdHMsCit9OworCitzdGF0aWMgdm9pZCBfSU5JVCh2b2lkKQoreworCWVidF9yZWdpc3Rlcl9tYXRjaCgmc3RyaW5nX21hdGNoKTsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZWJ0X3Vsb2cuYyBiL2V4dGVuc2lvbnMvZWJ0X3Vsb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmE2YzhiCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9lYnRfdWxvZy5jCkBAIC0wLDAgKzEsMTg2IEBACisvKiBlYnRfdWxvZworICoKKyAqIEF1dGhvcnM6CisgKiBCYXJ0IERlIFNjaHV5bWVyIDxiZHNjaHV5bUBwYW5kb3JhLmJlPgorICoKKyAqIE5vdmVtYmVyLCAyMDA0CisgKi8KKworI2RlZmluZSBfX25lZWRfdGltZV90CisjZGVmaW5lIF9fbmVlZF9zdXNlY29uZHNfdAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSAiLi4vaW5jbHVkZS9lYnRhYmxlc191LmgiCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF91bG9nLmg+CisKKyNkZWZpbmUgQ1BfTk9fTElNSVRfUyAiZGVmYXVsdF9jcHJhbmdlIgorI2RlZmluZSBDUF9OT19MSU1JVF9OIDAKKworI2RlZmluZSBVTE9HX1BSRUZJWCAgICAgJzEnCisjZGVmaW5lIFVMT0dfTkxHUk9VUCAgICAnMicKKyNkZWZpbmUgVUxPR19DUFJBTkdFICAgICczJworI2RlZmluZSBVTE9HX1FUSFJFU0hPTEQgJzQnCisjZGVmaW5lIFVMT0dfVUxPRyAgICAgICAnNScKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIG9wdHNbXSA9Cit7CisJeyAidWxvZy1wcmVmaXgiICAgICwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIFVMT0dfUFJFRklYICAgICB9LAorCXsgInVsb2ctbmxncm91cCIgICAsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBVTE9HX05MR1JPVVAgICAgfSwKKwl7ICJ1bG9nLWNwcmFuZ2UiICAgLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgVUxPR19DUFJBTkdFICAgIH0sCisJeyAidWxvZy1xdGhyZXNob2xkIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIFVMT0dfUVRIUkVTSE9MRCB9LAorCXsgInVsb2ciICAgICAgICAgICAsIG5vX2FyZ3VtZW50ICAgICAgLCAwLCBVTE9HX1VMT0cgICAgICAgfSwKKwl7IDAgfQorfTsKKworc3RhdGljIHZvaWQgcHJpbnRfaGVscCgpCit7CisJcHJpbnRmKAorInVsb2cgb3B0aW9uczpcbiIKKyItLXVsb2cgICAgICAgICAgICAgICAgOiB1c2UgdGhlIGRlZmF1bHQgdWxvZyBwYXJhbWV0ZXJzXG4iCisiLS11bG9nLXByZWZpeCBwcmVmaXggIDogbWF4ICVkIGNoYXJhY3RlcnMgKGRlZmF1bHQgaXMgbm8gcHJlZml4KVxuIgorIi0tdWxvZy1ubGdyb3VwIGdyb3VwICA6IDAgPCBncm91cCBudW1iZXIgPCAlZCAoZGVmYXVsdCA9ICVkKVxuIgorIi0tdWxvZy1jcHJhbmdlIHJhbmdlICA6IG1heCBjb3B5IHJhbmdlIChkZWZhdWx0IGlzICIgQ1BfTk9fTElNSVRfUyAiKVxuIgorIi0tdWxvZy1xdGhyZXNob2xkICAgICA6IDAgPCBxdWV1ZWluZyB0aHJlc2hvbGQgPCAlZCAoZGVmYXVsdCA9ICVkKVxuIiwKKwlFQlRfVUxPR19QUkVGSVhfTEVOIC0gMSwgRUJUX1VMT0dfTUFYTkxHUk9VUFMgKyAxLAorCUVCVF9VTE9HX0RFRkFVTFRfTkxHUk9VUCArIDEsIEVCVF9VTE9HX01BWF9RTEVOICsgMSwKKwlFQlRfVUxPR19ERUZBVUxUX1FUSFJFU0hPTEQpOworfQorCitzdGF0aWMgdm9pZCBpbml0KHN0cnVjdCBlYnRfZW50cnlfd2F0Y2hlciAqd2F0Y2hlcikKK3sKKwlzdHJ1Y3QgZWJ0X3Vsb2dfaW5mbyAqdWxvZ2luZm8gPSAoc3RydWN0IGVidF91bG9nX2luZm8gKil3YXRjaGVyLT5kYXRhOworCisJdWxvZ2luZm8tPnByZWZpeFswXSA9ICdcMCc7CisJdWxvZ2luZm8tPm5sZ3JvdXAgPSBFQlRfVUxPR19ERUZBVUxUX05MR1JPVVA7CisJdWxvZ2luZm8tPmNwcmFuZ2UgPSBDUF9OT19MSU1JVF9OOyAvKiBVc2UgZGVmYXVsdCBuZXRsaW5rIGJ1ZmZlciBzaXplICovCisJdWxvZ2luZm8tPnF0aHJlc2hvbGQgPSBFQlRfVUxPR19ERUZBVUxUX1FUSFJFU0hPTEQ7Cit9CisKKyNkZWZpbmUgT1BUX1BSRUZJWCAgICAgMHgwMQorI2RlZmluZSBPUFRfTkxHUk9VUCAgICAweDAyCisjZGVmaW5lIE9QVF9DUFJBTkdFICAgIDB4MDQKKyNkZWZpbmUgT1BUX1FUSFJFU0hPTEQgMHgwOAorI2RlZmluZSBPUFRfVUxPRyAgICAgICAweDEwCitzdGF0aWMgaW50IHBhcnNlKGludCBjLCBjaGFyICoqYXJndiwgaW50IGFyZ2MsIGNvbnN0IHN0cnVjdCBlYnRfdV9lbnRyeSAqZW50cnksCisgICB1bnNpZ25lZCBpbnQgKmZsYWdzLCBzdHJ1Y3QgZWJ0X2VudHJ5X3dhdGNoZXIgKip3YXRjaGVyKQoreworCXN0cnVjdCBlYnRfdWxvZ19pbmZvICp1bG9naW5mbzsKKwl1bnNpZ25lZCBpbnQgaTsKKwljaGFyICplbmQ7CisKKwl1bG9naW5mbyA9IChzdHJ1Y3QgZWJ0X3Vsb2dfaW5mbyAqKSgqd2F0Y2hlciktPmRhdGE7CisJc3dpdGNoIChjKSB7CisJY2FzZSBVTE9HX1BSRUZJWDoKKwkJaWYgKGVidF9jaGVja19pbnZlcnNlMihvcHRhcmcpKQorCQkJZ290byBpbnZlcnNlX2ludmFsaWQ7CisJCWVidF9jaGVja19vcHRpb24yKGZsYWdzLCBPUFRfUFJFRklYKTsKKwkJaWYgKHN0cmxlbihvcHRhcmcpID4gRUJUX1VMT0dfUFJFRklYX0xFTiAtIDEpCisJCQllYnRfcHJpbnRfZXJyb3IoIlByZWZpeCB0b28gbG9uZyBmb3IgdWxvZy1wcmVmaXgiKTsKKwkJc3RyY3B5KHVsb2dpbmZvLT5wcmVmaXgsIG9wdGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBVTE9HX05MR1JPVVA6CisJCWlmIChlYnRfY2hlY2tfaW52ZXJzZTIob3B0YXJnKSkKKwkJCWdvdG8gaW52ZXJzZV9pbnZhbGlkOworCQllYnRfY2hlY2tfb3B0aW9uMihmbGFncywgT1BUX05MR1JPVVApOworCQlpID0gc3RydG91bChvcHRhcmcsICZlbmQsIDEwKTsKKwkJaWYgKCplbmQgIT0gJ1wwJykKKwkJCWVidF9wcmludF9lcnJvcjIoIlByb2JsZW0gd2l0aCB1bG9nLW5sZ3JvdXA6ICVzIiwgb3B0YXJnKTsKKwkJaWYgKGkgPCAxIHx8IGkgPiBFQlRfVUxPR19NQVhOTEdST1VQUykKKwkJCWVidF9wcmludF9lcnJvcjIoInRoZSB1bG9nLW5sZ3JvdXAgbnVtYmVyIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAzMiIpOworCQl1bG9naW5mby0+bmxncm91cCA9IGkgLSAxOworCQlicmVhazsKKworCWNhc2UgVUxPR19DUFJBTkdFOgorCQlpZiAoZWJ0X2NoZWNrX2ludmVyc2UyKG9wdGFyZykpCisJCQlnb3RvIGludmVyc2VfaW52YWxpZDsKKwkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIE9QVF9DUFJBTkdFKTsKKwkJaSA9IHN0cnRvdWwob3B0YXJnLCAmZW5kLCAxMCk7CisJCWlmICgqZW5kICE9ICdcMCcpIHsKKwkJCWlmIChzdHJjYXNlY21wKG9wdGFyZywgQ1BfTk9fTElNSVRfUykpCisJCQkJZWJ0X3ByaW50X2Vycm9yMigiUHJvYmxlbSB3aXRoIHVsb2ctY3ByYW5nZTogJXMiLCBvcHRhcmcpOworCQkJaSA9IENQX05PX0xJTUlUX047CisJCX0KKwkJdWxvZ2luZm8tPmNwcmFuZ2UgPSBpOworCQlicmVhazsKKworCWNhc2UgVUxPR19RVEhSRVNIT0xEOgorCQlpZiAoZWJ0X2NoZWNrX2ludmVyc2UyKG9wdGFyZykpCisJCQlnb3RvIGludmVyc2VfaW52YWxpZDsKKwkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIE9QVF9RVEhSRVNIT0xEKTsKKwkJaSA9IHN0cnRvdWwob3B0YXJnLCAmZW5kLCAxMCk7CisJCWlmICgqZW5kICE9ICdcMCcpCisJCQllYnRfcHJpbnRfZXJyb3IyKCJQcm9ibGVtIHdpdGggdWxvZy1xdGhyZXNob2xkOiAlcyIsIG9wdGFyZyk7CisJCWlmIChpID4gRUJUX1VMT0dfTUFYX1FMRU4pCisJCQllYnRfcHJpbnRfZXJyb3IyKCJ1bG9nLXF0aHJlc2hvbGQgYXJndW1lbnQgJWQgZXhjZWVkcyB0aGUgbWF4aW11bSBvZiAlZCIsIGksIEVCVF9VTE9HX01BWF9RTEVOKTsKKwkJdWxvZ2luZm8tPnF0aHJlc2hvbGQgPSBpOworCQlicmVhazsKKwljYXNlIFVMT0dfVUxPRzoKKwkJaWYgKGVidF9jaGVja19pbnZlcnNlKG9wdGFyZykpCisJCQlnb3RvIGludmVyc2VfaW52YWxpZDsKKwkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIE9QVF9VTE9HKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7CisKK2ludmVyc2VfaW52YWxpZDoKKwllYnRfcHJpbnRfZXJyb3IoIlRoZSB1c2Ugb2YgJyEnIG1ha2VzIG5vIHNlbnNlIGZvciB0aGUgdWxvZyB3YXRjaGVyIik7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmFsX2NoZWNrKGNvbnN0IHN0cnVjdCBlYnRfdV9lbnRyeSAqZW50cnksCisgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X3dhdGNoZXIgKndhdGNoZXIsIGNvbnN0IGNoYXIgKm5hbWUsCisgICB1bnNpZ25lZCBpbnQgaG9va21hc2ssIHVuc2lnbmVkIGludCB0aW1lKQoreworfQorCitzdGF0aWMgdm9pZCBwcmludChjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeV93YXRjaGVyICp3YXRjaGVyKQoreworCXN0cnVjdCBlYnRfdWxvZ19pbmZvICp1bG9naW5mbyA9IChzdHJ1Y3QgZWJ0X3Vsb2dfaW5mbyAqKXdhdGNoZXItPmRhdGE7CisKKwlwcmludGYoIi0tdWxvZy1wcmVmaXggXCIlc1wiIC0tdWxvZy1ubGdyb3VwICVkIC0tdWxvZy1jcHJhbmdlICIsCisJICAgICAgIHVsb2dpbmZvLT5wcmVmaXgsIHVsb2dpbmZvLT5ubGdyb3VwICsgMSk7CisJaWYgKHVsb2dpbmZvLT5jcHJhbmdlID09IENQX05PX0xJTUlUX04pCisJCXByaW50ZihDUF9OT19MSU1JVF9TKTsKKwllbHNlCisJCXByaW50ZigiJWQiLCB1bG9naW5mby0+Y3ByYW5nZSk7CisJcHJpbnRmKCIgLS11bG9nLXF0aHJlc2hvbGQgJWQgIiwgdWxvZ2luZm8tPnF0aHJlc2hvbGQpOworfQorCitzdGF0aWMgaW50IGNvbXBhcmUoY29uc3Qgc3RydWN0IGVidF9lbnRyeV93YXRjaGVyICp3MSwKKyAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnlfd2F0Y2hlciAqdzIpCit7CisJc3RydWN0IGVidF91bG9nX2luZm8gKnVsb2dpbmZvMSA9IChzdHJ1Y3QgZWJ0X3Vsb2dfaW5mbyAqKXcxLT5kYXRhOworCXN0cnVjdCBlYnRfdWxvZ19pbmZvICp1bG9naW5mbzIgPSAoc3RydWN0IGVidF91bG9nX2luZm8gKil3Mi0+ZGF0YTsKKworCWlmICh1bG9naW5mbzEtPm5sZ3JvdXAgIT0gdWxvZ2luZm8yLT5ubGdyb3VwIHx8CisJICAgIHVsb2dpbmZvMS0+Y3ByYW5nZSAhPSB1bG9naW5mbzItPmNwcmFuZ2UgfHwKKwkgICAgdWxvZ2luZm8xLT5xdGhyZXNob2xkICE9IHVsb2dpbmZvMi0+cXRocmVzaG9sZCB8fAorCSAgICBzdHJjbXAodWxvZ2luZm8xLT5wcmVmaXgsIHVsb2dpbmZvMi0+cHJlZml4KSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWJ0X3Vfd2F0Y2hlciB1bG9nX3dhdGNoZXIgPQoreworCS5uYW1lCQk9ICJ1bG9nIiwKKwkuc2l6ZQkJPSBzaXplb2Yoc3RydWN0IGVidF91bG9nX2luZm8pLAorCS5oZWxwCQk9IHByaW50X2hlbHAsCisJLmluaXQJCT0gaW5pdCwKKwkucGFyc2UJCT0gcGFyc2UsCisJLmZpbmFsX2NoZWNrCT0gZmluYWxfY2hlY2ssCisJLnByaW50CQk9IHByaW50LAorCS5jb21wYXJlCT0gY29tcGFyZSwKKwkuZXh0cmFfb3BzCT0gb3B0cywKK307CisKK3N0YXRpYyB2b2lkIF9JTklUKHZvaWQpCit7CisJZWJ0X3JlZ2lzdGVyX3dhdGNoZXIoJnVsb2dfd2F0Y2hlcik7Cit9CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2VidF92bGFuLmMgYi9leHRlbnNpb25zL2VidF92bGFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgxOGQ0OAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZWJ0X3ZsYW4uYwpAQCAtMCwwICsxLDE4NyBAQAorLyogZWJ0X3ZsYW4KKyAqIAorICogQXV0aG9yczoKKyAqIEJhcnQgRGUgU2NodXltZXIgPGJkc2NodXltQHBhbmRvcmEuYmU+CisgKiBOaWNrIEZlZGNoaWsgPG5pY2tAZmVkY2hpay5vcmcudWE+IAorICoKKyAqIEp1bmUsIDIwMDIKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZWJ0YWJsZXNfdS5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZXRoZXJuZXRkYi5oIgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorCisjZGVmaW5lIE5BTUVfVkxBTl9JRCAgICAiaWQiCisjZGVmaW5lIE5BTUVfVkxBTl9QUklPICAicHJpbyIKKyNkZWZpbmUgTkFNRV9WTEFOX0VOQ0FQICJlbmNhcCIKKworI2RlZmluZSBWTEFOX0lEICAgICcxJworI2RlZmluZSBWTEFOX1BSSU8gICcyJworI2RlZmluZSBWTEFOX0VOQ0FQICczJworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBvcHRzW10gPSB7CisJeyJ2bGFuLWlkIiAgICwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIFZMQU5fSUR9LAorCXsidmxhbi1wcmlvIiAsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBWTEFOX1BSSU99LAorCXsidmxhbi1lbmNhcCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBWTEFOX0VOQ0FQfSwKKwl7IDAgfQorfTsKKworLyoKKyAqIG9wdGlvbiBpbnZlcnNlIGZsYWdzIGRlZmluaXRpb24gCisgKi8KKyNkZWZpbmUgT1BUX1ZMQU5fSUQgICAgIDB4MDEKKyNkZWZpbmUgT1BUX1ZMQU5fUFJJTyAgIDB4MDIKKyNkZWZpbmUgT1BUX1ZMQU5fRU5DQVAgIDB4MDQKKyNkZWZpbmUgT1BUX1ZMQU5fRkxBR1MJKE9QVF9WTEFOX0lEIHwgT1BUX1ZMQU5fUFJJTyB8IE9QVF9WTEFOX0VOQ0FQKQorCitzdHJ1Y3QgZXRoZXJ0eXBlZW50ICpldGhlbnQ7CisKK3N0YXRpYyB2b2lkIHByaW50X2hlbHAoKQoreworCXByaW50ZigKKyJ2bGFuIG9wdGlvbnM6XG4iCisiLS12bGFuLWlkIFshXSBpZCAgICAgICA6IHZsYW4tdGFnZ2VkIGZyYW1lIGlkZW50aWZpZXIsIDAsMS00MDk2IChpbnRlZ2VyKVxuIgorIi0tdmxhbi1wcmlvIFshXSBwcmlvICAgOiBQcmlvcml0eS10YWdnZWQgZnJhbWUncyB1c2VyIHByaW9yaXR5LCAwLTcgKGludGVnZXIpXG4iCisiLS12bGFuLWVuY2FwIFshXSBlbmNhcCA6IEVuY2Fwc3VsYXRlZCBmcmFtZSBwcm90b2NvbCAoaGV4YWRlY2ltYWwgb3IgbmFtZSlcbiIpOworfQorCitzdGF0aWMgdm9pZCBpbml0KHN0cnVjdCBlYnRfZW50cnlfbWF0Y2ggKm1hdGNoKQoreworCXN0cnVjdCBlYnRfdmxhbl9pbmZvICp2bGFuaW5mbyA9IChzdHJ1Y3QgZWJ0X3ZsYW5faW5mbyAqKSBtYXRjaC0+ZGF0YTsKKwl2bGFuaW5mby0+aW52ZmxhZ3MgPSAwOworCXZsYW5pbmZvLT5iaXRtYXNrID0gMDsKK30KKworCitzdGF0aWMgaW50IHBhcnNlKGludCBjLCBjaGFyICoqYXJndiwgaW50IGFyZ2MsIGNvbnN0IHN0cnVjdCBlYnRfdV9lbnRyeSAqZW50cnksCisgICB1bnNpZ25lZCBpbnQgKmZsYWdzLCBzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICoqbWF0Y2gpCit7CisJc3RydWN0IGVidF92bGFuX2luZm8gKnZsYW5pbmZvID0gKHN0cnVjdCBlYnRfdmxhbl9pbmZvICopICgqbWF0Y2gpLT5kYXRhOworCWNoYXIgKmVuZDsKKwlzdHJ1Y3QgZWJ0X3ZsYW5faW5mbyBsb2NhbDsKKworCXN3aXRjaCAoYykgeworCWNhc2UgVkxBTl9JRDoKKwkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIE9QVF9WTEFOX0lEKTsKKwkJaWYgKGVidF9jaGVja19pbnZlcnNlMihvcHRhcmcpKQorCQkJdmxhbmluZm8tPmludmZsYWdzIHw9IEVCVF9WTEFOX0lEOworCQlsb2NhbC5pZCA9IHN0cnRvdWwob3B0YXJnLCAmZW5kLCAxMCk7CisJCWlmIChsb2NhbC5pZCA+IDQwOTQgfHwgKmVuZCAhPSAnXDAnKQorCQkJZWJ0X3ByaW50X2Vycm9yMigiSW52YWxpZCAtLXZsYW4taWQgcmFuZ2UgKCclcycpIiwgb3B0YXJnKTsKKwkJdmxhbmluZm8tPmlkID0gbG9jYWwuaWQ7CisJCXZsYW5pbmZvLT5iaXRtYXNrIHw9IEVCVF9WTEFOX0lEOworCQlicmVhazsKKwljYXNlIFZMQU5fUFJJTzoKKwkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIE9QVF9WTEFOX1BSSU8pOworCQlpZiAoZWJ0X2NoZWNrX2ludmVyc2UyKG9wdGFyZykpCisJCQl2bGFuaW5mby0+aW52ZmxhZ3MgfD0gRUJUX1ZMQU5fUFJJTzsKKwkJbG9jYWwucHJpbyA9IHN0cnRvdWwob3B0YXJnLCAmZW5kLCAxMCk7CisJCWlmIChsb2NhbC5wcmlvID49IDggfHwgKmVuZCAhPSAnXDAnKQorCQkJZWJ0X3ByaW50X2Vycm9yMigiSW52YWxpZCAtLXZsYW4tcHJpbyByYW5nZSAoJyVzJykiLCBvcHRhcmcpOworCQl2bGFuaW5mby0+cHJpbyA9IGxvY2FsLnByaW87CisJCXZsYW5pbmZvLT5iaXRtYXNrIHw9IEVCVF9WTEFOX1BSSU87CisJCWJyZWFrOworCWNhc2UgVkxBTl9FTkNBUDoKKwkJZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsIE9QVF9WTEFOX0VOQ0FQKTsKKwkJaWYgKGVidF9jaGVja19pbnZlcnNlMihvcHRhcmcpKQorCQkJdmxhbmluZm8tPmludmZsYWdzIHw9IEVCVF9WTEFOX0VOQ0FQOworCQlsb2NhbC5lbmNhcCA9IHN0cnRvdWwob3B0YXJnLCAmZW5kLCAxNik7CisJCWlmICgqZW5kICE9ICdcMCcpIHsKKwkJCWV0aGVudCA9IGdldGV0aGVydHlwZWJ5bmFtZShvcHRhcmcpOworCQkJaWYgKGV0aGVudCA9PSBOVUxMKQorCQkJCWVidF9wcmludF9lcnJvcigiVW5rbm93biAtLXZsYW4tZW5jYXAgdmFsdWUgKCclcycpIiwgb3B0YXJnKTsKKwkJCWxvY2FsLmVuY2FwID0gZXRoZW50LT5lX2V0aGVydHlwZTsKKwkJfQorCQlpZiAobG9jYWwuZW5jYXAgPCBFVEhfWkxFTikKKwkJCWVidF9wcmludF9lcnJvcjIoIkludmFsaWQgLS12bGFuLWVuY2FwIHJhbmdlICgnJXMnKSIsIG9wdGFyZyk7CisJCXZsYW5pbmZvLT5lbmNhcCA9IGh0b25zKGxvY2FsLmVuY2FwKTsKKwkJdmxhbmluZm8tPmJpdG1hc2sgfD0gRUJUX1ZMQU5fRU5DQVA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBmaW5hbF9jaGVjayhjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbWF0Y2gsCisgICBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgaG9va21hc2ssIHVuc2lnbmVkIGludCB0aW1lKQoreworCWlmIChlbnRyeS0+ZXRocHJvdG8gIT0gRVRIX1BfODAyMVEgfHwgZW50cnktPmludmZsYWdzICYgRUJUX0lQUk9UTykKKwkJZWJ0X3ByaW50X2Vycm9yKCJGb3IgdmxhbiBmaWx0ZXJpbmcgdGhlIHByb3RvY29sIG11c3QgYmUgc3BlY2lmaWVkIGFzIDgwMl8xUSIpOworCisJLyogQ2hlY2sgaWYgc3BlY2lmaWVkIHZsYW4taWQ9MCAocHJpb3JpdHktdGFnZ2VkIGZyYW1lIGNvbmRpdGlvbikgCisJICogd2hlbiB2bGFuLXByaW8gd2FzIHNwZWNpZmllZC4gKi8KKwkvKiBJIHNlZSBubyByZWFzb24gd2h5IGEgdXNlciBzaG91bGQgYmUgcHJvaGliaXRlZCB0byBtYXRjaCBvbiBhIHBlcmhhcHMgaW1wb3NzaWJsZSBzaXR1YXRpb24gPEJEUz4KKwlpZiAodmxhbmluZm8tPmJpdG1hc2sgJiBFQlRfVkxBTl9QUklPICYmCisJICAgIHZsYW5pbmZvLT5pZCAmJiB2bGFuaW5mby0+Yml0bWFzayAmIEVCVF9WTEFOX0lEKQorCQllYnRfcHJpbnRfZXJyb3IoIldoZW4gc2V0dGluZyAtLXZsYW4tcHJpbyB0aGUgc3BlY2lmaWVkIC0tdmxhbi1pZCBtdXN0IGJlIDAiKTsqLworfQorCitzdGF0aWMgdm9pZCBwcmludChjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbWF0Y2gpCit7CisJc3RydWN0IGVidF92bGFuX2luZm8gKnZsYW5pbmZvID0gKHN0cnVjdCBlYnRfdmxhbl9pbmZvICopIG1hdGNoLT5kYXRhOworCisJaWYgKHZsYW5pbmZvLT5iaXRtYXNrICYgRUJUX1ZMQU5fSUQpIHsKKwkJcHJpbnRmKCItLXZsYW4taWQgJXMlZCAiLCAodmxhbmluZm8tPmludmZsYWdzICYgRUJUX1ZMQU5fSUQpID8gIiEgIiA6ICIiLCB2bGFuaW5mby0+aWQpOworCX0KKwlpZiAodmxhbmluZm8tPmJpdG1hc2sgJiBFQlRfVkxBTl9QUklPKSB7CisJCXByaW50ZigiLS12bGFuLXByaW8gJXMlZCAiLCAodmxhbmluZm8tPmludmZsYWdzICYgRUJUX1ZMQU5fUFJJTykgPyAiISAiIDogIiIsIHZsYW5pbmZvLT5wcmlvKTsKKwl9CisJaWYgKHZsYW5pbmZvLT5iaXRtYXNrICYgRUJUX1ZMQU5fRU5DQVApIHsKKwkJcHJpbnRmKCItLXZsYW4tZW5jYXAgJXMiLCAodmxhbmluZm8tPmludmZsYWdzICYgRUJUX1ZMQU5fRU5DQVApID8gIiEgIiA6ICIiKTsKKwkJZXRoZW50ID0gZ2V0ZXRoZXJ0eXBlYnludW1iZXIobnRvaHModmxhbmluZm8tPmVuY2FwKSk7CisJCWlmIChldGhlbnQgIT0gTlVMTCkgeworCQkJcHJpbnRmKCIlcyAiLCBldGhlbnQtPmVfbmFtZSk7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIiU0LjRYICIsIG50b2hzKHZsYW5pbmZvLT5lbmNhcCkpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGNvbXBhcmUoY29uc3Qgc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqdmxhbjEsCisgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICp2bGFuMikKK3sKKwlzdHJ1Y3QgZWJ0X3ZsYW5faW5mbyAqdmxhbmluZm8xID0gKHN0cnVjdCBlYnRfdmxhbl9pbmZvICopIHZsYW4xLT5kYXRhOworCXN0cnVjdCBlYnRfdmxhbl9pbmZvICp2bGFuaW5mbzIgPSAoc3RydWN0IGVidF92bGFuX2luZm8gKikgdmxhbjItPmRhdGE7CisKKwlpZiAodmxhbmluZm8xLT5iaXRtYXNrICE9IHZsYW5pbmZvMi0+Yml0bWFzaykKKwkJcmV0dXJuIDA7CisJaWYgKHZsYW5pbmZvMS0+aW52ZmxhZ3MgIT0gdmxhbmluZm8yLT5pbnZmbGFncykKKwkJcmV0dXJuIDA7CisJaWYgKHZsYW5pbmZvMS0+Yml0bWFzayAmIEVCVF9WTEFOX0lEICYmCisJICAgIHZsYW5pbmZvMS0+aWQgIT0gdmxhbmluZm8yLT5pZCkKKwkJcmV0dXJuIDA7CisJaWYgKHZsYW5pbmZvMS0+Yml0bWFzayAmIEVCVF9WTEFOX1BSSU8gJiYKKwkgICAgdmxhbmluZm8xLT5wcmlvICE9IHZsYW5pbmZvMi0+cHJpbykKKwkJcmV0dXJuIDA7CisJaWYgKHZsYW5pbmZvMS0+Yml0bWFzayAmIEVCVF9WTEFOX0VOQ0FQICYmCisJICAgIHZsYW5pbmZvMS0+ZW5jYXAgIT0gdmxhbmluZm8yLT5lbmNhcCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWJ0X3VfbWF0Y2ggdmxhbl9tYXRjaCA9IHsKKwkubmFtZQkJPSAidmxhbiIsCisJLnNpemUJCT0gc2l6ZW9mKHN0cnVjdCBlYnRfdmxhbl9pbmZvKSwKKwkuaGVscAkJPSBwcmludF9oZWxwLAorCS5pbml0CQk9IGluaXQsCisJLnBhcnNlCQk9IHBhcnNlLAorCS5maW5hbF9jaGVjawk9IGZpbmFsX2NoZWNrLAorCS5wcmludAkJPSBwcmludCwKKwkuY29tcGFyZQk9IGNvbXBhcmUsCisJLmV4dHJhX29wcwk9IG9wdHMsCit9OworCitzdGF0aWMgdm9pZCBfSU5JVCh2b2lkKQoreworCWVidF9yZWdpc3Rlcl9tYXRjaCgmdmxhbl9tYXRjaCk7Cit9CmRpZmYgLS1naXQgYS9leHRlbnNpb25zL2VidGFibGVfYnJvdXRlLmMgYi9leHRlbnNpb25zL2VidGFibGVfYnJvdXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEwNmYwOAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVuc2lvbnMvZWJ0YWJsZV9icm91dGUuYwpAQCAtMCwwICsxLDI5IEBACisvKiBlYnRhYmxlX2Jyb3V0ZQorICoKKyAqIEF1dGhvcnM6CisgKiBCYXJ0IERlIFNjaHV5bWVyIDxiZHNjaHV5bUBwYW5kb3JhLmJlPgorICoKKyAqIEFwcmlsLCAyMDAyCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiLi4vaW5jbHVkZS9lYnRhYmxlc191LmgiCisKKworc3RhdGljIHZvaWQgcHJpbnRfaGVscChjb25zdCBjaGFyICoqaG4pCit7CisJcHJpbnRmKCJTdXBwb3J0ZWQgY2hhaW4gZm9yIHRoZSBicm91dGUgdGFibGU6XG4iKTsKKwlwcmludGYoIiVzXG4iLGhuW05GX0JSX0JST1VUSU5HXSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QKK2VidF91X3RhYmxlIHRhYmxlID0KK3sKKwkubmFtZQkJPSAiYnJvdXRlIiwKKwkuaGVscAkJPSBwcmludF9oZWxwLAorfTsKKworc3RhdGljIHZvaWQgX0lOSVQodm9pZCkKK3sKKwllYnRfcmVnaXN0ZXJfdGFibGUoJnRhYmxlKTsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZWJ0YWJsZV9maWx0ZXIuYyBiL2V4dGVuc2lvbnMvZWJ0YWJsZV9maWx0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGJmMTA1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9lYnRhYmxlX2ZpbHRlci5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIGVidGFibGVfZmlsdGVyCisgKgorICogQXV0aG9yczoKKyAqIEJhcnQgRGUgU2NodXltZXIgPGJkc2NodXltQHBhbmRvcmEuYmU+CisgKgorICogQXByaWwsIDIwMDIKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICIuLi9pbmNsdWRlL2VidGFibGVzX3UuaCIKKworI2RlZmluZSBGSUxURVJfVkFMSURfSE9PS1MgKCgxIDw8IE5GX0JSX0xPQ0FMX0lOKSB8ICgxIDw8IE5GX0JSX0ZPUldBUkQpIHwgXAorICAgKDEgPDwgTkZfQlJfTE9DQUxfT1VUKSkKKworc3RhdGljIHZvaWQgcHJpbnRfaGVscChjb25zdCBjaGFyICoqaG4pCit7CisJaW50IGk7CisKKwlwcmludGYoIlN1cHBvcnRlZCBjaGFpbnMgZm9yIHRoZSBmaWx0ZXIgdGFibGU6XG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgTkZfQlJfTlVNSE9PS1M7IGkrKykKKwkJaWYgKEZJTFRFUl9WQUxJRF9IT09LUyAmICgxIDw8IGkpKQorCQkJcHJpbnRmKCIlcyAiLCBobltpXSk7CisJcHJpbnRmKCJcbiIpOworfQorCitzdGF0aWMgc3RydWN0IGVidF91X3RhYmxlIHRhYmxlID0KK3sKKwkubmFtZQkJPSAiZmlsdGVyIiwKKwkuaGVscAkJPSBwcmludF9oZWxwLAorfTsKKworc3RhdGljIHZvaWQgX0lOSVQodm9pZCkKK3sKKwllYnRfcmVnaXN0ZXJfdGFibGUoJnRhYmxlKTsKK30KZGlmZiAtLWdpdCBhL2V4dGVuc2lvbnMvZWJ0YWJsZV9uYXQuYyBiL2V4dGVuc2lvbnMvZWJ0YWJsZV9uYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTA0NDgyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZW5zaW9ucy9lYnRhYmxlX25hdC5jCkBAIC0wLDAgKzEsMzYgQEAKKy8qIGVidGFibGVfbmF0CisgKgorICogQXV0aG9yczoKKyAqIEJhcnQgRGUgU2NodXltZXIgPGJkc2NodXltQHBhbmRvcmEuYmU+CisgKgorICogQXByaWwsIDIwMDIKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICIuLi9pbmNsdWRlL2VidGFibGVzX3UuaCIKKworI2RlZmluZSBOQVRfVkFMSURfSE9PS1MgKCgxIDw8IE5GX0JSX1BSRV9ST1VUSU5HKSB8ICgxIDw8IE5GX0JSX0xPQ0FMX09VVCkgfCBcCisgICAoMSA8PCBORl9CUl9QT1NUX1JPVVRJTkcpKQorCitzdGF0aWMgdm9pZCBwcmludF9oZWxwKGNvbnN0IGNoYXIgKipobikKK3sKKwlpbnQgaTsKKworCXByaW50ZigiU3VwcG9ydGVkIGNoYWlucyBmb3IgdGhlIG5hdCB0YWJsZTpcbiIpOworCWZvciAoaSA9IDA7IGkgPCBORl9CUl9OVU1IT09LUzsgaSsrKQorCQlpZiAoTkFUX1ZBTElEX0hPT0tTICYgKDEgPDwgaSkpCisJCQlwcmludGYoIiVzICIsIGhuW2ldKTsKKwlwcmludGYoIlxuIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QKK2VidF91X3RhYmxlIHRhYmxlID0KK3sKKwkubmFtZQkJPSAibmF0IiwKKwkuaGVscAkJPSBwcmludF9oZWxwLAorfTsKKworc3RhdGljIHZvaWQgX0lOSVQodm9pZCkKK3sKKwllYnRfcmVnaXN0ZXJfdGFibGUoJnRhYmxlKTsKK30KZGlmZiAtLWdpdCBhL2dldGV0aGVydHlwZS5jIGIvZ2V0ZXRoZXJ0eXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRlNDgxMgotLS0gL2Rldi9udWxsCisrKyBiL2dldGV0aGVydHlwZS5jCkBAIC0wLDAgKzEsMTYxIEBACisvKgorKiBnZXRldGhlcnR5cGUuYworKgorKiBUaGlzIGZpbGUgd2FzIHBhcnQgb2YgdGhlIE5ZUyBMaWJyYXJ5LgorKgorKiogVGhlIE5ZUyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKiogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworKiogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisqKiBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRGVzY3JpcHRpb246IEV0aGVydHlwZSBuYW1lIHNlcnZpY2Ugc3dpdGNoIGFuZCB0aGUgZXRoZXJ0eXBlcyAKKyogZGF0YWJhc2UgYWNjZXNzIGZ1bmN0aW9ucworKiBBdXRob3I6IE5pY2sgRmVkY2hpayA8Zm5tQHVrcnNhdC5jb20+CisqIENoZWNrZXI6IEJhcnQgRGUgU2NodXltZXIgPGJkc2NodXltQHBhbmRvcmEuYmU+CisqIE9yaWdpbjogdUNsaWJjLTAuOS4xNi9saWJjL2luZXQvZ2V0cHJvdG8uYworKiBDcmVhdGVkIGF0OiBNb24gTm92IDExIDEyOjIwOjExIEVFVCAyMDAyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG5ldGluZXQvZXRoZXIuaD4KKyNpbmNsdWRlIDxuZXQvZXRoZXJuZXQuaD4KKworI2luY2x1ZGUgImV0aGVybmV0ZGIuaCIKKworI2RlZmluZQlNQVhBTElBU0VTCTM1CisKK3N0YXRpYyBGSUxFICpldGhlcmYgPSBOVUxMOworc3RhdGljIGNoYXIgbGluZVtCVUZTSVogKyAxXTsKK3N0YXRpYyBzdHJ1Y3QgZXRoZXJ0eXBlZW50IGV0X2VudDsKK3N0YXRpYyBjaGFyICpldGhlcnR5cGVfYWxpYXNlc1tNQVhBTElBU0VTXTsKK3N0YXRpYyBpbnQgZXRoZXJ0eXBlX3N0YXlvcGVuOworCit2b2lkIHNldGV0aGVydHlwZWVudChpbnQgZikKK3sKKwlpZiAoZXRoZXJmID09IE5VTEwpCisJCWV0aGVyZiA9IGZvcGVuKF9QQVRIX0VUSEVSVFlQRVMsICJyIik7CisJZWxzZQorCQlyZXdpbmQoZXRoZXJmKTsKKwlldGhlcnR5cGVfc3RheW9wZW4gfD0gZjsKK30KKwordm9pZCBlbmRldGhlcnR5cGVlbnQodm9pZCkKK3sKKwlpZiAoZXRoZXJmKSB7CisJCWZjbG9zZShldGhlcmYpOworCQlldGhlcmYgPSBOVUxMOworCX0KKwlldGhlcnR5cGVfc3RheW9wZW4gPSAwOworfQorCitzdHJ1Y3QgZXRoZXJ0eXBlZW50ICpnZXRldGhlcnR5cGVlbnQodm9pZCkKK3sKKwljaGFyICplOworCWNoYXIgKmVuZHB0cjsKKwlyZWdpc3RlciBjaGFyICpjcCwgKipxOworCisJaWYgKGV0aGVyZiA9PSBOVUxMCisJICAgICYmIChldGhlcmYgPSBmb3BlbihfUEFUSF9FVEhFUlRZUEVTLCAiciIpKSA9PSBOVUxMKSB7CisJCXJldHVybiAoTlVMTCk7CisJfQorCithZ2FpbjoKKwlpZiAoKGUgPSBmZ2V0cyhsaW5lLCBCVUZTSVosIGV0aGVyZikpID09IE5VTEwpIHsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJaWYgKCplID09ICcjJykKKwkJZ290byBhZ2FpbjsKKwljcCA9IHN0cnBicmsoZSwgIiNcbiIpOworCWlmIChjcCA9PSBOVUxMKQorCQlnb3RvIGFnYWluOworCSpjcCA9ICdcMCc7CisJZXRfZW50LmVfbmFtZSA9IGU7CisJY3AgPSBzdHJwYnJrKGUsICIgXHQiKTsKKwlpZiAoY3AgPT0gTlVMTCkKKwkJZ290byBhZ2FpbjsKKwkqY3ArKyA9ICdcMCc7CisJd2hpbGUgKCpjcCA9PSAnICcgfHwgKmNwID09ICdcdCcpCisJCWNwKys7CisJZSA9IHN0cnBicmsoY3AsICIgXHQiKTsKKwlpZiAoZSAhPSBOVUxMKQorCQkqZSsrID0gJ1wwJzsKKy8vIENoZWNrIHBvaW50CisJZXRfZW50LmVfZXRoZXJ0eXBlID0gc3RydG9sKGNwLCAmZW5kcHRyLCAxNik7CisJaWYgKCplbmRwdHIgIT0gJ1wwJworCSAgICB8fCAoZXRfZW50LmVfZXRoZXJ0eXBlIDwgRVRIX1pMRU4KKwkJfHwgZXRfZW50LmVfZXRoZXJ0eXBlID4gMHhGRkZGKSkKKwkJZ290byBhZ2FpbjsJLy8gU2tpcCBpbnZhbGlkIGV0aGVycHJvdG8gdHlwZSBlbnRyeQorCXEgPSBldF9lbnQuZV9hbGlhc2VzID0gZXRoZXJ0eXBlX2FsaWFzZXM7CisJaWYgKGUgIT0gTlVMTCkgeworCQljcCA9IGU7CisJCXdoaWxlIChjcCAmJiAqY3ApIHsKKwkJCWlmICgqY3AgPT0gJyAnIHx8ICpjcCA9PSAnXHQnKSB7CisJCQkJY3ArKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChxIDwgJmV0aGVydHlwZV9hbGlhc2VzW01BWEFMSUFTRVMgLSAxXSkKKwkJCQkqcSsrID0gY3A7CisJCQljcCA9IHN0cnBicmsoY3AsICIgXHQiKTsKKwkJCWlmIChjcCAhPSBOVUxMKQorCQkJCSpjcCsrID0gJ1wwJzsKKwkJfQorCX0KKwkqcSA9IE5VTEw7CisJcmV0dXJuICgmZXRfZW50KTsKK30KKworCitzdHJ1Y3QgZXRoZXJ0eXBlZW50ICpnZXRldGhlcnR5cGVieW5hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgZXRoZXJ0eXBlZW50ICplOworCXJlZ2lzdGVyIGNoYXIgKipjcDsKKworCXNldGV0aGVydHlwZWVudChldGhlcnR5cGVfc3RheW9wZW4pOworCXdoaWxlICgoZSA9IGdldGV0aGVydHlwZWVudCgpKSAhPSBOVUxMKSB7CisJCWlmIChzdHJjYXNlY21wKGUtPmVfbmFtZSwgbmFtZSkgPT0gMCkKKwkJCWJyZWFrOworCQlmb3IgKGNwID0gZS0+ZV9hbGlhc2VzOyAqY3AgIT0gMDsgY3ArKykKKwkJCWlmIChzdHJjYXNlY21wKCpjcCwgbmFtZSkgPT0gMCkKKwkJCQlnb3RvIGZvdW5kOworCX0KK2ZvdW5kOgorCWlmICghZXRoZXJ0eXBlX3N0YXlvcGVuKQorCQllbmRldGhlcnR5cGVlbnQoKTsKKwlyZXR1cm4gKGUpOworfQorCitzdHJ1Y3QgZXRoZXJ0eXBlZW50ICpnZXRldGhlcnR5cGVieW51bWJlcihpbnQgdHlwZSkKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgZXRoZXJ0eXBlZW50ICplOworCisJc2V0ZXRoZXJ0eXBlZW50KGV0aGVydHlwZV9zdGF5b3Blbik7CisJd2hpbGUgKChlID0gZ2V0ZXRoZXJ0eXBlZW50KCkpICE9IE5VTEwpCisJCWlmIChlLT5lX2V0aGVydHlwZSA9PSB0eXBlKQorCQkJYnJlYWs7CisJaWYgKCFldGhlcnR5cGVfc3RheW9wZW4pCisJCWVuZGV0aGVydHlwZWVudCgpOworCXJldHVybiAoZSk7Cit9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2VidGFibGVzX3UuaCBiL2luY2x1ZGUvZWJ0YWJsZXNfdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMWIyODIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2VidGFibGVzX3UuaApAQCAtMCwwICsxLDQwNyBAQAorLyoKKyAqICRJZDogZWJ0YWJsZXMuYyx2IDEuMDMgMjAwMi8wMS8xOQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEJhcnQgRGUgU2NodXltZXIKKyAqCisgKiAgVGhpcyBjb2RlIGlzIHN0b25nbHkgaW5zcGlyZWQgb24gdGhlIGlwdGFibGVzIGNvZGUgd2hpY2ggaXMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTkgUGF1bCBgUnVzdHknIFJ1c3NlbGwgJiBNaWNoYWVsIEouIE5ldWxpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIEVCVEFCTEVTX1VfSAorI2RlZmluZSBFQlRBQkxFU19VX0gKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKworI2lmbmRlZiBJUFBST1RPX1NDVFAKKyNkZWZpbmUgSVBQUk9UT19TQ1RQCQkxMzIKKyNlbmRpZgorI2lmbmRlZiBJUFBST1RPX0RDQ1AKKyNkZWZpbmUgSVBQUk9UT19EQ0NQCQkzMworI2VuZGlmCisKKyNkZWZpbmUgRVhFQ19TVFlMRV9QUkcJCTAKKyNkZWZpbmUgRVhFQ19TVFlMRV9EQUVNT04JMQorCisjaWZuZGVmIEVCVF9NSU5fQUxJR04KKyNkZWZpbmUgRUJUX01JTl9BTElHTiAoX19hbGlnbm9mX18oc3RydWN0IF94dF9hbGlnbikpCisjZW5kaWYKKyNkZWZpbmUgRUJUX0FMSUdOKHMpICgoKHMpICsgKEVCVF9NSU5fQUxJR04tMSkpICYgfihFQlRfTUlOX0FMSUdOLTEpKQorI2RlZmluZSBFUlJPUk1TR19NQVhMRU4gMTI4CisKKyNkZWZpbmUgX0lOSVQgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSBfaW5pdAorCitzdHJ1Y3QgZWJ0X3VfZW50cmllcworeworCWludCBwb2xpY3k7CisJdW5zaWduZWQgaW50IG5lbnRyaWVzOworCS8qIGNvdW50ZXIgb2Zmc2V0IGZvciB0aGlzIGNoYWluICovCisJdW5zaWduZWQgaW50IGNvdW50ZXJfb2Zmc2V0OworCS8qIHVzZWQgZm9yIHVkYyAqLworCXVuc2lnbmVkIGludCBob29rX21hc2s7CisJY2hhciAqa2VybmVsX3N0YXJ0OworCWNoYXIgbmFtZVtFQlRfQ0hBSU5fTUFYTkFNRUxFTl07CisJc3RydWN0IGVidF91X2VudHJ5ICplbnRyaWVzOworfTsKKworc3RydWN0IGVidF9jbnRjaGFuZ2VzCit7CisJdW5zaWduZWQgc2hvcnQgdHlwZTsKKwl1bnNpZ25lZCBzaG9ydCBjaGFuZ2U7IC8qIGRldGVybWluZXMgaW5jcmVtZW50YWwvZGVjcmVtZW50YWwvY2hhbmdlICovCisJc3RydWN0IGVidF9jbnRjaGFuZ2VzICpwcmV2OworCXN0cnVjdCBlYnRfY250Y2hhbmdlcyAqbmV4dDsKK307CisKKyNkZWZpbmUgRUJUX09SSV9NQVhfQ0hBSU5TIDEwCitzdHJ1Y3QgZWJ0X3VfcmVwbGFjZQoreworCWNoYXIgbmFtZVtFQlRfVEFCTEVfTUFYTkFNRUxFTl07CisJdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzOworCS8qIG5yIG9mIHJ1bGVzIGluIHRoZSB0YWJsZSAqLworCXVuc2lnbmVkIGludCBuZW50cmllczsKKwl1bnNpZ25lZCBpbnQgbnVtX2NoYWluczsKKwl1bnNpZ25lZCBpbnQgbWF4X2NoYWluczsKKwlzdHJ1Y3QgZWJ0X3VfZW50cmllcyAqKmNoYWluczsKKwkvKiBuciBvZiBjb3VudGVycyB1c2Vyc3BhY2UgZXhwZWN0cyBiYWNrICovCisJdW5zaWduZWQgaW50IG51bV9jb3VudGVyczsKKwkvKiB3aGVyZSB0aGUga2VybmVsIHdpbGwgcHV0IHRoZSBvbGQgY291bnRlcnMgKi8KKwlzdHJ1Y3QgZWJ0X2NvdW50ZXIgKmNvdW50ZXJzOworCS8qCisJICogY2FuIGJlIHVzZWQgZS5nLiB0byBrbm93IGlmIGEgc3RhbmRhcmQgb3B0aW9uCisJICogaGFzIGJlZW4gc3BlY2lmaWVkIHR3aWNlCisJICovCisJdW5zaWduZWQgaW50IGZsYWdzOworCS8qIHdlIHN0aWNrIHRoZSBzcGVjaWZpZWQgY29tbWFuZCAoZS5nLiAtQSkgaW4gaGVyZSAqLworCWNoYXIgY29tbWFuZDsKKwkvKgorCSAqIGhlcmUgd2Ugc3RpY2sgdGhlIGNoYWluIHRvIGRvIG91ciB0aGluZyBvbiAoY2FuIGJlIC0xIGlmIHVuc3BlY2lmaWVkKQorCSAqLworCWludCBzZWxlY3RlZF9jaGFpbjsKKwkvKiB1c2VkIGZvciB0aGUgYXRvbWljIG9wdGlvbiAqLworCWNoYXIgKmZpbGVuYW1lOworCS8qIHRlbGxzIHdoYXQgaGFwcGVuZWQgdG8gdGhlIG9sZCBydWxlcyAoY291bnRlciBjaGFuZ2VzKSAqLworCXN0cnVjdCBlYnRfY250Y2hhbmdlcyAqY2M7Cit9OworCitzdHJ1Y3QgZWJ0X3VfdGFibGUKK3sKKwljaGFyIG5hbWVbRUJUX1RBQkxFX01BWE5BTUVMRU5dOworCXZvaWQgKCpjaGVjaykoc3RydWN0IGVidF91X3JlcGxhY2UgKnJlcGwpOworCXZvaWQgKCpoZWxwKShjb25zdCBjaGFyICoqKTsKKwlzdHJ1Y3QgZWJ0X3VfdGFibGUgKm5leHQ7Cit9OworCitzdHJ1Y3QgZWJ0X3VfbWF0Y2hfbGlzdAoreworCXN0cnVjdCBlYnRfdV9tYXRjaF9saXN0ICpuZXh0OworCXN0cnVjdCBlYnRfZW50cnlfbWF0Y2ggKm07Cit9OworCitzdHJ1Y3QgZWJ0X3Vfd2F0Y2hlcl9saXN0Cit7CisJc3RydWN0IGVidF91X3dhdGNoZXJfbGlzdCAqbmV4dDsKKwlzdHJ1Y3QgZWJ0X2VudHJ5X3dhdGNoZXIgKnc7Cit9OworCitzdHJ1Y3QgZWJ0X3VfZW50cnkKK3sKKwl1bnNpZ25lZCBpbnQgYml0bWFzazsKKwl1bnNpZ25lZCBpbnQgaW52ZmxhZ3M7CisJdWludDE2X3QgZXRocHJvdG87CisJY2hhciBpbltJRk5BTVNJWl07CisJY2hhciBsb2dpY2FsX2luW0lGTkFNU0laXTsKKwljaGFyIG91dFtJRk5BTVNJWl07CisJY2hhciBsb2dpY2FsX291dFtJRk5BTVNJWl07CisJdW5zaWduZWQgY2hhciBzb3VyY2VtYWNbRVRIX0FMRU5dOworCXVuc2lnbmVkIGNoYXIgc291cmNlbXNrW0VUSF9BTEVOXTsKKwl1bnNpZ25lZCBjaGFyIGRlc3RtYWNbRVRIX0FMRU5dOworCXVuc2lnbmVkIGNoYXIgZGVzdG1za1tFVEhfQUxFTl07CisJc3RydWN0IGVidF91X21hdGNoX2xpc3QgKm1fbGlzdDsKKwlzdHJ1Y3QgZWJ0X3Vfd2F0Y2hlcl9saXN0ICp3X2xpc3Q7CisJc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKnQ7CisJc3RydWN0IGVidF91X2VudHJ5ICpwcmV2OworCXN0cnVjdCBlYnRfdV9lbnRyeSAqbmV4dDsKKwlzdHJ1Y3QgZWJ0X2NvdW50ZXIgY250OworCXN0cnVjdCBlYnRfY291bnRlciBjbnRfc3VycGx1czsgLyogZm9yIGluY3JlYXNpbmcvZGVjcmVhc2luZyBhIGNvdW50ZXIgYW5kIGZvciBvcHRpb24gJ0MnICovCisJc3RydWN0IGVidF9jbnRjaGFuZ2VzICpjYzsKKwkvKiB0aGUgc3RhbmRhcmQgdGFyZ2V0IG5lZWRzIHRoaXMgdG8ga25vdyB0aGUgbmFtZSBvZiBhIHVkYyB3aGVuCisJICogcHJpbnRpbmcgb3V0IHJ1bGVzLiAqLworCXN0cnVjdCBlYnRfdV9yZXBsYWNlICpyZXBsYWNlOworfTsKKworc3RydWN0IGVidF91X21hdGNoCit7CisJY2hhciBuYW1lW0VCVF9GVU5DVElPTl9NQVhOQU1FTEVOXTsKKwl1aW50OF90IHJldmlzaW9uOworCS8qIHNpemUgb2YgdGhlIHJlYWwgbWF0Y2ggZGF0YSAqLworCXVuc2lnbmVkIGludCBzaXplOworCXZvaWQgKCpoZWxwKSh2b2lkKTsKKwl2b2lkICgqaW5pdCkoc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbSk7CisJaW50ICgqcGFyc2UpKGludCBjLCBjaGFyICoqYXJndiwgaW50IGFyZ2MsCisJICAgICAgICBjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LCB1bnNpZ25lZCBpbnQgKmZsYWdzLAorCSAgICAgICAgc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqKm1hdGNoKTsKKwl2b2lkICgqZmluYWxfY2hlY2spKGNvbnN0IHN0cnVjdCBlYnRfdV9lbnRyeSAqZW50cnksCisJICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqbWF0Y2gsCisJICAgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IGhvb2ttYXNrLCB1bnNpZ25lZCBpbnQgdGltZSk7CisJdm9pZCAoKnByaW50KShjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorCSAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnlfbWF0Y2ggKm1hdGNoKTsKKwlpbnQgKCpjb21wYXJlKShjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICptMSwKKwkgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICptMik7CisJY29uc3Qgc3RydWN0IG9wdGlvbiAqZXh0cmFfb3BzOworCS8qCisJICogY2FuIGJlIHVzZWQgZS5nLiB0byBjaGVjayBmb3IgbXVsdGlwbGUgb2NjdXJhbmNlIG9mIHRoZSBzYW1lIG9wdGlvbgorCSAqLworCXVuc2lnbmVkIGludCBmbGFnczsKKwl1bnNpZ25lZCBpbnQgb3B0aW9uX29mZnNldDsKKwlzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICptOworCS8qCisJICogaWYgdXNlZCA9PSAxIHdlIG5vIGxvbmdlciBoYXZlIHRvIGFkZCBpdCB0bworCSAqIHRoZSBtYXRjaCBjaGFpbiBvZiB0aGUgbmV3IGVudHJ5CisJICogYmUgc3VyZSB0byBwdXQgaXQgYmFjayBvbiAwIHdoZW4gZmluaXNoZWQKKwkgKi8KKwl1bnNpZ25lZCBpbnQgdXNlZDsKKwlzdHJ1Y3QgZWJ0X3VfbWF0Y2ggKm5leHQ7Cit9OworCitzdHJ1Y3QgZWJ0X3Vfd2F0Y2hlcgoreworCWNoYXIgbmFtZVtFQlRfRlVOQ1RJT05fTUFYTkFNRUxFTl07CisJdW5zaWduZWQgaW50IHNpemU7CisJdm9pZCAoKmhlbHApKHZvaWQpOworCXZvaWQgKCppbml0KShzdHJ1Y3QgZWJ0X2VudHJ5X3dhdGNoZXIgKncpOworCWludCAoKnBhcnNlKShpbnQgYywgY2hhciAqKmFyZ3YsIGludCBhcmdjLAorCSAgIGNvbnN0IHN0cnVjdCBlYnRfdV9lbnRyeSAqZW50cnksIHVuc2lnbmVkIGludCAqZmxhZ3MsCisJICAgc3RydWN0IGVidF9lbnRyeV93YXRjaGVyICoqd2F0Y2hlcik7CisJdm9pZCAoKmZpbmFsX2NoZWNrKShjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorCSAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnlfd2F0Y2hlciAqd2F0Y2gsIGNvbnN0IGNoYXIgKm5hbWUsCisJICAgdW5zaWduZWQgaW50IGhvb2ttYXNrLCB1bnNpZ25lZCBpbnQgdGltZSk7CisJdm9pZCAoKnByaW50KShjb25zdCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmVudHJ5LAorCSAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnlfd2F0Y2hlciAqd2F0Y2hlcik7CisJaW50ICgqY29tcGFyZSkoY29uc3Qgc3RydWN0IGVidF9lbnRyeV93YXRjaGVyICp3MSwKKwkgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X3dhdGNoZXIgKncyKTsKKwljb25zdCBzdHJ1Y3Qgb3B0aW9uICpleHRyYV9vcHM7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGludCBvcHRpb25fb2Zmc2V0OworCXN0cnVjdCBlYnRfZW50cnlfd2F0Y2hlciAqdzsKKwl1bnNpZ25lZCBpbnQgdXNlZDsKKwlzdHJ1Y3QgZWJ0X3Vfd2F0Y2hlciAqbmV4dDsKK307CisKK3N0cnVjdCBlYnRfdV90YXJnZXQKK3sKKwljaGFyIG5hbWVbRUJUX0ZVTkNUSU9OX01BWE5BTUVMRU5dOworCXVuc2lnbmVkIGludCBzaXplOworCXZvaWQgKCpoZWxwKSh2b2lkKTsKKwl2b2lkICgqaW5pdCkoc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKnQpOworCWludCAoKnBhcnNlKShpbnQgYywgY2hhciAqKmFyZ3YsIGludCBhcmdjLAorCSAgIGNvbnN0IHN0cnVjdCBlYnRfdV9lbnRyeSAqZW50cnksIHVuc2lnbmVkIGludCAqZmxhZ3MsCisJICAgc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKip0YXJnZXQpOworCXZvaWQgKCpmaW5hbF9jaGVjaykoY29uc3Qgc3RydWN0IGVidF91X2VudHJ5ICplbnRyeSwKKwkgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdGFyZ2V0LCBjb25zdCBjaGFyICpuYW1lLAorCSAgIHVuc2lnbmVkIGludCBob29rbWFzaywgdW5zaWduZWQgaW50IHRpbWUpOworCXZvaWQgKCpwcmludCkoY29uc3Qgc3RydWN0IGVidF91X2VudHJ5ICplbnRyeSwKKwkgICBjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdGFyZ2V0KTsKKwlpbnQgKCpjb21wYXJlKShjb25zdCBzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdDEsCisJICAgY29uc3Qgc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKnQyKTsKKwljb25zdCBzdHJ1Y3Qgb3B0aW9uICpleHRyYV9vcHM7CisJdW5zaWduZWQgaW50IG9wdGlvbl9vZmZzZXQ7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICp0OworCXVuc2lnbmVkIGludCB1c2VkOworCXN0cnVjdCBlYnRfdV90YXJnZXQgKm5leHQ7Cit9OworCisKK3N0cnVjdCBlYnRfaWNtcF9uYW1lcyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1aW50OF90IHR5cGU7CisJdWludDhfdCBjb2RlX21pbiwgY29kZV9tYXg7Cit9OworCisKKworLyogbGliZWJ0Yy5jICovCisKK2V4dGVybiBzdHJ1Y3QgZWJ0X3VfdGFibGUgKmVidF90YWJsZXM7CitleHRlcm4gc3RydWN0IGVidF91X21hdGNoICplYnRfbWF0Y2hlczsKK2V4dGVybiBzdHJ1Y3QgZWJ0X3Vfd2F0Y2hlciAqZWJ0X3dhdGNoZXJzOworZXh0ZXJuIHN0cnVjdCBlYnRfdV90YXJnZXQgKmVidF90YXJnZXRzOworCitleHRlcm4gaW50IHVzZV9sb2NrZmQ7CisKK3ZvaWQgZWJ0X3JlZ2lzdGVyX3RhYmxlKHN0cnVjdCBlYnRfdV90YWJsZSAqKTsKK3ZvaWQgZWJ0X3JlZ2lzdGVyX21hdGNoKHN0cnVjdCBlYnRfdV9tYXRjaCAqKTsKK3ZvaWQgZWJ0X3JlZ2lzdGVyX3dhdGNoZXIoc3RydWN0IGVidF91X3dhdGNoZXIgKik7Cit2b2lkIGVidF9yZWdpc3Rlcl90YXJnZXQoc3RydWN0IGVidF91X3RhcmdldCAqdCk7CitpbnQgZWJ0X2dldF9rZXJuZWxfdGFibGUoc3RydWN0IGVidF91X3JlcGxhY2UgKnJlcGxhY2UsIGludCBpbml0KTsKK3N0cnVjdCBlYnRfdV90YXJnZXQgKmVidF9maW5kX3RhcmdldChjb25zdCBjaGFyICpuYW1lKTsKK3N0cnVjdCBlYnRfdV9tYXRjaCAqZWJ0X2ZpbmRfbWF0Y2goY29uc3QgY2hhciAqbmFtZSk7CitzdHJ1Y3QgZWJ0X3Vfd2F0Y2hlciAqZWJ0X2ZpbmRfd2F0Y2hlcihjb25zdCBjaGFyICpuYW1lKTsKK3N0cnVjdCBlYnRfdV90YWJsZSAqZWJ0X2ZpbmRfdGFibGUoY29uc3QgY2hhciAqbmFtZSk7CitpbnQgZWJ0YWJsZXNfaW5zbW9kKGNvbnN0IGNoYXIgKm1vZG5hbWUpOwordm9pZCBlYnRfbGlzdF9leHRlbnNpb25zKCk7Cit2b2lkIGVidF9pbml0aWFsaXplX2VudHJ5KHN0cnVjdCBlYnRfdV9lbnRyeSAqZSk7Cit2b2lkIGVidF9jbGVhbnVwX3JlcGxhY2Uoc3RydWN0IGVidF91X3JlcGxhY2UgKnJlcGxhY2UpOwordm9pZCBlYnRfcmVpbml0X2V4dGVuc2lvbnMoKTsKK3ZvaWQgZWJ0X2RvdWJsZV9jaGFpbnMoc3RydWN0IGVidF91X3JlcGxhY2UgKnJlcGxhY2UpOwordm9pZCBlYnRfZnJlZV91X2VudHJ5KHN0cnVjdCBlYnRfdV9lbnRyeSAqZSk7CitzdHJ1Y3QgZWJ0X3VfZW50cmllcyAqZWJ0X25hbWVfdG9fY2hhaW4oY29uc3Qgc3RydWN0IGVidF91X3JlcGxhY2UgKnJlcGxhY2UsCisJCQkJICAgIGNvbnN0IGNoYXIqIGFyZyk7CitzdHJ1Y3QgZWJ0X3VfZW50cmllcyAqZWJ0X25hbWVfdG9fY2hhaW4oY29uc3Qgc3RydWN0IGVidF91X3JlcGxhY2UgKnJlcGxhY2UsCisJCQkJICAgIGNvbnN0IGNoYXIqIGFyZyk7CitpbnQgZWJ0X2dldF9jaGFpbm5yKGNvbnN0IHN0cnVjdCBlYnRfdV9yZXBsYWNlICpyZXBsYWNlLCBjb25zdCBjaGFyKiBhcmcpOworLyoqLwordm9pZCBlYnRfY2hhbmdlX3BvbGljeShzdHJ1Y3QgZWJ0X3VfcmVwbGFjZSAqcmVwbGFjZSwgaW50IHBvbGljeSk7Cit2b2lkIGVidF9mbHVzaF9jaGFpbnMoc3RydWN0IGVidF91X3JlcGxhY2UgKnJlcGxhY2UpOworaW50IGVidF9jaGVja19ydWxlX2V4aXN0cyhzdHJ1Y3QgZWJ0X3VfcmVwbGFjZSAqcmVwbGFjZSwKKwkJCSAgc3RydWN0IGVidF91X2VudHJ5ICpuZXdfZW50cnkpOwordm9pZCBlYnRfYWRkX3J1bGUoc3RydWN0IGVidF91X3JlcGxhY2UgKnJlcGxhY2UsIHN0cnVjdCBlYnRfdV9lbnRyeSAqbmV3X2VudHJ5LAorCQkgIGludCBydWxlX25yKTsKK3ZvaWQgZWJ0X2RlbGV0ZV9ydWxlKHN0cnVjdCBlYnRfdV9yZXBsYWNlICpyZXBsYWNlLAorCQkgICAgIHN0cnVjdCBlYnRfdV9lbnRyeSAqbmV3X2VudHJ5LCBpbnQgYmVnaW4sIGludCBlbmQpOwordm9pZCBlYnRfemVyb19jb3VudGVycyhzdHJ1Y3QgZWJ0X3VfcmVwbGFjZSAqcmVwbGFjZSk7Cit2b2lkIGVidF9jaGFuZ2VfY291bnRlcnMoc3RydWN0IGVidF91X3JlcGxhY2UgKnJlcGxhY2UsCisJCSAgICAgc3RydWN0IGVidF91X2VudHJ5ICpuZXdfZW50cnksIGludCBiZWdpbiwgaW50IGVuZCwKKwkJICAgICBzdHJ1Y3QgZWJ0X2NvdW50ZXIgKmNudCwgaW50IG1hc2spOwordm9pZCBlYnRfbmV3X2NoYWluKHN0cnVjdCBlYnRfdV9yZXBsYWNlICpyZXBsYWNlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgcG9saWN5KTsKK3ZvaWQgZWJ0X2RlbGV0ZV9jaGFpbihzdHJ1Y3QgZWJ0X3VfcmVwbGFjZSAqcmVwbGFjZSk7Cit2b2lkIGVidF9yZW5hbWVfY2hhaW4oc3RydWN0IGVidF91X3JlcGxhY2UgKnJlcGxhY2UsIGNvbnN0IGNoYXIgKm5hbWUpOworLyoqLwordm9pZCBlYnRfZG9fZmluYWxfY2hlY2tzKHN0cnVjdCBlYnRfdV9yZXBsYWNlICpyZXBsYWNlLCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmUsCisJCQkgc3RydWN0IGVidF91X2VudHJpZXMgKmVudHJpZXMpOworaW50IGVidF9jaGVja19mb3JfcmVmZXJlbmNlcyhzdHJ1Y3QgZWJ0X3VfcmVwbGFjZSAqcmVwbGFjZSwgaW50IHByaW50X2Vycik7CitpbnQgZWJ0X2NoZWNrX2Zvcl9yZWZlcmVuY2VzMihzdHJ1Y3QgZWJ0X3VfcmVwbGFjZSAqcmVwbGFjZSwgaW50IGNoYWluX25yLAorCQkJICAgICAgaW50IHByaW50X2Vycik7Cit2b2lkIGVidF9jaGVja19mb3JfbG9vcHMoc3RydWN0IGVidF91X3JlcGxhY2UgKnJlcGxhY2UpOwordm9pZCBlYnRfYWRkX21hdGNoKHN0cnVjdCBlYnRfdV9lbnRyeSAqbmV3X2VudHJ5LCBzdHJ1Y3QgZWJ0X3VfbWF0Y2ggKm0pOwordm9pZCBlYnRfYWRkX3dhdGNoZXIoc3RydWN0IGVidF91X2VudHJ5ICpuZXdfZW50cnksIHN0cnVjdCBlYnRfdV93YXRjaGVyICp3KTsKK3ZvaWQgZWJ0X2l0ZXJhdGVfbWF0Y2hlcyh2b2lkICgqZikoc3RydWN0IGVidF91X21hdGNoICopKTsKK3ZvaWQgZWJ0X2l0ZXJhdGVfd2F0Y2hlcnModm9pZCAoKmYpKHN0cnVjdCBlYnRfdV93YXRjaGVyICopKTsKK3ZvaWQgZWJ0X2l0ZXJhdGVfdGFyZ2V0cyh2b2lkICgqZikoc3RydWN0IGVidF91X3RhcmdldCAqKSk7Cit2b2lkIF9fZWJ0X3ByaW50X2J1ZyhjaGFyICpmaWxlLCBpbnQgbGluZSwgY2hhciAqZm9ybWF0LCAuLi4pOwordm9pZCBfX2VidF9wcmludF9lcnJvcihjaGFyICpmb3JtYXQsIC4uLik7CisKKy8qIGNvbW11bmljYXRpb24uYyAqLworCitpbnQgZWJ0X2dldF90YWJsZShzdHJ1Y3QgZWJ0X3VfcmVwbGFjZSAqcmVwbCwgaW50IGluaXQpOwordm9pZCBlYnRfZGVsaXZlcl9jb3VudGVycyhzdHJ1Y3QgZWJ0X3VfcmVwbGFjZSAqcmVwbCk7Cit2b2lkIGVidF9kZWxpdmVyX3RhYmxlKHN0cnVjdCBlYnRfdV9yZXBsYWNlICpyZXBsKTsKKworLyogdXNlZnVsX2Z1bmN0aW9ucy5jICovCisKK2V4dGVybiBpbnQgZWJ0X2ludmVydDsKK3ZvaWQgZWJ0X2NoZWNrX29wdGlvbih1bnNpZ25lZCBpbnQgKmZsYWdzLCB1bnNpZ25lZCBpbnQgbWFzayk7CisjZGVmaW5lIGVidF9jaGVja19pbnZlcnNlKGFyZykgX2VidF9jaGVja19pbnZlcnNlKGFyZywgYXJnYywgYXJndikKK2ludCBfZWJ0X2NoZWNrX2ludmVyc2UoY29uc3QgY2hhciBvcHRpb25bXSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKK3ZvaWQgZWJ0X3ByaW50X21hYyhjb25zdCB1bnNpZ25lZCBjaGFyICptYWMpOwordm9pZCBlYnRfcHJpbnRfbWFjX2FuZF9tYXNrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1hYywgY29uc3QgdW5zaWduZWQgY2hhciAqbWFzayk7CitpbnQgZWJ0X2dldF9tYWNfYW5kX21hc2soY29uc3QgY2hhciAqZnJvbSwgdW5zaWduZWQgY2hhciAqdG8sIHVuc2lnbmVkIGNoYXIgKm1hc2spOwordm9pZCBlYnRfcGFyc2VfaXBfYWRkcmVzcyhjaGFyICphZGRyZXNzLCB1aW50MzJfdCAqYWRkciwgdWludDMyX3QgKm1zayk7CitjaGFyICplYnRfbWFza190b19kb3R0ZWQodWludDMyX3QgbWFzayk7Cit2b2lkIGVidF9wYXJzZV9pcDZfYWRkcmVzcyhjaGFyICphZGRyZXNzLCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIsCisJCQkJCQkgICBzdHJ1Y3QgaW42X2FkZHIgKm1zayk7CitjaGFyICplYnRfaXA2X3RvX251bWVyaWMoY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRycCk7CitjaGFyICplYnRfaXA2X21hc2tfdG9fc3RyaW5nKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqbXNrKTsKKworaW50IGVidF9wYXJzZV9pY21wKGNvbnN0IHN0cnVjdCBlYnRfaWNtcF9uYW1lcyAqaWNtcF9jb2Rlcywgc2l6ZV90IG5fY29kZXMsCisJCSAgIGNvbnN0IGNoYXIgKmljbXB0eXBlLCB1aW50OF90IHR5cGVbXSwgdWludDhfdCBjb2RlW10pOwordm9pZCBlYnRfcHJpbnRfaWNtcF90eXBlKGNvbnN0IHN0cnVjdCBlYnRfaWNtcF9uYW1lcyAqaWNtcF9jb2RlcywKKwkJCSBzaXplX3Qgbl9jb2RlcywgdWludDhfdCAqdHlwZSwgdWludDhfdCAqY29kZSk7Cit2b2lkIGVidF9wcmludF9pY21wX3R5cGVzKGNvbnN0IHN0cnVjdCBlYnRfaWNtcF9uYW1lcyAqaWNtcF9jb2RlcywKKwkJCSAgc2l6ZV90IG5fY29kZXMpOworCitpbnQgZG9fY29tbWFuZChpbnQgYXJnYywgY2hhciAqYXJndltdLCBpbnQgZXhlY19zdHlsZSwKKyAgICAgICAgICAgICAgIHN0cnVjdCBlYnRfdV9yZXBsYWNlICpyZXBsYWNlXyk7CisKK3N0cnVjdCBldGhlcnR5cGVlbnQgKnBhcnNlZXRoZXJ0eXBlYnludW1iZXIoaW50IHR5cGUpOworCisjZGVmaW5lIGVidF90b19jaGFpbihyZXBsKQkJCQlcCisoe3N0cnVjdCBlYnRfdV9lbnRyaWVzICpfY2ggPSBOVUxMOwkJCVwKK2lmIChyZXBsLT5zZWxlY3RlZF9jaGFpbiAhPSAtMSkJCQkJXAorCV9jaCA9IHJlcGwtPmNoYWluc1tyZXBsLT5zZWxlY3RlZF9jaGFpbl07CVwKK19jaDt9KQorI2RlZmluZSBlYnRfcHJpbnRfYnVnKGZvcm1hdCwgYXJncy4uLikgXAorICAgX19lYnRfcHJpbnRfYnVnKF9fRklMRV9fLCBfX0xJTkVfXywgZm9ybWF0LCAjI2FyZ3MpCisjZGVmaW5lIGVidF9wcmludF9lcnJvcihmb3JtYXQsYXJncy4uLikgX19lYnRfcHJpbnRfZXJyb3IoZm9ybWF0LCAjI2FyZ3MpOworI2RlZmluZSBlYnRfcHJpbnRfZXJyb3IyKGZvcm1hdCwgYXJncy4uLikgZG8ge19fZWJ0X3ByaW50X2Vycm9yKGZvcm1hdCwgIyNhcmdzKTsgXAorICAgcmV0dXJuIC0xO30gd2hpbGUgKDApCisjZGVmaW5lIGVidF9wcmludF9lcnJvcjMoZm9ybWF0LCBhcmdzLi4uKSBkbyB7X19lYnRfcHJpbnRfZXJyb3IoZm9ybWF0LCAjI2FyZ3MpOyBcCisgICByZXR1cm47fSB3aGlsZSAoMCkKKyNkZWZpbmUgZWJ0X2NoZWNrX29wdGlvbjIoZmxhZ3MsbWFzaykJXAorKHtlYnRfY2hlY2tfb3B0aW9uKGZsYWdzLG1hc2spOwkJXAorIGlmIChlYnRfZXJyb3Jtc2dbMF0gIT0gJ1wwJykJCVwKKwlyZXR1cm4gLTE7fSkKKyNkZWZpbmUgZWJ0X2NoZWNrX2ludmVyc2UyKG9wdGlvbikJCQkJCVwKKyh7aW50IF9fcmV0ID0gZWJ0X2NoZWNrX2ludmVyc2Uob3B0aW9uKTsJCQkJXAoraWYgKGVidF9lcnJvcm1zZ1swXSAhPSAnXDAnKQkJCQkJCVwKKwlyZXR1cm4gLTE7CQkJCQkJCVwKK2lmICghb3B0YXJnKSB7CQkJCQkJCQlcCisJX19lYnRfcHJpbnRfZXJyb3IoIk9wdGlvbiB3aXRob3V0IChtYW5kYXRvcnkpIGFyZ3VtZW50Iik7CVwKKwlyZXR1cm4gLTE7CQkJCQkJCVwKK30JCQkJCQkJCQlcCitfX3JldDt9KQorI2RlZmluZSBlYnRfcHJpbnRfbWVtb3J5KCkgZG8ge3ByaW50ZigiRWJ0YWJsZXM6ICIgX19GSUxFX18gXAorICAgIiAlcyAlZCA6T3V0IG9mIG1lbW9yeS5cbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOyBleGl0KC0xKTt9IHdoaWxlICgwKQorCisvKiB1c2VkIGZvciBrZWVwaW5nIHRoZSBydWxlIGNvdW50ZXJzIHJpZ2h0IGR1cmluZyBydWxlIGFkZHMgb3IgZGVsZXRlcyAqLworI2RlZmluZSBDTlRfTk9STSAJMAorI2RlZmluZSBDTlRfREVMIAkxCisjZGVmaW5lIENOVF9BREQgCTIKKyNkZWZpbmUgQ05UX0NIQU5HRSAJMworCitleHRlcm4gY29uc3QgY2hhciAqZWJ0X2hvb2tuYW1lc1tORl9CUl9OVU1IT09LU107CitleHRlcm4gY29uc3QgY2hhciAqZWJ0X3N0YW5kYXJkX3RhcmdldHNbTlVNX1NUQU5EQVJEX1RBUkdFVFNdOworZXh0ZXJuIGNoYXIgZWJ0X2Vycm9ybXNnW0VSUk9STVNHX01BWExFTl07CitleHRlcm4gY2hhciAqZWJ0X21vZHByb2JlOworZXh0ZXJuIGludCBlYnRfc2lsZW50OworZXh0ZXJuIGludCBlYnRfcHJpbnRzdHlsZV9tYWM7CisKKy8qCisgKiBUcmFuc2Zvcm1zIGEgdGFyZ2V0IHN0cmluZyBpbnRvIHRoZSByaWdodCBpbnRlZ2VyLAorICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KKyNkZWZpbmUgRklMTF9UQVJHRVQoX3N0ciwgX3BvcykgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWludCBfaSwgX3JldCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlmb3IgKF9pID0gMDsgX2kgPCBOVU1fU1RBTkRBUkRfVEFSR0VUUzsgX2krKykgICAgICAgICBcCisJCWlmICghc3RyY21wKF9zdHIsIGVidF9zdGFuZGFyZF90YXJnZXRzW19pXSkpIHtcCisJCQlfcG9zID0gLV9pIC0gMTsgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmIChfaSA9PSBOVU1fU1RBTkRBUkRfVEFSR0VUUykgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJX3JldCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlfcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorCisvKiBUcmFuc2Zvcm1zIHRoZSB0YXJnZXQgdmFsdWUgdG8gYW4gaW5kZXggaW50byBzdGFuZGFyZF90YXJnZXRzW10gKi8KKyNkZWZpbmUgVEFSR0VUX0lOREVYKF92YWx1ZSkgKC1fdmFsdWUgLSAxKQorLyogUmV0dXJucyBhIHRhcmdldCBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgdmFsdWUgKi8KKyNkZWZpbmUgVEFSR0VUX05BTUUoX3ZhbHVlKSAoZWJ0X3N0YW5kYXJkX3RhcmdldHNbVEFSR0VUX0lOREVYKF92YWx1ZSldKQorLyogVHJ1ZSBpZiB0aGUgaG9vayBtYXNrIGRlbm90ZXMgdGhhdCB0aGUgcnVsZSBpcyBpbiBhIGJhc2UgY2hhaW4gKi8KKyNkZWZpbmUgQkFTRV9DSEFJTiAoaG9va21hc2sgJiAoMSA8PCBORl9CUl9OVU1IT09LUykpCisvKiBDbGVhciB0aGUgYml0IGluIHRoZSBob29rX21hc2sgdGhhdCB0ZWxscyBpZiB0aGUgcnVsZSBpcyBvbiBhIGJhc2UgY2hhaW4gKi8KKyNkZWZpbmUgQ0xFQVJfQkFTRV9DSEFJTl9CSVQgKGhvb2ttYXNrICY9IH4oMSA8PCBORl9CUl9OVU1IT09LUykpCisjZGVmaW5lIFBSSU5UX1ZFUlNJT04gcHJpbnRmKFBST0dOQU1FIiB2IlBST0dWRVJTSU9OIiAobGVnYWN5KSAoIlBST0dEQVRFIilcbiIpCisjaWZuZGVmIFBST0NfU1lTX01PRFBST0JFCisjZGVmaW5lIFBST0NfU1lTX01PRFBST0JFICIvcHJvYy9zeXMva2VybmVsL21vZHByb2JlIgorI2VuZGlmCisjZGVmaW5lIEFUT01JQ19FTlZfVkFSSUFCTEUgIkVCVEFCTEVTX0FUT01JQ19GSUxFIgorCisjaWZuZGVmIEFSUkFZX1NJWkUKKyMgZGVmaW5lIEFSUkFZX1NJWkUoeCkJKHNpemVvZih4KSAvIHNpemVvZigoeClbMF0pKQorI2VuZGlmCisjZW5kaWYgLyogRUJUQUJMRVNfVV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2V0aGVybmV0ZGIuaCBiL2luY2x1ZGUvZXRoZXJuZXRkYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ODNhYmUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2V0aGVybmV0ZGIuaApAQCAtMCwwICsxLDU3IEBACisvKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqLworCisvKiBBbGwgZGF0YSByZXR1cm5lZCBieSB0aGUgbmV0d29yayBkYXRhIGJhc2UgbGlicmFyeSBhcmUgc3VwcGxpZWQgaW4KKyAgIGhvc3Qgb3JkZXIgYW5kIHJldHVybmVkIGluIG5ldHdvcmsgb3JkZXIgKHN1aXRhYmxlIGZvciB1c2UgaW4KKyAgIHN5c3RlbSBjYWxscykuICAqLworCisjaWZuZGVmCV9FVEhFUk5FVERCX0gKKyNkZWZpbmUJX0VUSEVSTkVUREJfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogQWJzb2x1dGUgZmlsZSBuYW1lIGZvciBuZXR3b3JrIGRhdGEgYmFzZSBmaWxlcy4gICovCisjaWZuZGVmCV9QQVRIX0VUSEVSVFlQRVMKKyNkZWZpbmUJX1BBVEhfRVRIRVJUWVBFUwkiL2V0Yy9ldGhlcnR5cGVzIgorI2VuZGlmCQkJCS8qIF9QQVRIX0VUSEVSVFlQRVMgKi8KKworc3RydWN0IGV0aGVydHlwZWVudCB7CisJY2hhciAqZV9uYW1lOwkJLyogT2ZmaWNpYWwgZXRoZXJuZXQgdHlwZSBuYW1lLiAgKi8KKwljaGFyICoqZV9hbGlhc2VzOwkvKiBBbGlhcyBsaXN0LiAgKi8KKwlpbnQgZV9ldGhlcnR5cGU7CS8qIEV0aGVybmV0IHR5cGUgbnVtYmVyLiAgKi8KK307CisKKy8qIE9wZW4gZXRoZXJ0eXBlIGRhdGEgYmFzZSBmaWxlcyBhbmQgbWFyayB0aGVtIGFzIHN0YXlpbmcgb3BlbiBldmVuCisgICBhZnRlciBhIGxhdGVyIHNlYXJjaCBpZiBTVEFZX09QRU4gaXMgbm9uLXplcm8uICAqLworZXh0ZXJuIHZvaWQgc2V0ZXRoZXJ0eXBlZW50KGludCBfX3N0YXlfb3Blbik7CisKKy8qIENsb3NlIGV0aGVydHlwZSBkYXRhIGJhc2UgZmlsZXMgYW5kIGNsZWFyIGBzdGF5IG9wZW4nIGZsYWcuICAqLworZXh0ZXJuIHZvaWQgZW5kZXRoZXJ0eXBlZW50KHZvaWQpOworCisvKiBHZXQgbmV4dCBlbnRyeSBmcm9tIGV0aGVydHlwZSBkYXRhIGJhc2UgZmlsZS4gIE9wZW4gZGF0YSBiYXNlIGlmCisgICBuZWNlc3NhcnkuICAqLworZXh0ZXJuIHN0cnVjdCBldGhlcnR5cGVlbnQgKmdldGV0aGVydHlwZWVudCh2b2lkKTsKKworLyogUmV0dXJuIGVudHJ5IGZyb20gZXRoZXJ0eXBlIGRhdGEgYmFzZSBmb3IgbmV0d29yayB3aXRoIE5BTUUuICAqLworZXh0ZXJuIHN0cnVjdCBldGhlcnR5cGVlbnQgKmdldGV0aGVydHlwZWJ5bmFtZShfX2NvbnN0IGNoYXIgKl9fbmFtZSk7CisKKy8qIFJldHVybiBlbnRyeSBmcm9tIGV0aGVydHlwZSBkYXRhIGJhc2Ugd2hpY2ggbnVtYmVyIGlzIFBST1RPLiAgKi8KK2V4dGVybiBzdHJ1Y3QgZXRoZXJ0eXBlZW50ICpnZXRldGhlcnR5cGVieW51bWJlcihpbnQgX19ldGhlcnR5cGUpOworCisKKyNlbmRpZgkJCQkvKiBldGhlcm5ldGRiLmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0FVRElULmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9BVURJVC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MTExYjIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9BVURJVC5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBIZWFkZXIgZmlsZSBmb3IgaXB0YWJsZXMgeHRfQVVESVQgdGFyZ2V0CisgKgorICogKEMpIDIwMTAtMjAxMSBUaG9tYXMgR3JhZiA8dGdyYWZAcmVkaGF0LmNvbT4KKyAqIChDKSAyMDEwLTIwMTEgUmVkIEhhdCwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfWFRfQVVESVRfVEFSR0VUX0gKKyNkZWZpbmUgX1hUX0FVRElUX1RBUkdFVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitlbnVtIHsKKwlYVF9BVURJVF9UWVBFX0FDQ0VQVCA9IDAsCisJWFRfQVVESVRfVFlQRV9EUk9QLAorCVhUX0FVRElUX1RZUEVfUkVKRUNULAorCV9fWFRfQVVESVRfVFlQRV9NQVgsCit9OworCisjZGVmaW5lIFhUX0FVRElUX1RZUEVfTUFYIChfX1hUX0FVRElUX1RZUEVfTUFYIC0gMSkKKworc3RydWN0IHh0X0FVRElUX2luZm8geworCV9fdTggdHlwZTsgLyogWFRfQVVESVRfVFlQRV8qICovCit9OworCisjZW5kaWYgLyogX1hUX0FVRElUX1RBUkdFVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZGJmZDkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UuaApAQCAtMCwwICsxLDI3IEBACisjaWZuZGVmIF9fTElOVVhfQlJJREdFX05FVEZJTFRFUl9ICisjZGVmaW5lIF9fTElOVVhfQlJJREdFX05FVEZJTFRFUl9ICisKKy8qIGJyaWRnZS1zcGVjaWZpYyBkZWZpbmVzIGZvciBuZXRmaWx0ZXIuIAorICovCisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9wcHBveC5oPgorCisvKiBCcmlkZ2UgSG9va3MgKi8KKy8qIEFmdGVyIHByb21pc2MgZHJvcHMsIGNoZWNrc3VtIGNoZWNrcy4gKi8KKyNkZWZpbmUgTkZfQlJfUFJFX1JPVVRJTkcJMAorLyogSWYgdGhlIHBhY2tldCBpcyBkZXN0aW5lZCBmb3IgdGhpcyBib3guICovCisjZGVmaW5lIE5GX0JSX0xPQ0FMX0lOCQkxCisvKiBJZiB0aGUgcGFja2V0IGlzIGRlc3RpbmVkIGZvciBhbm90aGVyIGludGVyZmFjZS4gKi8KKyNkZWZpbmUgTkZfQlJfRk9SV0FSRAkJMgorLyogUGFja2V0cyBjb21pbmcgZnJvbSBhIGxvY2FsIHByb2Nlc3MuICovCisjZGVmaW5lIE5GX0JSX0xPQ0FMX09VVAkJMworLyogUGFja2V0cyBhYm91dCB0byBoaXQgdGhlIHdpcmUuICovCisjZGVmaW5lIE5GX0JSX1BPU1RfUk9VVElORwk0CisvKiBOb3QgcmVhbGx5IGEgaG9vaywgYnV0IHVzZWQgZm9yIHRoZSBlYnRhYmxlcyBicm91dGUgdGFibGUgKi8KKyNkZWZpbmUgTkZfQlJfQlJPVVRJTkcJCTUKKyNkZWZpbmUgTkZfQlJfTlVNSE9PS1MJCTYKKworI2VuZGlmIC8qIF9fTElOVVhfQlJJREdFX05FVEZJTFRFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0XzgwMl8zLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0XzgwMl8zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAwMjhjMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfODAyXzMuaApAQCAtMCwwICsxLDYzIEBACisjaWZuZGVmIF9fTElOVVhfQlJJREdFX0VCVF84MDJfM19ICisjZGVmaW5lIF9fTElOVVhfQlJJREdFX0VCVF84MDJfM19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisKKyNkZWZpbmUgRUJUXzgwMl8zX1NBUCAweDAxCisjZGVmaW5lIEVCVF84MDJfM19UWVBFIDB4MDIKKworI2RlZmluZSBFQlRfODAyXzNfTUFUQ0ggIjgwMl8zIgorCisvKgorICogSWYgZnJhbWUgaGFzIERTQVAvU1NBUCB2YWx1ZSAweGFhIHlvdSBtdXN0IGNoZWNrIHRoZSBTTkFQIHR5cGUKKyAqIHRvIGRpc2NvdmVyIHdoYXQga2luZCBvZiBwYWNrZXQgd2UncmUgY2FycnlpbmcuIAorICovCisjZGVmaW5lIENIRUNLX1RZUEUgMHhhYQorCisvKgorICogQ29udHJvbCBmaWVsZCBtYXkgYmUgb25lIG9yIHR3byBieXRlcy4gIElmIHRoZSBmaXJzdCBieXRlIGhhcworICogdGhlIHZhbHVlIDB4MDMgdGhlbiB0aGUgZW50aXJlIGxlbmd0aCBpcyBvbmUgYnl0ZSwgb3RoZXJ3aXNlIGl0IGlzIHR3by4KKyAqIE9uZSBieXRlIGNvbnRyb2xzIGFyZSB1c2VkIGluIFVubnVtYmVyZWQgSW5mb3JtYXRpb24gZnJhbWVzLgorICogVHdvIGJ5dGUgY29udHJvbHMgYXJlIHVzZWQgaW4gTnVtYmVyZWQgSW5mb3JtYXRpb24gZnJhbWVzLgorICovCisjZGVmaW5lIElTX1VJIDB4MDMKKworI2RlZmluZSBFQlRfODAyXzNfTUFTSyAoRUJUXzgwMl8zX1NBUCB8IEVCVF84MDJfM19UWVBFIHwgRUJUXzgwMl8zKQorCisvKiB1aSBoYXMgb25lIGJ5dGUgY3RybCwgbmkgaGFzIHR3byAqLworc3RydWN0IGhkcl91aSB7CisJX191OCBkc2FwOworCV9fdTggc3NhcDsKKwlfX3U4IGN0cmw7CisJX191OCBvcmlnWzNdOworCV9fYmUxNiB0eXBlOworfTsKKworc3RydWN0IGhkcl9uaSB7CisJX191OCBkc2FwOworCV9fdTggc3NhcDsKKwlfX2JlMTYgY3RybDsKKwlfX3U4ICBvcmlnWzNdOworCV9fYmUxNiB0eXBlOworfTsKKworc3RydWN0IGVidF84MDJfM19oZHIgeworCV9fdTggIGRhZGRyW0VUSF9BTEVOXTsKKwlfX3U4ICBzYWRkcltFVEhfQUxFTl07CisJX19iZTE2IGxlbjsKKwl1bmlvbiB7CisJCXN0cnVjdCBoZHJfdWkgdWk7CisJCXN0cnVjdCBoZHJfbmkgbmk7CisJfSBsbGM7Cit9OworCisKK3N0cnVjdCBlYnRfODAyXzNfaW5mbyB7CisJX191OCAgc2FwOworCV9fYmUxNiB0eXBlOworCV9fdTggIGJpdG1hc2s7CisJX191OCAgaW52ZmxhZ3M7Cit9OworCisjZW5kaWYgLyogX19MSU5VWF9CUklER0VfRUJUXzgwMl8zX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfYW1vbmcuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfYW1vbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDRlM2FkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hbW9uZy5oCkBAIC0wLDAgKzEsNjQgQEAKKyNpZm5kZWYgX19MSU5VWF9CUklER0VfRUJUX0FNT05HX0gKKyNkZWZpbmUgX19MSU5VWF9CUklER0VfRUJUX0FNT05HX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgRUJUX0FNT05HX0RTVCAweDAxCisjZGVmaW5lIEVCVF9BTU9OR19TUkMgMHgwMgorCisvKiBHcnplZ29yeiBCb3Jvd2lhayA8Z3J6ZXNAZ251LnVuaXYuZ2RhLnBsPiAyMDAzCisgKiAKKyAqIFdyaXRlLW9uY2UtcmVhZC1tYW55IGhhc2ggdGFibGUsIHVzZWQgZm9yIGNoZWNraW5nIGlmIGEgZ2l2ZW4KKyAqIE1BQyBhZGRyZXNzIGJlbG9uZ3MgdG8gYSBzZXQgb3Igbm90IGFuZCBwb3NzaWJseSBmb3IgY2hlY2tpbmcKKyAqIGlmIGl0IGlzIHJlbGF0ZWQgd2l0aCBhIGdpdmVuIElQdjQgYWRkcmVzcy4KKyAqCisgKiBUaGUgaGFzaCB2YWx1ZSBvZiBhbiBhZGRyZXNzIGlzIGl0cyBsYXN0IGJ5dGUuCisgKiAKKyAqIEluIHJlYWwtd29ybGQgZXRoZXJuZXQgYWRkcmVzc2VzLCB2YWx1ZXMgb2YgdGhlIGxhc3QgYnl0ZSBhcmUKKyAqIGV2ZW5seSBkaXN0cmlidXRlZCBhbmQgdGhlcmUgaXMgbm8gbmVlZCB0byBjb25zaWRlciBvdGhlciBieXRlcy4KKyAqIEl0IHdvdWxkIG9ubHkgc2xvdyB0aGUgcm91dGluZXMgZG93bi4KKyAqCisgKiBGb3IgTUFDIGFkZHJlc3MgY29tcGFyaXNvbiBzcGVlZHVwIHJlYXNvbnMsIHdlIGludHJvZHVjZSBhIHRyaWNrLgorICogTUFDIGFkZHJlc3MgaXMgbWFwcGVkIG9udG8gYW4gYXJyYXkgb2YgdHdvIDMyLWJpdCBpbnRlZ2Vycy4KKyAqIFRoaXMgcGFpciBvZiBpbnRlZ2VycyBpcyBjb21wYXJlZCB3aXRoIE1BQyBhZGRyZXNzZXMgaW4gdGhlCisgKiBoYXNoIHRhYmxlLCB3aGljaCBhcmUgc3RvcmVkIGFsc28gaW4gZm9ybSBvZiBwYWlycyBvZiBpbnRlZ2VycworICogKGluIGBjbXAnIGFycmF5KS4gVGhpcyBpcyBxdWljayBhcyBpdCByZXF1aXJlcyBvbmx5IHR3byBlbGVtZW50YXJ5CisgKiBudW1iZXIgY29tcGFyaXNvbnMgaW4gd29yc3QgY2FzZS4gRnVydGhlciwgd2UgdGFrZSBhZHZhbnRhZ2Ugb2YKKyAqIGZhY3QgdGhhdCBlbnRyb3B5IG9mIDMgbGFzdCBieXRlcyBvZiBhZGRyZXNzIGlzIGxhcmdlciB0aGFuIGVudHJvcHkKKyAqIG9mIDMgZmlyc3QgYnl0ZXMuIFNvIGZpcnN0IHdlIGNvbXBhcmUgNCBsYXN0IGJ5dGVzIG9mIGFkZHJlc3NlcyBhbmQKKyAqIGlmIHRoZXkgYXJlIHRoZSBzYW1lIHdlIGNvbXBhcmUgMiBmaXJzdC4KKyAqCisgKiBZZXMsIGl0IGlzIGEgbWVtb3J5IG92ZXJoZWFkLCBidXQgaW4gMjAwMyBBRCwgd2hvIGNhcmVzPworICovCisKK3N0cnVjdCBlYnRfbWFjX3dvcm1oYXNoX3R1cGxlIHsKKwlfX3UzMiBjbXBbMl07CisJX19iZTMyIGlwOworfTsKKworc3RydWN0IGVidF9tYWNfd29ybWhhc2ggeworCWludCB0YWJsZVsyNTddOworCWludCBwb29sc2l6ZTsKKwlzdHJ1Y3QgZWJ0X21hY193b3JtaGFzaF90dXBsZSBwb29sWzBdOworfTsKKworI2RlZmluZSBlYnRfbWFjX3dvcm1oYXNoX3NpemUoeCkgKCh4KSA/IHNpemVvZihzdHJ1Y3QgZWJ0X21hY193b3JtaGFzaCkgXAorCQkrICh4KS0+cG9vbHNpemUgKiBzaXplb2Yoc3RydWN0IGVidF9tYWNfd29ybWhhc2hfdHVwbGUpIDogMCkKKworc3RydWN0IGVidF9hbW9uZ19pbmZvIHsKKwlpbnQgd2hfZHN0X29mczsKKwlpbnQgd2hfc3JjX29mczsKKwlpbnQgYml0bWFzazsKK307CisKKyNkZWZpbmUgRUJUX0FNT05HX0RTVF9ORUcgMHgxCisjZGVmaW5lIEVCVF9BTU9OR19TUkNfTkVHIDB4MgorCisjZGVmaW5lIGVidF9hbW9uZ193aF9kc3QoeCkgKCh4KS0+d2hfZHN0X29mcyA/IFwKKwkoc3RydWN0IGVidF9tYWNfd29ybWhhc2gqKSgoY2hhciopKHgpICsgKHgpLT53aF9kc3Rfb2ZzKSA6IE5VTEwpCisjZGVmaW5lIGVidF9hbW9uZ193aF9zcmMoeCkgKCh4KS0+d2hfc3JjX29mcyA/IFwKKwkoc3RydWN0IGVidF9tYWNfd29ybWhhc2gqKSgoY2hhciopKHgpICsgKHgpLT53aF9zcmNfb2ZzKSA6IE5VTEwpCisKKyNkZWZpbmUgRUJUX0FNT05HX01BVENIICJhbW9uZyIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2FycC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hcnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjJmM2U0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hcnAuaApAQCAtMCwwICsxLDM2IEBACisjaWZuZGVmIF9fTElOVVhfQlJJREdFX0VCVF9BUlBfSAorI2RlZmluZSBfX0xJTlVYX0JSSURHRV9FQlRfQVJQX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgRUJUX0FSUF9PUENPREUgMHgwMQorI2RlZmluZSBFQlRfQVJQX0hUWVBFIDB4MDIKKyNkZWZpbmUgRUJUX0FSUF9QVFlQRSAweDA0CisjZGVmaW5lIEVCVF9BUlBfU1JDX0lQIDB4MDgKKyNkZWZpbmUgRUJUX0FSUF9EU1RfSVAgMHgxMAorI2RlZmluZSBFQlRfQVJQX1NSQ19NQUMgMHgyMAorI2RlZmluZSBFQlRfQVJQX0RTVF9NQUMgMHg0MAorI2RlZmluZSBFQlRfQVJQX0dSQVQgMHg4MAorI2RlZmluZSBFQlRfQVJQX01BU0sgKEVCVF9BUlBfT1BDT0RFIHwgRUJUX0FSUF9IVFlQRSB8IEVCVF9BUlBfUFRZUEUgfCBcCisgICBFQlRfQVJQX1NSQ19JUCB8IEVCVF9BUlBfRFNUX0lQIHwgRUJUX0FSUF9TUkNfTUFDIHwgRUJUX0FSUF9EU1RfTUFDIHwgXAorICAgRUJUX0FSUF9HUkFUKQorI2RlZmluZSBFQlRfQVJQX01BVENIICJhcnAiCisKK3N0cnVjdCBlYnRfYXJwX2luZm8KK3sKKwlfX2JlMTYgaHR5cGU7CisJX19iZTE2IHB0eXBlOworCV9fYmUxNiBvcGNvZGU7CisJX19iZTMyIHNhZGRyOworCV9fYmUzMiBzbXNrOworCV9fYmUzMiBkYWRkcjsKKwlfX2JlMzIgZG1zazsKKwl1bnNpZ25lZCBjaGFyIHNtYWRkcltFVEhfQUxFTl07CisJdW5zaWduZWQgY2hhciBzbW1za1tFVEhfQUxFTl07CisJdW5zaWduZWQgY2hhciBkbWFkZHJbRVRIX0FMRU5dOworCXVuc2lnbmVkIGNoYXIgZG1tc2tbRVRIX0FMRU5dOworCV9fdTggIGJpdG1hc2s7CisJX191OCAgaW52ZmxhZ3M7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfYXJwcmVwbHkuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfYXJwcmVwbHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTc3ODk2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hcnByZXBseS5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX19MSU5VWF9CUklER0VfRUJUX0FSUFJFUExZX0gKKyNkZWZpbmUgX19MSU5VWF9CUklER0VfRUJUX0FSUFJFUExZX0gKKworc3RydWN0IGVidF9hcnByZXBseV9pbmZvIHsKKwl1bnNpZ25lZCBjaGFyIG1hY1tFVEhfQUxFTl07CisJaW50IHRhcmdldDsKK307CisjZGVmaW5lIEVCVF9BUlBSRVBMWV9UQVJHRVQgImFycHJlcGx5IgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfaXAuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmQ2MjYxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9pcC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wIFdJVEggTGludXgtc3lzY2FsbC1ub3RlICovCisvKgorICogIGVidF9pcAorICoKKyAqCUF1dGhvcnM6CisgKglCYXJ0IERlIFNjaHV5bWVyIDxiYXJ0LmRlLnNjaHV5bWVyQHBhbmRvcmEuYmU+CisgKgorICogIEFwcmlsLCAyMDAyCisgKgorICogIENoYW5nZXM6CisgKiAgICBhZGRlZCBpcC1zcG9ydCBhbmQgaXAtZHBvcnQKKyAqICAgIElubm9taW5hdGUgU2VjdXJpdHkgVGVjaG5vbG9naWVzIEFHIDxtaG9wZkBpbm5vbWluYXRlLmNvbT4KKyAqICAgIFNlcHRlbWJlciwgMjAwMgorICovCisKKyNpZm5kZWYgX19MSU5VWF9CUklER0VfRUJUX0lQX0gKKyNkZWZpbmUgX19MSU5VWF9CUklER0VfRUJUX0lQX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgRUJUX0lQX1NPVVJDRSAweDAxCisjZGVmaW5lIEVCVF9JUF9ERVNUIDB4MDIKKyNkZWZpbmUgRUJUX0lQX1RPUyAweDA0CisjZGVmaW5lIEVCVF9JUF9QUk9UTyAweDA4CisjZGVmaW5lIEVCVF9JUF9TUE9SVCAweDEwCisjZGVmaW5lIEVCVF9JUF9EUE9SVCAweDIwCisjZGVmaW5lIEVCVF9JUF9JQ01QIDB4NDAKKyNkZWZpbmUgRUJUX0lQX0lHTVAgMHg4MAorI2RlZmluZSBFQlRfSVBfTUFTSyAoRUJUX0lQX1NPVVJDRSB8IEVCVF9JUF9ERVNUIHwgRUJUX0lQX1RPUyB8IEVCVF9JUF9QUk9UTyB8XAorCQkgICAgIEVCVF9JUF9TUE9SVCB8IEVCVF9JUF9EUE9SVCB8IEVCVF9JUF9JQ01QIHwgRUJUX0lQX0lHTVApCisjZGVmaW5lIEVCVF9JUF9NQVRDSCAiaXAiCisKKy8qIHRoZSBzYW1lIHZhbHVlcyBhcmUgdXNlZCBmb3IgdGhlIGludmZsYWdzICovCitzdHJ1Y3QgZWJ0X2lwX2luZm8geworCV9fYmUzMiBzYWRkcjsKKwlfX2JlMzIgZGFkZHI7CisJX19iZTMyIHNtc2s7CisJX19iZTMyIGRtc2s7CisJX191OCAgdG9zOworCV9fdTggIHByb3RvY29sOworCV9fdTggIGJpdG1hc2s7CisJX191OCAgaW52ZmxhZ3M7CisJdW5pb24geworCQlfX3UxNiBzcG9ydFsyXTsKKwkJX191OCBpY21wX3R5cGVbMl07CisJCV9fdTggaWdtcF90eXBlWzJdOworCX07CisJdW5pb24geworCQlfX3UxNiBkcG9ydFsyXTsKKwkJX191OCBpY21wX2NvZGVbMl07CisJfTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9pcDYuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfaXA2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJiODg5NgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfaXA2LmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqICBlYnRfaXA2CisgKgorICoJQXV0aG9yczoKKyAqIEt1by1MYW5nIFRzZW5nIDxrdW8tbGFuZy50c2VuZ0BpbnRlbC5jb20+CisgKiBNYW5vaGFyIENhc3RlbGlubyA8bWFub2hhci5yLmNhc3RlbGlub0BpbnRlbC5jb20+CisgKgorICogIEphbiAxMSwgMjAwOAorICoKKyAqLworCisjaWZuZGVmIF9fTElOVVhfQlJJREdFX0VCVF9JUDZfSAorI2RlZmluZSBfX0xJTlVYX0JSSURHRV9FQlRfSVA2X0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgRUJUX0lQNl9TT1VSQ0UgMHgwMQorI2RlZmluZSBFQlRfSVA2X0RFU1QgMHgwMgorI2RlZmluZSBFQlRfSVA2X1RDTEFTUyAweDA0CisjZGVmaW5lIEVCVF9JUDZfUFJPVE8gMHgwOAorI2RlZmluZSBFQlRfSVA2X1NQT1JUIDB4MTAKKyNkZWZpbmUgRUJUX0lQNl9EUE9SVCAweDIwCisjZGVmaW5lIEVCVF9JUDZfSUNNUDYgMHg0MAorCisjZGVmaW5lIEVCVF9JUDZfTUFTSyAoRUJUX0lQNl9TT1VSQ0UgfCBFQlRfSVA2X0RFU1QgfCBFQlRfSVA2X1RDTEFTUyB8XAorCQkgICAgICBFQlRfSVA2X1BST1RPIHwgRUJUX0lQNl9TUE9SVCB8IEVCVF9JUDZfRFBPUlQgfCBcCisJCSAgICAgIEVCVF9JUDZfSUNNUDYpCisjZGVmaW5lIEVCVF9JUDZfTUFUQ0ggImlwNiIKKworLyogdGhlIHNhbWUgdmFsdWVzIGFyZSB1c2VkIGZvciB0aGUgaW52ZmxhZ3MgKi8KK3N0cnVjdCBlYnRfaXA2X2luZm8geworCXN0cnVjdCBpbjZfYWRkciBzYWRkcjsKKwlzdHJ1Y3QgaW42X2FkZHIgZGFkZHI7CisJc3RydWN0IGluNl9hZGRyIHNtc2s7CisJc3RydWN0IGluNl9hZGRyIGRtc2s7CisJX191OCAgdGNsYXNzOworCV9fdTggIHByb3RvY29sOworCV9fdTggIGJpdG1hc2s7CisJX191OCAgaW52ZmxhZ3M7CisJdW5pb24geworCQlfX3UxNiBzcG9ydFsyXTsKKwkJX191OCBpY21wdjZfdHlwZVsyXTsKKwl9OworCXVuaW9uIHsKKwkJX191MTYgZHBvcnRbMl07CisJCV9fdTggaWNtcHY2X2NvZGVbMl07CisJfTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9saW1pdC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9saW1pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZDgwYjMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2xpbWl0LmgKQEAgLTAsMCArMSwyNCBAQAorI2lmbmRlZiBfX0xJTlVYX0JSSURHRV9FQlRfTElNSVRfSAorI2RlZmluZSBfX0xJTlVYX0JSSURHRV9FQlRfTElNSVRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBFQlRfTElNSVRfTUFUQ0ggImxpbWl0IgorCisvKiB0aW1pbmdzIGFyZSBpbiBtaWxsaXNlY29uZHMuICovCisjZGVmaW5lIEVCVF9MSU1JVF9TQ0FMRSAxMDAwMAorCisvKiAxLzEwLDAwMCBzZWMgcGVyaW9kID0+IG1heCBvZiAxMCwwMDAvc2VjLiAgTWluIHJhdGUgaXMgdGhlbiA0Mjk0OTAKKyAgIHNlY29uZHMsIG9yIG9uZSBldmVyeSA1OSBob3Vycy4gKi8KKworc3RydWN0IGVidF9saW1pdF9pbmZvIHsKKwlfX3UzMiBhdmc7ICAgIC8qIEF2ZXJhZ2Ugc2VjcyBiZXR3ZWVuIHBhY2tldHMgKiBzY2FsZSAqLworCV9fdTMyIGJ1cnN0OyAgLyogUGVyaW9kIG11bHRpcGxpZXIgZm9yIHVwcGVyIGxpbWl0LiAqLworCisJLyogVXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBrZXJuZWwgKi8KKwl1bnNpZ25lZCBsb25nIHByZXY7CisJX191MzIgY3JlZGl0OworCV9fdTMyIGNyZWRpdF9jYXAsIGNvc3Q7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbG9nLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlN2YxZDEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2xvZy5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgX19MSU5VWF9CUklER0VfRUJUX0xPR19ICisjZGVmaW5lIF9fTElOVVhfQlJJREdFX0VCVF9MT0dfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBFQlRfTE9HX0lQIDB4MDEgLyogaWYgdGhlIGZyYW1lIGlzIG1hZGUgYnkgaXAsIGxvZyB0aGUgaXAgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgRUJUX0xPR19BUlAgMHgwMgorI2RlZmluZSBFQlRfTE9HX05GTE9HIDB4MDQKKyNkZWZpbmUgRUJUX0xPR19JUDYgMHgwOAorI2RlZmluZSBFQlRfTE9HX01BU0sgKEVCVF9MT0dfSVAgfCBFQlRfTE9HX0FSUCB8IEVCVF9MT0dfSVA2KQorI2RlZmluZSBFQlRfTE9HX1BSRUZJWF9TSVpFIDMwCisjZGVmaW5lIEVCVF9MT0dfV0FUQ0hFUiAibG9nIgorCitzdHJ1Y3QgZWJ0X2xvZ19pbmZvIHsKKwlfX3U4IGxvZ2xldmVsOworCV9fdTggcHJlZml4W0VCVF9MT0dfUFJFRklYX1NJWkVdOworCV9fdTMyIGJpdG1hc2s7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbWFya19tLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X21hcmtfbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMGY5ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X21hcmtfbS5oCkBAIC0wLDAgKzEsMTYgQEAKKyNpZm5kZWYgX19MSU5VWF9CUklER0VfRUJUX01BUktfTV9ICisjZGVmaW5lIF9fTElOVVhfQlJJREdFX0VCVF9NQVJLX01fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBFQlRfTUFSS19BTkQgMHgwMQorI2RlZmluZSBFQlRfTUFSS19PUiAweDAyCisjZGVmaW5lIEVCVF9NQVJLX01BU0sgKEVCVF9NQVJLX0FORCB8IEVCVF9NQVJLX09SKQorc3RydWN0IGVidF9tYXJrX21faW5mbyB7CisJdW5zaWduZWQgbG9uZyBtYXJrLCBtYXNrOworCV9fdTggaW52ZXJ0OworCV9fdTggYml0bWFzazsKK307CisjZGVmaW5lIEVCVF9NQVJLX01BVENIICJtYXJrX20iCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9tYXJrX3QuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbWFya190LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q1YTI2OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbWFya190LmgKQEAgLTAsMCArMSwyMyBAQAorI2lmbmRlZiBfX0xJTlVYX0JSSURHRV9FQlRfTUFSS19UX0gKKyNkZWZpbmUgX19MSU5VWF9CUklER0VfRUJUX01BUktfVF9ICisKKy8qIFRoZSB0YXJnZXQgbWVtYmVyIGlzIHJldXNlZCBmb3IgYWRkaW5nIG5ldyBhY3Rpb25zLCB0aGUKKyAqIHZhbHVlIG9mIHRoZSByZWFsIHRhcmdldCBpcyAtMSB0byAtTlVNX1NUQU5EQVJEX1RBUkdFVFMuCisgKiBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlIDQgbHNiICgyIHdvdWxkIGJlIGVub3VnaCwKKyAqIGJ1dCBsZXQncyBwbGF5IGl0IHNhZmUpIGFyZSBrZXB0IHRvIGRlc2lnbmF0ZSB0aGlzIHRhcmdldC4KKyAqIFRoZSByZW1haW5pbmcgYml0cyBkZXNpZ25hdGUgdGhlIGFjdGlvbi4gQnkgbWFraW5nIHRoZSBzZXQKKyAqIGFjdGlvbiAweGZmZmZmZmYwLCB0aGUgcmVzdWx0IHdpbGwgbG9vayBvayBmb3Igb2xkZXIKKyAqIHZlcnNpb25zLiBbU2VwdGVtYmVyIDIwMDZdICovCisjZGVmaW5lIE1BUktfU0VUX1ZBTFVFICgweGZmZmZmZmYwKQorI2RlZmluZSBNQVJLX09SX1ZBTFVFICAoMHhmZmZmZmZlMCkKKyNkZWZpbmUgTUFSS19BTkRfVkFMVUUgKDB4ZmZmZmZmZDApCisjZGVmaW5lIE1BUktfWE9SX1ZBTFVFICgweGZmZmZmZmMwKQorCitzdHJ1Y3QgZWJ0X21hcmtfdF9pbmZvIHsKKwl1bnNpZ25lZCBsb25nIG1hcms7CisJLyogRUJUX0FDQ0VQVCwgRUJUX0RST1AsIEVCVF9DT05USU5VRSBvciBFQlRfUkVUVVJOICovCisJaW50IHRhcmdldDsKK307CisjZGVmaW5lIEVCVF9NQVJLX1RBUkdFVCAibWFyayIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X25hdC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9uYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTc0ZTNiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9uYXQuaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIF9fTElOVVhfQlJJREdFX0VCVF9OQVRfSAorI2RlZmluZSBfX0xJTlVYX0JSSURHRV9FQlRfTkFUX0gKKworI2RlZmluZSBOQVRfQVJQX0JJVCAgKDB4MDAwMDAwMTApCitzdHJ1Y3QgZWJ0X25hdF9pbmZvIHsKKwl1bnNpZ25lZCBjaGFyIG1hY1tFVEhfQUxFTl07CisJLyogRUJUX0FDQ0VQVCwgRUJUX0RST1AsIEVCVF9DT05USU5VRSBvciBFQlRfUkVUVVJOICovCisJaW50IHRhcmdldDsKK307CisjZGVmaW5lIEVCVF9TTkFUX1RBUkdFVCAic25hdCIKKyNkZWZpbmUgRUJUX0ROQVRfVEFSR0VUICJkbmF0IgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbmZsb2cuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbmZsb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjgyOWZjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9uZmxvZy5oCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgX19MSU5VWF9CUklER0VfRUJUX05GTE9HX0gKKyNkZWZpbmUgX19MSU5VWF9CUklER0VfRUJUX05GTE9HX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgRUJUX05GTE9HX01BU0sgMHgwCisKKyNkZWZpbmUgRUJUX05GTE9HX1BSRUZJWF9TSVpFIDY0CisjZGVmaW5lIEVCVF9ORkxPR19XQVRDSEVSICJuZmxvZyIKKworI2RlZmluZSBFQlRfTkZMT0dfREVGQVVMVF9HUk9VUAkJMHgxCisjZGVmaW5lIEVCVF9ORkxPR19ERUZBVUxUX1RIUkVTSE9MRAkxCisKK3N0cnVjdCBlYnRfbmZsb2dfaW5mbyB7CisJX191MzIgbGVuOworCV9fdTE2IGdyb3VwOworCV9fdTE2IHRocmVzaG9sZDsKKwlfX3UxNiBmbGFnczsKKwlfX3UxNiBwYWQ7CisJY2hhciBwcmVmaXhbRUJUX05GTE9HX1BSRUZJWF9TSVpFXTsKK307CisKKyNlbmRpZgkJCQkvKiBfX0xJTlVYX0JSSURHRV9FQlRfTkZMT0dfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9wa3R0eXBlLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3BrdHR5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjQxYmFkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9wa3R0eXBlLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfX0xJTlVYX0JSSURHRV9FQlRfUEtUVFlQRV9ICisjZGVmaW5lIF9fTElOVVhfQlJJREdFX0VCVF9QS1RUWVBFX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBlYnRfcGt0dHlwZV9pbmZvIHsKKwlfX3U4IHBrdF90eXBlOworCV9fdTggaW52ZXJ0OworfTsKKyNkZWZpbmUgRUJUX1BLVFRZUEVfTUFUQ0ggInBrdHR5cGUiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9yZWRpcmVjdC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9yZWRpcmVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOTYyMmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3JlZGlyZWN0LmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfX0xJTlVYX0JSSURHRV9FQlRfUkVESVJFQ1RfSAorI2RlZmluZSBfX0xJTlVYX0JSSURHRV9FQlRfUkVESVJFQ1RfSAorCitzdHJ1Y3QgZWJ0X3JlZGlyZWN0X2luZm8geworCS8qIEVCVF9BQ0NFUFQsIEVCVF9EUk9QLCBFQlRfQ09OVElOVUUgb3IgRUJUX1JFVFVSTiAqLworCWludCB0YXJnZXQ7Cit9OworI2RlZmluZSBFQlRfUkVESVJFQ1RfVEFSR0VUICJyZWRpcmVjdCIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3N0cC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9zdHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDI1YjlmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9zdHAuaApAQCAtMCwwICsxLDQ2IEBACisjaWZuZGVmIF9fTElOVVhfQlJJREdFX0VCVF9TVFBfSAorI2RlZmluZSBfX0xJTlVYX0JSSURHRV9FQlRfU1RQX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgRUJUX1NUUF9UWVBFCQkweDAwMDEKKworI2RlZmluZSBFQlRfU1RQX0ZMQUdTCQkweDAwMDIKKyNkZWZpbmUgRUJUX1NUUF9ST09UUFJJTwkweDAwMDQKKyNkZWZpbmUgRUJUX1NUUF9ST09UQUREUgkweDAwMDgKKyNkZWZpbmUgRUJUX1NUUF9ST09UQ09TVAkweDAwMTAKKyNkZWZpbmUgRUJUX1NUUF9TRU5ERVJQUklPCTB4MDAyMAorI2RlZmluZSBFQlRfU1RQX1NFTkRFUkFERFIJMHgwMDQwCisjZGVmaW5lIEVCVF9TVFBfUE9SVAkJMHgwMDgwCisjZGVmaW5lIEVCVF9TVFBfTVNHQUdFCQkweDAxMDAKKyNkZWZpbmUgRUJUX1NUUF9NQVhBR0UJCTB4MDIwMAorI2RlZmluZSBFQlRfU1RQX0hFTExPVElNRQkweDA0MDAKKyNkZWZpbmUgRUJUX1NUUF9GV0RECQkweDA4MDAKKworI2RlZmluZSBFQlRfU1RQX01BU0sJCTB4MGZmZgorI2RlZmluZSBFQlRfU1RQX0NPTkZJR19NQVNLCTB4MGZmZQorCisjZGVmaW5lIEVCVF9TVFBfTUFUQ0ggInN0cCIKKworc3RydWN0IGVidF9zdHBfY29uZmlnX2luZm8geworCV9fdTggZmxhZ3M7CisJX191MTYgcm9vdF9wcmlvbCwgcm9vdF9wcmlvdTsKKwljaGFyIHJvb3RfYWRkcls2XSwgcm9vdF9hZGRybXNrWzZdOworCV9fdTMyIHJvb3RfY29zdGwsIHJvb3RfY29zdHU7CisJX191MTYgc2VuZGVyX3ByaW9sLCBzZW5kZXJfcHJpb3U7CisJY2hhciBzZW5kZXJfYWRkcls2XSwgc2VuZGVyX2FkZHJtc2tbNl07CisJX191MTYgcG9ydGwsIHBvcnR1OworCV9fdTE2IG1zZ19hZ2VsLCBtc2dfYWdldTsKKwlfX3UxNiBtYXhfYWdlbCwgbWF4X2FnZXU7CisJX191MTYgaGVsbG9fdGltZWwsIGhlbGxvX3RpbWV1OworCV9fdTE2IGZvcndhcmRfZGVsYXlsLCBmb3J3YXJkX2RlbGF5dTsKK307CisKK3N0cnVjdCBlYnRfc3RwX2luZm8geworCV9fdTggdHlwZTsKKwlzdHJ1Y3QgZWJ0X3N0cF9jb25maWdfaW5mbyBjb25maWc7CisJX191MTYgYml0bWFzazsKKwlfX3UxNiBpbnZmbGFnczsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF91bG9nLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3Vsb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWE2YmVjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF91bG9nLmgKQEAgLTAsMCArMSwzOCBAQAorI2lmbmRlZiBfRUJUX1VMT0dfSAorI2RlZmluZSBfRUJUX1VMT0dfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBFQlRfVUxPR19ERUZBVUxUX05MR1JPVVAgMAorI2RlZmluZSBFQlRfVUxPR19ERUZBVUxUX1FUSFJFU0hPTEQgMQorI2RlZmluZSBFQlRfVUxPR19NQVhOTEdST1VQUyAzMiAvKiBoYXJkY29kZWQgbmV0bGluayBtYXggKi8KKyNkZWZpbmUgRUJUX1VMT0dfUFJFRklYX0xFTiAzMgorI2RlZmluZSBFQlRfVUxPR19NQVhfUUxFTiA1MAorI2RlZmluZSBFQlRfVUxPR19XQVRDSEVSICJ1bG9nIgorI2RlZmluZSBFQlRfVUxPR19WRVJTSU9OIDEKKworc3RydWN0IGVidF91bG9nX2luZm8geworCV9fdTMyIG5sZ3JvdXA7CisJdW5zaWduZWQgaW50IGNwcmFuZ2U7CisJdW5zaWduZWQgaW50IHF0aHJlc2hvbGQ7CisJY2hhciBwcmVmaXhbRUJUX1VMT0dfUFJFRklYX0xFTl07Cit9OworCit0eXBlZGVmIHN0cnVjdCBlYnRfdWxvZ19wYWNrZXRfbXNnIHsKKwlpbnQgdmVyc2lvbjsKKwljaGFyIGluZGV2W0lGTkFNU0laXTsKKwljaGFyIG91dGRldltJRk5BTVNJWl07CisJY2hhciBwaHlzaW5kZXZbSUZOQU1TSVpdOworCWNoYXIgcGh5c291dGRldltJRk5BTVNJWl07CisJY2hhciBwcmVmaXhbRUJUX1VMT0dfUFJFRklYX0xFTl07CisJc3RydWN0IHRpbWV2YWwgc3RhbXA7CisJdW5zaWduZWQgbG9uZyBtYXJrOworCXVuc2lnbmVkIGludCBob29rOworCXNpemVfdCBkYXRhX2xlbjsKKwkvKiBUaGUgY29tcGxldGUgcGFja2V0LCBpbmNsdWRpbmcgRXRoZXJuZXQgaGVhZGVyIGFuZCBwZXJoYXBzCisJICogdGhlIFZMQU4gaGVhZGVyIGlzIGFwcGVuZGVkICovCisJdW5zaWduZWQgY2hhciBkYXRhWzBdIF9fYXR0cmlidXRlX18KKwkgICAgICAgICAgICAgICAgICAgICAgKChhbGlnbmVkIChfX2FsaWdub2ZfXyhzdHJ1Y3QgZWJ0X3Vsb2dfaW5mbykpKSk7Cit9IGVidF91bG9nX3BhY2tldF9tc2dfdDsKKworI2VuZGlmIC8qIF9FQlRfVUxPR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3ZsYW4uaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfdmxhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2N2QxZDUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3ZsYW4uaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9fTElOVVhfQlJJREdFX0VCVF9WTEFOX0gKKyNkZWZpbmUgX19MSU5VWF9CUklER0VfRUJUX1ZMQU5fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBFQlRfVkxBTl9JRAkweDAxCisjZGVmaW5lIEVCVF9WTEFOX1BSSU8JMHgwMgorI2RlZmluZSBFQlRfVkxBTl9FTkNBUAkweDA0CisjZGVmaW5lIEVCVF9WTEFOX01BU0sgKEVCVF9WTEFOX0lEIHwgRUJUX1ZMQU5fUFJJTyB8IEVCVF9WTEFOX0VOQ0FQKQorI2RlZmluZSBFQlRfVkxBTl9NQVRDSCAidmxhbiIKKworc3RydWN0IGVidF92bGFuX2luZm8geworCV9fdTE2IGlkOwkJLyogVkxBTiBJRCB7MS00MDk1fSAqLworCV9fdTggcHJpbzsJCS8qIFZMQU4gVXNlciBQcmlvcml0eSB7MC03fSAqLworCV9fYmUxNiBlbmNhcDsJCS8qIFZMQU4gRW5jYXBzdWxhdGVkIGZyYW1lIGNvZGUgezAtNjU1MzV9ICovCisJX191OCBiaXRtYXNrOwkJLyogQXJncyBiaXRtYXNrIGJpdCAxPTEgLSBJRCBhcmcsCisJCQkJICAgYml0IDI9MSBVc2VyLVByaW9yaXR5IGFyZywgYml0IDM9MSBlbmNhcCovCisJX191OCBpbnZmbGFnczsJCS8qIEludmVyc2UgYml0bWFzayAgYml0IDE9MSAtIGludmVyc2VkIElEIGFyZywgCisJCQkJICAgYml0IDI9MSAtIGludmVyc2VkIFBpcm9yaXR5IGFyZyAqLworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZTc1ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaApAQCAtMCwwICsxLDI3OSBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgV0lUSCBMaW51eC1zeXNjYWxsLW5vdGUgKi8KKy8qCisgKiAgZWJ0YWJsZXMKKyAqCisgKglBdXRob3JzOgorICoJQmFydCBEZSBTY2h1eW1lcgkJPGJkc2NodXltQHBhbmRvcmEuYmU+CisgKgorICogIGVidGFibGVzLmMsdiAyLjAsIEFwcmlsLCAyMDAyCisgKgorICogIFRoaXMgY29kZSBpcyBzdHJvbmdseSBpbnNwaXJlZCBieSB0aGUgaXB0YWJsZXMgY29kZSB3aGljaCBpcworICogIENvcHlyaWdodCAoQykgMTk5OSBQYXVsIGBSdXN0eScgUnVzc2VsbCAmIE1pY2hhZWwgSi4gTmV1bGluZworICovCisKKyNpZm5kZWYgX19MSU5VWF9CUklER0VfRUZGX0gKKyNkZWZpbmUgX19MSU5VWF9CUklER0VfRUZGX0gKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS5oPgorCisjZGVmaW5lIEVCVF9UQUJMRV9NQVhOQU1FTEVOIDMyCisjZGVmaW5lIEVCVF9DSEFJTl9NQVhOQU1FTEVOIEVCVF9UQUJMRV9NQVhOQU1FTEVOCisjZGVmaW5lIEVCVF9GVU5DVElPTl9NQVhOQU1FTEVOIEVCVF9UQUJMRV9NQVhOQU1FTEVOCisjZGVmaW5lIEVCVF9FWFRFTlNJT05fTUFYTkFNRUxFTiAzMQorCisvKiB2ZXJkaWN0cyA+MCBhcmUgImJyYW5jaGVzIiAqLworI2RlZmluZSBFQlRfQUNDRVBUICAgLTEKKyNkZWZpbmUgRUJUX0RST1AgICAgIC0yCisjZGVmaW5lIEVCVF9DT05USU5VRSAtMworI2RlZmluZSBFQlRfUkVUVVJOICAgLTQKKyNkZWZpbmUgTlVNX1NUQU5EQVJEX1RBUkdFVFMgICA0CisvKiBlYnRhYmxlcyB0YXJnZXQgbW9kdWxlcyBzdG9yZSB0aGUgdmVyZGljdCBpbnNpZGUgYW4gaW50LiBXZSBjYW4KKyAqIHJlY2xhaW0gYSBwYXJ0IG9mIHRoaXMgaW50IGZvciBiYWNrd2FyZHMgY29tcGF0aWJsZSBleHRlbnNpb25zLgorICogVGhlIDQgbHNiIGFyZSBtb3JlIHRoYW4gZW5vdWdoIHRvIHN0b3JlIHRoZSB2ZXJkaWN0LiAqLworI2RlZmluZSBFQlRfVkVSRElDVF9CSVRTIDB4MDAwMDAwMEYKKworc3RydWN0IHh0X21hdGNoOworc3RydWN0IHh0X3RhcmdldDsKKworc3RydWN0IGVidF9jb3VudGVyIHsKKwlfX3U2NCBwY250OworCV9fdTY0IGJjbnQ7Cit9OworCitzdHJ1Y3QgZWJ0X3JlcGxhY2UgeworCWNoYXIgbmFtZVtFQlRfVEFCTEVfTUFYTkFNRUxFTl07CisJdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzOworCS8qIG5yIG9mIHJ1bGVzIGluIHRoZSB0YWJsZSAqLworCXVuc2lnbmVkIGludCBuZW50cmllczsKKwkvKiB0b3RhbCBzaXplIG9mIHRoZSBlbnRyaWVzICovCisJdW5zaWduZWQgaW50IGVudHJpZXNfc2l6ZTsKKwkvKiBzdGFydCBvZiB0aGUgY2hhaW5zICovCisJc3RydWN0IGVidF9lbnRyaWVzICpob29rX2VudHJ5W05GX0JSX05VTUhPT0tTXTsKKwkvKiBuciBvZiBjb3VudGVycyB1c2Vyc3BhY2UgZXhwZWN0cyBiYWNrICovCisJdW5zaWduZWQgaW50IG51bV9jb3VudGVyczsKKwkvKiB3aGVyZSB0aGUga2VybmVsIHdpbGwgcHV0IHRoZSBvbGQgY291bnRlcnMgKi8KKwlzdHJ1Y3QgZWJ0X2NvdW50ZXIgKmNvdW50ZXJzOworCWNoYXIgKmVudHJpZXM7Cit9OworCitzdHJ1Y3QgZWJ0X3JlcGxhY2Vfa2VybmVsIHsKKwljaGFyIG5hbWVbRUJUX1RBQkxFX01BWE5BTUVMRU5dOworCXVuc2lnbmVkIGludCB2YWxpZF9ob29rczsKKwkvKiBuciBvZiBydWxlcyBpbiB0aGUgdGFibGUgKi8KKwl1bnNpZ25lZCBpbnQgbmVudHJpZXM7CisJLyogdG90YWwgc2l6ZSBvZiB0aGUgZW50cmllcyAqLworCXVuc2lnbmVkIGludCBlbnRyaWVzX3NpemU7CisJLyogc3RhcnQgb2YgdGhlIGNoYWlucyAqLworCXN0cnVjdCBlYnRfZW50cmllcyAqaG9va19lbnRyeVtORl9CUl9OVU1IT09LU107CisJLyogbnIgb2YgY291bnRlcnMgdXNlcnNwYWNlIGV4cGVjdHMgYmFjayAqLworCXVuc2lnbmVkIGludCBudW1fY291bnRlcnM7CisJLyogd2hlcmUgdGhlIGtlcm5lbCB3aWxsIHB1dCB0aGUgb2xkIGNvdW50ZXJzICovCisJc3RydWN0IGVidF9jb3VudGVyICpjb3VudGVyczsKKwljaGFyICplbnRyaWVzOworfTsKKworc3RydWN0IGVidF9lbnRyaWVzIHsKKwkvKiB0aGlzIGZpZWxkIGlzIGFsd2F5cyBzZXQgdG8gemVybworCSAqIFNlZSBFQlRfRU5UUllfT1JfRU5UUklFUy4KKwkgKiBNdXN0IGJlIHNhbWUgc2l6ZSBhcyBlYnRfZW50cnkuYml0bWFzayAqLworCXVuc2lnbmVkIGludCBkaXN0aW5ndWlzaGVyOworCS8qIHRoZSBjaGFpbiBuYW1lICovCisJY2hhciBuYW1lW0VCVF9DSEFJTl9NQVhOQU1FTEVOXTsKKwkvKiBjb3VudGVyIG9mZnNldCBmb3IgdGhpcyBjaGFpbiAqLworCXVuc2lnbmVkIGludCBjb3VudGVyX29mZnNldDsKKwkvKiBvbmUgc3RhbmRhcmQgKGFjY2VwdCwgZHJvcCwgcmV0dXJuKSBwZXIgaG9vayAqLworCWludCBwb2xpY3k7CisJLyogbnIuIG9mIGVudHJpZXMgKi8KKwl1bnNpZ25lZCBpbnQgbmVudHJpZXM7CisJLyogZW50cnkgbGlzdCAqLworCWNoYXIgZGF0YVswXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoX19hbGlnbm9mX18oc3RydWN0IGVidF9yZXBsYWNlKSkpKTsKK307CisKKy8qIHVzZWQgZm9yIHRoZSBiaXRtYXNrIG9mIHN0cnVjdCBlYnRfZW50cnkgKi8KKworLyogVGhpcyBpcyBhIGhhY2sgdG8gbWFrZSBhIGRpZmZlcmVuY2UgYmV0d2VlbiBhbiBlYnRfZW50cnkgc3RydWN0IGFuZCBhbgorICogZWJ0X2VudHJpZXMgc3RydWN0IHdoZW4gdHJhdmVyc2luZyB0aGUgZW50cmllcyBmcm9tIHN0YXJ0IHRvIGVuZC4KKyAqIFVzaW5nIHRoaXMgc2ltcGxpZmllcyB0aGUgY29kZSBhIGxvdCwgd2hpbGUgc3RpbGwgYmVpbmcgYWJsZSB0byB1c2UKKyAqIGVidF9lbnRyaWVzLgorICogQ29udHJhcnksIGlwdGFibGVzIGRvZXNuJ3QgdXNlIHNvbWV0aGluZyBsaWtlIGVidF9lbnRyaWVzIGFuZCB0aGVyZWZvcmUgdXNlcworICogZGlmZmVyZW50IHRlY2huaXF1ZXMgZm9yIG5hbWluZyB0aGUgcG9saWN5IGFuZCBzdWNoLiBTbywgaXB0YWJsZXMgZG9lc24ndAorICogbmVlZCBhIGhhY2sgbGlrZSB0aGlzLgorICovCisjZGVmaW5lIEVCVF9FTlRSWV9PUl9FTlRSSUVTIDB4MDEKKy8qIHRoZXNlIGFyZSB0aGUgbm9ybWFsIG1hc2tzICovCisjZGVmaW5lIEVCVF9OT1BST1RPIDB4MDIKKyNkZWZpbmUgRUJUXzgwMl8zIDB4MDQKKyNkZWZpbmUgRUJUX1NPVVJDRU1BQyAweDA4CisjZGVmaW5lIEVCVF9ERVNUTUFDIDB4MTAKKyNkZWZpbmUgRUJUX0ZfTUFTSyAoRUJUX05PUFJPVE8gfCBFQlRfODAyXzMgfCBFQlRfU09VUkNFTUFDIHwgRUJUX0RFU1RNQUMgXAorICAgfCBFQlRfRU5UUllfT1JfRU5UUklFUykKKworI2RlZmluZSBFQlRfSVBST1RPIDB4MDEKKyNkZWZpbmUgRUJUX0lJTiAweDAyCisjZGVmaW5lIEVCVF9JT1VUIDB4MDQKKyNkZWZpbmUgRUJUX0lTT1VSQ0UgMHg4CisjZGVmaW5lIEVCVF9JREVTVCAweDEwCisjZGVmaW5lIEVCVF9JTE9HSUNBTElOIDB4MjAKKyNkZWZpbmUgRUJUX0lMT0dJQ0FMT1VUIDB4NDAKKyNkZWZpbmUgRUJUX0lOVl9NQVNLIChFQlRfSVBST1RPIHwgRUJUX0lJTiB8IEVCVF9JT1VUIHwgRUJUX0lMT0dJQ0FMSU4gXAorICAgfCBFQlRfSUxPR0lDQUxPVVQgfCBFQlRfSVNPVVJDRSB8IEVCVF9JREVTVCkKKworc3RydWN0IGVidF9lbnRyeV9tYXRjaCB7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJY2hhciBuYW1lW0VCVF9FWFRFTlNJT05fTUFYTkFNRUxFTl07CisJCQl1aW50OF90IHJldmlzaW9uOworCQl9OworCQlzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoOworCX0gdTsKKwkvKiBzaXplIG9mIGRhdGEgKi8KKwl1bnNpZ25lZCBpbnQgbWF0Y2hfc2l6ZTsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbMF0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKF9fYWxpZ25vZl9fKHN0cnVjdCBlYnRfcmVwbGFjZSkpKSk7Cit9OworCitzdHJ1Y3QgZWJ0X2VudHJ5X3dhdGNoZXIgeworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCWNoYXIgbmFtZVtFQlRfRVhURU5TSU9OX01BWE5BTUVMRU5dOworCQkJdWludDhfdCByZXZpc2lvbjsKKwkJfTsKKwkJc3RydWN0IHh0X3RhcmdldCAqd2F0Y2hlcjsKKwl9IHU7CisJLyogc2l6ZSBvZiBkYXRhICovCisJdW5zaWduZWQgaW50IHdhdGNoZXJfc2l6ZTsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbMF0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKF9fYWxpZ25vZl9fKHN0cnVjdCBlYnRfcmVwbGFjZSkpKSk7Cit9OworCitzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCB7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJY2hhciBuYW1lW0VCVF9FWFRFTlNJT05fTUFYTkFNRUxFTl07CisJCQl1aW50OF90IHJldmlzaW9uOworCQl9OworCQlzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQ7CisJfSB1OworCS8qIHNpemUgb2YgZGF0YSAqLworCXVuc2lnbmVkIGludCB0YXJnZXRfc2l6ZTsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbMF0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKF9fYWxpZ25vZl9fKHN0cnVjdCBlYnRfcmVwbGFjZSkpKSk7Cit9OworCisjZGVmaW5lIEVCVF9TVEFOREFSRF9UQVJHRVQgInN0YW5kYXJkIgorc3RydWN0IGVidF9zdGFuZGFyZF90YXJnZXQgeworCXN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0IHRhcmdldDsKKwlpbnQgdmVyZGljdDsKK307CisKKy8qIG9uZSBlbnRyeSAqLworc3RydWN0IGVidF9lbnRyeSB7CisJLyogdGhpcyBuZWVkcyB0byBiZSB0aGUgZmlyc3QgZmllbGQgKi8KKwl1bnNpZ25lZCBpbnQgYml0bWFzazsKKwl1bnNpZ25lZCBpbnQgaW52ZmxhZ3M7CisJX19iZTE2IGV0aHByb3RvOworCS8qIHRoZSBwaHlzaWNhbCBpbi1kZXYgKi8KKwljaGFyIGluW0lGTkFNU0laXTsKKwkvKiB0aGUgbG9naWNhbCBpbi1kZXYgKi8KKwljaGFyIGxvZ2ljYWxfaW5bSUZOQU1TSVpdOworCS8qIHRoZSBwaHlzaWNhbCBvdXQtZGV2ICovCisJY2hhciBvdXRbSUZOQU1TSVpdOworCS8qIHRoZSBsb2dpY2FsIG91dC1kZXYgKi8KKwljaGFyIGxvZ2ljYWxfb3V0W0lGTkFNU0laXTsKKwl1bnNpZ25lZCBjaGFyIHNvdXJjZW1hY1tFVEhfQUxFTl07CisJdW5zaWduZWQgY2hhciBzb3VyY2Vtc2tbRVRIX0FMRU5dOworCXVuc2lnbmVkIGNoYXIgZGVzdG1hY1tFVEhfQUxFTl07CisJdW5zaWduZWQgY2hhciBkZXN0bXNrW0VUSF9BTEVOXTsKKwkvKiBzaXplb2YgZWJ0X2VudHJ5ICsgbWF0Y2hlcyAqLworCXVuc2lnbmVkIGludCB3YXRjaGVyc19vZmZzZXQ7CisJLyogc2l6ZW9mIGVidF9lbnRyeSArIG1hdGNoZXMgKyB3YXRjaGVycyAqLworCXVuc2lnbmVkIGludCB0YXJnZXRfb2Zmc2V0OworCS8qIHNpemVvZiBlYnRfZW50cnkgKyBtYXRjaGVzICsgd2F0Y2hlcnMgKyB0YXJnZXQgKi8KKwl1bnNpZ25lZCBpbnQgbmV4dF9vZmZzZXQ7CisJdW5zaWduZWQgY2hhciBlbGVtc1swXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoX19hbGlnbm9mX18oc3RydWN0IGVidF9yZXBsYWNlKSkpKTsKK307CisKKy8qIHtnLHN9ZXRzb2Nrb3B0IG51bWJlcnMgKi8KKyNkZWZpbmUgRUJUX0JBU0VfQ1RMICAgICAgICAgICAgMTI4CisKKyNkZWZpbmUgRUJUX1NPX1NFVF9FTlRSSUVTICAgICAgKEVCVF9CQVNFX0NUTCkKKyNkZWZpbmUgRUJUX1NPX1NFVF9DT1VOVEVSUyAgICAgKEVCVF9TT19TRVRfRU5UUklFUysxKQorI2RlZmluZSBFQlRfU09fU0VUX01BWCAgICAgICAgICAoRUJUX1NPX1NFVF9DT1VOVEVSUysxKQorCisjZGVmaW5lIEVCVF9TT19HRVRfSU5GTyAgICAgICAgIChFQlRfQkFTRV9DVEwpCisjZGVmaW5lIEVCVF9TT19HRVRfRU5UUklFUyAgICAgIChFQlRfU09fR0VUX0lORk8rMSkKKyNkZWZpbmUgRUJUX1NPX0dFVF9JTklUX0lORk8gICAgKEVCVF9TT19HRVRfRU5UUklFUysxKQorI2RlZmluZSBFQlRfU09fR0VUX0lOSVRfRU5UUklFUyAoRUJUX1NPX0dFVF9JTklUX0lORk8rMSkKKyNkZWZpbmUgRUJUX1NPX0dFVF9NQVggICAgICAgICAgKEVCVF9TT19HRVRfSU5JVF9FTlRSSUVTKzEpCisKKworLyogYmxhdGVudGx5IHN0b2xlbiBmcm9tIGlwX3RhYmxlcy5oCisgKiBmbiByZXR1cm5zIDAgdG8gY29udGludWUgaXRlcmF0aW9uICovCisjZGVmaW5lIEVCVF9NQVRDSF9JVEVSQVRFKGUsIGZuLCBhcmdzLi4uKSAgICAgICAgICAgICAgICAgICBcCisoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJdW5zaWduZWQgaW50IF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpbnQgX19yZXQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXN0cnVjdCBlYnRfZW50cnlfbWF0Y2ggKl9fbWF0Y2g7ICAgICAgICAgICAgICAgICAgICBcCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlmb3IgKF9faSA9IHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJ5KTsgICAgICAgICAgICAgICAgXAorCSAgICAgX19pIDwgKGUpLT53YXRjaGVyc19vZmZzZXQ7ICAgICAgICAgICAgICAgICAgICBcCisJICAgICBfX2kgKz0gX19tYXRjaC0+bWF0Y2hfc2l6ZSArICAgICAgICAgICAgICAgICAgIFwKKwkgICAgIHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoKSkgeyAgICAgICAgICAgICAgXAorCQlfX21hdGNoID0gKHZvaWQgKikoZSkgKyBfX2k7ICAgICAgICAgICAgICAgIFwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCV9fcmV0ID0gZm4oX19tYXRjaCAsICMjIGFyZ3MpOyAgICAgICAgICAgICAgXAorCQlpZiAoX19yZXQgIT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmIChfX3JldCA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWlmIChfX2kgIT0gKGUpLT53YXRjaGVyc19vZmZzZXQpICAgICAgICAgICAgXAorCQkJX19yZXQgPSAtRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJX19yZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisKKyNkZWZpbmUgRUJUX1dBVENIRVJfSVRFUkFURShlLCBmbiwgYXJncy4uLikgICAgICAgICAgICAgICAgIFwKKyh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl1bnNpZ25lZCBpbnQgX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWludCBfX3JldCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJc3RydWN0IGVidF9lbnRyeV93YXRjaGVyICpfX3dhdGNoZXI7ICAgICAgICAgICAgICAgIFwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWZvciAoX19pID0gZS0+d2F0Y2hlcnNfb2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICBfX2kgPCAoZSktPnRhcmdldF9vZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgIF9faSArPSBfX3dhdGNoZXItPndhdGNoZXJfc2l6ZSArICAgICAgICAgICAgICAgXAorCSAgICAgc2l6ZW9mKHN0cnVjdCBlYnRfZW50cnlfd2F0Y2hlcikpIHsgICAgICAgICAgICBcCisJCV9fd2F0Y2hlciA9ICh2b2lkICopKGUpICsgX19pOyAgICAgICAgICAgICAgXAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJX19yZXQgPSBmbihfX3dhdGNoZXIgLCAjIyBhcmdzKTsgICAgICAgICAgICBcCisJCWlmIChfX3JldCAhPSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKF9fcmV0ID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJaWYgKF9faSAhPSAoZSktPnRhcmdldF9vZmZzZXQpICAgICAgICAgICAgICBcCisJCQlfX3JldCA9IC1FSU5WQUw7ICAgICAgICAgICAgICAgICAgICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlfX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKworI2RlZmluZSBFQlRfRU5UUllfSVRFUkFURShlbnRyaWVzLCBzaXplLCBmbiwgYXJncy4uLikgICAgICAgXAorKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXVuc2lnbmVkIGludCBfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaW50IF9fcmV0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlzdHJ1Y3QgZWJ0X2VudHJ5ICpfX2VudHJ5OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZm9yIChfX2kgPSAwOyBfX2kgPCAoc2l6ZSk7KSB7ICAgICAgICAgICAgICAgICAgICAgIFwKKwkJX19lbnRyeSA9ICh2b2lkICopKGVudHJpZXMpICsgX19pOyAgICAgICAgICBcCisJCV9fcmV0ID0gZm4oX19lbnRyeSAsICMjIGFyZ3MpOyAgICAgICAgICAgICAgXAorCQlpZiAoX19yZXQgIT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJaWYgKF9fZW50cnktPmJpdG1hc2sgIT0gMCkgICAgICAgICAgICAgICAgICBcCisJCQlfX2kgKz0gX19lbnRyeS0+bmV4dF9vZmZzZXQ7ICAgICAgICBcCisJCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJX19pICs9IHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJpZXMpOyAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKF9fcmV0ID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJaWYgKF9faSAhPSAoc2l6ZSkpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlfX3JldCA9IC1FSU5WQUw7ICAgICAgICAgICAgICAgICAgICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlfX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKworI2VuZGlmIC8qIF9fTElOVVhfQlJJREdFX0VGRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3R5cGVzLmggYi9pbmNsdWRlL2xpbnV4L3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNlYTc4ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvdHlwZXMuaApAQCAtMCwwICsxLDUxIEBACisjaWZuZGVmIF9MSU5VWF9UWVBFU19ICisjZGVmaW5lIF9MSU5VWF9UWVBFU19ICisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X3R5cGVzLmg+CisKKworLyoKKyAqIEJlbG93IGFyZSB0cnVseSBMaW51eC1zcGVjaWZpYyB0eXBlcyB0aGF0IHNob3VsZCBuZXZlciBjb2xsaWRlIHdpdGgKKyAqIGFueSBhcHBsaWNhdGlvbi9saWJyYXJ5IHRoYXQgd2FudHMgbGludXgvdHlwZXMuaC4KKyAqLworCisjaWZkZWYgX19DSEVDS0VSX18KKyNkZWZpbmUgX19iaXR3aXNlX18gX19hdHRyaWJ1dGVfXygoYml0d2lzZSkpCisjZWxzZQorI2RlZmluZSBfX2JpdHdpc2VfXworI2VuZGlmCisjaWZkZWYgX19DSEVDS19FTkRJQU5fXworI2RlZmluZSBfX2JpdHdpc2UgX19iaXR3aXNlX18KKyNlbHNlCisjZGVmaW5lIF9fYml0d2lzZQorI2VuZGlmCisKK3R5cGVkZWYgX191MTYgX19iaXR3aXNlIF9fbGUxNjsKK3R5cGVkZWYgX191MTYgX19iaXR3aXNlIF9fYmUxNjsKK3R5cGVkZWYgX191MzIgX19iaXR3aXNlIF9fbGUzMjsKK3R5cGVkZWYgX191MzIgX19iaXR3aXNlIF9fYmUzMjsKK3R5cGVkZWYgX191NjQgX19iaXR3aXNlIF9fbGU2NDsKK3R5cGVkZWYgX191NjQgX19iaXR3aXNlIF9fYmU2NDsKKwordHlwZWRlZiBfX3UxNiBfX2JpdHdpc2UgX19zdW0xNjsKK3R5cGVkZWYgX191MzIgX19iaXR3aXNlIF9fd3N1bTsKKworLyoKKyAqIGFsaWduZWRfdTY0IHNob3VsZCBiZSB1c2VkIGluIGRlZmluaW5nIGtlcm5lbDwtPnVzZXJzcGFjZSBBQklzIHRvIGF2b2lkCisgKiBjb21tb24gMzIvNjQtYml0IGNvbXBhdCBwcm9ibGVtcy4KKyAqIDY0LWJpdCB2YWx1ZXMgYWxpZ24gdG8gNC1ieXRlIGJvdW5kYXJpZXMgb24geDg2XzMyIChhbmQgcG9zc2libHkgb3RoZXIKKyAqIGFyY2hpdGVjdHVyZXMpIGFuZCB0byA4LWJ5dGUgYm91bmRhcmllcyBvbiA2NC1iaXQgYXJjaGl0ZWN0dXJlcy4gIFRoZSBuZXcKKyAqIGFsaWduZWRfNjQgdHlwZSBlbmZvcmNlcyA4LWJ5dGUgYWxpZ25tZW50IHNvIHRoYXQgc3RydWN0cyBjb250YWluaW5nCisgKiBhbGlnbmVkXzY0IHZhbHVlcyBoYXZlIHRoZSBzYW1lIGFsaWdubWVudCBvbiAzMi1iaXQgYW5kIDY0LWJpdCBhcmNoaXRlY3R1cmVzLgorICogTm8gY29udmVyc2lvbnMgYXJlIG5lY2Vzc2FyeSBiZXR3ZWVuIDMyLWJpdCB1c2VyLXNwYWNlIGFuZCBhIDY0LWJpdCBrZXJuZWwuCisgKi8KKyNkZWZpbmUgX19hbGlnbmVkX3U2NCBfX3U2NCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSkKKyNkZWZpbmUgX19hbGlnbmVkX2JlNjQgX19iZTY0IF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKQorI2RlZmluZSBfX2FsaWduZWRfbGU2NCBfX2xlNjQgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpCisKKyNlbmRpZiAvKiAgX19BU1NFTUJMWV9fICovCisjZW5kaWYgLyogX0xJTlVYX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmVidGMuYyBiL2xpYmVidGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTJjMzA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZWJ0Yy5jCkBAIC0wLDAgKzEsMTMyMCBAQAorLyoKKyAqIGxpYmVidGMuYywgSmFudWFyeSAyMDA0CisgKgorICogQ29udGFpbnMgdGhlIGZ1bmN0aW9ucyB3aXRoIHdoaWNoIHRvIG1ha2UgYSB0YWJsZSBpbiB1c2Vyc3BhY2UuCisgKgorICogQXV0aG9yOiBCYXJ0IERlIFNjaHV5bWVyCisgKgorICogIFRoaXMgY29kZSBpcyBzdG9uZ2x5IGluc3BpcmVkIG9uIHRoZSBpcHRhYmxlcyBjb2RlIHdoaWNoIGlzCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5IFBhdWwgYFJ1c3R5JyBSdXNzZWxsICYgTWljaGFlbCBKLiBOZXVsaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSAiaW5jbHVkZS9lYnRhYmxlc191LmgiCisjaW5jbHVkZSAiaW5jbHVkZS9ldGhlcm5ldGRiLmgiCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpYmdlbi5oPgorCitzdGF0aWMgdm9pZCBkZWNyZWFzZV9jaGFpbl9qdW1wcyhzdHJ1Y3QgZWJ0X3VfcmVwbGFjZSAqcmVwbGFjZSk7CitzdGF0aWMgaW50IGl0ZXJhdGVfZW50cmllcyhzdHJ1Y3QgZWJ0X3VfcmVwbGFjZSAqcmVwbGFjZSwgaW50IHR5cGUpOworCisvKiBUaGUgc3RhbmRhcmQgbmFtZXMgKi8KK2NvbnN0IGNoYXIgKmVidF9ob29rbmFtZXNbTkZfQlJfTlVNSE9PS1NdID0KK3sKKwlbTkZfQlJfUFJFX1JPVVRJTkddIlBSRVJPVVRJTkciLAorCVtORl9CUl9MT0NBTF9JTl0iSU5QVVQiLAorCVtORl9CUl9GT1JXQVJEXSJGT1JXQVJEIiwKKwlbTkZfQlJfTE9DQUxfT1VUXSJPVVRQVVQiLAorCVtORl9CUl9QT1NUX1JPVVRJTkddIlBPU1RST1VUSU5HIiwKKwlbTkZfQlJfQlJPVVRJTkddIkJST1VUSU5HIgorfTsKKworLyogVGhlIGZvdXIgdGFyZ2V0IG5hbWVzICovCitjb25zdCBjaGFyKiBlYnRfc3RhbmRhcmRfdGFyZ2V0c1tOVU1fU1RBTkRBUkRfVEFSR0VUU10gPQoreworCSJBQ0NFUFQiLAorCSJEUk9QIiwKKwkiQ09OVElOVUUiLAorCSJSRVRVUk4iLAorfTsKKworLyogVGhlIGxpc3RzIG9mIHN1cHBvcnRlZCB0YWJsZXMsIG1hdGNoZXMsIHdhdGNoZXJzIGFuZCB0YXJnZXRzICovCitzdHJ1Y3QgZWJ0X3VfdGFibGUgKmVidF90YWJsZXM7CitzdHJ1Y3QgZWJ0X3VfbWF0Y2ggKmVidF9tYXRjaGVzOworc3RydWN0IGVidF91X3dhdGNoZXIgKmVidF93YXRjaGVyczsKK3N0cnVjdCBlYnRfdV90YXJnZXQgKmVidF90YXJnZXRzOworCisvKiBGaW5kIHRoZSByaWdodCBzdHJ1Y3R1cmUgYmVsb25naW5nIHRvIGEgbmFtZSAqLworc3RydWN0IGVidF91X3RhcmdldCAqZWJ0X2ZpbmRfdGFyZ2V0KGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGVidF91X3RhcmdldCAqdCA9IGVidF90YXJnZXRzOworCisJd2hpbGUgKHQgJiYgc3RyY21wKHQtPm5hbWUsIG5hbWUpKQorCQl0ID0gdC0+bmV4dDsKKwlyZXR1cm4gdDsKK30KKworc3RydWN0IGVidF91X21hdGNoICplYnRfZmluZF9tYXRjaChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBlYnRfdV9tYXRjaCAqbSA9IGVidF9tYXRjaGVzOworCisJd2hpbGUgKG0gJiYgc3RyY21wKG0tPm5hbWUsIG5hbWUpKQorCQltID0gbS0+bmV4dDsKKwlyZXR1cm4gbTsKK30KKworc3RydWN0IGVidF91X3dhdGNoZXIgKmVidF9maW5kX3dhdGNoZXIoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZWJ0X3Vfd2F0Y2hlciAqdyA9IGVidF93YXRjaGVyczsKKworCXdoaWxlICh3ICYmIHN0cmNtcCh3LT5uYW1lLCBuYW1lKSkKKwkJdyA9IHctPm5leHQ7CisJcmV0dXJuIHc7Cit9CisKK3N0cnVjdCBlYnRfdV90YWJsZSAqZWJ0X2ZpbmRfdGFibGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZWJ0X3VfdGFibGUgKnQgPSBlYnRfdGFibGVzOworCisJd2hpbGUgKHQgJiYgc3RyY21wKHQtPm5hbWUsIG5hbWUpKQorCQl0ID0gdC0+bmV4dDsKKwlyZXR1cm4gdDsKK30KKworLyogUHJpbnRzIGFsbCByZWdpc3RlcmVkIGV4dGVuc2lvbnMgKi8KK3ZvaWQgZWJ0X2xpc3RfZXh0ZW5zaW9ucygpCit7CisJc3RydWN0IGVidF91X3RhYmxlICp0YmwgPSBlYnRfdGFibGVzOworICAgICAgICBzdHJ1Y3QgZWJ0X3VfdGFyZ2V0ICp0ID0gZWJ0X3RhcmdldHM7CisgICAgICAgIHN0cnVjdCBlYnRfdV9tYXRjaCAqbSA9IGVidF9tYXRjaGVzOworICAgICAgICBzdHJ1Y3QgZWJ0X3Vfd2F0Y2hlciAqdyA9IGVidF93YXRjaGVyczsKKworCVBSSU5UX1ZFUlNJT047CisJcHJpbnRmKCJMb2FkZWQgdXNlcnNwYWNlIGV4dGVuc2lvbnM6XG5cbkxvYWRlZCB0YWJsZXM6XG4iKTsKKyAgICAgICAgd2hpbGUgKHRibCkgeworCQlwcmludGYoIiVzXG4iLCB0YmwtPm5hbWUpOworICAgICAgICAgICAgICAgIHRibCA9IHRibC0+bmV4dDsKKwl9CisJcHJpbnRmKCJcbkxvYWRlZCB0YXJnZXRzOlxuIik7CisgICAgICAgIHdoaWxlICh0KSB7CisJCXByaW50ZigiJXNcbiIsIHQtPm5hbWUpOworICAgICAgICAgICAgICAgIHQgPSB0LT5uZXh0OworCX0KKwlwcmludGYoIlxuTG9hZGVkIG1hdGNoZXM6XG4iKTsKKyAgICAgICAgd2hpbGUgKG0pIHsKKwkJcHJpbnRmKCIlc1xuIiwgbS0+bmFtZSk7CisgICAgICAgICAgICAgICAgbSA9IG0tPm5leHQ7CisJfQorCXByaW50ZigiXG5Mb2FkZWQgd2F0Y2hlcnM6XG4iKTsKKyAgICAgICAgd2hpbGUgKHcpIHsKKwkJcHJpbnRmKCIlc1xuIiwgdy0+bmFtZSk7CisgICAgICAgICAgICAgICAgdyA9IHctPm5leHQ7CisJfQorfQorCitpbnQgdXNlX2xvY2tmZDsKKy8qIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSB3aGVuIHRoZSBmaWxlIGlzIGxvY2tlZCBieSBhbm90aGVyIHByb2Nlc3MKKyAqIG9yIC0yIG9uIGFueSBvdGhlciBlcnJvci4gKi8KK3N0YXRpYyBpbnQgbG9ja19maWxlKCkKK3sKKwljaGFyIHBhdGhidWZbXSA9IExPQ0tGSUxFOworCWludCBmZCwgdHJ5ID0gMDsKKworcmV0cnk6CisJZmQgPSBvcGVuKExPQ0tGSUxFLCBPX0NSRUFUfE9fV1JPTkxZfE9fQ0xPRVhFQywgMDA2MDApOworCWlmIChmZCA8IDApIHsKKwkJaWYgKHRyeSA9PSAxIHx8IG1rZGlyKGRpcm5hbWUocGF0aGJ1ZiksIDAwNzAwKSkKKwkJCXJldHVybiAtMjsKKwkJdHJ5ID0gMTsKKwkJZ290byByZXRyeTsKKwl9CisJcmV0dXJuIGZsb2NrKGZkLCBMT0NLX0VYKTsKK30KKworLyogR2V0IHRoZSB0YWJsZSBmcm9tIHRoZSBrZXJuZWwgb3IgZnJvbSBhIGJpbmFyeSBmaWxlCisgKiBpbml0OiAxID0gYXNrIHRoZSBrZXJuZWwgZm9yIHRoZSBpbml0aWFsIGNvbnRlbnRzIG9mIGEgdGFibGUsIGkuZS4gdGhlCisgKiAgICAgICAgICAgd2F5IGl0IGxvb2tzIHdoZW4gdGhlIHRhYmxlIGlzIGluc21vZCdlZAorICogICAgICAgMCA9IGdldCB0aGUgY3VycmVudCBkYXRhIGluIHRoZSB0YWJsZSAqLworaW50IGVidF9nZXRfa2VybmVsX3RhYmxlKHN0cnVjdCBlYnRfdV9yZXBsYWNlICpyZXBsYWNlLCBpbnQgaW5pdCkKK3sKKwlpbnQgcmV0OworCisJaWYgKCFlYnRfZmluZF90YWJsZShyZXBsYWNlLT5uYW1lKSkgeworCQllYnRfcHJpbnRfZXJyb3IoIkJhZCB0YWJsZSBuYW1lICclcyciLCByZXBsYWNlLT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKwl3aGlsZSAodXNlX2xvY2tmZCAmJiAocmV0ID0gbG9ja19maWxlKCkpKSB7CisJCWlmIChyZXQgPT0gLTIpIHsKKwkJCS8qIGlmIHdlIGdldCBhbiBlcnJvciB3ZSBjYW4ndCBoYW5kbGUsIHdlIGV4aXQuIFRoaXMKKwkJCSAqIGRvZXNuJ3QgYnJlYWsgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgc2luY2UgdXNpbmcKKwkJCSAqIHRoaXMgZmlsZSBsb2NraW5nIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuICovCisJCQllYnRfcHJpbnRfZXJyb3IyKCJVbmFibGUgdG8gY3JlYXRlIGxvY2sgZmlsZSAiTE9DS0ZJTEUpOworCQl9CisJCWZwcmludGYoc3RkZXJyLCAiVHJ5aW5nIHRvIG9idGFpbiBsb2NrICVzXG4iLCBMT0NLRklMRSk7CisJCXNsZWVwKDEpOworCX0KKwkvKiBHZXQgdGhlIGtlcm5lbCdzIGluZm9ybWF0aW9uICovCisJaWYgKGVidF9nZXRfdGFibGUocmVwbGFjZSwgaW5pdCkpIHsKKwkJaWYgKGVidF9lcnJvcm1zZ1swXSAhPSAnXDAnKQorCQkJcmV0dXJuIC0xOworCQllYnRhYmxlc19pbnNtb2QoImVidGFibGVzIik7CisJCWlmIChlYnRfZ2V0X3RhYmxlKHJlcGxhY2UsIGluaXQpKSB7CisJCQllYnRfcHJpbnRfZXJyb3IoIlRoZSBrZXJuZWwgZG9lc24ndCBzdXBwb3J0IHRoZSBlYnRhYmxlcyAnJXMnIHRhYmxlIiwgcmVwbGFjZS0+bmFtZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFB1dCBzYW5lIHZhbHVlcyBpbnRvIGEgbmV3IGVudHJ5ICovCit2b2lkIGVidF9pbml0aWFsaXplX2VudHJ5KHN0cnVjdCBlYnRfdV9lbnRyeSAqZSkKK3sKKwllLT5iaXRtYXNrID0gRUJUX05PUFJPVE87CisJZS0+aW52ZmxhZ3MgPSAwOworCWUtPmV0aHByb3RvID0gMDsKKwlzdHJjcHkoZS0+aW4sICIiKTsKKwlzdHJjcHkoZS0+b3V0LCAiIik7CisJc3RyY3B5KGUtPmxvZ2ljYWxfaW4sICIiKTsKKwlzdHJjcHkoZS0+bG9naWNhbF9vdXQsICIiKTsKKwllLT5tX2xpc3QgPSBOVUxMOworCWUtPndfbGlzdCA9IE5VTEw7CisJZS0+dCA9IChzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqKWVidF9maW5kX3RhcmdldChFQlRfU1RBTkRBUkRfVEFSR0VUKTsKKwllYnRfZmluZF90YXJnZXQoRUJUX1NUQU5EQVJEX1RBUkdFVCktPnVzZWQgPSAxOworCWUtPmNudC5wY250ID0gZS0+Y250LmJjbnQgPSBlLT5jbnRfc3VycGx1cy5wY250ID0gZS0+Y250X3N1cnBsdXMuYmNudCA9IDA7CisKKwlpZiAoIWUtPnQpCisJCWVidF9wcmludF9idWcoIkNvdWxkbid0IGxvYWQgc3RhbmRhcmQgdGFyZ2V0Iik7CisJKChzdHJ1Y3QgZWJ0X3N0YW5kYXJkX3RhcmdldCAqKSgoc3RydWN0IGVidF91X3RhcmdldCAqKWUtPnQpLT50KS0+dmVyZGljdCA9IEVCVF9DT05USU5VRTsKK30KKworLyogRnJlZSB1cCB0aGUgbWVtb3J5IG9mIHRoZSB0YWJsZSBoZWxkIGluIHVzZXJzcGFjZSwgKnJlcGxhY2UgY2FuIGJlIHJldXNlZCAqLwordm9pZCBlYnRfY2xlYW51cF9yZXBsYWNlKHN0cnVjdCBlYnRfdV9yZXBsYWNlICpyZXBsYWNlKQoreworCWludCBpOworCXN0cnVjdCBlYnRfdV9lbnRyaWVzICplbnRyaWVzOworCXN0cnVjdCBlYnRfY250Y2hhbmdlcyAqY2MxLCAqY2MyOworCXN0cnVjdCBlYnRfdV9lbnRyeSAqdV9lMSwgKnVfZTI7CisKKwlyZXBsYWNlLT5uYW1lWzBdID0gJ1wwJzsKKwlyZXBsYWNlLT52YWxpZF9ob29rcyA9IDA7CisJcmVwbGFjZS0+bmVudHJpZXMgPSAwOworCXJlcGxhY2UtPm51bV9jb3VudGVycyA9IDA7CisJcmVwbGFjZS0+ZmxhZ3MgPSAwOworCXJlcGxhY2UtPmNvbW1hbmQgPSAwOworCXJlcGxhY2UtPnNlbGVjdGVkX2NoYWluID0gLTE7CisJZnJlZShyZXBsYWNlLT5maWxlbmFtZSk7CisJcmVwbGFjZS0+ZmlsZW5hbWUgPSBOVUxMOworCWZyZWUocmVwbGFjZS0+Y291bnRlcnMpOworCXJlcGxhY2UtPmNvdW50ZXJzID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCByZXBsYWNlLT5udW1fY2hhaW5zOyBpKyspIHsKKwkJaWYgKCEoZW50cmllcyA9IHJlcGxhY2UtPmNoYWluc1tpXSkpCisJCQljb250aW51ZTsKKwkJdV9lMSA9IGVudHJpZXMtPmVudHJpZXMtPm5leHQ7CisJCXdoaWxlICh1X2UxICE9IGVudHJpZXMtPmVudHJpZXMpIHsKKwkJCWVidF9mcmVlX3VfZW50cnkodV9lMSk7CisJCQl1X2UyID0gdV9lMS0+bmV4dDsKKwkJCWZyZWUodV9lMSk7CisJCQl1X2UxID0gdV9lMjsKKwkJfQorCQlmcmVlKGVudHJpZXMtPmVudHJpZXMpOworCQlmcmVlKGVudHJpZXMpOworCQlyZXBsYWNlLT5jaGFpbnNbaV0gPSBOVUxMOworCX0KKwljYzEgPSByZXBsYWNlLT5jYy0+bmV4dDsKKwl3aGlsZSAoY2MxICE9IHJlcGxhY2UtPmNjKSB7CisJCWNjMiA9IGNjMS0+bmV4dDsKKwkJZnJlZShjYzEpOworCQljYzEgPSBjYzI7CisJfQorCXJlcGxhY2UtPmNjLT5uZXh0ID0gcmVwbGFjZS0+Y2MtPnByZXYgPSByZXBsYWNlLT5jYzsKK30KKworLyogU2hvdWxkIGJlIGNhbGxlZCwgZS5nLiwgYmV0d2VlbiAyIHJ1bGUgYWRkcyAqLwordm9pZCBlYnRfcmVpbml0X2V4dGVuc2lvbnMoKQoreworCXN0cnVjdCBlYnRfdV9tYXRjaCAqbTsKKwlzdHJ1Y3QgZWJ0X3Vfd2F0Y2hlciAqdzsKKwlzdHJ1Y3QgZWJ0X3VfdGFyZ2V0ICp0OworCWludCBzaXplOworCisJLyogVGhlIGluaXQgZnVuY3Rpb25zIHNob3VsZCBkZXRlcm1pbmUgYnkgdGhlbXNlbHZlcyB3aGV0aGVyIHRoZXkgYXJlCisJICogY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZSBvciBub3QgKHdoZW4gbmVjZXNzYXJ5KS4gKi8KKwlmb3IgKG0gPSBlYnRfbWF0Y2hlczsgbTsgbSA9IG0tPm5leHQpIHsKKwkJaWYgKG0tPnVzZWQpIHsKKwkJCXNpemUgPSBFQlRfQUxJR04obS0+c2l6ZSkgKyBzaXplb2Yoc3RydWN0IGVidF9lbnRyeV9tYXRjaCk7CisJCQltLT5tID0gKHN0cnVjdCBlYnRfZW50cnlfbWF0Y2ggKiltYWxsb2Moc2l6ZSk7CisJCQlpZiAoIW0tPm0pCisJCQkJZWJ0X3ByaW50X21lbW9yeSgpOworCQkJc3RyY3B5KG0tPm0tPnUubmFtZSwgbS0+bmFtZSk7CisJCQltLT5tLT51LnJldmlzaW9uID0gbS0+cmV2aXNpb247CisJCQltLT5tLT5tYXRjaF9zaXplID0gRUJUX0FMSUdOKG0tPnNpemUpOworCQkJbS0+dXNlZCA9IDA7CisJCX0KKwkJbS0+ZmxhZ3MgPSAwOyAvKiBBbiBlcnJvciBjYW4gb2NjdXIgYmVmb3JlIHVzZWQgaXMgc2V0LCB3aGlsZSBmbGFncyBpcyBjaGFuZ2VkLiAqLworCQltLT5pbml0KG0tPm0pOworCX0KKwlmb3IgKHcgPSBlYnRfd2F0Y2hlcnM7IHc7IHcgPSB3LT5uZXh0KSB7CisJCWlmICh3LT51c2VkKSB7CisJCQlzaXplID0gRUJUX0FMSUdOKHctPnNpemUpICsgc2l6ZW9mKHN0cnVjdCBlYnRfZW50cnlfd2F0Y2hlcik7CisJCQl3LT53ID0gKHN0cnVjdCBlYnRfZW50cnlfd2F0Y2hlciAqKW1hbGxvYyhzaXplKTsKKwkJCWlmICghdy0+dykKKwkJCQllYnRfcHJpbnRfbWVtb3J5KCk7CisJCQlzdHJjcHkody0+dy0+dS5uYW1lLCB3LT5uYW1lKTsKKwkJCXctPnctPndhdGNoZXJfc2l6ZSA9IEVCVF9BTElHTih3LT5zaXplKTsKKwkJCXctPnVzZWQgPSAwOworCQl9CisJCXctPmZsYWdzID0gMDsKKwkJdy0+aW5pdCh3LT53KTsKKwl9CisJZm9yICh0ID0gZWJ0X3RhcmdldHM7IHQ7IHQgPSB0LT5uZXh0KSB7CisJCWlmICh0LT51c2VkKSB7CisJCQlzaXplID0gRUJUX0FMSUdOKHQtPnNpemUpICsgc2l6ZW9mKHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0KTsKKwkJCXQtPnQgPSAoc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKiltYWxsb2Moc2l6ZSk7CisJCQlpZiAoIXQtPnQpCisJCQkJZWJ0X3ByaW50X21lbW9yeSgpOworCQkJc3RyY3B5KHQtPnQtPnUubmFtZSwgdC0+bmFtZSk7CisJCQl0LT50LT50YXJnZXRfc2l6ZSA9IEVCVF9BTElHTih0LT5zaXplKTsKKwkJCXQtPnVzZWQgPSAwOworCQl9CisJCXQtPmZsYWdzID0gMDsKKwkJdC0+aW5pdCh0LT50KTsKKwl9Cit9CisKKy8qIFRoaXMgZG9lc24ndCBmcmVlIGUsIGJlY2F1c2UgdGhlIGNhbGxpbmcgZnVuY3Rpb24gbWlnaHQgbmVlZCBlLT5uZXh0ICovCit2b2lkIGVidF9mcmVlX3VfZW50cnkoc3RydWN0IGVidF91X2VudHJ5ICplKQoreworCXN0cnVjdCBlYnRfdV9tYXRjaF9saXN0ICptX2wsICptX2wyOworCXN0cnVjdCBlYnRfdV93YXRjaGVyX2xpc3QgKndfbCwgKndfbDI7CisKKwltX2wgPSBlLT5tX2xpc3Q7CisJd2hpbGUgKG1fbCkgeworCQltX2wyID0gbV9sLT5uZXh0OworCQlmcmVlKG1fbC0+bSk7CisJCWZyZWUobV9sKTsKKwkJbV9sID0gbV9sMjsKKwl9CisJd19sID0gZS0+d19saXN0OworCXdoaWxlICh3X2wpIHsKKwkJd19sMiA9IHdfbC0+bmV4dDsKKwkJZnJlZSh3X2wtPncpOworCQlmcmVlKHdfbCk7CisJCXdfbCA9IHdfbDI7CisJfQorCWZyZWUoZS0+dCk7Cit9CisKK3N0YXRpYyBjaGFyICpnZXRfbW9kcHJvYmUodm9pZCkKK3sKKwlpbnQgcHJvY2ZpbGU7CisJY2hhciAqcmV0OworCisJcHJvY2ZpbGUgPSBvcGVuKFBST0NfU1lTX01PRFBST0JFLCBPX1JET05MWSk7CisJaWYgKHByb2NmaWxlIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXQgPSBtYWxsb2MoMTAyNCk7CisJaWYgKHJldCkgeworCQlpZiAocmVhZChwcm9jZmlsZSwgcmV0LCAxMDI0KSA9PSAtMSkKKwkJCWdvdG8gZmFpbDsKKwkJLyogVGhlIGtlcm5lbCBhZGRzIGEgJ1xuJyAqLworCQlyZXRbMTAyM10gPSAnXG4nOworCQkqc3RyY2hyKHJldCwgJ1xuJykgPSAnXDAnOworCQljbG9zZShwcm9jZmlsZSk7CisJCXJldHVybiByZXQ7CisJfQorIGZhaWw6CisJZnJlZShyZXQpOworCWNsb3NlKHByb2NmaWxlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworY2hhciAqZWJ0X21vZHByb2JlOworLyogVHJ5IHRvIGxvYWQgdGhlIGtlcm5lbCBtb2R1bGUsIGFuYWxvZ291cyB0byBpcF90YWJsZXMuYyAqLworaW50IGVidGFibGVzX2luc21vZChjb25zdCBjaGFyICptb2RuYW1lKQoreworCWNoYXIgKmJ1ZiA9IE5VTEw7CisJY2hhciAqYXJndlszXTsKKworCS8qIElmIHRoZXkgZG9uJ3QgZXhwbGljaXRseSBzZXQgaXQsIHJlYWQgb3V0IG9mIC9wcm9jICovCisJaWYgKCFlYnRfbW9kcHJvYmUpIHsKKwkJYnVmID0gZ2V0X21vZHByb2JlKCk7CisJCWlmICghYnVmKQorCQkJcmV0dXJuIC0xOworCQllYnRfbW9kcHJvYmUgPSBidWY7IC8qIEtlZXAgdGhlIHZhbHVlIGZvciBwb3NzaWJsZSBsYXRlciB1c2UgKi8KKwl9CisKKwlzd2l0Y2ggKGZvcmsoKSkgeworCWNhc2UgMDoKKwkJYXJndlswXSA9IChjaGFyICopZWJ0X21vZHByb2JlOworCQlhcmd2WzFdID0gKGNoYXIgKiltb2RuYW1lOworCQlhcmd2WzJdID0gTlVMTDsKKwkJZXhlY3YoYXJndlswXSwgYXJndik7CisKKwkJLyogTm90IHVzdWFsbHkgcmVhY2hlZCAqLworCQlleGl0KDApOworCWNhc2UgLTE6CisJCXJldHVybiAtMTsKKworCWRlZmF1bHQ6IC8qIFBhcmVudCAqLworCQl3YWl0KE5VTEwpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBQYXJzZSB0aGUgY2hhaW4gbmFtZSBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgY2hhaW4gYmFzZS4KKyAqIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLiAqLworc3RydWN0IGVidF91X2VudHJpZXMgKmVidF9uYW1lX3RvX2NoYWluKGNvbnN0IHN0cnVjdCBlYnRfdV9yZXBsYWNlICpyZXBsYWNlLCBjb25zdCBjaGFyKiBhcmcpCit7CisJaW50IGk7CisJc3RydWN0IGVidF91X2VudHJpZXMgKmNoYWluOworCisJZm9yIChpID0gMDsgaSA8IHJlcGxhY2UtPm51bV9jaGFpbnM7IGkrKykgeworCQlpZiAoIShjaGFpbiA9IHJlcGxhY2UtPmNoYWluc1tpXSkpCisJCQljb250aW51ZTsKKwkJaWYgKCFzdHJjbXAoYXJnLCBjaGFpbi0+bmFtZSkpCisJCQlyZXR1cm4gY2hhaW47CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBQYXJzZSB0aGUgY2hhaW4gbmFtZSBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGNoYWluIG5yCisgKiByZXR1cm5zIC0xIG9uIGZhaWx1cmUgKi8KK2ludCBlYnRfZ2V0X2NoYWlubnIoY29uc3Qgc3RydWN0IGVidF91X3JlcGxhY2UgKnJlcGxhY2UsIGNvbnN0IGNoYXIqIGFyZykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCByZXBsYWNlLT5udW1fY2hhaW5zOyBpKyspIHsKKwkJaWYgKCFyZXBsYWNlLT5jaGFpbnNbaV0pCisJCQljb250aW51ZTsKKwkJaWYgKCFzdHJjbXAoYXJnLCByZXBsYWNlLT5jaGFpbnNbaV0tPm5hbWUpKQorCQkJcmV0dXJuIGk7CisJfQorCXJldHVybiAtMTsKK30KKworICAgICAvKgorKioqKioqKioqKioqCisqKioqKioqKioqKioKKyoqQ09NTUFORFMqKgorKioqKioqKioqKioqCisqKioqKioqKioqKioKKyAgICAgKi8KKworLyogQ2hhbmdlIHRoZSBwb2xpY3kgb2Ygc2VsZWN0ZWRfY2hhaW4uCisgKiBIYW5kaW5nIGEgYmFkIHBvbGljeSB0byB0aGlzIGZ1bmN0aW9uIGlzIGEgYnVnLiAqLwordm9pZCBlYnRfY2hhbmdlX3BvbGljeShzdHJ1Y3QgZWJ0X3VfcmVwbGFjZSAqcmVwbGFjZSwgaW50IHBvbGljeSkKK3sKKwlzdHJ1Y3QgZWJ0X3VfZW50cmllcyAqZW50cmllcyA9IGVidF90b19jaGFpbihyZXBsYWNlKTsKKworCWlmIChwb2xpY3kgPCAtTlVNX1NUQU5EQVJEX1RBUkdFVFMgfHwgcG9saWN5ID09IEVCVF9DT05USU5VRSkKKwkJZWJ0X3ByaW50X2J1ZygiV3JvbmcgcG9saWN5OiAlZCIsIHBvbGljeSk7CisJZW50cmllcy0+cG9saWN5ID0gcG9saWN5OworfQorCit2b2lkIGVidF9kZWxldGVfY2Moc3RydWN0IGVidF9jbnRjaGFuZ2VzICpjYykKK3sKKwlpZiAoY2MtPnR5cGUgPT0gQ05UX0FERCkgeworCQljYy0+cHJldi0+bmV4dCA9IGNjLT5uZXh0OworCQljYy0+bmV4dC0+cHJldiA9IGNjLT5wcmV2OworCQlmcmVlKGNjKTsKKwl9IGVsc2UKKwkJY2MtPnR5cGUgPSBDTlRfREVMOworfQorCit2b2lkIGVidF9lbXB0eV9jaGFpbihzdHJ1Y3QgZWJ0X3VfZW50cmllcyAqZW50cmllcykKK3sKKwlzdHJ1Y3QgZWJ0X3VfZW50cnkgKnVfZSA9IGVudHJpZXMtPmVudHJpZXMtPm5leHQsICp0bXA7CisJd2hpbGUgKHVfZSAhPSBlbnRyaWVzLT5lbnRyaWVzKSB7CisJCWVidF9kZWxldGVfY2ModV9lLT5jYyk7CisJCWVidF9mcmVlX3VfZW50cnkodV9lKTsKKwkJdG1wID0gdV9lLT5uZXh0OworCQlmcmVlKHVfZSk7CisJCXVfZSA9IHRtcDsKKwl9CisJZW50cmllcy0+ZW50cmllcy0+bmV4dCA9IGVudHJpZXMtPmVudHJpZXMtPnByZXYgPSBlbnRyaWVzLT5lbnRyaWVzOworCWVudHJpZXMtPm5lbnRyaWVzID0gMDsKK30KKworLyogRmx1c2ggb25lIGNoYWluIG9yIHRoZSBjb21wbGV0ZSB0YWJsZQorICogSWYgc2VsZWN0ZWRfY2hhaW4gPT0gLTEgdGhlbiBmbHVzaCB0aGUgY29tcGxldGUgdGFibGUgKi8KK3ZvaWQgZWJ0X2ZsdXNoX2NoYWlucyhzdHJ1Y3QgZWJ0X3VfcmVwbGFjZSAqcmVwbGFjZSkKK3sKKwlpbnQgaSwgbnVtZGVsOworCXN0cnVjdCBlYnRfdV9lbnRyaWVzICplbnRyaWVzID0gZWJ0X3RvX2NoYWluKHJlcGxhY2UpOworCisJLyogRmx1c2ggd2hvbGUgdGFibGUgKi8KKwlpZiAoIWVudHJpZXMpIHsKKwkJaWYgKHJlcGxhY2UtPm5lbnRyaWVzID09IDApCisJCQlyZXR1cm47CisJCXJlcGxhY2UtPm5lbnRyaWVzID0gMDsKKworCQkvKiBGcmVlIGV2ZXJ5dGhpbmcgYW5kIHplcm8gKG4pZW50cmllcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgcmVwbGFjZS0+bnVtX2NoYWluczsgaSsrKSB7CisJCQlpZiAoIShlbnRyaWVzID0gcmVwbGFjZS0+Y2hhaW5zW2ldKSkKKwkJCQljb250aW51ZTsKKwkJCWVudHJpZXMtPmNvdW50ZXJfb2Zmc2V0ID0gMDsKKwkJCWVidF9lbXB0eV9jaGFpbihlbnRyaWVzKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJaWYgKGVudHJpZXMtPm5lbnRyaWVzID09IDApCisJCXJldHVybjsKKwlyZXBsYWNlLT5uZW50cmllcyAtPSBlbnRyaWVzLT5uZW50cmllczsKKwludW1kZWwgPSBlbnRyaWVzLT5uZW50cmllczsKKworCS8qIFVwZGF0ZSBjb3VudGVyX29mZnNldCAqLworCWZvciAoaSA9IHJlcGxhY2UtPnNlbGVjdGVkX2NoYWluKzE7IGkgPCByZXBsYWNlLT5udW1fY2hhaW5zOyBpKyspIHsKKwkJaWYgKCEoZW50cmllcyA9IHJlcGxhY2UtPmNoYWluc1tpXSkpCisJCQljb250aW51ZTsKKwkJZW50cmllcy0+Y291bnRlcl9vZmZzZXQgLT0gbnVtZGVsOworCX0KKworCWVudHJpZXMgPSBlYnRfdG9fY2hhaW4ocmVwbGFjZSk7CisJZWJ0X2VtcHR5X2NoYWluKGVudHJpZXMpOworfQorCisjZGVmaW5lIE9QVF9DT1VOVAkweDEwMDAgLyogVGhpcyB2YWx1ZSBpcyBhbHNvIGRlZmluZWQgaW4gZWJ0YWJsZXMuYyAqLworLyogUmV0dXJucyB0aGUgcnVsZSBudW1iZXIgb24gc3VjY2VzcyAoc3RhcnRpbmcgZnJvbSAwKSwgLTEgb24gZmFpbHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gZXhwZWN0cyB0aGUgZWJ0X3ttYXRjaCx3YXRjaGVyLHRhcmdldH0gbWVtYmVycyBvZiBuZXdfZW50cnkKKyAqIHRvIGNvbnRhaW4gcG9pbnRlcnMgdG8gZWJ0X3Vfe21hdGNoLHdhdGNoZXIsdGFyZ2V0fSAqLworaW50IGVidF9jaGVja19ydWxlX2V4aXN0cyhzdHJ1Y3QgZWJ0X3VfcmVwbGFjZSAqcmVwbGFjZSwKKwkJCSAgc3RydWN0IGVidF91X2VudHJ5ICpuZXdfZW50cnkpCit7CisJc3RydWN0IGVidF91X2VudHJ5ICp1X2U7CisJc3RydWN0IGVidF91X21hdGNoX2xpc3QgKm1fbCwgKm1fbDI7CisJc3RydWN0IGVidF91X21hdGNoICptOworCXN0cnVjdCBlYnRfdV93YXRjaGVyX2xpc3QgKndfbCwgKndfbDI7CisJc3RydWN0IGVidF91X3dhdGNoZXIgKnc7CisJc3RydWN0IGVidF91X3RhcmdldCAqdCA9IChzdHJ1Y3QgZWJ0X3VfdGFyZ2V0ICopbmV3X2VudHJ5LT50OworCXN0cnVjdCBlYnRfdV9lbnRyaWVzICplbnRyaWVzID0gZWJ0X3RvX2NoYWluKHJlcGxhY2UpOworCWludCBpLCBqLCBrOworCisJdV9lID0gZW50cmllcy0+ZW50cmllcy0+bmV4dDsKKwkvKiBDaGVjayBmb3IgYW4gZXhpc3RpbmcgcnVsZSAoaWYgdGhlcmUgYXJlIGR1cGxpY2F0ZSBydWxlcywKKwkgKiB0YWtlIHRoZSBmaXJzdCBvY2N1cmFuY2UpICovCisJZm9yIChpID0gMDsgaSA8IGVudHJpZXMtPm5lbnRyaWVzOyBpKyssIHVfZSA9IHVfZS0+bmV4dCkgeworCQlpZiAodV9lLT5ldGhwcm90byAhPSBuZXdfZW50cnktPmV0aHByb3RvKQorCQkJY29udGludWU7CisJCWlmIChzdHJjbXAodV9lLT5pbiwgbmV3X2VudHJ5LT5pbikpCisJCQljb250aW51ZTsKKwkJaWYgKHN0cmNtcCh1X2UtPm91dCwgbmV3X2VudHJ5LT5vdXQpKQorCQkJY29udGludWU7CisJCWlmIChzdHJjbXAodV9lLT5sb2dpY2FsX2luLCBuZXdfZW50cnktPmxvZ2ljYWxfaW4pKQorCQkJY29udGludWU7CisJCWlmIChzdHJjbXAodV9lLT5sb2dpY2FsX291dCwgbmV3X2VudHJ5LT5sb2dpY2FsX291dCkpCisJCQljb250aW51ZTsKKwkJaWYgKG5ld19lbnRyeS0+Yml0bWFzayAmIEVCVF9TT1VSQ0VNQUMgJiYKKwkJICAgIG1lbWNtcCh1X2UtPnNvdXJjZW1hYywgbmV3X2VudHJ5LT5zb3VyY2VtYWMsIEVUSF9BTEVOKSkKKwkJCWNvbnRpbnVlOworCQlpZiAobmV3X2VudHJ5LT5iaXRtYXNrICYgRUJUX0RFU1RNQUMgJiYKKwkJICAgIG1lbWNtcCh1X2UtPmRlc3RtYWMsIG5ld19lbnRyeS0+ZGVzdG1hYywgRVRIX0FMRU4pKQorCQkJY29udGludWU7CisJCWlmIChuZXdfZW50cnktPmJpdG1hc2sgIT0gdV9lLT5iaXRtYXNrIHx8CisJCSAgICBuZXdfZW50cnktPmludmZsYWdzICE9IHVfZS0+aW52ZmxhZ3MpCisJCQljb250aW51ZTsKKwkJaWYgKHJlcGxhY2UtPmZsYWdzICYgT1BUX0NPVU5UICYmIChuZXdfZW50cnktPmNudC5wY250ICE9CisJCSAgICB1X2UtPmNudC5wY250IHx8IG5ld19lbnRyeS0+Y250LmJjbnQgIT0gdV9lLT5jbnQuYmNudCkpCisJCQljb250aW51ZTsKKwkJLyogQ29tcGFyZSBhbGwgbWF0Y2hlcyAqLworCQltX2wgPSBuZXdfZW50cnktPm1fbGlzdDsKKwkJaiA9IDA7CisJCXdoaWxlIChtX2wpIHsKKwkJCW0gPSAoc3RydWN0IGVidF91X21hdGNoICopKG1fbC0+bSk7CisJCQltX2wyID0gdV9lLT5tX2xpc3Q7CisJCQl3aGlsZSAobV9sMiAmJiAoc3RyY21wKG1fbDItPm0tPnUubmFtZSwgbS0+bS0+dS5uYW1lKSB8fAorCQkJICAgICAgIG1fbDItPm0tPnUucmV2aXNpb24gIT0gbS0+bS0+dS5yZXZpc2lvbikpIHsKKwkJCQltX2wyID0gbV9sMi0+bmV4dDsKKwkJCX0KKwkJCWlmICghbV9sMiB8fCAhbS0+Y29tcGFyZShtLT5tLCBtX2wyLT5tKSkKKwkJCQlnb3RvIGxldHNjb250aW51ZTsKKwkJCWorKzsKKwkJCW1fbCA9IG1fbC0+bmV4dDsKKwkJfQorCQkvKiBOb3cgYmUgc3VyZSB0aGV5IGhhdmUgdGhlIHNhbWUgbnIgb2YgbWF0Y2hlcyAqLworCQlrID0gMDsKKwkJbV9sID0gdV9lLT5tX2xpc3Q7CisJCXdoaWxlIChtX2wpIHsKKwkJCWsrKzsKKwkJCW1fbCA9IG1fbC0+bmV4dDsKKwkJfQorCQlpZiAoaiAhPSBrKQorCQkJY29udGludWU7CisKKwkJLyogQ29tcGFyZSBhbGwgd2F0Y2hlcnMgKi8KKwkJd19sID0gbmV3X2VudHJ5LT53X2xpc3Q7CisJCWogPSAwOworCQl3aGlsZSAod19sKSB7CisJCQl3ID0gKHN0cnVjdCBlYnRfdV93YXRjaGVyICopKHdfbC0+dyk7CisJCQl3X2wyID0gdV9lLT53X2xpc3Q7CisJCQl3aGlsZSAod19sMiAmJiBzdHJjbXAod19sMi0+dy0+dS5uYW1lLCB3LT53LT51Lm5hbWUpKQorCQkJCXdfbDIgPSB3X2wyLT5uZXh0OworCQkJaWYgKCF3X2wyIHx8ICF3LT5jb21wYXJlKHctPncsIHdfbDItPncpKQorCQkJCWdvdG8gbGV0c2NvbnRpbnVlOworCQkJaisrOworCQkJd19sID0gd19sLT5uZXh0OworCQl9CisJCWsgPSAwOworCQl3X2wgPSB1X2UtPndfbGlzdDsKKwkJd2hpbGUgKHdfbCkgeworCQkJaysrOworCQkJd19sID0gd19sLT5uZXh0OworCQl9CisJCWlmIChqICE9IGspCisJCQljb250aW51ZTsKKwkJaWYgKHN0cmNtcCh0LT50LT51Lm5hbWUsIHVfZS0+dC0+dS5uYW1lKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXQtPmNvbXBhcmUodC0+dCwgdV9lLT50KSkKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gaTsKK2xldHNjb250aW51ZTo7CisJfQorCXJldHVybiAtMTsKK30KKworLyogQWRkIGEgcnVsZSwgcnVsZV9uciBpcyB0aGUgcnVsZSB0byB1cGRhdGUKKyAqIHJ1bGVfbnIgc3BlY2lmaWVzIHdoZXJlIHRoZSBydWxlIHNob3VsZCBiZSBpbnNlcnRlZAorICogcnVsZV9uciA+IDAgOiBpbnNlcnQgdGhlIHJ1bGUgcmlnaHQgYmVmb3JlIHRoZSBydWxlX25yJ3RoIHJ1bGUKKyAqICAgICAgICAgICAgICAgKHRoZSBmaXJzdCBydWxlIGlzIHJ1bGUgMSkKKyAqIHJ1bGVfbnIgPCAwIDogaW5zZXJ0IHRoZSBydWxlIHJpZ2h0IGJlZm9yZSB0aGUgKG4rcnVsZV9ucisxKSd0aCBydWxlLAorICogICAgICAgICAgICAgICB3aGVyZSBuIGRlbm90ZXMgdGhlIG51bWJlciBvZiBydWxlcyBpbiB0aGUgY2hhaW4KKyAqIHJ1bGVfbnIgPT0gMDogYWRkIGEgbmV3IHJ1bGUgYXQgdGhlIGVuZCBvZiB0aGUgY2hhaW4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGV4cGVjdHMgdGhlIGVidF97bWF0Y2gsd2F0Y2hlcix0YXJnZXR9IG1lbWJlcnMgb2YgbmV3X2VudHJ5CisgKiB0byBjb250YWluIHBvaW50ZXJzIHRvIGVidF91X3ttYXRjaCx3YXRjaGVyLHRhcmdldH0gYW5kIHVwZGF0ZXMgdGhlc2UKKyAqIHBvaW50ZXJzIHNvIHRoYXQgdGhleSBwb2ludCB0byBlYnRfe21hdGNoLHdhdGNoZXIsdGFyZ2V0fSwgYmVmb3JlIGFkZGluZworICogdGhlIHJ1bGUgdG8gdGhlIGNoYWluLiBEb24ndCBmcmVlKCkgdGhlIGVidF97bWF0Y2gsd2F0Y2hlcix0YXJnZXR9IGFuZAorICogZG9uJ3QgcmV1c2UgdGhlIG5ld19lbnRyeSBhZnRlciBhIHN1Y2Nlc3NmdWwgY2FsbCB0byBlYnRfYWRkX3J1bGUoKSAqLwordm9pZCBlYnRfYWRkX3J1bGUoc3RydWN0IGVidF91X3JlcGxhY2UgKnJlcGxhY2UsIHN0cnVjdCBlYnRfdV9lbnRyeSAqbmV3X2VudHJ5LCBpbnQgcnVsZV9ucikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZWJ0X3VfZW50cnkgKnVfZTsKKwlzdHJ1Y3QgZWJ0X3VfbWF0Y2hfbGlzdCAqbV9sOworCXN0cnVjdCBlYnRfdV93YXRjaGVyX2xpc3QgKndfbDsKKwlzdHJ1Y3QgZWJ0X3VfZW50cmllcyAqZW50cmllcyA9IGVidF90b19jaGFpbihyZXBsYWNlKTsKKwlzdHJ1Y3QgZWJ0X2NudGNoYW5nZXMgKmNjLCAqbmV3X2NjOworCisJaWYgKHJ1bGVfbnIgPD0gMCkKKwkJcnVsZV9uciArPSBlbnRyaWVzLT5uZW50cmllczsKKwllbHNlCisJCXJ1bGVfbnItLTsKKwlpZiAocnVsZV9uciA+IGVudHJpZXMtPm5lbnRyaWVzIHx8IHJ1bGVfbnIgPCAwKSB7CisJCWVidF9wcmludF9lcnJvcigiVGhlIHNwZWNpZmllZCBydWxlIG51bWJlciBpcyBpbmNvcnJlY3QiKTsKKwkJcmV0dXJuOworCX0KKwkvKiBHbyB0byB0aGUgcmlnaHQgcG9zaXRpb24gaW4gdGhlIGNoYWluICovCisJaWYgKHJ1bGVfbnIgPT0gZW50cmllcy0+bmVudHJpZXMpCisJCXVfZSA9IGVudHJpZXMtPmVudHJpZXM7CisJZWxzZSB7CisJCXVfZSA9IGVudHJpZXMtPmVudHJpZXMtPm5leHQ7CisJCWZvciAoaSA9IDA7IGkgPCBydWxlX25yOyBpKyspCisJCQl1X2UgPSB1X2UtPm5leHQ7CisJfQorCS8qIFdlJ3JlIGFkZGluZyBvbmUgcnVsZSAqLworCXJlcGxhY2UtPm5lbnRyaWVzKys7CisJZW50cmllcy0+bmVudHJpZXMrKzsKKwkvKiBJbnNlcnQgdGhlIHJ1bGUgKi8KKwluZXdfZW50cnktPm5leHQgPSB1X2U7CisJbmV3X2VudHJ5LT5wcmV2ID0gdV9lLT5wcmV2OworCXVfZS0+cHJldi0+bmV4dCA9IG5ld19lbnRyeTsKKwl1X2UtPnByZXYgPSBuZXdfZW50cnk7CisJbmV3X2NjID0gKHN0cnVjdCBlYnRfY250Y2hhbmdlcyAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGVidF9jbnRjaGFuZ2VzKSk7CisJaWYgKCFuZXdfY2MpCisJCWVidF9wcmludF9tZW1vcnkoKTsKKwluZXdfY2MtPnR5cGUgPSBDTlRfQUREOworCW5ld19jYy0+Y2hhbmdlID0gMDsKKwlpZiAobmV3X2VudHJ5LT5uZXh0ID09IGVudHJpZXMtPmVudHJpZXMpIHsKKwkJZm9yIChpID0gcmVwbGFjZS0+c2VsZWN0ZWRfY2hhaW4rMTsgaSA8IHJlcGxhY2UtPm51bV9jaGFpbnM7IGkrKykKKwkJCWlmICghcmVwbGFjZS0+Y2hhaW5zW2ldIHx8IHJlcGxhY2UtPmNoYWluc1tpXS0+bmVudHJpZXMgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCWVsc2UKKwkJCQlicmVhazsKKwkJaWYgKGkgPT0gcmVwbGFjZS0+bnVtX2NoYWlucykKKwkJCWNjID0gcmVwbGFjZS0+Y2M7CisJCWVsc2UKKwkJCWNjID0gcmVwbGFjZS0+Y2hhaW5zW2ldLT5lbnRyaWVzLT5uZXh0LT5jYzsKKwl9IGVsc2UKKwkJY2MgPSBuZXdfZW50cnktPm5leHQtPmNjOworCW5ld19jYy0+bmV4dCA9IGNjOworCW5ld19jYy0+cHJldiA9IGNjLT5wcmV2OworCWNjLT5wcmV2LT5uZXh0ID0gbmV3X2NjOworCWNjLT5wcmV2ID0gbmV3X2NjOworCW5ld19lbnRyeS0+Y2MgPSBuZXdfY2M7CisKKwkvKiBQdXQgdGhlIGVidF97bWF0Y2gsIHdhdGNoZXIsIHRhcmdldH0gcG9pbnRlcnMgaW4gcGxhY2UgKi8KKwltX2wgPSBuZXdfZW50cnktPm1fbGlzdDsKKwl3aGlsZSAobV9sKSB7CisJCW1fbC0+bSA9ICgoc3RydWN0IGVidF91X21hdGNoICopbV9sLT5tKS0+bTsKKwkJbV9sID0gbV9sLT5uZXh0OworCX0KKwl3X2wgPSBuZXdfZW50cnktPndfbGlzdDsKKwl3aGlsZSAod19sKSB7CisJCXdfbC0+dyA9ICgoc3RydWN0IGVidF91X3dhdGNoZXIgKil3X2wtPncpLT53OworCQl3X2wgPSB3X2wtPm5leHQ7CisJfQorCW5ld19lbnRyeS0+dCA9ICgoc3RydWN0IGVidF91X3RhcmdldCAqKW5ld19lbnRyeS0+dCktPnQ7CisJLyogVXBkYXRlIHRoZSBjb3VudGVyX29mZnNldCBvZiBjaGFpbnMgYmVoaW5kIHRoaXMgb25lICovCisJZm9yIChpID0gcmVwbGFjZS0+c2VsZWN0ZWRfY2hhaW4rMTsgaSA8IHJlcGxhY2UtPm51bV9jaGFpbnM7IGkrKykgeworCQllbnRyaWVzID0gcmVwbGFjZS0+Y2hhaW5zW2ldOworCQlpZiAoIShlbnRyaWVzID0gcmVwbGFjZS0+Y2hhaW5zW2ldKSkKKwkJCWNvbnRpbnVlOworCQllbnRyaWVzLT5jb3VudGVyX29mZnNldCsrOworCX0KK30KKworLyogSWYgKmJlZ2luPT0qZW5kPT0wIHRoZW4gZmluZCB0aGUgcnVsZSBjb3JyZXNwb25kaW5nIHRvIG5ld19lbnRyeSwKKyAqIGVsc2UgbWFrZSB0aGUgcnVsZSBudW1iZXJzIHBvc2l0aXZlIChzdGFydGluZyBmcm9tIDApIGFuZCBjaGVjaworICogZm9yIGJhZCBydWxlIG51bWJlcnMuICovCitzdGF0aWMgaW50IGNoZWNrX2FuZF9jaGFuZ2VfcnVsZV9udW1iZXIoc3RydWN0IGVidF91X3JlcGxhY2UgKnJlcGxhY2UsCisgICBzdHJ1Y3QgZWJ0X3VfZW50cnkgKm5ld19lbnRyeSwgaW50ICpiZWdpbiwgaW50ICplbmQpCit7CisJc3RydWN0IGVidF91X2VudHJpZXMgKmVudHJpZXMgPSBlYnRfdG9fY2hhaW4ocmVwbGFjZSk7CisKKwlpZiAoKmJlZ2luIDwgMCkKKwkJKmJlZ2luICs9IGVudHJpZXMtPm5lbnRyaWVzICsgMTsKKwlpZiAoKmVuZCA8IDApCisJCSplbmQgKz0gZW50cmllcy0+bmVudHJpZXMgKyAxOworCisJaWYgKCpiZWdpbiA8IDAgfHwgKmJlZ2luID4gKmVuZCB8fCAqZW5kID4gZW50cmllcy0+bmVudHJpZXMpIHsKKwkJZWJ0X3ByaW50X2Vycm9yKCJTb3JyeSwgd3JvbmcgcnVsZSBudW1iZXJzIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoKCpiZWdpbiAqICplbmQgPT0gMCkgJiYgKCpiZWdpbiArICplbmQgIT0gMCkpCisJCWVidF9wcmludF9idWcoImJlZ2luIGFuZCBlbmQgc2hvdWxkIGJlIGVpdGhlciBib3RoIHplcm8sICIKKwkJCSAgICAgICJlaXRoZXIgYm90aCBub24temVybyIpOworCWlmICgqYmVnaW4gIT0gMCkgeworCQkoKmJlZ2luKS0tOworCQkoKmVuZCktLTsKKwl9IGVsc2UgeworCQkqYmVnaW4gPSBlYnRfY2hlY2tfcnVsZV9leGlzdHMocmVwbGFjZSwgbmV3X2VudHJ5KTsKKwkJKmVuZCA9ICpiZWdpbjsKKwkJaWYgKCpiZWdpbiA9PSAtMSkgeworCQkJZWJ0X3ByaW50X2Vycm9yKCJTb3JyeSwgcnVsZSBkb2VzIG5vdCBleGlzdCIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiBEZWxldGUgYSBydWxlIG9yIHJ1bGVzCisgKiBiZWdpbiA9PSBlbmQgPT0gMDogZGVsZXRlIHRoZSBydWxlIGNvcnJlc3BvbmRpbmcgdG8gbmV3X2VudHJ5CisgKgorICogVGhlIGZpcnN0IHJ1bGUgaGFzIHJ1bGUgbnIgMSwgdGhlIGxhc3QgcnVsZSBoYXMgcnVsZSBuciAtMSwgZXRjLgorICogVGhpcyBmdW5jdGlvbiBleHBlY3RzIHRoZSBlYnRfe21hdGNoLHdhdGNoZXIsdGFyZ2V0fSBtZW1iZXJzIG9mIG5ld19lbnRyeQorICogdG8gY29udGFpbiBwb2ludGVycyB0byBlYnRfdV97bWF0Y2gsd2F0Y2hlcix0YXJnZXR9LiAqLwordm9pZCBlYnRfZGVsZXRlX3J1bGUoc3RydWN0IGVidF91X3JlcGxhY2UgKnJlcGxhY2UsCisJCSAgICAgc3RydWN0IGVidF91X2VudHJ5ICpuZXdfZW50cnksIGludCBiZWdpbiwgaW50IGVuZCkKK3sKKwlpbnQgaSwgIG5yX2RlbGV0ZXM7CisJc3RydWN0IGVidF91X2VudHJ5ICp1X2UsICp1X2UyLCAqdV9lMzsKKwlzdHJ1Y3QgZWJ0X3VfZW50cmllcyAqZW50cmllcyA9IGVidF90b19jaGFpbihyZXBsYWNlKTsKKworCWlmIChjaGVja19hbmRfY2hhbmdlX3J1bGVfbnVtYmVyKHJlcGxhY2UsIG5ld19lbnRyeSwgJmJlZ2luLCAmZW5kKSkKKwkJcmV0dXJuOworCS8qIFdlJ3JlIGRlbGV0aW5nIHJ1bGVzICovCisJbnJfZGVsZXRlcyA9IGVuZCAtIGJlZ2luICsgMTsKKwlyZXBsYWNlLT5uZW50cmllcyAtPSBucl9kZWxldGVzOworCWVudHJpZXMtPm5lbnRyaWVzIC09IG5yX2RlbGV0ZXM7CisJLyogR28gdG8gdGhlIHJpZ2h0IHBvc2l0aW9uIGluIHRoZSBjaGFpbiAqLworCXVfZSA9IGVudHJpZXMtPmVudHJpZXMtPm5leHQ7CisJZm9yIChpID0gMDsgaSA8IGJlZ2luOyBpKyspCisJCXVfZSA9IHVfZS0+bmV4dDsKKwl1X2UzID0gdV9lLT5wcmV2OworCS8qIFJlbW92ZSB0aGUgcnVsZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnJfZGVsZXRlczsgaSsrKSB7CisJCXVfZTIgPSB1X2U7CisJCWVidF9kZWxldGVfY2ModV9lMi0+Y2MpOworCQl1X2UgPSB1X2UtPm5leHQ7CisJCS8qIEZyZWUgZXZlcnl0aGluZyAqLworCQllYnRfZnJlZV91X2VudHJ5KHVfZTIpOworCQlmcmVlKHVfZTIpOworCX0KKwl1X2UzLT5uZXh0ID0gdV9lOworCXVfZS0+cHJldiA9IHVfZTM7CisJLyogVXBkYXRlIHRoZSBjb3VudGVyX29mZnNldCBvZiBjaGFpbnMgYmVoaW5kIHRoaXMgb25lICovCisJZm9yIChpID0gcmVwbGFjZS0+c2VsZWN0ZWRfY2hhaW4rMTsgaSA8IHJlcGxhY2UtPm51bV9jaGFpbnM7IGkrKykgeworCQlpZiAoIShlbnRyaWVzID0gcmVwbGFjZS0+Y2hhaW5zW2ldKSkKKwkJCWNvbnRpbnVlOworCQllbnRyaWVzLT5jb3VudGVyX29mZnNldCAtPSBucl9kZWxldGVzOworCX0KK30KKworLyogQ2hhbmdlIHRoZSBjb3VudGVycyBvZiBhIHJ1bGUgb3IgcnVsZXMKKyAqIGJlZ2luID09IGVuZCA9PSAwOiBjaGFuZ2UgY291bnRlcnMgb2YgdGhlIHJ1bGUgY29ycmVzcG9uZGluZyB0byBuZXdfZW50cnkKKyAqCisgKiBUaGUgZmlyc3QgcnVsZSBoYXMgcnVsZSBuciAxLCB0aGUgbGFzdCBydWxlIGhhcyBydWxlIG5yIC0xLCBldGMuCisgKiBUaGlzIGZ1bmN0aW9uIGV4cGVjdHMgdGhlIGVidF97bWF0Y2gsd2F0Y2hlcix0YXJnZXR9IG1lbWJlcnMgb2YgbmV3X2VudHJ5CisgKiB0byBjb250YWluIHBvaW50ZXJzIHRvIGVidF91X3ttYXRjaCx3YXRjaGVyLHRhcmdldH0uCisgKiBUaGUgbWFzayBkZW5vdGVzIHRoZSBmb2xsb3dpbmc6CisgKiAgICBwY250OiBtYXNrICUgMyA9IDAgOiBjaGFuZ2U7ID0gMTogaW5jcmVtZW50OyA9IDI6IGRlY3JlbWVudAorICogICAgYmNudDogbWFzayAvIDMgPSAwIDogY2hhbmdlOyA9IDE6IGluY3JlbWVudCA9IDI6IGluY3JlbWVudAorICogSW4gZGFlbW9uIG1vZGUsIG1hc2s9PTAgbXVzdCBob2xkICovCit2b2lkIGVidF9jaGFuZ2VfY291bnRlcnMoc3RydWN0IGVidF91X3JlcGxhY2UgKnJlcGxhY2UsCisJCSAgICAgc3RydWN0IGVidF91X2VudHJ5ICpuZXdfZW50cnksIGludCBiZWdpbiwgaW50IGVuZCwKKwkJICAgICBzdHJ1Y3QgZWJ0X2NvdW50ZXIgKmNudCwgaW50IG1hc2spCit7CisJaW50IGk7CisJc3RydWN0IGVidF91X2VudHJ5ICp1X2U7CisJc3RydWN0IGVidF91X2VudHJpZXMgKmVudHJpZXMgPSBlYnRfdG9fY2hhaW4ocmVwbGFjZSk7CisKKwlpZiAoY2hlY2tfYW5kX2NoYW5nZV9ydWxlX251bWJlcihyZXBsYWNlLCBuZXdfZW50cnksICZiZWdpbiwgJmVuZCkpCisJCXJldHVybjsKKwl1X2UgPSBlbnRyaWVzLT5lbnRyaWVzLT5uZXh0OworCWZvciAoaSA9IDA7IGkgPCBiZWdpbjsgaSsrKQorCQl1X2UgPSB1X2UtPm5leHQ7CisJZm9yIChpID0gZW5kLWJlZ2luKzE7IGkgPiAwOyBpLS0pIHsKKwkJaWYgKG1hc2sgJSAzID09IDApIHsKKwkJCXVfZS0+Y250LnBjbnQgPSAoKmNudCkucGNudDsKKwkJCXVfZS0+Y250X3N1cnBsdXMucGNudCA9IDA7CisJCX0gZWxzZSB7CisjaWZkZWYgRUJUX0RFQlVHCisJCQlpZiAodV9lLT5jYy0+dHlwZSAhPSBDTlRfTk9STSkKKwkJCQllYnRfcHJpbnRfYnVnKCJjYy0+dHlwZSAhPSBDTlRfTk9STSIpOworI2VuZGlmCisJCQl1X2UtPmNudF9zdXJwbHVzLnBjbnQgPSAoKmNudCkucGNudDsKKwkJfQorCisJCWlmIChtYXNrIC8gMyA9PSAwKSB7CisJCQl1X2UtPmNudC5iY250ID0gKCpjbnQpLmJjbnQ7CisJCQl1X2UtPmNudF9zdXJwbHVzLmJjbnQgPSAwOworCQl9IGVsc2UgeworI2lmZGVmIEVCVF9ERUJVRworCQkJaWYgKHVfZS0+Y2MtPnR5cGUgIT0gQ05UX05PUk0pCisJCQkJZWJ0X3ByaW50X2J1ZygiY2MtPnR5cGUgIT0gQ05UX05PUk0iKTsKKyNlbmRpZgorCQkJdV9lLT5jbnRfc3VycGx1cy5iY250ID0gKCpjbnQpLmJjbnQ7CisJCX0KKwkJaWYgKHVfZS0+Y2MtPnR5cGUgIT0gQ05UX0FERCkKKwkJCXVfZS0+Y2MtPnR5cGUgPSBDTlRfQ0hBTkdFOworCQl1X2UtPmNjLT5jaGFuZ2UgPSBtYXNrOworCQl1X2UgPSB1X2UtPm5leHQ7CisJfQorfQorCisvKiBJZiBzZWxlY3RlZF9jaGFpbiA9PSAtMSB0aGVuIHplcm8gYWxsIGNvdW50ZXJzLAorICogb3RoZXJ3aXNlLCB6ZXJvIHRoZSBjb3VudGVycyBvZiBzZWxlY3RlZF9jaGFpbiAqLwordm9pZCBlYnRfemVyb19jb3VudGVycyhzdHJ1Y3QgZWJ0X3VfcmVwbGFjZSAqcmVwbGFjZSkKK3sKKwlzdHJ1Y3QgZWJ0X3VfZW50cmllcyAqZW50cmllcyA9IGVidF90b19jaGFpbihyZXBsYWNlKTsKKwlzdHJ1Y3QgZWJ0X3VfZW50cnkgKm5leHQ7CisJaW50IGk7CisKKwlpZiAoIWVudHJpZXMpIHsKKwkJZm9yIChpID0gMDsgaSA8IHJlcGxhY2UtPm51bV9jaGFpbnM7IGkrKykgeworCQkJaWYgKCEoZW50cmllcyA9IHJlcGxhY2UtPmNoYWluc1tpXSkpCisJCQkJY29udGludWU7CisJCQluZXh0ID0gZW50cmllcy0+ZW50cmllcy0+bmV4dDsKKwkJCXdoaWxlIChuZXh0ICE9IGVudHJpZXMtPmVudHJpZXMpIHsKKwkJCQlpZiAobmV4dC0+Y2MtPnR5cGUgPT0gQ05UX05PUk0pCisJCQkJCW5leHQtPmNjLT50eXBlID0gQ05UX0NIQU5HRTsKKwkJCQluZXh0LT5jbnQuYmNudCA9IG5leHQtPmNudC5wY250ID0gMDsKKwkJCQluZXh0LT5jYy0+Y2hhbmdlID0gMDsKKwkJCQluZXh0ID0gbmV4dC0+bmV4dDsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmIChlbnRyaWVzLT5uZW50cmllcyA9PSAwKQorCQkJcmV0dXJuOworCisJCW5leHQgPSBlbnRyaWVzLT5lbnRyaWVzLT5uZXh0OworCQl3aGlsZSAobmV4dCAhPSBlbnRyaWVzLT5lbnRyaWVzKSB7CisJCQlpZiAobmV4dC0+Y2MtPnR5cGUgPT0gQ05UX05PUk0pCisJCQkJbmV4dC0+Y2MtPnR5cGUgPSBDTlRfQ0hBTkdFOworCQkJbmV4dC0+Y250LmJjbnQgPSBuZXh0LT5jbnQucGNudCA9IDA7CisJCQluZXh0ID0gbmV4dC0+bmV4dDsKKwkJfQorCX0KK30KKworLyogQWRkIGEgbmV3IGNoYWluIGFuZCBzcGVjaWZ5IGl0cyBwb2xpY3kgKi8KK3ZvaWQgZWJ0X25ld19jaGFpbihzdHJ1Y3QgZWJ0X3VfcmVwbGFjZSAqcmVwbGFjZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IHBvbGljeSkKK3sKKwlzdHJ1Y3QgZWJ0X3VfZW50cmllcyAqbmV3OworCisJaWYgKHJlcGxhY2UtPm51bV9jaGFpbnMgPT0gcmVwbGFjZS0+bWF4X2NoYWlucykKKwkJZWJ0X2RvdWJsZV9jaGFpbnMocmVwbGFjZSk7CisJbmV3ID0gKHN0cnVjdCBlYnRfdV9lbnRyaWVzICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgZWJ0X3VfZW50cmllcykpOworCWlmICghbmV3KQorCQllYnRfcHJpbnRfbWVtb3J5KCk7CisJcmVwbGFjZS0+Y2hhaW5zW3JlcGxhY2UtPm51bV9jaGFpbnMrK10gPSBuZXc7CisJbmV3LT5uZW50cmllcyA9IDA7CisJbmV3LT5wb2xpY3kgPSBwb2xpY3k7CisJbmV3LT5jb3VudGVyX29mZnNldCA9IHJlcGxhY2UtPm5lbnRyaWVzOworCW5ldy0+aG9va19tYXNrID0gMDsKKwlzdHJjcHkobmV3LT5uYW1lLCBuYW1lKTsKKwluZXctPmVudHJpZXMgPSAoc3RydWN0IGVidF91X2VudHJ5ICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgZWJ0X3VfZW50cnkpKTsKKwlpZiAoIW5ldy0+ZW50cmllcykKKwkJZWJ0X3ByaW50X21lbW9yeSgpOworCW5ldy0+ZW50cmllcy0+bmV4dCA9IG5ldy0+ZW50cmllcy0+cHJldiA9IG5ldy0+ZW50cmllczsKKwluZXctPmtlcm5lbF9zdGFydCA9IE5VTEw7Cit9CisKKy8qIHJldHVybnMgLTEgaWYgdGhlIGNoYWluIGlzIHJlZmVyZW5jZWQsIDAgb24gc3VjY2VzcyAqLworc3RhdGljIGludCBlYnRfZGVsZXRlX2FfY2hhaW4oc3RydWN0IGVidF91X3JlcGxhY2UgKnJlcGxhY2UsIGludCBjaGFpbiwgaW50IHByaW50X2VycikKK3sKKwlpbnQgdG1wID0gcmVwbGFjZS0+c2VsZWN0ZWRfY2hhaW47CisJLyogSWYgdGhlIGNoYWluIGlzIHJlZmVyZW5jZWQsIGRvbid0IGRlbGV0ZSBpdCwKKwkgKiBhbHNvIGRlY3JlbWVudCBqdW1wcyB0byBhIGNoYWluIGJlaGluZCB0aGUKKwkgKiBvbmUgd2UncmUgZGVsZXRpbmcgKi8KKwlyZXBsYWNlLT5zZWxlY3RlZF9jaGFpbiA9IGNoYWluOworCWlmIChlYnRfY2hlY2tfZm9yX3JlZmVyZW5jZXMocmVwbGFjZSwgcHJpbnRfZXJyKSkKKwkJcmV0dXJuIC0xOworCWRlY3JlYXNlX2NoYWluX2p1bXBzKHJlcGxhY2UpOworCWVidF9mbHVzaF9jaGFpbnMocmVwbGFjZSk7CisJcmVwbGFjZS0+c2VsZWN0ZWRfY2hhaW4gPSB0bXA7CisJZnJlZShyZXBsYWNlLT5jaGFpbnNbY2hhaW5dLT5lbnRyaWVzKTsKKwlmcmVlKHJlcGxhY2UtPmNoYWluc1tjaGFpbl0pOworCW1lbW1vdmUocmVwbGFjZS0+Y2hhaW5zK2NoYWluLCByZXBsYWNlLT5jaGFpbnMrY2hhaW4rMSwgKHJlcGxhY2UtPm51bV9jaGFpbnMtY2hhaW4tMSkqc2l6ZW9mKHZvaWQgKikpOworCXJlcGxhY2UtPm51bV9jaGFpbnMtLTsKKwlyZXR1cm4gMDsKK30KKworLyogU2VsZWN0ZWRfY2hhaW4gPT0gLTE6IGRlbGV0ZSBhbGwgbm9uLXJlZmVyZW5jZWQgdWRjCisgKiBzZWxlY3RlZF9jaGFpbiA8IE5GX0JSX05VTUhPT0tTIGlzIGlsbGVnYWwgKi8KK3ZvaWQgZWJ0X2RlbGV0ZV9jaGFpbihzdHJ1Y3QgZWJ0X3VfcmVwbGFjZSAqcmVwbGFjZSkKK3sKKwlpZiAocmVwbGFjZS0+c2VsZWN0ZWRfY2hhaW4gIT0gLTEgJiYgcmVwbGFjZS0+c2VsZWN0ZWRfY2hhaW4gPCBORl9CUl9OVU1IT09LUykKKwkJZWJ0X3ByaW50X2J1ZygiWW91IGNhbid0IHJlbW92ZSBhIHN0YW5kYXJkIGNoYWluIik7CisJaWYgKHJlcGxhY2UtPnNlbGVjdGVkX2NoYWluID09IC0xKSB7CisJCWludCBpID0gTkZfQlJfTlVNSE9PS1M7CisKKwkJd2hpbGUgKGkgPCByZXBsYWNlLT5udW1fY2hhaW5zKQorCQkJaWYgKGVidF9kZWxldGVfYV9jaGFpbihyZXBsYWNlLCBpLCAwKSkKKwkJCQlpKys7CisJfSBlbHNlCisJCWVidF9kZWxldGVfYV9jaGFpbihyZXBsYWNlLCByZXBsYWNlLT5zZWxlY3RlZF9jaGFpbiwgMSk7Cit9CisKKy8qIFJlbmFtZSBhbiBleGlzdGluZyBjaGFpbi4gKi8KK3ZvaWQgZWJ0X3JlbmFtZV9jaGFpbihzdHJ1Y3QgZWJ0X3VfcmVwbGFjZSAqcmVwbGFjZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZWJ0X3VfZW50cmllcyAqZW50cmllcyA9IGVidF90b19jaGFpbihyZXBsYWNlKTsKKworCWlmICghZW50cmllcykKKwkJZWJ0X3ByaW50X2J1ZygiZWJ0X3JlbmFtZV9jaGFpbjogZW50cmllcyA9PSBOVUxMIik7CisJc3RyY3B5KGVudHJpZXMtPm5hbWUsIG5hbWUpOworfQorCisKKyAgICAgICAgICAgLyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioKKyoqU1BFQ0lBTElaRUQqRlVOQ1RJT05TKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICovCisKKwordm9pZCBlYnRfZG91YmxlX2NoYWlucyhzdHJ1Y3QgZWJ0X3VfcmVwbGFjZSAqcmVwbGFjZSkKK3sKKwlzdHJ1Y3QgZWJ0X3VfZW50cmllcyAqKm5ldzsKKworCXJlcGxhY2UtPm1heF9jaGFpbnMgKj0gMjsKKwluZXcgPSAoc3RydWN0IGVidF91X2VudHJpZXMgKiopbWFsbG9jKHJlcGxhY2UtPm1heF9jaGFpbnMqc2l6ZW9mKHZvaWQgKikpOworCWlmICghbmV3KQorCQllYnRfcHJpbnRfbWVtb3J5KCk7CisJbWVtY3B5KG5ldywgcmVwbGFjZS0+Y2hhaW5zLCByZXBsYWNlLT5tYXhfY2hhaW5zLzIqc2l6ZW9mKHZvaWQgKikpOworCWZyZWUocmVwbGFjZS0+Y2hhaW5zKTsKKwlyZXBsYWNlLT5jaGFpbnMgPSBuZXc7Cit9CisKKy8qIEV4ZWN1dGVzIHRoZSBmaW5hbF9jaGVjaygpIGZ1bmN0aW9uIGZvciBhbGwgZXh0ZW5zaW9ucyB1c2VkIGJ5IHRoZSBydWxlCisgKiBlYnRfY2hlY2tfZm9yX2xvb3BzIHNob3VsZCBoYXZlIGJlZW4gZXhlY3V0ZWQgZWFybGllciwgdG8gbWFrZSBzdXJlIHRoZQorICogaG9va19tYXNrIGlzIGNvcnJlY3QuIFRoZSB0aW1lIGFyZ3VtZW50IHRvIGZpbmFsX2NoZWNrKCkgaXMgc2V0IHRvIDEsCisgKiBtZWFuaW5nIGl0J3MgdGhlIHNlY29uZCB0aW1lIHRoZSBmaW5hbF9jaGVjaygpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkLiAqLwordm9pZCBlYnRfZG9fZmluYWxfY2hlY2tzKHN0cnVjdCBlYnRfdV9yZXBsYWNlICpyZXBsYWNlLCBzdHJ1Y3QgZWJ0X3VfZW50cnkgKmUsCisJCQkgc3RydWN0IGVidF91X2VudHJpZXMgKmVudHJpZXMpCit7CisJc3RydWN0IGVidF91X21hdGNoX2xpc3QgKm1fbDsKKwlzdHJ1Y3QgZWJ0X3Vfd2F0Y2hlcl9saXN0ICp3X2w7CisJc3RydWN0IGVidF91X3RhcmdldCAqdDsKKwlzdHJ1Y3QgZWJ0X3VfbWF0Y2ggKm07CisJc3RydWN0IGVidF91X3dhdGNoZXIgKnc7CisKKwltX2wgPSBlLT5tX2xpc3Q7CisJd19sID0gZS0+d19saXN0OworCXdoaWxlIChtX2wpIHsKKwkJbSA9IGVidF9maW5kX21hdGNoKG1fbC0+bS0+dS5uYW1lKTsKKwkJbS0+ZmluYWxfY2hlY2soZSwgbV9sLT5tLCByZXBsYWNlLT5uYW1lLAorCQkgICBlbnRyaWVzLT5ob29rX21hc2ssIDEpOworCQlpZiAoZWJ0X2Vycm9ybXNnWzBdICE9ICdcMCcpCisJCQlyZXR1cm47CisJCW1fbCA9IG1fbC0+bmV4dDsKKwl9CisJd2hpbGUgKHdfbCkgeworCQl3ID0gZWJ0X2ZpbmRfd2F0Y2hlcih3X2wtPnctPnUubmFtZSk7CisJCXctPmZpbmFsX2NoZWNrKGUsIHdfbC0+dywgcmVwbGFjZS0+bmFtZSwKKwkJICAgZW50cmllcy0+aG9va19tYXNrLCAxKTsKKwkJaWYgKGVidF9lcnJvcm1zZ1swXSAhPSAnXDAnKQorCQkJcmV0dXJuOworCQl3X2wgPSB3X2wtPm5leHQ7CisJfQorCXQgPSBlYnRfZmluZF90YXJnZXQoZS0+dC0+dS5uYW1lKTsKKwl0LT5maW5hbF9jaGVjayhlLCBlLT50LCByZXBsYWNlLT5uYW1lLAorCSAgIGVudHJpZXMtPmhvb2tfbWFzaywgMSk7Cit9CisKKy8qIFJldHVybnMgMSAoaWYgaXQgcmV0dXJucykgd2hlbiB0aGUgY2hhaW4gaXMgcmVmZXJlbmNlZCwgMCB3aGVuIGl0IGlzbid0LgorICogcHJpbnRfZXJyOiAwIChyZXNwLiAxKSA9IGRvbid0IChyZXNwLiBkbykgcHJpbnQgZXJyb3Igd2hlbiByZWZlcmVuY2VkICovCitpbnQgZWJ0X2NoZWNrX2Zvcl9yZWZlcmVuY2VzKHN0cnVjdCBlYnRfdV9yZXBsYWNlICpyZXBsYWNlLCBpbnQgcHJpbnRfZXJyKQoreworCWlmIChwcmludF9lcnIpCisJCXJldHVybiBpdGVyYXRlX2VudHJpZXMocmVwbGFjZSwgMSk7CisJZWxzZQorCQlyZXR1cm4gaXRlcmF0ZV9lbnRyaWVzKHJlcGxhY2UsIDIpOworfQorCisvKiBjaGFpbl9ucjogbnIgb2YgdGhlIHVkYyAoPj0gTkZfQlJfTlVNSE9PS1MpCisgKiBSZXR1cm5zIDEgKGlmIGl0IHJldHVybnMpIHdoZW4gdGhlIGNoYWluIGlzIHJlZmVyZW5jZWQsIDAgd2hlbiBpdCBpc24ndC4KKyAqIHByaW50X2VycjogMCAocmVzcC4gMSkgPSBkb24ndCAocmVzcC4gZG8pIHByaW50IGVycm9yIHdoZW4gcmVmZXJlbmNlZCAqLworaW50IGVidF9jaGVja19mb3JfcmVmZXJlbmNlczIoc3RydWN0IGVidF91X3JlcGxhY2UgKnJlcGxhY2UsIGludCBjaGFpbl9uciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmludF9lcnIpCit7CisJaW50IHRtcCA9IHJlcGxhY2UtPnNlbGVjdGVkX2NoYWluLCByZXQ7CisKKwlyZXBsYWNlLT5zZWxlY3RlZF9jaGFpbiA9IGNoYWluX25yOworCWlmIChwcmludF9lcnIpCisJCXJldCA9IGl0ZXJhdGVfZW50cmllcyhyZXBsYWNlLCAxKTsKKwllbHNlCisJCXJldCA9IGl0ZXJhdGVfZW50cmllcyhyZXBsYWNlLCAyKTsKKwlyZXBsYWNlLT5zZWxlY3RlZF9jaGFpbiA9IHRtcDsKKwlyZXR1cm4gcmV0OworfQorCitzdHJ1Y3QgZWJ0X3Vfc3RhY2sKK3sKKwlpbnQgY2hhaW5fbnI7CisJaW50IG47CisJc3RydWN0IGVidF91X2VudHJ5ICplOworCXN0cnVjdCBlYnRfdV9lbnRyaWVzICplbnRyaWVzOworfTsKKworLyogQ2hlY2tzIGZvciBsb29wcworICogQXMgYSBieS1wcm9kdWN0LCB0aGUgaG9va19tYXNrIG1lbWJlciBvZiBlYWNoIGNoYWluIGlzIGZpbGxlZCBpbgorICogY29ycmVjdGx5LiBUaGUgY2hlY2sgZnVuY3Rpb25zIG9mIHRoZSBleHRlbnNpb25zIG5lZWQgdGhpcyBob29rX21hc2sKKyAqIHRvIGtub3cgZnJvbSB3aGljaCBzdGFuZGFyZCBjaGFpbnMgdGhleSBjYW4gYmUgY2FsbGVkLiAqLwordm9pZCBlYnRfY2hlY2tfZm9yX2xvb3BzKHN0cnVjdCBlYnRfdV9yZXBsYWNlICpyZXBsYWNlKQoreworCWludCBjaGFpbl9uciAsIGksIGogLCBrLCBzcCA9IDAsIHZlcmRpY3Q7CisJc3RydWN0IGVidF91X2VudHJpZXMgKmVudHJpZXMsICplbnRyaWVzMjsKKwlzdHJ1Y3QgZWJ0X3Vfc3RhY2sgKnN0YWNrID0gTlVMTDsKKwlzdHJ1Y3QgZWJ0X3VfZW50cnkgKmU7CisKKwkvKiBJbml0aWFsaXplIGhvb2tfbWFzayB0byAwICovCisJZm9yIChpID0gMDsgaSA8IHJlcGxhY2UtPm51bV9jaGFpbnM7IGkrKykgeworCQlpZiAoIShlbnRyaWVzID0gcmVwbGFjZS0+Y2hhaW5zW2ldKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoaSA8IE5GX0JSX05VTUhPT0tTKQorCQkJLyogKDEgPDwgTkZfQlJfTlVNSE9PS1MpIGltcGxpZXMgaXQncyBhIHN0YW5kYXJkIGNoYWluCisJCQkgKiAodXNlZnVsbCBpbiB0aGUgZmluYWxfY2hlY2soKSBmdW50aW9ucykgKi8KKwkJCWVudHJpZXMtPmhvb2tfbWFzayA9ICgxIDw8IGkpIHwgKDEgPDwgTkZfQlJfTlVNSE9PS1MpOworCQllbHNlCisJCQllbnRyaWVzLT5ob29rX21hc2sgPSAwOworCX0KKwlpZiAocmVwbGFjZS0+bnVtX2NoYWlucyA9PSBORl9CUl9OVU1IT09LUykKKwkJcmV0dXJuOworCXN0YWNrID0gKHN0cnVjdCBlYnRfdV9zdGFjayAqKW1hbGxvYygocmVwbGFjZS0+bnVtX2NoYWlucyAtIE5GX0JSX05VTUhPT0tTKSAqIHNpemVvZihzdHJ1Y3QgZWJ0X3Vfc3RhY2spKTsKKwlpZiAoIXN0YWNrKQorCQllYnRfcHJpbnRfbWVtb3J5KCk7CisKKwkvKiBDaGVjayBmb3IgbG9vcHMsIHN0YXJ0aW5nIGZyb20gZXZlcnkgYmFzZSBjaGFpbiAqLworCWZvciAoaSA9IDA7IGkgPCBORl9CUl9OVU1IT09LUzsgaSsrKSB7CisJCWlmICghKGVudHJpZXMgPSByZXBsYWNlLT5jaGFpbnNbaV0pKQorCQkJY29udGludWU7CisJCWNoYWluX25yID0gaTsKKworCQllID0gZW50cmllcy0+ZW50cmllcy0+bmV4dDsKKwkJZm9yIChqID0gMDsgaiA8IGVudHJpZXMtPm5lbnRyaWVzOyBqKyspIHsKKwkJCWlmIChzdHJjbXAoZS0+dC0+dS5uYW1lLCBFQlRfU1RBTkRBUkRfVEFSR0VUKSkKKwkJCQlnb3RvIGxldHNjb250aW51ZTsKKwkJCXZlcmRpY3QgPSAoKHN0cnVjdCBlYnRfc3RhbmRhcmRfdGFyZ2V0ICopKGUtPnQpKS0+dmVyZGljdDsKKwkJCWlmICh2ZXJkaWN0IDwgMCkKKwkJCQlnb3RvIGxldHNjb250aW51ZTsKKwkJCS8qIE5vdyBzZWUgaWYgd2UndmUgYmVlbiBoZXJlIGJlZm9yZSAqLworCQkJZm9yIChrID0gMDsgayA8IHNwOyBrKyspCisJCQkJaWYgKHN0YWNrW2tdLmNoYWluX25yID09IHZlcmRpY3QgKyBORl9CUl9OVU1IT09LUykgeworCQkJCQllYnRfcHJpbnRfZXJyb3IoIkxvb3AgZnJvbSBjaGFpbiAnJXMnIHRvIGNoYWluICclcyciLAorCQkJCQkgICByZXBsYWNlLT5jaGFpbnNbY2hhaW5fbnJdLT5uYW1lLAorCQkJCQkgICByZXBsYWNlLT5jaGFpbnNbc3RhY2tba10uY2hhaW5fbnJdLT5uYW1lKTsKKwkJCQkJZ290byBmcmVlX3N0YWNrOworCQkJCX0KKwkJCWVudHJpZXMyID0gcmVwbGFjZS0+Y2hhaW5zW3ZlcmRpY3QgKyBORl9CUl9OVU1IT09LU107CisJCQkvKiBjaGVjayBpZiB3ZSd2ZSBkZWFsdCB3aXRoIHRoaXMgY2hhaW4gYWxyZWFkeSAqLworCQkJaWYgKGVudHJpZXMyLT5ob29rX21hc2sgJiAoMTw8aSkpCisJCQkJZ290byBsZXRzY29udGludWU7CisJCQllbnRyaWVzMi0+aG9va19tYXNrIHw9IGVudHJpZXMtPmhvb2tfbWFzayAmIH4oMSA8PCBORl9CUl9OVU1IT09LUyk7CisJCQkvKiBKdW1wIHRvIHRoZSBjaGFpbiwgbWFrZSBzdXJlIHdlIGtub3cgaG93IHRvIGdldCBiYWNrICovCisJCQlzdGFja1tzcF0uY2hhaW5fbnIgPSBjaGFpbl9ucjsKKwkJCXN0YWNrW3NwXS5uID0gajsKKwkJCXN0YWNrW3NwXS5lbnRyaWVzID0gZW50cmllczsKKwkJCXN0YWNrW3NwXS5lID0gZTsKKwkJCXNwKys7CisJCQlqID0gLTE7CisJCQllID0gZW50cmllczItPmVudHJpZXMtPm5leHQ7CisJCQljaGFpbl9uciA9IHZlcmRpY3QgKyBORl9CUl9OVU1IT09LUzsKKwkJCWVudHJpZXMgPSBlbnRyaWVzMjsKKwkJCWNvbnRpbnVlOworbGV0c2NvbnRpbnVlOgorCQkJZSA9IGUtPm5leHQ7CisJCX0KKwkJLyogV2UgYXJlIGF0IHRoZSBlbmQgb2YgYSBzdGFuZGFyZCBjaGFpbiAqLworCQlpZiAoc3AgPT0gMCkKKwkJCWNvbnRpbnVlOworCQkvKiBHbyBiYWNrIHRvIHRoZSBjaGFpbiBvbmUgbGV2ZWwgaGlnaGVyICovCisJCXNwLS07CisJCWogPSBzdGFja1tzcF0ubjsKKwkJY2hhaW5fbnIgPSBzdGFja1tzcF0uY2hhaW5fbnI7CisJCWUgPSBzdGFja1tzcF0uZTsKKwkJZW50cmllcyA9IHN0YWNrW3NwXS5lbnRyaWVzOworCQlnb3RvIGxldHNjb250aW51ZTsKKwl9CitmcmVlX3N0YWNrOgorCWZyZWUoc3RhY2spOworCXJldHVybjsKK30KKworLyogVGhlIHVzZXIgd2lsbCB1c2UgdGhlIG1hdGNoLCBzbyBwdXQgaXQgaW4gbmV3X2VudHJ5LiBUaGUgZWJ0X3VfbWF0Y2gKKyAqIHBvaW50ZXIgaXMgcHV0IGluIHRoZSBlYnRfZW50cnlfbWF0Y2ggcG9pbnRlci4gZWJ0X2FkZF9ydWxlIHdpbGwKKyAqIGZpbGwgaW4gdGhlIGZpbmFsIHZhbHVlIGZvciBuZXctPm0uIFVubGVzcyB0aGUgcnVsZSBpcyBhZGRlZCB0byBhIGNoYWluLAorICogdGhlIHBvaW50ZXIgd2lsbCBrZWVwIHBvaW50aW5nIHRvIHRoZSBlYnRfdV9tYXRjaCAodW50aWwgdGhlIG5ld19lbnRyeQorICogaXMgZnJlZWQpLiBJIGtub3csIEkgc2hvdWxkIHVzZSBhIHVuaW9uIGZvciB0aGVzZSAyIHBvaW50ZXIgdHlwZXMuLi4gKi8KK3ZvaWQgZWJ0X2FkZF9tYXRjaChzdHJ1Y3QgZWJ0X3VfZW50cnkgKm5ld19lbnRyeSwgc3RydWN0IGVidF91X21hdGNoICptKQoreworCXN0cnVjdCBlYnRfdV9tYXRjaF9saXN0ICoqbV9saXN0LCAqbmV3OworCisJZm9yIChtX2xpc3QgPSAmbmV3X2VudHJ5LT5tX2xpc3Q7ICptX2xpc3Q7IG1fbGlzdCA9ICYoKm1fbGlzdCktPm5leHQpOworCW5ldyA9IChzdHJ1Y3QgZWJ0X3VfbWF0Y2hfbGlzdCAqKQorCSAgIG1hbGxvYyhzaXplb2Yoc3RydWN0IGVidF91X21hdGNoX2xpc3QpKTsKKwlpZiAoIW5ldykKKwkJZWJ0X3ByaW50X21lbW9yeSgpOworCSptX2xpc3QgPSBuZXc7CisJbmV3LT5uZXh0ID0gTlVMTDsKKwluZXctPm0gPSAoc3RydWN0IGVidF9lbnRyeV9tYXRjaCAqKW07Cit9CisKK3ZvaWQgZWJ0X2FkZF93YXRjaGVyKHN0cnVjdCBlYnRfdV9lbnRyeSAqbmV3X2VudHJ5LCBzdHJ1Y3QgZWJ0X3Vfd2F0Y2hlciAqdykKK3sKKwlzdHJ1Y3QgZWJ0X3Vfd2F0Y2hlcl9saXN0ICoqd19saXN0OworCXN0cnVjdCBlYnRfdV93YXRjaGVyX2xpc3QgKm5ldzsKKworCWZvciAod19saXN0ID0gJm5ld19lbnRyeS0+d19saXN0OyAqd19saXN0OyB3X2xpc3QgPSAmKCp3X2xpc3QpLT5uZXh0KTsKKwluZXcgPSAoc3RydWN0IGVidF91X3dhdGNoZXJfbGlzdCAqKQorCSAgIG1hbGxvYyhzaXplb2Yoc3RydWN0IGVidF91X3dhdGNoZXJfbGlzdCkpOworCWlmICghbmV3KQorCQllYnRfcHJpbnRfbWVtb3J5KCk7CisJKndfbGlzdCA9IG5ldzsKKwluZXctPm5leHQgPSBOVUxMOworCW5ldy0+dyA9IChzdHJ1Y3QgZWJ0X2VudHJ5X3dhdGNoZXIgKil3OworfQorCisKKyAgICAgICAgLyoKKyoqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioKKyoqT1RIRVIqRlVOQ1RJT05TKioKKyoqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICovCisKKworLyogdHlwZSA9IDAgPT4gdXBkYXRlIGNoYWluIGp1bXBzCisgKiB0eXBlID0gMSA9PiBjaGVjayBmb3IgcmVmZXJlbmNlLCBwcmludCBlcnJvciB3aGVuIHJlZmVyZW5jZWQKKyAqIHR5cGUgPSAyID0+IGNoZWNrIGZvciByZWZlcmVuY2UsIGRvbid0IHByaW50IGVycm9yIHdoZW4gcmVmZXJlbmNlZAorICoKKyAqIFJldHVybnMgMSB3aGVuIHR5cGUgPT0gMSBhbmQgdGhlIGNoYWluIGlzIHJlZmVyZW5jZWQKKyAqIHJldHVybnMgMCBvdGhlcndpc2UgKi8KK3N0YXRpYyBpbnQgaXRlcmF0ZV9lbnRyaWVzKHN0cnVjdCBlYnRfdV9yZXBsYWNlICpyZXBsYWNlLCBpbnQgdHlwZSkKK3sKKwlpbnQgaSwgaiwgY2hhaW5fbnIgPSByZXBsYWNlLT5zZWxlY3RlZF9jaGFpbiAtIE5GX0JSX05VTUhPT0tTOworCXN0cnVjdCBlYnRfdV9lbnRyaWVzICplbnRyaWVzOworCXN0cnVjdCBlYnRfdV9lbnRyeSAqZTsKKworCWlmIChjaGFpbl9uciA8IDApCisJCWVidF9wcmludF9idWcoIml0ZXJhdGVfZW50cmllczogdWRjID0gJWQgPCAwIiwgY2hhaW5fbnIpOworCWZvciAoaSA9IDA7IGkgPCByZXBsYWNlLT5udW1fY2hhaW5zOyBpKyspIHsKKwkJaWYgKCEoZW50cmllcyA9IHJlcGxhY2UtPmNoYWluc1tpXSkpCisJCQljb250aW51ZTsKKwkJZSA9IGVudHJpZXMtPmVudHJpZXMtPm5leHQ7CisJCWZvciAoaiA9IDA7IGogPCBlbnRyaWVzLT5uZW50cmllczsgaisrKSB7CisJCQlpbnQgY2hhaW5fam1wOworCisJCQlpZiAoc3RyY21wKGUtPnQtPnUubmFtZSwgRUJUX1NUQU5EQVJEX1RBUkdFVCkpIHsKKwkJCQllID0gZS0+bmV4dDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWNoYWluX2ptcCA9ICgoc3RydWN0IGVidF9zdGFuZGFyZF90YXJnZXQgKillLT50KS0+CisJCQkJICAgIHZlcmRpY3Q7CisJCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCWNhc2UgMToKKwkJCWNhc2UgMjoKKwkJCWlmIChjaGFpbl9qbXAgPT0gY2hhaW5fbnIpIHsKKwkJCQlpZiAodHlwZSA9PSAyKQorCQkJCQlyZXR1cm4gMTsKKwkJCQllYnRfcHJpbnRfZXJyb3IoIkNhbid0IGRlbGV0ZSB0aGUgY2hhaW4gJyVzJywgaXQncyByZWZlcmVuY2VkIGluIGNoYWluICclcycsIHJ1bGUgJWQiLAorCQkJCSAgICAgICAgICAgICAgICByZXBsYWNlLT5jaGFpbnNbY2hhaW5fbnIgKyBORl9CUl9OVU1IT09LU10tPm5hbWUsIGVudHJpZXMtPm5hbWUsIGopOworCQkJCXJldHVybiAxOworCQkJfQorCQkJYnJlYWs7CisJCQljYXNlIDA6CisJCQkvKiBBZGp1c3QgdGhlIGNoYWluIGp1bXBzIHdoZW4gbmVjZXNzYXJ5ICovCisJCQlpZiAoY2hhaW5fam1wID4gY2hhaW5fbnIpCisJCQkJKChzdHJ1Y3QgZWJ0X3N0YW5kYXJkX3RhcmdldCAqKWUtPnQpLT52ZXJkaWN0LS07CisJCQlicmVhazsKKwkJCX0gLyogRW5kIHN3aXRjaCAqLworCQkJZSA9IGUtPm5leHQ7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlY3JlYXNlX2NoYWluX2p1bXBzKHN0cnVjdCBlYnRfdV9yZXBsYWNlICpyZXBsYWNlKQoreworCWl0ZXJhdGVfZW50cmllcyhyZXBsYWNlLCAwKTsKK30KKworLyogVXNlZCBpbiBpbml0aWFsaXphdGlvbiBjb2RlIG9mIG1vZHVsZXMgKi8KK3ZvaWQgZWJ0X3JlZ2lzdGVyX21hdGNoKHN0cnVjdCBlYnRfdV9tYXRjaCAqbSkKK3sKKwlpbnQgc2l6ZSA9IEVCVF9BTElHTihtLT5zaXplKSArIHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoKTsKKwlzdHJ1Y3QgZWJ0X3VfbWF0Y2ggKippOworCisJbS0+bSA9IChzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoICopbWFsbG9jKHNpemUpOworCWlmICghbS0+bSkKKwkJZWJ0X3ByaW50X21lbW9yeSgpOworCXN0cmNweShtLT5tLT51Lm5hbWUsIG0tPm5hbWUpOworCW0tPm0tPnUucmV2aXNpb24gPSBtLT5yZXZpc2lvbjsKKwltLT5tLT5tYXRjaF9zaXplID0gRUJUX0FMSUdOKG0tPnNpemUpOworCW0tPmluaXQobS0+bSk7CisKKwlmb3IgKGkgPSAmZWJ0X21hdGNoZXM7ICppOyBpID0gJigoKmkpLT5uZXh0KSk7CisJbS0+bmV4dCA9IE5VTEw7CisJKmkgPSBtOworfQorCit2b2lkIGVidF9yZWdpc3Rlcl93YXRjaGVyKHN0cnVjdCBlYnRfdV93YXRjaGVyICp3KQoreworCWludCBzaXplID0gRUJUX0FMSUdOKHctPnNpemUpICsgc2l6ZW9mKHN0cnVjdCBlYnRfZW50cnlfd2F0Y2hlcik7CisJc3RydWN0IGVidF91X3dhdGNoZXIgKippOworCisJdy0+dyA9IChzdHJ1Y3QgZWJ0X2VudHJ5X3dhdGNoZXIgKiltYWxsb2Moc2l6ZSk7CisJaWYgKCF3LT53KQorCQllYnRfcHJpbnRfbWVtb3J5KCk7CisJc3RyY3B5KHctPnctPnUubmFtZSwgdy0+bmFtZSk7CisJdy0+dy0+d2F0Y2hlcl9zaXplID0gRUJUX0FMSUdOKHctPnNpemUpOworCXctPmluaXQody0+dyk7CisKKwlmb3IgKGkgPSAmZWJ0X3dhdGNoZXJzOyAqaTsgaSA9ICYoKCppKS0+bmV4dCkpOworCXctPm5leHQgPSBOVUxMOworCSppID0gdzsKK30KKwordm9pZCBlYnRfcmVnaXN0ZXJfdGFyZ2V0KHN0cnVjdCBlYnRfdV90YXJnZXQgKnQpCit7CisJaW50IHNpemUgPSBFQlRfQUxJR04odC0+c2l6ZSkgKyBzaXplb2Yoc3RydWN0IGVidF9lbnRyeV90YXJnZXQpOworCXN0cnVjdCBlYnRfdV90YXJnZXQgKippOworCisJdC0+dCA9IChzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqKW1hbGxvYyhzaXplKTsKKwlpZiAoIXQtPnQpCisJCWVidF9wcmludF9tZW1vcnkoKTsKKwlzdHJjcHkodC0+dC0+dS5uYW1lLCB0LT5uYW1lKTsKKwl0LT50LT50YXJnZXRfc2l6ZSA9IEVCVF9BTElHTih0LT5zaXplKTsKKwl0LT5pbml0KHQtPnQpOworCisJZm9yIChpID0gJmVidF90YXJnZXRzOyAqaTsgaSA9ICYoKCppKS0+bmV4dCkpOworCXQtPm5leHQgPSBOVUxMOworCSppID0gdDsKK30KKwordm9pZCBlYnRfcmVnaXN0ZXJfdGFibGUoc3RydWN0IGVidF91X3RhYmxlICp0KQoreworCXQtPm5leHQgPSBlYnRfdGFibGVzOworCWVidF90YWJsZXMgPSB0OworfQorCit2b2lkIGVidF9pdGVyYXRlX21hdGNoZXModm9pZCAoKmYpKHN0cnVjdCBlYnRfdV9tYXRjaCAqKSkKK3sKKwlzdHJ1Y3QgZWJ0X3VfbWF0Y2ggKmk7CisKKwlmb3IgKGkgPSBlYnRfbWF0Y2hlczsgaTsgaSA9IGktPm5leHQpCisJCWYoaSk7Cit9CisKK3ZvaWQgZWJ0X2l0ZXJhdGVfd2F0Y2hlcnModm9pZCAoKmYpKHN0cnVjdCBlYnRfdV93YXRjaGVyICopKQoreworCXN0cnVjdCBlYnRfdV93YXRjaGVyICppOworCisJZm9yIChpID0gZWJ0X3dhdGNoZXJzOyBpOyBpID0gaS0+bmV4dCkKKwkJZihpKTsKK30KKwordm9pZCBlYnRfaXRlcmF0ZV90YXJnZXRzKHZvaWQgKCpmKShzdHJ1Y3QgZWJ0X3VfdGFyZ2V0ICopKQoreworCXN0cnVjdCBlYnRfdV90YXJnZXQgKmk7CisKKwlmb3IgKGkgPSBlYnRfdGFyZ2V0czsgaTsgaSA9IGktPm5leHQpCisJCWYoaSk7Cit9CisKKy8qIERvbid0IHVzZSB0aGlzIGZ1bmN0aW9uLCB1c2UgZWJ0X3ByaW50X2J1ZygpICovCit2b2lkIF9fZWJ0X3ByaW50X2J1ZyhjaGFyICpmaWxlLCBpbnQgbGluZSwgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBsOworCisJdmFfc3RhcnQobCwgZm9ybWF0KTsKKwlmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUiIHYiUFJPR1ZFUlNJT04iOiVzOiVkOi0tQlVHLS06IFxuIiwgZmlsZSwgbGluZSk7CisJdmZwcmludGYoc3RkZXJyLCBmb3JtYXQsIGwpOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwl2YV9lbmQobCk7CisJZXhpdCAoLTEpOworfQorCisvKiBUaGUgZXJyb3IgbWVzc2FnZXMgYXJlIHB1dCBpbiBoZXJlIHdoZW4gZWJ0X3NpbGVudCA9PSAxCisgKiBlYnRfZXJyb3Jtc2dbMF0gPT0gJ1wwJyBpbXBsaWVzIHRoZXJlIHdhcyBubyBlcnJvciAqLworY2hhciBlYnRfZXJyb3Jtc2dbRVJST1JNU0dfTUFYTEVOXTsKKy8qIFdoZW4gZXJyb3IgbWVzc2FnZXMgc2hvdWxkIG5vdCBiZSBwcmludGVkIG9uIHRoZSBzY3JlZW4sIGFmdGVyIHdoaWNoCisgKiB0aGUgcHJvZ3JhbSBleGl0KClzLCBzZXQgZWJ0X3NpbGVudCB0byAxLiAqLworaW50IGVidF9zaWxlbnQ7CisvKiBEb24ndCB1c2UgdGhpcyBmdW5jdGlvbiwgdXNlIGVidF9wcmludF9lcnJvcigpICovCit2b2lkIF9fZWJ0X3ByaW50X2Vycm9yKGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgbDsKKworCXZhX3N0YXJ0KGwsIGZvcm1hdCk7CisJaWYgKGVidF9zaWxlbnQgJiYgZWJ0X2Vycm9ybXNnWzBdID09ICdcMCcpIHsKKwkJdnNucHJpbnRmKGVidF9lcnJvcm1zZywgRVJST1JNU0dfTUFYTEVOLCBmb3JtYXQsIGwpOworCQl2YV9lbmQobCk7CisJfSBlbHNlIHsKKwkJdmZwcmludGYoc3RkZXJyLCBmb3JtYXQsIGwpOworCQlmcHJpbnRmKHN0ZGVyciwgIi5cbiIpOworCQl2YV9lbmQobCk7CisJCWV4aXQgKC0xKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9tNC8uZ2l0aWdub3JlIGIvbTQvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGQ5YmJjCi0tLSAvZGV2L251bGwKKysrIGIvbTQvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDIgQEAKKy9saWJ0b29sLm00CisvbHQqLm00CmRpZmYgLS1naXQgYS91c2VmdWxfZnVuY3Rpb25zLmMgYi91c2VmdWxfZnVuY3Rpb25zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMzYWUyZgotLS0gL2Rldi9udWxsCisrKyBiL3VzZWZ1bF9mdW5jdGlvbnMuYwpAQCAtMCwwICsxLDYwNyBAQAorLyoKKyAqIHVzZWZ1bF9mdW5jdGlvbnMuYywgSmFudWFyeSAyMDA0CisgKgorICogUmFuZG9tIGNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgYnkgZXh0ZW5zaW9ucy4KKyAqCisgKiBBdXRob3I6IEJhcnQgRGUgU2NodXltZXIKKyAqCisgKiAgVGhpcyBjb2RlIGlzIHN0b25nbHkgaW5zcGlyZWQgb24gdGhlIGlwdGFibGVzIGNvZGUgd2hpY2ggaXMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTkgUGF1bCBgUnVzdHknIFJ1c3NlbGwgJiBNaWNoYWVsIEouIE5ldWxpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2luY2x1ZGUgImluY2x1ZGUvZWJ0YWJsZXNfdS5oIgorI2luY2x1ZGUgImluY2x1ZGUvZXRoZXJuZXRkYi5oIgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG5ldGluZXQvZXRoZXIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworCitjb25zdCB1bnNpZ25lZCBjaGFyIG1hY190eXBlX3VuaWNhc3RbRVRIX0FMRU5dID0gICB7MCwwLDAsMCwwLDB9OworY29uc3QgdW5zaWduZWQgY2hhciBtc2tfdHlwZV91bmljYXN0W0VUSF9BTEVOXSA9ICAgezEsMCwwLDAsMCwwfTsKK2NvbnN0IHVuc2lnbmVkIGNoYXIgbWFjX3R5cGVfbXVsdGljYXN0W0VUSF9BTEVOXSA9IHsxLDAsMCwwLDAsMH07Citjb25zdCB1bnNpZ25lZCBjaGFyIG1za190eXBlX211bHRpY2FzdFtFVEhfQUxFTl0gPSB7MSwwLDAsMCwwLDB9OworY29uc3QgdW5zaWduZWQgY2hhciBtYWNfdHlwZV9icm9hZGNhc3RbRVRIX0FMRU5dID0gezI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1fTsKK2NvbnN0IHVuc2lnbmVkIGNoYXIgbXNrX3R5cGVfYnJvYWRjYXN0W0VUSF9BTEVOXSA9IHsyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NX07Citjb25zdCB1bnNpZ25lZCBjaGFyIG1hY190eXBlX2JyaWRnZV9ncm91cFtFVEhfQUxFTl0gPSB7MHgwMSwweDgwLDB4YzIsMCwwLDB9OworY29uc3QgdW5zaWduZWQgY2hhciBtc2tfdHlwZV9icmlkZ2VfZ3JvdXBbRVRIX0FMRU5dID0gezI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1fTsKKworLyogMDogZGVmYXVsdCwgcHJpbnQgb25seSAyIGRpZ2l0cyBpZiBuZWNlc3NhcnkKKyAqIDI6IGFsd2F5cyBwcmludCAyIGRpZ2l0cywgYSBwcmludGVkIG1hYyBhZGRyZXNzCisgKiB0aGVuIGFsd2F5cyBoYXMgdGhlIHNhbWUgbGVuZ3RoICovCitpbnQgZWJ0X3ByaW50c3R5bGVfbWFjOworCit2b2lkIGVidF9wcmludF9tYWMoY29uc3QgdW5zaWduZWQgY2hhciAqbWFjKQoreworCWlmIChlYnRfcHJpbnRzdHlsZV9tYWMgPT0gMikgeworCQlpbnQgajsKKwkJZm9yIChqID0gMDsgaiA8IEVUSF9BTEVOOyBqKyspCisJCQlwcmludGYoIiUwMnglcyIsIG1hY1tqXSwKKwkJCQkoaj09RVRIX0FMRU4tMSkgPyAiIiA6ICI6Iik7CisJfSBlbHNlCisJCXByaW50ZigiJXMiLCBldGhlcl9udG9hKChzdHJ1Y3QgZXRoZXJfYWRkciAqKSBtYWMpKTsKK30KKwordm9pZCBlYnRfcHJpbnRfbWFjX2FuZF9tYXNrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1hYywgY29uc3QgdW5zaWduZWQgY2hhciAqbWFzaykKK3sKKwljaGFyIGhscG1za1s2XSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKKworCWlmICghbWVtY21wKG1hYywgbWFjX3R5cGVfdW5pY2FzdCwgNikgJiYKKwkgICAgIW1lbWNtcChtYXNrLCBtc2tfdHlwZV91bmljYXN0LCA2KSkKKwkJcHJpbnRmKCJVbmljYXN0Iik7CisJZWxzZSBpZiAoIW1lbWNtcChtYWMsIG1hY190eXBlX211bHRpY2FzdCwgNikgJiYKKwkgICAgICAgICAhbWVtY21wKG1hc2ssIG1za190eXBlX211bHRpY2FzdCwgNikpCisJCXByaW50ZigiTXVsdGljYXN0Iik7CisJZWxzZSBpZiAoIW1lbWNtcChtYWMsIG1hY190eXBlX2Jyb2FkY2FzdCwgNikgJiYKKwkgICAgICAgICAhbWVtY21wKG1hc2ssIG1za190eXBlX2Jyb2FkY2FzdCwgNikpCisJCXByaW50ZigiQnJvYWRjYXN0Iik7CisJZWxzZSBpZiAoIW1lbWNtcChtYWMsIG1hY190eXBlX2JyaWRnZV9ncm91cCwgNikgJiYKKwkgICAgICAgICAhbWVtY21wKG1hc2ssIG1za190eXBlX2JyaWRnZV9ncm91cCwgNikpCisJCXByaW50ZigiQkdBIik7CisJZWxzZSB7CisJCWVidF9wcmludF9tYWMobWFjKTsKKwkJaWYgKG1lbWNtcChtYXNrLCBobHBtc2ssIDYpKSB7CisJCQlwcmludGYoIi8iKTsKKwkJCWVidF9wcmludF9tYWMobWFzayk7CisJCX0KKwl9Cit9CisKKy8qIENoZWNrcyB0aGUgdHlwZSBmb3IgdmFsaWRpdHkgYW5kIGNhbGxzIGdldGV0aGVydHlwZWJ5bnVtYmVyKCkuICovCitzdHJ1Y3QgZXRoZXJ0eXBlZW50ICpwYXJzZWV0aGVydHlwZWJ5bnVtYmVyKGludCB0eXBlKQoreworCWlmICh0eXBlIDwgMTUzNikKKwkJZWJ0X3ByaW50X2Vycm9yKCJFdGhlcm5ldCBwcm90b2NvbHMgaGF2ZSB2YWx1ZXMgPj0gMHgwNjAwIik7CisJaWYgKHR5cGUgPiAweGZmZmYpCisJCWVidF9wcmludF9lcnJvcigiRXRoZXJuZXQgcHJvdG9jb2xzIGhhdmUgdmFsdWVzIDw9IDB4ZmZmZiIpOworCXJldHVybiBnZXRldGhlcnR5cGVieW51bWJlcih0eXBlKTsKK30KKworLyogUHV0IHRoZSBtYWMgYWRkcmVzcyBpbnRvIDYgKEVUSF9BTEVOKSBieXRlcyByZXR1cm5zIDAgb24gc3VjY2Vzcy4gKi8KK2ludCBlYnRfZ2V0X21hY19hbmRfbWFzayhjb25zdCBjaGFyICpmcm9tLCB1bnNpZ25lZCBjaGFyICp0bywKKyAgdW5zaWduZWQgY2hhciAqbWFzaykKK3sKKwljaGFyICpwOworCWludCBpOworCXN0cnVjdCBldGhlcl9hZGRyICphZGRyOworCisJaWYgKHN0cmNhc2VjbXAoZnJvbSwgIlVuaWNhc3QiKSA9PSAwKSB7CisJCW1lbWNweSh0bywgbWFjX3R5cGVfdW5pY2FzdCwgRVRIX0FMRU4pOworCQltZW1jcHkobWFzaywgbXNrX3R5cGVfdW5pY2FzdCwgRVRIX0FMRU4pOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHN0cmNhc2VjbXAoZnJvbSwgIk11bHRpY2FzdCIpID09IDApIHsKKwkJbWVtY3B5KHRvLCBtYWNfdHlwZV9tdWx0aWNhc3QsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KG1hc2ssIG1za190eXBlX211bHRpY2FzdCwgRVRIX0FMRU4pOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHN0cmNhc2VjbXAoZnJvbSwgIkJyb2FkY2FzdCIpID09IDApIHsKKwkJbWVtY3B5KHRvLCBtYWNfdHlwZV9icm9hZGNhc3QsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KG1hc2ssIG1za190eXBlX2Jyb2FkY2FzdCwgRVRIX0FMRU4pOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHN0cmNhc2VjbXAoZnJvbSwgIkJHQSIpID09IDApIHsKKwkJbWVtY3B5KHRvLCBtYWNfdHlwZV9icmlkZ2VfZ3JvdXAsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KG1hc2ssIG1za190eXBlX2JyaWRnZV9ncm91cCwgRVRIX0FMRU4pOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCAocCA9IHN0cnJjaHIoZnJvbSwgJy8nKSkgIT0gTlVMTCkgeworCQkqcCA9ICdcMCc7CisJCWlmICghKGFkZHIgPSBldGhlcl9hdG9uKHAgKyAxKSkpCisJCQlyZXR1cm4gLTE7CisJCW1lbWNweShtYXNrLCBhZGRyLCBFVEhfQUxFTik7CisJfSBlbHNlCisJCW1lbXNldChtYXNrLCAweGZmLCBFVEhfQUxFTik7CisJaWYgKCEoYWRkciA9IGV0aGVyX2F0b24oZnJvbSkpKQorCQlyZXR1cm4gLTE7CisJbWVtY3B5KHRvLCBhZGRyLCBFVEhfQUxFTik7CisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCisJCXRvW2ldICY9IG1hc2tbaV07CisJcmV0dXJuIDA7Cit9CisKKy8qIDA6IGRlZmF1bHQKKyAqIDE6IHRoZSBpbnZlcnNlICchJyBvZiB0aGUgb3B0aW9uIGhhcyBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkICovCitpbnQgZWJ0X2ludmVydCA9IDA7CisKKy8qCisgKiBDaGVjayBpZiB0aGUgaW52ZXJzZSBvZiB0aGUgb3B0aW9uIGlzIHNwZWNpZmllZC4gVGhpcyBpcyB1c2VkCisgKiBpbiB0aGUgcGFyc2UgZnVuY3Rpb25zIG9mIHRoZSBleHRlbnNpb25zIGFuZCBlYnRhYmxlcy5jCisgKi8KK2ludCBfZWJ0X2NoZWNrX2ludmVyc2UoY29uc3QgY2hhciBvcHRpb25bXSwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWlmICghb3B0aW9uKQorCQlyZXR1cm4gZWJ0X2ludmVydDsKKwlpZiAoc3RyY21wKG9wdGlvbiwgIiEiKSA9PSAwKSB7CisJCWlmIChlYnRfaW52ZXJ0ID09IDEpCisJCQllYnRfcHJpbnRfZXJyb3IoIkRvdWJsZSB1c2Ugb2YgJyEnIG5vdCBhbGxvd2VkIik7CisJCWlmIChvcHRpbmQgPj0gYXJnYykKKwkJCW9wdGFyZyA9IE5VTEw7CisJCWVsc2UKKwkJCW9wdGFyZyA9IGFyZ3Zbb3B0aW5kXTsKKwkJb3B0aW5kKys7CisJCWVidF9pbnZlcnQgPSAxOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIGVidF9pbnZlcnQ7Cit9CisKKy8qIE1ha2Ugc3VyZSB0aGUgc2FtZSBvcHRpb24gd2Fzbid0IHNwZWNpZmllZCB0d2ljZS4gVGhpcyBpcyB1c2VkCisgKiBpbiB0aGUgcGFyc2UgZnVuY3Rpb25zIG9mIHRoZSBleHRlbnNpb25zIGFuZCBlYnRhYmxlcy5jICovCit2b2lkIGVidF9jaGVja19vcHRpb24odW5zaWduZWQgaW50ICpmbGFncywgdW5zaWduZWQgaW50IG1hc2spCit7CisJaWYgKCpmbGFncyAmIG1hc2spCisJCWVidF9wcmludF9lcnJvcigiTXVsdGlwbGUgdXNlIG9mIHNhbWUgb3B0aW9uIG5vdCBhbGxvd2VkIik7CisJKmZsYWdzIHw9IG1hc2s7Cit9CisKKy8qIFB1dCB0aGUgaXAgc3RyaW5nIGludG8gNCBieXRlcy4gKi8KK3N0YXRpYyBpbnQgdW5kb3RfaXAoY2hhciAqaXAsIHVuc2lnbmVkIGNoYXIgKmlwMikKK3sKKwljaGFyICpwLCAqcSwgKmVuZDsKKwlsb25nIGludCBvbmVieXRlOworCWludCBpOworCWNoYXIgYnVmWzIwXTsKKworCXN0cm5jcHkoYnVmLCBpcCwgc2l6ZW9mKGJ1ZikgLSAxKTsKKworCXAgPSBidWY7CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlpZiAoKHEgPSBzdHJjaHIocCwgJy4nKSkgPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKwkJKnEgPSAnXDAnOworCQlvbmVieXRlID0gc3RydG9sKHAsICZlbmQsIDEwKTsKKwkJaWYgKCplbmQgIT0gJ1wwJyB8fCBvbmVieXRlID4gMjU1IHx8IG9uZWJ5dGUgPCAwKQorCQkJcmV0dXJuIC0xOworCQlpcDJbaV0gPSAodW5zaWduZWQgY2hhcilvbmVieXRlOworCQlwID0gcSArIDE7CisJfQorCisJb25lYnl0ZSA9IHN0cnRvbChwLCAmZW5kLCAxMCk7CisJaWYgKCplbmQgIT0gJ1wwJyB8fCBvbmVieXRlID4gMjU1IHx8IG9uZWJ5dGUgPCAwKQorCQlyZXR1cm4gLTE7CisJaXAyWzNdID0gKHVuc2lnbmVkIGNoYXIpb25lYnl0ZTsKKworCXJldHVybiAwOworfQorCisvKiBQdXQgdGhlIG1hc2sgaW50byA0IGJ5dGVzLiAqLworc3RhdGljIGludCBpcF9tYXNrKGNoYXIgKm1hc2ssIHVuc2lnbmVkIGNoYXIgKm1hc2syKQoreworCWNoYXIgKmVuZDsKKwlsb25nIGludCBiaXRzOworCXVpbnQzMl90IG1hc2syMjsKKworCWlmICh1bmRvdF9pcChtYXNrLCBtYXNrMikpIHsKKwkJLyogbm90IHRoZSAvYS5iLmMuZSBmb3JtYXQsIG1heWJlIHRoZSAveCBmb3JtYXQgKi8KKwkJYml0cyA9IHN0cnRvbChtYXNrLCAmZW5kLCAxMCk7CisJCWlmICgqZW5kICE9ICdcMCcgfHwgYml0cyA+IDMyIHx8IGJpdHMgPCAwKQorCQkJcmV0dXJuIC0xOworCQlpZiAoYml0cyAhPSAwKSB7CisJCQltYXNrMjIgPSBodG9ubCgweEZGRkZGRkZGIDw8ICgzMiAtIGJpdHMpKTsKKwkJCW1lbWNweShtYXNrMiwgJm1hc2syMiwgNCk7CisJCX0gZWxzZSB7CisJCQltYXNrMjIgPSAweEZGRkZGRkZGOworCQkJbWVtY3B5KG1hc2syLCAmbWFzazIyLCA0KTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyogU2V0IHRoZSBpcCBtYXNrIGFuZCBpcCBhZGRyZXNzLiBDYWxsZXJzIHNob3VsZCBjaGVjayBlYnRfZXJyb3Jtc2dbMF0uCisgKiBUaGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgYWRkcmVzcyBjYW4gYmUgYWx0ZXJlZC4gKi8KK3ZvaWQgZWJ0X3BhcnNlX2lwX2FkZHJlc3MoY2hhciAqYWRkcmVzcywgdWludDMyX3QgKmFkZHIsIHVpbnQzMl90ICptc2spCit7CisJY2hhciAqcDsKKworCS8qIGZpcnN0IHRoZSBtYXNrICovCisJaWYgKChwID0gc3RycmNocihhZGRyZXNzLCAnLycpKSAhPSBOVUxMKSB7CisJCSpwID0gJ1wwJzsKKwkJaWYgKGlwX21hc2socCArIDEsICh1bnNpZ25lZCBjaGFyICopbXNrKSkgeworCQkJZWJ0X3ByaW50X2Vycm9yKCJQcm9ibGVtIHdpdGggdGhlIElQIG1hc2sgJyVzJyIsIHAgKyAxKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZQorCQkqbXNrID0gMHhGRkZGRkZGRjsKKworCWlmICh1bmRvdF9pcChhZGRyZXNzLCAodW5zaWduZWQgY2hhciAqKWFkZHIpKSB7CisJCWVidF9wcmludF9lcnJvcigiUHJvYmxlbSB3aXRoIHRoZSBJUCBhZGRyZXNzICclcyciLCBhZGRyZXNzKTsKKwkJcmV0dXJuOworCX0KKwkqYWRkciA9ICphZGRyICYgKm1zazsKK30KKworCisvKiBUcmFuc2Zvcm0gdGhlIGlwIG1hc2sgaW50byBhIHN0cmluZyByZWFkeSBmb3Igb3V0cHV0LiAqLworY2hhciAqZWJ0X21hc2tfdG9fZG90dGVkKHVpbnQzMl90IG1hc2spCit7CisJaW50IGk7CisJc3RhdGljIGNoYXIgYnVmWzIwXTsKKwl1aW50MzJfdCBtYXNrYWRkciwgYml0czsKKworCW1hc2thZGRyID0gbnRvaGwobWFzayk7CisKKwkvKiBkb24ndCBwcmludCAvMzIgKi8KKwlpZiAobWFzayA9PSAweEZGRkZGRkZGTCkgeworCQkqYnVmID0gJ1wwJzsKKwkJcmV0dXJuIGJ1ZjsKKwl9CisKKwlpID0gMzI7CisJYml0cyA9IDB4RkZGRkZGRkVMOyAvKiBDYXNlIDB4RkZGRkZGRkYgaGFzIGp1c3QgYmVlbiBkZWFsdCB3aXRoICovCisJd2hpbGUgKC0taSA+PSAwICYmIG1hc2thZGRyICE9IGJpdHMpCisJCWJpdHMgPDw9IDE7CisKKwlpZiAoaSA+IDApCisJCXNwcmludGYoYnVmLCAiLyVkIiwgaSk7CisJZWxzZSBpZiAoIWkpCisJCSpidWYgPSAnXDAnOworCWVsc2UKKwkJLyogTWFzayB3YXMgbm90IGEgZGVjZW50IGNvbWJpbmF0aW9uIG9mIDEncyBhbmQgMCdzICovCisJCXNwcmludGYoYnVmLCAiLyVkLiVkLiVkLiVkIiwgKCh1bnNpZ25lZCBjaGFyICopJm1hc2spWzBdLAorCQkgICAoKHVuc2lnbmVkIGNoYXIgKikmbWFzaylbMV0sICgodW5zaWduZWQgY2hhciAqKSZtYXNrKVsyXSwKKwkJICAgKCh1bnNpZ25lZCBjaGFyICopJm1hc2spWzNdKTsKKworCXJldHVybiBidWY7Cit9CisKKy8qIE1vc3Qgb2YgdGhlIGZvbGxvd2luZyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBpcHRhYmxlcyAqLworc3RhdGljIHZvaWQKK2luNmFkZHJjcHkoc3RydWN0IGluNl9hZGRyICpkc3QsIHN0cnVjdCBpbjZfYWRkciAqc3JjKQoreworCW1lbWNweShkc3QsIHNyYywgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworfQorCitpbnQgc3RyaW5nX3RvX251bWJlcl9sbChjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBsb25nIGxvbmcgbWluLAorICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIG1heCwgdW5zaWduZWQgbG9uZyBsb25nICpyZXQpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIG51bWJlcjsKKwljaGFyICplbmQ7CisKKwkvKiBIYW5kbGUgaGV4LCBvY3RhbCwgZXRjLiAqLworCWVycm5vID0gMDsKKwludW1iZXIgPSBzdHJ0b3VsbChzLCAmZW5kLCAwKTsKKwlpZiAoKmVuZCA9PSAnXDAnICYmIGVuZCAhPSBzKSB7CisJCS8qIHdlIHBhcnNlZCBhIG51bWJlciwgbGV0J3Mgc2VlIGlmIHdlIHdhbnQgdGhpcyAqLworCQlpZiAoZXJybm8gIT0gRVJBTkdFICYmIG1pbiA8PSBudW1iZXIgJiYgKCFtYXggfHwgbnVtYmVyIDw9IG1heCkpIHsKKwkJCSpyZXQgPSBudW1iZXI7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKK2ludCBzdHJpbmdfdG9fbnVtYmVyX2woY29uc3QgY2hhciAqcywgdW5zaWduZWQgbG9uZyBtaW4sIHVuc2lnbmVkIGxvbmcgbWF4LAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICpyZXQpCit7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbnVtYmVyOworCisJcmVzdWx0ID0gc3RyaW5nX3RvX251bWJlcl9sbChzLCBtaW4sIG1heCwgJm51bWJlcik7CisJKnJldCA9ICh1bnNpZ25lZCBsb25nKW51bWJlcjsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBzdHJpbmdfdG9fbnVtYmVyKGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBtaW4sIHVuc2lnbmVkIGludCBtYXgsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnJldCkKK3sKKwlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgbnVtYmVyOworCisJcmVzdWx0ID0gc3RyaW5nX3RvX251bWJlcl9sKHMsIG1pbiwgbWF4LCAmbnVtYmVyKTsKKwkqcmV0ID0gKHVuc2lnbmVkIGludCludW1iZXI7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgc3RydWN0IGluNl9hZGRyICpudW1lcmljX3RvX2FkZHIoY29uc3QgY2hhciAqbnVtKQoreworCXN0YXRpYyBzdHJ1Y3QgaW42X2FkZHIgYXA7CisJaW50IGVycjsKKworCWlmICgoZXJyPWluZXRfcHRvbihBRl9JTkVUNiwgbnVtLCAmYXApKSA9PSAxKQorCQlyZXR1cm4gJmFwOworCXJldHVybiAoc3RydWN0IGluNl9hZGRyICopTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBpbjZfYWRkciAqcGFyc2VfaXA2X21hc2soY2hhciAqbWFzaykKK3sKKwlzdGF0aWMgc3RydWN0IGluNl9hZGRyIG1hc2thZGRyOworCXN0cnVjdCBpbjZfYWRkciAqYWRkcnA7CisJdW5zaWduZWQgaW50IGJpdHM7CisKKwlpZiAobWFzayA9PSBOVUxMKSB7CisJCS8qIG5vIG1hc2sgYXQgYWxsIGRlZmF1bHRzIHRvIDEyOCBiaXRzICovCisJCW1lbXNldCgmbWFza2FkZHIsIDB4ZmYsIHNpemVvZiBtYXNrYWRkcik7CisJCXJldHVybiAmbWFza2FkZHI7CisJfQorCWlmICgoYWRkcnAgPSBudW1lcmljX3RvX2FkZHIobWFzaykpICE9IE5VTEwpCisJCXJldHVybiBhZGRycDsKKwlpZiAoc3RyaW5nX3RvX251bWJlcihtYXNrLCAwLCAxMjgsICZiaXRzKSA9PSAtMSkKKwkJZWJ0X3ByaW50X2Vycm9yKCJJbnZhbGlkIElQdjYgTWFzayAnJXMnIHNwZWNpZmllZCIsIG1hc2spOworCWlmIChiaXRzICE9IDApIHsKKwkJY2hhciAqcCA9IChjaGFyICopJm1hc2thZGRyOworCQltZW1zZXQocCwgMHhmZiwgYml0cyAvIDgpOworCQltZW1zZXQocCArIChiaXRzIC8gOCkgKyAxLCAwLCAoMTI4IC0gYml0cykgLyA4KTsKKwkJcFtiaXRzIC8gOF0gPSAweGZmIDw8ICg4IC0gKGJpdHMgJiA3KSk7CisJCXJldHVybiAmbWFza2FkZHI7CisJfQorCisJbWVtc2V0KCZtYXNrYWRkciwgMCwgc2l6ZW9mIG1hc2thZGRyKTsKKwlyZXR1cm4gJm1hc2thZGRyOworfQorCisvKiBTZXQgdGhlIGlwdjYgbWFzayBhbmQgYWRkcmVzcy4gQ2FsbGVycyBzaG91bGQgY2hlY2sgZWJ0X2Vycm9ybXNnWzBdLgorICogVGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IGFkZHJlc3MgY2FuIGJlIGFsdGVyZWQuICovCit2b2lkIGVidF9wYXJzZV9pcDZfYWRkcmVzcyhjaGFyICphZGRyZXNzLCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW42X2FkZHIgKm1zaykKK3sKKwlzdHJ1Y3QgaW42X2FkZHIgKnRtcF9hZGRyOworCWNoYXIgYnVmWzI1Nl07CisJY2hhciAqcDsKKwlpbnQgaTsKKwlpbnQgZXJyOworCisJc3RybmNweShidWYsIGFkZHJlc3MsIHNpemVvZihidWYpIC0gMSk7CisJLyogZmlyc3QgdGhlIG1hc2sgKi8KKwlidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9ICdcMCc7CisJaWYgKChwID0gc3RycmNocihidWYsICcvJykpICE9IE5VTEwpIHsKKwkJKnAgPSAnXDAnOworCQl0bXBfYWRkciA9IHBhcnNlX2lwNl9tYXNrKHAgKyAxKTsKKwl9IGVsc2UKKwkJdG1wX2FkZHIgPSBwYXJzZV9pcDZfbWFzayhOVUxMKTsKKwlpbjZhZGRyY3B5KG1zaywgdG1wX2FkZHIpOworCisJLyogaWYgYSBudWxsIG1hc2sgaXMgZ2l2ZW4sIHRoZSBuYW1lIGlzIGlnbm9yZWQsIGxpa2UgaW4gImFueS8wIiAqLworCWlmICghbWVtY21wKG1zaywgJmluNmFkZHJfYW55LCBzaXplb2YoaW42YWRkcl9hbnkpKSkKKwkJc3RyY3B5KGJ1ZiwgIjo6Iik7CisKKwlpZiAoKGVycj1pbmV0X3B0b24oQUZfSU5FVDYsIGJ1ZiwgYWRkcikpIDwgMSkgeworCQllYnRfcHJpbnRfZXJyb3IoIkludmFsaWQgSVB2NiBBZGRyZXNzICclcycgc3BlY2lmaWVkIiwgYnVmKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCWFkZHItPnM2X2FkZHIzMltpXSAmPSBtc2stPnM2X2FkZHIzMltpXTsKK30KKworLyogVHJhbnNmb3JtIHRoZSBpcDYgYWRkciBpbnRvIGEgc3RyaW5nIHJlYWR5IGZvciBvdXRwdXQuICovCitjaGFyICplYnRfaXA2X3RvX251bWVyaWMoY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRycCkKK3sKKwkvKiAwMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwLjAwMC4wMDAuMDAwCisJICogMDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwICovCisJc3RhdGljIGNoYXIgYnVmWzUwKzFdOworCXJldHVybiAoY2hhciAqKWluZXRfbnRvcChBRl9JTkVUNiwgYWRkcnAsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworfQorCitpbnQgZWJ0X2lwNm1hc2tfdG9fY2lkcihjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmspCit7CisJdW5zaWduZWQgaW50IGJpdHMgPSAwOworCXVpbnQzMl90IGEsIGIsIGMsIGQ7CisKKwlhID0gbnRvaGwoay0+czZfYWRkcjMyWzBdKTsKKwliID0gbnRvaGwoay0+czZfYWRkcjMyWzFdKTsKKwljID0gbnRvaGwoay0+czZfYWRkcjMyWzJdKTsKKwlkID0gbnRvaGwoay0+czZfYWRkcjMyWzNdKTsKKwl3aGlsZSAoYSAmIDB4ODAwMDAwMDBVKSB7CisJCSsrYml0czsKKwkJYSA8PD0gMTsKKwkJYSAgfD0gKGIgPj4gMzEpICYgMTsKKwkJYiA8PD0gMTsKKwkJYiAgfD0gKGMgPj4gMzEpICYgMTsKKwkJYyA8PD0gMTsKKwkJYyAgfD0gKGQgPj4gMzEpICYgMTsKKwkJZCA8PD0gMTsKKwl9CisJaWYgKGEgIT0gMCB8fCBiICE9IDAgfHwgYyAhPSAwIHx8IGQgIT0gMCkKKwkJcmV0dXJuIC0xOworCXJldHVybiBiaXRzOworfQorCitjaGFyICplYnRfaXA2X21hc2tfdG9fc3RyaW5nKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqbXNrKQoreworCWludCBsID0gZWJ0X2lwNm1hc2tfdG9fY2lkcihtc2spOworCXN0YXRpYyBjaGFyIGJ1Zls1MSsxXTsKKworCWlmIChsID09IDEyOCkKKwkJKmJ1ZiA9ICdcMCc7CisJZWxzZSBpZiAobCA9PSAtMSkKKwkJc3ByaW50ZihidWYsICIvJXMiLCBlYnRfaXA2X3RvX251bWVyaWMobXNrKSk7CisJZWxzZQorCQlzcHJpbnRmKGJ1ZiwgIi8lZCIsIGwpOworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBjaGFyKgorcGFyc2VfbnVtKGNvbnN0IGNoYXIgKnN0ciwgbG9uZyBtaW4sIGxvbmcgbWF4LCBsb25nICpudW0pCit7CisJY2hhciAqZW5kOworCisJZXJybm8gPSAwOworCSpudW0gPSBzdHJ0b2woc3RyLCAmZW5kLCAxMCk7CisJaWYgKGVycm5vICYmICgqbnVtID09IExPTkdfTUlOIHx8ICpudW0gPT0gTE9OR19NQVgpKSB7CisJCWVidF9wcmludF9lcnJvcigiSW52YWxpZCBudW1iZXIgJXM6ICVzIiwgc3RyLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKG1pbiA8PSBtYXgpIHsKKwkJaWYgKCpudW0gPiBtYXggfHwgKm51bSA8IG1pbikgeworCQkJZWJ0X3ByaW50X2Vycm9yKCJWYWx1ZSAlbGQgb3V0IG9mIHJhbmdlICglbGQsICVsZCkiLCAqbnVtLCBtaW4sIG1heCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKwlpZiAoKm51bSA9PSAwICYmIHN0ciA9PSBlbmQpCisJCXJldHVybiBOVUxMOworCXJldHVybiBlbmQ7Cit9CisKK3N0YXRpYyBjaGFyICoKK3BhcnNlX3JhbmdlKGNvbnN0IGNoYXIgKnN0ciwgbG9uZyBtaW4sIGxvbmcgbWF4LCBsb25nIG51bVtdKQoreworCWNoYXIgKm5leHQ7CisKKwluZXh0ID0gcGFyc2VfbnVtKHN0ciwgbWluLCBtYXgsIG51bSk7CisJaWYgKG5leHQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKG5leHQgJiYgKm5leHQgPT0gJzonKQorCQluZXh0ID0gcGFyc2VfbnVtKG5leHQrMSwgbWluLCBtYXgsICZudW1bMV0pOworCWVsc2UKKwkJbnVtWzFdID0gbnVtWzBdOworCXJldHVybiBuZXh0OworfQorCitpbnQgZWJ0X3BhcnNlX2ljbXAoY29uc3Qgc3RydWN0IGVidF9pY21wX25hbWVzICppY21wX2NvZGVzLCBzaXplX3Qgbl9jb2RlcywKKwkJICAgY29uc3QgY2hhciAqaWNtcHR5cGUsIHVpbnQ4X3QgdHlwZVtdLCB1aW50OF90IGNvZGVbXSkKK3sKKwl1bnNpZ25lZCBpbnQgbWF0Y2ggPSBuX2NvZGVzOworCXVuc2lnbmVkIGludCBpOworCWxvbmcgbnVtYmVyWzJdOworCisJZm9yIChpID0gMDsgaSA8IG5fY29kZXM7IGkrKykgeworCQlpZiAoc3RybmNhc2VjbXAoaWNtcF9jb2Rlc1tpXS5uYW1lLCBpY21wdHlwZSwgc3RybGVuKGljbXB0eXBlKSkpCisJCQljb250aW51ZTsKKwkJaWYgKG1hdGNoICE9IG5fY29kZXMpCisJCQllYnRfcHJpbnRfZXJyb3IoIkFtYmlndW91cyBJQ01QIHR5cGUgYCVzJzoiCisJCQkJCSIgYCVzJyBvciBgJXMnPyIsCisJCQkJCWljbXB0eXBlLCBpY21wX2NvZGVzW21hdGNoXS5uYW1lLAorCQkJCQlpY21wX2NvZGVzW2ldLm5hbWUpOworCQltYXRjaCA9IGk7CisJfQorCisJaWYgKG1hdGNoIDwgbl9jb2RlcykgeworCQl0eXBlWzBdID0gdHlwZVsxXSA9IGljbXBfY29kZXNbbWF0Y2hdLnR5cGU7CisJCWlmIChjb2RlKSB7CisJCQljb2RlWzBdID0gaWNtcF9jb2Rlc1ttYXRjaF0uY29kZV9taW47CisJCQljb2RlWzFdID0gaWNtcF9jb2Rlc1ttYXRjaF0uY29kZV9tYXg7CisJCX0KKwl9IGVsc2UgeworCQljaGFyICpuZXh0ID0gcGFyc2VfcmFuZ2UoaWNtcHR5cGUsIDAsIDI1NSwgbnVtYmVyKTsKKwkJaWYgKCFuZXh0KSB7CisJCQllYnRfcHJpbnRfZXJyb3IoIlVua25vd24gSUNNUCB0eXBlIGAlcyciLAorCQkJCQkJCWljbXB0eXBlKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQl0eXBlWzBdID0gKHVpbnQ4X3QpIG51bWJlclswXTsKKwkJdHlwZVsxXSA9ICh1aW50OF90KSBudW1iZXJbMV07CisJCXN3aXRjaCAoKm5leHQpIHsKKwkJY2FzZSAwOgorCQkJaWYgKGNvZGUpIHsKKwkJCQljb2RlWzBdID0gMDsKKwkJCQljb2RlWzFdID0gMjU1OworCQkJfQorCQkJcmV0dXJuIDA7CisJCWNhc2UgJy8nOgorCQkJaWYgKGNvZGUpIHsKKwkJCQluZXh0ID0gcGFyc2VfcmFuZ2UobmV4dCsxLCAwLCAyNTUsIG51bWJlcik7CisJCQkJY29kZVswXSA9ICh1aW50OF90KSBudW1iZXJbMF07CisJCQkJY29kZVsxXSA9ICh1aW50OF90KSBudW1iZXJbMV07CisJCQkJaWYgKG5leHQgPT0gTlVMTCkKKwkJCQkJcmV0dXJuIC0xOworCQkJCWlmIChuZXh0ICYmICpuZXh0ID09IDApCisJCQkJCXJldHVybiAwOworCQkJfQorCQkvKiBmYWxsdGhyb3VnaCAqLworCQlkZWZhdWx0OgorCQkJZWJ0X3ByaW50X2Vycm9yKCJ1bmtub3duIGNoYXJhY3RlciAlYyIsICpuZXh0KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfaWNtcF9jb2RlKHVpbnQ4X3QgKmNvZGUpCit7CisJaWYgKCFjb2RlKQorCQlyZXR1cm47CisKKwlpZiAoY29kZVswXSA9PSBjb2RlWzFdKQorCQlwcmludGYoIi8lIlBSSXU4ICIgIiwgY29kZVswXSk7CisJZWxzZQorCQlwcmludGYoIi8lIlBSSXU4IjolIlBSSXU4ICIgIiwgY29kZVswXSwgY29kZVsxXSk7Cit9CisKK3ZvaWQgZWJ0X3ByaW50X2ljbXBfdHlwZShjb25zdCBzdHJ1Y3QgZWJ0X2ljbXBfbmFtZXMgKmljbXBfY29kZXMsCisJCQkgc2l6ZV90IG5fY29kZXMsIHVpbnQ4X3QgKnR5cGUsIHVpbnQ4X3QgKmNvZGUpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAodHlwZVswXSAhPSB0eXBlWzFdKSB7CisJCXByaW50ZigiJSJQUkl1OCAiOiUiIFBSSXU4LCB0eXBlWzBdLCB0eXBlWzFdKTsKKwkJcHJpbnRfaWNtcF9jb2RlKGNvZGUpOworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gMDsgaSA8IG5fY29kZXM7IGkrKykgeworCQlpZiAoaWNtcF9jb2Rlc1tpXS50eXBlICE9IHR5cGVbMF0pCisJCQljb250aW51ZTsKKworCQlpZiAoIWNvZGUgfHwgKGljbXBfY29kZXNbaV0uY29kZV9taW4gPT0gY29kZVswXSAmJgorCQkJICAgICAgaWNtcF9jb2Rlc1tpXS5jb2RlX21heCA9PSBjb2RlWzFdKSkgeworCQkJcHJpbnRmKCIlcyAiLCBpY21wX2NvZGVzW2ldLm5hbWUpOworCQkJcmV0dXJuOworCQl9CisJfQorCXByaW50ZigiJSJQUkl1OCwgdHlwZVswXSk7CisJcHJpbnRfaWNtcF9jb2RlKGNvZGUpOworfQorCit2b2lkIGVidF9wcmludF9pY21wX3R5cGVzKGNvbnN0IHN0cnVjdCBlYnRfaWNtcF9uYW1lcyAqaWNtcF9jb2RlcywKKwkJCSAgc2l6ZV90IG5fY29kZXMpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbl9jb2RlczsgaSsrKSB7CisJCWlmIChpICYmIGljbXBfY29kZXNbaV0udHlwZSA9PSBpY21wX2NvZGVzW2ktMV0udHlwZSkgeworCQkJaWYgKGljbXBfY29kZXNbaV0uY29kZV9taW4gPT0gaWNtcF9jb2Rlc1tpLTFdLmNvZGVfbWluCisJCQkgICAgJiYgKGljbXBfY29kZXNbaV0uY29kZV9tYXgKKwkJCSAgICAgICAgPT0gaWNtcF9jb2Rlc1tpLTFdLmNvZGVfbWF4KSkKKwkJCQlwcmludGYoIiAoJXMpIiwgaWNtcF9jb2Rlc1tpXS5uYW1lKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIlxuICAgJXMiLCBpY21wX2NvZGVzW2ldLm5hbWUpOworCQl9CisJCWVsc2UKKwkJCXByaW50ZigiXG4lcyIsIGljbXBfY29kZXNbaV0ubmFtZSk7CisJfQorCXByaW50ZigiXG4iKTsKK30K